@bcgov/nr-ngx-component-lib 0.0.41 → 0.0.43
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.
- package/components/list-attachments/list-attachments.component.d.ts +6 -5
- package/components/list-event-history/list-event-history.component.d.ts +5 -4
- package/components/list-select/list-select.component.d.ts +5 -3
- package/directives/row-list.base.d.ts +35 -33
- package/esm2022/components/list-attachments/list-attachments.component.mjs +13 -8
- package/esm2022/components/list-event-history/list-event-history.component.mjs +13 -8
- package/esm2022/components/list-select/list-select.component.mjs +16 -15
- package/esm2022/components/row-list-mobile/row-list-mobile.component.mjs +2 -2
- package/esm2022/directives/row-list.base.mjs +80 -99
- package/esm2022/services/page-state.service.mjs +3 -3
- package/fesm2022/bcgov-nr-ngx-component-lib.mjs +121 -129
- package/fesm2022/bcgov-nr-ngx-component-lib.mjs.map +1 -1
- package/package.json +1 -1
- package/services/page-state.service.d.ts +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OnChanges, SimpleChanges } from "@angular/core";
|
|
2
2
|
import { Observable } from "rxjs";
|
|
3
|
-
import {
|
|
3
|
+
import { RowListBase, RowListState } from "../../directives/row-list.base";
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export type AttachmentsTableRow = {
|
|
6
6
|
attachmentTypeDescription: string;
|
|
@@ -21,12 +21,12 @@ export type FetchAttachmentsParameters = {
|
|
|
21
21
|
};
|
|
22
22
|
export interface AttachmentRowListProvider<R, L = any> {
|
|
23
23
|
fetchAttachments(x: FetchAttachmentsParameters): Observable<L>;
|
|
24
|
-
displayRowListPage(res: L):
|
|
24
|
+
displayRowListPage(res: L): AttachmentsTableRow[];
|
|
25
25
|
downloadItem(item: R): any;
|
|
26
26
|
deleteItem(item: R): any;
|
|
27
27
|
}
|
|
28
28
|
export declare class ListAttachmentsComponent extends RowListBase<{}, AttachmentsTableRow> implements OnChanges {
|
|
29
|
-
rowListProvider
|
|
29
|
+
rowListProvider?: AttachmentRowListProvider<AttachmentsTableRow>;
|
|
30
30
|
canDelete: boolean;
|
|
31
31
|
canDownload: boolean;
|
|
32
32
|
noRowsMessage: string;
|
|
@@ -44,7 +44,7 @@ export declare class ListAttachmentsComponent extends RowListBase<{}, Attachment
|
|
|
44
44
|
API_TIMESTAMP: string;
|
|
45
45
|
API_TIMESTAMP_WITH_SEP: string;
|
|
46
46
|
};
|
|
47
|
-
columns:
|
|
47
|
+
columns: string[];
|
|
48
48
|
sortColumns: {
|
|
49
49
|
code: string;
|
|
50
50
|
description: string;
|
|
@@ -52,9 +52,10 @@ export declare class ListAttachmentsComponent extends RowListBase<{}, Attachment
|
|
|
52
52
|
ngOnChanges(changes: SimpleChanges): void;
|
|
53
53
|
get initialPageState(): RowListState<{}>;
|
|
54
54
|
fetchRowListPage(): Observable<any>;
|
|
55
|
-
|
|
55
|
+
parseRows(res: any): AttachmentsTableRow[];
|
|
56
56
|
onDownloadClick(item: AttachmentsTableRow): any;
|
|
57
57
|
onDeleteClick(item: AttachmentsTableRow): any;
|
|
58
|
+
savePageState(): void;
|
|
58
59
|
static ɵfac: i0.ɵɵFactoryDeclaration<ListAttachmentsComponent, never>;
|
|
59
60
|
static ɵcmp: i0.ɵɵComponentDeclaration<ListAttachmentsComponent, "nrcl-list-attachments", never, { "rowListProvider": { "alias": "rowListProvider"; "required": false; }; "canDelete": { "alias": "canDelete"; "required": false; }; "canDownload": { "alias": "canDownload"; "required": false; }; "noRowsMessage": { "alias": "noRowsMessage"; "required": false; }; }, {}, never, never, false, never>;
|
|
60
61
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Observable } from "rxjs";
|
|
2
|
-
import {
|
|
2
|
+
import { RowListBase, RowListState } from "../../directives/row-list.base";
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export type EventHistoryTableRow = {
|
|
5
5
|
eventTimestamp: string;
|
|
@@ -18,10 +18,10 @@ export type FetchEventHistoryParameters = {
|
|
|
18
18
|
};
|
|
19
19
|
export interface EventHistoryRowListProvider<R, L = any> {
|
|
20
20
|
fetchEventHistory(x: FetchEventHistoryParameters): Observable<L>;
|
|
21
|
-
displayRowListPage(res: L):
|
|
21
|
+
displayRowListPage(res: L): EventHistoryTableRow[];
|
|
22
22
|
}
|
|
23
23
|
export declare class ListEventHistoryComponent extends RowListBase<{}, EventHistoryTableRow> {
|
|
24
|
-
rowListProvider
|
|
24
|
+
rowListProvider?: EventHistoryRowListProvider<EventHistoryTableRow>;
|
|
25
25
|
canDelete: boolean;
|
|
26
26
|
showPagination: boolean;
|
|
27
27
|
isSupplier: boolean;
|
|
@@ -46,8 +46,9 @@ export declare class ListEventHistoryComponent extends RowListBase<{}, EventHist
|
|
|
46
46
|
description: string;
|
|
47
47
|
}[];
|
|
48
48
|
fetchRowListPage(): Observable<any>;
|
|
49
|
-
|
|
49
|
+
parseRows(res: any): EventHistoryTableRow[];
|
|
50
50
|
get initialPageState(): RowListState<{}>;
|
|
51
|
+
savePageState(): void;
|
|
51
52
|
static ɵfac: i0.ɵɵFactoryDeclaration<ListEventHistoryComponent, never>;
|
|
52
53
|
static ɵcmp: i0.ɵɵComponentDeclaration<ListEventHistoryComponent, "nrcl-list-event-history", never, { "rowListProvider": { "alias": "rowListProvider"; "required": false; }; "canDelete": { "alias": "canDelete"; "required": false; }; "showPagination": { "alias": "showPagination"; "required": false; }; "isSupplier": { "alias": "isSupplier"; "required": false; }; "noRowsMessage": { "alias": "noRowsMessage"; "required": false; }; }, {}, never, never, false, never>;
|
|
53
54
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AfterContentInit, EventEmitter, OnChanges, QueryList, SimpleChanges } from "@angular/core";
|
|
2
|
+
import { MatColumnDef, MatTable } from "@angular/material/table";
|
|
2
3
|
import { Observable } from "rxjs";
|
|
3
|
-
import {
|
|
4
|
+
import { RowListBase, RowListState } from "../../directives/row-list.base";
|
|
4
5
|
import { CodeDescription } from "../../utils/code-table.util";
|
|
5
|
-
import { MatColumnDef, MatTable } from "@angular/material/table";
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export declare class ListSelectComponent<T> extends RowListBase<{}, CodeDescription> implements OnChanges, AfterContentInit {
|
|
8
8
|
options: CodeDescription[];
|
|
@@ -24,12 +24,14 @@ export declare class ListSelectComponent<T> extends RowListBase<{}, CodeDescript
|
|
|
24
24
|
ngAfterContentInit(): void;
|
|
25
25
|
get initialPageState(): RowListState<{}>;
|
|
26
26
|
fetchRowListPage(): Observable<CodeDescription[]>;
|
|
27
|
-
|
|
27
|
+
parseRows(res: any): CodeDescription[];
|
|
28
|
+
parseTotalRowCount(res: any): number;
|
|
28
29
|
isSelected(item: CodeDescription): boolean;
|
|
29
30
|
onRowClick(item: CodeDescription): void;
|
|
30
31
|
onClearFilters(): void;
|
|
31
32
|
onSearchTextChange(ev: any): void;
|
|
32
33
|
filterOption(option: CodeDescription): boolean;
|
|
34
|
+
savePageState(): void;
|
|
33
35
|
static ɵfac: i0.ɵɵFactoryDeclaration<ListSelectComponent<any>, never>;
|
|
34
36
|
static ɵcmp: i0.ɵɵComponentDeclaration<ListSelectComponent<any>, "nrcl-list-select", never, { "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "descriptionLabel": { "alias": "descriptionLabel"; "required": false; }; "single": { "alias": "single"; "required": false; }; "noRowsMessage": { "alias": "noRowsMessage"; "required": false; }; "displayColumnsProvider": { "alias": "displayColumnsProvider"; "required": false; }; "filterProvider": { "alias": "filterProvider"; "required": false; }; }, { "valueChange": "valueChange"; "filterClear": "filterClear"; }, ["columnDefs"], ["[filter]", "*"], false, never>;
|
|
35
37
|
static ngAcceptInputType_single: unknown;
|
|
@@ -1,56 +1,58 @@
|
|
|
1
1
|
import { AfterViewInit, ChangeDetectorRef, EventEmitter } from "@angular/core";
|
|
2
|
-
import { SortDirection } from "@angular/material/sort";
|
|
2
|
+
import { Sort, SortDirection } from "@angular/material/sort";
|
|
3
3
|
import { Observable } from "rxjs";
|
|
4
4
|
import { PageStateService } from "../services/page-state.service";
|
|
5
|
-
import { CodeDescription } from "../public-api";
|
|
6
5
|
import { NrclBase } from "./nrcl.base";
|
|
7
6
|
import * as i0 from "@angular/core";
|
|
8
|
-
export type
|
|
9
|
-
filter: F;
|
|
7
|
+
export type RowListPageConfig = {
|
|
10
8
|
pageSize: number;
|
|
11
9
|
pageNumber: number;
|
|
12
10
|
sortActive: string;
|
|
13
11
|
sortDirection: SortDirection;
|
|
14
12
|
};
|
|
15
|
-
export type
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
export type RowListState<F> = {
|
|
14
|
+
pageConfig: RowListPageConfig;
|
|
15
|
+
filter: F;
|
|
18
16
|
};
|
|
19
|
-
export declare class RowListBase<F, R, L = any> extends NrclBase implements
|
|
17
|
+
export declare abstract class RowListBase<F, R, L = any> extends NrclBase implements AfterViewInit {
|
|
18
|
+
pageStateService: PageStateService;
|
|
19
|
+
changeDetectorRef: ChangeDetectorRef;
|
|
20
20
|
isLoadingChange: EventEmitter<boolean>;
|
|
21
21
|
private _isLoading;
|
|
22
22
|
get isLoading(): boolean;
|
|
23
23
|
set isLoading(v: boolean);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
private _loadRowListRequest;
|
|
37
|
-
constructor();
|
|
38
|
-
initializeRowList(): void;
|
|
24
|
+
private _rows;
|
|
25
|
+
get rows(): R[];
|
|
26
|
+
private _totalRowCount;
|
|
27
|
+
get totalRowCount(): number;
|
|
28
|
+
private _pageConfig;
|
|
29
|
+
get pageSize(): number;
|
|
30
|
+
get pageNumber(): number;
|
|
31
|
+
get sortActive(): string;
|
|
32
|
+
get sortDirection(): SortDirection;
|
|
33
|
+
private _filter?;
|
|
34
|
+
get filter(): F;
|
|
35
|
+
private _loadRowListRequest?;
|
|
39
36
|
ngAfterViewInit(): void;
|
|
40
37
|
refreshRowList(): Promise<void>;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
abstract fetchRowListPage(): Observable<L>;
|
|
39
|
+
abstract parseRows(res: L): R[];
|
|
40
|
+
parseTotalRowCount(res: L): number;
|
|
44
41
|
loadRowListPageFailed(error: any): void;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
onPageSizeChange(ev:
|
|
49
|
-
|
|
50
|
-
get initialPageState(): RowListState<F>;
|
|
42
|
+
clone(obj: any): any;
|
|
43
|
+
onFilterChange(ev: F): void;
|
|
44
|
+
onSortChange(ev: Sort): void;
|
|
45
|
+
onPageSizeChange(ev: number): void;
|
|
46
|
+
onPageNumberChange(ev: number): void;
|
|
47
|
+
abstract get initialPageState(): RowListState<F>;
|
|
51
48
|
loadPageState(): void;
|
|
52
49
|
savePageState(): void;
|
|
50
|
+
paginateState(id: string): {
|
|
51
|
+
id: string;
|
|
52
|
+
itemsPerPage: number;
|
|
53
|
+
currentPage: number;
|
|
54
|
+
totalItems: number;
|
|
55
|
+
};
|
|
53
56
|
static ɵfac: i0.ɵɵFactoryDeclaration<RowListBase<any, any, any>, never>;
|
|
54
57
|
static ɵdir: i0.ɵɵDirectiveDeclaration<RowListBase<any, any, any>, never, never, {}, { "isLoadingChange": "isLoadingChange"; }, never, never, false, never>;
|
|
55
58
|
}
|
|
56
|
-
export declare function makeSummary(rowCount: any, pageNumber: any, pageSize: any): [string, boolean];
|
|
@@ -49,10 +49,12 @@ export class ListAttachmentsComponent extends RowListBase {
|
|
|
49
49
|
get initialPageState() {
|
|
50
50
|
return {
|
|
51
51
|
filter: {},
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
pageConfig: {
|
|
53
|
+
pageSize: 10,
|
|
54
|
+
pageNumber: 1,
|
|
55
|
+
sortActive: 'uploadedTimestamp',
|
|
56
|
+
sortDirection: 'desc',
|
|
57
|
+
}
|
|
56
58
|
};
|
|
57
59
|
}
|
|
58
60
|
fetchRowListPage() {
|
|
@@ -65,7 +67,7 @@ export class ListAttachmentsComponent extends RowListBase {
|
|
|
65
67
|
sortDirection: this.sortDirection,
|
|
66
68
|
});
|
|
67
69
|
}
|
|
68
|
-
|
|
70
|
+
parseRows(res) {
|
|
69
71
|
if (!this.rowListProvider?.displayRowListPage)
|
|
70
72
|
throw Error('no provider for ListAttachmentsComponent.rowListProvider.displayRowListPage');
|
|
71
73
|
return this.rowListProvider.displayRowListPage(res);
|
|
@@ -80,12 +82,15 @@ export class ListAttachmentsComponent extends RowListBase {
|
|
|
80
82
|
throw Error('no provider for ListAttachmentsComponent.rowListProvider.onDeleteClick.');
|
|
81
83
|
return this.rowListProvider.deleteItem(item);
|
|
82
84
|
}
|
|
85
|
+
savePageState() {
|
|
86
|
+
// state not saved
|
|
87
|
+
}
|
|
83
88
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListAttachmentsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
84
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListAttachmentsComponent, selector: "nrcl-list-attachments", inputs: { rowListProvider: "rowListProvider", canDelete: "canDelete", canDownload: "canDownload", noRowsMessage: "noRowsMessage" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<nrcl-device-view>\n <ng-template desktop-view>\n @if ( rows?.length > 0 ) {\n <nrcl-row-list-desktop [showRowHover]=\"false\">\n <mat-table\n [dataSource]=\"rows | paginate: { \n id: 'desktop-attachments', \n itemsPerPage: pageSize, \n currentPage: pageNumber, \n totalItems: totalRowCount \n }\"\n matSort\n [matSortActive]=\"sortActive\"\n [matSortDirection]=\"sortDirection\"\n (matSortChange)=\"onSortChange( $event )\"\n >\n <ng-container matColumnDef=\"attachmentTypeCode\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Attachment Type</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n <nrcl-cell-content tooltip>{{ item.attachmentTypeDescription }}</nrcl-cell-content>\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"fileName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>File Name</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.fileName }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"sourceObjectNameCode\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>File Type</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.fileExtension }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"uploadedBy\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Uploaded By</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.uploadedBy }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"uploadedTimestamp\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Uploaded Date</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.uploadedTimestamp }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"description\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Description</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.attachmentDescription }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"download\">\n <mat-header-cell *matHeaderCellDef>Down­load</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n <nrcl-button compact\n icon=\"download\"\n (click)=\"onDownloadClick( item )\" \n ></nrcl-button>\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"delete\">\n <mat-header-cell *matHeaderCellDef>Delete</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n <nrcl-button compact\n icon=\"delete\"\n (click)=\"onDeleteClick( item )\"\n ></nrcl-button>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"columns; sticky: true\"></mat-header-row>\n <mat-row *matRowDef=\"let item; columns: columns;\"></mat-row>\n </mat-table>\n </nrcl-row-list-desktop>\n \n <nrcl-gap/>\n }\n\n <nrcl-row-list-pagination\n paginationId=\"desktop-attachments\"\n [pageSize]=\"pageSize\"\n [pageNumber]=\"pageNumber\"\n [rowCount]=\"totalRowCount\"\n (pageNumberChange)=\"onPageNumberChange( $event )\"\n (pageSizeChange)=\"onPageSizeChange( $event )\"\n [noRowsMessage]=\"noRowsMessage\"\n ></nrcl-row-list-pagination>\n </ng-template>\n\n <ng-template mobile-view>\n <nrcl-gap/>\n\n @if ( rows?.length > 0 ) {\n <nrcl-row-list-sorting\n [sortColumn]=\"sortActive\"\n [sortColumnOptions]=\"sortColumns\"\n [sortDirection]=\"sortDirection\"\n (sortChange)=\"onSortChange($event)\">\n </nrcl-row-list-sorting>\n\n <nrcl-gap/>\n\n <nrcl-row-list-mobile>\n @for ( item of rows | paginate: { \n id: 'mobile-attachments', \n itemsPerPage: pageSize, \n currentPage: pageNumber, \n totalItems: totalRowCount \n }; track item.attachmentId ) {\n <mat-card>\n <mat-card-content>\n <section full-width>\n <mat-label>File name</mat-label>\n <div class=\"value\">{{ item.fileName }}</div>\n </section>\n\n <section>\n <mat-label>Attachment Type</mat-label>\n <div class=\"value\">{{ item.attachmentTypeDescription }}</div>\n </section>\n\n <section>\n <mat-label>File Type</mat-label>\n <div class=\"value\">{{ item.fileExtension }}</div>\n </section>\n\n <section>\n <mat-label>Uploaded By</mat-label>\n <div class=\"value\">{{ item.uploadedBy }}</div>\n </section> \n\n <section>\n <mat-label>Uploaded Date</mat-label>\n <div class=\"value\">{{ item.uploadedTimestamp }}</div>\n </section> \n\n <section full-width>\n <mat-label>Description</mat-label>\n <div class=\"value\">{{ item.attachmentDescription }}</div>\n </section> \n </mat-card-content>\n\n <mat-card-footer>\n @if ( canDownload ) {\n <nrcl-button compact\n label=\"Download\"\n icon=\"download\"\n (click)=\"onDownloadClick( item )\" \n ></nrcl-button>\n }\n\n @if ( canDelete ) {\n <nrcl-button compact\n label=\"Delete\"\n icon=\"delete\"\n (click)=\"onDeleteClick( item )\"\n ></nrcl-button>\n }\n </mat-card-footer> \n </mat-card>\n }\n </nrcl-row-list-mobile>\n\n <nrcl-gap/>\n }\n\n <nrcl-row-list-pagination\n paginationId=\"mobile-attachments\"\n [pageSize]=\"pageSize\"\n [pageNumber]=\"pageNumber\"\n [rowCount]=\"totalRowCount\"\n (pageNumberChange)=\"onPageNumberChange( $event )\"\n (pageSizeChange)=\"onPageSizeChange( $event )\"\n [noRowsMessage]=\"noRowsMessage\"\n ></nrcl-row-list-pagination>\n </ng-template>\n</nrcl-device-view>\n", styles: [":host .mat-mdc-table .mat-column-attachmentTypeCode{flex-basis:150px;flex-grow:1;flex-shrink:0}:host .mat-mdc-table .mat-column-fileName{flex-basis:200px;flex-grow:2;flex-shrink:0;word-break:break-word}:host .mat-mdc-table .mat-column-sourceObjectNameCode{flex-basis:60px;flex-grow:0;flex-shrink:0}:host .mat-mdc-table .mat-column-uploadedBy{flex-basis:150px;flex-grow:0;flex-shrink:0}:host .mat-mdc-table .mat-column-uploadedTimestamp{flex-basis:150px;flex-grow:1;flex-shrink:0}:host .mat-mdc-table .mat-column-description{flex-basis:200px;flex-grow:3;flex-shrink:0;word-break:break-word}:host .mat-mdc-table .mat-column-download{flex-basis:90px;flex-grow:0;flex-shrink:0;justify-content:center}:host .mat-mdc-table .mat-column-delete{flex-basis:60px;flex-grow:0;flex-shrink:0;justify-content:center}\n"], dependencies: [{ kind: "component", type: i1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i1.MatCardFooter, selector: "mat-card-footer" }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i3.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i5.ButtonComponent, selector: "nrcl-button", inputs: ["label", "icon", "iconRight", "iconCompact", "tooltip", "compact", "small", "primary", "secondary", "tertiary", "disabled", "anchor"], outputs: ["click"] }, { kind: "component", type: i6.CellContentComponent, selector: "nrcl-cell-content", inputs: ["tooltip", "content"] }, { kind: "component", type: i7.GapComponent, selector: "nrcl-gap", inputs: ["horizontal", "vertical", "divider"] }, { kind: "component", type: i8.RowListDesktopComponent, selector: "nrcl-row-list-desktop", inputs: ["showRowHover"] }, { kind: "component", type: i9.RowListMobileComponent, selector: "nrcl-row-list-mobile" }, { kind: "component", type: i10.RowListPaginationComponent, selector: "nrcl-row-list-pagination", inputs: ["paginationId", "pageSizeOptions", "pageSize", "pageNumber", "rowCount", "showPageSize", "noRowsMessage"], outputs: ["pageSizeChange", "pageNumberChange"] }, { kind: "component", type: i11.RowListSortingComponent, selector: "nrcl-row-list-sorting", inputs: ["sortColumn", "sortColumnOptions", "sortDirection"], outputs: ["sortChange"] }, { kind: "directive", type: i12.DesktopViewDirective, selector: "[desktop-view]" }, { kind: "directive", type: i12.MobileViewDirective, selector: "[mobile-view]" }, { kind: "component", type: i12.DeviceViewComponent, selector: "nrcl-device-view" }, { kind: "pipe", type: i13.PaginatePipe, name: "paginate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
89
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListAttachmentsComponent, selector: "nrcl-list-attachments", inputs: { rowListProvider: "rowListProvider", canDelete: "canDelete", canDownload: "canDownload", noRowsMessage: "noRowsMessage" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<nrcl-device-view>\n <ng-template desktop-view>\n @if ( rows?.length > 0 ) {\n <nrcl-row-list-desktop [showRowHover]=\"false\">\n <mat-table\n [dataSource]=\"rows | paginate: paginateState( 'desktop-attachments' )\"\n matSort\n [matSortActive]=\"sortActive\"\n [matSortDirection]=\"sortDirection\"\n (matSortChange)=\"onSortChange( $event )\"\n >\n <ng-container matColumnDef=\"attachmentTypeCode\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Attachment Type</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n <nrcl-cell-content tooltip>{{ item.attachmentTypeDescription }}</nrcl-cell-content>\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"fileName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>File Name</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.fileName }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"sourceObjectNameCode\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>File Type</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.fileExtension }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"uploadedBy\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Uploaded By</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.uploadedBy }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"uploadedTimestamp\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Uploaded Date</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.uploadedTimestamp }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"description\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Description</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.attachmentDescription }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"download\">\n <mat-header-cell *matHeaderCellDef>Down­load</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n <nrcl-button compact\n icon=\"download\"\n (click)=\"onDownloadClick( item )\" \n ></nrcl-button>\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"delete\">\n <mat-header-cell *matHeaderCellDef>Delete</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n <nrcl-button compact\n icon=\"delete\"\n (click)=\"onDeleteClick( item )\"\n ></nrcl-button>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"columns; sticky: true\"></mat-header-row>\n <mat-row *matRowDef=\"let item; columns: columns;\"></mat-row>\n </mat-table>\n </nrcl-row-list-desktop>\n \n <nrcl-gap/>\n }\n\n <nrcl-row-list-pagination\n paginationId=\"desktop-attachments\"\n [pageSize]=\"pageSize\"\n [pageNumber]=\"pageNumber\"\n [rowCount]=\"totalRowCount\"\n (pageNumberChange)=\"onPageNumberChange( $event )\"\n (pageSizeChange)=\"onPageSizeChange( $event )\"\n [noRowsMessage]=\"noRowsMessage\"\n ></nrcl-row-list-pagination>\n </ng-template>\n\n <ng-template mobile-view>\n <nrcl-gap/>\n\n @if ( rows?.length > 0 ) {\n <nrcl-row-list-sorting\n [sortColumn]=\"sortActive\"\n [sortColumnOptions]=\"sortColumns\"\n [sortDirection]=\"sortDirection\"\n (sortChange)=\"onSortChange($event)\">\n </nrcl-row-list-sorting>\n\n <nrcl-gap/>\n\n <nrcl-row-list-mobile>\n @for ( item of rows | paginate: paginateState( 'mobile-attachments' ); track item.attachmentId ) {\n <mat-card>\n <mat-card-content>\n <section full-width>\n <mat-label>File name</mat-label>\n <div class=\"value\">{{ item.fileName }}</div>\n </section>\n\n <section>\n <mat-label>Attachment Type</mat-label>\n <div class=\"value\">{{ item.attachmentTypeDescription }}</div>\n </section>\n\n <section>\n <mat-label>File Type</mat-label>\n <div class=\"value\">{{ item.fileExtension }}</div>\n </section>\n\n <section>\n <mat-label>Uploaded By</mat-label>\n <div class=\"value\">{{ item.uploadedBy }}</div>\n </section> \n\n <section>\n <mat-label>Uploaded Date</mat-label>\n <div class=\"value\">{{ item.uploadedTimestamp }}</div>\n </section> \n\n <section full-width>\n <mat-label>Description</mat-label>\n <div class=\"value\">{{ item.attachmentDescription }}</div>\n </section> \n </mat-card-content>\n\n <mat-card-footer>\n @if ( canDownload ) {\n <nrcl-button compact\n label=\"Download\"\n icon=\"download\"\n (click)=\"onDownloadClick( item )\" \n ></nrcl-button>\n }\n\n @if ( canDelete ) {\n <nrcl-button compact\n label=\"Delete\"\n icon=\"delete\"\n (click)=\"onDeleteClick( item )\"\n ></nrcl-button>\n }\n </mat-card-footer> \n </mat-card>\n }\n </nrcl-row-list-mobile>\n\n <nrcl-gap/>\n }\n\n <nrcl-row-list-pagination\n paginationId=\"mobile-attachments\"\n [pageSize]=\"pageSize\"\n [pageNumber]=\"pageNumber\"\n [rowCount]=\"totalRowCount\"\n (pageNumberChange)=\"onPageNumberChange( $event )\"\n (pageSizeChange)=\"onPageSizeChange( $event )\"\n [noRowsMessage]=\"noRowsMessage\"\n ></nrcl-row-list-pagination>\n </ng-template>\n</nrcl-device-view>\n", styles: [":host .mat-mdc-table .mat-column-attachmentTypeCode{flex-basis:150px;flex-grow:1;flex-shrink:0}:host .mat-mdc-table .mat-column-fileName{flex-basis:200px;flex-grow:2;flex-shrink:0;word-break:break-word}:host .mat-mdc-table .mat-column-sourceObjectNameCode{flex-basis:60px;flex-grow:0;flex-shrink:0}:host .mat-mdc-table .mat-column-uploadedBy{flex-basis:150px;flex-grow:0;flex-shrink:0}:host .mat-mdc-table .mat-column-uploadedTimestamp{flex-basis:150px;flex-grow:1;flex-shrink:0}:host .mat-mdc-table .mat-column-description{flex-basis:200px;flex-grow:3;flex-shrink:0;word-break:break-word}:host .mat-mdc-table .mat-column-download{flex-basis:90px;flex-grow:0;flex-shrink:0;justify-content:center}:host .mat-mdc-table .mat-column-delete{flex-basis:60px;flex-grow:0;flex-shrink:0;justify-content:center}\n"], dependencies: [{ kind: "component", type: i1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i1.MatCardFooter, selector: "mat-card-footer" }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i3.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i5.ButtonComponent, selector: "nrcl-button", inputs: ["label", "icon", "iconRight", "iconCompact", "tooltip", "compact", "small", "primary", "secondary", "tertiary", "disabled", "anchor"], outputs: ["click"] }, { kind: "component", type: i6.CellContentComponent, selector: "nrcl-cell-content", inputs: ["tooltip", "content"] }, { kind: "component", type: i7.GapComponent, selector: "nrcl-gap", inputs: ["horizontal", "vertical", "divider"] }, { kind: "component", type: i8.RowListDesktopComponent, selector: "nrcl-row-list-desktop", inputs: ["showRowHover"] }, { kind: "component", type: i9.RowListMobileComponent, selector: "nrcl-row-list-mobile" }, { kind: "component", type: i10.RowListPaginationComponent, selector: "nrcl-row-list-pagination", inputs: ["paginationId", "pageSizeOptions", "pageSize", "pageNumber", "rowCount", "showPageSize", "noRowsMessage"], outputs: ["pageSizeChange", "pageNumberChange"] }, { kind: "component", type: i11.RowListSortingComponent, selector: "nrcl-row-list-sorting", inputs: ["sortColumn", "sortColumnOptions", "sortDirection"], outputs: ["sortChange"] }, { kind: "directive", type: i12.DesktopViewDirective, selector: "[desktop-view]" }, { kind: "directive", type: i12.MobileViewDirective, selector: "[mobile-view]" }, { kind: "component", type: i12.DeviceViewComponent, selector: "nrcl-device-view" }, { kind: "pipe", type: i13.PaginatePipe, name: "paginate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
85
90
|
}
|
|
86
91
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListAttachmentsComponent, decorators: [{
|
|
87
92
|
type: Component,
|
|
88
|
-
args: [{ selector: "nrcl-list-attachments", changeDetection: ChangeDetectionStrategy.OnPush, template: "<nrcl-device-view>\n <ng-template desktop-view>\n @if ( rows?.length > 0 ) {\n <nrcl-row-list-desktop [showRowHover]=\"false\">\n <mat-table\n [dataSource]=\"rows | paginate:
|
|
93
|
+
args: [{ selector: "nrcl-list-attachments", changeDetection: ChangeDetectionStrategy.OnPush, template: "<nrcl-device-view>\n <ng-template desktop-view>\n @if ( rows?.length > 0 ) {\n <nrcl-row-list-desktop [showRowHover]=\"false\">\n <mat-table\n [dataSource]=\"rows | paginate: paginateState( 'desktop-attachments' )\"\n matSort\n [matSortActive]=\"sortActive\"\n [matSortDirection]=\"sortDirection\"\n (matSortChange)=\"onSortChange( $event )\"\n >\n <ng-container matColumnDef=\"attachmentTypeCode\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Attachment Type</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n <nrcl-cell-content tooltip>{{ item.attachmentTypeDescription }}</nrcl-cell-content>\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"fileName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>File Name</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.fileName }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"sourceObjectNameCode\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>File Type</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.fileExtension }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"uploadedBy\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Uploaded By</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.uploadedBy }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"uploadedTimestamp\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Uploaded Date</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.uploadedTimestamp }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"description\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>Description</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n {{ item.attachmentDescription }}\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"download\">\n <mat-header-cell *matHeaderCellDef>Down­load</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n <nrcl-button compact\n icon=\"download\"\n (click)=\"onDownloadClick( item )\" \n ></nrcl-button>\n </mat-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"delete\">\n <mat-header-cell *matHeaderCellDef>Delete</mat-header-cell>\n <mat-cell *matCellDef=\"let item\">\n <nrcl-button compact\n icon=\"delete\"\n (click)=\"onDeleteClick( item )\"\n ></nrcl-button>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"columns; sticky: true\"></mat-header-row>\n <mat-row *matRowDef=\"let item; columns: columns;\"></mat-row>\n </mat-table>\n </nrcl-row-list-desktop>\n \n <nrcl-gap/>\n }\n\n <nrcl-row-list-pagination\n paginationId=\"desktop-attachments\"\n [pageSize]=\"pageSize\"\n [pageNumber]=\"pageNumber\"\n [rowCount]=\"totalRowCount\"\n (pageNumberChange)=\"onPageNumberChange( $event )\"\n (pageSizeChange)=\"onPageSizeChange( $event )\"\n [noRowsMessage]=\"noRowsMessage\"\n ></nrcl-row-list-pagination>\n </ng-template>\n\n <ng-template mobile-view>\n <nrcl-gap/>\n\n @if ( rows?.length > 0 ) {\n <nrcl-row-list-sorting\n [sortColumn]=\"sortActive\"\n [sortColumnOptions]=\"sortColumns\"\n [sortDirection]=\"sortDirection\"\n (sortChange)=\"onSortChange($event)\">\n </nrcl-row-list-sorting>\n\n <nrcl-gap/>\n\n <nrcl-row-list-mobile>\n @for ( item of rows | paginate: paginateState( 'mobile-attachments' ); track item.attachmentId ) {\n <mat-card>\n <mat-card-content>\n <section full-width>\n <mat-label>File name</mat-label>\n <div class=\"value\">{{ item.fileName }}</div>\n </section>\n\n <section>\n <mat-label>Attachment Type</mat-label>\n <div class=\"value\">{{ item.attachmentTypeDescription }}</div>\n </section>\n\n <section>\n <mat-label>File Type</mat-label>\n <div class=\"value\">{{ item.fileExtension }}</div>\n </section>\n\n <section>\n <mat-label>Uploaded By</mat-label>\n <div class=\"value\">{{ item.uploadedBy }}</div>\n </section> \n\n <section>\n <mat-label>Uploaded Date</mat-label>\n <div class=\"value\">{{ item.uploadedTimestamp }}</div>\n </section> \n\n <section full-width>\n <mat-label>Description</mat-label>\n <div class=\"value\">{{ item.attachmentDescription }}</div>\n </section> \n </mat-card-content>\n\n <mat-card-footer>\n @if ( canDownload ) {\n <nrcl-button compact\n label=\"Download\"\n icon=\"download\"\n (click)=\"onDownloadClick( item )\" \n ></nrcl-button>\n }\n\n @if ( canDelete ) {\n <nrcl-button compact\n label=\"Delete\"\n icon=\"delete\"\n (click)=\"onDeleteClick( item )\"\n ></nrcl-button>\n }\n </mat-card-footer> \n </mat-card>\n }\n </nrcl-row-list-mobile>\n\n <nrcl-gap/>\n }\n\n <nrcl-row-list-pagination\n paginationId=\"mobile-attachments\"\n [pageSize]=\"pageSize\"\n [pageNumber]=\"pageNumber\"\n [rowCount]=\"totalRowCount\"\n (pageNumberChange)=\"onPageNumberChange( $event )\"\n (pageSizeChange)=\"onPageSizeChange( $event )\"\n [noRowsMessage]=\"noRowsMessage\"\n ></nrcl-row-list-pagination>\n </ng-template>\n</nrcl-device-view>\n", styles: [":host .mat-mdc-table .mat-column-attachmentTypeCode{flex-basis:150px;flex-grow:1;flex-shrink:0}:host .mat-mdc-table .mat-column-fileName{flex-basis:200px;flex-grow:2;flex-shrink:0;word-break:break-word}:host .mat-mdc-table .mat-column-sourceObjectNameCode{flex-basis:60px;flex-grow:0;flex-shrink:0}:host .mat-mdc-table .mat-column-uploadedBy{flex-basis:150px;flex-grow:0;flex-shrink:0}:host .mat-mdc-table .mat-column-uploadedTimestamp{flex-basis:150px;flex-grow:1;flex-shrink:0}:host .mat-mdc-table .mat-column-description{flex-basis:200px;flex-grow:3;flex-shrink:0;word-break:break-word}:host .mat-mdc-table .mat-column-download{flex-basis:90px;flex-grow:0;flex-shrink:0;justify-content:center}:host .mat-mdc-table .mat-column-delete{flex-basis:60px;flex-grow:0;flex-shrink:0;justify-content:center}\n"] }]
|
|
89
94
|
}], propDecorators: { rowListProvider: [{
|
|
90
95
|
type: Input
|
|
91
96
|
}], canDelete: [{
|
|
@@ -95,4 +100,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
95
100
|
}], noRowsMessage: [{
|
|
96
101
|
type: Input
|
|
97
102
|
}] } });
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1hdHRhY2htZW50cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uci1uZ3gtY29tcG9uZW50LWxpYi9zcmMvY29tcG9uZW50cy9saXN0LWF0dGFjaG1lbnRzL2xpc3QtYXR0YWNobWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnItbmd4LWNvbXBvbmVudC1saWIvc3JjL2NvbXBvbmVudHMvbGlzdC1hdHRhY2htZW50cy9saXN0LWF0dGFjaG1lbnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUVwRyxPQUFPLEVBQXFCLFdBQVcsRUFBZ0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWtDckQsTUFBTSxPQUFPLHdCQUF5QixTQUFRLFdBQW1DO0lBTmpGOztRQVFhLGNBQVMsR0FBRyxJQUFJLENBQUE7UUFDaEIsZ0JBQVcsR0FBRyxJQUFJLENBQUE7UUFDbEIsa0JBQWEsR0FBRyxpQ0FBaUMsQ0FBQTtRQUUxRCxpQkFBWSxHQUFHLFlBQVksQ0FBQTtRQUMzQixZQUFPLEdBQUcsRUFBRSxDQUFBO1FBQ1osZ0JBQVcsR0FBRztZQUNWLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFJLFdBQVcsRUFBRSxpQkFBaUIsRUFBRTtZQUNoRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQWMsV0FBVyxFQUFFLFdBQVcsRUFBRTtZQUMxRCxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFO1lBQzFELEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBWSxXQUFXLEVBQUUsYUFBYSxFQUFFO1lBQzVELEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFLLFdBQVcsRUFBRSxlQUFlLEVBQUU7WUFDOUQsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFXLFdBQVcsRUFBRSxhQUFhLEVBQUU7U0FDL0QsQ0FBQTtLQXVESjtJQXJERyxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSyxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUcsQ0FBQztZQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHO2dCQUNYLG9CQUFvQjtnQkFDcEIsVUFBVTtnQkFDVixzQkFBc0I7Z0JBQ3RCLFlBQVk7Z0JBQ1osbUJBQW1CO2dCQUNuQixhQUFhO2dCQUNiLEdBQUcsQ0FBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUU7Z0JBQzNDLEdBQUcsQ0FBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUU7YUFDMUMsQ0FBQTtRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTztZQUNILE1BQU0sRUFBRSxFQUFFO1lBQ1YsUUFBUSxFQUFFLEVBQUU7WUFDWixVQUFVLEVBQUUsQ0FBQztZQUNiLFVBQVUsRUFBRSxtQkFBbUI7WUFDL0IsYUFBYSxFQUFFLE1BQU07U0FDeEIsQ0FBQTtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7UUFDWixJQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxnQkFBZ0I7WUFBRyxNQUFNLEtBQUssQ0FBRSwyRUFBMkUsQ0FBRSxDQUFBO1FBRXpJLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQzNCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDcEMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELGtCQUFrQixDQUFFLEdBQVE7UUFDeEIsSUFBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsa0JBQWtCO1lBQUcsTUFBTSxLQUFLLENBQUUsNkVBQTZFLENBQUUsQ0FBQTtRQUU3SSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUUsR0FBRyxDQUFFLENBQUE7SUFDekQsQ0FBQztJQUVELGVBQWUsQ0FBRSxJQUF5QjtRQUN0QyxJQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxZQUFZO1lBQUcsTUFBTSxLQUFLLENBQUUsMEVBQTBFLENBQUUsQ0FBQTtRQUVwSSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFFLElBQUksQ0FBRSxDQUFBO0lBQ3BELENBQUM7SUFFRCxhQUFhLENBQUUsSUFBeUI7UUFDcEMsSUFBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsVUFBVTtZQUFHLE1BQU0sS0FBSyxDQUFFLHlFQUF5RSxDQUFFLENBQUE7UUFFakksT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBRSxJQUFJLENBQUUsQ0FBQTtJQUNsRCxDQUFDOytHQXJFUSx3QkFBd0I7bUdBQXhCLHdCQUF3Qiw2T0NyQ3JDLCszUUF5TEE7OzRGRHBKYSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0ksdUJBQXVCLG1CQUdoQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IExvYWRSb3dMaXN0UmVzdWx0LCBSb3dMaXN0QmFzZSwgUm93TGlzdFN0YXRlIH0gZnJvbSBcIi4uLy4uL2RpcmVjdGl2ZXMvcm93LWxpc3QuYmFzZVwiO1xuaW1wb3J0IHsgREFURV9GT1JNQVRTIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGUudXRpbFwiO1xuXG5leHBvcnQgdHlwZSBBdHRhY2htZW50c1RhYmxlUm93ID0ge1xuICAgIGF0dGFjaG1lbnRUeXBlRGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZpbGVOYW1lOiBzdHJpbmdcbiAgICBmaWxlRXh0ZW5zaW9uOiBzdHJpbmdcbiAgICB1cGxvYWRlZEJ5OiBzdHJpbmdcbiAgICB1cGxvYWRlZFRpbWVzdGFtcDogc3RyaW5nXG4gICAgYXR0YWNobWVudERlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBhdHRhY2htZW50SWQ6IHN0cmluZyBcbiAgICBmaWxlSWQ6IHN0cmluZ1xuICAgIHNvdXJjZU9iamVjdFVuaXF1ZUlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRmV0Y2hBdHRhY2htZW50c1BhcmFtZXRlcnMgPSB7IFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlciBcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlciBcbiAgICBzb3J0Q29sdW1uOiBzdHJpbmcgXG4gICAgc29ydERpcmVjdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudFJvd0xpc3RQcm92aWRlcjxSLEw9YW55PiB7XG4gICAgZmV0Y2hBdHRhY2htZW50cyggeDogRmV0Y2hBdHRhY2htZW50c1BhcmFtZXRlcnMgKTogT2JzZXJ2YWJsZTxMPiAgICBcbiAgICBkaXNwbGF5Um93TGlzdFBhZ2UoIHJlczogTCApOiBMb2FkUm93TGlzdFJlc3VsdDxSPlxuICAgIGRvd25sb2FkSXRlbSggaXRlbTogUiApXG4gICAgZGVsZXRlSXRlbSggaXRlbTogUiApXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm5yY2wtbGlzdC1hdHRhY2htZW50c1wiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vbGlzdC1hdHRhY2htZW50cy5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsOiBcIi4vbGlzdC1hdHRhY2htZW50cy5jb21wb25lbnQuc2Nzc1wiLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIExpc3RBdHRhY2htZW50c0NvbXBvbmVudCBleHRlbmRzIFJvd0xpc3RCYXNlPHt9LEF0dGFjaG1lbnRzVGFibGVSb3c+IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKSByb3dMaXN0UHJvdmlkZXI6IEF0dGFjaG1lbnRSb3dMaXN0UHJvdmlkZXI8QXR0YWNobWVudHNUYWJsZVJvdz5cbiAgICBASW5wdXQoKSBjYW5EZWxldGUgPSB0cnVlXG4gICAgQElucHV0KCkgY2FuRG93bmxvYWQgPSB0cnVlXG4gICAgQElucHV0KCkgbm9Sb3dzTWVzc2FnZSA9IFwiTm8gYXR0YWNobWVudHMgaGF2ZSBiZWVuIGFkZGVkLlwiXG4gICAgXG4gICAgREFURV9GT1JNQVRTID0gREFURV9GT1JNQVRTXG4gICAgY29sdW1ucyA9IFtdIFxuICAgIHNvcnRDb2x1bW5zID0gW1xuICAgICAgICB7IGNvZGU6ICdhdHRhY2htZW50VHlwZUNvZGUnLCAgIGRlc2NyaXB0aW9uOiAnQXR0YWNobWVudCBUeXBlJyB9LCBcbiAgICAgICAgeyBjb2RlOiAnZmlsZU5hbWUnLCAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgTmFtZScgfSwgXG4gICAgICAgIHsgY29kZTogJ3NvdXJjZU9iamVjdE5hbWVDb2RlJywgZGVzY3JpcHRpb246ICdGaWxlIFR5cGUnIH0sIFxuICAgICAgICB7IGNvZGU6ICd1cGxvYWRlZEJ5JywgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkZWQgQnknIH0sIFxuICAgICAgICB7IGNvZGU6ICd1cGxvYWRlZFRpbWVzdGFtcCcsICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkZWQgRGF0ZScgfSwgXG4gICAgICAgIHsgY29kZTogJ2Rlc2NyaXB0aW9uJywgICAgICAgICAgZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbicgfSAgXG4gICAgXVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoIGNoYW5nZXMuY2FuRG93bmxvYWQgfHwgY2hhbmdlcy5jYW5EZWxldGUgKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbIFxuICAgICAgICAgICAgICAgICdhdHRhY2htZW50VHlwZUNvZGUnLCBcbiAgICAgICAgICAgICAgICAnZmlsZU5hbWUnLCBcbiAgICAgICAgICAgICAgICAnc291cmNlT2JqZWN0TmFtZUNvZGUnLCBcbiAgICAgICAgICAgICAgICAndXBsb2FkZWRCeScsIFxuICAgICAgICAgICAgICAgICd1cGxvYWRlZFRpbWVzdGFtcCcsIFxuICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgICAgLi4uKCB0aGlzLmNhbkRvd25sb2FkID8gWydkb3dubG9hZCddIDogW10gKSxcbiAgICAgICAgICAgICAgICAuLi4oIHRoaXMuY2FuRGVsZXRlID8gWydkZWxldGUnXSA6IFtdIClcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpbml0aWFsUGFnZVN0YXRlKCk6IFJvd0xpc3RTdGF0ZTx7fT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsdGVyOiB7fSxcbiAgICAgICAgICAgIHBhZ2VTaXplOiAxMCxcbiAgICAgICAgICAgIHBhZ2VOdW1iZXI6IDEsXG4gICAgICAgICAgICBzb3J0QWN0aXZlOiAndXBsb2FkZWRUaW1lc3RhbXAnLFxuICAgICAgICAgICAgc29ydERpcmVjdGlvbjogJ2Rlc2MnLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hSb3dMaXN0UGFnZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAoICF0aGlzLnJvd0xpc3RQcm92aWRlcj8uZmV0Y2hBdHRhY2htZW50cyApIHRocm93IEVycm9yKCAnbm8gcHJvdmlkZXIgZm9yIExpc3RBdHRhY2htZW50c0NvbXBvbmVudC5yb3dMaXN0UHJvdmlkZXIuZmV0Y2hSb3dMaXN0UGFnZScgKVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0xpc3RQcm92aWRlci5mZXRjaEF0dGFjaG1lbnRzKHtcbiAgICAgICAgICAgIHBhZ2VOdW1iZXI6IHRoaXMucGFnZU51bWJlcixcbiAgICAgICAgICAgIHBhZ2VSb3dDb3VudDogdGhpcy5wYWdlU2l6ZSxcbiAgICAgICAgICAgIHNvcnRDb2x1bW46IHRoaXMuc29ydEFjdGl2ZSxcbiAgICAgICAgICAgIHNvcnREaXJlY3Rpb246IHRoaXMuc29ydERpcmVjdGlvbixcbiAgICAgICAgfSlcbiAgICB9XG4gICAgXG4gICAgZGlzcGxheVJvd0xpc3RQYWdlKCByZXM6IGFueSApOiBMb2FkUm93TGlzdFJlc3VsdDxBdHRhY2htZW50c1RhYmxlUm93PiB7XG4gICAgICAgIGlmICggIXRoaXMucm93TGlzdFByb3ZpZGVyPy5kaXNwbGF5Um93TGlzdFBhZ2UgKSB0aHJvdyBFcnJvciggJ25vIHByb3ZpZGVyIGZvciBMaXN0QXR0YWNobWVudHNDb21wb25lbnQucm93TGlzdFByb3ZpZGVyLmRpc3BsYXlSb3dMaXN0UGFnZScgKVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0xpc3RQcm92aWRlci5kaXNwbGF5Um93TGlzdFBhZ2UoIHJlcyApXG4gICAgfVxuXG4gICAgb25Eb3dubG9hZENsaWNrKCBpdGVtOiBBdHRhY2htZW50c1RhYmxlUm93ICkge1xuICAgICAgICBpZiAoICF0aGlzLnJvd0xpc3RQcm92aWRlcj8uZG93bmxvYWRJdGVtICkgdGhyb3cgRXJyb3IoICdubyBwcm92aWRlciBmb3IgTGlzdEF0dGFjaG1lbnRzQ29tcG9uZW50LnJvd0xpc3RQcm92aWRlci5vbkRvd25sb2FkQ2xpY2snIClcblxuICAgICAgICByZXR1cm4gdGhpcy5yb3dMaXN0UHJvdmlkZXIuZG93bmxvYWRJdGVtKCBpdGVtIClcbiAgICB9XG5cbiAgICBvbkRlbGV0ZUNsaWNrKCBpdGVtOiBBdHRhY2htZW50c1RhYmxlUm93ICkge1xuICAgICAgICBpZiAoICF0aGlzLnJvd0xpc3RQcm92aWRlcj8uZGVsZXRlSXRlbSApIHRocm93IEVycm9yKCAnbm8gcHJvdmlkZXIgZm9yIExpc3RBdHRhY2htZW50c0NvbXBvbmVudC5yb3dMaXN0UHJvdmlkZXIub25EZWxldGVDbGljay4nIClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0xpc3RQcm92aWRlci5kZWxldGVJdGVtKCBpdGVtIClcbiAgICB9XG59XG4iLCI8bnJjbC1kZXZpY2Utdmlldz5cbiAgICA8bmctdGVtcGxhdGUgZGVza3RvcC12aWV3PlxuICAgICAgICBAaWYgKCByb3dzPy5sZW5ndGggPiAwICkge1xuICAgICAgICAgICAgPG5yY2wtcm93LWxpc3QtZGVza3RvcCBbc2hvd1Jvd0hvdmVyXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC10YWJsZVxuICAgICAgICAgICAgICAgICAgICBbZGF0YVNvdXJjZV09XCJyb3dzIHwgcGFnaW5hdGU6IHsgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2Rlc2t0b3AtYXR0YWNobWVudHMnLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zUGVyUGFnZTogcGFnZVNpemUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IHBhZ2VOdW1iZXIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogdG90YWxSb3dDb3VudCBcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdFNvcnRcbiAgICAgICAgICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwic29ydEFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRTb3J0RGlyZWN0aW9uXT1cInNvcnREaXJlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAobWF0U29ydENoYW5nZSk9XCJvblNvcnRDaGFuZ2UoICRldmVudCApXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYXR0YWNobWVudFR5cGVDb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5BdHRhY2htZW50IFR5cGU8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5yY2wtY2VsbC1jb250ZW50IHRvb2x0aXA+e3sgaXRlbS5hdHRhY2htZW50VHlwZURlc2NyaXB0aW9uIH19PC9ucmNsLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZmlsZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPkZpbGUgTmFtZTwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmZpbGVOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNvdXJjZU9iamVjdE5hbWVDb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5GaWxlIFR5cGU8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5maWxlRXh0ZW5zaW9uIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVwbG9hZGVkQnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlVwbG9hZGVkIEJ5PC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0udXBsb2FkZWRCeSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1cGxvYWRlZFRpbWVzdGFtcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+VXBsb2FkZWQgRGF0ZTwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnVwbG9hZGVkVGltZXN0YW1wIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5EZXNjcmlwdGlvbjwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmF0dGFjaG1lbnREZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkb3dubG9hZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5Eb3duJnNoeTtsb2FkPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxucmNsLWJ1dHRvbiBjb21wYWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJkb3dubG9hZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRvd25sb2FkQ2xpY2soIGl0ZW0gKVwiICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbnJjbC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5EZWxldGU8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5yY2wtYnV0dG9uIGNvbXBhY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZUNsaWNrKCBpdGVtIClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25yY2wtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L21hdC1oZWFkZXItcm93PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGl0ZW07IGNvbHVtbnM6IGNvbHVtbnM7XCI+PC9tYXQtcm93PlxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYmxlPlxuICAgICAgICAgICAgPC9ucmNsLXJvdy1saXN0LWRlc2t0b3A+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxucmNsLWdhcC8+XG4gICAgICAgIH1cblxuICAgICAgICA8bnJjbC1yb3ctbGlzdC1wYWdpbmF0aW9uXG4gICAgICAgICAgICBwYWdpbmF0aW9uSWQ9XCJkZXNrdG9wLWF0dGFjaG1lbnRzXCJcbiAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICBbcGFnZU51bWJlcl09XCJwYWdlTnVtYmVyXCJcbiAgICAgICAgICAgIFtyb3dDb3VudF09XCJ0b3RhbFJvd0NvdW50XCJcbiAgICAgICAgICAgIChwYWdlTnVtYmVyQ2hhbmdlKT1cIm9uUGFnZU51bWJlckNoYW5nZSggJGV2ZW50IClcIlxuICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoICRldmVudCApXCJcbiAgICAgICAgICAgIFtub1Jvd3NNZXNzYWdlXT1cIm5vUm93c01lc3NhZ2VcIlxuICAgICAgICA+PC9ucmNsLXJvdy1saXN0LXBhZ2luYXRpb24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSBtb2JpbGUtdmlldz5cbiAgICAgICAgPG5yY2wtZ2FwLz5cblxuICAgICAgICBAaWYgKCByb3dzPy5sZW5ndGggPiAwICkge1xuICAgICAgICAgICAgPG5yY2wtcm93LWxpc3Qtc29ydGluZ1xuICAgICAgICAgICAgICAgIFtzb3J0Q29sdW1uXT1cInNvcnRBY3RpdmVcIlxuICAgICAgICAgICAgICAgIFtzb3J0Q29sdW1uT3B0aW9uc109XCJzb3J0Q29sdW1uc1wiXG4gICAgICAgICAgICAgICAgW3NvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiXG4gICAgICAgICAgICAgICAgKHNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvbnJjbC1yb3ctbGlzdC1zb3J0aW5nPlxuXG4gICAgICAgICAgICA8bnJjbC1nYXAvPlxuXG4gICAgICAgICAgICA8bnJjbC1yb3ctbGlzdC1tb2JpbGU+XG4gICAgICAgICAgICAgICAgQGZvciAoIGl0ZW0gb2Ygcm93cyB8IHBhZ2luYXRlOiB7IFxuICAgICAgICAgICAgICAgICAgICBpZDogJ21vYmlsZS1hdHRhY2htZW50cycsIFxuICAgICAgICAgICAgICAgICAgICBpdGVtc1BlclBhZ2U6IHBhZ2VTaXplLCBcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IHBhZ2VOdW1iZXIsIFxuICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zOiB0b3RhbFJvd0NvdW50IFxuICAgICAgICAgICAgICAgIH07IHRyYWNrIGl0ZW0uYXR0YWNobWVudElkICkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBmdWxsLXdpZHRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPkZpbGUgbmFtZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWVcIj57eyBpdGVtLmZpbGVOYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+QXR0YWNobWVudCBUeXBlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPnt7IGl0ZW0uYXR0YWNobWVudFR5cGVEZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPkZpbGUgVHlwZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWVcIj57eyBpdGVtLmZpbGVFeHRlbnNpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5VcGxvYWRlZCBCeTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWVcIj57eyBpdGVtLnVwbG9hZGVkQnkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlVwbG9hZGVkIERhdGU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlXCI+e3sgaXRlbS51cGxvYWRlZFRpbWVzdGFtcCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24gZnVsbC13aWR0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5EZXNjcmlwdGlvbjwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWVcIj57eyBpdGVtLmF0dGFjaG1lbnREZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtZm9vdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIGNhbkRvd25sb2FkICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnJjbC1idXR0b24gY29tcGFjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJEb3dubG9hZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZG93bmxvYWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRG93bmxvYWRDbGljayggaXRlbSApXCIgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbnJjbC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICggY2FuRGVsZXRlICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnJjbC1idXR0b24gY29tcGFjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJEZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVDbGljayggaXRlbSApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbnJjbC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1mb290ZXI+ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L25yY2wtcm93LWxpc3QtbW9iaWxlPlxuXG4gICAgICAgICAgICA8bnJjbC1nYXAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPG5yY2wtcm93LWxpc3QtcGFnaW5hdGlvblxuICAgICAgICAgICAgcGFnaW5hdGlvbklkPVwibW9iaWxlLWF0dGFjaG1lbnRzXCJcbiAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICBbcGFnZU51bWJlcl09XCJwYWdlTnVtYmVyXCJcbiAgICAgICAgICAgIFtyb3dDb3VudF09XCJ0b3RhbFJvd0NvdW50XCJcbiAgICAgICAgICAgIChwYWdlTnVtYmVyQ2hhbmdlKT1cIm9uUGFnZU51bWJlckNoYW5nZSggJGV2ZW50IClcIlxuICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoICRldmVudCApXCJcbiAgICAgICAgICAgIFtub1Jvd3NNZXNzYWdlXT1cIm5vUm93c01lc3NhZ2VcIlxuICAgICAgICA+PC9ucmNsLXJvdy1saXN0LXBhZ2luYXRpb24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbnJjbC1kZXZpY2Utdmlldz5cbiJdfQ==
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1hdHRhY2htZW50cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uci1uZ3gtY29tcG9uZW50LWxpYi9zcmMvY29tcG9uZW50cy9saXN0LWF0dGFjaG1lbnRzL2xpc3QtYXR0YWNobWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnItbmd4LWNvbXBvbmVudC1saWIvc3JjL2NvbXBvbmVudHMvbGlzdC1hdHRhY2htZW50cy9saXN0LWF0dGFjaG1lbnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUVwRyxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBa0NyRCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsV0FBbUM7SUFOakY7O1FBUWEsY0FBUyxHQUFHLElBQUksQ0FBQTtRQUNoQixnQkFBVyxHQUFHLElBQUksQ0FBQTtRQUNsQixrQkFBYSxHQUFHLGlDQUFpQyxDQUFBO1FBRTFELGlCQUFZLEdBQUcsWUFBWSxDQUFBO1FBQzNCLFlBQU8sR0FBYSxFQUFFLENBQUE7UUFDdEIsZ0JBQVcsR0FBRztZQUNWLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFJLFdBQVcsRUFBRSxpQkFBaUIsRUFBRTtZQUNoRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQWMsV0FBVyxFQUFFLFdBQVcsRUFBRTtZQUMxRCxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFO1lBQzFELEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBWSxXQUFXLEVBQUUsYUFBYSxFQUFFO1lBQzVELEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFLLFdBQVcsRUFBRSxlQUFlLEVBQUU7WUFDOUQsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFXLFdBQVcsRUFBRSxhQUFhLEVBQUU7U0FDL0QsQ0FBQTtLQTZESjtJQTNERyxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSyxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUcsQ0FBQztZQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHO2dCQUNYLG9CQUFvQjtnQkFDcEIsVUFBVTtnQkFDVixzQkFBc0I7Z0JBQ3RCLFlBQVk7Z0JBQ1osbUJBQW1CO2dCQUNuQixhQUFhO2dCQUNiLEdBQUcsQ0FBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUU7Z0JBQzNDLEdBQUcsQ0FBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUU7YUFDMUMsQ0FBQTtRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTztZQUNILE1BQU0sRUFBRSxFQUFFO1lBQ1YsVUFBVSxFQUFFO2dCQUNSLFFBQVEsRUFBRSxFQUFFO2dCQUNaLFVBQVUsRUFBRSxDQUFDO2dCQUNiLFVBQVUsRUFBRSxtQkFBbUI7Z0JBQy9CLGFBQWEsRUFBRSxNQUFNO2FBQ3hCO1NBQ0osQ0FBQTtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7UUFDWixJQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxnQkFBZ0I7WUFBRyxNQUFNLEtBQUssQ0FBRSwyRUFBMkUsQ0FBRSxDQUFBO1FBRXpJLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQzNCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDcEMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELFNBQVMsQ0FBRSxHQUFRO1FBQ2YsSUFBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsa0JBQWtCO1lBQUcsTUFBTSxLQUFLLENBQUUsNkVBQTZFLENBQUUsQ0FBQTtRQUU3SSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUUsR0FBRyxDQUFFLENBQUE7SUFDekQsQ0FBQztJQUVELGVBQWUsQ0FBRSxJQUF5QjtRQUN0QyxJQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxZQUFZO1lBQUcsTUFBTSxLQUFLLENBQUUsMEVBQTBFLENBQUUsQ0FBQTtRQUVwSSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFFLElBQUksQ0FBRSxDQUFBO0lBQ3BELENBQUM7SUFFRCxhQUFhLENBQUUsSUFBeUI7UUFDcEMsSUFBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsVUFBVTtZQUFHLE1BQU0sS0FBSyxDQUFFLHlFQUF5RSxDQUFFLENBQUE7UUFFakksT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBRSxJQUFJLENBQUUsQ0FBQTtJQUNsRCxDQUFDO0lBRUQsYUFBYTtRQUNULGtCQUFrQjtJQUN0QixDQUFDOytHQTNFUSx3QkFBd0I7bUdBQXhCLHdCQUF3Qiw2T0NyQ3JDLGloUUErS0E7OzRGRDFJYSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0ksdUJBQXVCLG1CQUdoQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IFJvd0xpc3RCYXNlLCBSb3dMaXN0U3RhdGUgfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy9yb3ctbGlzdC5iYXNlXCI7XG5pbXBvcnQgeyBEQVRFX0ZPUk1BVFMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0ZS51dGlsXCI7XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRzVGFibGVSb3cgPSB7XG4gICAgYXR0YWNobWVudFR5cGVEZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZmlsZU5hbWU6IHN0cmluZ1xuICAgIGZpbGVFeHRlbnNpb246IHN0cmluZ1xuICAgIHVwbG9hZGVkQnk6IHN0cmluZ1xuICAgIHVwbG9hZGVkVGltZXN0YW1wOiBzdHJpbmdcbiAgICBhdHRhY2htZW50RGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGF0dGFjaG1lbnRJZDogc3RyaW5nIFxuICAgIGZpbGVJZDogc3RyaW5nXG4gICAgc291cmNlT2JqZWN0VW5pcXVlSWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBGZXRjaEF0dGFjaG1lbnRzUGFyYW1ldGVycyA9IHsgXG4gICAgcGFnZU51bWJlcjogbnVtYmVyIFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyIFxuICAgIHNvcnRDb2x1bW46IHN0cmluZyBcbiAgICBzb3J0RGlyZWN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50Um93TGlzdFByb3ZpZGVyPFIsTD1hbnk+IHtcbiAgICBmZXRjaEF0dGFjaG1lbnRzKCB4OiBGZXRjaEF0dGFjaG1lbnRzUGFyYW1ldGVycyApOiBPYnNlcnZhYmxlPEw+ICAgIFxuICAgIGRpc3BsYXlSb3dMaXN0UGFnZSggcmVzOiBMICk6IEF0dGFjaG1lbnRzVGFibGVSb3dbXVxuICAgIGRvd25sb2FkSXRlbSggaXRlbTogUiApOiBhbnlcbiAgICBkZWxldGVJdGVtKCBpdGVtOiBSICk6IGFueVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJucmNsLWxpc3QtYXR0YWNobWVudHNcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2xpc3QtYXR0YWNobWVudHMuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybDogXCIuL2xpc3QtYXR0YWNobWVudHMuY29tcG9uZW50LnNjc3NcIixcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBMaXN0QXR0YWNobWVudHNDb21wb25lbnQgZXh0ZW5kcyBSb3dMaXN0QmFzZTx7fSxBdHRhY2htZW50c1RhYmxlUm93PiBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgcm93TGlzdFByb3ZpZGVyPzogQXR0YWNobWVudFJvd0xpc3RQcm92aWRlcjxBdHRhY2htZW50c1RhYmxlUm93PlxuICAgIEBJbnB1dCgpIGNhbkRlbGV0ZSA9IHRydWVcbiAgICBASW5wdXQoKSBjYW5Eb3dubG9hZCA9IHRydWVcbiAgICBASW5wdXQoKSBub1Jvd3NNZXNzYWdlID0gXCJObyBhdHRhY2htZW50cyBoYXZlIGJlZW4gYWRkZWQuXCJcbiAgICBcbiAgICBEQVRFX0ZPUk1BVFMgPSBEQVRFX0ZPUk1BVFNcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSA9IFtdIFxuICAgIHNvcnRDb2x1bW5zID0gW1xuICAgICAgICB7IGNvZGU6ICdhdHRhY2htZW50VHlwZUNvZGUnLCAgIGRlc2NyaXB0aW9uOiAnQXR0YWNobWVudCBUeXBlJyB9LCBcbiAgICAgICAgeyBjb2RlOiAnZmlsZU5hbWUnLCAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgTmFtZScgfSwgXG4gICAgICAgIHsgY29kZTogJ3NvdXJjZU9iamVjdE5hbWVDb2RlJywgZGVzY3JpcHRpb246ICdGaWxlIFR5cGUnIH0sIFxuICAgICAgICB7IGNvZGU6ICd1cGxvYWRlZEJ5JywgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkZWQgQnknIH0sIFxuICAgICAgICB7IGNvZGU6ICd1cGxvYWRlZFRpbWVzdGFtcCcsICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkZWQgRGF0ZScgfSwgXG4gICAgICAgIHsgY29kZTogJ2Rlc2NyaXB0aW9uJywgICAgICAgICAgZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbicgfSAgXG4gICAgXVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoIGNoYW5nZXMuY2FuRG93bmxvYWQgfHwgY2hhbmdlcy5jYW5EZWxldGUgKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbIFxuICAgICAgICAgICAgICAgICdhdHRhY2htZW50VHlwZUNvZGUnLCBcbiAgICAgICAgICAgICAgICAnZmlsZU5hbWUnLCBcbiAgICAgICAgICAgICAgICAnc291cmNlT2JqZWN0TmFtZUNvZGUnLCBcbiAgICAgICAgICAgICAgICAndXBsb2FkZWRCeScsIFxuICAgICAgICAgICAgICAgICd1cGxvYWRlZFRpbWVzdGFtcCcsIFxuICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgICAgLi4uKCB0aGlzLmNhbkRvd25sb2FkID8gWydkb3dubG9hZCddIDogW10gKSxcbiAgICAgICAgICAgICAgICAuLi4oIHRoaXMuY2FuRGVsZXRlID8gWydkZWxldGUnXSA6IFtdIClcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpbml0aWFsUGFnZVN0YXRlKCk6IFJvd0xpc3RTdGF0ZTx7fT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsdGVyOiB7fSxcbiAgICAgICAgICAgIHBhZ2VDb25maWc6IHtcbiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMTAsXG4gICAgICAgICAgICAgICAgcGFnZU51bWJlcjogMSxcbiAgICAgICAgICAgICAgICBzb3J0QWN0aXZlOiAndXBsb2FkZWRUaW1lc3RhbXAnLFxuICAgICAgICAgICAgICAgIHNvcnREaXJlY3Rpb246ICdkZXNjJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoUm93TGlzdFBhZ2UoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKCAhdGhpcy5yb3dMaXN0UHJvdmlkZXI/LmZldGNoQXR0YWNobWVudHMgKSB0aHJvdyBFcnJvciggJ25vIHByb3ZpZGVyIGZvciBMaXN0QXR0YWNobWVudHNDb21wb25lbnQucm93TGlzdFByb3ZpZGVyLmZldGNoUm93TGlzdFBhZ2UnIClcblxuICAgICAgICByZXR1cm4gdGhpcy5yb3dMaXN0UHJvdmlkZXIuZmV0Y2hBdHRhY2htZW50cyh7XG4gICAgICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLnBhZ2VOdW1iZXIsXG4gICAgICAgICAgICBwYWdlUm93Q291bnQ6IHRoaXMucGFnZVNpemUsXG4gICAgICAgICAgICBzb3J0Q29sdW1uOiB0aGlzLnNvcnRBY3RpdmUsXG4gICAgICAgICAgICBzb3J0RGlyZWN0aW9uOiB0aGlzLnNvcnREaXJlY3Rpb24sXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcGFyc2VSb3dzKCByZXM6IGFueSApOiBBdHRhY2htZW50c1RhYmxlUm93W10ge1xuICAgICAgICBpZiAoICF0aGlzLnJvd0xpc3RQcm92aWRlcj8uZGlzcGxheVJvd0xpc3RQYWdlICkgdGhyb3cgRXJyb3IoICdubyBwcm92aWRlciBmb3IgTGlzdEF0dGFjaG1lbnRzQ29tcG9uZW50LnJvd0xpc3RQcm92aWRlci5kaXNwbGF5Um93TGlzdFBhZ2UnIClcblxuICAgICAgICByZXR1cm4gdGhpcy5yb3dMaXN0UHJvdmlkZXIuZGlzcGxheVJvd0xpc3RQYWdlKCByZXMgKVxuICAgIH1cbiAgICBcbiAgICBvbkRvd25sb2FkQ2xpY2soIGl0ZW06IEF0dGFjaG1lbnRzVGFibGVSb3cgKSB7XG4gICAgICAgIGlmICggIXRoaXMucm93TGlzdFByb3ZpZGVyPy5kb3dubG9hZEl0ZW0gKSB0aHJvdyBFcnJvciggJ25vIHByb3ZpZGVyIGZvciBMaXN0QXR0YWNobWVudHNDb21wb25lbnQucm93TGlzdFByb3ZpZGVyLm9uRG93bmxvYWRDbGljaycgKVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0xpc3RQcm92aWRlci5kb3dubG9hZEl0ZW0oIGl0ZW0gKVxuICAgIH1cblxuICAgIG9uRGVsZXRlQ2xpY2soIGl0ZW06IEF0dGFjaG1lbnRzVGFibGVSb3cgKSB7XG4gICAgICAgIGlmICggIXRoaXMucm93TGlzdFByb3ZpZGVyPy5kZWxldGVJdGVtICkgdGhyb3cgRXJyb3IoICdubyBwcm92aWRlciBmb3IgTGlzdEF0dGFjaG1lbnRzQ29tcG9uZW50LnJvd0xpc3RQcm92aWRlci5vbkRlbGV0ZUNsaWNrLicgKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRoaXMucm93TGlzdFByb3ZpZGVyLmRlbGV0ZUl0ZW0oIGl0ZW0gKVxuICAgIH1cblxuICAgIHNhdmVQYWdlU3RhdGUoKTogdm9pZCB7XG4gICAgICAgIC8vIHN0YXRlIG5vdCBzYXZlZFxuICAgIH1cbn1cbiIsIjxucmNsLWRldmljZS12aWV3PlxuICAgIDxuZy10ZW1wbGF0ZSBkZXNrdG9wLXZpZXc+XG4gICAgICAgIEBpZiAoIHJvd3M/Lmxlbmd0aCA+IDAgKSB7XG4gICAgICAgICAgICA8bnJjbC1yb3ctbGlzdC1kZXNrdG9wIFtzaG93Um93SG92ZXJdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYmxlXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cInJvd3MgfCBwYWdpbmF0ZTogcGFnaW5hdGVTdGF0ZSggJ2Rlc2t0b3AtYXR0YWNobWVudHMnIClcIlxuICAgICAgICAgICAgICAgICAgICBtYXRTb3J0XG4gICAgICAgICAgICAgICAgICAgIFttYXRTb3J0QWN0aXZlXT1cInNvcnRBY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKCAkZXZlbnQgKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImF0dGFjaG1lbnRUeXBlQ29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+QXR0YWNobWVudCBUeXBlPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxucmNsLWNlbGwtY29udGVudCB0b29sdGlwPnt7IGl0ZW0uYXR0YWNobWVudFR5cGVEZXNjcmlwdGlvbiB9fTwvbnJjbC1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZpbGVOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5GaWxlIE5hbWU8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5maWxlTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzb3VyY2VPYmplY3ROYW1lQ29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+RmlsZSBUeXBlPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZmlsZUV4dGVuc2lvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1cGxvYWRlZEJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5VcGxvYWRlZCBCeTwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnVwbG9hZGVkQnkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXBsb2FkZWRUaW1lc3RhbXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlVwbG9hZGVkIERhdGU8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS51cGxvYWRlZFRpbWVzdGFtcCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+RGVzY3JpcHRpb248L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5hdHRhY2htZW50RGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZG93bmxvYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+RG93biZzaHk7bG9hZDwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnJjbC1idXR0b24gY29tcGFjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZG93bmxvYWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Eb3dubG9hZENsaWNrKCBpdGVtIClcIiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25yY2wtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZWxldGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+RGVsZXRlPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxucmNsLWJ1dHRvbiBjb21wYWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJkZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVDbGljayggaXRlbSApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9ucmNsLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC9tYXQtaGVhZGVyLXJvdz5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCBpdGVtOyBjb2x1bW5zOiBjb2x1bW5zO1wiPjwvbWF0LXJvdz5cbiAgICAgICAgICAgICAgICA8L21hdC10YWJsZT5cbiAgICAgICAgICAgIDwvbnJjbC1yb3ctbGlzdC1kZXNrdG9wPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8bnJjbC1nYXAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPG5yY2wtcm93LWxpc3QtcGFnaW5hdGlvblxuICAgICAgICAgICAgcGFnaW5hdGlvbklkPVwiZGVza3RvcC1hdHRhY2htZW50c1wiXG4gICAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgW3BhZ2VOdW1iZXJdPVwicGFnZU51bWJlclwiXG4gICAgICAgICAgICBbcm93Q291bnRdPVwidG90YWxSb3dDb3VudFwiXG4gICAgICAgICAgICAocGFnZU51bWJlckNoYW5nZSk9XCJvblBhZ2VOdW1iZXJDaGFuZ2UoICRldmVudCApXCJcbiAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCAkZXZlbnQgKVwiXG4gICAgICAgICAgICBbbm9Sb3dzTWVzc2FnZV09XCJub1Jvd3NNZXNzYWdlXCJcbiAgICAgICAgPjwvbnJjbC1yb3ctbGlzdC1wYWdpbmF0aW9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgbW9iaWxlLXZpZXc+XG4gICAgICAgIDxucmNsLWdhcC8+XG5cbiAgICAgICAgQGlmICggcm93cz8ubGVuZ3RoID4gMCApIHtcbiAgICAgICAgICAgIDxucmNsLXJvdy1saXN0LXNvcnRpbmdcbiAgICAgICAgICAgICAgICBbc29ydENvbHVtbl09XCJzb3J0QWN0aXZlXCJcbiAgICAgICAgICAgICAgICBbc29ydENvbHVtbk9wdGlvbnNdPVwic29ydENvbHVtbnNcIlxuICAgICAgICAgICAgICAgIFtzb3J0RGlyZWN0aW9uXT1cInNvcnREaXJlY3Rpb25cIlxuICAgICAgICAgICAgICAgIChzb3J0Q2hhbmdlKT1cIm9uU29ydENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L25yY2wtcm93LWxpc3Qtc29ydGluZz5cblxuICAgICAgICAgICAgPG5yY2wtZ2FwLz5cblxuICAgICAgICAgICAgPG5yY2wtcm93LWxpc3QtbW9iaWxlPlxuICAgICAgICAgICAgICAgIEBmb3IgKCBpdGVtIG9mIHJvd3MgfCBwYWdpbmF0ZTogcGFnaW5hdGVTdGF0ZSggJ21vYmlsZS1hdHRhY2htZW50cycgKTsgdHJhY2sgaXRlbS5hdHRhY2htZW50SWQgKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGZ1bGwtd2lkdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RmlsZSBuYW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPnt7IGl0ZW0uZmlsZU5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5BdHRhY2htZW50IFR5cGU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlXCI+e3sgaXRlbS5hdHRhY2htZW50VHlwZURlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RmlsZSBUeXBlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPnt7IGl0ZW0uZmlsZUV4dGVuc2lvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlVwbG9hZGVkIEJ5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPnt7IGl0ZW0udXBsb2FkZWRCeSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VXBsb2FkZWQgRGF0ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWVcIj57eyBpdGVtLnVwbG9hZGVkVGltZXN0YW1wIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBmdWxsLXdpZHRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPkRlc2NyaXB0aW9uPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPnt7IGl0ZW0uYXR0YWNobWVudERlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1mb290ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICggY2FuRG93bmxvYWQgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxucmNsLWJ1dHRvbiBjb21wYWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkRvd25sb2FkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJkb3dubG9hZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Eb3dubG9hZENsaWNrKCBpdGVtIClcIiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9ucmNsLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCBjYW5EZWxldGUgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxucmNsLWJ1dHRvbiBjb21wYWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZUNsaWNrKCBpdGVtIClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9ucmNsLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWZvb3Rlcj4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbnJjbC1yb3ctbGlzdC1tb2JpbGU+XG5cbiAgICAgICAgICAgIDxucmNsLWdhcC8+XG4gICAgICAgIH1cblxuICAgICAgICA8bnJjbC1yb3ctbGlzdC1wYWdpbmF0aW9uXG4gICAgICAgICAgICBwYWdpbmF0aW9uSWQ9XCJtb2JpbGUtYXR0YWNobWVudHNcIlxuICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgIFtwYWdlTnVtYmVyXT1cInBhZ2VOdW1iZXJcIlxuICAgICAgICAgICAgW3Jvd0NvdW50XT1cInRvdGFsUm93Q291bnRcIlxuICAgICAgICAgICAgKHBhZ2VOdW1iZXJDaGFuZ2UpPVwib25QYWdlTnVtYmVyQ2hhbmdlKCAkZXZlbnQgKVwiXG4gICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSggJGV2ZW50IClcIlxuICAgICAgICAgICAgW25vUm93c01lc3NhZ2VdPVwibm9Sb3dzTWVzc2FnZVwiXG4gICAgICAgID48L25yY2wtcm93LWxpc3QtcGFnaW5hdGlvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9ucmNsLWRldmljZS12aWV3PlxuIl19
|