@firestitch/report 18.14.0 → 18.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -258,7 +258,7 @@ export class ReportComponent {
258
258
  // narrows it to the page the canvas is showing. Unlike the PDF/PowerPoint
259
259
  // exports the files are written server-side, so they are not capped by
260
260
  // what a slide can hold.
261
- exportData(thisPage = false) {
261
+ exportData(thisPage = false, format = 'csv') {
262
262
  const report = this.report();
263
263
  if (!report) {
264
264
  return;
@@ -268,8 +268,8 @@ export class ReportComponent {
268
268
  const frequency = this._filterState.frequency();
269
269
  const snapshot = this._collector.snapshot(report);
270
270
  const states = zipExportStates(report, snapshot.state, pageId, (component) => this._filterState.gridSessionLayout(component));
271
- this._process.download('Exporting data', this._collector.exportWording(report, snapshot, pageId)
272
- .pipe(switchMap(({ lines, titles }) => this._reportData.exportReport(report.id, filters, pageId, frequency, lines, states, titles))));
271
+ this._process.download(format === 'xlsx' ? 'Exporting Excel' : 'Exporting data', this._collector.exportWording(report, snapshot, pageId)
272
+ .pipe(switchMap(({ lines, titles }) => this._reportData.exportReport(report.id, filters, pageId, frequency, lines, states, titles, {}, format))));
273
273
  }
274
274
  // React to each chat turn (fs-chat handles the request + persistence); we
275
275
  // only care about the report side effects this context's backend flags.
@@ -460,7 +460,7 @@ export class ReportComponent {
460
460
  // The bar's date pickers start their weeks on Monday and list the built-in
461
461
  // presets; a preset only sets the days.
462
462
  provideReportDatePicker(),
463
- ], viewQueries: [{ propertyName: "_split", first: true, predicate: ["split"], descendants: true, static: true }, { propertyName: "_chatPanel", first: true, predicate: ["chatPanel"], descendants: true, read: ElementRef, static: true }, { propertyName: "_canvas", first: true, predicate: ReportCanvasComponent, descendants: true }], ngImport: i0, template: "<div\n #split\n class=\"report fs-row.align-start\">\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n style=\"min-height: 500px;\"\n basePath=\"reports\"\n [requestData]=\"{ reportId: selected()?.id ?? null }\"\n [introMessage]=\"introMessage\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n <div class=\"viewer fs-flex fs-column\">\n <div class=\"fs-row.align-center.gap-sm\">\n <fs-autocomplete-chips\n class=\"fs-flex\"\n [fetch]=\"fetchReports\"\n [(ngModel)]=\"selected\"\n [disabled]=\"loadingReports()\"\n [padless]=\"true\"\n [multiple]=\"false\"\n [fetchOnFocus]=\"true\"\n (ngModelChange)=\"reportChange($event)\"\n placeholder=\"Report\"\n name=\"report\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n <ng-template\n fsAutocompleteChipsStatic\n (click)=\"createReport()\">\n Create Report\n </ng-template>\n </fs-autocomplete-chips>\n @if (report() && editMode()) {\n <!-- What layout editing can add or switch to, and the way out of it \u2014\n the same outlined buttons as the fs-ai-report toolbar. -->\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"master-toggle\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n @if (report()) {\n <fs-menu>\n <ng-template\n fs-menu-item\n (click)=\"reportSettings()\">\n <mat-icon>\n tune\n </mat-icon>\n Report settings\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleEditMode()\"\n [disabled]=\"editMode()\">\n <mat-icon>\n dashboard_customize\n </mat-icon>\n {{ editMode() ? 'Done editing layout' : 'Edit layout' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n <mat-icon>\n slideshow\n </mat-icon>\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n <mat-icon>\n picture_as_pdf\n </mat-icon>\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data (This Page)\n </ng-template>\n }\n </fs-menu>\n }\n </div>\n @if (report()) {\n <!-- Report-level filters only (the report's actions live in the menu\n above). fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the block\n is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters) {\n @for (key of [reportFilterKey]; track key) {\n <fs-filter [config]=\"reportFilterConfig()\"></fs-filter>\n }\n }\n <app-report-canvas\n [report]=\"report()\"\n [editMode]=\"editMode()\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n</div>", styles: [".report{height:100%;min-height:500px}.report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:500px;min-width:0;border:none}.report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.report .viewer fs-filter{flex:0 0 auto;margin-top:10px;margin-bottom:0}.report .viewer ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.report .resizer:before{content:\"\";width:0px;background:#0000001f;transition:width .12s ease,background-color .12s ease}.report .resizer:hover:before{width:3px;background:var(--brand-primary-color)}.report.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.report.resizing .resizer:before{width:3px;background:var(--brand-primary-color)}.report.resizing .chat,.report.resizing .viewer{pointer-events:none}::ng-deep body.body-report-reports .mat-mdc-card-content{display:flex;flex-direction:column;box-sizing:border-box}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel{flex:1;min-height:0}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel router-outlet+ng-component{height:100%}.master-toggle.active{background:#eceff3}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsAutocompleteChipsModule }, { kind: "component", type: i2.FsAutocompleteChipsComponent, selector: "fs-autocomplete-chips", inputs: ["fetch", "appearance", "floatLabel", "readonly", "size", "label", "placeholder", "chipImage", "chipBackground", "chipColor", "chipIcon", "chipIconColor", "chipClass", "chipPadding", "shape", "hint", "allowText", "allowObject", "delay", "minPanelWidth", "maxPanelHeight", "validateText", "removable", "allowClear", "color", "background", "orderable", "padless", "initOnClick", "fetchOnFocus", "multiple", "multipleAdd", "confirm", "disabled", "groupBy", "panelWidth", "panelClass", "compareWith"], outputs: ["selected", "removed", "reordered", "clear", "panelOpened", "panelClosed"] }, { kind: "directive", type: i2.FsAutocompleteObjectDirective, selector: "[fsAutocompleteObject],[fsAutocompleteChipsTemplate]" }, { kind: "directive", type: i2.FsAutocompleteChipsStaticDirective, selector: "[fsAutocompleteChipsStatic]", inputs: ["show", "disable"], outputs: ["click", "selected"] }, { kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i3.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i4.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i4.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "component", type: FsAiChatComponent, selector: "fs-ai-chat", inputs: ["basePath", "requestData", "ready", "introMessage", "showThinking"], outputs: ["response", "showThinkingChange"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ReportCanvasComponent, selector: "app-report-canvas", inputs: ["report", "editMode", "pageId"], outputs: ["componentSettings", "reportChanged", "pageChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
463
+ ], viewQueries: [{ propertyName: "_split", first: true, predicate: ["split"], descendants: true, static: true }, { propertyName: "_chatPanel", first: true, predicate: ["chatPanel"], descendants: true, read: ElementRef, static: true }, { propertyName: "_canvas", first: true, predicate: ReportCanvasComponent, descendants: true }], ngImport: i0, template: "<div\n #split\n class=\"report fs-row.align-start\">\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n style=\"min-height: 500px;\"\n basePath=\"reports\"\n [requestData]=\"{ reportId: selected()?.id ?? null }\"\n [introMessage]=\"introMessage\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n <div class=\"viewer fs-flex fs-column\">\n <div class=\"fs-row.align-center.gap-sm\">\n <fs-autocomplete-chips\n class=\"fs-flex\"\n [fetch]=\"fetchReports\"\n [(ngModel)]=\"selected\"\n [disabled]=\"loadingReports()\"\n [padless]=\"true\"\n [multiple]=\"false\"\n [fetchOnFocus]=\"true\"\n (ngModelChange)=\"reportChange($event)\"\n placeholder=\"Report\"\n name=\"report\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n <ng-template\n fsAutocompleteChipsStatic\n (click)=\"createReport()\">\n Create Report\n </ng-template>\n </fs-autocomplete-chips>\n @if (report() && editMode()) {\n <!-- What layout editing can add or switch to, and the way out of it \u2014\n the same outlined buttons as the fs-ai-report toolbar. -->\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"master-toggle\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n @if (report()) {\n <fs-menu>\n <ng-template\n fs-menu-item\n (click)=\"reportSettings()\">\n <mat-icon>\n tune\n </mat-icon>\n Report settings\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleEditMode()\"\n [disabled]=\"editMode()\">\n <mat-icon>\n dashboard_customize\n </mat-icon>\n {{ editMode() ? 'Done editing layout' : 'Edit layout' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n <mat-icon>\n slideshow\n </mat-icon>\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n <mat-icon>\n picture_as_pdf\n </mat-icon>\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data (This Page)\n </ng-template>\n }\n <ng-template\n fs-menu-item\n (click)=\"exportData(false, 'xlsx')\">\n <mat-icon>\n grid_on\n </mat-icon>\n Export Excel\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true, 'xlsx')\">\n <mat-icon>\n grid_on\n </mat-icon>\n Export Excel (This Page)\n </ng-template>\n }\n </fs-menu>\n }\n </div>\n @if (report()) {\n <!-- Report-level filters only (the report's actions live in the menu\n above). fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the block\n is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters) {\n @for (key of [reportFilterKey]; track key) {\n <fs-filter [config]=\"reportFilterConfig()\"></fs-filter>\n }\n }\n <app-report-canvas\n [report]=\"report()\"\n [editMode]=\"editMode()\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n</div>", styles: [".report{height:100%;min-height:500px}.report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:500px;min-width:0;border:none}.report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.report .viewer fs-filter{flex:0 0 auto;margin-top:10px;margin-bottom:0}.report .viewer ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.report .resizer:before{content:\"\";width:0px;background:#0000001f;transition:width .12s ease,background-color .12s ease}.report .resizer:hover:before{width:3px;background:var(--brand-primary-color)}.report.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.report.resizing .resizer:before{width:3px;background:var(--brand-primary-color)}.report.resizing .chat,.report.resizing .viewer{pointer-events:none}::ng-deep body.body-report-reports .mat-mdc-card-content{display:flex;flex-direction:column;box-sizing:border-box}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel{flex:1;min-height:0}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel router-outlet+ng-component{height:100%}.master-toggle.active{background:#eceff3}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsAutocompleteChipsModule }, { kind: "component", type: i2.FsAutocompleteChipsComponent, selector: "fs-autocomplete-chips", inputs: ["fetch", "appearance", "floatLabel", "readonly", "size", "label", "placeholder", "chipImage", "chipBackground", "chipColor", "chipIcon", "chipIconColor", "chipClass", "chipPadding", "shape", "hint", "allowText", "allowObject", "delay", "minPanelWidth", "maxPanelHeight", "validateText", "removable", "allowClear", "color", "background", "orderable", "padless", "initOnClick", "fetchOnFocus", "multiple", "multipleAdd", "confirm", "disabled", "groupBy", "panelWidth", "panelClass", "compareWith"], outputs: ["selected", "removed", "reordered", "clear", "panelOpened", "panelClosed"] }, { kind: "directive", type: i2.FsAutocompleteObjectDirective, selector: "[fsAutocompleteObject],[fsAutocompleteChipsTemplate]" }, { kind: "directive", type: i2.FsAutocompleteChipsStaticDirective, selector: "[fsAutocompleteChipsStatic]", inputs: ["show", "disable"], outputs: ["click", "selected"] }, { kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i3.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i4.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i4.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "component", type: FsAiChatComponent, selector: "fs-ai-chat", inputs: ["basePath", "requestData", "ready", "introMessage", "showThinking"], outputs: ["response", "showThinkingChange"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ReportCanvasComponent, selector: "app-report-canvas", inputs: ["report", "editMode", "pageId"], outputs: ["componentSettings", "reportChanged", "pageChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
464
464
  }
465
465
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportComponent, decorators: [{
466
466
  type: Component,
@@ -491,7 +491,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
491
491
  MatIcon,
492
492
  MatTooltip,
493
493
  ReportCanvasComponent,
494
- ], template: "<div\n #split\n class=\"report fs-row.align-start\">\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n style=\"min-height: 500px;\"\n basePath=\"reports\"\n [requestData]=\"{ reportId: selected()?.id ?? null }\"\n [introMessage]=\"introMessage\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n <div class=\"viewer fs-flex fs-column\">\n <div class=\"fs-row.align-center.gap-sm\">\n <fs-autocomplete-chips\n class=\"fs-flex\"\n [fetch]=\"fetchReports\"\n [(ngModel)]=\"selected\"\n [disabled]=\"loadingReports()\"\n [padless]=\"true\"\n [multiple]=\"false\"\n [fetchOnFocus]=\"true\"\n (ngModelChange)=\"reportChange($event)\"\n placeholder=\"Report\"\n name=\"report\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n <ng-template\n fsAutocompleteChipsStatic\n (click)=\"createReport()\">\n Create Report\n </ng-template>\n </fs-autocomplete-chips>\n @if (report() && editMode()) {\n <!-- What layout editing can add or switch to, and the way out of it \u2014\n the same outlined buttons as the fs-ai-report toolbar. -->\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"master-toggle\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n @if (report()) {\n <fs-menu>\n <ng-template\n fs-menu-item\n (click)=\"reportSettings()\">\n <mat-icon>\n tune\n </mat-icon>\n Report settings\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleEditMode()\"\n [disabled]=\"editMode()\">\n <mat-icon>\n dashboard_customize\n </mat-icon>\n {{ editMode() ? 'Done editing layout' : 'Edit layout' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n <mat-icon>\n slideshow\n </mat-icon>\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n <mat-icon>\n picture_as_pdf\n </mat-icon>\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data (This Page)\n </ng-template>\n }\n </fs-menu>\n }\n </div>\n @if (report()) {\n <!-- Report-level filters only (the report's actions live in the menu\n above). fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the block\n is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters) {\n @for (key of [reportFilterKey]; track key) {\n <fs-filter [config]=\"reportFilterConfig()\"></fs-filter>\n }\n }\n <app-report-canvas\n [report]=\"report()\"\n [editMode]=\"editMode()\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n</div>", styles: [".report{height:100%;min-height:500px}.report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:500px;min-width:0;border:none}.report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.report .viewer fs-filter{flex:0 0 auto;margin-top:10px;margin-bottom:0}.report .viewer ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.report .resizer:before{content:\"\";width:0px;background:#0000001f;transition:width .12s ease,background-color .12s ease}.report .resizer:hover:before{width:3px;background:var(--brand-primary-color)}.report.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.report.resizing .resizer:before{width:3px;background:var(--brand-primary-color)}.report.resizing .chat,.report.resizing .viewer{pointer-events:none}::ng-deep body.body-report-reports .mat-mdc-card-content{display:flex;flex-direction:column;box-sizing:border-box}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel{flex:1;min-height:0}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel router-outlet+ng-component{height:100%}.master-toggle.active{background:#eceff3}\n"] }]
494
+ ], template: "<div\n #split\n class=\"report fs-row.align-start\">\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n style=\"min-height: 500px;\"\n basePath=\"reports\"\n [requestData]=\"{ reportId: selected()?.id ?? null }\"\n [introMessage]=\"introMessage\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n <div class=\"viewer fs-flex fs-column\">\n <div class=\"fs-row.align-center.gap-sm\">\n <fs-autocomplete-chips\n class=\"fs-flex\"\n [fetch]=\"fetchReports\"\n [(ngModel)]=\"selected\"\n [disabled]=\"loadingReports()\"\n [padless]=\"true\"\n [multiple]=\"false\"\n [fetchOnFocus]=\"true\"\n (ngModelChange)=\"reportChange($event)\"\n placeholder=\"Report\"\n name=\"report\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n <ng-template\n fsAutocompleteChipsStatic\n (click)=\"createReport()\">\n Create Report\n </ng-template>\n </fs-autocomplete-chips>\n @if (report() && editMode()) {\n <!-- What layout editing can add or switch to, and the way out of it \u2014\n the same outlined buttons as the fs-ai-report toolbar. -->\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"master-toggle\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n @if (report()) {\n <fs-menu>\n <ng-template\n fs-menu-item\n (click)=\"reportSettings()\">\n <mat-icon>\n tune\n </mat-icon>\n Report settings\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleEditMode()\"\n [disabled]=\"editMode()\">\n <mat-icon>\n dashboard_customize\n </mat-icon>\n {{ editMode() ? 'Done editing layout' : 'Edit layout' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n <mat-icon>\n slideshow\n </mat-icon>\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n <mat-icon>\n picture_as_pdf\n </mat-icon>\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data (This Page)\n </ng-template>\n }\n <ng-template\n fs-menu-item\n (click)=\"exportData(false, 'xlsx')\">\n <mat-icon>\n grid_on\n </mat-icon>\n Export Excel\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true, 'xlsx')\">\n <mat-icon>\n grid_on\n </mat-icon>\n Export Excel (This Page)\n </ng-template>\n }\n </fs-menu>\n }\n </div>\n @if (report()) {\n <!-- Report-level filters only (the report's actions live in the menu\n above). fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the block\n is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters) {\n @for (key of [reportFilterKey]; track key) {\n <fs-filter [config]=\"reportFilterConfig()\"></fs-filter>\n }\n }\n <app-report-canvas\n [report]=\"report()\"\n [editMode]=\"editMode()\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n</div>", styles: [".report{height:100%;min-height:500px}.report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:500px;min-width:0;border:none}.report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.report .viewer fs-filter{flex:0 0 auto;margin-top:10px;margin-bottom:0}.report .viewer ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.report .resizer:before{content:\"\";width:0px;background:#0000001f;transition:width .12s ease,background-color .12s ease}.report .resizer:hover:before{width:3px;background:var(--brand-primary-color)}.report.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.report.resizing .resizer:before{width:3px;background:var(--brand-primary-color)}.report.resizing .chat,.report.resizing .viewer{pointer-events:none}::ng-deep body.body-report-reports .mat-mdc-card-content{display:flex;flex-direction:column;box-sizing:border-box}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel{flex:1;min-height:0}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel router-outlet+ng-component{height:100%}.master-toggle.active{background:#eceff3}\n"] }]
495
495
  }], ctorParameters: () => [], propDecorators: { _split: [{
496
496
  type: ViewChild,
497
497
  args: ['split', { static: true }]
@@ -502,4 +502,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
502
502
  type: ViewChild,
503
503
  args: [ReportCanvasComponent]
504
504
  }] } });
