UNPKG

@senx/warpview

Version:
244 lines 50.4 kB
/* * 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