@firestitch/system 13.0.12 → 13.0.14

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.
@@ -2,6 +2,7 @@ import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
2
2
  import { FsMessage } from '@firestitch/message';
3
3
  import { FsPrompt } from '@firestitch/prompt';
4
4
  import { Observable } from 'rxjs';
5
+ import { Process } from '../../interfaces';
5
6
  import { ProcessState } from './../../enums/process-state.enum';
6
7
  import * as i0 from "@angular/core";
7
8
  export declare class ProcessComponent implements OnInit, OnDestroy {
@@ -17,7 +18,7 @@ export declare class ProcessComponent implements OnInit, OnDestroy {
17
18
  private _message;
18
19
  private _cdRef;
19
20
  private _prompt;
20
- process: any;
21
+ process: Process;
21
22
  ProcessStates: {};
22
23
  ProcessProcessStates: {};
23
24
  ProcessState: typeof ProcessState;
@@ -1,3 +1,4 @@
1
- export * from './system-config';
2
1
  export * from './dashboard-action';
3
2
  export * from './process-action';
3
+ export * from './process';
4
+ export * from './system-config';
@@ -0,0 +1,26 @@
1
+ export interface Process {
2
+ createDate?: any;
3
+ createdTime?: Date;
4
+ data?: any;
5
+ description?: string;
6
+ duration?: any;
7
+ endDate?: any;
8
+ endTime?: Date;
9
+ filename?: string;
10
+ files?: any;
11
+ guid?: string;
12
+ log?: string;
13
+ message?: string;
14
+ name?: string;
15
+ notify?: string;
16
+ percent?: number;
17
+ pid?: string;
18
+ prettyName?: any;
19
+ id?: number;
20
+ processState?: any;
21
+ startDate?: any;
22
+ startTime?: Date;
23
+ state?: string;
24
+ stats?: string;
25
+ type?: string;
26
+ }
@@ -47,12 +47,12 @@ export class QueryLogComponent {
47
47
  }
48
48
  }
49
49
  QueryLogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: QueryLogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
50
- QueryLogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: QueryLogComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog>\n <h1 mat-dialog-title>Query Log</h1>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large\">\n <fs-label-field>\n <fs-label>Duration</fs-label>\n {{queryLog.duration}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Optimized</fs-label>\n {{queryLog.optimized ? 'Yes' : 'No'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{queryLog.queryCost}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Raw Explain</fs-label>\n <a (click)=\"openExplain()\">View</a>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>URL</fs-label>\n {{queryLog.path | fsFormatTruncate: 50}}\n </fs-label-field>\n </div>\n\n <mat-tab-group>\n <mat-tab label=\"Query\">\n <fs-clipboard-button\n [content]=\"queryLog.prettyQuery\">\n </fs-clipboard-button>\n <div [innerHTML]=\"queryLog.prettyQuery\" class=\"query\"></div>\n </mat-tab>\n \n <mat-tab label=\"Explain\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock, selectId: queryBlock.selectId, costInfo: queryBlock.costInfo }\"></ng-container>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n\n<ng-template #nestedLoop let-queryBlock=\"queryBlock\" let-selectId=\"selectId\" let-costInfo=\"costInfo\">\n <ng-container *ngIf=\"selectId\">\n <h1>Select {{selectId}}</h1>\n </ng-container>\n \n <div class=\"fs-row.gap-large\">\n <ng-container *ngIf=\"costInfo?.queryCost\">\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{costInfo.queryCost}}\n </fs-label-field>\n </ng-container>\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <fs-label-field>\n <fs-label>Ordering Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <fs-label-field>\n <fs-label>Grouping Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <fs-label-field>\n <fs-label>Duplicates Removal</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </fs-label-field>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.table\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: { nestedLoop: [ queryBlock ]} }\"></ng-container>\n \n <ng-container *ngIf=\"queryBlock.table.attachedSubqueries\"> \n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.table.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container> \n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.nestedLoop\">\n <table class=\"fs-list-table style-line\">\n <thead>\n <tr>\n <th>Table</th>\n <th>Type</th>\n <th>Keys</th>\n <th>Ref</th>\n <th>Rows</th>\n <th>Filtered</th>\n <th>Extra</th>\n <th>Cost</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of queryBlock.nestedLoop; let index = index\">\n <tr>\n <td>\n {{item.table.tableName}}\n </td>\n <td>\n <fs-popover [template]=\"accessTypePopover\" [data]=\"item.table.accessType\">\n <span class=\"access-type\" [ngClass]=\"item.table.accessType\">{{item.table.accessType}}</span>\n </fs-popover> \n </td>\n <td>\n <fs-popover \n [template]=\"keysPopover\"\n [maxWidth]=\"null\"\n [data]=\"{ possibleKeys: item.table.possibleKeys, key: item.table.key }\">\n {{item.table.key}}\n </fs-popover>\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let ref of item.table.ref\">\n <span>{{ref}}</span>\n </ng-container>\n </div>\n </td>\n <td>\n {{item.table.rowsExaminedPerScan}}\n </td>\n <td>\n {{item.table.filtered}}\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"item.table.indexCondition\">\n <span>\n <fs-popover \n [template]=\"usingIndexCondition\" \n [maxWidth]=\"null\"\n [data]=\"item.table.indexCondition\">\n Using Index Condition\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.table.attachedCondition\">\n <span>\n <fs-popover \n [template]=\"usingWhere\" \n [maxWidth]=\"null\"\n [data]=\"item.table.attachedCondition\">\n Using Where\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.usingIndex\">\n <span>Using Index</span>\n </ng-container> \n <ng-container *ngIf=\"item.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"item.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n </td>\n <td> \n <fs-popover [template]=\"tableCostPopover\" [data]=\"item.table?.costInfo\">\n {{item.table?.costInfo.prefixCost}}\n </fs-popover>\n <ng-template #tableCostPopover let-data=\"data\">\n <div>Eval Cost: {{data.evalCost}}</div>\n <div>Read Cost: {{data.readCost}}</div>\n <div>Prefix Cost: {{data.prefixCost}}</div>\n <div>Data Read Per Join: {{data.dataReadPerJoin}}</div>\n </ng-template>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n <br>\n </ng-container> \n \n <ng-container *ngIf=\"queryBlock.selectListSubqueries\">\n <br>\n <fs-label>Select List Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.selectListSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container>\n<!-- \n <ng-container *ngIf=\"queryBlock.queryBlockattachedSubqueries\">\n <br>\n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n </ng-container>\n </ng-container> -->\n</ng-template>\n\n<ng-template #keysPopover let-data=\"data\">\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let possibleKey of data.possibleKeys\">\n <span [ngClass]=\"{ 'query-log-used-key': possibleKey === data.key }\">{{possibleKey}}</span>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #usingWhere let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #usingIndexCondition let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #accessTypePopover let-data=\"data\">\n {{accessTypes[data]}}\n</ng-template>\n\n\n<ng-template #queryBlockCritical let-queryBlock=\"queryBlock\">\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"queryBlock.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"queryBlock.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n</ng-template>", styles: ["::ng-deep .query-log-used-key{font-weight:700}::ng-deep .explain-popover{white-space:pre}.critical{color:red}fs-clipboard-button{float:right}.query{white-space:break-spaces}.access-type{color:green}.access-type.fulltext,.access-type.index,.access-type.range{color:orange}.access-type.ALL{color:red}\n"], components: [{ type: i2.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { type: i3.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i3.FsLabelComponent, selector: "fs-label" }, { type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { type: i4.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { type: i5.FsClipboardButtonComponent, selector: "fs-clipboard-button", inputs: ["content", "tooltip"] }, { type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i7.FsPopoverComponent, selector: "fs-popover" }], directives: [{ type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i9.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit", "form"] }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "fsFormatTruncate": i10.FsFormatTruncatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
50
+ QueryLogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: QueryLogComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog>\n <h1 mat-dialog-title>Query Log</h1>\n <mat-dialog-content>\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>Duration</fs-label>\n {{queryLog.duration}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Optimized</fs-label>\n {{queryLog.optimized ? 'Yes' : 'No'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{queryLog.queryCost}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Raw Explain</fs-label>\n <a (click)=\"openExplain()\">View</a>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>URL</fs-label>\n {{queryLog.path | fsFormatTruncate: 50}}\n </fs-label-field>\n </div>\n\n <mat-tab-group>\n <mat-tab label=\"Query\">\n <fs-clipboard-button\n [content]=\"queryLog.prettyQuery\">\n </fs-clipboard-button>\n <div [innerHTML]=\"queryLog.prettyQuery\" class=\"query\"></div>\n </mat-tab>\n \n <mat-tab label=\"Explain\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock, selectId: queryBlock.selectId, costInfo: queryBlock.costInfo }\"></ng-container>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n\n<ng-template #nestedLoop let-queryBlock=\"queryBlock\" let-selectId=\"selectId\" let-costInfo=\"costInfo\">\n <ng-container *ngIf=\"selectId\">\n <h1>Select {{selectId}}</h1>\n </ng-container>\n \n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <ng-container *ngIf=\"costInfo?.queryCost\">\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{costInfo.queryCost}}\n </fs-label-field>\n </ng-container>\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <fs-label-field>\n <fs-label>Ordering Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <fs-label-field>\n <fs-label>Grouping Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <fs-label-field>\n <fs-label>Duplicates Removal</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </fs-label-field>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.table\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: { nestedLoop: [ queryBlock ]} }\"></ng-container>\n \n <ng-container *ngIf=\"queryBlock.table.attachedSubqueries\"> \n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.table.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container> \n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.nestedLoop\">\n <table class=\"fs-list-table style-line\">\n <thead>\n <tr>\n <th>Table</th>\n <th>Type</th>\n <th>Keys</th>\n <th>Ref</th>\n <th>Rows</th>\n <th>Filtered</th>\n <th>Extra</th>\n <th>Cost</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of queryBlock.nestedLoop; let index = index\">\n <tr>\n <td>\n {{item.table.tableName}}\n </td>\n <td>\n <fs-popover [template]=\"accessTypePopover\" [data]=\"item.table.accessType\">\n <span class=\"access-type\" [ngClass]=\"item.table.accessType\">{{item.table.accessType}}</span>\n </fs-popover> \n </td>\n <td>\n <fs-popover \n [template]=\"keysPopover\"\n [maxWidth]=\"null\"\n [data]=\"{ possibleKeys: item.table.possibleKeys, key: item.table.key }\">\n {{item.table.key}}\n </fs-popover>\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let ref of item.table.ref\">\n <span>{{ref}}</span>\n </ng-container>\n </div>\n </td>\n <td>\n {{item.table.rowsExaminedPerScan}}\n </td>\n <td>\n {{item.table.filtered}}\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"item.table.indexCondition\">\n <span>\n <fs-popover \n [template]=\"usingIndexCondition\" \n [maxWidth]=\"null\"\n [data]=\"item.table.indexCondition\">\n Using Index Condition\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.table.attachedCondition\">\n <span>\n <fs-popover \n [template]=\"usingWhere\" \n [maxWidth]=\"null\"\n [data]=\"item.table.attachedCondition\">\n Using Where\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.usingIndex\">\n <span>Using Index</span>\n </ng-container> \n <ng-container *ngIf=\"item.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"item.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n </td>\n <td> \n <fs-popover [template]=\"tableCostPopover\" [data]=\"item.table?.costInfo\">\n {{item.table?.costInfo.prefixCost}}\n </fs-popover>\n <ng-template #tableCostPopover let-data=\"data\">\n <div>Eval Cost: {{data.evalCost}}</div>\n <div>Read Cost: {{data.readCost}}</div>\n <div>Prefix Cost: {{data.prefixCost}}</div>\n <div>Data Read Per Join: {{data.dataReadPerJoin}}</div>\n </ng-template>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n <br>\n </ng-container> \n \n <ng-container *ngIf=\"queryBlock.selectListSubqueries\">\n <br>\n <fs-label>Select List Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.selectListSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container>\n<!-- \n <ng-container *ngIf=\"queryBlock.queryBlockattachedSubqueries\">\n <br>\n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n </ng-container>\n </ng-container> -->\n</ng-template>\n\n<ng-template #keysPopover let-data=\"data\">\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let possibleKey of data.possibleKeys\">\n <span [ngClass]=\"{ 'query-log-used-key': possibleKey === data.key }\">{{possibleKey}}</span>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #usingWhere let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #usingIndexCondition let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #accessTypePopover let-data=\"data\">\n {{accessTypes[data]}}\n</ng-template>\n\n\n<ng-template #queryBlockCritical let-queryBlock=\"queryBlock\">\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"queryBlock.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"queryBlock.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n</ng-template>", styles: ["::ng-deep .query-log-used-key{font-weight:700}::ng-deep .explain-popover{white-space:pre}.critical{color:red}fs-clipboard-button{float:right}.query{white-space:break-spaces}.access-type{color:green}.access-type.fulltext,.access-type.index,.access-type.range{color:orange}.access-type.ALL{color:red}\n"], components: [{ type: i2.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { type: i3.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i3.FsLabelComponent, selector: "fs-label" }, { type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { type: i4.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { type: i5.FsClipboardButtonComponent, selector: "fs-clipboard-button", inputs: ["content", "tooltip"] }, { type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i7.FsPopoverComponent, selector: "fs-popover" }], directives: [{ type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i9.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit", "form"] }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "fsFormatTruncate": i10.FsFormatTruncatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
51
51
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: QueryLogComponent, decorators: [{
52
52
  type: Component,
53
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<fs-dialog>\n <h1 mat-dialog-title>Query Log</h1>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large\">\n <fs-label-field>\n <fs-label>Duration</fs-label>\n {{queryLog.duration}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Optimized</fs-label>\n {{queryLog.optimized ? 'Yes' : 'No'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{queryLog.queryCost}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Raw Explain</fs-label>\n <a (click)=\"openExplain()\">View</a>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>URL</fs-label>\n {{queryLog.path | fsFormatTruncate: 50}}\n </fs-label-field>\n </div>\n\n <mat-tab-group>\n <mat-tab label=\"Query\">\n <fs-clipboard-button\n [content]=\"queryLog.prettyQuery\">\n </fs-clipboard-button>\n <div [innerHTML]=\"queryLog.prettyQuery\" class=\"query\"></div>\n </mat-tab>\n \n <mat-tab label=\"Explain\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock, selectId: queryBlock.selectId, costInfo: queryBlock.costInfo }\"></ng-container>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n\n<ng-template #nestedLoop let-queryBlock=\"queryBlock\" let-selectId=\"selectId\" let-costInfo=\"costInfo\">\n <ng-container *ngIf=\"selectId\">\n <h1>Select {{selectId}}</h1>\n </ng-container>\n \n <div class=\"fs-row.gap-large\">\n <ng-container *ngIf=\"costInfo?.queryCost\">\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{costInfo.queryCost}}\n </fs-label-field>\n </ng-container>\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <fs-label-field>\n <fs-label>Ordering Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <fs-label-field>\n <fs-label>Grouping Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <fs-label-field>\n <fs-label>Duplicates Removal</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </fs-label-field>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.table\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: { nestedLoop: [ queryBlock ]} }\"></ng-container>\n \n <ng-container *ngIf=\"queryBlock.table.attachedSubqueries\"> \n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.table.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container> \n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.nestedLoop\">\n <table class=\"fs-list-table style-line\">\n <thead>\n <tr>\n <th>Table</th>\n <th>Type</th>\n <th>Keys</th>\n <th>Ref</th>\n <th>Rows</th>\n <th>Filtered</th>\n <th>Extra</th>\n <th>Cost</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of queryBlock.nestedLoop; let index = index\">\n <tr>\n <td>\n {{item.table.tableName}}\n </td>\n <td>\n <fs-popover [template]=\"accessTypePopover\" [data]=\"item.table.accessType\">\n <span class=\"access-type\" [ngClass]=\"item.table.accessType\">{{item.table.accessType}}</span>\n </fs-popover> \n </td>\n <td>\n <fs-popover \n [template]=\"keysPopover\"\n [maxWidth]=\"null\"\n [data]=\"{ possibleKeys: item.table.possibleKeys, key: item.table.key }\">\n {{item.table.key}}\n </fs-popover>\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let ref of item.table.ref\">\n <span>{{ref}}</span>\n </ng-container>\n </div>\n </td>\n <td>\n {{item.table.rowsExaminedPerScan}}\n </td>\n <td>\n {{item.table.filtered}}\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"item.table.indexCondition\">\n <span>\n <fs-popover \n [template]=\"usingIndexCondition\" \n [maxWidth]=\"null\"\n [data]=\"item.table.indexCondition\">\n Using Index Condition\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.table.attachedCondition\">\n <span>\n <fs-popover \n [template]=\"usingWhere\" \n [maxWidth]=\"null\"\n [data]=\"item.table.attachedCondition\">\n Using Where\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.usingIndex\">\n <span>Using Index</span>\n </ng-container> \n <ng-container *ngIf=\"item.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"item.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n </td>\n <td> \n <fs-popover [template]=\"tableCostPopover\" [data]=\"item.table?.costInfo\">\n {{item.table?.costInfo.prefixCost}}\n </fs-popover>\n <ng-template #tableCostPopover let-data=\"data\">\n <div>Eval Cost: {{data.evalCost}}</div>\n <div>Read Cost: {{data.readCost}}</div>\n <div>Prefix Cost: {{data.prefixCost}}</div>\n <div>Data Read Per Join: {{data.dataReadPerJoin}}</div>\n </ng-template>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n <br>\n </ng-container> \n \n <ng-container *ngIf=\"queryBlock.selectListSubqueries\">\n <br>\n <fs-label>Select List Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.selectListSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container>\n<!-- \n <ng-container *ngIf=\"queryBlock.queryBlockattachedSubqueries\">\n <br>\n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n </ng-container>\n </ng-container> -->\n</ng-template>\n\n<ng-template #keysPopover let-data=\"data\">\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let possibleKey of data.possibleKeys\">\n <span [ngClass]=\"{ 'query-log-used-key': possibleKey === data.key }\">{{possibleKey}}</span>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #usingWhere let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #usingIndexCondition let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #accessTypePopover let-data=\"data\">\n {{accessTypes[data]}}\n</ng-template>\n\n\n<ng-template #queryBlockCritical let-queryBlock=\"queryBlock\">\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"queryBlock.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"queryBlock.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n</ng-template>", styles: ["::ng-deep .query-log-used-key{font-weight:700}::ng-deep .explain-popover{white-space:pre}.critical{color:red}fs-clipboard-button{float:right}.query{white-space:break-spaces}.access-type{color:green}.access-type.fulltext,.access-type.index,.access-type.range{color:orange}.access-type.ALL{color:red}\n"] }]
53
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<fs-dialog>\n <h1 mat-dialog-title>Query Log</h1>\n <mat-dialog-content>\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>Duration</fs-label>\n {{queryLog.duration}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Optimized</fs-label>\n {{queryLog.optimized ? 'Yes' : 'No'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{queryLog.queryCost}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Raw Explain</fs-label>\n <a (click)=\"openExplain()\">View</a>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>URL</fs-label>\n {{queryLog.path | fsFormatTruncate: 50}}\n </fs-label-field>\n </div>\n\n <mat-tab-group>\n <mat-tab label=\"Query\">\n <fs-clipboard-button\n [content]=\"queryLog.prettyQuery\">\n </fs-clipboard-button>\n <div [innerHTML]=\"queryLog.prettyQuery\" class=\"query\"></div>\n </mat-tab>\n \n <mat-tab label=\"Explain\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock, selectId: queryBlock.selectId, costInfo: queryBlock.costInfo }\"></ng-container>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n\n<ng-template #nestedLoop let-queryBlock=\"queryBlock\" let-selectId=\"selectId\" let-costInfo=\"costInfo\">\n <ng-container *ngIf=\"selectId\">\n <h1>Select {{selectId}}</h1>\n </ng-container>\n \n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <ng-container *ngIf=\"costInfo?.queryCost\">\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{costInfo.queryCost}}\n </fs-label-field>\n </ng-container>\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <fs-label-field>\n <fs-label>Ordering Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <fs-label-field>\n <fs-label>Grouping Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <fs-label-field>\n <fs-label>Duplicates Removal</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </fs-label-field>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.table\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: { nestedLoop: [ queryBlock ]} }\"></ng-container>\n \n <ng-container *ngIf=\"queryBlock.table.attachedSubqueries\"> \n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.table.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container> \n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.nestedLoop\">\n <table class=\"fs-list-table style-line\">\n <thead>\n <tr>\n <th>Table</th>\n <th>Type</th>\n <th>Keys</th>\n <th>Ref</th>\n <th>Rows</th>\n <th>Filtered</th>\n <th>Extra</th>\n <th>Cost</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of queryBlock.nestedLoop; let index = index\">\n <tr>\n <td>\n {{item.table.tableName}}\n </td>\n <td>\n <fs-popover [template]=\"accessTypePopover\" [data]=\"item.table.accessType\">\n <span class=\"access-type\" [ngClass]=\"item.table.accessType\">{{item.table.accessType}}</span>\n </fs-popover> \n </td>\n <td>\n <fs-popover \n [template]=\"keysPopover\"\n [maxWidth]=\"null\"\n [data]=\"{ possibleKeys: item.table.possibleKeys, key: item.table.key }\">\n {{item.table.key}}\n </fs-popover>\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let ref of item.table.ref\">\n <span>{{ref}}</span>\n </ng-container>\n </div>\n </td>\n <td>\n {{item.table.rowsExaminedPerScan}}\n </td>\n <td>\n {{item.table.filtered}}\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"item.table.indexCondition\">\n <span>\n <fs-popover \n [template]=\"usingIndexCondition\" \n [maxWidth]=\"null\"\n [data]=\"item.table.indexCondition\">\n Using Index Condition\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.table.attachedCondition\">\n <span>\n <fs-popover \n [template]=\"usingWhere\" \n [maxWidth]=\"null\"\n [data]=\"item.table.attachedCondition\">\n Using Where\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.usingIndex\">\n <span>Using Index</span>\n </ng-container> \n <ng-container *ngIf=\"item.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"item.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n </td>\n <td> \n <fs-popover [template]=\"tableCostPopover\" [data]=\"item.table?.costInfo\">\n {{item.table?.costInfo.prefixCost}}\n </fs-popover>\n <ng-template #tableCostPopover let-data=\"data\">\n <div>Eval Cost: {{data.evalCost}}</div>\n <div>Read Cost: {{data.readCost}}</div>\n <div>Prefix Cost: {{data.prefixCost}}</div>\n <div>Data Read Per Join: {{data.dataReadPerJoin}}</div>\n </ng-template>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n <br>\n </ng-container> \n \n <ng-container *ngIf=\"queryBlock.selectListSubqueries\">\n <br>\n <fs-label>Select List Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.selectListSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container>\n<!-- \n <ng-container *ngIf=\"queryBlock.queryBlockattachedSubqueries\">\n <br>\n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n </ng-container>\n </ng-container> -->\n</ng-template>\n\n<ng-template #keysPopover let-data=\"data\">\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let possibleKey of data.possibleKeys\">\n <span [ngClass]=\"{ 'query-log-used-key': possibleKey === data.key }\">{{possibleKey}}</span>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #usingWhere let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #usingIndexCondition let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #accessTypePopover let-data=\"data\">\n {{accessTypes[data]}}\n</ng-template>\n\n\n<ng-template #queryBlockCritical let-queryBlock=\"queryBlock\">\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"queryBlock.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"queryBlock.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n</ng-template>", styles: ["::ng-deep .query-log-used-key{font-weight:700}::ng-deep .explain-popover{white-space:pre}.critical{color:red}fs-clipboard-button{float:right}.query{white-space:break-spaces}.access-type{color:green}.access-type.fulltext,.access-type.index,.access-type.range{color:orange}.access-type.ALL{color:red}\n"] }]
54
54
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
55
55
  type: Inject,
56
56
  args: [MAT_DIALOG_DATA]
57
57
  }] }, { type: i1.MatDialog }]; } });
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9xdWVyeS1sb2dzL2NvbXBvbmVudHMvcXVlcnktbG9nL3F1ZXJ5LWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9jb21wb25lbnRzL3F1ZXJ5LWxvZy9xdWVyeS1sb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7OztBQVE5QyxNQUFNLE9BQU8saUJBQWlCO0lBaUI1QixZQUNtQyxLQUFVLEVBQ25DLE9BQWtCO1FBRE8sVUFBSyxHQUFMLEtBQUssQ0FBSztRQUNuQyxZQUFPLEdBQVAsT0FBTyxDQUFXO1FBaEJyQixnQkFBVyxHQUFHO1lBQ25CLElBQUksRUFBRSw0SkFBNEo7WUFDbEssTUFBTSxFQUFFLG9DQUFvQztZQUM1QyxLQUFLLEVBQUUsMklBQTJJO1lBQ2xKLE1BQU0sRUFBRSx3SkFBd0o7WUFDaEssR0FBRyxFQUFFLGlOQUFpTjtZQUN0TixRQUFRLEVBQUUsc0RBQXNEO1lBQ2hFLEtBQUssRUFBRSxrUkFBa1I7WUFDelIsV0FBVyxFQUFFLHNPQUFzTztZQUNuUCxLQUFLLEVBQUUseUlBQXlJO1lBQ2hKLGVBQWUsRUFBRSxFQUFFO1lBQ25CLEdBQUcsRUFBRSxtREFBbUQ7U0FDekQsQ0FBQztRQU1BLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNsQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUM7SUFDNUMsQ0FBQzs7OEdBeENVLGlCQUFpQixrQkFrQmxCLGVBQWU7a0dBbEJkLGlCQUFpQixvRENiOUIsK25VQXFRYzsyRkR4UEQsaUJBQWlCO2tCQUw3QixTQUFTO3NDQUdTLHVCQUF1QixDQUFDLE1BQU07OzBCQW9CNUMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuXG5pbXBvcnQgeyBFeHBsYWluQ29tcG9uZW50IH0gZnJvbSAnLi4vZXhwbGFpbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9xdWVyeS1sb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9xdWVyeS1sb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFF1ZXJ5TG9nQ29tcG9uZW50IHtcblxuICBwdWJsaWMgcXVlcnlMb2c7XG4gIHB1YmxpYyBhY2Nlc3NUeXBlcyA9IHtcbiAgICBOVUxMOiAnVGhpcyBhY2Nlc3MgbWV0aG9kIG1lYW5zIE15U1FMIGNhbiByZXNvbHZlIHRoZSBxdWVyeSBkdXJpbmcgdGhlIG9wdGltaXphdGlvbiBwaGFzZSBhbmQgd2lsbCBub3QgZXZlbiBhY2Nlc3MgdGhlIHRhYmxlIG9yIGluZGV4IGR1cmluZyB0aGUgZXhlY3V0aW9uIHN0YWdlLicsXG4gICAgc3lzdGVtOiAnVGhlIHRhYmxlIGlzIGVtcHR5IG9yIGhhcyBvbmUgcm93LicsXG4gICAgY29uc3Q6ICdUaGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBjYW4gYmUgdHJlYXRlZCBhcyBhIGNvbnN0YW50ICh0aGVyZSBpcyBvbmUgcm93IG1hdGNoaW5nIHRoZSBxdWVyeSkuIE5vdGU6IFByaW1hcnkgS2V5IExvb2t1cCwgVW5pcXVlIEluZGV4IExvb2t1cCcsXG4gICAgZXFfcmVmOiAnVGhlIGluZGV4IGlzIGNsdXN0ZXJlZCBhbmQgaXMgYmVpbmcgdXNlZCBieSB0aGUgb3BlcmF0aW9uIChlaXRoZXIgdGhlIGluZGV4IGlzIGEgUFJJTUFSWSBLRVkgb3IgVU5JUVVFIElOREVYIHdpdGggYWxsIGtleSBjb2x1bW5zIGRlZmluZWQgYXMgTk9UIE5VTEwpJyxcbiAgICByZWY6ICdUaGUgaW5kZXhlZCBjb2x1bW4gd2FzIGFjY2Vzc2VkIHVzaW5nIGFuIGVxdWFsaXR5IG9wZXJhdG9yIE5vdGU6IFRoZSByZWZfb3JfbnVsbCBhY2Nlc3MgdHlwZSBpcyBhIHZhcmlhdGlvbiBvbiByZWYuIEl0IG1lYW5zIE15U1FMIG11c3QgZG8gYSBzZWNvbmQgbG9va3VwIHRvIGZpbmQgTlVMTCBlbnRyaWVzIGFmdGVyIGRvaW5nIHRoZSBpbml0aWFsIGxvb2t1cC4nLFxuICAgIGZ1bGx0ZXh0OiAnT3BlcmF0aW9uIChKT0lOKSBpcyB1c2luZyB0aGUgdGFibGXigJlzIGZ1bGx0ZXh0IGluZGV4JyxcbiAgICBpbmRleDogJ1RoZSBlbnRpcmUgaW5kZXggaXMgc2Nhbm5lZCB0byBmaW5kIGEgbWF0Y2ggZm9yIHRoZSBxdWVyeS4gTm90ZTogVGhlIG1haW4gYWR2YW50YWdlIGlzIHRoYXQgdGhpcyBhdm9pZHMgc29ydGluZy4gVGhlIGJpZ2dlc3QgZGlzYWR2YW50YWdlIGlzIHRoZSBjb3N0IG9mIHJlYWRpbmcgYW4gZW50aXJlIHRhYmxlIGluIGluZGV4IG9yZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYWNjZXNzaW5nIHRoZSByb3dzIGluIHJhbmRvbSBvcmRlciwgd2hpY2ggaXMgdmVyeSBleHBlbnNpdmUuJyxcbiAgICBpbmRleF9tZXJnZTogJ1RoaXMgam9pbiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBJbmRleCBNZXJnZSBvcHRpbWl6YXRpb24gaXMgdXNlZC4gSW4gdGhpcyBjYXNlLCB0aGUga2V5IGNvbHVtbiBpbiB0aGUgb3V0cHV0IHJvdyBjb250YWlucyBhIGxpc3Qgb2YgaW5kZXhlcyB1c2VkLiBJdCBpbmRpY2F0ZXMgYSBxdWVyeSBjYW4gbWFrZSBsaW1pdGVkIHVzZSBvZiBtdWx0aXBsZSBpbmRleGVzIG9uIGEgc2luZ2xlIHRhYmxlLicsXG4gICAgcmFuZ2U6ICdUaGlzIHR5cGUgcmVwbGFjZXMgZXFfcmVmIGZvciBzb21lIElOIHN1YnF1ZXJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtOiB2YWx1ZSBJTiAoU0VMRUNUIHByaW1hcnlfa2V5IEZST00gc2luZ2xlX3RhYmxlIFdIRVJFIHNvbWVfZXhwciknLFxuICAgIHVuaXF1ZV9zdWJxdWVyeTogJycsXG4gICAgQUxMOiAnTXlTUUwgc2NhbnMgdGhlIGVudGlyZSB0YWJsZSB0byBzYXRpc2Z5IHRoZSBxdWVyeScsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgX2RhdGE6IGFueSxcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcbiAgKSB7XG4gICAgdGhpcy5xdWVyeUxvZyA9IF9kYXRhLnF1ZXJ5TG9nO1xuICB9XG5cbiAgcHVibGljIG9wZW5FeHBsYWluKCkge1xuICAgIHRoaXMuX2RpYWxvZy5vcGVuKEV4cGxhaW5Db21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgZXhwbGFpbjogdGhpcy5leHBsYWluIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4cGxhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlMb2cuZXhwbGFpbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcXVlcnlCbG9jaygpIHtcbiAgICByZXR1cm4gdGhpcy5leHBsYWluPy5xdWVyeUJsb2NrO1xuICB9XG5cbiAgcHVibGljIGdldCBvcmRlcmluZ09wZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeUJsb2NrPy5vcmRlcmluZ09wZXJhdGlvbjtcbiAgfVxufVxuIiwiPGZzLWRpYWxvZz5cbiAgPGgxIG1hdC1kaWFsb2ctdGl0bGU+UXVlcnkgTG9nPC9oMT5cbiAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sYXJnZVwiPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+RHVyYXRpb248L2ZzLWxhYmVsPlxuICAgICAgICB7e3F1ZXJ5TG9nLmR1cmF0aW9ufX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPk9wdGltaXplZDwvZnMtbGFiZWw+XG4gICAgICAgIHt7cXVlcnlMb2cub3B0aW1pemVkID8gJ1llcycgOiAnTm8nfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlF1ZXJ5IENvc3Q8L2ZzLWxhYmVsPlxuICAgICAgICB7e3F1ZXJ5TG9nLnF1ZXJ5Q29zdH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5SYXcgRXhwbGFpbjwvZnMtbGFiZWw+XG4gICAgICAgIDxhIChjbGljayk9XCJvcGVuRXhwbGFpbigpXCI+VmlldzwvYT5cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlVSTDwvZnMtbGFiZWw+XG4gICAgICAgIHt7cXVlcnlMb2cucGF0aCB8IGZzRm9ybWF0VHJ1bmNhdGU6IDUwfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8bWF0LXRhYi1ncm91cD5cbiAgICAgIDxtYXQtdGFiIGxhYmVsPVwiUXVlcnlcIj5cbiAgICAgICAgPGZzLWNsaXBib2FyZC1idXR0b25cbiAgICAgICAgICBbY29udGVudF09XCJxdWVyeUxvZy5wcmV0dHlRdWVyeVwiPlxuICAgICAgICA8L2ZzLWNsaXBib2FyZC1idXR0b24+XG4gICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJxdWVyeUxvZy5wcmV0dHlRdWVyeVwiIGNsYXNzPVwicXVlcnlcIj48L2Rpdj5cbiAgICAgIDwvbWF0LXRhYj5cbiAgICAgIFxuICAgICAgPG1hdC10YWIgbGFiZWw9XCJFeHBsYWluXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2ssIHNlbGVjdElkOiBxdWVyeUJsb2NrLnNlbGVjdElkLCBjb3N0SW5mbzogcXVlcnlCbG9jay5jb3N0SW5mbyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L21hdC10YWI+XG4gICAgPC9tYXQtdGFiLWdyb3VwPlxuXG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b25cbiAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwidW5kZWZpbmVkXCI+XG4gICAgICBEb25lXG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPC9mcy1kaWFsb2c+XG5cbjxuZy10ZW1wbGF0ZSAjbmVzdGVkTG9vcCBsZXQtcXVlcnlCbG9jaz1cInF1ZXJ5QmxvY2tcIiBsZXQtc2VsZWN0SWQ9XCJzZWxlY3RJZFwiIGxldC1jb3N0SW5mbz1cImNvc3RJbmZvXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RJZFwiPlxuICAgIDxoMT5TZWxlY3Qge3tzZWxlY3RJZH19PC9oMT5cbiAgPC9uZy1jb250YWluZXI+XG4gIFxuICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sYXJnZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb3N0SW5mbz8ucXVlcnlDb3N0XCI+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5RdWVyeSBDb3N0PC9mcy1sYWJlbD5cbiAgICAgICAge3tjb3N0SW5mby5xdWVyeUNvc3R9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5vcmRlcmluZ09wZXJhdGlvblwiPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+T3JkZXJpbmcgT3BlcmF0aW9uPC9mcy1sYWJlbD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJxdWVyeUJsb2NrQ3JpdGljYWxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBxdWVyeUJsb2NrLm9yZGVyaW5nT3BlcmF0aW9uIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5ncm91cGluZ09wZXJhdGlvblwiPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+R3JvdXBpbmcgT3BlcmF0aW9uPC9mcy1sYWJlbD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJxdWVyeUJsb2NrQ3JpdGljYWxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBxdWVyeUJsb2NrLmdyb3VwaW5nT3BlcmF0aW9uIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5kdXBsaWNhdGVzUmVtb3ZhbFwiPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+RHVwbGljYXRlcyBSZW1vdmFsPC9mcy1sYWJlbD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJxdWVyeUJsb2NrQ3JpdGljYWxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBxdWVyeUJsb2NrLmR1cGxpY2F0ZXNSZW1vdmFsIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLm9yZGVyaW5nT3BlcmF0aW9uXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXN0ZWRMb29wXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5vcmRlcmluZ09wZXJhdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLmdyb3VwaW5nT3BlcmF0aW9uXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXN0ZWRMb29wXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5ncm91cGluZ09wZXJhdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLmR1cGxpY2F0ZXNSZW1vdmFsXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXN0ZWRMb29wXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5kdXBsaWNhdGVzUmVtb3ZhbCB9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLnRhYmxlXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXN0ZWRMb29wXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogeyBuZXN0ZWRMb29wOiBbIHF1ZXJ5QmxvY2sgXX0gfVwiPjwvbmctY29udGFpbmVyPlxuICBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay50YWJsZS5hdHRhY2hlZFN1YnF1ZXJpZXNcIj4gIFxuICAgICAgPGZzLWxhYmVsPkF0dGFjaGVkIFN1YnF1ZXJpZXM8L2ZzLWxhYmVsPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3VicXVlcnkgb2YgcXVlcnlCbG9jay50YWJsZS5hdHRhY2hlZFN1YnF1ZXJpZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJxdWVyeUJsb2NrQ3JpdGljYWxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBzdWJxdWVyeS5xdWVyeUJsb2NrIH1cIj48L25nLWNvbnRhaW5lcj4gXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2ssIHNlbGVjdElkOiBzdWJxdWVyeS5xdWVyeUJsb2NrLnNlbGVjdElkLCBjb3N0SW5mbzogc3VicXVlcnkucXVlcnlCbG9jay5jb3N0SW5mbyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj4gICAgXG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLm5lc3RlZExvb3BcIj5cbiAgICA8dGFibGUgY2xhc3M9XCJmcy1saXN0LXRhYmxlIHN0eWxlLWxpbmVcIj5cbiAgICAgICA8dGhlYWQ+XG4gICAgICAgICA8dHI+XG4gICAgICAgICAgIDx0aD5UYWJsZTwvdGg+XG4gICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgPHRoPktleXM8L3RoPlxuICAgICAgICAgICA8dGg+UmVmPC90aD5cbiAgICAgICAgICAgPHRoPlJvd3M8L3RoPlxuICAgICAgICAgICA8dGg+RmlsdGVyZWQ8L3RoPlxuICAgICAgICAgICA8dGg+RXh0cmE8L3RoPlxuICAgICAgICAgICA8dGg+Q29zdDwvdGg+XG4gICAgICAgICA8L3RyPlxuICAgICAgIDwvdGhlYWQ+XG4gICAgICAgPHRib2R5PlxuICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBxdWVyeUJsb2NrLm5lc3RlZExvb3A7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICB7e2l0ZW0udGFibGUudGFibGVOYW1lfX1cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgIDxmcy1wb3BvdmVyIFt0ZW1wbGF0ZV09XCJhY2Nlc3NUeXBlUG9wb3ZlclwiIFtkYXRhXT1cIml0ZW0udGFibGUuYWNjZXNzVHlwZVwiPlxuICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFjY2Vzcy10eXBlXCIgW25nQ2xhc3NdPVwiaXRlbS50YWJsZS5hY2Nlc3NUeXBlXCI+e3tpdGVtLnRhYmxlLmFjY2Vzc1R5cGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgIDwvZnMtcG9wb3Zlcj4gICAgICAgICAgICBcbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgIDxmcy1wb3BvdmVyICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJrZXlzUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgW21heFdpZHRoXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInsgcG9zc2libGVLZXlzOiBpdGVtLnRhYmxlLnBvc3NpYmxlS2V5cywga2V5OiBpdGVtLnRhYmxlLmtleSB9XCI+XG4gICAgICAgICAgICAgICAgIHt7aXRlbS50YWJsZS5rZXl9fVxuICAgICAgICAgICAgICAgPC9mcy1wb3BvdmVyPlxuICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWRlbGltaXRcIj5cbiAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVmIG9mIGl0ZW0udGFibGUucmVmXCI+XG4gICAgICAgICAgICAgICAgICAgPHNwYW4+e3tyZWZ9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgIHt7aXRlbS50YWJsZS5yb3dzRXhhbWluZWRQZXJTY2FufX1cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgIHt7aXRlbS50YWJsZS5maWx0ZXJlZH19XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtZGVsaW1pdFwiPlxuICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50YWJsZS5pbmRleENvbmRpdGlvblwiPlxuICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgPGZzLXBvcG92ZXIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cInVzaW5nSW5kZXhDb25kaXRpb25cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4V2lkdGhdPVwibnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiaXRlbS50YWJsZS5pbmRleENvbmRpdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBJbmRleCBDb25kaXRpb25cbiAgICAgICAgICAgICAgICAgICAgIDwvZnMtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50YWJsZS5hdHRhY2hlZENvbmRpdGlvblwiPlxuICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgPGZzLXBvcG92ZXIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cInVzaW5nV2hlcmVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4V2lkdGhdPVwibnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiaXRlbS50YWJsZS5hdHRhY2hlZENvbmRpdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBXaGVyZVxuICAgICAgICAgICAgICAgICAgICAgPC9mcy1wb3BvdmVyPlxuICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnVzaW5nSW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICA8c3Bhbj5Vc2luZyBJbmRleDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+ICAgIFxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnVzaW5nRmlsZXNvcnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3JpdGljYWxcIj5Vc2luZyBGaWxlIFNvcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udXNpbmdUZW1wb3JhcnlUYWJsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcml0aWNhbFwiPlRlbXBvcmFyeSBUYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgPHRkPiAgICAgXG4gICAgICAgICAgICAgIDxmcy1wb3BvdmVyIFt0ZW1wbGF0ZV09XCJ0YWJsZUNvc3RQb3BvdmVyXCIgW2RhdGFdPVwiaXRlbS50YWJsZT8uY29zdEluZm9cIj5cbiAgICAgICAgICAgICAgICB7e2l0ZW0udGFibGU/LmNvc3RJbmZvLnByZWZpeENvc3R9fVxuICAgICAgICAgICAgICA8L2ZzLXBvcG92ZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGFibGVDb3N0UG9wb3ZlciBsZXQtZGF0YT1cImRhdGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PkV2YWwgQ29zdDoge3tkYXRhLmV2YWxDb3N0fX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlJlYWQgQ29zdDoge3tkYXRhLnJlYWRDb3N0fX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlByZWZpeCBDb3N0OiB7e2RhdGEucHJlZml4Q29zdH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5EYXRhIFJlYWQgUGVyIEpvaW46IHt7ZGF0YS5kYXRhUmVhZFBlckpvaW59fTwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgIDwvdHI+XG4gICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICA8L3Rib2R5PlxuICAgICA8L3RhYmxlPlxuICAgICA8YnI+XG4gICA8L25nLWNvbnRhaW5lcj4gIFxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2suc2VsZWN0TGlzdFN1YnF1ZXJpZXNcIj5cbiAgICA8YnI+XG4gICAgPGZzLWxhYmVsPlNlbGVjdCBMaXN0IFN1YnF1ZXJpZXM8L2ZzLWxhYmVsPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YnF1ZXJ5IG9mIHF1ZXJ5QmxvY2suc2VsZWN0TGlzdFN1YnF1ZXJpZXNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogc3VicXVlcnkucXVlcnlCbG9jayB9XCI+PC9uZy1jb250YWluZXI+IFxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXN0ZWRMb29wXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogc3VicXVlcnkucXVlcnlCbG9jaywgc2VsZWN0SWQ6IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2suc2VsZWN0SWQsIGNvc3RJbmZvOiBzdWJxdWVyeS5xdWVyeUJsb2NrLmNvc3RJbmZvIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48IS0tIFxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5xdWVyeUJsb2NrYXR0YWNoZWRTdWJxdWVyaWVzXCI+XG4gICAgPGJyPlxuICAgIDxmcy1sYWJlbD5BdHRhY2hlZCBTdWJxdWVyaWVzPC9mcy1sYWJlbD5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJxdWVyeSBvZiBxdWVyeUJsb2NrLmF0dGFjaGVkU3VicXVlcmllc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJxdWVyeUJsb2NrQ3JpdGljYWxcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBzdWJxdWVyeS5xdWVyeUJsb2NrIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2sgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj4gLS0+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2tleXNQb3BvdmVyIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8ZGl2IGNsYXNzPVwiZnMtZGVsaW1pdFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHBvc3NpYmxlS2V5IG9mIGRhdGEucG9zc2libGVLZXlzXCI+XG4gICAgICA8c3BhbiBbbmdDbGFzc109XCJ7ICdxdWVyeS1sb2ctdXNlZC1rZXknOiBwb3NzaWJsZUtleSA9PT0gZGF0YS5rZXkgfVwiPnt7cG9zc2libGVLZXl9fTwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3VzaW5nV2hlcmUgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIHt7ZGF0YX19XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3VzaW5nSW5kZXhDb25kaXRpb24gbGV0LWRhdGE9XCJkYXRhXCI+XG4gIHt7ZGF0YX19XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FjY2Vzc1R5cGVQb3BvdmVyIGxldC1kYXRhPVwiZGF0YVwiPlxuICB7e2FjY2Vzc1R5cGVzW2RhdGFdfX1cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlICNxdWVyeUJsb2NrQ3JpdGljYWwgbGV0LXF1ZXJ5QmxvY2s9XCJxdWVyeUJsb2NrXCI+XG4gIDxkaXYgY2xhc3M9XCJmcy1kZWxpbWl0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sudXNpbmdGaWxlc29ydFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcml0aWNhbFwiPlVzaW5nIEZpbGUgU29ydDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay51c2luZ1RlbXBvcmFyeVRhYmxlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNyaXRpY2FsXCI+VGVtcG9yYXJ5IFRhYmxlPC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9xdWVyeS1sb2dzL2NvbXBvbmVudHMvcXVlcnktbG9nL3F1ZXJ5LWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9jb21wb25lbnRzL3F1ZXJ5LWxvZy9xdWVyeS1sb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7OztBQVE5QyxNQUFNLE9BQU8saUJBQWlCO0lBaUI1QixZQUNtQyxLQUFVLEVBQ25DLE9BQWtCO1FBRE8sVUFBSyxHQUFMLEtBQUssQ0FBSztRQUNuQyxZQUFPLEdBQVAsT0FBTyxDQUFXO1FBaEJyQixnQkFBVyxHQUFHO1lBQ25CLElBQUksRUFBRSw0SkFBNEo7WUFDbEssTUFBTSxFQUFFLG9DQUFvQztZQUM1QyxLQUFLLEVBQUUsMklBQTJJO1lBQ2xKLE1BQU0sRUFBRSx3SkFBd0o7WUFDaEssR0FBRyxFQUFFLGlOQUFpTjtZQUN0TixRQUFRLEVBQUUsc0RBQXNEO1lBQ2hFLEtBQUssRUFBRSxrUkFBa1I7WUFDelIsV0FBVyxFQUFFLHNPQUFzTztZQUNuUCxLQUFLLEVBQUUseUlBQXlJO1lBQ2hKLGVBQWUsRUFBRSxFQUFFO1lBQ25CLEdBQUcsRUFBRSxtREFBbUQ7U0FDekQsQ0FBQztRQU1BLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNsQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUM7SUFDNUMsQ0FBQzs7OEdBeENVLGlCQUFpQixrQkFrQmxCLGVBQWU7a0dBbEJkLGlCQUFpQixvRENiOUIsMnBVQXFRYzsyRkR4UEQsaUJBQWlCO2tCQUw3QixTQUFTO3NDQUdTLHVCQUF1QixDQUFDLE1BQU07OzBCQW9CNUMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuXG5pbXBvcnQgeyBFeHBsYWluQ29tcG9uZW50IH0gZnJvbSAnLi4vZXhwbGFpbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9xdWVyeS1sb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9xdWVyeS1sb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFF1ZXJ5TG9nQ29tcG9uZW50IHtcblxuICBwdWJsaWMgcXVlcnlMb2c7XG4gIHB1YmxpYyBhY2Nlc3NUeXBlcyA9IHtcbiAgICBOVUxMOiAnVGhpcyBhY2Nlc3MgbWV0aG9kIG1lYW5zIE15U1FMIGNhbiByZXNvbHZlIHRoZSBxdWVyeSBkdXJpbmcgdGhlIG9wdGltaXphdGlvbiBwaGFzZSBhbmQgd2lsbCBub3QgZXZlbiBhY2Nlc3MgdGhlIHRhYmxlIG9yIGluZGV4IGR1cmluZyB0aGUgZXhlY3V0aW9uIHN0YWdlLicsXG4gICAgc3lzdGVtOiAnVGhlIHRhYmxlIGlzIGVtcHR5IG9yIGhhcyBvbmUgcm93LicsXG4gICAgY29uc3Q6ICdUaGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBjYW4gYmUgdHJlYXRlZCBhcyBhIGNvbnN0YW50ICh0aGVyZSBpcyBvbmUgcm93IG1hdGNoaW5nIHRoZSBxdWVyeSkuIE5vdGU6IFByaW1hcnkgS2V5IExvb2t1cCwgVW5pcXVlIEluZGV4IExvb2t1cCcsXG4gICAgZXFfcmVmOiAnVGhlIGluZGV4IGlzIGNsdXN0ZXJlZCBhbmQgaXMgYmVpbmcgdXNlZCBieSB0aGUgb3BlcmF0aW9uIChlaXRoZXIgdGhlIGluZGV4IGlzIGEgUFJJTUFSWSBLRVkgb3IgVU5JUVVFIElOREVYIHdpdGggYWxsIGtleSBjb2x1bW5zIGRlZmluZWQgYXMgTk9UIE5VTEwpJyxcbiAgICByZWY6ICdUaGUgaW5kZXhlZCBjb2x1bW4gd2FzIGFjY2Vzc2VkIHVzaW5nIGFuIGVxdWFsaXR5IG9wZXJhdG9yIE5vdGU6IFRoZSByZWZfb3JfbnVsbCBhY2Nlc3MgdHlwZSBpcyBhIHZhcmlhdGlvbiBvbiByZWYuIEl0IG1lYW5zIE15U1FMIG11c3QgZG8gYSBzZWNvbmQgbG9va3VwIHRvIGZpbmQgTlVMTCBlbnRyaWVzIGFmdGVyIGRvaW5nIHRoZSBpbml0aWFsIGxvb2t1cC4nLFxuICAgIGZ1bGx0ZXh0OiAnT3BlcmF0aW9uIChKT0lOKSBpcyB1c2luZyB0aGUgdGFibGXigJlzIGZ1bGx0ZXh0IGluZGV4JyxcbiAgICBpbmRleDogJ1RoZSBlbnRpcmUgaW5kZXggaXMgc2Nhbm5lZCB0byBmaW5kIGEgbWF0Y2ggZm9yIHRoZSBxdWVyeS4gTm90ZTogVGhlIG1haW4gYWR2YW50YWdlIGlzIHRoYXQgdGhpcyBhdm9pZHMgc29ydGluZy4gVGhlIGJpZ2dlc3QgZGlzYWR2YW50YWdlIGlzIHRoZSBjb3N0IG9mIHJlYWRpbmcgYW4gZW50aXJlIHRhYmxlIGluIGluZGV4IG9yZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYWNjZXNzaW5nIHRoZSByb3dzIGluIHJhbmRvbSBvcmRlciwgd2hpY2ggaXMgdmVyeSBleHBlbnNpdmUuJyxcbiAgICBpbmRleF9tZXJnZTogJ1RoaXMgam9pbiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBJbmRleCBNZXJnZSBvcHRpbWl6YXRpb24gaXMgdXNlZC4gSW4gdGhpcyBjYXNlLCB0aGUga2V5IGNvbHVtbiBpbiB0aGUgb3V0cHV0IHJvdyBjb250YWlucyBhIGxpc3Qgb2YgaW5kZXhlcyB1c2VkLiBJdCBpbmRpY2F0ZXMgYSBxdWVyeSBjYW4gbWFrZSBsaW1pdGVkIHVzZSBvZiBtdWx0aXBsZSBpbmRleGVzIG9uIGEgc2luZ2xlIHRhYmxlLicsXG4gICAgcmFuZ2U6ICdUaGlzIHR5cGUgcmVwbGFjZXMgZXFfcmVmIGZvciBzb21lIElOIHN1YnF1ZXJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtOiB2YWx1ZSBJTiAoU0VMRUNUIHByaW1hcnlfa2V5IEZST00gc2luZ2xlX3RhYmxlIFdIRVJFIHNvbWVfZXhwciknLFxuICAgIHVuaXF1ZV9zdWJxdWVyeTogJycsXG4gICAgQUxMOiAnTXlTUUwgc2NhbnMgdGhlIGVudGlyZSB0YWJsZSB0byBzYXRpc2Z5IHRoZSBxdWVyeScsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgX2RhdGE6IGFueSxcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcbiAgKSB7XG4gICAgdGhpcy5xdWVyeUxvZyA9IF9kYXRhLnF1ZXJ5TG9nO1xuICB9XG5cbiAgcHVibGljIG9wZW5FeHBsYWluKCkge1xuICAgIHRoaXMuX2RpYWxvZy5vcGVuKEV4cGxhaW5Db21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgZXhwbGFpbjogdGhpcy5leHBsYWluIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4cGxhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlMb2cuZXhwbGFpbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcXVlcnlCbG9jaygpIHtcbiAgICByZXR1cm4gdGhpcy5leHBsYWluPy5xdWVyeUJsb2NrO1xuICB9XG5cbiAgcHVibGljIGdldCBvcmRlcmluZ09wZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeUJsb2NrPy5vcmRlcmluZ09wZXJhdGlvbjtcbiAgfVxufVxuIiwiPGZzLWRpYWxvZz5cbiAgPGgxIG1hdC1kaWFsb2ctdGl0bGU+UXVlcnkgTG9nPC9oMT5cbiAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sZy53cmFwLmFsaWduLXN0YXJ0XCI+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5EdXJhdGlvbjwvZnMtbGFiZWw+XG4gICAgICAgIHt7cXVlcnlMb2cuZHVyYXRpb259fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+T3B0aW1pemVkPC9mcy1sYWJlbD5cbiAgICAgICAge3txdWVyeUxvZy5vcHRpbWl6ZWQgPyAnWWVzJyA6ICdObyd9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+UXVlcnkgQ29zdDwvZnMtbGFiZWw+XG4gICAgICAgIHt7cXVlcnlMb2cucXVlcnlDb3N0fX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlJhdyBFeHBsYWluPC9mcy1sYWJlbD5cbiAgICAgICAgPGEgKGNsaWNrKT1cIm9wZW5FeHBsYWluKClcIj5WaWV3PC9hPlxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+VVJMPC9mcy1sYWJlbD5cbiAgICAgICAge3txdWVyeUxvZy5wYXRoIHwgZnNGb3JtYXRUcnVuY2F0ZTogNTB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtdGFiLWdyb3VwPlxuICAgICAgPG1hdC10YWIgbGFiZWw9XCJRdWVyeVwiPlxuICAgICAgICA8ZnMtY2xpcGJvYXJkLWJ1dHRvblxuICAgICAgICAgIFtjb250ZW50XT1cInF1ZXJ5TG9nLnByZXR0eVF1ZXJ5XCI+XG4gICAgICAgIDwvZnMtY2xpcGJvYXJkLWJ1dHRvbj5cbiAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cInF1ZXJ5TG9nLnByZXR0eVF1ZXJ5XCIgY2xhc3M9XCJxdWVyeVwiPjwvZGl2PlxuICAgICAgPC9tYXQtdGFiPlxuICAgICAgXG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIkV4cGxhaW5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXN0ZWRMb29wXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jaywgc2VsZWN0SWQ6IHF1ZXJ5QmxvY2suc2VsZWN0SWQsIGNvc3RJbmZvOiBxdWVyeUJsb2NrLmNvc3RJbmZvIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbWF0LXRhYj5cbiAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJ1bmRlZmluZWRcIj5cbiAgICAgIERvbmVcbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG48L2ZzLWRpYWxvZz5cblxuPG5nLXRlbXBsYXRlICNuZXN0ZWRMb29wIGxldC1xdWVyeUJsb2NrPVwicXVlcnlCbG9ja1wiIGxldC1zZWxlY3RJZD1cInNlbGVjdElkXCIgbGV0LWNvc3RJbmZvPVwiY29zdEluZm9cIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdElkXCI+XG4gICAgPGgxPlNlbGVjdCB7e3NlbGVjdElkfX08L2gxPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgXG4gIDxkaXYgY2xhc3M9XCJmcy1yb3cuZ2FwLWxnLndyYXAuYWxpZ24tc3RhcnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29zdEluZm8/LnF1ZXJ5Q29zdFwiPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+UXVlcnkgQ29zdDwvZnMtbGFiZWw+XG4gICAgICAgIHt7Y29zdEluZm8ucXVlcnlDb3N0fX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sub3JkZXJpbmdPcGVyYXRpb25cIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPk9yZGVyaW5nIE9wZXJhdGlvbjwvZnMtbGFiZWw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5vcmRlcmluZ09wZXJhdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2suZ3JvdXBpbmdPcGVyYXRpb25cIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPkdyb3VwaW5nIE9wZXJhdGlvbjwvZnMtbGFiZWw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5ncm91cGluZ09wZXJhdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2suZHVwbGljYXRlc1JlbW92YWxcIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPkR1cGxpY2F0ZXMgUmVtb3ZhbDwvZnMtbGFiZWw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5kdXBsaWNhdGVzUmVtb3ZhbCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5vcmRlcmluZ09wZXJhdGlvblwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2sub3JkZXJpbmdPcGVyYXRpb24gfVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5ncm91cGluZ09wZXJhdGlvblwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2suZ3JvdXBpbmdPcGVyYXRpb24gfVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5kdXBsaWNhdGVzUmVtb3ZhbFwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2suZHVwbGljYXRlc1JlbW92YWwgfVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay50YWJsZVwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHsgbmVzdGVkTG9vcDogWyBxdWVyeUJsb2NrIF19IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sudGFibGUuYXR0YWNoZWRTdWJxdWVyaWVzXCI+ICBcbiAgICAgIDxmcy1sYWJlbD5BdHRhY2hlZCBTdWJxdWVyaWVzPC9mcy1sYWJlbD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YnF1ZXJ5IG9mIHF1ZXJ5QmxvY2sudGFibGUuYXR0YWNoZWRTdWJxdWVyaWVzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogc3VicXVlcnkucXVlcnlCbG9jayB9XCI+PC9uZy1jb250YWluZXI+IFxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZExvb3BcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBzdWJxdWVyeS5xdWVyeUJsb2NrLCBzZWxlY3RJZDogc3VicXVlcnkucXVlcnlCbG9jay5zZWxlY3RJZCwgY29zdEluZm86IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2suY29zdEluZm8gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+ICAgIFxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5uZXN0ZWRMb29wXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwiZnMtbGlzdC10YWJsZSBzdHlsZS1saW5lXCI+XG4gICAgICAgPHRoZWFkPlxuICAgICAgICAgPHRyPlxuICAgICAgICAgICA8dGg+VGFibGU8L3RoPlxuICAgICAgICAgICA8dGg+VHlwZTwvdGg+XG4gICAgICAgICAgIDx0aD5LZXlzPC90aD5cbiAgICAgICAgICAgPHRoPlJlZjwvdGg+XG4gICAgICAgICAgIDx0aD5Sb3dzPC90aD5cbiAgICAgICAgICAgPHRoPkZpbHRlcmVkPC90aD5cbiAgICAgICAgICAgPHRoPkV4dHJhPC90aD5cbiAgICAgICAgICAgPHRoPkNvc3Q8L3RoPlxuICAgICAgICAgPC90cj5cbiAgICAgICA8L3RoZWFkPlxuICAgICAgIDx0Ym9keT5cbiAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcXVlcnlCbG9jay5uZXN0ZWRMb29wOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAge3tpdGVtLnRhYmxlLnRhYmxlTmFtZX19XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICA8ZnMtcG9wb3ZlciBbdGVtcGxhdGVdPVwiYWNjZXNzVHlwZVBvcG92ZXJcIiBbZGF0YV09XCJpdGVtLnRhYmxlLmFjY2Vzc1R5cGVcIj5cbiAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2Nlc3MtdHlwZVwiIFtuZ0NsYXNzXT1cIml0ZW0udGFibGUuYWNjZXNzVHlwZVwiPnt7aXRlbS50YWJsZS5hY2Nlc3NUeXBlfX08L3NwYW4+XG4gICAgICAgICAgICAgICA8L2ZzLXBvcG92ZXI+ICAgICAgICAgICAgXG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICA8ZnMtcG9wb3ZlciAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwia2V5c1BvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgIFttYXhXaWR0aF09XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJ7IHBvc3NpYmxlS2V5czogaXRlbS50YWJsZS5wb3NzaWJsZUtleXMsIGtleTogaXRlbS50YWJsZS5rZXkgfVwiPlxuICAgICAgICAgICAgICAgICB7e2l0ZW0udGFibGUua2V5fX1cbiAgICAgICAgICAgICAgIDwvZnMtcG9wb3Zlcj5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1kZWxpbWl0XCI+XG4gICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlZiBvZiBpdGVtLnRhYmxlLnJlZlwiPlxuICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cmVmfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICB7e2l0ZW0udGFibGUucm93c0V4YW1pbmVkUGVyU2Nhbn19XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICB7e2l0ZW0udGFibGUuZmlsdGVyZWR9fVxuICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWRlbGltaXRcIj5cbiAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGFibGUuaW5kZXhDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgIDxmcy1wb3BvdmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ1c2luZ0luZGV4Q29uZGl0aW9uXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW21heFdpZHRoXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIml0ZW0udGFibGUuaW5kZXhDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgSW5kZXggQ29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICA8L2ZzLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGFibGUuYXR0YWNoZWRDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgIDxmcy1wb3BvdmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ1c2luZ1doZXJlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW21heFdpZHRoXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIml0ZW0udGFibGUuYXR0YWNoZWRDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgV2hlcmVcbiAgICAgICAgICAgICAgICAgICAgIDwvZnMtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS51c2luZ0luZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgPHNwYW4+VXNpbmcgSW5kZXg8L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAgICBcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS51c2luZ0ZpbGVzb3J0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyaXRpY2FsXCI+VXNpbmcgRmlsZSBTb3J0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnVzaW5nVGVtcG9yYXJ5VGFibGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3JpdGljYWxcIj5UZW1wb3JhcnkgVGFibGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD4gICAgIFxuICAgICAgICAgICAgICA8ZnMtcG9wb3ZlciBbdGVtcGxhdGVdPVwidGFibGVDb3N0UG9wb3ZlclwiIFtkYXRhXT1cIml0ZW0udGFibGU/LmNvc3RJbmZvXCI+XG4gICAgICAgICAgICAgICAge3tpdGVtLnRhYmxlPy5jb3N0SW5mby5wcmVmaXhDb3N0fX1cbiAgICAgICAgICAgICAgPC9mcy1wb3BvdmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RhYmxlQ29zdFBvcG92ZXIgbGV0LWRhdGE9XCJkYXRhXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5FdmFsIENvc3Q6IHt7ZGF0YS5ldmFsQ29zdH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5SZWFkIENvc3Q6IHt7ZGF0YS5yZWFkQ29zdH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5QcmVmaXggQ29zdDoge3tkYXRhLnByZWZpeENvc3R9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+RGF0YSBSZWFkIFBlciBKb2luOiB7e2RhdGEuZGF0YVJlYWRQZXJKb2lufX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICA8L3RyPlxuICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgPC90Ym9keT5cbiAgICAgPC90YWJsZT5cbiAgICAgPGJyPlxuICAgPC9uZy1jb250YWluZXI+ICBcbiAgXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLnNlbGVjdExpc3RTdWJxdWVyaWVzXCI+XG4gICAgPGJyPlxuICAgIDxmcy1sYWJlbD5TZWxlY3QgTGlzdCBTdWJxdWVyaWVzPC9mcy1sYWJlbD5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJxdWVyeSBvZiBxdWVyeUJsb2NrLnNlbGVjdExpc3RTdWJxdWVyaWVzXCI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInF1ZXJ5QmxvY2tDcml0aWNhbFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2sgfVwiPjwvbmctY29udGFpbmVyPiBcbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2ssIHNlbGVjdElkOiBzdWJxdWVyeS5xdWVyeUJsb2NrLnNlbGVjdElkLCBjb3N0SW5mbzogc3VicXVlcnkucXVlcnlCbG9jay5jb3N0SW5mbyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPCEtLSBcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sucXVlcnlCbG9ja2F0dGFjaGVkU3VicXVlcmllc1wiPlxuICAgIDxicj5cbiAgICA8ZnMtbGFiZWw+QXR0YWNoZWQgU3VicXVlcmllczwvZnMtbGFiZWw+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3VicXVlcnkgb2YgcXVlcnlCbG9jay5hdHRhY2hlZFN1YnF1ZXJpZXNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogc3VicXVlcnkucXVlcnlCbG9jayB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZExvb3BcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBzdWJxdWVyeS5xdWVyeUJsb2NrIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+IC0tPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNrZXlzUG9wb3ZlciBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImZzLWRlbGltaXRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwb3NzaWJsZUtleSBvZiBkYXRhLnBvc3NpYmxlS2V5c1wiPlxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyAncXVlcnktbG9nLXVzZWQta2V5JzogcG9zc2libGVLZXkgPT09IGRhdGEua2V5IH1cIj57e3Bvc3NpYmxlS2V5fX08L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN1c2luZ1doZXJlIGxldC1kYXRhPVwiZGF0YVwiPlxuICB7e2RhdGF9fVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN1c2luZ0luZGV4Q29uZGl0aW9uIGxldC1kYXRhPVwiZGF0YVwiPlxuICB7e2RhdGF9fVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhY2Nlc3NUeXBlUG9wb3ZlciBsZXQtZGF0YT1cImRhdGFcIj5cbiAge3thY2Nlc3NUeXBlc1tkYXRhXX19XG48L25nLXRlbXBsYXRlPlxuXG5cbjxuZy10ZW1wbGF0ZSAjcXVlcnlCbG9ja0NyaXRpY2FsIGxldC1xdWVyeUJsb2NrPVwicXVlcnlCbG9ja1wiPlxuICA8ZGl2IGNsYXNzPVwiZnMtZGVsaW1pdFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLnVzaW5nRmlsZXNvcnRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3JpdGljYWxcIj5Vc2luZyBGaWxlIFNvcnQ8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sudXNpbmdUZW1wb3JhcnlUYWJsZVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcml0aWNhbFwiPlRlbXBvcmFyeSBUYWJsZTwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==
@@ -23,12 +23,12 @@ export class ApiLogComponent {
23
23
  }
24
24
  }
25
25
  ApiLogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiLogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
26
- ApiLogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiLogComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog *fsSkeleton=\"apiLog\">\n\n <div mat-dialog-title>API Log</div>\n\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.wrap\">\n <div>\n <fs-label-field>\n <fs-label>\n Type\n </fs-label>\n {{apiLog.type}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{apiLogStates[apiLog.state]}}\n </fs-label-field>\n\n\n <fs-label-field *ngIf=\"apiLog.code\">\n <fs-label>\n Code\n </fs-label>\n {{apiLog.code}}\n </fs-label-field>\n\n </div>\n <div>\n <fs-label-field>\n <fs-label>\n Date\n </fs-label>\n {{apiLog.createDate|fsDateFormat: 'full-date-time'}}\n </fs-label-field>\n\n\n <fs-label-field *ngIf=\"apiLog.direction\">\n <fs-label>\n Direction\n </fs-label>\n {{apiLog.direction}}\n </fs-label-field>\n\n\n <fs-label-field *ngIf=\"apiLog.length\">\n <fs-label>\n Duration\n </fs-label>\n {{ apiLog.length | fsDateDuration }}\n </fs-label-field>\n </div>\n </div>\n\n <div>\n <fs-label-field *ngIf=\"apiLog.message\">\n <fs-label>\n Message\n </fs-label>\n {{apiLog.message}}\n </fs-label-field>\n </div>\n\n\n <div class=\"fs-row.gap-large.wrap\">\n <div>\n <fs-label-field *ngIf=\"apiLog.method\">\n <fs-label>\n Method\n </fs-label>\n {{apiLog.method}}\n </fs-label-field>\n </div>\n <div>\n <fs-label-field *ngIf=\"apiLog.url\">\n <fs-label>\n URL\n </fs-label>\n {{apiLog.url}}\n </fs-label-field>\n </div>\n </div>\n\n <div>\n <fs-label-field *ngIf=\"apiLog.request\">\n <fs-label>\n Request\n </fs-label>\n <pre>{{apiLog.request|json}}</pre>\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.response\">\n <fs-label>\n Response\n </fs-label>\n <pre>{{apiLog.response|json}}</pre>\n </fs-label-field>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions>\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">Done</button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [""], components: [{ type: i2.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { type: i3.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i3.FsLabelComponent, selector: "fs-label" }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i5.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }], pipes: { "fsDateFormat": i7.FsDateFormatPipe, "fsDateDuration": i7.FsDateDurationPipe, "json": i6.JsonPipe } });
26
+ ApiLogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiLogComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog *fsSkeleton=\"apiLog\">\n\n <div mat-dialog-title>API Log</div>\n\n <mat-dialog-content>\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>\n Type\n </fs-label>\n {{apiLog.type}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{apiLogStates[apiLog.state]}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.code\">\n <fs-label>\n Code\n </fs-label>\n {{apiLog.code}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Date\n </fs-label>\n {{apiLog.createDate|fsDateFormat: 'full-date-time'}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.direction\">\n <fs-label>\n Direction\n </fs-label>\n {{apiLog.direction}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.length\">\n <fs-label>\n Duration\n </fs-label>\n {{ apiLog.length | fsDateDuration }}\n </fs-label-field>\n\n <ng-container *ngIf=\"apiLog.method\">\n <fs-label-field *ngIf=\"apiLog.method\">\n <fs-label>\n Method\n </fs-label>\n {{apiLog.method}}\n </fs-label-field>\n </ng-container>\n \n <fs-label-field *ngIf=\"apiLog.url\">\n <fs-label>\n URL\n </fs-label>\n {{apiLog.url}}\n </fs-label-field>\n </div>\n\n <fs-label-field *ngIf=\"apiLog.message\">\n <fs-label>\n Message\n </fs-label>\n {{apiLog.message}}\n </fs-label-field>\n\n <div>\n <fs-label-field *ngIf=\"apiLog.request\">\n <fs-label>\n Request\n </fs-label>\n <pre>{{apiLog.request|json}}</pre>\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.response\">\n <fs-label>\n Response\n </fs-label>\n <pre>{{apiLog.response|json}}</pre>\n </fs-label-field>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button \n mat-button \n [mat-dialog-close]=\"true\" \n color=\"primary\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [""], components: [{ type: i2.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { type: i3.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i3.FsLabelComponent, selector: "fs-label" }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i5.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }], pipes: { "fsDateFormat": i7.FsDateFormatPipe, "fsDateDuration": i7.FsDateDurationPipe, "json": i6.JsonPipe } });
27
27
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiLogComponent, decorators: [{
28
28
  type: Component,
29
- args: [{ template: "<fs-dialog *fsSkeleton=\"apiLog\">\n\n <div mat-dialog-title>API Log</div>\n\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.wrap\">\n <div>\n <fs-label-field>\n <fs-label>\n Type\n </fs-label>\n {{apiLog.type}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{apiLogStates[apiLog.state]}}\n </fs-label-field>\n\n\n <fs-label-field *ngIf=\"apiLog.code\">\n <fs-label>\n Code\n </fs-label>\n {{apiLog.code}}\n </fs-label-field>\n\n </div>\n <div>\n <fs-label-field>\n <fs-label>\n Date\n </fs-label>\n {{apiLog.createDate|fsDateFormat: 'full-date-time'}}\n </fs-label-field>\n\n\n <fs-label-field *ngIf=\"apiLog.direction\">\n <fs-label>\n Direction\n </fs-label>\n {{apiLog.direction}}\n </fs-label-field>\n\n\n <fs-label-field *ngIf=\"apiLog.length\">\n <fs-label>\n Duration\n </fs-label>\n {{ apiLog.length | fsDateDuration }}\n </fs-label-field>\n </div>\n </div>\n\n <div>\n <fs-label-field *ngIf=\"apiLog.message\">\n <fs-label>\n Message\n </fs-label>\n {{apiLog.message}}\n </fs-label-field>\n </div>\n\n\n <div class=\"fs-row.gap-large.wrap\">\n <div>\n <fs-label-field *ngIf=\"apiLog.method\">\n <fs-label>\n Method\n </fs-label>\n {{apiLog.method}}\n </fs-label-field>\n </div>\n <div>\n <fs-label-field *ngIf=\"apiLog.url\">\n <fs-label>\n URL\n </fs-label>\n {{apiLog.url}}\n </fs-label-field>\n </div>\n </div>\n\n <div>\n <fs-label-field *ngIf=\"apiLog.request\">\n <fs-label>\n Request\n </fs-label>\n <pre>{{apiLog.request|json}}</pre>\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.response\">\n <fs-label>\n Response\n </fs-label>\n <pre>{{apiLog.response|json}}</pre>\n </fs-label-field>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions>\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">Done</button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [""] }]
29
+ args: [{ template: "<fs-dialog *fsSkeleton=\"apiLog\">\n\n <div mat-dialog-title>API Log</div>\n\n <mat-dialog-content>\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>\n Type\n </fs-label>\n {{apiLog.type}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{apiLogStates[apiLog.state]}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.code\">\n <fs-label>\n Code\n </fs-label>\n {{apiLog.code}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Date\n </fs-label>\n {{apiLog.createDate|fsDateFormat: 'full-date-time'}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.direction\">\n <fs-label>\n Direction\n </fs-label>\n {{apiLog.direction}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.length\">\n <fs-label>\n Duration\n </fs-label>\n {{ apiLog.length | fsDateDuration }}\n </fs-label-field>\n\n <ng-container *ngIf=\"apiLog.method\">\n <fs-label-field *ngIf=\"apiLog.method\">\n <fs-label>\n Method\n </fs-label>\n {{apiLog.method}}\n </fs-label-field>\n </ng-container>\n \n <fs-label-field *ngIf=\"apiLog.url\">\n <fs-label>\n URL\n </fs-label>\n {{apiLog.url}}\n </fs-label-field>\n </div>\n\n <fs-label-field *ngIf=\"apiLog.message\">\n <fs-label>\n Message\n </fs-label>\n {{apiLog.message}}\n </fs-label-field>\n\n <div>\n <fs-label-field *ngIf=\"apiLog.request\">\n <fs-label>\n Request\n </fs-label>\n <pre>{{apiLog.request|json}}</pre>\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.response\">\n <fs-label>\n Response\n </fs-label>\n <pre>{{apiLog.response|json}}</pre>\n </fs-label-field>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button \n mat-button \n [mat-dialog-close]=\"true\" \n color=\"primary\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [""] }]
30
30
  }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
31
31
  type: Inject,
32
32
  args: [MAT_DIALOG_DATA]
33
33
  }] }]; } });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvYXBpLWxvZy9hcGktbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9hcGktbG9nL2FwaS1sb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7O0FBT2hFLE1BQU0sT0FBTyxlQUFlO0lBSzFCLFlBQW9CLFVBQXlDLEVBQ2pCLElBQUk7UUFENUIsZUFBVSxHQUFWLFVBQVUsQ0FBK0I7UUFDakIsU0FBSSxHQUFKLElBQUksQ0FBQTtJQUFHLENBQUM7SUFFN0MsUUFBUTtRQUViLElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWpELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNoQztJQUNILENBQUM7OzRHQWZVLGVBQWUsOENBTU4sZUFBZTtnR0FOeEIsZUFBZSxvRENWNUIsMjRFQTBHQTsyRkRoR2EsZUFBZTtrQkFKM0IsU0FBUzs7OzBCQVVLLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBBcGlMb2dTdGF0ZXMgfSBmcm9tICcuLi8uLi9jb25zdHMnO1xyXG5pbXBvcnQgeyBpbmRleE5hbWVWYWx1ZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5kZXgtbmFtZS12YWx1ZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FwaS1sb2cuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FwaS1sb2cuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBpTG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgcHVibGljIGFwaUxvZztcclxuICBwdWJsaWMgYXBpTG9nU3RhdGVzO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxBcGlMb2dDb21wb25lbnQ+LFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YSkge31cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuYXBpTG9nU3RhdGVzID0gaW5kZXhOYW1lVmFsdWUoQXBpTG9nU3RhdGVzKTtcclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLmFwaUxvZykge1xyXG4gICAgICB0aGlzLmFwaUxvZyA9IHRoaXMuZGF0YS5hcGlMb2c7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxmcy1kaWFsb2cgKmZzU2tlbGV0b249XCJhcGlMb2dcIj5cblxuICA8ZGl2IG1hdC1kaWFsb2ctdGl0bGU+QVBJIExvZzwvZGl2PlxuXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImZzLXJvdy5nYXAtbGFyZ2Uud3JhcFwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgIFR5cGVcbiAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgIHt7YXBpTG9nLnR5cGV9fVxuICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICBTdGF0dXNcbiAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgIHt7YXBpTG9nU3RhdGVzW2FwaUxvZy5zdGF0ZV19fVxuICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG5cbiAgICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYXBpTG9nLmNvZGVcIj5cbiAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICBDb2RlXG4gICAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgICB7e2FwaUxvZy5jb2RlfX1cbiAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgICAgRGF0ZVxuICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAge3thcGlMb2cuY3JlYXRlRGF0ZXxmc0RhdGVGb3JtYXQ6ICdmdWxsLWRhdGUtdGltZSd9fVxuICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG5cbiAgICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYXBpTG9nLmRpcmVjdGlvblwiPlxuICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgIERpcmVjdGlvblxuICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAge3thcGlMb2cuZGlyZWN0aW9ufX1cbiAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuXG4gICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICBEdXJhdGlvblxuICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAge3sgYXBpTG9nLmxlbmd0aCB8IGZzRGF0ZUR1cmF0aW9uIH19XG4gICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXY+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJhcGlMb2cubWVzc2FnZVwiPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgTWVzc2FnZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7e2FwaUxvZy5tZXNzYWdlfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9kaXY+XG5cblxuICAgIDxkaXYgY2xhc3M9XCJmcy1yb3cuZ2FwLWxhcmdlLndyYXBcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy5tZXRob2RcIj5cbiAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICBNZXRob2RcbiAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgIHt7YXBpTG9nLm1ldGhvZH19XG4gICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy51cmxcIj5cbiAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICBVUkxcbiAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgIHt7YXBpTG9nLnVybH19XG4gICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXY+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJhcGlMb2cucmVxdWVzdFwiPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgUmVxdWVzdFxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICA8cHJlPnt7YXBpTG9nLnJlcXVlc3R8anNvbn19PC9wcmU+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJhcGlMb2cucmVzcG9uc2VcIj5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIFJlc3BvbnNlXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIDxwcmU+e3thcGlMb2cucmVzcG9uc2V8anNvbn19PC9wcmU+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvZGl2PlxuICA8L21hdC1kaWFsb2ctY29udGVudD5cblxuICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJ0cnVlXCIgY29sb3I9XCJwcmltYXJ5XCI+RG9uZTwvYnV0dG9uPlxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbjwvZnMtZGlhbG9nPlxuIl19
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvYXBpLWxvZy9hcGktbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9hcGktbG9nL2FwaS1sb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7O0FBT2hFLE1BQU0sT0FBTyxlQUFlO0lBSzFCLFlBQW9CLFVBQXlDLEVBQ2pCLElBQUk7UUFENUIsZUFBVSxHQUFWLFVBQVUsQ0FBK0I7UUFDakIsU0FBSSxHQUFKLElBQUksQ0FBQTtJQUFHLENBQUM7SUFFN0MsUUFBUTtRQUViLElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWpELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNoQztJQUNILENBQUM7OzRHQWZVLGVBQWUsOENBTU4sZUFBZTtnR0FOeEIsZUFBZSxvRENWNUIsdXVFQWlHQTsyRkR2RmEsZUFBZTtrQkFKM0IsU0FBUzs7OzBCQVVLLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBBcGlMb2dTdGF0ZXMgfSBmcm9tICcuLi8uLi9jb25zdHMnO1xyXG5pbXBvcnQgeyBpbmRleE5hbWVWYWx1ZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5kZXgtbmFtZS12YWx1ZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FwaS1sb2cuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FwaS1sb2cuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBpTG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgcHVibGljIGFwaUxvZztcclxuICBwdWJsaWMgYXBpTG9nU3RhdGVzO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxBcGlMb2dDb21wb25lbnQ+LFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YSkge31cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuYXBpTG9nU3RhdGVzID0gaW5kZXhOYW1lVmFsdWUoQXBpTG9nU3RhdGVzKTtcclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLmFwaUxvZykge1xyXG4gICAgICB0aGlzLmFwaUxvZyA9IHRoaXMuZGF0YS5hcGlMb2c7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxmcy1kaWFsb2cgKmZzU2tlbGV0b249XCJhcGlMb2dcIj5cblxuICA8ZGl2IG1hdC1kaWFsb2ctdGl0bGU+QVBJIExvZzwvZGl2PlxuXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImZzLXJvdy5nYXAtbGcud3JhcC5hbGlnbi1zdGFydFwiPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgVHlwZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7e2FwaUxvZy50eXBlfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIFN0YXR1c1xuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7e2FwaUxvZ1N0YXRlc1thcGlMb2cuc3RhdGVdfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy5jb2RlXCI+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBDb2RlXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7YXBpTG9nLmNvZGV9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgRGF0ZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7e2FwaUxvZy5jcmVhdGVEYXRlfGZzRGF0ZUZvcm1hdDogJ2Z1bGwtZGF0ZS10aW1lJ319XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJhcGlMb2cuZGlyZWN0aW9uXCI+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBEaXJlY3Rpb25cbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3thcGlMb2cuZGlyZWN0aW9ufX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy5sZW5ndGhcIj5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIER1cmF0aW9uXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGFwaUxvZy5sZW5ndGggfCBmc0RhdGVEdXJhdGlvbiB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFwaUxvZy5tZXRob2RcIj5cbiAgICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYXBpTG9nLm1ldGhvZFwiPlxuICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgIE1ldGhvZFxuICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAge3thcGlMb2cubWV0aG9kfX1cbiAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYXBpTG9nLnVybFwiPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgVVJMXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7YXBpTG9nLnVybH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYXBpTG9nLm1lc3NhZ2VcIj5cbiAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgTWVzc2FnZVxuICAgICAgPC9mcy1sYWJlbD5cbiAgICAgIHt7YXBpTG9nLm1lc3NhZ2V9fVxuICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICA8ZGl2PlxuICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYXBpTG9nLnJlcXVlc3RcIj5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIFJlcXVlc3RcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgPHByZT57e2FwaUxvZy5yZXF1ZXN0fGpzb259fTwvcHJlPlxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYXBpTG9nLnJlc3BvbnNlXCI+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBSZXNwb25zZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICA8cHJlPnt7YXBpTG9nLnJlc3BvbnNlfGpzb259fTwvcHJlPlxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvbiBcbiAgICAgICAgbWF0LWJ1dHRvbiBcbiAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiIFxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgIERvbmVcbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG48L2ZzLWRpYWxvZz5cbiJdfQ==
@@ -94,12 +94,12 @@ export class CronComponent {
94
94
  }
95
95
  }