505
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQzdFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUFnQixjQUFjLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGtCQUFrQixF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RkFHWixlQUFlO2tCQXBDM0IsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLHNCQUFzQixDQUFDLGFBQ3RCO3dCQUNULDJFQUEyRTt3QkFDM0UsdUVBQXVFO3dCQUN2RSx3QkFBd0I7d0JBQ3hCLDBFQUEwRTt3QkFDMUUsMEJBQTBCO3dCQUMxQiw0QkFBNEI7d0JBQzVCLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQix1QkFBdUI7d0JBQ3ZCLG1CQUFtQjt3QkFDbkIsMEVBQTBFO3dCQUMxRSxzQkFBc0I7d0JBQ3RCLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ3JHLDJFQUEyRTt3QkFDM0Usd0NBQXdDO3dCQUN4Qyx1QkFBdUIsRUFBRTtxQkFDMUIsV0FDUTt3QkFDUCxXQUFXO3dCQUNYLHlCQUF5Qjt3QkFDekIsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLGlCQUFpQjt3QkFDakIsU0FBUzt3QkFDVCxPQUFPO3dCQUNQLFVBQVU7d0JBQ1YscUJBQXFCO3FCQUN0Qjt3REFpQk8sTUFBTTtzQkFEYixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTVCLFVBQVU7c0JBRGpCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQU1sRCxPQUFPO3NCQURkLFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZiwgRWxlbWVudFJlZiwgTmdab25lLCBWaWV3Q2hpbGQsIGVmZmVjdCwgaW5qZWN0LCBzaWduYWwsIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEZzQXV0b2NvbXBsZXRlQ2hpcHNNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9hdXRvY29tcGxldGUtY2hpcHMnO1xuaW1wb3J0IHsgRmlsdGVyQ29uZmlnLCBGc0ZpbHRlck1vZHVsZSwgSUZpbHRlckNvbmZpZ0l0ZW0gfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNNZW51TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVudSc7XG5pbXBvcnQgeyBGc1Byb2Nlc3MgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcbmltcG9ydCB7IEZzUHJvbXB0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvbXB0JztcblxuaW1wb3J0IHsgZmluYWxpemUsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBwcm92aWRlRWNoYXJ0c0NvcmUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XG5cbmltcG9ydCB7IEZzQWlDaGF0Q29tcG9uZW50LCBGc0FpQ2hhdFJlc3BvbnNlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYWknO1xuXG5pbXBvcnQgeyBSZXBvcnRDYW52YXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3JlcG9ydC1jYW52YXMvcmVwb3J0LWNhbnZhcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsIENvbXBvbmVudFNldHRpbmdzRGlhbG9nRGF0YSwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQsXG59IGZyb20gJy4uLy4uL2RpYWxvZ3MvY29tcG9uZW50LXNldHRpbmdzL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIFJlcG9ydFNldHRpbmdzUmVzdWx0IH0gZnJvbSAnLi4vLi4vZGlhbG9ncy9yZXBvcnQtc2V0dGluZ3MvcmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1leHBvcnQtY29sbGVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0UGRmU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0UHB0eFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXBwdHguc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRUZXh0TGF5b3V0U2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtdGV4dC1sYXlvdXQuc2VydmljZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LCBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCBhcyBSZXBvcnRDb21wb25lbnRNb2RlbCwgUmVwb3J0RmlsdGVyR3JvdXAsIFJlcG9ydExpc3RJdGVtLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcHJvdmlkZVJlcG9ydERhdGVQaWNrZXIgfSBmcm9tICcuLi8uLi9yZXBvcnQtZGF0ZS1wcmVzZXRzJztcbmltcG9ydCB7XG4gIEdST1VQX0JZX0lURU0sIGZpbHRlckl0ZW1Gb3JHcm91cCwgZ3JvdXBCeUZpbHRlckl0ZW0sIGdyb3VwQnlTaWduYXR1cmUsIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5LFxuICBoYXNQYWdlR3JvdXAsIGlzR3JhbnVsYXJpdHlPZmZlcmVkLCBtYXRjaEZpbHRlckl0ZW0sIG1hdGNoRnJvbVF1ZXJ5LCByZXBvcnRCYXJHcm91cHMsXG59IGZyb20gJy4uLy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UsIGRlZmF1bHRTaWduYXR1cmUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IHppcEV4cG9ydFN0YXRlcyB9IGZyb20gJy4uLy4uL3RpbGUtZGF0YS1zdGF0ZSc7XG5cblxuLy8gVGhlIFJlcG9ydHMgcGFnZTogQUkgY2hhdCBvbiB0aGUgbGVmdCwgdGhlIHJlcG9ydCBjYW52YXMgb24gdGhlIHJpZ2h0IOKAlFxuLy8gYSBzcGxpdC1wYW5lIGxheW91dDsgdGhlIHZpZXdlciBpcyBvdXIgb3duIGNhbnZhcyAobm8gaWZyYW1lLCBubyBlbWJlZCBVUkxzKS5cbi8vIFRoZSBjaGF0IGlzIGFsd2F5cyBzY29wZWQgdG8gdGhlIHNlbGVjdGVkIHJlcG9ydDsgaXRzIGlkIHJpZGVzIG9uIGV2ZXJ5XG4vLyB0dXJuIHZpYSBbcmVxdWVzdERhdGFdLlxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXBvcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gU2Vzc2lvbiBmaWx0ZXIgc3RhdGUgaXMgcGVyLW9wZW4tcmVwb3J0LXBhZ2UsIG5vdCBhcHAtZ2xvYmFsOyB0aGUgZXhwb3J0XG4gICAgLy8gc2VydmljZXMgcmVzb2x2ZSBmaWx0ZXJzIHRocm91Z2ggaXQsIHNvIHRoZXkgbGl2ZSBhdCB0aGUgc2FtZSBsZXZlbC5cbiAgICBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UsXG4gICAgLy8gVGhlIGJhcnMnIHNlbGVjdCBsaXN0cywgbmFycm93ZWQgYnkgdGhlIG90aGVyIGZpbHRlcnM7IHBlciBvcGVuIHJlcG9ydC5cbiAgICBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSxcbiAgICBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlLFxuICAgIFJlcG9ydFBwdHhTZXJ2aWNlLFxuICAgIFJlcG9ydFBkZlNlcnZpY2UsXG4gICAgUmVwb3J0VGV4dExheW91dFNlcnZpY2UsXG4gICAgUmVwb3J0RXhwb3J0U2VydmljZSxcbiAgICAvLyBUcmVlLXNoYWtlbiBFQ2hhcnRzIGNvcmUgKyB0aGUgJ3JlcG9ydCcgaG91c2UgdGhlbWUsIGxvYWRlZCBsYXppbHkgd2l0aFxuICAgIC8vIHRoaXMgcm91dGUncyBjaHVuay5cbiAgICBwcm92aWRlRWNoYXJ0c0NvcmUoeyBlY2hhcnRzOiAoKSA9PiBpbXBvcnQoJy4uLy4uL3RoZW1lL2VjaGFydHMnKS50aGVuKChtb2R1bGUpID0+IG1vZHVsZS5kZWZhdWx0KSB9KSxcbiAgICAvLyBUaGUgYmFyJ3MgZGF0ZSBwaWNrZXJzIHN0YXJ0IHRoZWlyIHdlZWtzIG9uIE1vbmRheSBhbmQgbGlzdCB0aGUgYnVpbHQtaW5cbiAgICAvLyBwcmVzZXRzOyBhIHByZXNldCBvbmx5IHNldHMgdGhlIGRheXMuXG4gICAgcHJvdmlkZVJlcG9ydERhdGVQaWNrZXIoKSxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIEZzQXV0b2NvbXBsZXRlQ2hpcHNNb2R1bGUsXG4gICAgRnNGaWx0ZXJNb2R1bGUsXG4gICAgRnNNZW51TW9kdWxlLFxuICAgIEZzQWlDaGF0Q29tcG9uZW50LFxuICAgIE1hdEJ1dHRvbixcbiAgICBNYXRJY29uLFxuICAgIE1hdFRvb2x0aXAsXG4gICAgUmVwb3J0Q2FudmFzQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRDb21wb25lbnQge1xuXG4gIC8vIFRoZSBzaW5nbGUgcmVwb3J0IHRoZSB2aWV3ZXIgYW5kIGNoYXQgYXJlIGZvY3VzZWQgb24uXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZCA9IHNpZ25hbDxSZXBvcnRMaXN0SXRlbSB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0ID0gc2lnbmFsPFJlcG9ydCB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgbG9hZGluZ1JlcG9ydHMgPSBzaWduYWwodHJ1ZSk7XG4gIHB1YmxpYyByZWFkb25seSBlZGl0TW9kZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHJlcG9ydCB0b29sYmFyIElTIGFuIGZzLWZpbHRlcjogdGhlIHBpY2tlciByaWRlcyBpbiBpdHMgaGVhZGluZ1xuICAvLyB0ZW1wbGF0ZSwgdGhlIG1lbnUgYmVjb21lcyBpdHMgYWN0aW9ucywgYW5kIHJlcG9ydC1sZXZlbCBmaWx0ZXIgZ3JvdXBzXG4gIC8vIGJlY29tZSBpdHMgaXRlbXMuIFJlYnVpbHQgd2hlbmV2ZXIgdGhlIGxvYWRlZCByZXBvcnQgKGFuZCB0aHVzIGl0cyBncm91cHMpXG4gIC8vIGNoYW5nZXM7IHRoZSBtZW51J3Mgc2hvdy1ndWFyZHMga2VlcCB3b3JraW5nIHdoaWxlIG5vIHJlcG9ydCBpcyBzZWxlY3RlZC5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydEZpbHRlckNvbmZpZyA9IHNpZ25hbDxGaWx0ZXJDb25maWcgfCBudWxsPihudWxsKTtcblxuICBAVmlld0NoaWxkKCdzcGxpdCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgX3NwbGl0ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnY2hhdFBhbmVsJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHJpdmF0ZSBfY2hhdFBhbmVsITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLy8gT25seSB0aGUgY2FudmFzIGtub3dzIHdoaWNoIHBhZ2UgaXMgb24gc2NyZWVuLCBhbmQgYSBwYWdlLXNjb3BlZCBleHBvcnRcbiAgLy8gaGFzIHRvIGFzayBpdC5cbiAgQFZpZXdDaGlsZChSZXBvcnRDYW52YXNDb21wb25lbnQpXG4gIHByaXZhdGUgX2NhbnZhcz86IFJlcG9ydENhbnZhc0NvbXBvbmVudDtcblxuICBwdWJsaWMgcmVhZG9ubHkgaW50cm9NZXNzYWdlID0ge1xuICAgIHRleHQ6ICcnLFxuICB9O1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX3JlcG9ydFNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2VydmljZSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2ZpbHRlck9wdGlvbnMgPSBpbmplY3QoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIF9leHBvcnRTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydEV4cG9ydFNlcnZpY2UpO1xuICBwcml2YXRlIF9jb2xsZWN0b3IgPSBpbmplY3QoUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSk7XG4gIHByaXZhdGUgX3Byb2Nlc3MgPSBpbmplY3QoRnNQcm9jZXNzKTtcbiAgcHJpdmF0ZSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSBfZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgX3pvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAvLyBUaGUgc3RhdGUgdmVyc2lvbiB0aGUgYmFyIHdhcyBsYXN0IGJ1aWx0IGZvciAocmVwb3J0RmlsdGVyS2V5KS5cbiAgcHJpdmF0ZSByZWFkb25seSBfYmFyVmVyc2lvbiA9IHNpZ25hbCgwKTtcblxuICAvLyBUaGUgcGFnZSBvbiBzY3JlZW4sIGFzIHRoZSBjYW52YXMgbGFzdCByZXBvcnRlZCBpdDogdGhlIGJhciBzaG93cyBpdHNcbiAgLy8gcGFnZSBncm91cHMuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhZ2VJZCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuXG4gICAgLy8gcmVzZXRUb0RlZmF1bHRzKCkgbW92ZXMgdGhlIHN0YXRlIHZlcnNpb24uIFRoZSBiYXIgaXMgYnVpbHQgYWdhaW4gZm9yXG4gICAgLy8gaXQsIGFuZCByZXBvcnRGaWx0ZXJLZXksIHdoaWNoIGNhcnJpZXMgaXQsIHJlY3JlYXRlcyBmcy1maWx0ZXI6IGl0IHJlYWRzXG4gICAgLy8gaXRzIGNvbmZpZyBvbmNlLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCk7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSB0aGlzLl9iYXJWZXJzaW9uKCkpIHtcbiAgICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3JlcG9ydFNlcnZpY2UubG9hZCgpXG4gICAgICAucGlwZShcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZ1JlcG9ydHMuc2V0KGZhbHNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoeyBlcnJvcjogKCkgPT4gdW5kZWZpbmVkIH0pO1xuICB9XG5cbiAgcHVibGljIGZldGNoUmVwb3J0cyA9IChrZXl3b3JkOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0U2VydmljZS5maWx0ZXIoa2V5d29yZCk7XG4gIH07XG5cbiAgcHVibGljIHJlcG9ydENoYW5nZShyZXBvcnQ6IFJlcG9ydExpc3RJdGVtIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVwb3J0LnNldChudWxsKTtcbiAgICB0aGlzLmVkaXRNb2RlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fcGFnZUlkLnNldChudWxsKTtcbiAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuXG4gICAgaWYgKHJlcG9ydCkge1xuICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVSZXBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmlucHV0KHtcbiAgICAgIHRpdGxlOiAnQ3JlYXRlIFJlcG9ydCcsXG4gICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgY29tbWl0TGFiZWw6ICdDcmVhdGUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKG5hbWU6IHN0cmluZykgPT4gdGhpcy5fcmVwb3J0U2VydmljZS5jcmVhdGUobmFtZSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnQ6IFJlcG9ydExpc3RJdGVtKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuc2V0KHJlcG9ydCk7XG4gICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0LmlkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUVkaXRNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdE1vZGUudXBkYXRlKChlZGl0TW9kZSkgPT4gIWVkaXRNb2RlKTtcbiAgfVxuXG4gIC8vIFRoZSBlZGl0IHRvb2xzIGxpdmUgaW4gdGhpcyB0b29sYmFyLCBidXQgdGhlIGNhbnZhcyBvd25zIHdoYXQgdGhleSBhY3Qgb25cbiAgLy8gKHRoZSBhY3RpdmUgcGFnZSwgdGhlIGhlYWRlci9mb290ZXIgYmFuZHMsIHdoaWNoIGxheWVyIGlzIGxpdmUpLlxuICBwdWJsaWMgZ2V0IGlzTWFzdGVyTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2FudmFzPy5tYXN0ZXJNb2RlKCkgPz8gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYWRkVGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jYW52YXM/LmFkZFRleHQoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVNYXN0ZXJNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbnZhcz8udG9nZ2xlTWFzdGVyTW9kZSgpO1xuICB9XG5cbiAgLy8gUmVwb3J0IHNldHRpbmdzIOKAlCBuYW1lLCBwYWdlIHNpemUuIFRoZSBwaWNrZXIgbGlzdCBhbmQgc3RydWN0dXJlIGJvdGhcbiAgLy8gcmVsb2FkIG9uIHNhdmUgKGEgcGFnZSByZXNpemUgcmUtcmVuZGVycyB0aGUgd2hvbGUgY2FudmFzKS5cbiAgcHVibGljIHJlcG9ydFNldHRpbmdzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXBvcnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuPFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCB1bmtub3duLCBSZXBvcnRTZXR0aW5nc1Jlc3VsdD4oUmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgcmVwb3J0OiB0aGlzLnJlcG9ydCgpIH0sXG4gICAgICB3aWR0aDogJzQ2MHB4JyxcbiAgICB9KTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgLy8gVGhlIGRpYWxvZyBjb25maXJtcyArIHBlcmZvcm1zIHRoZSBkZWxldGUgaXRzZWxmOyB3ZSBqdXN0IHJlYWN0IHRvXG4gICAgICAgIC8vIHdoYXQgaXQgcmVwb3J0cyBiYWNrLlxuICAgICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09ICdkZWxldGVkJykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuc2V0KG51bGwpO1xuICAgICAgICAgIHRoaXMucmVwb3J0LnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBzYXZlIHRoYXQgZmFpbGVkIHBhcnQgd2F5IChhIHJlZnVzZWQgbmFtZSkgbWF5IHN0aWxsIGhhdmUgc3RvcmVkXG4gICAgICAgIC8vIHRoZSBmaWx0ZXJzIGJlZm9yZSBpdCwgc28gYSBkaXNtaXNzZWQgZGlhbG9nIHRoYXQgd3JvdGUgcmVsb2FkcyB0b28uXG4gICAgICAgIGlmICgocmVzdWx0Py5hY3Rpb24gPT09ICdzYXZlZCcgfHwgc2V0dGluZ3Mud3JvdGUoKSkgJiYgdGhpcy5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydCh0aGlzLnNlbGVjdGVkKCkuaWQpO1xuICAgICAgICAgIHRoaXMuX3JlZnJlc2hSZXBvcnROYW1lKHRoaXMuc2VsZWN0ZWQoKS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzIOKAlCB0aXRsZSwgZXhhY3QgZ2VvbWV0cnksIGFuZCB0aGUgZGlhZ25vc3RpYyB2aWV3c1xuICAvLyAoU1FMLCBjb25maWcsIGZpbHRlciB3aXJpbmcpLlxuICBwdWJsaWMgY29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnRNb2RlbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXBvcnQoKSB8fCAhdGhpcy5fY2FudmFzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGRpYWxvZyBnZXRzIHdoYXQgdGhlIGNvbXBvbmVudCdzIHRpdGxlIHRva2VucyBmaWxsIHdpdGggd2hlcmUgaXQgaXNcbiAgICAvLyBkcmF3biwgZm9yIHRoZSB0aXRsZSdzIEluc2VydCBmaWVsZCBtZW51IGFuZCB0aGUgbGluZSBzYXlpbmcgaG93IGl0IHJlYWRzLlxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuPENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCBDb21wb25lbnRTZXR0aW5nc0RpYWxvZ0RhdGEsIENvbXBvbmVudFNldHRpbmdzUmVzdWx0PihcbiAgICAgIENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LFxuICAgICAge1xuICAgICAgICBkYXRhOiB7IHJlcG9ydDogdGhpcy5yZXBvcnQoKSwgY29tcG9uZW50LCB0b2tlbnM6IHRoaXMuX2NhbnZhcy5jb21wb25lbnRUb2tlbnMoY29tcG9uZW50KSB9LFxuICAgICAgICB3aWR0aDogJzY0MHB4JyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEZpbHRlciBhZGQvcmVtb3ZlL2xldmVsIGNoYW5nZXMgcGVyc2lzdCBpbW1lZGlhdGVseSBpbnNpZGUgdGhlIGRpYWxvZyAobm9cbiAgICAvLyBcInNhdmVcIikgYW5kIGNhbiBsZWF2ZSBpdCBieSBhbiBleGl0IHRoYXQgY2FycmllcyBubyByZXN1bHQsIHNvIHRoZXkgYXJlXG4gICAgLy8gYW5ub3VuY2VkIGFzIHRoZXkgbGFuZC4gVGhlIHJlbG9hZCB3YWl0cyBmb3IgdGhlIGNsb3NlIHNvIHRoZSBjYW52YXMgaXNuJ3RcbiAgICAvLyByZS1yZW5kZXJpbmcgdW5kZXJuZWF0aCBhbiBvcGVuIGRpYWxvZy5cbiAgICBsZXQgZmlsdGVyc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZmlsdGVyc0NoYW5nZWRcbiAgICAgIC5waXBlKHRha2VVbnRpbChkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IGZpbHRlcnNDaGFuZ2VkID0gdHJ1ZSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIC8vIFRoZSBkaWFsb2cgY29uZmlybXMgKyBwZXJmb3JtcyB0aGUgZGVsZXRlIGl0c2VsZi4gVGhlIGNvbXBvbmVudCBpc1xuICAgICAgICAvLyBnb25lIGZyb20gdGhlIHJlcG9ydCwgc28gcmVsb2FkIHJhdGhlciB0aGFuIHBhdGNoaW5nIGl0IG91dCBsb2NhbGx5IOKAlFxuICAgICAgICAvLyBpdHMgZmlsdGVycyB3ZW50IHdpdGggaXQsIHdoaWNoIHRoZSByZXBvcnQgYmFyIGhhcyB0byBiZSByZWJ1aWx0IGZvci5cbiAgICAgICAgaWYgKHJlc3VsdD8uZGVsZXRlZCkge1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQodGhpcy5zZWxlY3RlZCgpLmlkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVwb3J0J3MgZmlsdGVyIGdyb3VwcyBjaGFuZ2VkLCBzbyB0aGUgcmVwb3J0IGJhciBhbmQgdGhlXG4gICAgICAgIC8vIG9uLWNvbXBvbmVudCBzdHJpcHMgaGF2ZSB0byBiZSByZWJ1aWx0IGZyb20gYSBmcmVzaCByZXBvcnQuXG4gICAgICAgIGlmIChmaWx0ZXJzQ2hhbmdlZCkge1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQodGhpcy5zZWxlY3RlZCgpLmlkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3RoaW5nIGVsc2UgaW4gdGhlIGRpYWxvZyB0b3VjaGVzIHRoZSBxdWVyeSDigJQgdGl0bGUgYW5kIHBhZGRpbmcgYXJlXG4gICAgICAgIC8vIHByZXNlbnRhdGlvbi4gUmVwYWludCB0aGUgb25lIGNvbXBvbmVudCBpdCB3YXMgb3BlbmVkIGZvciBhbmQgbGVhdmVcbiAgICAgICAgLy8gZXZlcnkgb3RoZXIgY29tcG9uZW50J3MgZGF0YSwgYW5kIGl0cyBxdWVyeSwgYWxvbmUuXG4gICAgICAgIGlmIChyZXN1bHQ/LnNldHRpbmdzKSB7XG4gICAgICAgICAgdGhpcy5fY2FudmFzPy5hcHBseUNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudC5pZCwgcmVzdWx0LnNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBUaGUgY2FudmFzIG1vdmVkIHRvIGFub3RoZXIgcGFnZS4gVGhlIGJhciBzaG93cyB0aGUgcGFnZSBncm91cHMgb2YgdGhlXG4gIC8vIHBhZ2Ugb24gc2NyZWVuLlxuICBwdWJsaWMgb25DYW52YXNQYWdlQ2hhbmdlZChwYWdlSWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9wYWdlSWQuc2V0KHBhZ2VJZCk7XG4gICAgLy8gQSBoZWFkZXIgb3IgZm9vdGVyIHRpbGUgcmVhZHMgaXRzIHBhZ2UncyBncm91cHMgdGhyb3VnaCBpdC5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRQYWdlKHBhZ2VJZCk7XG5cbiAgICBpZiAoaGFzUGFnZUdyb3VwKHRoaXMucmVwb3J0KCkpKSB7XG4gICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBjYW52YXMgY2hhbmdlZCB0aGUgcmVwb3J0J3Mgc3RydWN0dXJlIChhZGRlZCBhIHBhZ2UpIOKAlCByZS1mZXRjaCBzbyB0aGVcbiAgLy8gbmV3IHBhZ2UgcmVuZGVyczsgdGhlIGNhbnZhcyBsYW5kcyB0aGUgdmlldyBvbiBpdC5cbiAgcHVibGljIG9uQ2FudmFzUmVwb3J0Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHRoaXMuc2VsZWN0ZWQoKS5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3J0IHRoZSByZXBvcnQgdG8gUG93ZXJQb2ludCwgZW50aXJlbHkgY2xpZW50LXNpZGU6IGV2ZXJ5IGNvbXBvbmVudCdzXG4gIC8vIGRhdGEgaXMgZmV0Y2hlZCBmcmVzaCB3aXRoIHRoZSBjdXJyZW50IGZpbHRlciBzdGF0ZSAoYWxsIHBhZ2VzLCBub3QganVzdFxuICAvLyB0aGUgdmlzaWJsZSBvbmUpLCB0aGVuIHBwdHhnZW5qcyBidWlsZHMgYSBkZWNrIG9mIE5BVElWRSBlZGl0YWJsZSBjaGFydHMg4oCUXG4gIC8vIHBhZ2UgPSBzbGlkZSwgcG9zaXRpb25zIDE6MS4gVGhlIGRvY2sgc2hvd3MgcHJvZ3Jlc3MgdW50aWwgdGhlIGZpbGUgc2F2ZXMuXG4gIHB1YmxpYyBleHBvcnRQb3dlcnBvaW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXBvcnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3MucnVuKFxuICAgICAgJ0V4cG9ydGluZyBQb3dlclBvaW50JyxcbiAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UucG93ZXJwb2ludCh0aGlzLnJlcG9ydCgpKSxcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwb3J0IHRvIFBERiwgZW50aXJlbHkgY2xpZW50LXNpZGU6IHNhbWUgY29sbGVjdGlvbiBwYXNzLCBjaGFydHMgcmVuZGVyZWRcbiAgLy8gdGhyb3VnaCBhbiBvZmZzY3JlZW4gRUNoYXJ0cyBpbnN0YW5jZSBhdCAzw5cgcGl4ZWwgcmF0aW8gKHBpeGVsLWlkZW50aWNhbFxuICAvLyB0byB0aGUgc2NyZWVuKSwgdGFibGVzIHZpYSBqc3BkZi1hdXRvdGFibGUg4oCUIHBhZ2UgPSBQREYgcGFnZS5cbiAgcHVibGljIGV4cG9ydFBkZigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVwb3J0KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm9jZXNzLnJ1bihcbiAgICAgICdFeHBvcnRpbmcgUERGJyxcbiAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UucGRmKHRoaXMucmVwb3J0KCkpLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgd2hvbGUgcmVwb3J0IGFzIGZpbGVzIGluIG9uZSBhY3Rpb246IHRoZSBzZXJ2ZXIgd3JpdGVzIG9uZSBDU1YgcGVyXG4gIC8vIGNvbXBvbmVudCwgZWFjaCB3aGF0IHRoZSBzY3JlZW4gc2hvd3MgKGEgY2hhcnQgb3IgS1BJIGFzIGRyYXduLCBhdCB0aGVcbiAgLy8gdmlld2VyJ3MgZ3JvdXAtYnkgZ3JhaW47IGEgbGlzdCBpbiBmdWxsKSwgYW5kIHppcHMgdGhlbSBmb2xkZXJlZCBieSBwYWdlXG4gIC8vIHdpdGggYW4gRXhwb3J0IE5vdGVzLnR4dCB0aGF0IHJlY29yZHMgdGhlIGZpbHRlcnMgYXMgdGhlIGJhciByZWFkcyB0aGVtLlxuICAvLyBFYWNoIGZpbGUgY2FycmllcyBpdHMgdGlsZSdzIG93biBzdGF0ZSAoemlwRXhwb3J0U3RhdGVzKTogYSBsaXN0J3Mgc29ydCxcbiAgLy8gc2VhcmNoIGFuZCBoaWRkZW4gY29sdW1ucywgYSBjaGFydCdzIGRyaWxsIHBhdGggYW5kIHRoZSBncm91cHMgdGhhdCBtYXRjaFxuICAvLyAnYW55JzsgYSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCByZWFkIGl0IHVzZXMgZWFjaCBsaXN0J3Mgc2F2ZWQgc29ydC4gVGhlXG4gIC8vIG5vdGVzIGdldCB0aGUgZmlsdGVyIGxpbmVzIGFzIHRoZSBjb3ZlciB3b3JkcyB0aGVtIChleHBvcnRMaW5lczsgYSBUaGlzXG4gIC8vIFBhZ2UgemlwIG5hbWVzIG9ubHkgdGhlIGdyb3VwcyB0aGF0IHJlYWNoIHRoZSBwYWdlKSwgYW5kIGVhY2ggZmlsZSBpc1xuICAvLyBuYW1lZCBhZnRlciBpdHMgdGlsZSdzIHRpdGxlIGFzIHRoZSBjYW52YXMgaGVhZGVyIHJlYWRzIGl0ICh0aXRsZXMpLiBBbGxcbiAgLy8gb2YgaXQgaXMgcmVhZCBvbmNlLCB3aGVuIHRoZSBleHBvcnQgc3RhcnRzIChleHBvcnRXb3JkaW5nKS4gYHRoaXNQYWdlYFxuICAvLyBuYXJyb3dzIGl0IHRvIHRoZSBwYWdlIHRoZSBjYW52YXMgaXMgc2hvd2luZy4gVW5saWtlIHRoZSBQREYvUG93ZXJQb2ludFxuICAvLyBleHBvcnRzIHRoZSBmaWxlcyBhcmUgd3JpdHRlbiBzZXJ2ZXItc2lkZSwgc28gdGhleSBhcmUgbm90IGNhcHBlZCBieVxuICAvLyB3aGF0IGEgc2xpZGUgY2FuIGhvbGQuXG4gIHB1YmxpYyBleHBvcnREYXRhKHRoaXNQYWdlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUlkID0gdGhpc1BhZ2UgPyB0aGlzLl9jYW52YXM/LmFjdGl2ZVBhZ2U/LmlkID8/IG51bGwgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yUmVwb3J0KHJlcG9ydCwgcGFnZUlkKTtcbiAgICBjb25zdCBmcmVxdWVuY3kgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuX2NvbGxlY3Rvci5zbmFwc2hvdChyZXBvcnQpO1xuICAgIGNvbnN0IHN0YXRlcyA9IHppcEV4cG9ydFN0YXRlcyhyZXBvcnQsIHNuYXBzaG90LnN0YXRlLCBwYWdlSWQsIChjb21wb25lbnQpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRTZXNzaW9uTGF5b3V0KGNvbXBvbmVudCkpO1xuXG4gICAgdGhpcy5fcHJvY2Vzcy5kb3dubG9hZChcbiAgICAgICdFeHBvcnRpbmcgZGF0YScsXG4gICAgICB0aGlzLl9jb2xsZWN0b3IuZXhwb3J0V29yZGluZyhyZXBvcnQsIHNuYXBzaG90LCBwYWdlSWQpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoeyBsaW5lcywgdGl0bGVzIH0pID0+IHRoaXMuX3JlcG9ydERhdGEuZXhwb3J0UmVwb3J0KFxuICAgICAgICAgICAgcmVwb3J0LmlkLFxuICAgICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICAgIGZyZXF1ZW5jeSxcbiAgICAgICAgICAgIGxpbmVzLFxuICAgICAgICAgICAgc3RhdGVzLFxuICAgICAgICAgICAgdGl0bGVzLFxuICAgICAgICAgICkpLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBSZWFjdCB0byBlYWNoIGNoYXQgdHVybiAoZnMtY2hhdCBoYW5kbGVzIHRoZSByZXF1ZXN0ICsgcGVyc2lzdGVuY2UpOyB3ZVxuICAvLyBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlcG9ydCBzaWRlIGVmZmVjdHMgdGhpcyBjb250ZXh0J3MgYmFja2VuZCBmbGFncy5cbiAgcHVibGljIG9uQ2hhdFJlc3BvbnNlKHJlc3BvbnNlOiBGc0FpQ2hhdFJlc3BvbnNlKTogdm9pZCB7XG4gICAgLy8gVGhlIGFnZW50IGNoYW5nZWQgdGhlIHJlcG9ydCdzIHN0cnVjdHVyZSDigJQgcmUtZmV0Y2ggaXQuIFNlc3Npb24gZmlsdGVyXG4gICAgLy8gdmFsdWVzIHN1cnZpdmUgKHRoZSBmaWx0ZXItc3RhdGUgc2VydmljZSBrZWVwcyB2YWx1ZXMgZm9yIGdyb3VwcyB0aGF0XG4gICAgLy8gc3RpbGwgZXhpc3QpLlxuICAgIGlmIChyZXNwb25zZS5yZXBvcnRDaGFuZ2VkICYmIHRoaXMuc2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5fbG9hZFJlcG9ydCh0aGlzLnNlbGVjdGVkKCkuaWQpO1xuICAgIH1cblxuICAgIC8vIEEgcmVuYW1lIGNoYW5nZXMgbm90aGluZyBzdHJ1Y3R1cmFsIOKAlCByZWZyZXNoIHRoZSBwaWNrZXIgY2hpcCBsYWJlbC5cbiAgICBpZiAocmVzcG9uc2UucmVwb3J0UmVuYW1lZCAmJiB0aGlzLnNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hSZXBvcnROYW1lKHRoaXMuc2VsZWN0ZWQoKS5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHJhZyB0aGUgZGl2aWRlciBiZXR3ZWVuIHRoZSBjaGF0IGFuZCBjYW52YXMgcGFuZXMgKHBvaW50ZXItY2FwdHVyZSBsb29wXG4gIC8vIG91dHNpZGUgQW5ndWxhcikuXG4gIHB1YmxpYyBvblJlc2l6ZVN0YXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgaGFuZGxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVzaXppbmcnKTtcblxuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgbW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHRoaXMuX3Jlc2l6ZVRvKGUuY2xpZW50WCk7XG4gICAgICBjb25zdCBlbmQgPSAoKSA9PiB7XG4gICAgICAgIGhhbmRsZS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gICAgICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncmVzaXppbmcnKTtcbiAgICAgIH07XG5cbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNpemVUbyhjbGllbnRYOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAocmVjdC53aWR0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJhdGlvID0gKGNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aDtcbiAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4oMC44LCBNYXRoLm1heCgwLjIsIHJhdGlvKSk7XG4gICAgdGhpcy5fY2hhdFBhbmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZmxleEJhc2lzID0gYCR7Y2xhbXBlZCAqIDEwMH0lYDtcbiAgfVxuXG4gIHByaXZhdGUgX2xvYWRSZXBvcnQocmVwb3J0SWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3JlcG9ydERhdGEuZ2V0KHJlcG9ydElkKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0OiBSZXBvcnQpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgICAgIC8vIEEgcmVwb3J0IGtlZXBzIG5vIHN0YXRlIGluIHRoZSBVUkw6IGl0cyBmaWx0ZXJzIGxpdmUgaW4gdGhlIHN0YXRlXG4gICAgICAgIC8vIHNlcnZpY2UgZm9yIGFzIGxvbmcgYXMgdGhlIHJlcG9ydCBpcyBvcGVuLlxuICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5pbml0KHJlcG9ydCk7XG4gICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJlcG9ydC1sZXZlbCBmaWx0ZXIgZ3JvdXBzIGluIHRoZWlyIHNhdmVkIG9yZGVyIOKAlCB0aGUgb25lcyB0aGF0IHJlbmRlciBpblxuICAvLyB0aGUgdG9vbGJhciAoY29tcG9uZW50LWxldmVsIGdyb3VwcyByZW5kZXIgb24gdGhlaXIgY29tcG9uZW50cyksIHdpdGhcbiAgLy8gdGhlIHBhZ2UgZ3JvdXBzIG9mIHRoZSBwYWdlIG9uIHNjcmVlbi5cbiAgcHJpdmF0ZSBfcmVwb3J0R3JvdXBzKCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICAgIHJldHVybiByZXBvcnRCYXJHcm91cHModGhpcy5yZXBvcnQoKSwgdGhpcy5fcGFnZUlkKCkpO1xuICB9XG5cbiAgLy8gR2F0ZXMgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIHNvIGl0IGlzbid0IHJlbmRlcmVkICh0YWtpbmcgc3BhY2UpIHdoZW4gdGhlcmVcbiAgLy8gaXMgbm90aGluZyB0byBwdXQgaW4gaXQg4oCUIG5vIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIGFuZCBubyBncm91cC1ieSBjb250cm9sLlxuICBwdWJsaWMgZ2V0IHJlcG9ydEhhc0ZpbHRlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydEdyb3VwcygpLmxlbmd0aCA+IDAgfHwgISF0aGlzLl9ncm91cEJ5SXRlbSgpO1xuICB9XG5cbiAgLy8gZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25seSBvbmNlIChhdCBpbml0KSDigJQgcmUtYmluZGluZyBkb2VzIG5vdGhpbmcuXG4gIC8vIFRoZSB0ZW1wbGF0ZSBrZXlzIHRoZSB0b29sYmFyIGZzLWZpbHRlciBvbiB0aGlzIHNpZ25hdHVyZSBzbyBpdCdzIHJlY3JlYXRlZFxuICAvLyAoYW5kIHJlLXJlYWRzIHRoZSByZWJ1aWx0IGNvbmZpZykgd2hlbmV2ZXIgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgc2V0XG4gIC8vIGNoYW5nZXMsIGUuZy4gYWZ0ZXIgdGhlIGNvbXBvbmVudCBzZXR0aW5ncyBkaWFsb2cgYWRkcy9tb3ZlcyBhIGZpbHRlci5cbiAgcHVibGljIGdldCByZXBvcnRGaWx0ZXJLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gVGhlIHN0YXRlIHZlcnNpb24gdGhlIGJhciB3YXMgYnVpbHQgZm9yOiBhbiBhcHBsaWVkIHZpZXcsIG9yIGEgcmVzZXRcbiAgICAgIC8vIHRvIHRoZSBiYXNlLCByZXBsYWNlcyBldmVyeSB2YWx1ZSBhdCBvbmNlLlxuICAgICAgdGhpcy5fYmFyVmVyc2lvbigpLFxuICAgICAgLy8gVGhlIGVmZmVjdGl2ZSB6b25lIGlzIHBhcnQgb2YgaXQgdG9vOiBhIHpvbmUgY2hhbmdlIHJlLXJlc29sdmVzIHJlbGF0aXZlXG4gICAgICAvLyBwcmVzZXRzLCBhbmQgdGhlIGJhciBtdXN0IGJlIHJlY3JlYXRlZCB0byBzaG93IHRoZSBuZXcgZGF5cy5cbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnRpbWV6b25lKCksXG4gICAgICAvLyBUaGUgc3RvcmVkIGRlZmF1bHQgaXMgcGFydCBvZiB0aGUgc2lnbmF0dXJlOiBzYXZpbmcgYSBuZXcgZGVmYXVsdCBpbiByZXBvcnRcbiAgICAgIC8vIHNldHRpbmdzIHJlYnVpbGRzIHRoZSBjb25maWcsIGJ1dCB3aXRob3V0IGEga2V5IGNoYW5nZSBmcy1maWx0ZXIga2VlcHNcbiAgICAgIC8vIHJlbmRlcmluZyB0aGUgdmFsdWVzIGl0IHdhcyBjcmVhdGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAgICAgZ3JvdXBCeVNpZ25hdHVyZSh0aGlzLnJlcG9ydCgpKSxcbiAgICAgIC4uLnRoaXMuX3JlcG9ydEdyb3VwcygpLm1hcCgoZ3JvdXApID0+IGAke2dyb3VwLmlkfToke2dyb3VwLmxldmVsfToke2dyb3VwLmxhYmVsfToke2RlZmF1bHRTaWduYXR1cmUoZ3JvdXApfWApLFxuICAgICAgLy8gQSBwYWdlIGdyb3VwIHNob3dzIG9uIGl0cyBvd24gcGFnZSBvbmx5LCBzbyBzdWNoIGEgYmFyIGlzIHJlY3JlYXRlZFxuICAgICAgLy8gd2hlbiB0aGUgcGFnZSBvbiBzY3JlZW4gY2hhbmdlcy5cbiAgICAgIC4uLihoYXNQYWdlR3JvdXAodGhpcy5yZXBvcnQoKSkgPyBbYHBhZ2U6JHt0aGlzLl9wYWdlSWQoKX1gXSA6IFtdKSxcbiAgICBdLmpvaW4oJ3wnKTtcbiAgfVxuXG4gIC8vIChSZSlidWlsZCB0aGUgdG9vbGJhciBmcy1maWx0ZXIgY29uZmlnIOKAlCB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBpdGVtcyBhbmRcbiAgLy8gdGhlbiB0aGUgZ3JvdXAtYnkgY29udHJvbC4gVGhlIHJlcG9ydCdzIGFjdGlvbnMgbGl2ZSBpbiB0aGUgZnMtbWVudSBiZXNpZGVcbiAgLy8gdGhlIHBpY2tlciwgbm90IGhlcmUuIE9ubHkgYnVpbHQvdXNlZCBvbmNlIGEgcmVwb3J0IGlzIGxvYWRlZCAodGhlIHRlbXBsYXRlXG4gIC8vIGdhdGVzIGl0IG9uIGByZXBvcnRgKS5cbiAgcHJpdmF0ZSBfYnVpbGRSZXBvcnRDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJlcG9ydCgpPy5pZCA/PyBudWxsO1xuXG4gICAgLy8gRHJvcCBhIGdyYWluIHRoZSBjb250cm9sIG5vIGxvbmdlciBvZmZlcnMg4oCUIHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0XG4gICAgLy8gbWlkLXNlc3Npb24sIGFuZCBhbiBvdmVycmlkZSB0aGUgdmlld2VyIGNhbid0IHNlZSBpcyB3b3JzZSB0aGFuIG5vbmUuXG4gICAgaWYgKHRoaXMucmVwb3J0KCkgJiYgIWlzR3JhbnVsYXJpdHlPZmZlcmVkKHRoaXMucmVwb3J0KCksIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKSkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0RnJlcXVlbmN5KG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5yZXBvcnQoKT8udmlld2VyRmVhdHVyZXMgPz8gW107XG4gICAgY29uc3QgaXRlbXMgPSByZXBvcnRJZFxuICAgICAgPyB0aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PlxuICAgICAgICBmaWx0ZXJJdGVtRm9yR3JvdXAoZ3JvdXAsIHRoaXMuX2ZpbHRlck9wdGlvbnMsIHRoaXMucmVwb3J0KCksIHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKSwgZmVhdHVyZXMpKVxuICAgICAgOiBbXTtcblxuICAgIC8vIFRoZSBncm91cC1ieSBjb250cm9sIGxlYWRzIHRoZSBiYXIsIGFoZWFkIG9mIGV2ZXJ5IGZpbHRlcjogaXQgc2V0cyB0aGVcbiAgICAvLyBncmFpbiB0aGUgd2hvbGUgcmVwb3J0IGlzIHJlYWQgYXQsIHNvIGl0IGlzIHRoZSBmaXJzdCB0aGluZyBhIHZpZXdlclxuICAgIC8vIGRlY2lkZXMuIEl0IGlzIG5vdCBhIGZpbHRlciBncm91cCDigJQgaXQgcmUtYnVja2V0cyByb3dzIHJhdGhlciB0aGFuXG4gICAgLy8gbmFycm93aW5nIHRoZW0g4oCUIHNvIGl0IGlzIHBsYWNlZCBoZXJlIHJhdGhlciB0aGFuIG9yZGVyZWQgYW1vbmcgdGhlbS5cbiAgICBjb25zdCBncm91cEJ5SXRlbSA9IHRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gICAgaWYgKGdyb3VwQnlJdGVtKSB7XG4gICAgICBpdGVtcy51bnNoaWZ0KGdyb3VwQnlJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBIb3cgdGhlIGdyb3VwcyBjb21iaW5lIGNsb3NlcyB0aGUgYmFyLlxuICAgIGNvbnN0IG1hdGNoSXRlbSA9IHRoaXMuX21hdGNoSXRlbSgpO1xuICAgIGlmIChtYXRjaEl0ZW0pIHtcbiAgICAgIGl0ZW1zLnB1c2gobWF0Y2hJdGVtKTtcbiAgICB9XG5cbiAgICB0aGlzLl9iYXJWZXJzaW9uLnNldCh0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKSk7XG4gICAgdGhpcy5yZXBvcnRGaWx0ZXJDb25maWcuc2V0KHtcbiAgICAgIC8vIE5ldmVyIHRvdWNoIHRoZSBVUkwgb3IgcGVyc2lzdCBmaWx0ZXIgc3RhdGUg4oCUIHJlcG9ydCBmaWx0ZXJzIGFyZVxuICAgICAgLy8gc2Vzc2lvbi1vbmx5LCBvd25lZCBieSBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UuXG4gICAgICBxdWVyeVBhcmFtOiBmYWxzZSxcbiAgICAgIHBlcnNpc3Q6IGZhbHNlLFxuICAgICAgaXRlbXMsXG4gICAgICBjaGFuZ2U6IChxdWVyeSkgPT4gdGhpcy5fYmFyQ2hhbmdlZChxdWVyeSA/PyB7fSwgISFtYXRjaEl0ZW0pLFxuICAgICAgLy8gJ0NsZWFyIGZpbHRlcnMnIHB1dHMgdGhlIHNjcmVlbiBiYWNrIG9uIHRoZSByZXBvcnQncyBhdXRob3JlZFxuICAgICAgLy8gZGVmYXVsdHMgYW5kIGRyb3BzIHRoZSB0ZW1wb3JhcnkgbGF5ZXIuXG4gICAgICBjbGVhcjogKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUucmVzZXRUb0RlZmF1bHRzKCksXG4gICAgICAvLyBUaGUgY2hpcCBzaG93cyBleGFjdGx5IHdoaWxlIHRoZSBzY3JlZW4gZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0cyBhXG4gICAgICAvLyBjbGVhciByZXR1cm5zIHRvIChDNSkuXG4gICAgICBjbGVhclZpc2libGU6ICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmRpZmZlcnNGcm9tRGVmYXVsdHMoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBiYXIncyB2YWx1ZXMgaW50byB0aGUgc3RhdGU6IGV2ZXJ5IGdyb3VwIGl0IHNob3dzLCB0aGUgZ3JhaW4gYW5kLFxuICAvLyB3aGVuIHRoZSBiYXIgaGFzIHRoZSBjb250cm9sLCB0aGUgbWF0Y2guXG4gIHByaXZhdGUgX2JhckNoYW5nZWQocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBoYXNNYXRjaDogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyBncm91cElkLCB2YWx1ZSB9IG9mIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KHF1ZXJ5LCB0aGlzLl9yZXBvcnRHcm91cHMoKSkpIHtcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFZhbHVlKGdyb3VwSWQsIHZhbHVlKTtcbiAgICB9XG4gICAgLy8gTm90IGEgZmlsdGVyIGdyb3VwIOKAlCB0aGUgZ3JhaW4gaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIHF1ZXJ5LlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEZyZXF1ZW5jeSgocXVlcnlbR1JPVVBfQllfSVRFTV0gYXMgQ2hhcnRHcmFudWxhcml0eSkgfHwgbnVsbCk7XG4gICAgLy8gTm9yIGlzIHRoZSBtYXRjaDsgYSBiYXIgd2l0aG91dCB0aGUgY29udHJvbCBsZWF2ZXMgaXQgYXMgaXQgaXMuXG4gICAgaWYgKGhhc01hdGNoKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRNYXRjaChtYXRjaEZyb21RdWVyeShxdWVyeSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIGFzIGFuIGZzLWZpbHRlciBpdGVtLCBvciBudWxsIHdoZW4gdGhlIHJlcG9ydFxuICAvLyBoYXMgbm9uZSB0byBzaG93LiBTZWVkZWQgZnJvbSB0aGUgc2Vzc2lvbiBzdGF0ZSBzbyB0aGUgZ3JhaW4gdGhlIHZpZXdlclxuICAvLyBwaWNrZWQgc3Vydml2ZXMgdGhlIHJlcG9ydCBiZWluZyByZS1mZXRjaGVkIGFmdGVyIGEgY2hhdCBlZGl0LlxuICBwcml2YXRlIF9ncm91cEJ5SXRlbSgpOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydCgpXG4gICAgICA/IGdyb3VwQnlGaWx0ZXJJdGVtKHRoaXMucmVwb3J0KCksIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gVGhlIGJhcidzIE1hdGNoIGNvbnRyb2wsIHNlZWRlZCB3aXRoIHRoZSBtYXRjaCBvbiBzY3JlZW4sIG9yIG51bGwgd2hlblxuICAvLyB0aGUgYmFyIGhvbGRzIGZld2VyIHRoYW4gdHdvIGdyb3VwcyB0aGF0IGNvbWJpbmUuXG4gIHByaXZhdGUgX21hdGNoSXRlbSgpOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICAgIHJldHVybiBtYXRjaEZpbHRlckl0ZW0odGhpcy5yZXBvcnQoKSwgdGhpcy5fcmVwb3J0R3JvdXBzKCksIHRoaXMuX3BhZ2VJZCgpLCB0aGlzLl9maWx0ZXJTdGF0ZS5tYXRjaCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hSZXBvcnROYW1lKHJlcG9ydElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXBvcnRTZXJ2aWNlLmxvYWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0czogUmVwb3J0TGlzdEl0ZW1bXSkgPT4ge1xuICAgICAgICBjb25zdCByZW5hbWVkID0gcmVwb3J0cy5maW5kKChyZXBvcnQpID0+IHJlcG9ydC5pZCA9PT0gcmVwb3J0SWQpO1xuICAgICAgICBpZiAocmVuYW1lZCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuc2V0KHJlbmFtZWQpO1xuICAgICAgICAgIGlmICh0aGlzLnJlcG9ydCgpKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9ydC5zZXQoeyAuLi50aGlzLnJlcG9ydCgpLCBuYW1lOiByZW5hbWVkLm5hbWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICAgICNzcGxpdFxuICAgIGNsYXNzPVwicmVwb3J0IGZzLXJvdy5hbGlnbi1zdGFydFwiPlxuICA8ZnMtYWktY2hhdFxuICAgICNjaGF0UGFuZWxcbiAgICBjbGFzcz1cImNoYXRcIlxuICAgIHN0eWxlPVwibWluLWhlaWdodDogNTAwcHg7XCJcbiAgICBiYXNlUGF0aD1cInJlcG9ydHNcIlxuICAgIFtyZXF1ZXN0RGF0YV09XCJ7IHJlcG9ydElkOiBzZWxlY3RlZCgpPy5pZCA/PyBudWxsIH1cIlxuICAgIFtpbnRyb01lc3NhZ2VdPVwiaW50cm9NZXNzYWdlXCJcbiAgICAocmVzcG9uc2UpPVwib25DaGF0UmVzcG9uc2UoJGV2ZW50KVwiPlxuICA8L2ZzLWFpLWNoYXQ+XG4gIDxkaXZcbiAgICBjbGFzcz1cInJlc2l6ZXJcIlxuICAgIChwb2ludGVyZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudClcIj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ2aWV3ZXIgZnMtZmxleCBmcy1jb2x1bW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmFsaWduLWNlbnRlci5nYXAtc21cIj5cbiAgICAgIDxmcy1hdXRvY29tcGxldGUtY2hpcHNcbiAgICAgICAgICBjbGFzcz1cImZzLWZsZXhcIlxuICAgICAgICAgIFtmZXRjaF09XCJmZXRjaFJlcG9ydHNcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nUmVwb3J0cygpXCJcbiAgICAgICAgICBbcGFkbGVzc109XCJ0cnVlXCJcbiAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxuICAgICAgICAgIFtmZXRjaE9uRm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicmVwb3J0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmVwb3J0XCJcbiAgICAgICAgICBuYW1lPVwicmVwb3J0XCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnNBdXRvY29tcGxldGVDaGlwc1RlbXBsYXRlXG4gICAgICAgICAgICBsZXQtb2JqZWN0PVwib2JqZWN0XCI+XG4gICAgICAgICAge3sgb2JqZWN0Lm5hbWUgfX1cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmc0F1dG9jb21wbGV0ZUNoaXBzU3RhdGljXG4gICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlUmVwb3J0KClcIj5cbiAgICAgICAgICBDcmVhdGUgUmVwb3J0XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLWF1dG9jb21wbGV0ZS1jaGlwcz5cbiAgICAgIEBpZiAocmVwb3J0KCkgJiYgZWRpdE1vZGUoKSkge1xuICAgICAgICA8IS0tIFdoYXQgbGF5b3V0IGVkaXRpbmcgY2FuIGFkZCBvciBzd2l0Y2ggdG8sIGFuZCB0aGUgd2F5IG91dCBvZiBpdCDigJRcbiAgICAgICAgICAgICB0aGUgc2FtZSBvdXRsaW5lZCBidXR0b25zIGFzIHRoZSBmcy1haS1yZXBvcnQgdG9vbGJhci4gLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiQWRkIGEgYmxvY2sgb2YgdGV4dFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkVGV4dCgpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnRpdGxlPC9tYXQtaWNvbj5cbiAgICAgICAgICBBZGQgdGV4dFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibWFzdGVyLXRvZ2dsZVwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzTWFzdGVyTW9kZVwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJpc01hc3Rlck1vZGUgPyAnQmFjayB0byBlZGl0aW5nIHRoaXMgcGFnZScgOiAnRWRpdCB0aGUgaGVhZGVyIGFuZCBmb290ZXIgc2hvd24gb24gZXZlcnkgcGFnZSdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1hc3Rlck1vZGUoKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj53ZWJfYXNzZXQ8L21hdC1pY29uPlxuICAgICAgICAgIEhlYWRlciAmIGZvb3RlclxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFZGl0TW9kZSgpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmNoZWNrPC9tYXQtaWNvbj5cbiAgICAgICAgICBEb25lIGVkaXRpbmdcbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKHJlcG9ydCgpKSB7XG4gICAgICAgIDxmcy1tZW51PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlcG9ydFNldHRpbmdzKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5cbiAgICAgICAgICAgICAgdHVuZVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIFJlcG9ydCBzZXR0aW5nc1xuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRWRpdE1vZGUoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJlZGl0TW9kZSgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgIGRhc2hib2FyZF9jdXN0b21pemVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICB7eyBlZGl0TW9kZSgpID8gJ0RvbmUgZWRpdGluZyBsYXlvdXQnIDogJ0VkaXQgbGF5b3V0JyB9fVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0UG93ZXJwb2ludCgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgIHNsaWRlc2hvd1xuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIEV4cG9ydCBQb3dlclBvaW50XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQZGYoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgICBwaWN0dXJlX2FzX3BkZlxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIEV4cG9ydCBQREZcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgICB0YWJsZV92aWV3XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgRXhwb3J0IFJhdyBEYXRhXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICBAaWYgKChyZXBvcnQoKT8ucGFnZXM/Lmxlbmd0aCA/PyAwKSA+IDEpIHtcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnREYXRhKHRydWUpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5cbiAgICAgICAgICAgICAgICB0YWJsZV92aWV3XG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIEV4cG9ydCBSYXcgRGF0YSAoVGhpcyBQYWdlKVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZnMtbWVudT5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKHJlcG9ydCgpKSB7XG4gICAgICA8IS0tIFJlcG9ydC1sZXZlbCBmaWx0ZXJzIG9ubHkgKHRoZSByZXBvcnQncyBhY3Rpb25zIGxpdmUgaW4gdGhlIG1lbnVcbiAgICAgICAgICAgYWJvdmUpLiBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQsIHNvIGl0J3Mga2V5ZWQgb24gdGhlXG4gICAgICAgICAgIGZpbHRlciBzaWduYXR1cmU6IHdoZW4gdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgc2V0IGNoYW5nZXMgdGhlIGJsb2NrXG4gICAgICAgICAgIGlzIHJlY3JlYXRlZCBhbmQgcmUtcmVhZHMgdGhlIHJlYnVpbHQgY29uZmlnLiAtLT5cbiAgICAgIEBpZiAocmVwb3J0SGFzRmlsdGVycykge1xuICAgICAgICBAZm9yIChrZXkgb2YgW3JlcG9ydEZpbHRlcktleV07IHRyYWNrIGtleSkge1xuICAgICAgICAgIDxmcy1maWx0ZXIgW2NvbmZpZ109XCJyZXBvcnRGaWx0ZXJDb25maWcoKVwiPjwvZnMtZmlsdGVyPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICA8YXBwLXJlcG9ydC1jYW52YXNcbiAgICAgICAgW3JlcG9ydF09XCJyZXBvcnQoKVwiXG4gICAgICAgIFtlZGl0TW9kZV09XCJlZGl0TW9kZSgpXCJcbiAgICAgICAgKGNvbXBvbmVudFNldHRpbmdzKT1cImNvbXBvbmVudFNldHRpbmdzKCRldmVudClcIlxuICAgICAgICAocmVwb3J0Q2hhbmdlZCk9XCJvbkNhbnZhc1JlcG9ydENoYW5nZWQoKVwiXG4gICAgICAgIChwYWdlQ2hhbmdlZCk9XCJvbkNhbnZhc1BhZ2VDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgIDwvYXBwLXJlcG9ydC1jYW52YXM+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
505
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQzdFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUFnQixjQUFjLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGtCQUFrQixF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ZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsIE5nWm9uZSwgVmlld0NoaWxkLCBlZmZlY3QsIGluamVjdCwgc2lnbmFsLCB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBGc0F1dG9jb21wbGV0ZUNoaXBzTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXV0b2NvbXBsZXRlLWNoaXBzJztcbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRnNGaWx0ZXJNb2R1bGUsIElGaWx0ZXJDb25maWdJdGVtIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcbmltcG9ydCB7IEZzTWVudU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lbnUnO1xuaW1wb3J0IHsgRnNQcm9jZXNzIH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvY2Vzcyc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5cbmltcG9ydCB7IGZpbmFsaXplLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgcHJvdmlkZUVjaGFydHNDb3JlIH0gZnJvbSAnbmd4LWVjaGFydHMnO1xuXG5pbXBvcnQgeyBGc0FpQ2hhdENvbXBvbmVudCwgRnNBaUNoYXRSZXNwb25zZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2FpJztcblxuaW1wb3J0IHsgUmVwb3J0Q2FudmFzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCBDb21wb25lbnRTZXR0aW5nc0RpYWxvZ0RhdGEsIENvbXBvbmVudFNldHRpbmdzUmVzdWx0LFxufSBmcm9tICcuLi8uLi9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXBkZi5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBwdHhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wcHR4LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0VGV4dExheW91dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXRleHQtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQgYXMgUmVwb3J0Q29tcG9uZW50TW9kZWwsIFJlcG9ydEZpbHRlckdyb3VwLCBSZXBvcnRMaXN0SXRlbSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydEZvcm1hdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWV4cG9ydC1mb3JtYXQudHlwZSc7XG5pbXBvcnQgeyBwcm92aWRlUmVwb3J0RGF0ZVBpY2tlciB9IGZyb20gJy4uLy4uL3JlcG9ydC1kYXRlLXByZXNldHMnO1xuaW1wb3J0IHtcbiAgR1JPVVBfQllfSVRFTSwgZmlsdGVySXRlbUZvckdyb3VwLCBncm91cEJ5RmlsdGVySXRlbSwgZ3JvdXBCeVNpZ25hdHVyZSwgZ3JvdXBWYWx1ZXNGcm9tUXVlcnksXG4gIGhhc1BhZ2VHcm91cCwgaXNHcmFudWxhcml0eU9mZmVyZWQsIG1hdGNoRmlsdGVySXRlbSwgbWF0Y2hGcm9tUXVlcnksIHJlcG9ydEJhckdyb3Vwcyxcbn0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSwgZGVmYXVsdFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgemlwRXhwb3J0U3RhdGVzIH0gZnJvbSAnLi4vLi4vdGlsZS1kYXRhLXN0YXRlJztcblxuXG4vLyBUaGUgUmVwb3J0cyBwYWdlOiBBSSBjaGF0IG9uIHRoZSBsZWZ0LCB0aGUgcmVwb3J0IGNhbnZhcyBvbiB0aGUgcmlnaHQg4oCUXG4vLyBhIHNwbGl0LXBhbmUgbGF5b3V0OyB0aGUgdmlld2VyIGlzIG91ciBvd24gY2FudmFzIChubyBpZnJhbWUsIG5vIGVtYmVkIFVSTHMpLlxuLy8gVGhlIGNoYXQgaXMgYWx3YXlzIHNjb3BlZCB0byB0aGUgc2VsZWN0ZWQgcmVwb3J0OyBpdHMgaWQgcmlkZXMgb24gZXZlcnlcbi8vIHR1cm4gdmlhIFtyZXF1ZXN0RGF0YV0uXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlcG9ydC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBTZXNzaW9uIGZpbHRlciBzdGF0ZSBpcyBwZXItb3Blbi1yZXBvcnQtcGFnZSwgbm90IGFwcC1nbG9iYWw7IHRoZSBleHBvcnRcbiAgICAvLyBzZXJ2aWNlcyByZXNvbHZlIGZpbHRlcnMgdGhyb3VnaCBpdCwgc28gdGhleSBsaXZlIGF0IHRoZSBzYW1lIGxldmVsLlxuICAgIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSxcbiAgICAvLyBUaGUgYmFycycgc2VsZWN0IGxpc3RzLCBuYXJyb3dlZCBieSB0aGUgb3RoZXIgZmlsdGVyczsgcGVyIG9wZW4gcmVwb3J0LlxuICAgIFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICAgIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UsXG4gICAgUmVwb3J0UHB0eFNlcnZpY2UsXG4gICAgUmVwb3J0UGRmU2VydmljZSxcbiAgICBSZXBvcnRUZXh0TGF5b3V0U2VydmljZSxcbiAgICBSZXBvcnRFeHBvcnRTZXJ2aWNlLFxuICAgIC8vIFRyZWUtc2hha2VuIEVDaGFydHMgY29yZSArIHRoZSAncmVwb3J0JyBob3VzZSB0aGVtZSwgbG9hZGVkIGxhemlseSB3aXRoXG4gICAgLy8gdGhpcyByb3V0ZSdzIGNodW5rLlxuICAgIHByb3ZpZGVFY2hhcnRzQ29yZSh7IGVjaGFydHM6ICgpID0+IGltcG9ydCgnLi4vLi4vdGhlbWUvZWNoYXJ0cycpLnRoZW4oKG1vZHVsZSkgPT4gbW9kdWxlLmRlZmF1bHQpIH0pLFxuICAgIC8vIFRoZSBiYXIncyBkYXRlIHBpY2tlcnMgc3RhcnQgdGhlaXIgd2Vla3Mgb24gTW9uZGF5IGFuZCBsaXN0IHRoZSBidWlsdC1pblxuICAgIC8vIHByZXNldHM7IGEgcHJlc2V0IG9ubHkgc2V0cyB0aGUgZGF5cy5cbiAgICBwcm92aWRlUmVwb3J0RGF0ZVBpY2tlcigpLFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgRnNBdXRvY29tcGxldGVDaGlwc01vZHVsZSxcbiAgICBGc0ZpbHRlck1vZHVsZSxcbiAgICBGc01lbnVNb2R1bGUsXG4gICAgRnNBaUNoYXRDb21wb25lbnQsXG4gICAgTWF0QnV0dG9uLFxuICAgIE1hdEljb24sXG4gICAgTWF0VG9vbHRpcCxcbiAgICBSZXBvcnRDYW52YXNDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydENvbXBvbmVudCB7XG5cbiAgLy8gVGhlIHNpbmdsZSByZXBvcnQgdGhlIHZpZXdlciBhbmQgY2hhdCBhcmUgZm9jdXNlZCBvbi5cbiAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGVkID0gc2lnbmFsPFJlcG9ydExpc3RJdGVtIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSByZXBvcnQgPSBzaWduYWw8UmVwb3J0IHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBsb2FkaW5nUmVwb3J0cyA9IHNpZ25hbCh0cnVlKTtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRNb2RlID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUaGUgcmVwb3J0IHRvb2xiYXIgSVMgYW4gZnMtZmlsdGVyOiB0aGUgcGlja2VyIHJpZGVzIGluIGl0cyBoZWFkaW5nXG4gIC8vIHRlbXBsYXRlLCB0aGUgbWVudSBiZWNvbWVzIGl0cyBhY3Rpb25zLCBhbmQgcmVwb3J0LWxldmVsIGZpbHRlciBncm91cHNcbiAgLy8gYmVjb21lIGl0cyBpdGVtcy4gUmVidWlsdCB3aGVuZXZlciB0aGUgbG9hZGVkIHJlcG9ydCAoYW5kIHRodXMgaXRzIGdyb3VwcylcbiAgLy8gY2hhbmdlczsgdGhlIG1lbnUncyBzaG93LWd1YXJkcyBrZWVwIHdvcmtpbmcgd2hpbGUgbm8gcmVwb3J0IGlzIHNlbGVjdGVkLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0RmlsdGVyQ29uZmlnID0gc2lnbmFsPEZpbHRlckNvbmZpZyB8IG51bGw+KG51bGwpO1xuXG4gIEBWaWV3Q2hpbGQoJ3NwbGl0JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBfc3BsaXQhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdjaGF0UGFuZWwnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIF9jaGF0UGFuZWwhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvLyBPbmx5IHRoZSBjYW52YXMga25vd3Mgd2hpY2ggcGFnZSBpcyBvbiBzY3JlZW4sIGFuZCBhIHBhZ2Utc2NvcGVkIGV4cG9ydFxuICAvLyBoYXMgdG8gYXNrIGl0LlxuICBAVmlld0NoaWxkKFJlcG9ydENhbnZhc0NvbXBvbmVudClcbiAgcHJpdmF0ZSBfY2FudmFzPzogUmVwb3J0Q2FudmFzQ29tcG9uZW50O1xuXG4gIHB1YmxpYyByZWFkb25seSBpbnRyb01lc3NhZ2UgPSB7XG4gICAgdGV4dDogJycsXG4gIH07XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfcmVwb3J0U2VydmljZSA9IGluamVjdChSZXBvcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZmlsdGVyT3B0aW9ucyA9IGluamVjdChSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSk7XG4gIHByaXZhdGUgX2V4cG9ydFNlcnZpY2UgPSBpbmplY3QoUmVwb3J0RXhwb3J0U2VydmljZSk7XG4gIHByaXZhdGUgX2NvbGxlY3RvciA9IGluamVjdChSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xuICBwcml2YXRlIF9wcm9tcHQgPSBpbmplY3QoRnNQcm9tcHQpO1xuICBwcml2YXRlIF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIC8vIFRoZSBzdGF0ZSB2ZXJzaW9uIHRoZSBiYXIgd2FzIGxhc3QgYnVpbHQgZm9yIChyZXBvcnRGaWx0ZXJLZXkpLlxuICBwcml2YXRlIHJlYWRvbmx5IF9iYXJWZXJzaW9uID0gc2lnbmFsKDApO1xuXG4gIC8vIFRoZSBwYWdlIG9uIHNjcmVlbiwgYXMgdGhlIGNhbnZhcyBsYXN0IHJlcG9ydGVkIGl0OiB0aGUgYmFyIHNob3dzIGl0c1xuICAvLyBwYWdlIGdyb3Vwcy5cbiAgcHJpdmF0ZSByZWFkb25seSBfcGFnZUlkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG5cbiAgICAvLyByZXNldFRvRGVmYXVsdHMoKSBtb3ZlcyB0aGUgc3RhdGUgdmVyc2lvbi4gVGhlIGJhciBpcyBidWlsdCBhZ2FpbiBmb3JcbiAgICAvLyBpdCwgYW5kIHJlcG9ydEZpbHRlcktleSwgd2hpY2ggY2FycmllcyBpdCwgcmVjcmVhdGVzIGZzLWZpbHRlcjogaXQgcmVhZHNcbiAgICAvLyBpdHMgY29uZmlnIG9uY2UuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKTtcblxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHZlcnNpb24gIT09IHRoaXMuX2JhclZlcnNpb24oKSkge1xuICAgICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fcmVwb3J0U2VydmljZS5sb2FkKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nUmVwb3J0cy5zZXQoZmFsc2UpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7IGVycm9yOiAoKSA9PiB1bmRlZmluZWQgfSk7XG4gIH1cblxuICBwdWJsaWMgZmV0Y2hSZXBvcnRzID0gKGtleXdvcmQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnRTZXJ2aWNlLmZpbHRlcihrZXl3b3JkKTtcbiAgfTtcblxuICBwdWJsaWMgcmVwb3J0Q2hhbmdlKHJlcG9ydDogUmVwb3J0TGlzdEl0ZW0gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5yZXBvcnQuc2V0KG51bGwpO1xuICAgIHRoaXMuZWRpdE1vZGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLl9wYWdlSWQuc2V0KG51bGwpO1xuICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG5cbiAgICBpZiAocmVwb3J0KSB7XG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydC5pZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZVJlcG9ydCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wcm9tcHQuaW5wdXQoe1xuICAgICAgdGl0bGU6ICdDcmVhdGUgUmVwb3J0JyxcbiAgICAgIGxhYmVsOiAnTmFtZScsXG4gICAgICBjb21taXRMYWJlbDogJ0NyZWF0ZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgobmFtZTogc3RyaW5nKSA9PiB0aGlzLl9yZXBvcnRTZXJ2aWNlLmNyZWF0ZShuYW1lKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlcG9ydDogUmVwb3J0TGlzdEl0ZW0pID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zZXQocmVwb3J0KTtcbiAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnQuaWQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRWRpdE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZS51cGRhdGUoKGVkaXRNb2RlKSA9PiAhZWRpdE1vZGUpO1xuICB9XG5cbiAgLy8gVGhlIGVkaXQgdG9vbHMgbGl2ZSBpbiB0aGlzIHRvb2xiYXIsIGJ1dCB0aGUgY2FudmFzIG93bnMgd2hhdCB0aGV5IGFjdCBvblxuICAvLyAodGhlIGFjdGl2ZSBwYWdlLCB0aGUgaGVhZGVyL2Zvb3RlciBiYW5kcywgd2hpY2ggbGF5ZXIgaXMgbGl2ZSkuXG4gIHB1YmxpYyBnZXQgaXNNYXN0ZXJNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW52YXM/Lm1hc3Rlck1vZGUoKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUZXh0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbnZhcz8uYWRkVGV4dCgpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZU1hc3Rlck1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FudmFzPy50b2dnbGVNYXN0ZXJNb2RlKCk7XG4gIH1cblxuICAvLyBSZXBvcnQgc2V0dGluZ3Mg4oCUIG5hbWUsIHBhZ2Ugc2l6ZS4gVGhlIHBpY2tlciBsaXN0IGFuZCBzdHJ1Y3R1cmUgYm90aFxuICAvLyByZWxvYWQgb24gc2F2ZSAoYSBwYWdlIHJlc2l6ZSByZS1yZW5kZXJzIHRoZSB3aG9sZSBjYW52YXMpLlxuICBwdWJsaWMgcmVwb3J0U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlcG9ydCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW48UmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHVua25vd24sIFJlcG9ydFNldHRpbmdzUmVzdWx0PihSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogeyByZXBvcnQ6IHRoaXMucmVwb3J0KCkgfSxcbiAgICAgIHdpZHRoOiAnNDYwcHgnLFxuICAgIH0pO1xuICAgIGNvbnN0IHNldHRpbmdzID0gZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAvLyBUaGUgZGlhbG9nIGNvbmZpcm1zICsgcGVyZm9ybXMgdGhlIGRlbGV0ZSBpdHNlbGY7IHdlIGp1c3QgcmVhY3QgdG9cbiAgICAgICAgLy8gd2hhdCBpdCByZXBvcnRzIGJhY2suXG4gICAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gJ2RlbGV0ZWQnKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZC5zZXQobnVsbCk7XG4gICAgICAgICAgdGhpcy5yZXBvcnQuc2V0KG51bGwpO1xuICAgICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBIHNhdmUgdGhhdCBmYWlsZWQgcGFydCB3YXkgKGEgcmVmdXNlZCBuYW1lKSBtYXkgc3RpbGwgaGF2ZSBzdG9yZWRcbiAgICAgICAgLy8gdGhlIGZpbHRlcnMgYmVmb3JlIGl0LCBzbyBhIGRpc21pc3NlZCBkaWFsb2cgdGhhdCB3cm90ZSByZWxvYWRzIHRvby5cbiAgICAgICAgaWYgKChyZXN1bHQ/LmFjdGlvbiA9PT0gJ3NhdmVkJyB8fCBzZXR0aW5ncy53cm90ZSgpKSAmJiB0aGlzLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHRoaXMuc2VsZWN0ZWQoKS5pZCk7XG4gICAgICAgICAgdGhpcy5fcmVmcmVzaFJlcG9ydE5hbWUodGhpcy5zZWxlY3RlZCgpLmlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBDb21wb25lbnQgc2V0dGluZ3Mg4oCUIHRpdGxlLCBleGFjdCBnZW9tZXRyeSwgYW5kIHRoZSBkaWFnbm9zdGljIHZpZXdzXG4gIC8vIChTUUwsIGNvbmZpZywgZmlsdGVyIHdpcmluZykuXG4gIHB1YmxpYyBjb21wb25lbnRTZXR0aW5ncyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlcG9ydCgpIHx8ICF0aGlzLl9jYW52YXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgZGlhbG9nIGdldHMgd2hhdCB0aGUgY29tcG9uZW50J3MgdGl0bGUgdG9rZW5zIGZpbGwgd2l0aCB3aGVyZSBpdCBpc1xuICAgIC8vIGRyYXduLCBmb3IgdGhlIHRpdGxlJ3MgSW5zZXJ0IGZpZWxkIG1lbnUgYW5kIHRoZSBsaW5lIHNheWluZyBob3cgaXQgcmVhZHMuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW48Q29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsIENvbXBvbmVudFNldHRpbmdzRGlhbG9nRGF0YSwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQ+KFxuICAgICAgQ29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGRhdGE6IHsgcmVwb3J0OiB0aGlzLnJlcG9ydCgpLCBjb21wb25lbnQsIHRva2VuczogdGhpcy5fY2FudmFzLmNvbXBvbmVudFRva2Vucyhjb21wb25lbnQpIH0sXG4gICAgICAgIHdpZHRoOiAnNjQwcHgnLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gRmlsdGVyIGFkZC9yZW1vdmUvbGV2ZWwgY2hhbmdlcyBwZXJzaXN0IGltbWVkaWF0ZWx5IGluc2lkZSB0aGUgZGlhbG9nIChub1xuICAgIC8vIFwic2F2ZVwiKSBhbmQgY2FuIGxlYXZlIGl0IGJ5IGFuIGV4aXQgdGhhdCBjYXJyaWVzIG5vIHJlc3VsdCwgc28gdGhleSBhcmVcbiAgICAvLyBhbm5vdW5jZWQgYXMgdGhleSBsYW5kLiBUaGUgcmVsb2FkIHdhaXRzIGZvciB0aGUgY2xvc2Ugc28gdGhlIGNhbnZhcyBpc24ndFxuICAgIC8vIHJlLXJlbmRlcmluZyB1bmRlcm5lYXRoIGFuIG9wZW4gZGlhbG9nLlxuICAgIGxldCBmaWx0ZXJzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5maWx0ZXJzQ2hhbmdlZFxuICAgICAgLnBpcGUodGFrZVVudGlsKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gZmlsdGVyc0NoYW5nZWQgPSB0cnVlKTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgLy8gVGhlIGRpYWxvZyBjb25maXJtcyArIHBlcmZvcm1zIHRoZSBkZWxldGUgaXRzZWxmLiBUaGUgY29tcG9uZW50IGlzXG4gICAgICAgIC8vIGdvbmUgZnJvbSB0aGUgcmVwb3J0LCBzbyByZWxvYWQgcmF0aGVyIHRoYW4gcGF0Y2hpbmcgaXQgb3V0IGxvY2FsbHkg4oCUXG4gICAgICAgIC8vIGl0cyBmaWx0ZXJzIHdlbnQgd2l0aCBpdCwgd2hpY2ggdGhlIHJlcG9ydCBiYXIgaGFzIHRvIGJlIHJlYnVpbHQgZm9yLlxuICAgICAgICBpZiAocmVzdWx0Py5kZWxldGVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydCh0aGlzLnNlbGVjdGVkKCkuaWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXBvcnQncyBmaWx0ZXIgZ3JvdXBzIGNoYW5nZWQsIHNvIHRoZSByZXBvcnQgYmFyIGFuZCB0aGVcbiAgICAgICAgLy8gb24tY29tcG9uZW50IHN0cmlwcyBoYXZlIHRvIGJlIHJlYnVpbHQgZnJvbSBhIGZyZXNoIHJlcG9ydC5cbiAgICAgICAgaWYgKGZpbHRlcnNDaGFuZ2VkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydCh0aGlzLnNlbGVjdGVkKCkuaWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGhpbmcgZWxzZSBpbiB0aGUgZGlhbG9nIHRvdWNoZXMgdGhlIHF1ZXJ5IOKAlCB0aXRsZSBhbmQgcGFkZGluZyBhcmVcbiAgICAgICAgLy8gcHJlc2VudGF0aW9uLiBSZXBhaW50IHRoZSBvbmUgY29tcG9uZW50IGl0IHdhcyBvcGVuZWQgZm9yIGFuZCBsZWF2ZVxuICAgICAgICAvLyBldmVyeSBvdGhlciBjb21wb25lbnQncyBkYXRhLCBhbmQgaXRzIHF1ZXJ5LCBhbG9uZS5cbiAgICAgICAgaWYgKHJlc3VsdD8uc2V0dGluZ3MpIHtcbiAgICAgICAgICB0aGlzLl9jYW52YXM/LmFwcGx5Q29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50LmlkLCByZXN1bHQuc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBjYW52YXMgbW92ZWQgdG8gYW5vdGhlciBwYWdlLiBUaGUgYmFyIHNob3dzIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGVcbiAgLy8gcGFnZSBvbiBzY3JlZW4uXG4gIHB1YmxpYyBvbkNhbnZhc1BhZ2VDaGFuZ2VkKHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX3BhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICAvLyBBIGhlYWRlciBvciBmb290ZXIgdGlsZSByZWFkcyBpdHMgcGFnZSdzIGdyb3VwcyB0aHJvdWdoIGl0LlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFBhZ2UocGFnZUlkKTtcblxuICAgIGlmIChoYXNQYWdlR3JvdXAodGhpcy5yZXBvcnQoKSkpIHtcbiAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGNhbnZhcyBjaGFuZ2VkIHRoZSByZXBvcnQncyBzdHJ1Y3R1cmUgKGFkZGVkIGEgcGFnZSkg4oCUIHJlLWZldGNoIHNvIHRoZVxuICAvLyBuZXcgcGFnZSByZW5kZXJzOyB0aGUgY2FudmFzIGxhbmRzIHRoZSB2aWV3IG9uIGl0LlxuICBwdWJsaWMgb25DYW52YXNSZXBvcnRDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuX2xvYWRSZXBvcnQodGhpcy5zZWxlY3RlZCgpLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBFeHBvcnQgdGhlIHJlcG9ydCB0byBQb3dlclBvaW50LCBlbnRpcmVseSBjbGllbnQtc2lkZTogZXZlcnkgY29tcG9uZW50J3NcbiAgLy8gZGF0YSBpcyBmZXRjaGVkIGZyZXNoIHdpdGggdGhlIGN1cnJlbnQgZmlsdGVyIHN0YXRlIChhbGwgcGFnZXMsIG5vdCBqdXN0XG4gIC8vIHRoZSB2aXNpYmxlIG9uZSksIHRoZW4gcHB0eGdlbmpzIGJ1aWxkcyBhIGRlY2sgb2YgTkFUSVZFIGVkaXRhYmxlIGNoYXJ0cyDigJRcbiAgLy8gcGFnZSA9IHNsaWRlLCBwb3NpdGlvbnMgMToxLiBUaGUgZG9jayBzaG93cyBwcm9ncmVzcyB1bnRpbCB0aGUgZmlsZSBzYXZlcy5cbiAgcHVibGljIGV4cG9ydFBvd2VycG9pbnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlcG9ydCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzcy5ydW4oXG4gICAgICAnRXhwb3J0aW5nIFBvd2VyUG9pbnQnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wb3dlcnBvaW50KHRoaXMucmVwb3J0KCkpLFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnQgdG8gUERGLCBlbnRpcmVseSBjbGllbnQtc2lkZTogc2FtZSBjb2xsZWN0aW9uIHBhc3MsIGNoYXJ0cyByZW5kZXJlZFxuICAvLyB0aHJvdWdoIGFuIG9mZnNjcmVlbiBFQ2hhcnRzIGluc3RhbmNlIGF0IDPDlyBwaXhlbCByYXRpbyAocGl4ZWwtaWRlbnRpY2FsXG4gIC8vIHRvIHRoZSBzY3JlZW4pLCB0YWJsZXMgdmlhIGpzcGRmLWF1dG90YWJsZSDigJQgcGFnZSA9IFBERiBwYWdlLlxuICBwdWJsaWMgZXhwb3J0UGRmKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXBvcnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3MucnVuKFxuICAgICAgJ0V4cG9ydGluZyBQREYnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wZGYodGhpcy5yZXBvcnQoKSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSB3aG9sZSByZXBvcnQgYXMgZmlsZXMgaW4gb25lIGFjdGlvbjogdGhlIHNlcnZlciB3cml0ZXMgb25lIENTViBwZXJcbiAgLy8gY29tcG9uZW50LCBlYWNoIHdoYXQgdGhlIHNjcmVlbiBzaG93cyAoYSBjaGFydCBvciBLUEkgYXMgZHJhd24sIGF0IHRoZVxuICAvLyB2aWV3ZXIncyBncm91cC1ieSBncmFpbjsgYSBsaXN0IGluIGZ1bGwpLCBhbmQgemlwcyB0aGVtIGZvbGRlcmVkIGJ5IHBhZ2VcbiAgLy8gd2l0aCBhbiBFeHBvcnQgTm90ZXMudHh0IHRoYXQgcmVjb3JkcyB0aGUgZmlsdGVycyBhcyB0aGUgYmFyIHJlYWRzIHRoZW0uXG4gIC8vIEVhY2ggZmlsZSBjYXJyaWVzIGl0cyB0aWxlJ3Mgb3duIHN0YXRlICh6aXBFeHBvcnRTdGF0ZXMpOiBhIGxpc3QncyBzb3J0LFxuICAvLyBzZWFyY2ggYW5kIGhpZGRlbiBjb2x1bW5zLCBhIGNoYXJ0J3MgZHJpbGwgcGF0aCBhbmQgdGhlIGdyb3VwcyB0aGF0IG1hdGNoXG4gIC8vICdhbnknOyBhIHNlcnZlciB0aGF0IGRvZXMgbm90IHJlYWQgaXQgdXNlcyBlYWNoIGxpc3QncyBzYXZlZCBzb3J0LiBUaGVcbiAgLy8gbm90ZXMgZ2V0IHRoZSBmaWx0ZXIgbGluZXMgYXMgdGhlIGNvdmVyIHdvcmRzIHRoZW0gKGV4cG9ydExpbmVzOyBhIFRoaXNcbiAgLy8gUGFnZSB6aXAgbmFtZXMgb25seSB0aGUgZ3JvdXBzIHRoYXQgcmVhY2ggdGhlIHBhZ2UpLCBhbmQgZWFjaCBmaWxlIGlzXG4gIC8vIG5hbWVkIGFmdGVyIGl0cyB0aWxlJ3MgdGl0bGUgYXMgdGhlIGNhbnZhcyBoZWFkZXIgcmVhZHMgaXQgKHRpdGxlcykuIEFsbFxuICAvLyBvZiBpdCBpcyByZWFkIG9uY2UsIHdoZW4gdGhlIGV4cG9ydCBzdGFydHMgKGV4cG9ydFdvcmRpbmcpLiBgdGhpc1BhZ2VgXG4gIC8vIG5hcnJvd3MgaXQgdG8gdGhlIHBhZ2UgdGhlIGNhbnZhcyBpcyBzaG93aW5nLiBVbmxpa2UgdGhlIFBERi9Qb3dlclBvaW50XG4gIC8vIGV4cG9ydHMgdGhlIGZpbGVzIGFyZSB3cml0dGVuIHNlcnZlci1zaWRlLCBzbyB0aGV5IGFyZSBub3QgY2FwcGVkIGJ5XG4gIC8vIHdoYXQgYSBzbGlkZSBjYW4gaG9sZC5cbiAgcHVibGljIGV4cG9ydERhdGEodGhpc1BhZ2UgPSBmYWxzZSwgZm9ybWF0OiBSZXBvcnRFeHBvcnRGb3JtYXQgPSAnY3N2Jyk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSB0aGlzUGFnZSA/IHRoaXMuX2NhbnZhcz8uYWN0aXZlUGFnZT8uaWQgPz8gbnVsbCA6IG51bGw7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JSZXBvcnQocmVwb3J0LCBwYWdlSWQpO1xuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fY29sbGVjdG9yLnNuYXBzaG90KHJlcG9ydCk7XG4gICAgY29uc3Qgc3RhdGVzID0gemlwRXhwb3J0U3RhdGVzKHJlcG9ydCwgc25hcHNob3Quc3RhdGUsIHBhZ2VJZCwgKGNvbXBvbmVudCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50KSk7XG5cbiAgICB0aGlzLl9wcm9jZXNzLmRvd25sb2FkKFxuICAgICAgZm9ybWF0ID09PSAneGxzeCcgPyAnRXhwb3J0aW5nIEV4Y2VsJyA6ICdFeHBvcnRpbmcgZGF0YScsXG4gICAgICB0aGlzLl9jb2xsZWN0b3IuZXhwb3J0V29yZGluZyhyZXBvcnQsIHNuYXBzaG90LCBwYWdlSWQpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoeyBsaW5lcywgdGl0bGVzIH0pID0+IHRoaXMuX3JlcG9ydERhdGEuZXhwb3J0UmVwb3J0KFxuICAgICAgICAgICAgcmVwb3J0LmlkLFxuICAgICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICAgIGZyZXF1ZW5jeSxcbiAgICAgICAgICAgIGxpbmVzLFxuICAgICAgICAgICAgc3RhdGVzLFxuICAgICAgICAgICAgdGl0bGVzLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgKSksXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWN0IHRvIGVhY2ggY2hhdCB0dXJuIChmcy1jaGF0IGhhbmRsZXMgdGhlIHJlcXVlc3QgKyBwZXJzaXN0ZW5jZSk7IHdlXG4gIC8vIG9ubHkgY2FyZSBhYm91dCB0aGUgcmVwb3J0IHNpZGUgZWZmZWN0cyB0aGlzIGNvbnRleHQncyBiYWNrZW5kIGZsYWdzLlxuICBwdWJsaWMgb25DaGF0UmVzcG9uc2UocmVzcG9uc2U6IEZzQWlDaGF0UmVzcG9uc2UpOiB2b2lkIHtcbiAgICAvLyBUaGUgYWdlbnQgY2hhbmdlZCB0aGUgcmVwb3J0J3Mgc3RydWN0dXJlIOKAlCByZS1mZXRjaCBpdC4gU2Vzc2lvbiBmaWx0ZXJcbiAgICAvLyB2YWx1ZXMgc3Vydml2ZSAodGhlIGZpbHRlci1zdGF0ZSBzZXJ2aWNlIGtlZXBzIHZhbHVlcyBmb3IgZ3JvdXBzIHRoYXRcbiAgICAvLyBzdGlsbCBleGlzdCkuXG4gICAgaWYgKHJlc3BvbnNlLnJlcG9ydENoYW5nZWQgJiYgdGhpcy5zZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHRoaXMuc2VsZWN0ZWQoKS5pZCk7XG4gICAgfVxuXG4gICAgLy8gQSByZW5hbWUgY2hhbmdlcyBub3RoaW5nIHN0cnVjdHVyYWwg4oCUIHJlZnJlc2ggdGhlIHBpY2tlciBjaGlwIGxhYmVsLlxuICAgIGlmIChyZXNwb25zZS5yZXBvcnRSZW5hbWVkICYmIHRoaXMuc2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5fcmVmcmVzaFJlcG9ydE5hbWUodGhpcy5zZWxlY3RlZCgpLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBEcmFnIHRoZSBkaXZpZGVyIGJldHdlZW4gdGhlIGNoYXQgYW5kIGNhbnZhcyBwYW5lcyAocG9pbnRlci1jYXB0dXJlIGxvb3BcbiAgLy8gb3V0c2lkZSBBbmd1bGFyKS5cbiAgcHVibGljIG9uUmVzaXplU3RhcnQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBoYW5kbGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaGFuZGxlLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZXNpemluZycpO1xuXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4gdGhpcy5fcmVzaXplVG8oZS5jbGllbnRYKTtcbiAgICAgIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICAgICAgdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdyZXNpemluZycpO1xuICAgICAgfTtcblxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2l6ZVRvKGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF0aW8gPSAoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigwLjgsIE1hdGgubWF4KDAuMiwgcmF0aW8pKTtcbiAgICB0aGlzLl9jaGF0UGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtjbGFtcGVkICogMTAwfSVgO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZFJlcG9ydChyZXBvcnRJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5nZXQocmVwb3J0SWQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnQ6IFJlcG9ydCkgPT4ge1xuICAgICAgICB0aGlzLnJlcG9ydC5zZXQocmVwb3J0KTtcbiAgICAgICAgLy8gQSByZXBvcnQga2VlcHMgbm8gc3RhdGUgaW4gdGhlIFVSTDogaXRzIGZpbHRlcnMgbGl2ZSBpbiB0aGUgc3RhdGVcbiAgICAgICAgLy8gc2VydmljZSBmb3IgYXMgbG9uZyBhcyB0aGUgcmVwb3J0IGlzIG9wZW4uXG4gICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0KTtcbiAgICAgICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gUmVwb3J0LWxldmVsIGZpbHRlciBncm91cHMgaW4gdGhlaXIgc2F2ZWQgb3JkZXIg4oCUIHRoZSBvbmVzIHRoYXQgcmVuZGVyIGluXG4gIC8vIHRoZSB0b29sYmFyIChjb21wb25lbnQtbGV2ZWwgZ3JvdXBzIHJlbmRlciBvbiB0aGVpciBjb21wb25lbnRzKSwgd2l0aFxuICAvLyB0aGUgcGFnZSBncm91cHMgb2YgdGhlIHBhZ2Ugb24gc2NyZWVuLlxuICBwcml2YXRlIF9yZXBvcnRHcm91cHMoKTogUmVwb3J0RmlsdGVyR3JvdXBbXSB7XG4gICAgcmV0dXJuIHJlcG9ydEJhckdyb3Vwcyh0aGlzLnJlcG9ydCgpLCB0aGlzLl9wYWdlSWQoKSk7XG4gIH1cblxuICAvLyBHYXRlcyB0aGUgdG9vbGJhciBmcy1maWx0ZXIgc28gaXQgaXNuJ3QgcmVuZGVyZWQgKHRha2luZyBzcGFjZSkgd2hlbiB0aGVyZVxuICAvLyBpcyBub3RoaW5nIHRvIHB1dCBpbiBpdCDigJQgbm8gcmVwb3J0LWxldmVsIGZpbHRlcnMgYW5kIG5vIGdyb3VwLWJ5IGNvbnRyb2wuXG4gIHB1YmxpYyBnZXQgcmVwb3J0SGFzRmlsdGVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0R3JvdXBzKCkubGVuZ3RoID4gMCB8fCAhIXRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gIH1cblxuICAvLyBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmx5IG9uY2UgKGF0IGluaXQpIOKAlCByZS1iaW5kaW5nIGRvZXMgbm90aGluZy5cbiAgLy8gVGhlIHRlbXBsYXRlIGtleXMgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIG9uIHRoaXMgc2lnbmF0dXJlIHNvIGl0J3MgcmVjcmVhdGVkXG4gIC8vIChhbmQgcmUtcmVhZHMgdGhlIHJlYnVpbHQgY29uZmlnKSB3aGVuZXZlciB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBzZXRcbiAgLy8gY2hhbmdlcywgZS5nLiBhZnRlciB0aGUgY29tcG9uZW50IHNldHRpbmdzIGRpYWxvZyBhZGRzL21vdmVzIGEgZmlsdGVyLlxuICBwdWJsaWMgZ2V0IHJlcG9ydEZpbHRlcktleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBUaGUgc3RhdGUgdmVyc2lvbiB0aGUgYmFyIHdhcyBidWlsdCBmb3I6IGFuIGFwcGxpZWQgdmlldywgb3IgYSByZXNldFxuICAgICAgLy8gdG8gdGhlIGJhc2UsIHJlcGxhY2VzIGV2ZXJ5IHZhbHVlIGF0IG9uY2UuXG4gICAgICB0aGlzLl9iYXJWZXJzaW9uKCksXG4gICAgICAvLyBUaGUgZWZmZWN0aXZlIHpvbmUgaXMgcGFydCBvZiBpdCB0b286IGEgem9uZSBjaGFuZ2UgcmUtcmVzb2x2ZXMgcmVsYXRpdmVcbiAgICAgIC8vIHByZXNldHMsIGFuZCB0aGUgYmFyIG11c3QgYmUgcmVjcmVhdGVkIHRvIHNob3cgdGhlIG5ldyBkYXlzLlxuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUudGltZXpvbmUoKSxcbiAgICAgIC8vIFRoZSBzdG9yZWQgZGVmYXVsdCBpcyBwYXJ0IG9mIHRoZSBzaWduYXR1cmU6IHNhdmluZyBhIG5ldyBkZWZhdWx0IGluIHJlcG9ydFxuICAgICAgLy8gc2V0dGluZ3MgcmVidWlsZHMgdGhlIGNvbmZpZywgYnV0IHdpdGhvdXQgYSBrZXkgY2hhbmdlIGZzLWZpbHRlciBrZWVwc1xuICAgICAgLy8gcmVuZGVyaW5nIHRoZSB2YWx1ZXMgaXQgd2FzIGNyZWF0ZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gICAgICBncm91cEJ5U2lnbmF0dXJlKHRoaXMucmVwb3J0KCkpLFxuICAgICAgLi4udGhpcy5fcmVwb3J0R3JvdXBzKCkubWFwKChncm91cCkgPT4gYCR7Z3JvdXAuaWR9OiR7Z3JvdXAubGV2ZWx9OiR7Z3JvdXAubGFiZWx9OiR7ZGVmYXVsdFNpZ25hdHVyZShncm91cCl9YCksXG4gICAgICAvLyBBIHBhZ2UgZ3JvdXAgc2hvd3Mgb24gaXRzIG93biBwYWdlIG9ubHksIHNvIHN1Y2ggYSBiYXIgaXMgcmVjcmVhdGVkXG4gICAgICAvLyB3aGVuIHRoZSBwYWdlIG9uIHNjcmVlbiBjaGFuZ2VzLlxuICAgICAgLi4uKGhhc1BhZ2VHcm91cCh0aGlzLnJlcG9ydCgpKSA/IFtgcGFnZToke3RoaXMuX3BhZ2VJZCgpfWBdIDogW10pLFxuICAgIF0uam9pbignfCcpO1xuICB9XG5cbiAgLy8gKFJlKWJ1aWxkIHRoZSB0b29sYmFyIGZzLWZpbHRlciBjb25maWcg4oCUIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIGl0ZW1zIGFuZFxuICAvLyB0aGVuIHRoZSBncm91cC1ieSBjb250cm9sLiBUaGUgcmVwb3J0J3MgYWN0aW9ucyBsaXZlIGluIHRoZSBmcy1tZW51IGJlc2lkZVxuICAvLyB0aGUgcGlja2VyLCBub3QgaGVyZS4gT25seSBidWlsdC91c2VkIG9uY2UgYSByZXBvcnQgaXMgbG9hZGVkICh0aGUgdGVtcGxhdGVcbiAgLy8gZ2F0ZXMgaXQgb24gYHJlcG9ydGApLlxuICBwcml2YXRlIF9idWlsZFJlcG9ydENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0KCk/LmlkID8/IG51bGw7XG5cbiAgICAvLyBEcm9wIGEgZ3JhaW4gdGhlIGNvbnRyb2wgbm8gbG9uZ2VyIG9mZmVycyDigJQgdGhlIGFnZW50IGNhbiBuYXJyb3cgdGhlIGxpc3RcbiAgICAvLyBtaWQtc2Vzc2lvbiwgYW5kIGFuIG92ZXJyaWRlIHRoZSB2aWV3ZXIgY2FuJ3Qgc2VlIGlzIHdvcnNlIHRoYW4gbm9uZS5cbiAgICBpZiAodGhpcy5yZXBvcnQoKSAmJiAhaXNHcmFudWxhcml0eU9mZmVyZWQodGhpcy5yZXBvcnQoKSwgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkpKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRGcmVxdWVuY3kobnVsbCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLnJlcG9ydCgpPy52aWV3ZXJGZWF0dXJlcyA/PyBbXTtcbiAgICBjb25zdCBpdGVtcyA9IHJlcG9ydElkXG4gICAgICA/IHRoaXMuX3JlcG9ydEdyb3VwcygpLm1hcCgoZ3JvdXApID0+XG4gICAgICAgIGZpbHRlckl0ZW1Gb3JHcm91cChncm91cCwgdGhpcy5fZmlsdGVyT3B0aW9ucywgdGhpcy5yZXBvcnQoKSwgdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpLCBmZWF0dXJlcykpXG4gICAgICA6IFtdO1xuXG4gICAgLy8gVGhlIGdyb3VwLWJ5IGNvbnRyb2wgbGVhZHMgdGhlIGJhciwgYWhlYWQgb2YgZXZlcnkgZmlsdGVyOiBpdCBzZXRzIHRoZVxuICAgIC8vIGdyYWluIHRoZSB3aG9sZSByZXBvcnQgaXMgcmVhZCBhdCwgc28gaXQgaXMgdGhlIGZpcnN0IHRoaW5nIGEgdmlld2VyXG4gICAgLy8gZGVjaWRlcy4gSXQgaXMgbm90IGEgZmlsdGVyIGdyb3VwIOKAlCBpdCByZS1idWNrZXRzIHJvd3MgcmF0aGVyIHRoYW5cbiAgICAvLyBuYXJyb3dpbmcgdGhlbSDigJQgc28gaXQgaXMgcGxhY2VkIGhlcmUgcmF0aGVyIHRoYW4gb3JkZXJlZCBhbW9uZyB0aGVtLlxuICAgIGNvbnN0IGdyb3VwQnlJdGVtID0gdGhpcy5fZ3JvdXBCeUl0ZW0oKTtcbiAgICBpZiAoZ3JvdXBCeUl0ZW0pIHtcbiAgICAgIGl0ZW1zLnVuc2hpZnQoZ3JvdXBCeUl0ZW0pO1xuICAgIH1cblxuICAgIC8vIEhvdyB0aGUgZ3JvdXBzIGNvbWJpbmUgY2xvc2VzIHRoZSBiYXIuXG4gICAgY29uc3QgbWF0Y2hJdGVtID0gdGhpcy5fbWF0Y2hJdGVtKCk7XG4gICAgaWYgKG1hdGNoSXRlbSkge1xuICAgICAgaXRlbXMucHVzaChtYXRjaEl0ZW0pO1xuICAgIH1cblxuICAgIHRoaXMuX2JhclZlcnNpb24uc2V0KHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpKTtcbiAgICB0aGlzLnJlcG9ydEZpbHRlckNvbmZpZy5zZXQoe1xuICAgICAgLy8gTmV2ZXIgdG91Y2ggdGhlIFVSTCBvciBwZXJzaXN0IGZpbHRlciBzdGF0ZSDigJQgcmVwb3J0IGZpbHRlcnMgYXJlXG4gICAgICAvLyBzZXNzaW9uLW9ubHksIG93bmVkIGJ5IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZS5cbiAgICAgIHF1ZXJ5UGFyYW06IGZhbHNlLFxuICAgICAgcGVyc2lzdDogZmFsc2UsXG4gICAgICBpdGVtcyxcbiAgICAgIGNoYW5nZTogKHF1ZXJ5KSA9PiB0aGlzLl9iYXJDaGFuZ2VkKHF1ZXJ5ID8/IHt9LCAhIW1hdGNoSXRlbSksXG4gICAgICAvLyAnQ2xlYXIgZmlsdGVycycgcHV0cyB0aGUgc2NyZWVuIGJhY2sgb24gdGhlIHJlcG9ydCdzIGF1dGhvcmVkXG4gICAgICAvLyBkZWZhdWx0cyBhbmQgZHJvcHMgdGhlIHRlbXBvcmFyeSBsYXllci5cbiAgICAgIGNsZWFyOiAoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNldFRvRGVmYXVsdHMoKSxcbiAgICAgIC8vIFRoZSBjaGlwIHNob3dzIGV4YWN0bHkgd2hpbGUgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHRzIGFcbiAgICAgIC8vIGNsZWFyIHJldHVybnMgdG8gKEM1KS5cbiAgICAgIGNsZWFyVmlzaWJsZTogKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZGlmZmVyc0Zyb21EZWZhdWx0cygpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGJhcidzIHZhbHVlcyBpbnRvIHRoZSBzdGF0ZTogZXZlcnkgZ3JvdXAgaXQgc2hvd3MsIHRoZSBncmFpbiBhbmQsXG4gIC8vIHdoZW4gdGhlIGJhciBoYXMgdGhlIGNvbnRyb2wsIHRoZSBtYXRjaC5cbiAgcHJpdmF0ZSBfYmFyQ2hhbmdlZChxdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGhhc01hdGNoOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB7IGdyb3VwSWQsIHZhbHVlIH0gb2YgZ3JvdXBWYWx1ZXNGcm9tUXVlcnkocXVlcnksIHRoaXMuX3JlcG9ydEdyb3VwcygpKSkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0VmFsdWUoZ3JvdXBJZCwgdmFsdWUpO1xuICAgIH1cbiAgICAvLyBOb3QgYSBmaWx0ZXIgZ3JvdXAg4oCUIHRoZSBncmFpbiBpcyByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgcXVlcnkuXG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0RnJlcXVlbmN5KChxdWVyeVtHUk9VUF9CWV9JVEVNXSBhcyBDaGFydEdyYW51bGFyaXR5KSB8fCBudWxsKTtcbiAgICAvLyBOb3IgaXMgdGhlIG1hdGNoOyBhIGJhciB3aXRob3V0IHRoZSBjb250cm9sIGxlYXZlcyBpdCBhcyBpdCBpcy5cbiAgICBpZiAoaGFzTWF0Y2gpIHtcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldE1hdGNoKG1hdGNoRnJvbVF1ZXJ5KHF1ZXJ5KSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2wgYXMgYW4gZnMtZmlsdGVyIGl0ZW0sIG9yIG51bGwgd2hlbiB0aGUgcmVwb3J0XG4gIC8vIGhhcyBub25lIHRvIHNob3cuIFNlZWRlZCBmcm9tIHRoZSBzZXNzaW9uIHN0YXRlIHNvIHRoZSBncmFpbiB0aGUgdmlld2VyXG4gIC8vIHBpY2tlZCBzdXJ2aXZlcyB0aGUgcmVwb3J0IGJlaW5nIHJlLWZldGNoZWQgYWZ0ZXIgYSBjaGF0IGVkaXQuXG4gIHByaXZhdGUgX2dyb3VwQnlJdGVtKCk6IElGaWx0ZXJDb25maWdJdGVtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0KClcbiAgICAgID8gZ3JvdXBCeUZpbHRlckl0ZW0odGhpcy5yZXBvcnQoKSwgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyBUaGUgYmFyJ3MgTWF0Y2ggY29udHJvbCwgc2VlZGVkIHdpdGggdGhlIG1hdGNoIG9uIHNjcmVlbiwgb3IgbnVsbCB3aGVuXG4gIC8vIHRoZSBiYXIgaG9sZHMgZmV3ZXIgdGhhbiB0d28gZ3JvdXBzIHRoYXQgY29tYmluZS5cbiAgcHJpdmF0ZSBfbWF0Y2hJdGVtKCk6IElGaWx0ZXJDb25maWdJdGVtIHwgbnVsbCB7XG4gICAgcmV0dXJuIG1hdGNoRmlsdGVySXRlbSh0aGlzLnJlcG9ydCgpLCB0aGlzLl9yZXBvcnRHcm91cHMoKSwgdGhpcy5fcGFnZUlkKCksIHRoaXMuX2ZpbHRlclN0YXRlLm1hdGNoKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaFJlcG9ydE5hbWUocmVwb3J0SWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3JlcG9ydFNlcnZpY2UubG9hZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnRzOiBSZXBvcnRMaXN0SXRlbVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbmFtZWQgPSByZXBvcnRzLmZpbmQoKHJlcG9ydCkgPT4gcmVwb3J0LmlkID09PSByZXBvcnRJZCk7XG4gICAgICAgIGlmIChyZW5hbWVkKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZC5zZXQocmVuYW1lZCk7XG4gICAgICAgICAgaWYgKHRoaXMucmVwb3J0KCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwb3J0LnNldCh7IC4uLnRoaXMucmVwb3J0KCksIG5hbWU6IHJlbmFtZWQubmFtZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2XG4gICAgI3NwbGl0XG4gICAgY2xhc3M9XCJyZXBvcnQgZnMtcm93LmFsaWduLXN0YXJ0XCI+XG4gIDxmcy1haS1jaGF0XG4gICAgI2NoYXRQYW5lbFxuICAgIGNsYXNzPVwiY2hhdFwiXG4gICAgc3R5bGU9XCJtaW4taGVpZ2h0OiA1MDBweDtcIlxuICAgIGJhc2VQYXRoPVwicmVwb3J0c1wiXG4gICAgW3JlcXVlc3REYXRhXT1cInsgcmVwb3J0SWQ6IHNlbGVjdGVkKCk/LmlkID8/IG51bGwgfVwiXG4gICAgW2ludHJvTWVzc2FnZV09XCJpbnRyb01lc3NhZ2VcIlxuICAgIChyZXNwb25zZSk9XCJvbkNoYXRSZXNwb25zZSgkZXZlbnQpXCI+XG4gIDwvZnMtYWktY2hhdD5cbiAgPGRpdlxuICAgIGNsYXNzPVwicmVzaXplclwiXG4gICAgKHBvaW50ZXJkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50KVwiPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInZpZXdlciBmcy1mbGV4IGZzLWNvbHVtblwiPlxuICAgIDxkaXYgY2xhc3M9XCJmcy1yb3cuYWxpZ24tY2VudGVyLmdhcC1zbVwiPlxuICAgICAgPGZzLWF1dG9jb21wbGV0ZS1jaGlwc1xuICAgICAgICAgIGNsYXNzPVwiZnMtZmxleFwiXG4gICAgICAgICAgW2ZldGNoXT1cImZldGNoUmVwb3J0c1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdSZXBvcnRzKClcIlxuICAgICAgICAgIFtwYWRsZXNzXT1cInRydWVcIlxuICAgICAgICAgIFttdWx0aXBsZV09XCJmYWxzZVwiXG4gICAgICAgICAgW2ZldGNoT25Gb2N1c109XCJ0cnVlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJyZXBvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJSZXBvcnRcIlxuICAgICAgICAgIG5hbWU9XCJyZXBvcnRcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmc0F1dG9jb21wbGV0ZUNoaXBzVGVtcGxhdGVcbiAgICAgICAgICAgIGxldC1vYmplY3Q9XCJvYmplY3RcIj5cbiAgICAgICAgICB7eyBvYmplY3QubmFtZSB9fVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzQXV0b2NvbXBsZXRlQ2hpcHNTdGF0aWNcbiAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVSZXBvcnQoKVwiPlxuICAgICAgICAgIENyZWF0ZSBSZXBvcnRcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZnMtYXV0b2NvbXBsZXRlLWNoaXBzPlxuICAgICAgQGlmIChyZXBvcnQoKSAmJiBlZGl0TW9kZSgpKSB7XG4gICAgICAgIDwhLS0gV2hhdCBsYXlvdXQgZWRpdGluZyBjYW4gYWRkIG9yIHN3aXRjaCB0bywgYW5kIHRoZSB3YXkgb3V0IG9mIGl0IOKAlFxuICAgICAgICAgICAgIHRoZSBzYW1lIG91dGxpbmVkIGJ1dHRvbnMgYXMgdGhlIGZzLWFpLXJlcG9ydCB0b29sYmFyLiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgYSBibG9jayBvZiB0ZXh0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRUZXh0KClcIj5cbiAgICAgICAgICA8bWF0LWljb24+dGl0bGU8L21hdC1pY29uPlxuICAgICAgICAgIEFkZCB0ZXh0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtYXN0ZXItdG9nZ2xlXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNNYXN0ZXJNb2RlXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImlzTWFzdGVyTW9kZSA/ICdCYWNrIHRvIGVkaXRpbmcgdGhpcyBwYWdlJyA6ICdFZGl0IHRoZSBoZWFkZXIgYW5kIGZvb3RlciBzaG93biBvbiBldmVyeSBwYWdlJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWFzdGVyTW9kZSgpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPndlYl9hc3NldDwvbWF0LWljb24+XG4gICAgICAgICAgSGVhZGVyICYgZm9vdGVyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cbiAgICAgICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICAgIERvbmUgZWRpdGluZ1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAocmVwb3J0KCkpIHtcbiAgICAgICAgPGZzLW1lbnU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwicmVwb3J0U2V0dGluZ3MoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgICB0dW5lXG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgUmVwb3J0IHNldHRpbmdzXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFZGl0TW9kZSgpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImVkaXRNb2RlKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5cbiAgICAgICAgICAgICAgZGFzaGJvYXJkX2N1c3RvbWl6ZVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIHt7IGVkaXRNb2RlKCkgPyAnRG9uZSBlZGl0aW5nIGxheW91dCcgOiAnRWRpdCBsYXlvdXQnIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQb3dlcnBvaW50KClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5cbiAgICAgICAgICAgICAgc2xpZGVzaG93XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgRXhwb3J0IFBvd2VyUG9pbnRcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFBkZigpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgIHBpY3R1cmVfYXNfcGRmXG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgRXhwb3J0IFBERlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgIHRhYmxlX3ZpZXdcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICBFeHBvcnQgUmF3IERhdGFcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIEBpZiAoKHJlcG9ydCgpPy5wYWdlcz8ubGVuZ3RoID8/IDApID4gMSkge1xuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEodHJ1ZSlcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgICAgIHRhYmxlX3ZpZXdcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgRXhwb3J0IFJhdyBEYXRhIChUaGlzIFBhZ2UpXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnREYXRhKGZhbHNlLCAneGxzeCcpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgIGdyaWRfb25cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICBFeHBvcnQgRXhjZWxcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIEBpZiAoKHJlcG9ydCgpPy5wYWdlcz8ubGVuZ3RoID8/IDApID4gMSkge1xuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEodHJ1ZSwgJ3hsc3gnKVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgICAgZ3JpZF9vblxuICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICBFeHBvcnQgRXhjZWwgKFRoaXMgUGFnZSlcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgfVxuICAgICAgICA8L2ZzLW1lbnU+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgQGlmIChyZXBvcnQoKSkge1xuICAgICAgPCEtLSBSZXBvcnQtbGV2ZWwgZmlsdGVycyBvbmx5ICh0aGUgcmVwb3J0J3MgYWN0aW9ucyBsaXZlIGluIHRoZSBtZW51XG4gICAgICAgICAgIGFib3ZlKS4gZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0LCBzbyBpdCdzIGtleWVkIG9uIHRoZVxuICAgICAgICAgICBmaWx0ZXIgc2lnbmF0dXJlOiB3aGVuIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHNldCBjaGFuZ2VzIHRoZSBibG9ja1xuICAgICAgICAgICBpcyByZWNyZWF0ZWQgYW5kIHJlLXJlYWRzIHRoZSByZWJ1aWx0IGNvbmZpZy4gLS0+XG4gICAgICBAaWYgKHJlcG9ydEhhc0ZpbHRlcnMpIHtcbiAgICAgICAgQGZvciAoa2V5IG9mIFtyZXBvcnRGaWx0ZXJLZXldOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICA8ZnMtZmlsdGVyIFtjb25maWddPVwicmVwb3J0RmlsdGVyQ29uZmlnKClcIj48L2ZzLWZpbHRlcj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgPGFwcC1yZXBvcnQtY2FudmFzXG4gICAgICAgIFtyZXBvcnRdPVwicmVwb3J0KClcIlxuICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGUoKVwiXG4gICAgICAgIChjb21wb25lbnRTZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncygkZXZlbnQpXCJcbiAgICAgICAgKHJlcG9ydENoYW5nZWQpPVwib25DYW52YXNSZXBvcnRDaGFuZ2VkKClcIlxuICAgICAgICAocGFnZUNoYW5nZWQpPVwib25DYW52YXNQYWdlQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICA8L2FwcC1yZXBvcnQtY2FudmFzPlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
@@ -22,6 +22,7 @@ export * from './app/reports/interfaces/report-drill-refusal.type';
22
22
  export * from './app/reports/interfaces/report-filter-match.type';
