@senx/warpview
Version:
WarpView Elements
244 lines • 50.4 kB
JavaScript
/*
* Copyright 2021 SenX S.A.S.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import { Component, ElementRef, EventEmitter, HostListener, Input, NgZone, Output, Renderer2, ViewChild } from '@angular/core';
import { GTSLib } from '../../utils/gts.lib';
import { HttpErrorHandler } from '../../services/http-error-handler.service';
import { WarpViewComponent } from '../warp-view-component';
import { SizeService } from '../../services/resize.service';
import { Warp10Service } from '../../services/warp10.service';
import { Logger } from '../../utils/logger';
import { WarpViewResultTileComponent } from '../warp-view-result-tile/warp-view-result-tile.component';
import * as i0 from "@angular/core";
import * as i1 from "../../services/resize.service";
import * as i2 from "../../services/warp10.service";
import * as i3 from "../warp-view-spinner/warp-view-spinner.component";
import * as i4 from "../warp-view-display/warp-view-display.component";
import * as i5 from "../warp-view-result-tile/warp-view-result-tile.component";
import * as i6 from "@angular/common";
export class WarpViewTileComponent extends WarpViewComponent {
constructor(el, sizeService, renderer, ngZone, warp10Service) {
super(el, renderer, sizeService, ngZone);
this.el = el;
this.sizeService = sizeService;
this.renderer = renderer;
this.ngZone = ngZone;
this.warp10Service = warp10Service;
this.warpscriptResult = new EventEmitter();
this.execStatus = new EventEmitter();
this.execError = new EventEmitter();
this.type = 'line';
this.url = '';
this.isAlone = false; // used by plot to manage its keyboard events
this.loading = false;
this.loadingExec = false;
this._gtsFilter = '';
this._warpScript = '';
this.execUrl = '';
this.timeUnit = 'us';
this.LOG = new Logger(WarpViewTileComponent, this._debug);
}
set gtsFilter(gtsFilter) {
this._gtsFilter = gtsFilter;
}
set warpscript(warpScript) {
if (!!warpScript && this._warpScript !== warpScript) {
this._warpScript = warpScript;
this.execute(true);
}
}
get warpscript() {
return this._warpScript;
}
ngOnInit() {
this._options = this._options || this.defOptions;
}
ngAfterViewInit() {
this._warpScript = this._warpScript || this.warpRef.nativeElement.textContent.trim();
this.LOG.debug(['ngAfterViewInit', 'warpScript'], this._warpScript);
this.el.nativeElement.style.opacity = '1';
if (this.warpRef.nativeElement.textContent.trim() !== '') {
this.execute(false);
}
}
update(options) {
this.LOG.debug(['update', 'options'], options);
}
/* Listeners */
// @HostListener('keydown', ['$event'])
handleKeyDown(event) {
if (event.key === 'r') {
this.execute(true);
}
}
/** detect some VSCode special modifiers in the beginnig of the code:
* @endpoint xxxURLxxx
* @timeUnit ns
* warning : the first line is empty (to confirm with other browsers)
*/
detectWarpScriptSpecialComments() {
// analyse the first warpScript lines starting with //
const extraParamsPattern = /\s*\/\/\s*@(\w*)\s*(.*)$/g;
const warpscriptLines = this._warpScript.split('\n');
for (let l = 1; l < warpscriptLines.length; l++) {
const currentLine = warpscriptLines[l];
if (currentLine === '' || currentLine.search('//') >= 0) {
// find and extract
let lineOnMatch;
const re = RegExp(extraParamsPattern);
while (lineOnMatch = re.exec(currentLine)) {
const parameterName = lineOnMatch[1];
const parameterValue = lineOnMatch[2];
switch (parameterName) {
case 'endpoint': // // @endpoint http://mywarp10server/api/v0/exec
this.execUrl = parameterValue;
break;
case 'timeUnit':
this.timeUnit = parameterValue.toLowerCase(); // set the time unit for graphs
break;
default:
break;
}
}
}
else {
break; // no more comments at the beginning of the file
}
}
}
execute(isRefresh) {
if (!!this._warpScript && this._warpScript.trim() !== '') {
this.LOG.debug(['execute'], isRefresh);
this.error = undefined;
setTimeout(() => this.loadingExec = !isRefresh);
this.execResult = undefined;
this.execUrl = this.url;
this.detectWarpScriptSpecialComments();
this.LOG.debug(['execute', 'warpScript'], this._warpScript);
this.warp10Service.exec(this._warpScript, this.execUrl)
.subscribe((response) => {
setTimeout(() => this.loadingExec = false);
this.LOG.debug(['execute'], response);
if (response.body) {
try {
const body = response.body;
this.warpscriptResult.emit(body);
const headers = response.headers;
this.status = `Your script execution took
${GTSLib.formatElapsedTime(parseInt(headers.get('x-warp10-elapsed'), 10))}
serverside, fetched
${headers.get('x-warp10-fetched')} datapoints and performed
${headers.get('x-warp10-ops')} WarpScript operations.`;
this.execStatus.emit({
message: this.status,
ops: parseInt(headers.get('x-warp10-ops'), 10),
elapsed: parseInt(headers.get('x-warp10-elapsed'), 10),
fetched: parseInt(headers.get('x-warp10-fetched'), 10),
});
if (this._autoRefresh !== this._options.autoRefresh) {
this._autoRefresh = this._options.autoRefresh;
if (this.timer) {
window.clearInterval(this.timer);
}
if (this._autoRefresh && this._autoRefresh > 0) {
this.timer = window.setInterval(() => {
this.execute(true);
}, this._autoRefresh * 1000);
}
}
setTimeout(() => {
this.execResult = body;
this.resultTile.setResult(this.execResult, isRefresh);
this._options.bounds = {};
this._options = { ...this._options };
this.loading = false;
});
}
catch (e) {
this.LOG.error(['execute'], e);
this.loading = false;
}
}
else {
this.LOG.error(['execute'], response);
this.error = response;
this.loading = false;
this.execError.emit(response);
}
}, e => {
this.loading = false;
this.execError.emit(e);
this.LOG.error(['execute'], e);
});
}
}
convert(data) {
return [];
}
chartDrawn(event) {
this.chartDraw.emit(event);
}
onWarpViewNewOptions(opts) {
this._options = opts;
}
resize(layout) {
//
}
}
WarpViewTileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: WarpViewTileComponent, deps: [{ token: i0.ElementRef }, { token: i1.SizeService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i2.Warp10Service }], target: i0.ɵɵFactoryTarget.Component });
WarpViewTileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: WarpViewTileComponent, selector: "warpview-tile", inputs: { type: "type", chartTitle: "chartTitle", url: "url", isAlone: "isAlone", gtsFilter: "gtsFilter", warpscript: "warpscript" }, outputs: { warpscriptResult: "warpscriptResult", execStatus: "execStatus", execError: "execError" }, host: { listeners: { "document:keyup": "handleKeyDown($event)" } }, providers: [HttpErrorHandler], viewQueries: [{ propertyName: "warpRef", first: true, predicate: ["warpRef"], descendants: true, static: true }, { propertyName: "resultTile", first: true, predicate: ["resultTile"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n ~ Copyright 2021 SenX S.A.S.\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ http://www.apache.org/licenses/LICENSE-2.0\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n ~\n -->\n<div class=\"wrapper\" [ngClass]=\"{'full': responsive}\">\n <div class=\"tilewrapper\">\n <div [ngClass]=\"{'tile': true,'notitle': !chartTitle || chartTitle === ''}\">\n <warpview-spinner *ngIf=\"loadingExec\" message=\"Requesting data\"></warpview-spinner>\n <div *ngIf=\"_options.showErrors && error\" style=\"height: calc(100% - 30px); width: 100%\">\n <warpview-display [responsive]=\"true\" [debug]=\"debug\" [options]=\"_options\"\n [data]=\"{ data: error, globalParams: {\n timeMode: 'custom', bgColor: '#D32C2E', fontColor: '#ffffff'}}\"></warpview-display>\n </div>\n <div *ngIf=\"!error\" style=\"height: 100%; width: 100%\" [hidden]=\"loadingExec\">\n <warpview-result-tile #resultTile\n (warpViewNewOptions)=\"onWarpViewNewOptions($event)\"\n [debug]=\"debug\" [type]=\"type\" [chartTitle]=\"chartTitle\"\n [unit]=\"unit\" [options]=\"_options\"\n (chartDraw)=\"chartDrawn($event)\"\n ></warpview-result-tile>\n </div>\n </div>\n </div>\n <small *ngIf=\"_options.showStatus\" class=\"status\">{{status}}</small>\n</div>\n\n<div #warpRef style=\"display: none\">\n <ng-content></ng-content>\n</div>\n", styles: ["/*!\n * Copyright 2021 SenX S.A.S.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */:root{--warp-view-chart-width: 100%;--warp-view-chart-height: 100%;--warp-view-datagrid-cell-padding: 5px;--warp-view-map-margin: 0;--warp-view-switch-height: 30px;--warp-view-switch-width: 100px;--warp-view-switch-radius: 18px;--warp-view-plot-chart-height: 100%;--warp-view-slider-pointer-size: 65px;--warp-view-resize-handle-height: 10px;--warp-view-tile-width: 100%;--warp-view-tile-height: 100%;--warp-view-font-color: #000000;--warp-view-bar-color: #dc3545;--warp-view-datagrid-odd-bg-color: #ffffff;--warp-view-datagrid-odd-color: #404040;--warp-view-datagrid-even-bg-color: #c0c0c0;--warp-view-datagrid-even-color: #000000;--warp-view-pagination-border-color: #c0c0c0;--warp-view-pagination-bg-color: #ffffff;--warp-view-pagination-active-bg-color: #4CAF50;--warp-view-pagination-active-color: #ffffff;--warp-view-pagination-active-border-color: #4CAF50;--warp-view-pagination-hover-bg-color: #c0c0c0;--warp-view-pagination-hover-color: #000000;--warp-view-pagination-hover-border-color: #c0c0c0;--warp-view-pagination-disabled-color: #c0c0c0;--warp-view-switch-inset-color: #c0c0c0;--warp-view-switch-inset-checked-color: #00cd00;--warp-view-switch-handle-color: radial-gradient(#ffffff 15%, #c0c0c0 100%);--warp-view-switch-handle-checked-color: radial-gradient(#ffffff 15%, #00cd00 100%);--warp-view-resize-handle-color: #c0c0c0;--warp-view-chart-legend-bg: #ffffff;--warp-view-chart-legend-color: #404040;--gts-classname-font-color: #004eff;--gts-labelname-font-color: #19A979;--gts-attrname-font-color: #ED4A7B;--gts-separator-font-color: #a0a0a0;--gts-labelvalue-font-color: #000000;--gts-attrvalue-font-color: #000000;--gts-stack-font-color: #000000;--gts-tree-expanded-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVQ4T82TMW7CQBBF/0g+QOpINEkVCmpaLoBm5COk5QYoaeAY3MDSei2LGu4QKakiBA1tCpTK8kS2sLVe2xSh8XSrnf9m/s4s4c6gO/UYGEBEXlT1bK396bFGIjIJguA7iqJLkVNbYOZXItoQ0QHAzBhz9CCFeAVgCeAjy7Jpmqa/NUBEEgDzktqGuOKKO47j+KsGhGH4lOf5HsDIg5ycyqVYVd+steuGheLAzM9EtPMgW1VdVGWJ6N0YU1gpozVGH+K+gy/uBHR1crXUqNzbQXXhduJ69sd7cxOZ+UFVH5Mk+exb+YGt8n9+5h8up1sReYC0WAAAAABJRU5ErkJggg==);--gts-tree-collapsed-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0UlEQVQ4T6WTUW7CQAxEPQdozxYb9Qb94Aj9gQSoVCp6lMr21doDZFCQiFCU3YDY//d2PeOFPHnwJC+zAlVdA/jp+/6YmZ+1S0qCPxF5HUAAO3fvSpKS4ENEvm6gfUS0c5JiBma2Ibm/QiQPmbmdSqohquoA7GqSxRaapmkBjBkAeHP336t0UWBmHcnb+VcR4XcJpjDJLjPHkS4tleqZubmNiDHU6gumDQDYuvvh7hpV9V9EXgaA5Ka2jbMjmNk7yZOIfEfE8eFVfuSDLda4JDsD3FNdEckTC0YAAAAASUVORK5CYII=);--warp-view-popup-bg-color: #ffffff;--warp-view-popup-border-color: rgba(0, 0, 0, .2);--warp-view-popup-header-bg-color: #c0c0c0;--warp-view-popup-title-color: #404040;--warp-view-popup-close-color: #404040;--warp-view-popup-body-bg-color: #ffffff;--warp-view-popup-body-color: #000000;--warp-view-annotationtooltip-value-font-color: #004eff;--warp-view-annotationtooltip-font-color: #404040;--warp-view-spinner-color: #ff9900;--warp-view-tooltip-bg: #ffffff;--warp-view-tooltip-color: #000000;--warp-slider-connect-color: #ff9900;--warp-slider-handle-bg-color: #ffffff;--warp-slider-handle-color: #004eff;--warp-slider-handle-shadow: inset 0 0 1px #ffffff, inset 0 1px 7px #c0c0c0, 0 3px 6px -3px #a0a0a0}.noData{width:100%;text-align:center;color:var(--warp-view-chart-legend-color);position:relative}.js-plotly-plot .plotly .cursor-ew-resize{cursor:default!important}:host,warp-view-tile,warpview-tile{width:var(--warp-view-tile-width, 100%);max-height:var(--warp-view-tile-height, 100%);overflow:auto;min-width:var(--warp-view-tile-width, 100%);min-height:var(--warp-view-tile-height, 100%)}:host .error,warp-view-tile .error,warpview-tile .error{width:100%;text-align:center;color:#dc3545;font-weight:700}:host .wrapper,warp-view-tile .wrapper,warpview-tile .wrapper{opacity:1;min-height:50px;width:var(--warp-view-tile-width, 100%);height:var(--warp-view-tile-height, 100%);position:relative}:host .wrapper .status,warp-view-tile .wrapper .status,warpview-tile .wrapper .status{position:absolute;z-index:999;bottom:0;background-color:#ffffffb3;padding:1px 5px;font-size:11px;color:#000}:host .wrapper.full,warp-view-tile .wrapper.full,warpview-tile .wrapper.full{width:100%;height:100%;display:flex;flex-direction:column;justify-content:space-around}:host .wrapper .tilewrapper,warp-view-tile .wrapper .tilewrapper,warpview-tile .wrapper .tilewrapper{width:100%;height:100%;display:flex;flex-direction:column}:host .wrapper .tilewrapper .tile,warp-view-tile .wrapper .tilewrapper .tile,warpview-tile .wrapper .tilewrapper .tile{width:100%;height:var(--warp-view-tile-height, 100%);overflow-y:auto;overflow-x:hidden;position:relative;flex-grow:1}:host .wrapper .tilewrapper .notitle,warp-view-tile .wrapper .tilewrapper .notitle,warpview-tile .wrapper .tilewrapper .notitle{height:100%}:host .wrapper .tilewrapper h1,warp-view-tile .wrapper .tilewrapper h1,warpview-tile .wrapper .tilewrapper h1{font-size:20px;padding:5px;margin:0;color:var(--warp-view-font-color)}:host .wrapper .tilewrapper h1 small,warp-view-tile .wrapper .tilewrapper h1 small,warpview-tile .wrapper .tilewrapper h1 small{font-size:10px;margin-left:10px}\n"], components: [{ type: i3.WarpViewSpinnerComponent, selector: "warpview-spinner", inputs: ["message"] }, { type: i4.WarpViewDisplayComponent, selector: "warpview-display" }, { type: i5.WarpViewResultTileComponent, selector: "warpview-result-tile", inputs: ["chartTitle", "type", "standalone"], outputs: ["pointHover", "warpViewChartResize", "chartDraw", "boundsDidChange", "warpViewNewOptions"] }], directives: [{ type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: WarpViewTileComponent, decorators: [{
type: Component,
args: [{ selector: 'warpview-tile', providers: [HttpErrorHandler], template: "<!--\n ~ Copyright 2021 SenX S.A.S.\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ http://www.apache.org/licenses/LICENSE-2.0\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n ~\n -->\n<div class=\"wrapper\" [ngClass]=\"{'full': responsive}\">\n <div class=\"tilewrapper\">\n <div [ngClass]=\"{'tile': true,'notitle': !chartTitle || chartTitle === ''}\">\n <warpview-spinner *ngIf=\"loadingExec\" message=\"Requesting data\"></warpview-spinner>\n <div *ngIf=\"_options.showErrors && error\" style=\"height: calc(100% - 30px); width: 100%\">\n <warpview-display [responsive]=\"true\" [debug]=\"debug\" [options]=\"_options\"\n [data]=\"{ data: error, globalParams: {\n timeMode: 'custom', bgColor: '#D32C2E', fontColor: '#ffffff'}}\"></warpview-display>\n </div>\n <div *ngIf=\"!error\" style=\"height: 100%; width: 100%\" [hidden]=\"loadingExec\">\n <warpview-result-tile #resultTile\n (warpViewNewOptions)=\"onWarpViewNewOptions($event)\"\n [debug]=\"debug\" [type]=\"type\" [chartTitle]=\"chartTitle\"\n [unit]=\"unit\" [options]=\"_options\"\n (chartDraw)=\"chartDrawn($event)\"\n ></warpview-result-tile>\n </div>\n </div>\n </div>\n <small *ngIf=\"_options.showStatus\" class=\"status\">{{status}}</small>\n</div>\n\n<div #warpRef style=\"display: none\">\n <ng-content></ng-content>\n</div>\n", styles: ["/*!\n * Copyright 2021 SenX S.A.S.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */:root{--warp-view-chart-width: 100%;--warp-view-chart-height: 100%;--warp-view-datagrid-cell-padding: 5px;--warp-view-map-margin: 0;--warp-view-switch-height: 30px;--warp-view-switch-width: 100px;--warp-view-switch-radius: 18px;--warp-view-plot-chart-height: 100%;--warp-view-slider-pointer-size: 65px;--warp-view-resize-handle-height: 10px;--warp-view-tile-width: 100%;--warp-view-tile-height: 100%;--warp-view-font-color: #000000;--warp-view-bar-color: #dc3545;--warp-view-datagrid-odd-bg-color: #ffffff;--warp-view-datagrid-odd-color: #404040;--warp-view-datagrid-even-bg-color: #c0c0c0;--warp-view-datagrid-even-color: #000000;--warp-view-pagination-border-color: #c0c0c0;--warp-view-pagination-bg-color: #ffffff;--warp-view-pagination-active-bg-color: #4CAF50;--warp-view-pagination-active-color: #ffffff;--warp-view-pagination-active-border-color: #4CAF50;--warp-view-pagination-hover-bg-color: #c0c0c0;--warp-view-pagination-hover-color: #000000;--warp-view-pagination-hover-border-color: #c0c0c0;--warp-view-pagination-disabled-color: #c0c0c0;--warp-view-switch-inset-color: #c0c0c0;--warp-view-switch-inset-checked-color: #00cd00;--warp-view-switch-handle-color: radial-gradient(#ffffff 15%, #c0c0c0 100%);--warp-view-switch-handle-checked-color: radial-gradient(#ffffff 15%, #00cd00 100%);--warp-view-resize-handle-color: #c0c0c0;--warp-view-chart-legend-bg: #ffffff;--warp-view-chart-legend-color: #404040;--gts-classname-font-color: #004eff;--gts-labelname-font-color: #19A979;--gts-attrname-font-color: #ED4A7B;--gts-separator-font-color: #a0a0a0;--gts-labelvalue-font-color: #000000;--gts-attrvalue-font-color: #000000;--gts-stack-font-color: #000000;--gts-tree-expanded-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVQ4T82TMW7CQBBF/0g+QOpINEkVCmpaLoBm5COk5QYoaeAY3MDSei2LGu4QKakiBA1tCpTK8kS2sLVe2xSh8XSrnf9m/s4s4c6gO/UYGEBEXlT1bK396bFGIjIJguA7iqJLkVNbYOZXItoQ0QHAzBhz9CCFeAVgCeAjy7Jpmqa/NUBEEgDzktqGuOKKO47j+KsGhGH4lOf5HsDIg5ycyqVYVd+steuGheLAzM9EtPMgW1VdVGWJ6N0YU1gpozVGH+K+gy/uBHR1crXUqNzbQXXhduJ69sd7cxOZ+UFVH5Mk+exb+YGt8n9+5h8up1sReYC0WAAAAABJRU5ErkJggg==);--gts-tree-collapsed-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0UlEQVQ4T6WTUW7CQAxEPQdozxYb9Qb94Aj9gQSoVCp6lMr21doDZFCQiFCU3YDY//d2PeOFPHnwJC+zAlVdA/jp+/6YmZ+1S0qCPxF5HUAAO3fvSpKS4ENEvm6gfUS0c5JiBma2Ibm/QiQPmbmdSqohquoA7GqSxRaapmkBjBkAeHP336t0UWBmHcnb+VcR4XcJpjDJLjPHkS4tleqZubmNiDHU6gumDQDYuvvh7hpV9V9EXgaA5Ka2jbMjmNk7yZOIfEfE8eFVfuSDLda4JDsD3FNdEckTC0YAAAAASUVORK5CYII=);--warp-view-popup-bg-color: #ffffff;--warp-view-popup-border-color: rgba(0, 0, 0, .2);--warp-view-popup-header-bg-color: #c0c0c0;--warp-view-popup-title-color: #404040;--warp-view-popup-close-color: #404040;--warp-view-popup-body-bg-color: #ffffff;--warp-view-popup-body-color: #000000;--warp-view-annotationtooltip-value-font-color: #004eff;--warp-view-annotationtooltip-font-color: #404040;--warp-view-spinner-color: #ff9900;--warp-view-tooltip-bg: #ffffff;--warp-view-tooltip-color: #000000;--warp-slider-connect-color: #ff9900;--warp-slider-handle-bg-color: #ffffff;--warp-slider-handle-color: #004eff;--warp-slider-handle-shadow: inset 0 0 1px #ffffff, inset 0 1px 7px #c0c0c0, 0 3px 6px -3px #a0a0a0}.noData{width:100%;text-align:center;color:var(--warp-view-chart-legend-color);position:relative}.js-plotly-plot .plotly .cursor-ew-resize{cursor:default!important}:host,warp-view-tile,warpview-tile{width:var(--warp-view-tile-width, 100%);max-height:var(--warp-view-tile-height, 100%);overflow:auto;min-width:var(--warp-view-tile-width, 100%);min-height:var(--warp-view-tile-height, 100%)}:host .error,warp-view-tile .error,warpview-tile .error{width:100%;text-align:center;color:#dc3545;font-weight:700}:host .wrapper,warp-view-tile .wrapper,warpview-tile .wrapper{opacity:1;min-height:50px;width:var(--warp-view-tile-width, 100%);height:var(--warp-view-tile-height, 100%);position:relative}:host .wrapper .status,warp-view-tile .wrapper .status,warpview-tile .wrapper .status{position:absolute;z-index:999;bottom:0;background-color:#ffffffb3;padding:1px 5px;font-size:11px;color:#000}:host .wrapper.full,warp-view-tile .wrapper.full,warpview-tile .wrapper.full{width:100%;height:100%;display:flex;flex-direction:column;justify-content:space-around}:host .wrapper .tilewrapper,warp-view-tile .wrapper .tilewrapper,warpview-tile .wrapper .tilewrapper{width:100%;height:100%;display:flex;flex-direction:column}:host .wrapper .tilewrapper .tile,warp-view-tile .wrapper .tilewrapper .tile,warpview-tile .wrapper .tilewrapper .tile{width:100%;height:var(--warp-view-tile-height, 100%);overflow-y:auto;overflow-x:hidden;position:relative;flex-grow:1}:host .wrapper .tilewrapper .notitle,warp-view-tile .wrapper .tilewrapper .notitle,warpview-tile .wrapper .tilewrapper .notitle{height:100%}:host .wrapper .tilewrapper h1,warp-view-tile .wrapper .tilewrapper h1,warpview-tile .wrapper .tilewrapper h1{font-size:20px;padding:5px;margin:0;color:var(--warp-view-font-color)}:host .wrapper .tilewrapper h1 small,warp-view-tile .wrapper .tilewrapper h1 small,warpview-tile .wrapper .tilewrapper h1 small{font-size:10px;margin-left:10px}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.SizeService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i2.Warp10Service }]; }, propDecorators: { warpRef: [{
type: ViewChild,
args: ['warpRef', { static: true }]
}], resultTile: [{
type: ViewChild,
args: ['resultTile']
}], warpscriptResult: [{
type: Output,
args: ['warpscriptResult']
}], execStatus: [{
type: Output,
args: ['execStatus']
}], execError: [{
type: Output,
args: ['execError']
}], type: [{
type: Input,
args: ['type']
}], chartTitle: [{
type: Input,
args: ['chartTitle']
}], url: [{
type: Input,
args: ['url']
}], isAlone: [{
type: Input,
args: ['isAlone']
}], gtsFilter: [{
type: Input,
args: ['gtsFilter']
}], warpscript: [{
type: Input
}],
// @HostListener('keydown', ['$event'])
handleKeyDown: [{
type: HostListener,
args: ['document:keyup', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FycC12aWV3LXRpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2FycHZpZXctbmcvc3JjL2xpYi9lbGVtZW50cy93YXJwLXZpZXctdGlsZS93YXJwLXZpZXctdGlsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93YXJwdmlldy1uZy9zcmMvbGliL2VsZW1lbnRzL3dhcnAtdmlldy10aWxlL3dhcnAtdmlldy10aWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDM0UsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzFELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFMUMsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sMERBQTBELENBQUM7Ozs7Ozs7O0FBUXJHLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxpQkFBaUI7SUF3QzFELFlBQ1MsRUFBYyxFQUNkLFdBQXdCLEVBQ3hCLFFBQW1CLEVBQ25CLE1BQWMsRUFDYixhQUE0QjtRQUVwQyxLQUFLLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFB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RUQsb0JBQW9CLENBQUMsSUFBUztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRU0sTUFBTSxDQUFDLE1BQXNDO1FBQ2xELEVBQUU7SUFDSixDQUFDOztrSEEvTFUscUJBQXFCO3NHQUFyQixxQkFBcUIsdVZBRnJCLENBQUMsZ0JBQWdCLENBQUMsOFBDN0MvQiwwNkRBeUNBOzJGRE1hLHFCQUFxQjtrQkFOakMsU0FBUzsrQkFDRSxlQUFlLGFBR2QsQ0FBQyxnQkFBZ0IsQ0FBQztvTUFHUyxPQUFPO3NCQUE1QyxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ1gsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUVLLGdCQUFnQjtzQkFBM0MsTUFBTTt1QkFBQyxrQkFBa0I7Z0JBQ0osVUFBVTtzQkFBL0IsTUFBTTt1QkFBQyxZQUFZO2dCQUNDLFNBQVM7c0JBQTdCLE1BQU07dUJBQUMsV0FBVztnQkFFSixJQUFJO3NCQUFsQixLQUFLO3VCQUFDLE1BQU07Z0JBQ1EsVUFBVTtzQkFBOUIsS0FBSzt1QkFBQyxZQUFZO2dCQUNMLEdBQUc7c0JBQWhCLEtBQUs7dUJBQUMsS0FBSztnQkFDTSxPQUFPO3NCQUF4QixLQUFLO3VCQUFDLFNBQVM7Z0JBQ1EsU0FBUztzQkFBaEMsS0FBSzt1QkFBQyxXQUFXO2dCQUtkLFVBQVU7c0JBRGIsS0FBSzs7UUFzRE4sdUNBQXVDO1FBQ3ZDLGFBQWE7c0JBRlosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IDIwMjEgIFNlblggUy5BLlMuXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQYXJhbX0gZnJvbSAnLi4vLi4vbW9kZWwvcGFyYW0nO1xuaW1wb3J0IHtEYXRhTW9kZWx9IGZyb20gJy4uLy4uL21vZGVsL2RhdGFNb2RlbCc7XG5pbXBvcnQge0dUU0xpYn0gZnJvbSAnLi4vLi4vdXRpbHMvZ3RzLmxpYic7XG5pbXBvcnQge0h0dHBFcnJvckhhbmRsZXJ9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAtZXJyb3ItaGFuZGxlci5zZXJ2aWNlJztcbmltcG9ydCB7V2FycFZpZXdDb21wb25lbnR9IGZyb20gJy4uL3dhcnAtdmlldy1jb21wb25lbnQnO1xuaW1wb3J0IHtTaXplU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzaXplLnNlcnZpY2UnO1xuaW1wb3J0IHtXYXJwMTBTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy93YXJwMTAuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlcn0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7SHR0cFJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1dhcnBWaWV3UmVzdWx0VGlsZUNvbXBvbmVudH0gZnJvbSAnLi4vd2FycC12aWV3LXJlc3VsdC10aWxlL3dhcnAtdmlldy1yZXN1bHQtdGlsZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3YXJwdmlldy10aWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dhcnAtdmlldy10aWxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vd2FycC12aWV3LXRpbGUuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbSHR0cEVycm9ySGFuZGxlcl1cbn0pXG5leHBvcnQgY2xhc3MgV2FycFZpZXdUaWxlQ29tcG9uZW50IGV4dGVuZHMgV2FycFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCd3YXJwUmVmJywge3N0YXRpYzogdHJ1ZX0pIHdhcnBSZWY6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3Jlc3VsdFRpbGUnKSByZXN1bHRUaWxlOiBXYXJwVmlld1Jlc3VsdFRpbGVDb21wb25lbnQ7XG5cbiAgQE91dHB1dCgnd2FycHNjcmlwdFJlc3VsdCcpIHdhcnBzY3JpcHRSZXN1bHQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnZXhlY1N0YXR1cycpIGV4ZWNTdGF0dXMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnZXhlY0Vycm9yJykgZXhlY0Vycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQElucHV0KCd0eXBlJykgdHlwZSA9ICdsaW5lJztcbiAgQElucHV0KCdjaGFydFRpdGxlJykgY2hhcnRUaXRsZTtcbiAgQElucHV0KCd1cmwnKSB1cmwgPSAnJztcbiAgQElucHV0KCdpc0Fsb25lJykgaXNBbG9uZSA9IGZhbHNlOyAvLyB1c2VkIGJ5IHBsb3QgdG8gbWFuYWdlIGl0cyBrZXlib2FyZCBldmVudHNcbiAgQElucHV0KCdndHNGaWx0ZXInKSBzZXQgZ3RzRmlsdGVyKGd0c0ZpbHRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fZ3RzRmlsdGVyID0gZ3RzRmlsdGVyO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHdhcnBzY3JpcHQod2FycFNjcmlwdDogc3RyaW5nKSB7XG4gICAgaWYgKCEhd2FycFNjcmlwdCAmJiB0aGlzLl93YXJwU2NyaXB0ICE9PSB3YXJwU2NyaXB0KSB7XG4gICAgICB0aGlzLl93YXJwU2NyaXB0ID0gd2FycFNjcmlwdDtcbiAgICAgIHRoaXMuZXhlY3V0ZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgd2FycHNjcmlwdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YXJwU2NyaXB0O1xuICB9XG5cbiAgZXJyb3I6IGFueTtcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgZXhlY1Jlc3VsdDogc3RyaW5nO1xuICBsb2FkaW5nRXhlYyA9IGZhbHNlO1xuICBwcml2YXRlIHRpbWVyOiBhbnk7XG4gIHByaXZhdGUgX2F1dG9SZWZyZXNoO1xuICBwcml2YXRlIF9ndHNGaWx0ZXIgPSAnJztcbiAgcHJpdmF0ZSBfd2FycFNjcmlwdCA9ICcnO1xuICBwcml2YXRlIGV4ZWNVcmwgPSAnJztcbiAgcHJpdmF0ZSB0aW1lVW5pdCA9ICd1cyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyBzaXplU2VydmljZTogU2l6ZVNlcnZpY2UsXG4gICAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHVibGljIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgd2FycDEwU2VydmljZTogV2FycDEwU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoZWwsIHJlbmRlcmVyLCBzaXplU2VydmljZSwgbmdab25lKTtcbiAgICB0aGlzLkxPRyA9IG5ldyBMb2dnZXIoV2FycFZpZXdUaWxlQ29tcG9uZW50LCB0aGlzLl9kZWJ1Zyk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9vcHRpb25zID0gdGhpcy5fb3B0aW9ucyB8fCB0aGlzLmRlZk9wdGlvbnM7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5fd2FycFNjcmlwdCA9IHRoaXMuX3dhcnBTY3JpcHQgfHwgdGhpcy53YXJwUmVmLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIHRoaXMuTE9HLmRlYnVnKFsnbmdBZnRlclZpZXdJbml0JywgJ3dhcnBTY3JpcHQnXSwgdGhpcy5fd2FycFNjcmlwdCk7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgaWYgKHRoaXMud2FycFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIHRoaXMuZXhlY3V0ZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKG9wdGlvbnM6IFBhcmFtKTogdm9pZCB7XG4gICAgdGhpcy5MT0cuZGVidWcoWyd1cGRhdGUnLCAnb3B0aW9ucyddLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qIExpc3RlbmVycyAqL1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gIC8vIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ3InKSB7XG4gICAgICB0aGlzLmV4ZWN1dGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGRldGVjdCBzb21lIFZTQ29kZSBzcGVjaWFsIG1vZGlmaWVycyBpbiB0aGUgYmVnaW5uaWcgb2YgdGhlIGNvZGU6XG4gICAqIEBlbmRwb2ludCB4eHhVUkx4eHhcbiAgICogQHRpbWVVbml0IG5zXG4gICAqIHdhcm5pbmcgOiB0aGUgZmlyc3QgbGluZSBpcyBlbXB0eSAodG8gY29uZmlybSB3aXRoIG90aGVyIGJyb3dzZXJzKVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RXYXJwU2NyaXB0U3BlY2lhbENvbW1lbnRzKCkge1xuICAgIC8vIGFuYWx5c2UgdGhlIGZpcnN0IHdhcnBTY3JpcHQgbGluZXMgc3RhcnRpbmcgd2l0aCAvL1xuICAgIGNvbnN0IGV4dHJhUGFyYW1zUGF0dGVybiA9IC9cXHMqXFwvXFwvXFxzKkAoXFx3KilcXHMqKC4qKSQvZztcbiAgICBjb25zdCB3YXJwc2NyaXB0TGluZXMgPSB0aGlzLl93YXJwU2NyaXB0LnNwbGl0KCdcXG4nKTtcbiAgICBmb3IgKGxldCBsID0gMTsgbCA8IHdhcnBzY3JpcHRMaW5lcy5sZW5ndGg7IGwrKykge1xuICAgICAgY29uc3QgY3VycmVudExpbmUgPSB3YXJwc2NyaXB0TGluZXNbbF07XG4gICAgICBpZiAoY3VycmVudExpbmUgPT09ICcnIHx8IGN1cnJlbnRMaW5lLnNlYXJjaCgnLy8nKSA+PSAwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGV4dHJhY3RcbiAgICAgICAgbGV0IGxpbmVPbk1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbDtcbiAgICAgICAgY29uc3QgcmUgPSBSZWdFeHAoZXh0cmFQYXJhbXNQYXR0ZXJuKTtcbiAgICAgICAgd2hpbGUgKGxpbmVPbk1hdGNoID0gcmUuZXhlYyhjdXJyZW50TGluZSkpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID0gbGluZU9uTWF0Y2hbMV07XG4gICAgICAgICAgY29uc3QgcGFyYW1ldGVyVmFsdWUgPSBsaW5lT25NYXRjaFsyXTtcbiAgICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlck5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2VuZHBvaW50JzogICAgICAgIC8vICAgICAgICAvLyBAZW5kcG9pbnQgaHR0cDovL215d2FycDEwc2VydmVyL2FwaS92MC9leGVjXG4gICAgICAgICAgICAgIHRoaXMuZXhlY1VybCA9IHBhcmFtZXRlclZhbHVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RpbWVVbml0JzpcbiAgICAgICAgICAgICAgdGhpcy50aW1lVW5pdCA9IHBhcmFtZXRlclZhbHVlLnRvTG93ZXJDYXNlKCk7ICAgLy8gc2V0IHRoZSB0aW1lIHVuaXQgZm9yIGdyYXBoc1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7IC8vIG5vIG1vcmUgY29tbWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZShpc1JlZnJlc2g6IGJvb2xlYW4pIHtcbiAgICBpZiAoISF0aGlzLl93YXJwU2NyaXB0ICYmIHRoaXMuX3dhcnBTY3JpcHQudHJpbSgpICE9PSAnJykge1xuICAgICAgdGhpcy5MT0cuZGVidWcoWydleGVjdXRlJ10sIGlzUmVmcmVzaCk7XG4gICAgICB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWRpbmdFeGVjID0gIWlzUmVmcmVzaCk7XG4gICAgICB0aGlzLmV4ZWNSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmV4ZWNVcmwgPSB0aGlzLnVybDtcbiAgICAgIHRoaXMuZGV0ZWN0V2FycFNjcmlwdFNwZWNpYWxDb21tZW50cygpO1xuICAgICAgdGhpcy5MT0cuZGVidWcoWydleGVjdXRlJywgJ3dhcnBTY3JpcHQnXSwgdGhpcy5fd2FycFNjcmlwdCk7XG4gICAgICB0aGlzLndhcnAxMFNlcnZpY2UuZXhlYyh0aGlzLl93YXJwU2NyaXB0LCB0aGlzLmV4ZWNVcmwpXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8c3RyaW5nPiB8IHN0cmluZykgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5sb2FkaW5nRXhlYyA9IGZhbHNlKTtcbiAgICAgICAgICB0aGlzLkxPRy5kZWJ1ZyhbJ2V4ZWN1dGUnXSwgcmVzcG9uc2UpO1xuICAgICAgICAgIGlmICgocmVzcG9uc2UgYXMgSHR0cFJlc3BvbnNlPHN0cmluZz4pLmJvZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSAocmVzcG9uc2UgYXMgSHR0cFJlc3BvbnNlPHN0cmluZz4pLmJvZHk7XG4gICAgICAgICAgICAgIHRoaXMud2FycHNjcmlwdFJlc3VsdC5lbWl0KGJvZHkpO1xuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gKHJlc3BvbnNlIGFzIEh0dHBSZXNwb25zZTxzdHJpbmc+KS5oZWFkZXJzO1xuICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IGBZb3VyIHNjcmlwdCBleGVjdXRpb24gdG9va1xuICR7R1RTTGliLmZvcm1hdEVsYXBzZWRUaW1lKHBhcnNlSW50KGhlYWRlcnMuZ2V0KCd4LXdhcnAxMC1lbGFwc2VkJyksIDEwKSl9XG4gc2VydmVyc2lkZSwgZmV0Y2hlZFxuICR7aGVhZGVycy5nZXQoJ3gtd2FycDEwLWZldGNoZWQnKX0gZGF0YXBvaW50cyBhbmQgcGVyZm9ybWVkXG4gJHtoZWFkZXJzLmdldCgneC13YXJwMTAtb3BzJyl9ICBXYXJwU2NyaXB0IG9wZXJhdGlvbnMuYDtcbiAgICAgICAgICAgICAgdGhpcy5leGVjU3RhdHVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgICAgIG9wczogcGFyc2VJbnQoaGVhZGVycy5nZXQoJ3gtd2FycDEwLW9wcycpLCAxMCksXG4gICAgICAgICAgICAgICAgZWxhcHNlZDogcGFyc2VJbnQoaGVhZGVycy5nZXQoJ3gtd2FycDEwLWVsYXBzZWQnKSwgMTApLFxuICAgICAgICAgICAgICAgIGZldGNoZWQ6IHBhcnNlSW50KGhlYWRlcnMuZ2V0KCd4LXdhcnAxMC1mZXRjaGVkJyksIDEwKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9hdXRvUmVmcmVzaCAhPT0gdGhpcy5fb3B0aW9ucy5hdXRvUmVmcmVzaCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9SZWZyZXNoID0gdGhpcy5fb3B0aW9ucy5hdXRvUmVmcmVzaDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdXRvUmVmcmVzaCAmJiB0aGlzLl9hdXRvUmVmcmVzaCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMudGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICB9LCB0aGlzLl9hdXRvUmVmcmVzaCAqIDEwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWNSZXN1bHQgPSBib2R5O1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0VGlsZS5zZXRSZXN1bHQodGhpcy5leGVjUmVzdWx0LCBpc1JlZnJlc2gpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuYm91bmRzID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHsuLi50aGlzLl9vcHRpb25zfTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRoaXMuTE9HLmVycm9yKFsnZXhlY3V0ZSddLCBlKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuTE9HLmVycm9yKFsnZXhlY3V0ZSddLCByZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmVycm9yID0gcmVzcG9uc2U7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXhlY0Vycm9yLmVtaXQocmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5leGVjRXJyb3IuZW1pdChlKTtcbiAgICAgICAgICB0aGlzLkxPRy5lcnJvcihbJ2V4ZWN1dGUnXSwgZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjb252ZXJ0KGRhdGE6IERhdGFNb2RlbCk6IGFueVtdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjaGFydERyYXduKGV2ZW50KSB7XG4gICAgdGhpcy5jaGFydERyYXcuZW1pdChldmVudCk7XG4gIH1cblxuICBvbldhcnBWaWV3TmV3T3B0aW9ucyhvcHRzOiBhbnkpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0cztcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUobGF5b3V0OiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogYW55IH0pIHtcbiAgICAvL1xuICB9XG59XG4iLCI8IS0tXG4gIH4gIENvcHlyaWdodCAyMDIxICBTZW5YIFMuQS5TLlxuICB+XG4gIH4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgflxuICB+ICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgfiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIH5cbiAgLS0+XG48ZGl2IGNsYXNzPVwid3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnZnVsbCc6ICByZXNwb25zaXZlfVwiPlxuICA8ZGl2IGNsYXNzPVwidGlsZXdyYXBwZXJcIj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsndGlsZSc6IHRydWUsJ25vdGl0bGUnOiAgIWNoYXJ0VGl0bGUgfHwgY2hhcnRUaXRsZSA9PT0gJyd9XCI+XG4gICAgICA8d2FycHZpZXctc3Bpbm5lciAqbmdJZj1cImxvYWRpbmdFeGVjXCIgbWVzc2FnZT1cIlJlcXVlc3RpbmcgZGF0YVwiPjwvd2FycHZpZXctc3Bpbm5lcj5cbiAgICAgIDxkaXYgKm5nSWY9XCJfb3B0aW9ucy5zaG93RXJyb3JzICYmIGVycm9yXCIgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMTAwJSAtIDMwcHgpOyB3aWR0aDogMTAwJVwiPlxuICAgICAgICA8d2FycHZpZXctZGlzcGxheSBbcmVzcG9uc2l2ZV09XCJ0cnVlXCIgW2RlYnVnXT1cImRlYnVnXCIgW29wdGlvbnNdPVwiX29wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJ7IGRhdGE6IGVycm9yLCAgZ2xvYmFsUGFyYW1zOiB7XG4gIHRpbWVNb2RlOiAgJ2N1c3RvbScsIGJnQ29sb3I6ICcjRDMyQzJFJywgZm9udENvbG9yOiAnI2ZmZmZmZid9fVwiPjwvd2FycHZpZXctZGlzcGxheT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFlcnJvclwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJVwiIFtoaWRkZW5dPVwibG9hZGluZ0V4ZWNcIj5cbiAgICAgICAgPHdhcnB2aWV3LXJlc3VsdC10aWxlICNyZXN1bHRUaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FycFZpZXdOZXdPcHRpb25zKT1cIm9uV2FycFZpZXdOZXdPcHRpb25zKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlYnVnXT1cImRlYnVnXCIgW3R5cGVdPVwidHlwZVwiIFtjaGFydFRpdGxlXT1cImNoYXJ0VGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VuaXRdPVwidW5pdFwiIFtvcHRpb25zXT