96
96
  CronComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CronComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialog }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
97
- CronComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: CronComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog *fsSkeleton=\"cron\">\n <h1 mat-dialog-title>\n Cron\n <div class=\"small\">{{cron.name}}</div>\n </h1>\n <mat-dialog-content>\n <mat-tab-group (selectedIndexChange)=\"selectedIndexChange($event)\">\n <mat-tab label=\"Overview\">\n <div class=\"row\">\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{CronStates[cron.state]}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"cron.cronSetting\">\n <fs-label>\n Run Frequency\n </fs-label>\n {{cron.cronSetting.summary}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Process ID\n </fs-label>\n {{cron.processId || 'None'}}\n <ng-container *ngIf=\"cron.processId\">\n <div class=\"small\">\n {{CronProcessStates[cron.processState] || 'Unknown'}}\n </div>\n </ng-container>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Last Ran\n </fs-label>\n <ng-container *ngIf=\"cron.duration===null; else lastRan\">\n Never\n </ng-container>\n <ng-template #lastRan>\n <fs-date-ago [date]=\"cron.createDate\"></fs-date-ago>\n <div><small *ngIf=\"cron.duration\">Duration: {{ cron.duration | fsDateDuration }}</small></div>\n </ng-template>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Timeout hours\n </fs-label>\n {{cron.cronSetting?.timeout || 'N/A'}}\n </fs-label-field>\n </div>\n\n <fs-label-field *ngIf=\"cron.message\">\n <fs-label>\n Last Message\n </fs-label>\n <div class=\"message\">{{cron.message}}</div>\n </fs-label-field>\n </mat-tab>\n <mat-tab label=\"Logs\" *ngIf=\"config\">\n <ng-template matTabContent>\n <fs-list [config]=\"config\">\n <fs-list-column name=\"state\" title=\"Status\">\n <ng-template fs-list-cell let-row=\"row\">\n <a \n (click)=\"cronLogOpen(row)\"\n [ngStyle]=\"{ color: CronLogStateColors[row.state] }\">\n {{CronLogStates[row.state] || row.state}}\n </a>\n </ng-template>\n </fs-list-column>\n \n <fs-list-column title=\"Message\" class=\"col-message\">\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"message\">{{row.message}}</div>\n </ng-template>\n </fs-list-column>\n \n <fs-list-column title=\"Duration\" class=\"col-message\">\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.duration\">\n {{row.duration | fsDateDuration: 'hour-minute-second'}}\n </ng-container>\n </ng-template>\n </fs-list-column>\n\n <fs-list-column name=\"create_date\" title=\"Date\" class=\"col-date\">\n <ng-template fs-list-cell let-row=\"row\">\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n </ng-template>\n </fs-list-column>\n </fs-list> \n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions> \n <button \n mat-button \n [mat-dialog-close]=\"true\" \n color=\"primary\">\n Done\n </button>\n <ng-container *ngIf=\"tabIndex === 0\">\n <button \n *ngFor=\"let cronAction of cronActions\"\n mat-button \n (click)=\"cronActionClick(cronAction)\">\n {{cronAction.label}}\n </button> \n </ng-container>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [":host ::ng-deep .col-message .message{white-space:break-spaces;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}:host ::ng-deep .col-date{white-space:nowrap}h1 .small{line-height:normal}.row{display:flex;flex-wrap:wrap}.row fs-label-field:not(:last-child){margin-right:40px}.message{white-space:pre-line}\n"], components: [{ type: i2.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { type: i4.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i4.FsLabelComponent, selector: "fs-label" }, { type: i5.FsDateAgoComponent, selector: "fs-date-ago", inputs: ["date", "showTime", "format", "showTooltip", "tooltipDateFormat"] }, { type: i6.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i8.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.MatTabContent, selector: "[matTabContent]" }, { type: i6.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i6.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "fsDateDuration": i5.FsDateDurationPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
97
+ CronComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: CronComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog *fsSkeleton=\"cron\">\n <h1 mat-dialog-title>\n Cron\n <div class=\"small\">{{cron.name}}</div>\n </h1>\n <mat-dialog-content>\n <mat-tab-group (selectedIndexChange)=\"selectedIndexChange($event)\">\n <mat-tab label=\"Overview\">\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{CronStates[cron.state]}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"cron.cronSetting\">\n <fs-label>\n Run Frequency\n </fs-label>\n {{cron.cronSetting.summary}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Process ID\n </fs-label>\n {{cron.processId || 'None'}}\n <ng-container *ngIf=\"cron.processId\">\n <div class=\"small\">\n {{CronProcessStates[cron.processState] || 'Unknown'}}\n </div>\n </ng-container>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Last Ran\n </fs-label>\n <ng-container *ngIf=\"cron.duration===null; else lastRan\">\n Never\n </ng-container>\n <ng-template #lastRan>\n <fs-date-ago [date]=\"cron.createDate\"></fs-date-ago>\n <div><small *ngIf=\"cron.duration\">Duration: {{ cron.duration | fsDateDuration }}</small></div>\n </ng-template>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Timeout hours\n </fs-label>\n {{cron.cronSetting?.timeout || 'N/A'}}\n </fs-label-field>\n </div>\n\n <fs-label-field *ngIf=\"cron.message\">\n <fs-label>\n Last Message\n </fs-label>\n <div class=\"message\">{{cron.message}}</div>\n </fs-label-field>\n </mat-tab>\n <mat-tab label=\"Logs\" *ngIf=\"config\">\n <ng-template matTabContent>\n <fs-list [config]=\"config\">\n <fs-list-column name=\"state\" title=\"Status\">\n <ng-template fs-list-cell let-row=\"row\">\n <a \n (click)=\"cronLogOpen(row)\"\n [ngStyle]=\"{ color: CronLogStateColors[row.state] }\">\n {{CronLogStates[row.state] || row.state}}\n </a>\n </ng-template>\n </fs-list-column>\n \n <fs-list-column title=\"Message\" class=\"col-message\">\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"message\">{{row.message}}</div>\n </ng-template>\n </fs-list-column>\n \n <fs-list-column title=\"Duration\" class=\"col-message\">\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.duration\">\n {{row.duration | fsDateDuration: 'hour-minute-second'}}\n </ng-container>\n </ng-template>\n </fs-list-column>\n\n <fs-list-column name=\"create_date\" title=\"Date\" class=\"col-date\">\n <ng-template fs-list-cell let-row=\"row\">\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n </ng-template>\n </fs-list-column>\n </fs-list> \n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions> \n <button \n mat-button \n [mat-dialog-close]=\"true\" \n color=\"primary\">\n Done\n </button>\n <ng-container *ngIf=\"tabIndex === 0\">\n <button \n *ngFor=\"let cronAction of cronActions\"\n mat-button \n (click)=\"cronActionClick(cronAction)\">\n {{cronAction.label}}\n </button> \n </ng-container>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [":host ::ng-deep .col-message .message{white-space:break-spaces;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}:host ::ng-deep .col-date{white-space:nowrap}h1 .small{line-height:normal}.row{display:flex;flex-wrap:wrap}.row fs-label-field:not(:last-child){margin-right:40px}.message{white-space:pre-line}\n"], components: [{ type: i2.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { type: i4.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i4.FsLabelComponent, selector: "fs-label" }, { type: i5.FsDateAgoComponent, selector: "fs-date-ago", inputs: ["date", "showTime", "format", "showTooltip", "tooltipDateFormat"] }, { type: i6.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i8.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.MatTabContent, selector: "[matTabContent]" }, { type: i6.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i6.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "fsDateDuration": i5.FsDateDurationPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
98
98
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CronComponent, decorators: [{
99
99
  type: Component,
100
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<fs-dialog *fsSkeleton=\"cron\">\n <h1 mat-dialog-title>\n Cron\n <div class=\"small\">{{cron.name}}</div>\n </h1>\n <mat-dialog-content>\n <mat-tab-group (selectedIndexChange)=\"selectedIndexChange($event)\">\n <mat-tab label=\"Overview\">\n <div class=\"row\">\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{CronStates[cron.state]}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"cron.cronSetting\">\n <fs-label>\n Run Frequency\n </fs-label>\n {{cron.cronSetting.summary}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Process ID\n </fs-label>\n {{cron.processId || 'None'}}\n <ng-container *ngIf=\"cron.processId\">\n <div class=\"small\">\n {{CronProcessStates[cron.processState] || 'Unknown'}}\n </div>\n </ng-container>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Last Ran\n </fs-label>\n <ng-container *ngIf=\"cron.duration===null; else lastRan\">\n Never\n </ng-container>\n <ng-template #lastRan>\n <fs-date-ago [date]=\"cron.createDate\"></fs-date-ago>\n <div><small *ngIf=\"cron.duration\">Duration: {{ cron.duration | fsDateDuration }}</small></div>\n </ng-template>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Timeout hours\n </fs-label>\n {{cron.cronSetting?.timeout || 'N/A'}}\n </fs-label-field>\n </div>\n\n <fs-label-field *ngIf=\"cron.message\">\n <fs-label>\n Last Message\n </fs-label>\n <div class=\"message\">{{cron.message}}</div>\n </fs-label-field>\n </mat-tab>\n <mat-tab label=\"Logs\" *ngIf=\"config\">\n <ng-template matTabContent>\n <fs-list [config]=\"config\">\n <fs-list-column name=\"state\" title=\"Status\">\n <ng-template fs-list-cell let-row=\"row\">\n <a \n (click)=\"cronLogOpen(row)\"\n [ngStyle]=\"{ color: CronLogStateColors[row.state] }\">\n {{CronLogStates[row.state] || row.state}}\n </a>\n </ng-template>\n </fs-list-column>\n \n <fs-list-column title=\"Message\" class=\"col-message\">\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"message\">{{row.message}}</div>\n </ng-template>\n </fs-list-column>\n \n <fs-list-column title=\"Duration\" class=\"col-message\">\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.duration\">\n {{row.duration | fsDateDuration: 'hour-minute-second'}}\n </ng-container>\n </ng-template>\n </fs-list-column>\n\n <fs-list-column name=\"create_date\" title=\"Date\" class=\"col-date\">\n <ng-template fs-list-cell let-row=\"row\">\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n </ng-template>\n </fs-list-column>\n </fs-list> \n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions> \n <button \n mat-button \n [mat-dialog-close]=\"true\" \n color=\"primary\">\n Done\n </button>\n <ng-container *ngIf=\"tabIndex === 0\">\n <button \n *ngFor=\"let cronAction of cronActions\"\n mat-button \n (click)=\"cronActionClick(cronAction)\">\n {{cronAction.label}}\n </button> \n </ng-container>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [":host ::ng-deep .col-message .message{white-space:break-spaces;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}:host ::ng-deep .col-date{white-space:nowrap}h1 .small{line-height:normal}.row{display:flex;flex-wrap:wrap}.row fs-label-field:not(:last-child){margin-right:40px}.message{white-space:pre-line}\n"] }]
100
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<fs-dialog *fsSkeleton=\"cron\">\n <h1 mat-dialog-title>\n Cron\n <div class=\"small\">{{cron.name}}</div>\n </h1>\n <mat-dialog-content>\n <mat-tab-group (selectedIndexChange)=\"selectedIndexChange($event)\">\n <mat-tab label=\"Overview\">\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{CronStates[cron.state]}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"cron.cronSetting\">\n <fs-label>\n Run Frequency\n </fs-label>\n {{cron.cronSetting.summary}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Process ID\n </fs-label>\n {{cron.processId || 'None'}}\n <ng-container *ngIf=\"cron.processId\">\n <div class=\"small\">\n {{CronProcessStates[cron.processState] || 'Unknown'}}\n </div>\n </ng-container>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Last Ran\n </fs-label>\n <ng-container *ngIf=\"cron.duration===null; else lastRan\">\n Never\n </ng-container>\n <ng-template #lastRan>\n <fs-date-ago [date]=\"cron.createDate\"></fs-date-ago>\n <div><small *ngIf=\"cron.duration\">Duration: {{ cron.duration | fsDateDuration }}</small></div>\n </ng-template>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Timeout hours\n </fs-label>\n {{cron.cronSetting?.timeout || 'N/A'}}\n </fs-label-field>\n </div>\n\n <fs-label-field *ngIf=\"cron.message\">\n <fs-label>\n Last Message\n </fs-label>\n <div class=\"message\">{{cron.message}}</div>\n </fs-label-field>\n </mat-tab>\n <mat-tab label=\"Logs\" *ngIf=\"config\">\n <ng-template matTabContent>\n <fs-list [config]=\"config\">\n <fs-list-column name=\"state\" title=\"Status\">\n <ng-template fs-list-cell let-row=\"row\">\n <a \n (click)=\"cronLogOpen(row)\"\n [ngStyle]=\"{ color: CronLogStateColors[row.state] }\">\n {{CronLogStates[row.state] || row.state}}\n </a>\n </ng-template>\n </fs-list-column>\n \n <fs-list-column title=\"Message\" class=\"col-message\">\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"message\">{{row.message}}</div>\n </ng-template>\n </fs-list-column>\n \n <fs-list-column title=\"Duration\" class=\"col-message\">\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.duration\">\n {{row.duration | fsDateDuration: 'hour-minute-second'}}\n </ng-container>\n </ng-template>\n </fs-list-column>\n\n <fs-list-column name=\"create_date\" title=\"Date\" class=\"col-date\">\n <ng-template fs-list-cell let-row=\"row\">\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n </ng-template>\n </fs-list-column>\n </fs-list> \n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions> \n <button \n mat-button \n [mat-dialog-close]=\"true\" \n color=\"primary\">\n Done\n </button>\n <ng-container *ngIf=\"tabIndex === 0\">\n <button \n *ngFor=\"let cronAction of cronActions\"\n mat-button \n (click)=\"cronActionClick(cronAction)\">\n {{cronAction.label}}\n </button> \n </ng-container>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [":host ::ng-deep .col-message .message{white-space:break-spaces;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}:host ::ng-deep .col-date{white-space:nowrap}h1 .small{line-height:normal}.row{display:flex;flex-wrap:wrap}.row fs-label-field:not(:last-child){margin-right:40px}.message{white-space:pre-line}\n"] }]
101
101
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
102
102
  type: Inject,
103
103
  args: [MAT_DIALOG_DATA]
104
104
  }] }, { type: i1.MatDialog }, { type: i0.ChangeDetectorRef }]; } });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvY3Jvbi9jcm9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9jcm9uL2Nyb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7Ozs7QUFRL0MsTUFBTSxPQUFPLGFBQWE7SUFZeEIsWUFDbUMsS0FBSyxFQUM5QixPQUFrQixFQUNsQixNQUF5QjtRQUZBLFVBQUssR0FBTCxLQUFLLENBQUE7UUFDOUIsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQVo1QixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsZUFBVSxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxzQkFBaUIsR0FBRyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RCxrQkFBYSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5Qyx1QkFBa0IsR0FBRyxFQUFFLENBQUM7SUFTNUIsQ0FBQztJQUVHLFFBQVE7UUFDYixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLENBQUMsa0JBQWtCLEdBQUcsYUFBYTthQUNwQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUU7WUFDOUIsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBRS9DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFPO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ2xDLElBQUksRUFBRTtnQkFDSixPQUFPO2FBQ1I7WUFDRCxLQUFLLEVBQUUsS0FBSztTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxlQUFlLENBQUMsVUFBVTtRQUMvQixVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDekIsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLG1CQUFtQixDQUFDLEtBQUs7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNqQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHO2dCQUNWLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO2dCQUNsQixHQUFHLElBQUk7YUFDUixDQUFDO1lBRUYsSUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRTtnQkFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRztvQkFDWixPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNOzRCQUNyQixJQUFJLEVBQUUsT0FBTzs0QkFDYixLQUFLLEVBQUUsUUFBUTs0QkFDZixNQUFNLEVBQUU7Z0NBQ04sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Z0NBQzVCLEdBQUcsYUFBYTs2QkFDakI7eUJBQ0Y7d0JBQ0Q7NEJBQ0UsSUFBSSxFQUFFLFFBQVEsQ0FBQyxTQUFTOzRCQUN4QixJQUFJLEVBQUUsTUFBTTs0QkFDWixLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDO3lCQUNoQztxQkFDRjtvQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDZixLQUFLLEdBQUc7NEJBQ04sR0FBRyxLQUFLOzRCQUNSLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7eUJBQ3JCLENBQUM7d0JBRUYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEMsQ0FBQztpQkFDRixDQUFDO2FBQ0g7WUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztpQkFDdEMsTUFBTSxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7Z0JBQ3hCLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7WUFFTCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7MEdBNUZVLGFBQWEsa0JBYWQsZUFBZTs4RkFiZCxhQUFhLG9EQ2xCMUIsODVIQXNIQTsyRkRwR2EsYUFBYTtrQkFMekIsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNOzswQkFlNUMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNMaXN0Q29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IENyb25Qcm9jZXNzU3RhdGVzLCBDcm9uU3RhdGVzIH0gZnJvbSAnLi4vLi4vY29uc3RzJztcbmltcG9ydCB7IENyb25Mb2dTdGF0ZXMgfSBmcm9tICcuLi8uLi9jb25zdHMvY3Jvbi1sb2ctc3RhdGVzLmNvbnN0JztcbmltcG9ydCB7IGluZGV4TmFtZVZhbHVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbmRleC1uYW1lLXZhbHVlJztcbmltcG9ydCB7IENyb25Mb2dDb21wb25lbnQgfSBmcm9tICcuLi9jcm9uLWxvZyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9jcm9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3Jvbi5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ3JvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIGNyb247XG4gIHB1YmxpYyB0YWJJbmRleCA9IDA7XG4gIHB1YmxpYyBDcm9uU3RhdGVzID0gaW5kZXhOYW1lVmFsdWUoQ3JvblN0YXRlcyk7XG4gIHB1YmxpYyBDcm9uUHJvY2Vzc1N0YXRlcyA9IGluZGV4TmFtZVZhbHVlKENyb25Qcm9jZXNzU3RhdGVzKTtcbiAgcHVibGljIENyb25Mb2dTdGF0ZXMgPSBpbmRleE5hbWVWYWx1ZShDcm9uTG9nU3RhdGVzKTtcbiAgcHVibGljIENyb25Mb2dTdGF0ZUNvbG9ycyA9IHt9O1xuXG4gIHB1YmxpYyBjb25maWc6IEZzTGlzdENvbmZpZztcbiAgcHVibGljIGNyb25BY3Rpb25zO1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgX2RhdGEsXG4gICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZCgpO1xuICAgIHRoaXMuQ3JvbkxvZ1N0YXRlQ29sb3JzID0gQ3JvbkxvZ1N0YXRlc1xuICAgICAgLnJlZHVjZSgoYWNjdW0sIGNyb25Mb2dTdGF0ZSkgPT4ge1xuICAgICAgICBhY2N1bVtjcm9uTG9nU3RhdGUudmFsdWVdID0gY3JvbkxvZ1N0YXRlLmNvbG9yO1xuXG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBjcm9uTG9nT3Blbihjcm9uTG9nKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oQ3JvbkxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogeyBcbiAgICAgICAgY3JvbkxvZyxcbiAgICAgIH0sXG4gICAgICB3aWR0aDogJzg1JScsXG4gICAgfSk7ICAgIFxuICB9XG5cbiAgcHVibGljIGNyb25BY3Rpb25DbGljayhjcm9uQWN0aW9uKSB7XG4gICAgY3JvbkFjdGlvbi5hY3Rpb24odGhpcy5jcm9uKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0ZWRJbmRleENoYW5nZShpbmRleCkge1xuICAgIHRoaXMudGFiSW5kZXggPSBpbmRleDtcbiAgfVxuICAgIFxuICBwdWJsaWMgbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmxvYWRDcm9uKHRoaXMuX2RhdGEuY3JvbilcbiAgICAgIC5zdWJzY3JpYmUoKGNyb24pID0+IHtcbiAgICAgICAgdGhpcy5jcm9uID0ge1xuICAgICAgICAgIC4uLnRoaXMuX2RhdGEuY3JvbixcbiAgICAgICAgICAuLi5jcm9uLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmKHRoaXMuX2RhdGEubG9hZENyb25Mb2dzKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3N0YXRlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICB7IG5hbWU6ICdBbGwnLCB2YWx1ZTogbnVsbCB9LFxuICAgICAgICAgICAgICAgICAgLi4uQ3JvbkxvZ1N0YXRlcyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuRGF0ZVJhbmdlLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogWydGcm9tIERhdGUnLCAnVG8gRGF0ZSddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSwgICAgICAgICAgXG4gICAgICAgICAgICBmZXRjaDogKHF1ZXJ5KSA9PiB7XG4gICAgICAgICAgICAgIHF1ZXJ5ID0ge1xuICAgICAgICAgICAgICAgIC4uLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIGNyb25JZDogdGhpcy5jcm9uLmlkLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmxvYWRDcm9uTG9ncyhxdWVyeSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNyb25BY3Rpb25zID0gdGhpcy5fZGF0YS5jcm9uQWN0aW9uc1xuICAgICAgICAgIC5maWx0ZXIoKGNyb25Mb2dBY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjcm9uTG9nQWN0aW9uLnNob3codGhpcy5jcm9uKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8ZnMtZGlhbG9nICpmc1NrZWxldG9uPVwiY3JvblwiPlxuICA8aDEgbWF0LWRpYWxvZy10aXRsZT5cbiAgICBDcm9uXG4gICAgPGRpdiBjbGFzcz1cInNtYWxsXCI+e3tjcm9uLm5hbWV9fTwvZGl2PlxuICA8L2gxPlxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxtYXQtdGFiLWdyb3VwIChzZWxlY3RlZEluZGV4Q2hhbmdlKT1cInNlbGVjdGVkSW5kZXhDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPG1hdC10YWIgbGFiZWw9XCJPdmVydmlld1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgICAgICBTdGF0dXNcbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICB7e0Nyb25TdGF0ZXNbY3Jvbi5zdGF0ZV19fVxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJjcm9uLmNyb25TZXR0aW5nXCI+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIFJ1biBGcmVxdWVuY3lcbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICB7e2Nyb24uY3JvblNldHRpbmcuc3VtbWFyeX19XG4gICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgICAgUHJvY2VzcyBJRFxuICAgICAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgICAgIHt7Y3Jvbi5wcm9jZXNzSWQgfHwgJ05vbmUnfX1cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcm9uLnByb2Nlc3NJZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICB7e0Nyb25Qcm9jZXNzU3RhdGVzW2Nyb24ucHJvY2Vzc1N0YXRlXSB8fCAnVW5rbm93bid9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIExhc3QgUmFuXG4gICAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyb24uZHVyYXRpb249PT1udWxsOyBlbHNlIGxhc3RSYW5cIj5cbiAgICAgICAgICAgICAgTmV2ZXJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsYXN0UmFuPlxuICAgICAgICAgICAgICA8ZnMtZGF0ZS1hZ28gW2RhdGVdPVwiY3Jvbi5jcmVhdGVEYXRlXCI+PC9mcy1kYXRlLWFnbz5cbiAgICAgICAgICAgICAgPGRpdj48c21hbGwgKm5nSWY9XCJjcm9uLmR1cmF0aW9uXCI+RHVyYXRpb246IHt7IGNyb24uZHVyYXRpb24gfCBmc0RhdGVEdXJhdGlvbiB9fTwvc21hbGw+PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIFRpbWVvdXQgaG91cnNcbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICB7e2Nyb24uY3JvblNldHRpbmc/LnRpbWVvdXQgfHwgJ04vQSd9fVxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImNyb24ubWVzc2FnZVwiPlxuICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgIExhc3QgTWVzc2FnZVxuICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj57e2Nyb24ubWVzc2FnZX19PC9kaXY+XG4gICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8L21hdC10YWI+XG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIkxvZ3NcIiAqbmdJZj1cImNvbmZpZ1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICA8ZnMtbGlzdCBbY29uZmlnXT1cImNvbmZpZ1wiPlxuICAgICAgICAgICAgPGZzLWxpc3QtY29sdW1uIG5hbWU9XCJzdGF0ZVwiIHRpdGxlPVwiU3RhdHVzXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWNlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxhIFxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JvbkxvZ09wZW4ocm93KVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgY29sb3I6IENyb25Mb2dTdGF0ZUNvbG9yc1tyb3cuc3RhdGVdIH1cIj5cbiAgICAgICAgICAgICAgICAgIHt7Q3JvbkxvZ1N0YXRlc1tyb3cuc3RhdGVdIHx8IHJvdy5zdGF0ZX19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGZzLWxpc3QtY29sdW1uIHRpdGxlPVwiTWVzc2FnZVwiIGNsYXNzPVwiY29sLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj57e3Jvdy5tZXNzYWdlfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZnMtbGlzdC1jb2x1bW4+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxmcy1saXN0LWNvbHVtbiB0aXRsZT1cIkR1cmF0aW9uXCIgY2xhc3M9XCJjb2wtbWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LmR1cmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICB7e3Jvdy5kdXJhdGlvbiB8IGZzRGF0ZUR1cmF0aW9uOiAnaG91ci1taW51dGUtc2Vjb25kJ319XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuXG4gICAgICAgICAgICA8ZnMtbGlzdC1jb2x1bW4gbmFtZT1cImNyZWF0ZV9kYXRlXCIgdGl0bGU9XCJEYXRlXCIgY2xhc3M9XCJjb2wtZGF0ZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZnMtZGF0ZS1hZ28gW2RhdGVdPVwicm93LmNyZWF0ZURhdGVcIj48L2ZzLWRhdGUtYWdvPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICAgICAgICA8L2ZzLWxpc3Q+IFxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9tYXQtdGFiPlxuICAgIDwvbWF0LXRhYi1ncm91cD5cblxuICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgPG1hdC1kaWFsb2ctYWN0aW9ucz4gICBcbiAgICA8YnV0dG9uIFxuICAgICAgICBtYXQtYnV0dG9uIFxuICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJ0cnVlXCIgXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgRG9uZVxuICAgIDwvYnV0dG9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJJbmRleCA9PT0gMFwiPlxuICAgICAgPGJ1dHRvbiAgIFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjcm9uQWN0aW9uIG9mIGNyb25BY3Rpb25zXCJcbiAgICAgICAgICBtYXQtYnV0dG9uIFxuICAgICAgICAgIChjbGljayk9XCJjcm9uQWN0aW9uQ2xpY2soY3JvbkFjdGlvbilcIj5cbiAgICAgICAge3tjcm9uQWN0aW9uLmxhYmVsfX1cbiAgICAgIDwvYnV0dG9uPiAgXG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPC9mcy1kaWFsb2c+XG4iXX0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvY3Jvbi9jcm9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9jcm9uL2Nyb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7Ozs7QUFRL0MsTUFBTSxPQUFPLGFBQWE7SUFZeEIsWUFDbUMsS0FBSyxFQUM5QixPQUFrQixFQUNsQixNQUF5QjtRQUZBLFVBQUssR0FBTCxLQUFLLENBQUE7UUFDOUIsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQVo1QixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsZUFBVSxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxzQkFBaUIsR0FBRyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RCxrQkFBYSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5Qyx1QkFBa0IsR0FBRyxFQUFFLENBQUM7SUFTNUIsQ0FBQztJQUVHLFFBQVE7UUFDYixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLENBQUMsa0JBQWtCLEdBQUcsYUFBYTthQUNwQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUU7WUFDOUIsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBRS9DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFPO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ2xDLElBQUksRUFBRTtnQkFDSixPQUFPO2FBQ1I7WUFDRCxLQUFLLEVBQUUsS0FBSztTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxlQUFlLENBQUMsVUFBVTtRQUMvQixVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDekIsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLG1CQUFtQixDQUFDLEtBQUs7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNqQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHO2dCQUNWLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO2dCQUNsQixHQUFHLElBQUk7YUFDUixDQUFDO1lBRUYsSUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRTtnQkFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRztvQkFDWixPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNOzRCQUNyQixJQUFJLEVBQUUsT0FBTzs0QkFDYixLQUFLLEVBQUUsUUFBUTs0QkFDZixNQUFNLEVBQUU7Z0NBQ04sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Z0NBQzVCLEdBQUcsYUFBYTs2QkFDakI7eUJBQ0Y7d0JBQ0Q7NEJBQ0UsSUFBSSxFQUFFLFFBQVEsQ0FBQyxTQUFTOzRCQUN4QixJQUFJLEVBQUUsTUFBTTs0QkFDWixLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDO3lCQUNoQztxQkFDRjtvQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDZixLQUFLLEdBQUc7NEJBQ04sR0FBRyxLQUFLOzRCQUNSLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7eUJBQ3JCLENBQUM7d0JBRUYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEMsQ0FBQztpQkFDRixDQUFDO2FBQ0g7WUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztpQkFDdEMsTUFBTSxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7Z0JBQ3hCLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7WUFFTCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7MEdBNUZVLGFBQWEsa0JBYWQsZUFBZTs4RkFiZCxhQUFhLG9EQ2xCMUIseTdIQXNIQTsyRkRwR2EsYUFBYTtrQkFMekIsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNOzswQkFlNUMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNMaXN0Q29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IENyb25Qcm9jZXNzU3RhdGVzLCBDcm9uU3RhdGVzIH0gZnJvbSAnLi4vLi4vY29uc3RzJztcbmltcG9ydCB7IENyb25Mb2dTdGF0ZXMgfSBmcm9tICcuLi8uLi9jb25zdHMvY3Jvbi1sb2ctc3RhdGVzLmNvbnN0JztcbmltcG9ydCB7IGluZGV4TmFtZVZhbHVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbmRleC1uYW1lLXZhbHVlJztcbmltcG9ydCB7IENyb25Mb2dDb21wb25lbnQgfSBmcm9tICcuLi9jcm9uLWxvZyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9jcm9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3Jvbi5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ3JvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIGNyb247XG4gIHB1YmxpYyB0YWJJbmRleCA9IDA7XG4gIHB1YmxpYyBDcm9uU3RhdGVzID0gaW5kZXhOYW1lVmFsdWUoQ3JvblN0YXRlcyk7XG4gIHB1YmxpYyBDcm9uUHJvY2Vzc1N0YXRlcyA9IGluZGV4TmFtZVZhbHVlKENyb25Qcm9jZXNzU3RhdGVzKTtcbiAgcHVibGljIENyb25Mb2dTdGF0ZXMgPSBpbmRleE5hbWVWYWx1ZShDcm9uTG9nU3RhdGVzKTtcbiAgcHVibGljIENyb25Mb2dTdGF0ZUNvbG9ycyA9IHt9O1xuXG4gIHB1YmxpYyBjb25maWc6IEZzTGlzdENvbmZpZztcbiAgcHVibGljIGNyb25BY3Rpb25zO1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgX2RhdGEsXG4gICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZCgpO1xuICAgIHRoaXMuQ3JvbkxvZ1N0YXRlQ29sb3JzID0gQ3JvbkxvZ1N0YXRlc1xuICAgICAgLnJlZHVjZSgoYWNjdW0sIGNyb25Mb2dTdGF0ZSkgPT4ge1xuICAgICAgICBhY2N1bVtjcm9uTG9nU3RhdGUudmFsdWVdID0gY3JvbkxvZ1N0YXRlLmNvbG9yO1xuXG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBjcm9uTG9nT3Blbihjcm9uTG9nKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oQ3JvbkxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogeyBcbiAgICAgICAgY3JvbkxvZyxcbiAgICAgIH0sXG4gICAgICB3aWR0aDogJzg1JScsXG4gICAgfSk7ICAgIFxuICB9XG5cbiAgcHVibGljIGNyb25BY3Rpb25DbGljayhjcm9uQWN0aW9uKSB7XG4gICAgY3JvbkFjdGlvbi5hY3Rpb24odGhpcy5jcm9uKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0ZWRJbmRleENoYW5nZShpbmRleCkge1xuICAgIHRoaXMudGFiSW5kZXggPSBpbmRleDtcbiAgfVxuICAgIFxuICBwdWJsaWMgbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmxvYWRDcm9uKHRoaXMuX2RhdGEuY3JvbilcbiAgICAgIC5zdWJzY3JpYmUoKGNyb24pID0+IHtcbiAgICAgICAgdGhpcy5jcm9uID0ge1xuICAgICAgICAgIC4uLnRoaXMuX2RhdGEuY3JvbixcbiAgICAgICAgICAuLi5jcm9uLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmKHRoaXMuX2RhdGEubG9hZENyb25Mb2dzKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3N0YXRlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICB7IG5hbWU6ICdBbGwnLCB2YWx1ZTogbnVsbCB9LFxuICAgICAgICAgICAgICAgICAgLi4uQ3JvbkxvZ1N0YXRlcyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuRGF0ZVJhbmdlLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogWydGcm9tIERhdGUnLCAnVG8gRGF0ZSddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSwgICAgICAgICAgXG4gICAgICAgICAgICBmZXRjaDogKHF1ZXJ5KSA9PiB7XG4gICAgICAgICAgICAgIHF1ZXJ5ID0ge1xuICAgICAgICAgICAgICAgIC4uLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIGNyb25JZDogdGhpcy5jcm9uLmlkLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmxvYWRDcm9uTG9ncyhxdWVyeSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNyb25BY3Rpb25zID0gdGhpcy5fZGF0YS5jcm9uQWN0aW9uc1xuICAgICAgICAgIC5maWx0ZXIoKGNyb25Mb2dBY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjcm9uTG9nQWN0aW9uLnNob3codGhpcy5jcm9uKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8ZnMtZGlhbG9nICpmc1NrZWxldG9uPVwiY3JvblwiPlxuICA8aDEgbWF0LWRpYWxvZy10aXRsZT5cbiAgICBDcm9uXG4gICAgPGRpdiBjbGFzcz1cInNtYWxsXCI+e3tjcm9uLm5hbWV9fTwvZGl2PlxuICA8L2gxPlxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxtYXQtdGFiLWdyb3VwIChzZWxlY3RlZEluZGV4Q2hhbmdlKT1cInNlbGVjdGVkSW5kZXhDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPG1hdC10YWIgbGFiZWw9XCJPdmVydmlld1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sZy53cmFwLmFsaWduLXN0YXJ0XCI+XG4gICAgICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgICAgICBTdGF0dXNcbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICB7e0Nyb25TdGF0ZXNbY3Jvbi5zdGF0ZV19fVxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJjcm9uLmNyb25TZXR0aW5nXCI+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIFJ1biBGcmVxdWVuY3lcbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICB7e2Nyb24uY3JvblNldHRpbmcuc3VtbWFyeX19XG4gICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgICAgUHJvY2VzcyBJRFxuICAgICAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgICAgIHt7Y3Jvbi5wcm9jZXNzSWQgfHwgJ05vbmUnfX1cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcm9uLnByb2Nlc3NJZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICB7e0Nyb25Qcm9jZXNzU3RhdGVzW2Nyb24ucHJvY2Vzc1N0YXRlXSB8fCAnVW5rbm93bid9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIExhc3QgUmFuXG4gICAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyb24uZHVyYXRpb249PT1udWxsOyBlbHNlIGxhc3RSYW5cIj5cbiAgICAgICAgICAgICAgTmV2ZXJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsYXN0UmFuPlxuICAgICAgICAgICAgICA8ZnMtZGF0ZS1hZ28gW2RhdGVdPVwiY3Jvbi5jcmVhdGVEYXRlXCI+PC9mcy1kYXRlLWFnbz5cbiAgICAgICAgICAgICAgPGRpdj48c21hbGwgKm5nSWY9XCJjcm9uLmR1cmF0aW9uXCI+RHVyYXRpb246IHt7IGNyb24uZHVyYXRpb24gfCBmc0RhdGVEdXJhdGlvbiB9fTwvc21hbGw+PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIFRpbWVvdXQgaG91cnNcbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICB7e2Nyb24uY3JvblNldHRpbmc/LnRpbWVvdXQgfHwgJ04vQSd9fVxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImNyb24ubWVzc2FnZVwiPlxuICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgIExhc3QgTWVzc2FnZVxuICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj57e2Nyb24ubWVzc2FnZX19PC9kaXY+XG4gICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8L21hdC10YWI+XG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIkxvZ3NcIiAqbmdJZj1cImNvbmZpZ1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICA8ZnMtbGlzdCBbY29uZmlnXT1cImNvbmZpZ1wiPlxuICAgICAgICAgICAgPGZzLWxpc3QtY29sdW1uIG5hbWU9XCJzdGF0ZVwiIHRpdGxlPVwiU3RhdHVzXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWNlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxhIFxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JvbkxvZ09wZW4ocm93KVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgY29sb3I6IENyb25Mb2dTdGF0ZUNvbG9yc1tyb3cuc3RhdGVdIH1cIj5cbiAgICAgICAgICAgICAgICAgIHt7Q3JvbkxvZ1N0YXRlc1tyb3cuc3RhdGVdIHx8IHJvdy5zdGF0ZX19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGZzLWxpc3QtY29sdW1uIHRpdGxlPVwiTWVzc2FnZVwiIGNsYXNzPVwiY29sLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj57e3Jvdy5tZXNzYWdlfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZnMtbGlzdC1jb2x1bW4+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxmcy1saXN0LWNvbHVtbiB0aXRsZT1cIkR1cmF0aW9uXCIgY2xhc3M9XCJjb2wtbWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LmR1cmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICB7e3Jvdy5kdXJhdGlvbiB8IGZzRGF0ZUR1cmF0aW9uOiAnaG91ci1taW51dGUtc2Vjb25kJ319XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuXG4gICAgICAgICAgICA8ZnMtbGlzdC1jb2x1bW4gbmFtZT1cImNyZWF0ZV9kYXRlXCIgdGl0bGU9XCJEYXRlXCIgY2xhc3M9XCJjb2wtZGF0ZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZnMtZGF0ZS1hZ28gW2RhdGVdPVwicm93LmNyZWF0ZURhdGVcIj48L2ZzLWRhdGUtYWdvPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICAgICAgICA8L2ZzLWxpc3Q+IFxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9tYXQtdGFiPlxuICAgIDwvbWF0LXRhYi1ncm91cD5cblxuICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgPG1hdC1kaWFsb2ctYWN0aW9ucz4gICBcbiAgICA8YnV0dG9uIFxuICAgICAgICBtYXQtYnV0dG9uIFxuICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJ0cnVlXCIgXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgRG9uZVxuICAgIDwvYnV0dG9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJJbmRleCA9PT0gMFwiPlxuICAgICAgPGJ1dHRvbiAgIFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjcm9uQWN0aW9uIG9mIGNyb25BY3Rpb25zXCJcbiAgICAgICAgICBtYXQtYnV0dG9uIFxuICAgICAgICAgIChjbGljayk9XCJjcm9uQWN0aW9uQ2xpY2soY3JvbkFjdGlvbilcIj5cbiAgICAgICAge3tjcm9uQWN0aW9uLmxhYmVsfX1cbiAgICAgIDwvYnV0dG9uPiAgXG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPC9mcy1kaWFsb2c+XG4iXX0=