23
23
  export * from './app/reports/interfaces/report-filter-skip.type';
24
24
  export * from './app/reports/interfaces/report-viewer-feature.type';
25
+ export * from './app/reports/interfaces/report-export-format.type';
25
26
  export * from './app/reports/interfaces/component-data-applied.interface';
26
27
  export * from './app/reports/interfaces/component-data-drill.interface';
27
28
  export * from './app/reports/interfaces/report-filter-options.interface';
@@ -42,4 +43,4 @@ export * from './app/reports/enums/report-chart-line-style.enum';
42
43
  export * from './app/reports/enums/report-chart-mark-stat.enum';
43
44
  export * from './app/reports/enums/report-chart-date-label.enum';
44
45
  export * from './app/reports/enums/report-change-polarity.enum';
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSwrRUFBK0U7QUFDL0UsMkVBQTJFO0FBQzNFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDOUYsY0FBYywyQ0FBMkMsQ0FBQztBQUMxRCxjQUFjLDBEQUEwRCxDQUFDO0FBQ3pFLGNBQWMsc0RBQXNELENBQUM7QUFDckUsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLGtEQUFrRCxDQUFDO0FBQ2pFLGNBQWMscURBQXFELENBQUM7QUFDcEUsY0FBYywyREFBMkQsQ0FBQztBQUMxRSxjQUFjLHlEQUF5RCxDQUFDO0FBQ3hFLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYyxrRUFBa0UsQ0FBQztBQUNqRixjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLHNEQUFzRCxDQUFDO0FBQ3JFLGNBQWMsdURBQXVELENBQUM7QUFDdEUsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsbURBQW1ELENBQUM7QUFDbEUsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLGtEQUFrRCxDQUFDO0FBQ2pFLGNBQWMsaURBQWlELENBQUM7QUFDaEUsY0FBYyxrREFBa0QsQ0FBQztBQUNqRSxjQUFjLGlEQUFpRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBAZmlyZXN0aXRjaC9yZXBvcnRzXG4gKlxuICogVGhlIEFJLWJ1aWx0IHJlcG9ydCB2aWV3ZXIvZWRpdG9yLCBpdHMgZGF0YSBnYXRld2F5LCBzZXNzaW9uIGZpbHRlciBzdGF0ZSBhbmRcbiAqIHJlbmRlcmVyIGNvbXBvbmVudHMuIFRoZSBob3N0IGFwcCBvbmx5IG5lZWRzIFJlcG9ydENvbXBvbmVudCAocm91dGUgaXQpIOKAlFxuICogZXZlcnl0aGluZyBlbHNlIGlzIGludGVybmFsIHdpcmluZy4gVGhlIEFJIGNoYXQgaXMgcHJvdmlkZWQgYnkgQGZpcmVzdGl0Y2gvYWkuXG4gKi9cbmV4cG9ydCB7IFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4vYXBwL3JlcG9ydHMvdmlld3MvcmVwb3J0L3JlcG9ydC5jb21wb25lbnQnO1xuLy8gU3BsaXQsIHJvdXRpbmctZnJlZSBzdXJmYWNlOiBhIHJlcG9ydHMgbGlzdGluZyBhbmQgYSBzaW5nbGUtcmVwb3J0IHZpZXcuIFRoZVxuLy8gaG9zdCByb3V0ZXMgYmV0d2VlbiB0aGVtIGFuZCBwYXNzZXMgW3JlcG9ydElkXSBpbnRvIEZzQWlSZXBvcnRDb21wb25lbnQuXG5leHBvcnQgeyBGc0FpUmVwb3J0c0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL3JlcG9ydHMvdmlld3MvcmVwb3J0cy9mcy1haS1yZXBvcnRzLmNvbXBvbmVudCc7XG5leHBvcnQgeyBGc0FpUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudCc7XG5leHBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi9hcHAvcmVwb3J0cy9kYXRhL3JlcG9ydC5kYXRhJztcbmV4cG9ydCB7IFJlcG9ydFNlcnZpY2UgfSBmcm9tICcuL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC5zZXJ2aWNlJztcbmV4cG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4vYXBwL3JlcG9ydHMvc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtc3RhdGUtc25hcHNob3QuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtdGlsZS1zdGF0ZS5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC1kcmlsbC1zdGVwLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LWRyaWxsLWNydW1iLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LWRyaWxsLXJlZnVzYWwudHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1tYXRjaC50eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLXNraXAudHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL2NvbXBvbmVudC1kYXRhLWFwcGxpZWQuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9jb21wb25lbnQtZGF0YS1kcmlsbC5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9ucy5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9ucy1yZXF1ZXN0LmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LXNhdmVkLWZpbHRlci5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC1zYXZlZC1maWx0ZXItY2hhbmdlcy5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC1tYXJrLXBvaW50LmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LW1hcmstY2xpY2suaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtZXhwb3J0LWxpbmUuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtZXhwb3J0LWxpbmUta2luZC50eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LXZhbHVlLWZvcm1hdC5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LXZhbHVlLWZvcm11bGEuZW51bSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2VudW1zL3JlcG9ydC1saXN0LWNvbHVtbi1mb3JtYXQuZW51bSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2VudW1zL3JlcG9ydC1udW1iZXItdW5pdHMuZW51bSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2VudW1zL3JlcG9ydC1jaGFydC1kYXRhLWxhYmVscy5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LWNoYXJ0LWNvbG9yLmVudW0nO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtY2hhcnQtbGluZS1zdHlsZS5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LWNoYXJ0LW1hcmstc3RhdC5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LWNoYXJ0LWRhdGUtbGFiZWwuZW51bSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2VudW1zL3JlcG9ydC1jaGFuZ2UtcG9sYXJpdHkuZW51bSc7XG4iXX0=
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSwrRUFBK0U7QUFDL0UsMkVBQTJFO0FBQzNFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDOUYsY0FBYywyQ0FBMkMsQ0FBQztBQUMxRCxjQUFjLDBEQUEwRCxDQUFDO0FBQ3pFLGNBQWMsc0RBQXNELENBQUM7QUFDckUsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLGtEQUFrRCxDQUFDO0FBQ2pFLGNBQWMscURBQXFELENBQUM7QUFDcEUsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLDJEQUEyRCxDQUFDO0FBQzFFLGNBQWMseURBQXlELENBQUM7QUFDeEUsY0FBYywwREFBMEQsQ0FBQztBQUN6RSxjQUFjLGtFQUFrRSxDQUFDO0FBQ2pGLGNBQWMsd0RBQXdELENBQUM7QUFDdkUsY0FBYyxnRUFBZ0UsQ0FBQztBQUMvRSxjQUFjLHNEQUFzRCxDQUFDO0FBQ3JFLGNBQWMsc0RBQXNELENBQUM7QUFDckUsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLG9EQUFvRCxDQUFDO0FBQ25FLGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsa0RBQWtELENBQUM7QUFDakUsY0FBYyxpREFBaUQsQ0FBQztBQUNoRSxjQUFjLGtEQUFrRCxDQUFDO0FBQ2pFLGNBQWMsaURBQWlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIEBmaXJlc3RpdGNoL3JlcG9ydHNcbiAqXG4gKiBUaGUgQUktYnVpbHQgcmVwb3J0IHZpZXdlci9lZGl0b3IsIGl0cyBkYXRhIGdhdGV3YXksIHNlc3Npb24gZmlsdGVyIHN0YXRlIGFuZFxuICogcmVuZGVyZXIgY29tcG9uZW50cy4gVGhlIGhvc3QgYXBwIG9ubHkgbmVlZHMgUmVwb3J0Q29tcG9uZW50IChyb3V0ZSBpdCkg4oCUXG4gKiBldmVyeXRoaW5nIGVsc2UgaXMgaW50ZXJuYWwgd2lyaW5nLiBUaGUgQUkgY2hhdCBpcyBwcm92aWRlZCBieSBAZmlyZXN0aXRjaC9haS5cbiAqL1xuZXhwb3J0IHsgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvcmVwb3J0LmNvbXBvbmVudCc7XG4vLyBTcGxpdCwgcm91dGluZy1mcmVlIHN1cmZhY2U6IGEgcmVwb3J0cyBsaXN0aW5nIGFuZCBhIHNpbmdsZS1yZXBvcnQgdmlldy4gVGhlXG4vLyBob3N0IHJvdXRlcyBiZXR3ZWVuIHRoZW0gYW5kIHBhc3NlcyBbcmVwb3J0SWRdIGludG8gRnNBaVJlcG9ydENvbXBvbmVudC5cbmV4cG9ydCB7IEZzQWlSZXBvcnRzQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnRzL2ZzLWFpLXJlcG9ydHMuY29tcG9uZW50JztcbmV4cG9ydCB7IEZzQWlSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuL2FwcC9yZXBvcnRzL3ZpZXdzL3JlcG9ydC9mcy1haS1yZXBvcnQuY29tcG9uZW50JztcbmV4cG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuL2FwcC9yZXBvcnRzL2RhdGEvcmVwb3J0LmRhdGEnO1xuZXhwb3J0IHsgUmVwb3J0U2VydmljZSB9IGZyb20gJy4vYXBwL3JlcG9ydHMvc2VydmljZXMvcmVwb3J0LnNlcnZpY2UnO1xuZXhwb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9hcHAvcmVwb3J0cy9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC1zdGF0ZS1zbmFwc2hvdC5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC10aWxlLXN0YXRlLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LWRyaWxsLXN0ZXAuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtZHJpbGwtY3J1bWIuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtZHJpbGwtcmVmdXNhbC50eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLW1hdGNoLnR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItc2tpcC50eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtdmlld2VyLWZlYXR1cmUudHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LWV4cG9ydC1mb3JtYXQudHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvY29tcG9uZW50LWRhdGEtYXBwbGllZC5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL2NvbXBvbmVudC1kYXRhLWRyaWxsLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1vcHRpb25zLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1vcHRpb25zLXJlcXVlc3QuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtc2F2ZWQtZmlsdGVyLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LXNhdmVkLWZpbHRlci1jaGFuZ2VzLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2ludGVyZmFjZXMvcmVwb3J0LW1hcmstcG9pbnQuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1jbGljay5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtbGluZS5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtbGluZS1raW5kLnR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtdmFsdWUtZm9ybWF0LmVudW0nO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtdmFsdWUtZm9ybXVsYS5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LW51bWJlci11bml0cy5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LWNoYXJ0LWRhdGEtbGFiZWxzLmVudW0nO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtY2hhcnQtY29sb3IuZW51bSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9yZXBvcnRzL2VudW1zL3JlcG9ydC1jaGFydC1saW5lLXN0eWxlLmVudW0nO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtY2hhcnQtbWFyay1zdGF0LmVudW0nO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtY2hhcnQtZGF0ZS1sYWJlbC5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LWNoYW5nZS1wb2xhcml0eS5lbnVtJztcbiJdfQ==
@@ -4,7 +4,7 @@ import * as echarts from 'echarts/core';
4
4
  export { echarts as default };
