@tuki-io/tuki-widgets 0.0.82 → 0.0.85
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/di2mt/widgets/user-upgrade/types/user-upgrade.d.ts +14 -0
- package/di2mt/widgets/user-upgrade/user-upgrade-data-table/user-upgrade-data-table.component.d.ts +5 -1
- package/di2mt/widgets/user-upgrade/user-upgrade.service.d.ts +10 -2
- package/esm2020/di2mt/shared/components/summary-card/summary-card.component.mjs +2 -2
- package/esm2020/di2mt/shared/components/table-filters/table-filters.component.mjs +2 -2
- package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +4 -4
- package/esm2020/di2mt/widgets/upgrade-overview/cards/preconditions-status-list/preconditions-status-list-card.component.mjs +2 -2
- package/esm2020/di2mt/widgets/user-upgrade/types/user-upgrade.mjs +1 -1
- package/esm2020/di2mt/widgets/user-upgrade/user-upgrade-data-table/user-upgrade-data-table.component.mjs +82 -23
- package/esm2020/di2mt/widgets/user-upgrade/user-upgrade.service.mjs +21 -3
- package/esm2020/user-manage/src/classes/pagination.mjs +1 -1
- package/esm2020/users-list/src/users-list.component.mjs +3 -3
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +114 -35
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +2 -2
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +112 -35
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +2 -2
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ import { Component, inject, Input } from "@angular/core";
|
|
|
3
3
|
import { MatTableDataSource } from "@angular/material/table";
|
|
4
4
|
import { Subject, Subscription } from "rxjs";
|
|
5
5
|
import { takeUntil } from "rxjs";
|
|
6
|
-
import { UserUpgradeService } from "../user-upgrade.service";
|
|
6
|
+
import { FILTER_KEY_MAP, UserUpgradeService } from "../user-upgrade.service";
|
|
7
7
|
import { DEPENDENCIES_STATUS, STATUS_ENTRIES } from "../../../shared/types/constants";
|
|
8
8
|
import { APIService } from "../../../shared/services/api.service";
|
|
9
9
|
import { PAGINATION_SIZE_OPTIONS } from "../../../shared/constants/app.constants";
|
|
@@ -38,10 +38,13 @@ export class UserUpgradeDataTableComponent {
|
|
|
38
38
|
this.dataPending = true;
|
|
39
39
|
this.apiService.token = this.token;
|
|
40
40
|
this.userUpgradeService.customerId = this.customerId;
|
|
41
|
-
const subsc1 = this.userUpgradeService.getUserUpgradeRecords(this.pagination.pageSize, this.pagination.pageIndex)
|
|
41
|
+
const subsc1 = this.userUpgradeService.getUserUpgradeRecords(this.pagination.pageSize, this.pagination.pageIndex, this.activeFilters)
|
|
42
42
|
.pipe(takeUntil(this.destroy$))
|
|
43
43
|
.subscribe((results) => {
|
|
44
44
|
const records = results.content;
|
|
45
|
+
records.forEach(record => {
|
|
46
|
+
record.devicesWithExtensions = this.userUpgradeService.mapDevicesWithExtensions(record.devices, record.deviceDetails);
|
|
47
|
+
});
|
|
45
48
|
this.data = new MatTableDataSource(records);
|
|
46
49
|
this.pagination.total = results.totalElements;
|
|
47
50
|
this.dataPending = false;
|
|
@@ -75,17 +78,37 @@ export class UserUpgradeDataTableComponent {
|
|
|
75
78
|
this.pagination.pageSize = event.pageSize;
|
|
76
79
|
this.getData();
|
|
77
80
|
}
|
|
81
|
+
getSiteUpgradeStatusClass(status) {
|
|
82
|
+
switch (status.toLowerCase()) {
|
|
83
|
+
case 'ready':
|
|
84
|
+
return 'status-ready';
|
|
85
|
+
case 'partial ready':
|
|
86
|
+
return 'partial-ready';
|
|
87
|
+
case 'completed':
|
|
88
|
+
return 'completed';
|
|
89
|
+
case 'failed':
|
|
90
|
+
return 'failed';
|
|
91
|
+
case 'not ready':
|
|
92
|
+
return 'not-ready';
|
|
93
|
+
default:
|
|
94
|
+
return 'not-ready';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
78
97
|
changePerPageNumber(pageSizeEvent) {
|
|
79
98
|
this.pagination.pageSize = pageSizeEvent.value;
|
|
80
99
|
this.pagination.pageIndex = 0;
|
|
81
100
|
this.getData();
|
|
82
101
|
}
|
|
83
|
-
getData() {
|
|
102
|
+
getData(params) {
|
|
84
103
|
this.dataPending = true;
|
|
85
|
-
const subsc1 = this.userUpgradeService.getUserUpgradeRecords(this.pagination.pageSize, this.pagination.pageIndex)
|
|
104
|
+
const subsc1 = this.userUpgradeService.getUserUpgradeRecords(this.pagination.pageSize, this.pagination.pageIndex, params || {})
|
|
86
105
|
.pipe(takeUntil(this.destroy$))
|
|
87
106
|
.subscribe((result) => {
|
|
88
|
-
|
|
107
|
+
const records = result.content;
|
|
108
|
+
records.forEach(record => {
|
|
109
|
+
record.devicesWithExtensions = this.userUpgradeService.mapDevicesWithExtensions(record.devices, record.deviceDetails);
|
|
110
|
+
});
|
|
111
|
+
this.data = new MatTableDataSource(records);
|
|
89
112
|
this.pagination.total = result.totalElements;
|
|
90
113
|
this.dataPending = false;
|
|
91
114
|
});
|
|
@@ -197,27 +220,63 @@ export class UserUpgradeDataTableComponent {
|
|
|
197
220
|
}
|
|
198
221
|
this.userUpgradeService.bulkUpgrade(this.selection.selected);
|
|
199
222
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
if (
|
|
204
|
-
|
|
223
|
+
getFilterValue(input) {
|
|
224
|
+
if (input && input.value !== undefined)
|
|
225
|
+
return input.value; // e.g. {value,label}
|
|
226
|
+
if (input && input.target)
|
|
227
|
+
return input.target.value; // DOM event
|
|
228
|
+
return input; // plain value
|
|
229
|
+
}
|
|
230
|
+
isEmptyFilter(v) {
|
|
231
|
+
if (v === undefined || v === null)
|
|
232
|
+
return true;
|
|
233
|
+
if (typeof v === 'string') {
|
|
234
|
+
const s = v.trim().toLowerCase();
|
|
235
|
+
return s === '' || s === 'all';
|
|
205
236
|
}
|
|
206
|
-
|
|
207
|
-
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
onFilter(filterEvent) {
|
|
240
|
+
const rawKey = filterEvent.key;
|
|
241
|
+
const serverKey = FILTER_KEY_MAP[rawKey];
|
|
242
|
+
const value = this.getFilterValue(filterEvent.value);
|
|
243
|
+
const next = { ...this.activeFilters };
|
|
244
|
+
if (this.isEmptyFilter(value)) {
|
|
245
|
+
delete next[serverKey];
|
|
208
246
|
}
|
|
209
247
|
else {
|
|
210
|
-
|
|
248
|
+
// normalize to string for API (trim)
|
|
249
|
+
next[serverKey] = typeof value === 'string' ? value.trim() : String(value);
|
|
211
250
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
this.activeFilters[key] = filterValue;
|
|
251
|
+
this.activeFilters = next;
|
|
252
|
+
this.pagination.pageIndex = 0;
|
|
253
|
+
// quick fix for demo
|
|
254
|
+
if (this.activeFilters['upgradeStatus']) {
|
|
255
|
+
this.activeFilters['upgradeStatus'] = this.activeFilters['upgradeStatus']?.toUpperCase();
|
|
218
256
|
}
|
|
219
|
-
this.
|
|
257
|
+
this.getData(this.activeFilters);
|
|
220
258
|
}
|
|
259
|
+
/*onFilter(filterEvent: { key: string, value: any }) {
|
|
260
|
+
const {key, value} = filterEvent;
|
|
261
|
+
|
|
262
|
+
let filterValue: any;
|
|
263
|
+
if (value && value.value !== undefined) {
|
|
264
|
+
filterValue = value.value;
|
|
265
|
+
} else if (value && value.target) {
|
|
266
|
+
filterValue = value.target.value;
|
|
267
|
+
} else {
|
|
268
|
+
filterValue = value;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Handle "All" option or empty values - remove the filter
|
|
272
|
+
if (filterValue === 'all' || !filterValue || filterValue === '') {
|
|
273
|
+
delete this.activeFilters[key];
|
|
274
|
+
} else {
|
|
275
|
+
this.activeFilters[key] = filterValue;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
this.applyFilters();
|
|
279
|
+
}*/
|
|
221
280
|
setupCustomFilter() {
|
|
222
281
|
this.data.filterPredicate = (data, filter) => {
|
|
223
282
|
const filters = JSON.parse(filter || '{}');
|
|
@@ -278,10 +337,10 @@ export class UserUpgradeDataTableComponent {
|
|
|
278
337
|
}
|
|
279
338
|
}
|
|
280
339
|
UserUpgradeDataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeDataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
281
|
-
UserUpgradeDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserUpgradeDataTableComponent, selector: "tk-user-upgrade-data-table", inputs: { token: "token", customerId: "customerId" }, ngImport: i0, template: "<div *ngIf=\"dataPending\" class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"120\"></mat-progress-spinner>\r\n</div>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n class=\"upgrade-bulk-button\"\r\n color=\"primary\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"site-indicator\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devices; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.name || device }}</span>\r\n <span class=\"device-model\">{{ element.primaryExtension || 'No Extension' }}</span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div *ngIf=\"element.devices.length > 1\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"element.devices.length === 1\">\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devices[0]}}</span>\r\n </div>\r\n <span class=\"device-model\">{{ element.primaryExtension || 'No Extension' }}</span>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff6;z-index:200}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}.status-ready{color:#1170cf}#userUpgradeDataTable .flex-container{padding:0!important}::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}::ng-deep .progress-spinner-td{position:relative}::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#1170cf}.user-upgrade-table .device-info{display:flex;align-items:center;gap:12px}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:8px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border:1px solid #08599c!important;color:#08599c!important;background:white!important;border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important}.user-upgrade-table .upgrade-button:hover{background-color:#e3f2fd!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;z-index:1000;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark{color:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.SummaryCardComponent, selector: "tk-summary-card", inputs: ["value", "status", "description"] }, { kind: "component", type: i3.TableFiltersComponent, selector: "tk-table-filters", inputs: ["filters"], outputs: ["filter"] }, { 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: ["sticky", "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.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"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i8.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }] });
|
|
340
|
+
UserUpgradeDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserUpgradeDataTableComponent, selector: "tk-user-upgrade-data-table", inputs: { token: "token", customerId: "customerId" }, ngImport: i0, template: "<div *ngIf=\"dataPending\" class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"120\"></mat-progress-spinner>\r\n</div>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n class=\"upgrade-bulk-button\"\r\n color=\"primary\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getSiteUpgradeStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th class=\"device-td\" mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devicesWithExtensions; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.deviceName || device }}</span>\r\n <span class=\"device-model\">\r\n {{ device.extensions?.length ? 'Ext: ' + device.extensions.join(\", \") : 'No Extension' }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div class=\"multiple-dev-link\" *ngIf=\"element.devicesWithExtensions?.length > 1; else oneDevice\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <ng-template #oneDevice>\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devicesWithExtensions[0].deviceName}}</span>\r\n </div>\r\n <div class=\"device-model one-dev-extensions\">\r\n {{ element.devicesWithExtensions[0].extensions?.length ?\r\n 'Ext: ' + element.devicesWithExtensions[0].extensions?.join(\", \") : 'No Extension' }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff6;z-index:200}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}#userUpgradeDataTable .flex-container{padding:0!important}.multiple-dev-link{margin:0 0 0 13px}::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}::ng-deep .progress-spinner-td{position:relative}::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#737480}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:5px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .one-dev-extensions{margin:0 0 0 13px}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .device-td{padding:0 0 0 13px}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1170cf}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border:1px solid #08599c!important;color:#08599c!important;background:white!important;border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important}.user-upgrade-table .upgrade-button:hover{background-color:#e3f2fd!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease;z-index:1000}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark{color:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.SummaryCardComponent, selector: "tk-summary-card", inputs: ["value", "status", "description"] }, { kind: "component", type: i3.TableFiltersComponent, selector: "tk-table-filters", inputs: ["filters"], outputs: ["filter"] }, { 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: ["sticky", "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.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"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i8.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }] });
|
|
282
341
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeDataTableComponent, decorators: [{
|
|
283
342
|
type: Component,
|
|
284
|
-
args: [{ selector: 'tk-user-upgrade-data-table', template: "<div *ngIf=\"dataPending\" class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"120\"></mat-progress-spinner>\r\n</div>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n class=\"upgrade-bulk-button\"\r\n color=\"primary\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"site-indicator\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devices; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.name || device }}</span>\r\n <span class=\"device-model\">{{ element.primaryExtension || 'No Extension' }}</span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div *ngIf=\"element.devices.length > 1\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"element.devices.length === 1\">\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devices[0]}}</span>\r\n </div>\r\n <span class=\"device-model\">{{ element.primaryExtension || 'No Extension' }}</span>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff6;z-index:200}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}.status-ready{color:#1170cf}#userUpgradeDataTable .flex-container{padding:0!important}::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}::ng-deep .progress-spinner-td{position:relative}::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#1170cf}.user-upgrade-table .device-info{display:flex;align-items:center;gap:12px}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:8px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border:1px solid #08599c!important;color:#08599c!important;background:white!important;border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important}.user-upgrade-table .upgrade-button:hover{background-color:#e3f2fd!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;z-index:1000;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark{color:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"] }]
|
|
343
|
+
args: [{ selector: 'tk-user-upgrade-data-table', template: "<div *ngIf=\"dataPending\" class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"120\"></mat-progress-spinner>\r\n</div>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n class=\"upgrade-bulk-button\"\r\n color=\"primary\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getSiteUpgradeStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th class=\"device-td\" mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devicesWithExtensions; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.deviceName || device }}</span>\r\n <span class=\"device-model\">\r\n {{ device.extensions?.length ? 'Ext: ' + device.extensions.join(\", \") : 'No Extension' }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div class=\"multiple-dev-link\" *ngIf=\"element.devicesWithExtensions?.length > 1; else oneDevice\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <ng-template #oneDevice>\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devicesWithExtensions[0].deviceName}}</span>\r\n </div>\r\n <div class=\"device-model one-dev-extensions\">\r\n {{ element.devicesWithExtensions[0].extensions?.length ?\r\n 'Ext: ' + element.devicesWithExtensions[0].extensions?.join(\", \") : 'No Extension' }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff6;z-index:200}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}#userUpgradeDataTable .flex-container{padding:0!important}.multiple-dev-link{margin:0 0 0 13px}::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}::ng-deep .progress-spinner-td{position:relative}::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#737480}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:5px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .one-dev-extensions{margin:0 0 0 13px}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .device-td{padding:0 0 0 13px}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1170cf}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border:1px solid #08599c!important;color:#08599c!important;background:white!important;border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important}.user-upgrade-table .upgrade-button:hover{background-color:#e3f2fd!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease;z-index:1000}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark{color:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"] }]
|
|
285
344
|
}], propDecorators: { token: [{
|
|
286
345
|
type: Input
|
|
287
346
|
}], customerId: [{
|
|
@@ -300,4 +359,4 @@ const PAGINATION_DATA_DEFAULTS = {
|
|
|
300
359
|
SIZE: 10,
|
|
301
360
|
PAGE_INDEX: 0
|
|
302
361
|
};
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL2RpMm10L3dpZGdldHMvdXNlci11cGdyYWRlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9kaTJtdC93aWRnZXRzL3VzZXItdXBncmFkZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUFrQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUF5QixrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBVSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7Ozs7QUFTbEYsTUFBTSxPQUFPLDZCQUE2QjtJQU4xQztRQU9VLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLHVCQUFr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LEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDMUIsSUFBSSxFQUFFLEVBQUU7SUFDUixVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgaW5qZWN0LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL3R5cGVzL2RhdGEtdGFibGVcIjtcclxuaW1wb3J0IHsgVGFibGVGaWx0ZXIgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL3R5cGVzL3RhYmxlL2ZpbHRlclwiO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVXNlcjJVcGdyYWRlU3RhdHVzRFRPLCBVc2VyVXBncmFkZVNlcnZpY2UgfSBmcm9tIFwiLi4vdXNlci11cGdyYWRlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgREVQRU5ERU5DSUVTX1NUQVRVUywgU3RhdHVzLCBTVEFUVVNfRU5UUklFUyB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvdHlwZXMvY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IFVzZXJVcGdyYWRlUmVjb3JkIH0gZnJvbSBcIi4uL3R5cGVzL3VzZXItdXBncmFkZVwiO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQQUdJTkFUSU9OX1NJWkVfT1BUSU9OUyB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvY29uc3RhbnRzL2FwcC5jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGstdXNlci11cGdyYWRlLWRhdGEtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICAvLyBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb21cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJVcGdyYWRlRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgdXNlclVwZ3JhZGVTZXJ2aWNlID0gaW5qZWN0KFVzZXJVcGdyYWRlU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFQSVNlcnZpY2UpO1xyXG4gIHJlYWRvbmx5IFNUQVRVU19FTlRSSUVTID0gU1RBVFVTX0VOVFJJRVM7XHJcbiAgcmVhZG9ubHkgREVQRU5ERU5DSUVTX1NUQVRVUyA9IERFUEVOREVOQ0lFU19TVEFUVVM7XHJcblxyXG4gIEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGN1c3RvbWVySWQhOiBzdHJpbmc7XHJcblxyXG4gIGNvbHVtbnMhOiBUYWJsZUNvbHVtbltdO1xyXG4gIGRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgZGF0YSE6IE1hdFRhYmxlRGF0YVNvdXJjZTxVc2VyVXBncmFkZVJlY29yZD47XHJcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbJ3NlbGVjdCcsICd1c2VyJywgJ3NpdGUnLCAnZGV2aWNlJywgJ2RpYWxQbGFuU3RhdHVzJywgJ2RlcGVuZGVuY2llcycsICd1c2VyVXBncmFkZVN0YXR1cycsICd1c2VyVXBncmFkZUxvYWRlciddO1xyXG4gIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxVc2VyVXBncmFkZVJlY29yZD4odHJ1ZSwgW10pO1xyXG4gIGZpbHRlcnM6IFRhYmxlRmlsdGVyW10gPSBbXTtcclxuICBwYWdpbmF0aW9uID0gbmV3IFBhZ2luYXRpb25EYXRhRHRvKCk7XHJcbiAgdXNlcnM6IFVzZXJVcGdyYWRlUmVjb3JkW10gPSBbXTtcclxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIHN0YXR1c0NvdW50czogYW55ID0ge307XHJcblxyXG4gIHByaXZhdGUgYWN0aXZlRmlsdGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0YVBlbmRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLnRva2VuID0gdGhpcy50b2tlbjtcclxuICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmN1c3RvbWVySWQgPSB0aGlzLmN1c3RvbWVySWQ7XHJcblxyXG4gICAgY29uc3Qgc3Vic2MxID0gdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlclVwZ3JhZGVSZWNvcmRzKHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSwgdGhpcy5wYWdpbmF0aW9uLnBhZ2VJbmRleClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHRzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCByZWNvcmRzID0gcmVzdWx0cy5jb250ZW50IGFzIFVzZXJVcGdyYWRlUmVjb3JkW11cclxuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlY29yZHMpO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvbi50b3RhbCA9IHJlc3VsdHMudG90YWxFbGVtZW50cztcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXR1cEN1c3RvbUZpbHRlcigpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZpbHRlcnMocmVjb3Jkcyk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzYzEpO1xyXG5cclxuICAgIGNvbnN0IHN1YnNjMiA9IHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmdldFVzZXJVcGdyYWRlU3RhdHVzQ291bnRzKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChzdGF0dXNDb3VudHMpID0+IHtcclxuICAgICAgICB0aGlzLnN0YXR1c0NvdW50c1snUmVhZHknXSA9IHN0YXR1c0NvdW50c1snUkVBRFknXSB8fCAwO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQ291bnRzWydOb3QgUmVhZHknXSA9IHN0YXR1c0NvdW50c1snTk9UX1JFQURZJ10gfHwgMDtcclxuICAgICAgICB0aGlzLnN0YXR1c0NvdW50c1snQ29tcGxldGVkJ10gPSBzdGF0dXNDb3VudHNbJ0NPTVBMRVRFRCddIHx8IDA7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNDb3VudHNbJ0ZhaWxlZCddID0gc3RhdHVzQ291bnRzWydGQUlMRUQnXSB8fCAwO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc3Vic2MyKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTXVsdGlwbGVEZXZpY2VzKHVzZXI6IFVzZXJVcGdyYWRlUmVjb3JkKTogdm9pZCB7XHJcbiAgICB1c2VyLnNob3dEZXZpY2VzID0gIXVzZXIuc2hvd0RldmljZXM7XHJcbiAgfVxyXG5cclxuICBwYWdlRXZlbnQgKGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XHJcbiAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBldmVudC5wYWdlU2l6ZTtcclxuICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlUGVyUGFnZU51bWJlcihwYWdlU2l6ZUV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHBhZ2VTaXplRXZlbnQudmFsdWU7XHJcbiAgICB0aGlzLnBhZ2luYXRpb24ucGFnZUluZGV4ID0gMDtcclxuICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBzdWJzYzEgPSB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5nZXRVc2VyVXBncmFkZVJlY29yZHModGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplLCB0aGlzLnBhZ2luYXRpb24ucGFnZUluZGV4KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlc3VsdC5jb250ZW50KTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb24udG90YWwgPSByZXN1bHQudG90YWxFbGVtZW50cztcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzYzEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplRmlsdGVycyhyZWNvcmRzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKHJlY29yZHM/Lmxlbmd0aCkge1xyXG4gICAgICAvLyBFeHRyYWN0IHVuaXF1ZSBzaXRlcyBmcm9tIGFjdHVhbCBkYXRhXHJcbiAgICAgIGNvbnN0IHVuaXF1ZVNpdGVzID0gWy4uLm5ldyBTZXQocmVjb3Jkcy5tYXAocmVjb3JkID0+IHJlY29yZC5zaXRlTmFtZSkpXTtcclxuICAgICAgY29uc3Qgc2l0ZU9wdGlvbnMgPSB1bmlxdWVTaXRlcy5tYXAoc2l0ZSA9PiAoe1xyXG4gICAgICAgIGxhYmVsOiBzaXRlLFxyXG4gICAgICAgIHZhbHVlOiBzaXRlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICAgIC8vIEV4dHJhY3QgdW5pcXVlIHN0YXR1c2VzIGZyb20gYWN0dWFsIGRhdGFcclxuICAgICAgY29uc3QgdW5pcXVlU3RhdHVzZXMgPSBbLi4ubmV3IFNldChyZWNvcmRzLm1hcChyZWNvcmQgPT4gcmVjb3JkLnVwZ3JhZGVTdGF0dXMpKV07XHJcbiAgICAgIGNvbnN0IHN0YXR1c09wdGlvbnMgPSB1bmlxdWVTdGF0dXNlcy5tYXAoc3RhdHVzID0+ICh7XHJcbiAgICAgICAgbGFiZWw6IFNUQVRVU19FTlRSSUVTW3N0YXR1c10sXHJcbiAgICAgICAgdmFsdWU6IHN0YXR1cy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKVxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcnMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWQ6ICd1c2VyTmFtZScsXHJcbiAgICAgICAgICB0eXBlOiAnc2VhcmNoJyxcclxuICAgICAgICAgIGNvbHVtbktleTogJ1VzZXInLFxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2ggdXNlcnMuLi4nLFxyXG4gICAgICAgICAgb3B0aW9uczogW11cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiAnc2l0ZXMnLFxyXG4gICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXHJcbiAgICAgICAgICBjb2x1bW5LZXk6ICdTaXRlJyxcclxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnU2l0ZXMnLFxyXG4gICAgICAgICAgb3B0aW9uczogc2l0ZU9wdGlvbnNcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiAnc3RhdHVzJyxcclxuICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxyXG4gICAgICAgICAgY29sdW1uS2V5OiAnVXNlciBVcGdyYWRlIFN0YXR1cycsXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ1VwZ3JhZGUgU3RhdHVzJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHN0YXR1c09wdGlvbnNcclxuICAgICAgICB9XHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVsZW1lbnRzIG1hdGNoZXMgdGhlIHRvdGFsIG51bWJlciBvZiByb3dzLiAqL1xyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGE/LmRhdGEubGVuZ3RoID8/IDA7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICAvKiogU2VsZWN0cyBhbGwgcm93cyBpZiB0aGV5IGFyZSBub3QgYWxsIHNlbGVjdGVkOyBvdGhlcndpc2UgY2xlYXIgc2VsZWN0aW9uLiAqL1xyXG4gIG1hc3RlclRvZ2dsZSgpIHtcclxuICAgIC8vIHRoaXMuaXNBbGxTZWxlY3RlZCgpID9cclxuICAgIC8vICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKSA6XHJcbiAgICAvLyAgIHRoaXMuZGF0YT8uZGF0YS5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XHJcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YT8uZGF0YS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgICAgaWYgKHJvdy51cGdyYWRlU3RhdHVzID09PSAnUkVBRFknKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGdyYWRlVXNlcih1c2VyOiBVc2VyVXBncmFkZVJlY29yZCk6IHZvaWQge1xyXG4gICAgaWYgKHVzZXI/LnVwZ3JhZGVTdGF0dXMgPT09ICdSRUFEWScpXHJcbiAgICAgIHVzZXIucGVuZGluZyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5jb2xsZWN0VXNlcnMoW3VzZXJdKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmJ1bGtVcGdyYWRlKFt1c2VyXSlcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdHVzQWZ0ZXJVcGdyYWRlKFt1c2VyXSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVVc2Vyc1N0YXR1c0FmdGVyVXBncmFkZSh1c2VyczogVXNlclVwZ3JhZGVSZWNvcmRbXSk6IHZvaWQge1xyXG4gICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlcnNVcGdyYWRlU3RhdHVzZXModXNlcnMpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgodXBncmFkZWRTdGF0dXNlczogVXNlcjJVcGdyYWRlU3RhdHVzRFRPW10pID0+IHtcclxuICAgICAgICB1cGdyYWRlZFN0YXR1c2VzLmZvckVhY2goc3RhdHVzSXRlbSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbmQgPSB0aGlzLmdldFVzZXJJbmRleChzdGF0dXNJdGVtLnVzZXJJZCk7XHJcbiAgICAgICAgICBpZiAoaW5kID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLmRhdGFbaW5kXS51cGdyYWRlU3RhdHVzID0gc3RhdHVzSXRlbS51cGdyYWRlU3RhdHVzO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuZGF0YVtpbmRdLnBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckluZGV4KHVzZXJJZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGEuZGF0YS5maW5kSW5kZXgoKHJlY29yZDogVXNlclVwZ3JhZGVSZWNvcmQpID0+IHJlY29yZC51c2VySWQgPT09IHVzZXJJZCk7XHJcbiAgfVxyXG5cclxuICB1cGdyYWRlU2VsZWN0ZWRVc2VycygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCAmJiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5jb2xsZWN0VXNlcnModGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuYnVsa1VwZ3JhZGUodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXR1c0FmdGVyVXBncmFkZSh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuYnVsa1VwZ3JhZGUodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXIoZmlsdGVyRXZlbnQ6IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkgfSkge1xyXG4gICAgY29uc3Qge2tleSwgdmFsdWV9ID0gZmlsdGVyRXZlbnQ7XHJcblxyXG4gICAgbGV0IGZpbHRlclZhbHVlOiBhbnk7XHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9IHZhbHVlLnZhbHVlO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS50YXJnZXQpIHtcclxuICAgICAgZmlsdGVyVmFsdWUgPSB2YWx1ZS50YXJnZXQudmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBcIkFsbFwiIG9wdGlvbiBvciBlbXB0eSB2YWx1ZXMgLSByZW1vdmUgdGhlIGZpbHRlclxyXG4gICAgaWYgKGZpbHRlclZhbHVlID09PSAnYWxsJyB8fCAhZmlsdGVyVmFsdWUgfHwgZmlsdGVyVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZUZpbHRlcnNba2V5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlRmlsdGVyc1trZXldID0gZmlsdGVyVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBDdXN0b21GaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmRhdGEuZmlsdGVyUHJlZGljYXRlID0gKGRhdGE6IGFueSwgZmlsdGVyOiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgZmlsdGVycyA9IEpTT04ucGFyc2UoZmlsdGVyIHx8ICd7fScpO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVycykpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgICAgIGNhc2UgJ1VzZXInOlxyXG4gICAgICAgICAgICBjb25zdCBzZWFyY2hUZXJtID0gKHZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgaWYgKCFkYXRhLnVzZXJOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdTaXRlJzpcclxuICAgICAgICAgICAgaWYgKGRhdGEuc2l0ZU5hbWUgIT09IHRoaXMuZ2V0U2l0ZU5hbWVGcm9tVmFsdWUodmFsdWUgYXMgc3RyaW5nKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ1VzZXIgVXBncmFkZSBTdGF0dXMnOlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2hlc1VwZ3JhZGVTdGF0dXMoZGF0YS51cGdyYWRlU3RhdHVzLCB2YWx1ZSBhcyBzdHJpbmcpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLmRhdGEuZmlsdGVyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5hY3RpdmVGaWx0ZXJzKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZERhdGFDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uZmlsdGVyZWREYXRhPy5sZW5ndGggfHwgMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2l0ZU5hbWVGcm9tVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAvLyBTaW5jZSB3ZSdyZSBub3cgdXNpbmcgYWN0dWFsIHNpdGUgbmFtZXMsIGp1c3QgY29udmVydCBiYWNrIGZyb20gc2x1ZyBmb3JtYXRcclxuICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLScpLm1hcCh3b3JkID0+XHJcbiAgICAgIHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpXHJcbiAgICApLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWF0Y2hlc1VwZ3JhZGVTdGF0dXMoc3RhdHVzOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vIEhhbmRsZSBkaXJlY3Qgc3RhdHVzIG1hdGNoaW5nIGZvciBjbGVhbmVyIGltcGxlbWVudGF0aW9uXHJcbiAgICByZXR1cm4gc3RhdHVzLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpID09PSBmaWx0ZXJWYWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzQ2xhc3Moc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChzdGF0dXMudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdyZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdyZWFkeSc7XHJcbiAgICAgIGNhc2UgJ25vdCByZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdub3QtcmVhZHknO1xyXG4gICAgICBjYXNlICdwYXJ0aWFsIHJlYWR5JzpcclxuICAgICAgICByZXR1cm4gJ3BhcnRpYWwtcmVhZHknO1xyXG4gICAgICBjYXNlICdjb21wbGV0ZWQnOlxyXG4gICAgICAgIHJldHVybiAnY29tcGxldGVkJztcclxuICAgICAgY2FzZSAnZmFpbGVkJzpcclxuICAgICAgICByZXR1cm4gJ2ZhaWxlZCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdub3QtcmVhZHknO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZ2VTaXplT3B0aW9ucyA9IFBBR0lOQVRJT05fU0laRV9PUFRJT05TO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUGFnaW5hdGlvbkRhdGFEdG9JbnRlcmZhY2Uge1xyXG4gIHRvdGFsOiBudW1iZXI7XHJcbiAgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXTtcclxuICBwYWdlU2l6ZTogbnVtYmVyO1xyXG4gIHBhZ2VJbmRleDogbnVtYmVyO1xyXG59XHJcbmNsYXNzIFBhZ2luYXRpb25EYXRhRHRvIHtcclxuICB0b3RhbCE6IG51bWJlcjtcclxuICBwYWdlU2l6ZU9wdGlvbnMhOiBudW1iZXJbXTtcclxuICBwYWdlU2l6ZSE6IG51bWJlcjtcclxuICBwYWdlSW5kZXghOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRhdGE/OiBQYWdpbmF0aW9uRGF0YUR0b0ludGVyZmFjZSkge1xyXG4gICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnMgPSBkYXRhPy5wYWdlU2l6ZU9wdGlvbnMgfHwgUEFHSU5BVElPTl9EQVRBX0RFRkFVTFRTLk9QVElPTlM7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gZGF0YT8ucGFnZVNpemUgfHwgUEFHSU5BVElPTl9EQVRBX0RFRkFVTFRTLlNJWkU7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGRhdGE/LnBhZ2VJbmRleCB8fCBQQUdJTkFUSU9OX0RBVEFfREVGQVVMVFMuUEFHRV9JTkRFWDtcclxuICAgIHRoaXMudG90YWwgPSBkYXRhPy50b3RhbCB8fCAwO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgUEFHSU5BVElPTl9EQVRBX0RFRkFVTFRTID0ge1xyXG4gIE9QVElPTlM6IFsxMCwgMjAsIDUwLCAxMDBdLFxyXG4gIFNJWkU6IDEwLFxyXG4gIFBBR0VfSU5ERVg6IDBcclxufTtcclxuIiwiPGRpdiAqbmdJZj1cImRhdGFQZW5kaW5nXCIgY2xhc3M9XCJvdmVybGF5XCI+XHJcbiAgPG1hdC1wcm9ncmVzcy1zcGlubmVyXHJcbiAgICBjbGFzcz1cInBhZ2Utc3Bpbm5lclwiXHJcbiAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXHJcbiAgICBbZGlhbWV0ZXJdPVwiMTIwXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGlkPVwidXNlclVwZ3JhZGVEYXRhVGFibGVcIiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLXVwZ3JhZGUtc3RhdHVzLXdyYXBwZXJcIj5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInVXNlcnMgYXJlIHJlYWR5IHRvIHVwZ3JhZGUnXCIgW3ZhbHVlXT1cInN0YXR1c0NvdW50c1snUmVhZHknXVwiPjwvdGstc3VtbWFyeS1jYXJkPlxyXG4gICAgICAgIDx0ay1zdW1tYXJ5LWNhcmQgW2Rlc2NyaXB0aW9uXT1cIidVc2VycyBhcmUgbm90IHJlYWR5J1wiIFt2YWx1ZV09XCJzdGF0dXNDb3VudHNbJ05vdCBSZWFkeSddXCIgW3N0YXR1c109XCInTm90IFJlYWR5J1wiPjwvdGstc3VtbWFyeS1jYXJkPlxyXG4gICAgICAgIDx0ay1zdW1tYXJ5LWNhcmQgW2Rlc2NyaXB0aW9uXT1cIidVc2VycyBmYWlsZWQgdG8gdXBncmFkZSdcIiBbdmFsdWVdPVwic3RhdHVzQ291bnRzWydGYWlsZWQnXVwiIFtzdGF0dXNdPVwiJ0ZhaWxlZCdcIj48L3RrLXN1bW1hcnktY2FyZD5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInU3VjY2Vzc2Z1bGx5IHVwZ3JhZGVkJ1wiIFt2YWx1ZV09XCJzdGF0dXNDb3VudHNbJ0NvbXBsZXRlZCddXCIgW3N0YXR1c109XCInQ29tcGxldGVkJ1wiPjwvdGstc3VtbWFyeS1jYXJkPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtYWN0aW9uLXBhbmVsXCI+XHJcbiAgICAgICAgPHRrLXRhYmxlLWZpbHRlcnMgKm5nSWY9XCJmaWx0ZXJzLmxlbmd0aCA+IDBcIiBbZmlsdGVyc109XCJmaWx0ZXJzXCIgKGZpbHRlcik9XCJvbkZpbHRlcigkZXZlbnQpXCI+PC90ay10YWJsZS1maWx0ZXJzPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24td3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57e2ZpbHRlcmVkRGF0YUNvdW50fX0gVXNlcnM8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidXBncmFkZS1idWxrLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPT09IDBcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZ3JhZGVTZWxlY3RlZFVzZXJzKClcIj5cclxuICAgICAgICAgICAgICAgIFVwZ3JhZGUge3sgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCA/ICcnIDogJygnICsgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCArICcpJyB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhXCIgY2xhc3M9XCJ1c2VyLXVwZ3JhZGUtdGFibGVcIj5cclxuXHJcbiAgICAgICAgPCEtLSBDaGVja2JveCBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZSgpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUocm93KSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJTVEFUVVNfRU5UUklFU1tyb3cudXBncmFkZVN0YXR1c10gIT09ICdSZWFkeScgfHwgcm93LnBlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBVc2VyIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5Vc2VyPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1uYW1lXCI+e3tlbGVtZW50LnVzZXJOYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1lbWFpbFwiPnt7ZWxlbWVudC51c2VyTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBTaXRlIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNpdGVcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5TaXRlPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXRlLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpdGUtaW5kaWNhdG9yXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsnc3RhdHVzLXJlYWR5JzogZWxlbWVudC5kaWFsUGxhblN0YXR1cyA9PT0gJ1JFQURZJ31cIj57e2VsZW1lbnQuc2l0ZU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIERldmljZSBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXZpY2VcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5EZXZpY2U8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibXVsdGktZGV2LWJveFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlbGVtZW50LnNob3dEZXZpY2VzXCIgY2xhc3M9XCJkZXZpY2UtbGlzdCBzaG93LWRldi1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkZXZpY2Ugb2YgZWxlbWVudC5kZXZpY2VzOyBsZXQgbGFzdCA9IGxhc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldmljZS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5vLWJvcmRlcl09XCJsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLWluZGljYXRvclwiIFtuZ0NsYXNzXT1cInsnZGV2aWNlLWluZGljYXRvci1yZWFkeSc6IGVsZW1lbnQuZGV2aWNlU3RhdHVzID09PSAnUkVBRFknfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXZpY2UtbmFtZVwiPnt7IGRldmljZS5uYW1lIHx8IGRldmljZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXZpY2UtbW9kZWxcIj57eyBlbGVtZW50LnByaW1hcnlFeHRlbnNpb24gfHwgJ05vIEV4dGVuc2lvbicgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlbGVtZW50LmRldmljZXMubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV2aWNlLW5hbWUtd3JhcHBlciBjbGlja2FibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uTXVsdGlwbGVEZXZpY2VzKGVsZW1lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbk11bHRpcGxlRGV2aWNlcyhlbGVtZW50KVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLW5hbWVcIj5NdWx0aXBsZSBkZXZpY2VzID48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlbGVtZW50LmRldmljZXMubGVuZ3RoID09PSAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtbmFtZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1pbmRpY2F0b3JcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1uYW1lXCI+e3tlbGVtZW50LmRldmljZXNbMF19fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLW1vZGVsXCI+e3sgZWxlbWVudC5wcmltYXJ5RXh0ZW5zaW9uIHx8ICdObyBFeHRlbnNpb24nIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGlhbCBQbGFuIFN0YXR1cyBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkaWFsUGxhblN0YXR1c1wiPlxyXG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkRpYWwgUGxhbiBTdGF0dXM8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQ2xhc3MoZWxlbWVudC5kaWFsUGxhblN0YXR1cylcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsnc3RhdHVzLXJlYWR5JzogZWxlbWVudC5kaWFsUGxhblN0YXR1cyA9PT0gJ1JFQURZJ31cIj57e1NUQVRVU19FTlRSSUVTW2VsZW1lbnQuZGlhbFBsYW5TdGF0dXNdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBEZXBlbmRlbmNpZXMgQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGVwZW5kZW5jaWVzXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+RGVwZW5kZW5jaWVzPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiREVQRU5ERU5DSUVTX1NUQVRVU1tlbGVtZW50LmRlcGVuZGVuY2llc1N0YXR1c10gPT09ICdEZXBlbmRlbmNpZXMgZm91bmQnXCIgY2xhc3M9XCJkZXBlbmRlbmNpZXMtdGV4dFwiPnt7REVQRU5ERU5DSUVTX1NUQVRVU1tlbGVtZW50LmRlcGVuZGVuY2llc1N0YXR1c119fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiREVQRU5ERU5DSUVTX1NUQVRVU1tlbGVtZW50LmRlcGVuZGVuY2llc1N0YXR1c10gPT09ICdObyBkZXBlbmRlbmNpZXMnXCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIFVzZXIgVXBncmFkZSBTdGF0dXMgQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXNlclVwZ3JhZGVTdGF0dXNcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5Vc2VyIFVwZ3JhZGUgU3RhdHVzPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGdyYWRlLXN0YXR1cy1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlNUQVRVU19FTlRSSUVTW2VsZW1lbnQudXBncmFkZVN0YXR1c10gPT09ICdSZWFkeSc7IGVsc2Ugc3RhdHVzQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwidXBncmFkZS1idXR0b25cIiAoY2xpY2spPVwidXBncmFkZVVzZXIoZWxlbWVudClcIj5VcGdyYWRlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdGF0dXNCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pbmRpY2F0b3JcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNDbGFzcyhlbGVtZW50LnVwZ3JhZGVTdGF0dXMpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tTVEFUVVNfRU5UUklFU1tlbGVtZW50LnVwZ3JhZGVTdGF0dXNdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJVcGdyYWRlTG9hZGVyXCI+XHJcbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1wcm9ncmVzcy1zcGlubmVyLXRkXCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG5cclxuICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxyXG4gICAgICAgICAgICAqbmdJZj1cImVsZW1lbnQucGVuZGluZ1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3Bpbm5lclwiXHJcbiAgICAgICAgICAgIFtkaWFtZXRlcl09XCIyMFwiXHJcbiAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCI+XHJcbiAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxyXG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZC1yb3ddPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiPjwvdHI+XHJcbiAgICA8L3RhYmxlPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJhcHAtcGFnaW5hdGlvblwiPlxyXG4gIDxtYXQtcGFnaW5hdG9yXHJcbiAgICBbbGVuZ3RoXT1cInBhZ2luYXRpb24udG90YWxcIlxyXG4gICAgW3BhZ2VTaXplXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxyXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdpbmF0aW9uLnBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICBbcGFnZUluZGV4XT1cInBhZ2luYXRpb24ucGFnZUluZGV4XCJcclxuICAgIChwYWdlKT1cInBhZ2VFdmVudCgkZXZlbnQpXCJcclxuICAgIHNob3dGaXJzdExhc3RCdXR0b25zPlxyXG4gIDwvbWF0LXBhZ2luYXRvcj5cclxuXHJcbiAgPCEtLTxkaXYgY2xhc3M9XCJwYWdlLWluZGV4ZXMtYm94XCI+XHJcbiAgICA8bWF0LXBhZ2luYXRvclxyXG4gICAgICBbaWRdPVwiJ2NvbW1vblBhZ2luYXRpb24nXCJcclxuICAgICAgW2hpZGVQYWdlU2l6ZV09XCJ0cnVlXCJcclxuICAgICAgW2xlbmd0aF09XCJwYWdpbmF0aW9uLnRvdGFsXCJcclxuICAgICAgW3BhZ2VJbmRleF09XCJwYWdpbmF0aW9uLnBhZ2VJbmRleFwiXHJcbiAgICAgIFtwYWdlU2l6ZV09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcclxuICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdpbmF0aW9uLnBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgIChwYWdlKT1cInBhZ2VFdmVudCgkZXZlbnQpXCI+XHJcbiAgICA8L21hdC1wYWdpbmF0b3I+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJwZXItcGFnZS1ibG9ja1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cIml0ZW1fcGVyX3BhZ2VcIj5JdGVtcyBwZXIgcGFnZTo8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtYm94IHNlbGVjdC1wYWdlLXNpemVcIj5cclxuICAgICAgPG1hdC1zZWxlY3QgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VQZXJQYWdlTnVtYmVyKCRldmVudClcIiAjcGFnZVxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiJ2NvbW1vblBhZ2luYXRpb25TZWxlY3QnXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwYWdlU2l6ZU9wdGlvbnM7IGxldCBpID0gaW5kZXg7XCIgW2lkXT1cIidwYWdpbmF0aW9uU2VsZWN0T3B0XycgKyBpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9ufX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj4tLT5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
362
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL2RpMm10L3dpZGdldHMvdXNlci11cGdyYWRlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9kaTJtdC93aWRnZXRzL3VzZXItdXBncmFkZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUFrQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUNMLGNBQWMsRUFJZCxrQkFBa0IsRUFDbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsbUJBQW1CLEVBQVUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7Ozs7O0FBU2xGLE1BQU0sT0FBTyw2QkFBNkI7SUFOMUM7UUFPVSxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztR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O2dCQUNkLE9BQU8sV0FBVyxDQUFDO1lBQ3JCLEtBQUssUUFBUTtnQkFDWCxPQUFPLFFBQVEsQ0FBQztZQUNsQjtnQkFDRSxPQUFPLFdBQVcsQ0FBQztTQUN0QjtJQUNILENBQUM7OzJIQXZXVSw2QkFBNkI7K0dBQTdCLDZCQUE2Qix3SEMxQjFDLG04VEEwTUE7NEZEaExhLDZCQUE2QjtrQkFOekMsU0FBUzsrQkFDRSw0QkFBNEI7OEJBWTdCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLOztBQTBXUixNQUFNLGlCQUFpQjtJQU1yQixZQUFZLElBQWlDO1FBQzNDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxFQUFFLGVBQWUsSUFBSSx3QkFBd0IsQ0FBQyxPQUFPLENBQUM7UUFDakYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsUUFBUSxJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQztRQUNoRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksRUFBRSxTQUFTLElBQUksd0JBQXdCLENBQUMsVUFBVSxDQUFDO1FBQ3hFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQsTUFBTSx3QkFBd0IsR0FBRztJQUMvQixPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDMUIsSUFBSSxFQUFFLEVBQUU7SUFDUixVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgaW5qZWN0LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL3R5cGVzL2RhdGEtdGFibGVcIjtcclxuaW1wb3J0IHsgVGFibGVGaWx0ZXIgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL3R5cGVzL3RhYmxlL2ZpbHRlclwiO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtcclxuICBGSUxURVJfS0VZX01BUCxcclxuICBVaUZpbHRlcktleSxcclxuICBVc2VyMlVwZ3JhZGVTdGF0dXNEVE8sXHJcbiAgVXNlclNlYXJjaFBhcmFtcyxcclxuICBVc2VyVXBncmFkZVNlcnZpY2VcclxufSBmcm9tIFwiLi4vdXNlci11cGdyYWRlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgREVQRU5ERU5DSUVTX1NUQVRVUywgU3RhdHVzLCBTVEFUVVNfRU5UUklFUyB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvdHlwZXMvY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IFVzZXJVcGdyYWRlUmVjb3JkIH0gZnJvbSBcIi4uL3R5cGVzL3VzZXItdXBncmFkZVwiO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQQUdJTkFUSU9OX1NJWkVfT1BUSU9OUyB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvY29uc3RhbnRzL2FwcC5jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGstdXNlci11cGdyYWRlLWRhdGEtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICAvLyBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb21cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJVcGdyYWRlRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgdXNlclVwZ3JhZGVTZXJ2aWNlID0gaW5qZWN0KFVzZXJVcGdyYWRlU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFQSVNlcnZpY2UpO1xyXG4gIHJlYWRvbmx5IFNUQVRVU19FTlRSSUVTID0gU1RBVFVTX0VOVFJJRVM7XHJcbiAgcmVhZG9ubHkgREVQRU5ERU5DSUVTX1NUQVRVUyA9IERFUEVOREVOQ0lFU19TVEFUVVM7XHJcblxyXG4gIEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGN1c3RvbWVySWQhOiBzdHJpbmc7XHJcblxyXG4gIGNvbHVtbnMhOiBUYWJsZUNvbHVtbltdO1xyXG4gIGRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgZGF0YSE6IE1hdFRhYmxlRGF0YVNvdXJjZTxVc2VyVXBncmFkZVJlY29yZD47XHJcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbJ3NlbGVjdCcsICd1c2VyJywgJ3NpdGUnLCAnZGV2aWNlJywgJ2RpYWxQbGFuU3RhdHVzJywgJ2RlcGVuZGVuY2llcycsICd1c2VyVXBncmFkZVN0YXR1cycsICd1c2VyVXBncmFkZUxvYWRlciddO1xyXG4gIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxVc2VyVXBncmFkZVJlY29yZD4odHJ1ZSwgW10pO1xyXG4gIGZpbHRlcnM6IFRhYmxlRmlsdGVyW10gPSBbXTtcclxuICBwYWdpbmF0aW9uID0gbmV3IFBhZ2luYXRpb25EYXRhRHRvKCk7XHJcbiAgdXNlcnM6IFVzZXJVcGdyYWRlUmVjb3JkW10gPSBbXTtcclxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIHN0YXR1c0NvdW50czogYW55ID0ge307XHJcblxyXG4gIHByaXZhdGUgYWN0aXZlRmlsdGVyczogUGFydGlhbDxVc2VyU2VhcmNoUGFyYW1zPiA9IHt9O1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0YVBlbmRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLnRva2VuID0gdGhpcy50b2tlbjtcclxuICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmN1c3RvbWVySWQgPSB0aGlzLmN1c3RvbWVySWQ7XHJcblxyXG4gICAgY29uc3Qgc3Vic2MxID0gdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlclVwZ3JhZGVSZWNvcmRzKHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSwgdGhpcy5wYWdpbmF0aW9uLnBhZ2VJbmRleCwgdGhpcy5hY3RpdmVGaWx0ZXJzKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdHM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlY29yZHMgPSByZXN1bHRzLmNvbnRlbnQgYXMgVXNlclVwZ3JhZGVSZWNvcmRbXVxyXG4gICAgICAgIHJlY29yZHMuZm9yRWFjaChyZWNvcmQgPT4ge1xyXG4gICAgICAgICAgcmVjb3JkLmRldmljZXNXaXRoRXh0ZW5zaW9ucyA9IHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLm1hcERldmljZXNXaXRoRXh0ZW5zaW9ucyhyZWNvcmQuZGV2aWNlcywgcmVjb3JkLmRldmljZURldGFpbHMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVjb3Jkcyk7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnRvdGFsID0gcmVzdWx0cy50b3RhbEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldHVwQ3VzdG9tRmlsdGVyKCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRmlsdGVycyhyZWNvcmRzKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHN1YnNjMSk7XHJcblxyXG4gICAgY29uc3Qgc3Vic2MyID0gdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlclVwZ3JhZGVTdGF0dXNDb3VudHMoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXR1c0NvdW50cykgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQ291bnRzWydSZWFkeSddID0gc3RhdHVzQ291bnRzWydSRUFEWSddIHx8IDA7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNDb3VudHNbJ05vdCBSZWFkeSddID0gc3RhdHVzQ291bnRzWydOT1RfUkVBRFknXSB8fCAwO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQ291bnRzWydDb21wbGV0ZWQnXSA9IHN0YXR1c0NvdW50c1snQ09NUExFVEVEJ10gfHwgMDtcclxuICAgICAgICB0aGlzLnN0YXR1c0NvdW50c1snRmFpbGVkJ10gPSBzdGF0dXNDb3VudHNbJ0ZBSUxFRCddIHx8IDA7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzYzIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIHRoaXMuZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25NdWx0aXBsZURldmljZXModXNlcjogVXNlclVwZ3JhZGVSZWNvcmQpOiB2b2lkIHtcclxuICAgIHVzZXIuc2hvd0RldmljZXMgPSAhdXNlci5zaG93RGV2aWNlcztcclxuICB9XHJcblxyXG4gIHBhZ2VFdmVudCAoZXZlbnQ6IFBhZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VJbmRleCA9IGV2ZW50LnBhZ2VJbmRleDtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBnZXRTaXRlVXBncmFkZVN0YXR1c0NsYXNzKHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoc3RhdHVzLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgY2FzZSAncmVhZHknOlxyXG4gICAgICAgIHJldHVybiAnc3RhdHVzLXJlYWR5JztcclxuICAgICAgY2FzZSAncGFydGlhbCByZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdwYXJ0aWFsLXJlYWR5JztcclxuICAgICAgY2FzZSAnY29tcGxldGVkJzpcclxuICAgICAgICByZXR1cm4gJ2NvbXBsZXRlZCc7XHJcbiAgICAgIGNhc2UgJ2ZhaWxlZCc6XHJcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xyXG4gICAgICBjYXNlICdub3QgcmVhZHknOlxyXG4gICAgICAgIHJldHVybiAnbm90LXJlYWR5JztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ25vdC1yZWFkeSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VQZXJQYWdlTnVtYmVyKHBhZ2VTaXplRXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gcGFnZVNpemVFdmVudC52YWx1ZTtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERhdGEocGFyYW1zPzogVXNlclNlYXJjaFBhcmFtcyk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBzdWJzYzEgPSB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5nZXRVc2VyVXBncmFkZVJlY29yZHModGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplLCB0aGlzLnBhZ2luYXRpb24ucGFnZUluZGV4LCBwYXJhbXMgfHwge30pXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVjb3JkcyA9IHJlc3VsdC5jb250ZW50IGFzIFVzZXJVcGdyYWRlUmVjb3JkW11cclxuICAgICAgICByZWNvcmRzLmZvckVhY2gocmVjb3JkID0+IHtcclxuICAgICAgICAgIHJlY29yZC5kZXZpY2VzV2l0aEV4dGVuc2lvbnMgPSB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5tYXBEZXZpY2VzV2l0aEV4dGVuc2lvbnMocmVjb3JkLmRldmljZXMsIHJlY29yZC5kZXZpY2VEZXRhaWxzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZWNvcmRzKTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb24udG90YWwgPSByZXN1bHQudG90YWxFbGVtZW50cztcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzYzEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplRmlsdGVycyhyZWNvcmRzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKHJlY29yZHM/Lmxlbmd0aCkge1xyXG4gICAgICAvLyBFeHRyYWN0IHVuaXF1ZSBzaXRlcyBmcm9tIGFjdHVhbCBkYXRhXHJcbiAgICAgIGNvbnN0IHVuaXF1ZVNpdGVzID0gWy4uLm5ldyBTZXQocmVjb3Jkcy5tYXAocmVjb3JkID0+IHJlY29yZC5zaXRlTmFtZSkpXTtcclxuICAgICAgY29uc3Qgc2l0ZU9wdGlvbnMgPSB1bmlxdWVTaXRlcy5tYXAoc2l0ZSA9PiAoe1xyXG4gICAgICAgIGxhYmVsOiBzaXRlLFxyXG4gICAgICAgIHZhbHVlOiBzaXRlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICAgIC8vIEV4dHJhY3QgdW5pcXVlIHN0YXR1c2VzIGZyb20gYWN0dWFsIGRhdGFcclxuICAgICAgY29uc3QgdW5pcXVlU3RhdHVzZXMgPSBbLi4ubmV3IFNldChyZWNvcmRzLm1hcChyZWNvcmQgPT4gcmVjb3JkLnVwZ3JhZGVTdGF0dXMpKV07XHJcbiAgICAgIGNvbnN0IHN0YXR1c09wdGlvbnMgPSB1bmlxdWVTdGF0dXNlcy5tYXAoc3RhdHVzID0+ICh7XHJcbiAgICAgICAgbGFiZWw6IFNUQVRVU19FTlRSSUVTW3N0YXR1c10sXHJcbiAgICAgICAgdmFsdWU6IHN0YXR1cy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKVxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcnMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWQ6ICd1c2VyTmFtZScsXHJcbiAgICAgICAgICB0eXBlOiAnc2VhcmNoJyxcclxuICAgICAgICAgIGNvbHVtbktleTogJ1VzZXInLFxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2ggdXNlcnMuLi4nLFxyXG4gICAgICAgICAgb3B0aW9uczogW11cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiAnc2l0ZXMnLFxyXG4gICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXHJcbiAgICAgICAgICBjb2x1bW5LZXk6ICdTaXRlJyxcclxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnU2l0ZXMnLFxyXG4gICAgICAgICAgb3B0aW9uczogc2l0ZU9wdGlvbnNcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiAnc3RhdHVzJyxcclxuICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxyXG4gICAgICAgICAgY29sdW1uS2V5OiAnVXNlciBVcGdyYWRlIFN0YXR1cycsXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ1VwZ3JhZGUgU3RhdHVzJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHN0YXR1c09wdGlvbnNcclxuICAgICAgICB9XHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVsZW1lbnRzIG1hdGNoZXMgdGhlIHRvdGFsIG51bWJlciBvZiByb3dzLiAqL1xyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGE/LmRhdGEubGVuZ3RoID8/IDA7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICAvKiogU2VsZWN0cyBhbGwgcm93cyBpZiB0aGV5IGFyZSBub3QgYWxsIHNlbGVjdGVkOyBvdGhlcndpc2UgY2xlYXIgc2VsZWN0aW9uLiAqL1xyXG4gIG1hc3RlclRvZ2dsZSgpIHtcclxuICAgIC8vIHRoaXMuaXNBbGxTZWxlY3RlZCgpID9cclxuICAgIC8vICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKSA6XHJcbiAgICAvLyAgIHRoaXMuZGF0YT8uZGF0YS5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XHJcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YT8uZGF0YS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgICAgaWYgKHJvdy51cGdyYWRlU3RhdHVzID09PSAnUkVBRFknKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGdyYWRlVXNlcih1c2VyOiBVc2VyVXBncmFkZVJlY29yZCk6IHZvaWQge1xyXG4gICAgaWYgKHVzZXI/LnVwZ3JhZGVTdGF0dXMgPT09ICdSRUFEWScpXHJcbiAgICAgIHVzZXIucGVuZGluZyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5jb2xsZWN0VXNlcnMoW3VzZXJdKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmJ1bGtVcGdyYWRlKFt1c2VyXSlcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdHVzQWZ0ZXJVcGdyYWRlKFt1c2VyXSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVVc2Vyc1N0YXR1c0FmdGVyVXBncmFkZSh1c2VyczogVXNlclVwZ3JhZGVSZWNvcmRbXSk6IHZvaWQge1xyXG4gICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlcnNVcGdyYWRlU3RhdHVzZXModXNlcnMpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgodXBncmFkZWRTdGF0dXNlczogVXNlcjJVcGdyYWRlU3RhdHVzRFRPW10pID0+IHtcclxuICAgICAgICB1cGdyYWRlZFN0YXR1c2VzLmZvckVhY2goc3RhdHVzSXRlbSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbmQgPSB0aGlzLmdldFVzZXJJbmRleChzdGF0dXNJdGVtLnVzZXJJZCk7XHJcbiAgICAgICAgICBpZiAoaW5kID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLmRhdGFbaW5kXS51cGdyYWRlU3RhdHVzID0gc3RhdHVzSXRlbS51cGdyYWRlU3RhdHVzO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuZGF0YVtpbmRdLnBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckluZGV4KHVzZXJJZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGEuZGF0YS5maW5kSW5kZXgoKHJlY29yZDogVXNlclVwZ3JhZGVSZWNvcmQpID0+IHJlY29yZC51c2VySWQgPT09IHVzZXJJZCk7XHJcbiAgfVxyXG5cclxuICB1cGdyYWRlU2VsZWN0ZWRVc2VycygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCAmJiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5jb2xsZWN0VXNlcnModGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuYnVsa1VwZ3JhZGUodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXR1c0FmdGVyVXBncmFkZSh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuYnVsa1VwZ3JhZGUodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJWYWx1ZShpbnB1dDogYW55KTogYW55IHtcclxuICAgIGlmIChpbnB1dCAmJiBpbnB1dC52YWx1ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gaW5wdXQudmFsdWU7ICAgICAgLy8gZS5nLiB7dmFsdWUsbGFiZWx9XHJcbiAgICBpZiAoaW5wdXQgJiYgaW5wdXQudGFyZ2V0KSByZXR1cm4gaW5wdXQudGFyZ2V0LnZhbHVlOyAgICAgICAgICAgIC8vIERPTSBldmVudFxyXG4gICAgcmV0dXJuIGlucHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFpbiB2YWx1ZVxyXG4gIH1cclxuICBwcml2YXRlIGlzRW1wdHlGaWx0ZXIodjogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCBzID0gdi50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgcmV0dXJuIHMgPT09ICcnIHx8IHMgPT09ICdhbGwnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXIoZmlsdGVyRXZlbnQ6IHsga2V5OiBVaUZpbHRlcktleTsgdmFsdWU6IGFueSB9KSB7XHJcbiAgICBjb25zdCByYXdLZXkgPSBmaWx0ZXJFdmVudC5rZXk7XHJcbiAgICBjb25zdCBzZXJ2ZXJLZXkgPSBGSUxURVJfS0VZX01BUFtyYXdLZXldO1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldEZpbHRlclZhbHVlKGZpbHRlckV2ZW50LnZhbHVlKTtcclxuXHJcbiAgICBjb25zdCBuZXh0OiBQYXJ0aWFsPFVzZXJTZWFyY2hQYXJhbXM+ID0geyAuLi50aGlzLmFjdGl2ZUZpbHRlcnMgfTtcclxuXHJcbiAgICBpZiAodGhpcy5pc0VtcHR5RmlsdGVyKHZhbHVlKSkge1xyXG4gICAgICBkZWxldGUgbmV4dFtzZXJ2ZXJLZXldO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gbm9ybWFsaXplIHRvIHN0cmluZyBmb3IgQVBJICh0cmltKVxyXG4gICAgICBuZXh0W3NlcnZlcktleV0gPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudHJpbSgpIDogU3RyaW5nKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjdGl2ZUZpbHRlcnMgPSBuZXh0O1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VJbmRleCA9IDA7XHJcblxyXG4gICAgLy8gcXVpY2sgZml4IGZvciBkZW1vXHJcbiAgICBpZiAodGhpcy5hY3RpdmVGaWx0ZXJzWyd1cGdyYWRlU3RhdHVzJ10pIHtcclxuICAgICAgdGhpcy5hY3RpdmVGaWx0ZXJzWyd1cGdyYWRlU3RhdHVzJ10gPSB0aGlzLmFjdGl2ZUZpbHRlcnNbJ3VwZ3JhZGVTdGF0dXMnXT8udG9VcHBlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldERhdGEodGhpcy5hY3RpdmVGaWx0ZXJzIGFzIFVzZXJTZWFyY2hQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgLypvbkZpbHRlcihmaWx0ZXJFdmVudDogeyBrZXk6IHN0cmluZywgdmFsdWU6IGFueSB9KSB7XHJcbiAgICBjb25zdCB7a2V5LCB2YWx1ZX0gPSBmaWx0ZXJFdmVudDtcclxuXHJcbiAgICBsZXQgZmlsdGVyVmFsdWU6IGFueTtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpbHRlclZhbHVlID0gdmFsdWUudmFsdWU7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLnRhcmdldCkge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9IHZhbHVlLnRhcmdldC52YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbHRlclZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIFwiQWxsXCIgb3B0aW9uIG9yIGVtcHR5IHZhbHVlcyAtIHJlbW92ZSB0aGUgZmlsdGVyXHJcbiAgICBpZiAoZmlsdGVyVmFsdWUgPT09ICdhbGwnIHx8ICFmaWx0ZXJWYWx1ZSB8fCBmaWx0ZXJWYWx1ZSA9PT0gJycpIHtcclxuICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlRmlsdGVyc1trZXldO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVGaWx0ZXJzW2tleV0gPSBmaWx0ZXJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xyXG4gIH0qL1xyXG5cclxuICBwcml2YXRlIHNldHVwQ3VzdG9tRmlsdGVyKCkge1xyXG4gICAgdGhpcy5kYXRhLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhOiBhbnksIGZpbHRlcjogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSBKU09OLnBhcnNlKGZpbHRlciB8fCAne30nKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgICBjYXNlICdVc2VyJzpcclxuICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9ICh2YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGlmICghZGF0YS51c2VyTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnU2l0ZSc6XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnNpdGVOYW1lICE9PSB0aGlzLmdldFNpdGVOYW1lRnJvbVZhbHVlKHZhbHVlIGFzIHN0cmluZykpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdVc2VyIFVwZ3JhZGUgU3RhdHVzJzpcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoZXNVcGdyYWRlU3RhdHVzKGRhdGEudXBncmFkZVN0YXR1cywgdmFsdWUgYXMgc3RyaW5nKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJzKCkge1xyXG4gICAgdGhpcy5kYXRhLmZpbHRlciA9IEpTT04uc3RyaW5naWZ5KHRoaXMuYWN0aXZlRmlsdGVycyk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWREYXRhQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmZpbHRlcmVkRGF0YT8ubGVuZ3RoIHx8IDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNpdGVOYW1lRnJvbVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgLy8gU2luY2Ugd2UncmUgbm93IHVzaW5nIGFjdHVhbCBzaXRlIG5hbWVzLCBqdXN0IGNvbnZlcnQgYmFjayBmcm9tIHNsdWcgZm9ybWF0XHJcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJy0nKS5tYXAod29yZCA9PlxyXG4gICAgICB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxyXG4gICAgKS5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hdGNoZXNVcGdyYWRlU3RhdHVzKHN0YXR1czogc3RyaW5nLCBmaWx0ZXJWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBIYW5kbGUgZGlyZWN0IHN0YXR1cyBtYXRjaGluZyBmb3IgY2xlYW5lciBpbXBsZW1lbnRhdGlvblxyXG4gICAgcmV0dXJuIHN0YXR1cy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKSA9PT0gZmlsdGVyVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIGdldFN0YXR1c0NsYXNzKHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoc3RhdHVzLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgY2FzZSAncmVhZHknOlxyXG4gICAgICAgIHJldHVybiAncmVhZHknO1xyXG4gICAgICBjYXNlICdub3QgcmVhZHknOlxyXG4gICAgICAgIHJldHVybiAnbm90LXJlYWR5JztcclxuICAgICAgY2FzZSAncGFydGlhbCByZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdwYXJ0aWFsLXJlYWR5JztcclxuICAgICAgY2FzZSAnY29tcGxldGVkJzpcclxuICAgICAgICByZXR1cm4gJ2NvbXBsZXRlZCc7XHJcbiAgICAgIGNhc2UgJ2ZhaWxlZCc6XHJcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnbm90LXJlYWR5JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWFkb25seSBwYWdlU2l6ZU9wdGlvbnMgPSBQQUdJTkFUSU9OX1NJWkVfT1BUSU9OUztcclxufVxyXG5cclxuaW50ZXJmYWNlIFBhZ2luYXRpb25EYXRhRHRvSW50ZXJmYWNlIHtcclxuICB0b3RhbDogbnVtYmVyO1xyXG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW107XHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICBwYWdlSW5kZXg6IG51bWJlcjtcclxufVxyXG5jbGFzcyBQYWdpbmF0aW9uRGF0YUR0byB7XHJcbiAgdG90YWwhOiBudW1iZXI7XHJcbiAgcGFnZVNpemVPcHRpb25zITogbnVtYmVyW107XHJcbiAgcGFnZVNpemUhOiBudW1iZXI7XHJcbiAgcGFnZUluZGV4ITogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihkYXRhPzogUGFnaW5hdGlvbkRhdGFEdG9JbnRlcmZhY2UpIHtcclxuICAgIHRoaXMucGFnZVNpemVPcHRpb25zID0gZGF0YT8ucGFnZVNpemVPcHRpb25zIHx8IFBBR0lOQVRJT05fREFUQV9ERUZBVUxUUy5PUFRJT05TO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IGRhdGE/LnBhZ2VTaXplIHx8IFBBR0lOQVRJT05fREFUQV9ERUZBVUxUUy5TSVpFO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSBkYXRhPy5wYWdlSW5kZXggfHwgUEFHSU5BVElPTl9EQVRBX0RFRkFVTFRTLlBBR0VfSU5ERVg7XHJcbiAgICB0aGlzLnRvdGFsID0gZGF0YT8udG90YWwgfHwgMDtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IFBBR0lOQVRJT05fREFUQV9ERUZBVUxUUyA9IHtcclxuICBPUFRJT05TOiBbMTAsIDIwLCA1MCwgMTAwXSxcclxuICBTSVpFOiAxMCxcclxuICBQQUdFX0lOREVYOiAwXHJcbn07XHJcbiIsIjxkaXYgKm5nSWY9XCJkYXRhUGVuZGluZ1wiIGNsYXNzPVwib3ZlcmxheVwiPlxyXG4gIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxyXG4gICAgY2xhc3M9XCJwYWdlLXNwaW5uZXJcIlxyXG4gICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxyXG4gICAgW2RpYW1ldGVyXT1cIjEyMFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBpZD1cInVzZXJVcGdyYWRlRGF0YVRhYmxlXCIgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidXNlci11cGdyYWRlLXN0YXR1cy13cmFwcGVyXCI+XHJcbiAgICAgICAgPHRrLXN1bW1hcnktY2FyZCBbZGVzY3JpcHRpb25dPVwiJ1VzZXJzIGFyZSByZWFkeSB0byB1cGdyYWRlJ1wiIFt2YWx1ZV09XCJzdGF0dXNDb3VudHNbJ1JlYWR5J11cIj48L3RrLXN1bW1hcnktY2FyZD5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInVXNlcnMgYXJlIG5vdCByZWFkeSdcIiBbdmFsdWVdPVwic3RhdHVzQ291bnRzWydOb3QgUmVhZHknXVwiIFtzdGF0dXNdPVwiJ05vdCBSZWFkeSdcIj48L3RrLXN1bW1hcnktY2FyZD5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInVXNlcnMgZmFpbGVkIHRvIHVwZ3JhZGUnXCIgW3ZhbHVlXT1cInN0YXR1c0NvdW50c1snRmFpbGVkJ11cIiBbc3RhdHVzXT1cIidGYWlsZWQnXCI+PC90ay1zdW1tYXJ5LWNhcmQ+XHJcbiAgICAgICAgPHRrLXN1bW1hcnktY2FyZCBbZGVzY3JpcHRpb25dPVwiJ1N1Y2Nlc3NmdWxseSB1cGdyYWRlZCdcIiBbdmFsdWVdPVwic3RhdHVzQ291bnRzWydDb21wbGV0ZWQnXVwiIFtzdGF0dXNdPVwiJ0NvbXBsZXRlZCdcIj48L3RrLXN1bW1hcnktY2FyZD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWFjdGlvbi1wYW5lbFwiPlxyXG4gICAgICAgIDx0ay10YWJsZS1maWx0ZXJzICpuZ0lmPVwiZmlsdGVycy5sZW5ndGggPiAwXCIgW2ZpbHRlcnNdPVwiZmlsdGVyc1wiIChmaWx0ZXIpPVwib25GaWx0ZXIoJGV2ZW50KVwiPjwvdGstdGFibGUtZmlsdGVycz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3tmaWx0ZXJlZERhdGFDb3VudH19IFVzZXJzPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInVwZ3JhZGUtYnVsay1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID09PSAwXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGdyYWRlU2VsZWN0ZWRVc2VycygpXCI+XHJcbiAgICAgICAgICAgICAgICBVcGdyYWRlIHt7IHNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPT09IDAgPyAnJyA6ICcoJyArIHNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggKyAnKScgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVwiIGNsYXNzPVwidXNlci11cGdyYWRlLXRhYmxlXCI+XHJcblxyXG4gICAgICAgIDwhLS0gQ2hlY2tib3ggQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIGlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKHJvdykgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiU1RBVFVTX0VOVFJJRVNbcm93LnVwZ3JhZGVTdGF0dXNdICE9PSAnUmVhZHknIHx8IHJvdy5wZW5kaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gVXNlciBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1c2VyXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+VXNlcjwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItbmFtZVwiPnt7ZWxlbWVudC51c2VyTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItZW1haWxcIj57e2VsZW1lbnQudXNlck5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gU2l0ZSBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzaXRlXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+U2l0ZTwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2l0ZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWluZGljYXRvclwiIFtuZ0NsYXNzXT1cImdldFNpdGVVcGdyYWRlU3RhdHVzQ2xhc3MoZWxlbWVudC51cGdyYWRlU3RhdHVzKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2VsZW1lbnQuc2l0ZU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIERldmljZSBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXZpY2VcIj5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiZGV2aWNlLXRkXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkRldmljZTwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtdWx0aS1kZXYtYm94XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVsZW1lbnQuc2hvd0RldmljZXNcIiBjbGFzcz1cImRldmljZS1saXN0IHNob3ctZGV2LWxpc3RcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRldmljZSBvZiBlbGVtZW50LmRldmljZXNXaXRoRXh0ZW5zaW9uczsgbGV0IGxhc3QgPSBsYXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXZpY2UtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uby1ib3JkZXJdPVwibGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1pbmRpY2F0b3JcIiBbbmdDbGFzc109XCJ7J2RldmljZS1pbmRpY2F0b3ItcmVhZHknOiBlbGVtZW50LmRldmljZVN0YXR1cyA9PT0gJ1JFQURZJ31cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLW5hbWVcIj57eyBkZXZpY2UuZGV2aWNlTmFtZSB8fCBkZXZpY2UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLW1vZGVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZGV2aWNlLmV4dGVuc2lvbnM/Lmxlbmd0aCA/ICdFeHQ6ICcgKyBkZXZpY2UuZXh0ZW5zaW9ucy5qb2luKFwiLCBcIikgOiAnTm8gRXh0ZW5zaW9uJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aXBsZS1kZXYtbGlua1wiICpuZ0lmPVwiZWxlbWVudC5kZXZpY2VzV2l0aEV4dGVuc2lvbnM/Lmxlbmd0aCA+IDE7IGVsc2Ugb25lRGV2aWNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtbmFtZS13cmFwcGVyIGNsaWNrYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25NdWx0aXBsZURldmljZXMoZWxlbWVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uTXVsdGlwbGVEZXZpY2VzKGVsZW1lbnQpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXZpY2UtbmFtZVwiPk11bHRpcGxlIGRldmljZXMgPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb25lRGV2aWNlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtbmFtZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1pbmRpY2F0b3JcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1uYW1lXCI+e3tlbGVtZW50LmRldmljZXNXaXRoRXh0ZW5zaW9uc1swXS5kZXZpY2VOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZS1tb2RlbCBvbmUtZGV2LWV4dGVuc2lvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnQuZGV2aWNlc1dpdGhFeHRlbnNpb25zWzBdLmV4dGVuc2lvbnM/Lmxlbmd0aCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAnRXh0OiAnICsgZWxlbWVudC5kZXZpY2VzV2l0aEV4dGVuc2lvbnNbMF0uZXh0ZW5zaW9ucz8uam9pbihcIiwgXCIpIDogJ05vIEV4dGVuc2lvbicgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIERpYWwgUGxhbiBTdGF0dXMgQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGlhbFBsYW5TdGF0dXNcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5EaWFsIFBsYW4gU3RhdHVzPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWluZGljYXRvclwiIFtuZ0NsYXNzXT1cImdldFN0YXR1c0NsYXNzKGVsZW1lbnQuZGlhbFBsYW5TdGF0dXMpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJ7J3N0YXR1cy1yZWFkeSc6IGVsZW1lbnQuZGlhbFBsYW5TdGF0dXMgPT09ICdSRUFEWSd9XCI+e3tTVEFUVVNfRU5UUklFU1tlbGVtZW50LmRpYWxQbGFuU3RhdHVzXX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGVwZW5kZW5jaWVzIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlcGVuZGVuY2llc1wiPlxyXG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkRlcGVuZGVuY2llczwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIkRFUEVOREVOQ0lFU19TVEFUVVNbZWxlbWVudC5kZXBlbmRlbmNpZXNTdGF0dXNdID09PSAnRGVwZW5kZW5jaWVzIGZvdW5kJ1wiIGNsYXNzPVwiZGVwZW5kZW5jaWVzLXRleHRcIj57e0RFUEVOREVOQ0lFU19TVEFUVVNbZWxlbWVudC5kZXBlbmRlbmNpZXNTdGF0dXNdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIkRFUEVOREVOQ0lFU19TVEFUVVNbZWxlbWVudC5kZXBlbmRlbmNpZXNTdGF0dXNdID09PSAnTm8gZGVwZW5kZW5jaWVzJ1wiPuKAlDwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBVc2VyIFVwZ3JhZGUgU3RhdHVzIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJVcGdyYWRlU3RhdHVzXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+VXNlciBVcGdyYWRlIFN0YXR1czwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBncmFkZS1zdGF0dXMtY2VsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJTVEFUVVNfRU5UUklFU1tlbGVtZW50LnVwZ3JhZGVTdGF0dXNdID09PSAnUmVhZHknOyBlbHNlIHN0YXR1c0Jsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cInVwZ3JhZGUtYnV0dG9uXCIgKGNsaWNrKT1cInVwZ3JhZGVVc2VyKGVsZW1lbnQpXCI+VXBncmFkZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdHVzQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQ2xhc3MoZWxlbWVudC51cGdyYWRlU3RhdHVzKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7U1RBVFVTX0VOVFJJRVNbZWxlbWVudC51cGdyYWRlU3RhdHVzXX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1c2VyVXBncmFkZUxvYWRlclwiPlxyXG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+PC90aD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci10ZFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuXHJcbiAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcclxuICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50LnBlbmRpbmdcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZpZWxkLXNwaW5uZXJcIlxyXG4gICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMjBcIlxyXG4gICAgICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPlxyXG4gICAgICAgICAgPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cclxuICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIlxyXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWQtcm93XT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIj48L3RyPlxyXG4gICAgPC90YWJsZT5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiYXBwLXBhZ2luYXRpb25cIj5cclxuICA8bWF0LXBhZ2luYXRvclxyXG4gICAgW2xlbmd0aF09XCJwYWdpbmF0aW9uLnRvdGFsXCJcclxuICAgIFtwYWdlU2l6ZV09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcclxuICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnaW5hdGlvbi5wYWdlU2l6ZU9wdGlvbnNcIlxyXG4gICAgW3BhZ2VJbmRleF09XCJwYWdpbmF0aW9uLnBhZ2VJbmRleFwiXHJcbiAgICAocGFnZSk9XCJwYWdlRXZlbnQoJGV2ZW50KVwiXHJcbiAgICBzaG93Rmlyc3RMYXN0QnV0dG9ucz5cclxuICA8L21hdC1wYWdpbmF0b3I+XHJcblxyXG4gIDwhLS08ZGl2IGNsYXNzPVwicGFnZS1pbmRleGVzLWJveFwiPlxyXG4gICAgPG1hdC1wYWdpbmF0b3JcclxuICAgICAgW2lkXT1cIidjb21tb25QYWdpbmF0aW9uJ1wiXHJcbiAgICAgIFtoaWRlUGFnZVNpemVdPVwidHJ1ZVwiXHJcbiAgICAgIFtsZW5ndGhdPVwicGFnaW5hdGlvbi50b3RhbFwiXHJcbiAgICAgIFtwYWdlSW5kZXhdPVwicGFnaW5hdGlvbi5wYWdlSW5kZXhcIlxyXG4gICAgICBbcGFnZVNpemVdPVwicGFnaW5hdGlvbi5wYWdlU2l6ZVwiXHJcbiAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnaW5hdGlvbi5wYWdlU2l6ZU9wdGlvbnNcIlxyXG4gICAgICAocGFnZSk9XCJwYWdlRXZlbnQoJGV2ZW50KVwiPlxyXG4gICAgPC9tYXQtcGFnaW5hdG9yPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwicGVyLXBhZ2UtYmxvY2tcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJpdGVtX3Blcl9wYWdlXCI+SXRlbXMgcGVyIHBhZ2U6PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWJveCBzZWxlY3QtcGFnZS1zaXplXCI+XHJcbiAgICAgIDxtYXQtc2VsZWN0IChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlUGVyUGFnZU51bWJlcigkZXZlbnQpXCIgI3BhZ2VcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidjb21tb25QYWdpbmF0aW9uU2VsZWN0J1wiPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcGFnZVNpemVPcHRpb25zOyBsZXQgaSA9IGluZGV4O1wiIFtpZF09XCIncGFnaW5hdGlvblNlbGVjdE9wdF8nICsgaVwiIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbn19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+LS0+XHJcbjwvZGl2PlxyXG4iXX0=
|