5
5
  import { LabelLayout } from 'echarts/features';
6
6
  import { CanvasRenderer } from 'echarts/renderers';
7
- import { R as REPORT_CHART_COLORS_CSS, a as REPORT_CHART_FONT_FAMILY, b as REPORT_AXIS_LABEL_FONT_SIZE } from './firestitch-report-firestitch-report-C94rjx24.mjs';
7
+ import { R as REPORT_CHART_COLORS_CSS, a as REPORT_CHART_FONT_FAMILY, b as REPORT_AXIS_LABEL_FONT_SIZE } from './firestitch-report-firestitch-report-YDtFbTwA.mjs';
8
8
 
9
9
  // Tree-shaken ECharts build for the reports renderer: only the chart types and
10
10
  // components the option-builder emits are registered, keeping the lazy chunk
@@ -63,4 +63,4 @@ echarts.registerTheme('report', {
63
63
  axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },
64
64
  },
65
65
  });
66
- //# sourceMappingURL=firestitch-report-echarts-DMflI6jp.mjs.map
66
+ //# sourceMappingURL=firestitch-report-echarts-DY_CfeEH.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"firestitch-report-echarts-DMflI6jp.mjs","sources":["../../src/app/reports/theme/echarts.ts"],"sourcesContent":["// Tree-shaken ECharts build for the reports renderer: only the chart types and\n// components the option-builder emits are registered, keeping the lazy chunk\n// lean. Loaded on demand by ngx-echarts via provideEchartsCore — see\n// REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.\n//\n// The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for\n// the high-res images the PPT/PDF exports will use.\n\nimport { BarChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n DatasetComponent,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport * as echarts from 'echarts/core';\nimport { LabelLayout } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { REPORT_CHART_COLORS_CSS } from './palette';\nimport { REPORT_AXIS_LABEL_FONT_SIZE, REPORT_CHART_FONT_FAMILY } from './typography';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n DatasetComponent,\n // Reference lines and statistic lines (markLine), reference bands\n // (markArea), and the overlap hiding of 'auto' data labels (LabelLayout).\n MarkLineComponent,\n MarkAreaComponent,\n LabelLayout,\n CanvasRenderer,\n]);\n\n// The house theme — the single place report chart \"standards\" live (palette,\n// typography, tooltip styling). Polished defaults now; refined in the polish\n// phase.\necharts.registerTheme('report', {\n color: REPORT_CHART_COLORS_CSS,\n textStyle: {\n fontFamily: REPORT_CHART_FONT_FAMILY,\n },\n title: {\n textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },\n },\n legend: {\n textStyle: { color: '#52606d', fontSize: 11 },\n },\n tooltip: {\n backgroundColor: 'rgba(31, 41, 51, 0.92)',\n borderWidth: 0,\n textStyle: { color: '#fff', fontSize: 12 },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisTick: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { lineStyle: { color: '#e4e7eb' } },\n },\n timeAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n },\n});\n\nexport default echarts;\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA,OAAO,CAAC,GAAG,CAAC;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;;;IAGhB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,cAAc;AACf,CAAA,CAAC,CAAC;AAEH;AACA;AACA;AACA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC9B,IAAA,KAAK,EAAE,uBAAuB;AAC9B,IAAA,SAAS,EAAE;AACT,QAAA,UAAU,EAAE,wBAAwB;AACrC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;AAC/D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC3C,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC7C,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACtE,QAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;QACtE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC/C,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACvE,KAAA;AACF,CAAA,CAAC"}
1
+ {"version":3,"file":"firestitch-report-echarts-DY_CfeEH.mjs","sources":["../../src/app/reports/theme/echarts.ts"],"sourcesContent":["// Tree-shaken ECharts build for the reports renderer: only the chart types and\n// components the option-builder emits are registered, keeping the lazy chunk\n// lean. Loaded on demand by ngx-echarts via provideEchartsCore — see\n// REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.\n//\n// The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for\n// the high-res images the PPT/PDF exports will use.\n\nimport { BarChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n DatasetComponent,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport * as echarts from 'echarts/core';\nimport { LabelLayout } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { REPORT_CHART_COLORS_CSS } from './palette';\nimport { REPORT_AXIS_LABEL_FONT_SIZE, REPORT_CHART_FONT_FAMILY } from './typography';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n DatasetComponent,\n // Reference lines and statistic lines (markLine), reference bands\n // (markArea), and the overlap hiding of 'auto' data labels (LabelLayout).\n MarkLineComponent,\n MarkAreaComponent,\n LabelLayout,\n CanvasRenderer,\n]);\n\n// The house theme — the single place report chart \"standards\" live (palette,\n// typography, tooltip styling). Polished defaults now; refined in the polish\n// phase.\necharts.registerTheme('report', {\n color: REPORT_CHART_COLORS_CSS,\n textStyle: {\n fontFamily: REPORT_CHART_FONT_FAMILY,\n },\n title: {\n textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },\n },\n legend: {\n textStyle: { color: '#52606d', fontSize: 11 },\n },\n tooltip: {\n backgroundColor: 'rgba(31, 41, 51, 0.92)',\n borderWidth: 0,\n textStyle: { color: '#fff', fontSize: 12 },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisTick: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { lineStyle: { color: '#e4e7eb' } },\n },\n timeAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n },\n});\n\nexport default echarts;\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA,OAAO,CAAC,GAAG,CAAC;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;;;IAGhB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,cAAc;AACf,CAAA,CAAC,CAAC;AAEH;AACA;AACA;AACA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC9B,IAAA,KAAK,EAAE,uBAAuB;AAC9B,IAAA,SAAS,EAAE;AACT,QAAA,UAAU,EAAE,wBAAwB;AACrC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;AAC/D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC3C,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC7C,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACtE,QAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;QACtE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC/C,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACvE,KAAA;AACF,CAAA,CAAC"}