pdm-ui-kit 0.1.50 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +356 -4
- package/esm2020/lib/components/alert-dialog/alert-dialog.component.mjs +3 -3
- package/esm2020/lib/components/breadcrumb/breadcrumb.component.mjs +37 -4
- package/esm2020/lib/components/button-group/button-group.component.mjs +208 -182
- package/esm2020/lib/components/calendar/calendar.component.mjs +3 -3
- package/esm2020/lib/components/card/card.component.mjs +36 -53
- package/esm2020/lib/components/combobox/combobox.component.mjs +136 -14
- package/esm2020/lib/components/command/command.component.mjs +3 -3
- package/esm2020/lib/components/context-menu/context-menu.component.mjs +121 -42
- package/esm2020/lib/components/data-table/data-table.component.mjs +214 -16
- package/esm2020/lib/components/date-picker/date-picker.component.mjs +66 -54
- package/esm2020/lib/components/dialog/dialog.component.mjs +171 -38
- package/esm2020/lib/components/draggable-table/draggable-table.component.mjs +300 -0
- package/esm2020/lib/components/drawer/drawer.component.mjs +123 -16
- package/esm2020/lib/components/dropdown-menu/dropdown-menu.component.mjs +3 -2
- package/esm2020/lib/components/hover-card/hover-card.component.mjs +185 -24
- package/esm2020/lib/components/input/input.component.mjs +15 -15
- package/esm2020/lib/components/input-group/input-group.component.mjs +14 -14
- package/esm2020/lib/components/menubar/menubar.component.mjs +105 -29
- package/esm2020/lib/components/navigation-menu/navigation-menu.component.mjs +25 -3
- package/esm2020/lib/components/pagination/pagination.component.mjs +3 -3
- package/esm2020/lib/components/popover/popover.component.mjs +107 -73
- package/esm2020/lib/components/select/select.component.mjs +26 -23
- package/esm2020/lib/components/sheet/sheet.component.mjs +68 -12
- package/esm2020/lib/components/sidebar/sidebar.component.mjs +52 -5
- package/esm2020/lib/components/table/table.component.mjs +165 -192
- package/esm2020/lib/components/tabs/tabs.component.mjs +6 -6
- package/esm2020/lib/components/toggle-group/toggle-group.component.mjs +6 -6
- package/esm2020/lib/components/tooltip/tooltip.component.mjs +162 -19
- package/esm2020/lib/overlay/z-index-helper.mjs +69 -0
- package/esm2020/lib/pdm-ui-kit.module.mjs +5 -1
- package/esm2020/lib/utils/responsive.mjs +143 -0
- package/esm2020/lib/utils/z-index.mjs +90 -0
- package/esm2020/public-api.mjs +67 -63
- package/fesm2015/pdm-ui-kit.mjs +2628 -847
- package/fesm2015/pdm-ui-kit.mjs.map +1 -1
- package/fesm2020/pdm-ui-kit.mjs +2630 -845
- package/fesm2020/pdm-ui-kit.mjs.map +1 -1
- package/lib/components/breadcrumb/breadcrumb.component.d.ts +23 -1
- package/lib/components/button-group/button-group.component.d.ts +8 -2
- package/lib/components/card/card.component.d.ts +32 -19
- package/lib/components/combobox/combobox.component.d.ts +20 -3
- package/lib/components/context-menu/context-menu.component.d.ts +17 -8
- package/lib/components/data-table/data-table.component.d.ts +172 -14
- package/lib/components/date-picker/date-picker.component.d.ts +5 -6
- package/lib/components/dialog/dialog.component.d.ts +38 -4
- package/lib/components/draggable-table/draggable-table.component.d.ts +74 -0
- package/lib/components/drawer/drawer.component.d.ts +65 -7
- package/lib/components/hover-card/hover-card.component.d.ts +27 -4
- package/lib/components/input/input.component.d.ts +3 -3
- package/lib/components/input-group/input-group.component.d.ts +1 -1
- package/lib/components/menubar/menubar.component.d.ts +16 -8
- package/lib/components/navigation-menu/navigation-menu.component.d.ts +22 -1
- package/lib/components/popover/popover.component.d.ts +13 -12
- package/lib/components/select/select.component.d.ts +4 -5
- package/lib/components/sheet/sheet.component.d.ts +30 -3
- package/lib/components/sidebar/sidebar.component.d.ts +39 -1
- package/lib/components/table/table.component.d.ts +47 -26
- package/lib/components/tabs/tabs.component.d.ts +1 -1
- package/lib/components/toggle-group/toggle-group.component.d.ts +1 -1
- package/lib/components/tooltip/tooltip.component.d.ts +21 -3
- package/lib/overlay/z-index-helper.d.ts +36 -0
- package/lib/pdm-ui-kit.module.d.ts +42 -41
- package/lib/utils/responsive.d.ts +107 -0
- package/lib/utils/z-index.d.ts +69 -0
- package/package.json +10 -8
- package/public-api.d.ts +66 -62
- package/src/lib/styles/tokens.css +182 -0
|
@@ -1,31 +1,148 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "../table/table.component";
|
|
5
|
+
/**
|
|
6
|
+
* Data-table genérico con paginación, filtrado y selección
|
|
7
|
+
*
|
|
8
|
+
* NUEVO: Ahora es genérico y configurable via columnas
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Definir columnas
|
|
12
|
+
* columns: PdmDataTableColumn<User>[] = [
|
|
13
|
+
* { key: 'name', label: 'Name', sortable: true },
|
|
14
|
+
* { key: 'email', label: 'Email', sortable: true },
|
|
15
|
+
* { key: 'role', label: 'Role', hideOnMobile: true },
|
|
16
|
+
* { key: 'createdAt', label: 'Created', render: (val) => formatDate(val) }
|
|
17
|
+
* ];
|
|
18
|
+
*
|
|
19
|
+
* // En el template
|
|
20
|
+
* <pdm-data-table
|
|
21
|
+
* [columns]="columns"
|
|
22
|
+
* [rows]="users"
|
|
23
|
+
* [selectable]="true"
|
|
24
|
+
* (selectionChange)="onSelect($event)">
|
|
25
|
+
* </pdm-data-table>
|
|
26
|
+
*/
|
|
4
27
|
export class PdmDataTableComponent {
|
|
5
28
|
constructor() {
|
|
6
29
|
this.className = '';
|
|
30
|
+
/**
|
|
31
|
+
* Columnas a mostrar
|
|
32
|
+
* Si no se provee, intenta inferir del primer row (legacy mode)
|
|
33
|
+
*/
|
|
34
|
+
this.columns = [];
|
|
35
|
+
/**
|
|
36
|
+
* Estrategia responsive de la tabla
|
|
37
|
+
*/
|
|
38
|
+
this.responsiveStrategy = 'scroll';
|
|
39
|
+
/**
|
|
40
|
+
* Si es true, muestra checkbox de selección en cada fila
|
|
41
|
+
*/
|
|
42
|
+
this.selectable = false;
|
|
43
|
+
/**
|
|
44
|
+
* Si es true, muestra botón de acciones (tres puntos) en cada fila
|
|
45
|
+
*/
|
|
46
|
+
this.showActions = false;
|
|
47
|
+
/**
|
|
48
|
+
* Si es true, muestra filtro de búsqueda
|
|
49
|
+
*/
|
|
50
|
+
this.showFilter = true;
|
|
51
|
+
/**
|
|
52
|
+
* Si es true, muestra controles de paginación
|
|
53
|
+
*/
|
|
54
|
+
this.showPagination = true;
|
|
55
|
+
/**
|
|
56
|
+
* Si es true, muestra selector de columnas
|
|
57
|
+
*/
|
|
58
|
+
this.showColumnSelector = false;
|
|
59
|
+
// Labels i18n
|
|
7
60
|
this.filterPlaceholder = 'Filter...';
|
|
8
61
|
this.columnsLabel = 'Columns';
|
|
9
|
-
this.statusLabel = 'Status';
|
|
10
|
-
this.emailLabel = 'Email';
|
|
11
|
-
this.amountLabel = 'Amount';
|
|
12
62
|
this.previousLabel = 'Previous';
|
|
13
63
|
this.nextLabel = 'Next';
|
|
14
64
|
this.emptyLabel = 'No results.';
|
|
65
|
+
this.rowsSelectedLabel = 'row(s) selected';
|
|
66
|
+
// DEPRECATED: Labels hardcodeados para backward compatibility
|
|
67
|
+
/**
|
|
68
|
+
* @deprecated Use columns configuration instead
|
|
69
|
+
*/
|
|
70
|
+
this.statusLabel = 'Status';
|
|
71
|
+
/**
|
|
72
|
+
* @deprecated Use columns configuration instead
|
|
73
|
+
*/
|
|
74
|
+
this.emailLabel = 'Email';
|
|
75
|
+
/**
|
|
76
|
+
* @deprecated Use columns configuration instead
|
|
77
|
+
*/
|
|
78
|
+
this.amountLabel = 'Amount';
|
|
79
|
+
/**
|
|
80
|
+
* Datos a mostrar
|
|
81
|
+
*/
|
|
15
82
|
this.rows = [];
|
|
83
|
+
/**
|
|
84
|
+
* Página actual (1-indexed)
|
|
85
|
+
*/
|
|
16
86
|
this.page = 1;
|
|
17
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Cantidad de filas por página
|
|
89
|
+
*/
|
|
90
|
+
this.pageSize = 10;
|
|
91
|
+
/**
|
|
92
|
+
* Query de filtrado
|
|
93
|
+
*/
|
|
18
94
|
this.query = '';
|
|
19
95
|
this.queryChange = new EventEmitter();
|
|
20
96
|
this.rowAction = new EventEmitter();
|
|
21
97
|
this.pageChange = new EventEmitter();
|
|
22
98
|
this.selectionChange = new EventEmitter();
|
|
99
|
+
this.columnSort = new EventEmitter();
|
|
100
|
+
// Estado interno
|
|
101
|
+
this.selectedRows = new Set();
|
|
102
|
+
this.sortDirection = 'asc';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Backward compatibility: si no hay columnas definidas, inferir del primer row
|
|
106
|
+
*/
|
|
107
|
+
get effectiveColumns() {
|
|
108
|
+
if (this.columns.length > 0) {
|
|
109
|
+
return this.columns;
|
|
110
|
+
}
|
|
111
|
+
// Legacy mode: inferir columnas del primer row (solo para PdmDataTableRow)
|
|
112
|
+
if (this.rows.length > 0) {
|
|
113
|
+
const firstRow = this.rows[0];
|
|
114
|
+
return Object.keys(firstRow)
|
|
115
|
+
.filter(key => key !== 'selected')
|
|
116
|
+
.map(key => ({
|
|
117
|
+
key: key,
|
|
118
|
+
label: this.getLegacyLabel(key),
|
|
119
|
+
align: key === 'amount' ? 'right' : 'left'
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* LEGACY: mapeo de keys a labels hardcodeados
|
|
126
|
+
*/
|
|
127
|
+
getLegacyLabel(key) {
|
|
128
|
+
const map = {
|
|
129
|
+
status: this.statusLabel,
|
|
130
|
+
email: this.emailLabel,
|
|
131
|
+
amount: this.amountLabel
|
|
132
|
+
};
|
|
133
|
+
return map[key] || key.charAt(0).toUpperCase() + key.slice(1);
|
|
23
134
|
}
|
|
24
135
|
get filteredRows() {
|
|
25
136
|
const q = this.query.trim().toLowerCase();
|
|
26
137
|
if (!q)
|
|
27
138
|
return this.rows;
|
|
28
|
-
|
|
139
|
+
if (this.filterFn) {
|
|
140
|
+
return this.rows.filter(row => this.filterFn(row, q));
|
|
141
|
+
}
|
|
142
|
+
// Filtrado default: buscar en todos los campos string
|
|
143
|
+
return this.rows.filter(row => {
|
|
144
|
+
return Object.values(row).some(val => typeof val === 'string' && val.toLowerCase().includes(q));
|
|
145
|
+
});
|
|
29
146
|
}
|
|
30
147
|
get pagedRows() {
|
|
31
148
|
const start = (this.page - 1) * this.pageSize;
|
|
@@ -35,14 +152,33 @@ export class PdmDataTableComponent {
|
|
|
35
152
|
return Math.max(1, Math.ceil(this.filteredRows.length / this.pageSize));
|
|
36
153
|
}
|
|
37
154
|
get selectedCount() {
|
|
38
|
-
return this.
|
|
155
|
+
return this.selectedRows.size;
|
|
39
156
|
}
|
|
40
157
|
onQueryInput(event) {
|
|
41
158
|
const value = event.target.value;
|
|
42
159
|
this.queryChange.emit(value);
|
|
43
160
|
}
|
|
44
161
|
onToggleRow(row, event) {
|
|
45
|
-
|
|
162
|
+
const checked = event.target.checked;
|
|
163
|
+
if (checked) {
|
|
164
|
+
this.selectedRows.add(row);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.selectedRows.delete(row);
|
|
168
|
+
}
|
|
169
|
+
this.selectionChange.emit({ row, selected: checked });
|
|
170
|
+
}
|
|
171
|
+
onToggleAll(event) {
|
|
172
|
+
const checked = event.target.checked;
|
|
173
|
+
if (checked) {
|
|
174
|
+
this.pagedRows.forEach(row => this.selectedRows.add(row));
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
this.pagedRows.forEach(row => this.selectedRows.delete(row));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
isSelected(row) {
|
|
181
|
+
return this.selectedRows.has(row);
|
|
46
182
|
}
|
|
47
183
|
previous() {
|
|
48
184
|
if (this.page <= 1)
|
|
@@ -55,25 +191,75 @@ export class PdmDataTableComponent {
|
|
|
55
191
|
this.pageChange.emit(this.page + 1);
|
|
56
192
|
}
|
|
57
193
|
onAction(row) {
|
|
58
|
-
this.rowAction.emit(row
|
|
194
|
+
this.rowAction.emit(row);
|
|
195
|
+
}
|
|
196
|
+
onSort(column) {
|
|
197
|
+
if (!column.sortable)
|
|
198
|
+
return;
|
|
199
|
+
if (this.sortColumn === column) {
|
|
200
|
+
this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
this.sortColumn = column;
|
|
204
|
+
this.sortDirection = 'asc';
|
|
205
|
+
}
|
|
206
|
+
this.columnSort.emit({ column, direction: this.sortDirection });
|
|
207
|
+
}
|
|
208
|
+
getCellValue(row, column) {
|
|
209
|
+
const value = row[column.key];
|
|
210
|
+
if (column.render) {
|
|
211
|
+
return column.render(value, row);
|
|
212
|
+
}
|
|
213
|
+
return value != null ? String(value) : '';
|
|
214
|
+
}
|
|
215
|
+
getCellClass(column) {
|
|
216
|
+
const classes = ['px-2', 'py-2'];
|
|
217
|
+
if (column.align === 'center')
|
|
218
|
+
classes.push('text-center');
|
|
219
|
+
if (column.align === 'right')
|
|
220
|
+
classes.push('text-right');
|
|
221
|
+
if (column.hideOnMobile)
|
|
222
|
+
classes.push('hidden', 'md:table-cell');
|
|
223
|
+
if (column.cellClass)
|
|
224
|
+
classes.push(column.cellClass);
|
|
225
|
+
return classes.join(' ');
|
|
226
|
+
}
|
|
227
|
+
getHeaderClass(column) {
|
|
228
|
+
const classes = ['px-2', 'py-2', 'text-left', 'font-medium'];
|
|
229
|
+
if (column.hideOnMobile)
|
|
230
|
+
classes.push('hidden', 'md:table-cell');
|
|
231
|
+
if (column.headerClass)
|
|
232
|
+
classes.push(column.headerClass);
|
|
233
|
+
return classes.join(' ');
|
|
234
|
+
}
|
|
235
|
+
getColumnStyle(column) {
|
|
236
|
+
return column.width ? { width: column.width } : {};
|
|
59
237
|
}
|
|
60
238
|
}
|
|
61
239
|
PdmDataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
62
|
-
PdmDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDataTableComponent, selector: "pdm-data-table", inputs: { className: "className",
|
|
240
|
+
PdmDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDataTableComponent, selector: "pdm-data-table", inputs: { className: "className", columns: "columns", responsiveStrategy: "responsiveStrategy", selectable: "selectable", showActions: "showActions", showFilter: "showFilter", showPagination: "showPagination", showColumnSelector: "showColumnSelector", filterPlaceholder: "filterPlaceholder", columnsLabel: "columnsLabel", previousLabel: "previousLabel", nextLabel: "nextLabel", emptyLabel: "emptyLabel", rowsSelectedLabel: "rowsSelectedLabel", statusLabel: "statusLabel", emailLabel: "emailLabel", amountLabel: "amountLabel", rows: "rows", page: "page", pageSize: "pageSize", query: "query", filterFn: "filterFn" }, outputs: { queryChange: "queryChange", rowAction: "rowAction", pageChange: "pageChange", selectionChange: "selectionChange", columnSort: "columnSort" }, ngImport: i0, template: "<section [ngClass]=\"['flex w-full flex-col', className]\">\n <!-- Toolbar: Filtro + Selector de columnas -->\n <div\n *ngIf=\"showFilter || showColumnSelector\"\n class=\"flex w-full flex-col gap-2 py-4 sm:flex-row sm:items-center\"\n >\n <input\n *ngIf=\"showFilter\"\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button\n *ngIf=\"showColumnSelector\"\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm whitespace-nowrap\"\n >\n <span>{{ columnsLabel }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 10L12 15L17 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Tabla con responsive -->\n <pdm-table\n variant=\"data\"\n [responsiveStrategy]=\"responsiveStrategy\"\n [fullBleed]=\"false\"\n >\n <thead>\n <tr>\n <!-- Columna de selecci\u00F3n -->\n <th *ngIf=\"selectable\" class=\"w-10 px-2 py-2 text-left font-medium\">\n <input\n type=\"checkbox\"\n (change)=\"onToggleAll($event)\"\n class=\"h-4 w-4 rounded-sm border border-input\"\n />\n </th>\n\n <!-- Columnas din\u00E1micas -->\n <th\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getHeaderClass(column)\"\n [ngStyle]=\"getColumnStyle(column)\"\n >\n <!-- Header sortable -->\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n (click)=\"onSort(column)\"\n class=\"inline-flex appearance-none items-center gap-1 rounded-sm border-0 bg-transparent px-3 py-2 text-sm hover:underline\"\n >\n <span>{{ column.label }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 6L4 10L8 14M16 18L20 14L16 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n\n <!-- Header no sortable -->\n <span *ngIf=\"!column.sortable\">{{ column.label }}</span>\n </th>\n\n <!-- Columna de acciones -->\n <th *ngIf=\"showActions\" class=\"w-10 px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <!-- Filas con datos -->\n <tr *ngFor=\"let row of pagedRows\">\n <!-- Celda de selecci\u00F3n -->\n <td *ngIf=\"selectable\" class=\"px-2 py-2\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(row)\"\n (change)=\"onToggleRow(row, $event)\"\n class=\"h-4 w-4 rounded-sm border border-input\"\n />\n </td>\n\n <!-- Celdas din\u00E1micas -->\n <td\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getCellClass(column)\"\n >\n <!-- Template personalizado si existe -->\n <ng-container *ngIf=\"column.cellTemplate; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"\n column.cellTemplate;\n context: { $implicit: row, value: row[column.key] }\n \"\n >\n </ng-container>\n </ng-container>\n\n <!-- Renderizado default -->\n <ng-template #defaultCell>\n {{ getCellValue(row, column) }}\n </ng-template>\n </td>\n\n <!-- Celda de acciones -->\n <td *ngIf=\"showActions\" class=\"px-2 py-2\">\n <button\n type=\"button\"\n class=\"inline-flex h-8 w-8 appearance-none items-center justify-center border-0 bg-transparent p-0 hover:text-foreground\"\n (click)=\"onAction(row)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n\n <!-- Fila vac\u00EDa -->\n <tr *ngIf=\"pagedRows.length === 0\">\n <td\n [attr.colspan]=\"\n effectiveColumns.length +\n (selectable ? 1 : 0) +\n (showActions ? 1 : 0)\n \"\n class=\"px-3 py-6 text-center text-sm text-muted-foreground\"\n >\n {{ emptyLabel }}\n </td>\n </tr>\n </tbody>\n </pdm-table>\n\n <!-- Footer: Info + Paginaci\u00F3n -->\n <div\n *ngIf=\"showPagination || selectable\"\n class=\"flex w-full flex-wrap items-center gap-2 py-4 sm:flex-nowrap\"\n >\n <p\n *ngIf=\"selectable\"\n class=\"m-0 flex-1 pr-2 text-sm text-muted-foreground whitespace-nowrap\"\n >\n {{ selectedCount }} of {{ rows.length }} {{ rowsSelectedLabel }}\n </p>\n\n <div *ngIf=\"showPagination\" class=\"flex items-center gap-2 ml-auto\">\n <span class=\"text-sm text-muted-foreground whitespace-nowrap\">\n Page {{ page }} of {{ totalPages }}\n </span>\n <button\n type=\"button\"\n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n [disabled]=\"page <= 1\"\n (click)=\"previous()\"\n >\n {{ previousLabel }}\n </button>\n <button\n type=\"button\"\n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n [disabled]=\"page >= totalPages\"\n (click)=\"next()\"\n >\n {{ nextLabel }}\n </button>\n </div>\n </div>\n</section>\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: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.PdmTableComponent, selector: "pdm-table", inputs: ["variant", "responsiveStrategy", "className", "fullBleed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
63
241
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDataTableComponent, decorators: [{
|
|
64
242
|
type: Component,
|
|
65
|
-
args: [{ selector: 'pdm-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section [ngClass]=\"['flex w-full
|
|
243
|
+
args: [{ selector: 'pdm-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section [ngClass]=\"['flex w-full flex-col', className]\">\n <!-- Toolbar: Filtro + Selector de columnas -->\n <div\n *ngIf=\"showFilter || showColumnSelector\"\n class=\"flex w-full flex-col gap-2 py-4 sm:flex-row sm:items-center\"\n >\n <input\n *ngIf=\"showFilter\"\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button\n *ngIf=\"showColumnSelector\"\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm whitespace-nowrap\"\n >\n <span>{{ columnsLabel }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 10L12 15L17 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Tabla con responsive -->\n <pdm-table\n variant=\"data\"\n [responsiveStrategy]=\"responsiveStrategy\"\n [fullBleed]=\"false\"\n >\n <thead>\n <tr>\n <!-- Columna de selecci\u00F3n -->\n <th *ngIf=\"selectable\" class=\"w-10 px-2 py-2 text-left font-medium\">\n <input\n type=\"checkbox\"\n (change)=\"onToggleAll($event)\"\n class=\"h-4 w-4 rounded-sm border border-input\"\n />\n </th>\n\n <!-- Columnas din\u00E1micas -->\n <th\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getHeaderClass(column)\"\n [ngStyle]=\"getColumnStyle(column)\"\n >\n <!-- Header sortable -->\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n (click)=\"onSort(column)\"\n class=\"inline-flex appearance-none items-center gap-1 rounded-sm border-0 bg-transparent px-3 py-2 text-sm hover:underline\"\n >\n <span>{{ column.label }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 6L4 10L8 14M16 18L20 14L16 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n\n <!-- Header no sortable -->\n <span *ngIf=\"!column.sortable\">{{ column.label }}</span>\n </th>\n\n <!-- Columna de acciones -->\n <th *ngIf=\"showActions\" class=\"w-10 px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <!-- Filas con datos -->\n <tr *ngFor=\"let row of pagedRows\">\n <!-- Celda de selecci\u00F3n -->\n <td *ngIf=\"selectable\" class=\"px-2 py-2\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(row)\"\n (change)=\"onToggleRow(row, $event)\"\n class=\"h-4 w-4 rounded-sm border border-input\"\n />\n </td>\n\n <!-- Celdas din\u00E1micas -->\n <td\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getCellClass(column)\"\n >\n <!-- Template personalizado si existe -->\n <ng-container *ngIf=\"column.cellTemplate; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"\n column.cellTemplate;\n context: { $implicit: row, value: row[column.key] }\n \"\n >\n </ng-container>\n </ng-container>\n\n <!-- Renderizado default -->\n <ng-template #defaultCell>\n {{ getCellValue(row, column) }}\n </ng-template>\n </td>\n\n <!-- Celda de acciones -->\n <td *ngIf=\"showActions\" class=\"px-2 py-2\">\n <button\n type=\"button\"\n class=\"inline-flex h-8 w-8 appearance-none items-center justify-center border-0 bg-transparent p-0 hover:text-foreground\"\n (click)=\"onAction(row)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n\n <!-- Fila vac\u00EDa -->\n <tr *ngIf=\"pagedRows.length === 0\">\n <td\n [attr.colspan]=\"\n effectiveColumns.length +\n (selectable ? 1 : 0) +\n (showActions ? 1 : 0)\n \"\n class=\"px-3 py-6 text-center text-sm text-muted-foreground\"\n >\n {{ emptyLabel }}\n </td>\n </tr>\n </tbody>\n </pdm-table>\n\n <!-- Footer: Info + Paginaci\u00F3n -->\n <div\n *ngIf=\"showPagination || selectable\"\n class=\"flex w-full flex-wrap items-center gap-2 py-4 sm:flex-nowrap\"\n >\n <p\n *ngIf=\"selectable\"\n class=\"m-0 flex-1 pr-2 text-sm text-muted-foreground whitespace-nowrap\"\n >\n {{ selectedCount }} of {{ rows.length }} {{ rowsSelectedLabel }}\n </p>\n\n <div *ngIf=\"showPagination\" class=\"flex items-center gap-2 ml-auto\">\n <span class=\"text-sm text-muted-foreground whitespace-nowrap\">\n Page {{ page }} of {{ totalPages }}\n </span>\n <button\n type=\"button\"\n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n [disabled]=\"page <= 1\"\n (click)=\"previous()\"\n >\n {{ previousLabel }}\n </button>\n <button\n type=\"button\"\n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n [disabled]=\"page >= totalPages\"\n (click)=\"next()\"\n >\n {{ nextLabel }}\n </button>\n </div>\n </div>\n</section>\n" }]
|
|
66
244
|
}], propDecorators: { className: [{
|
|
67
245
|
type: Input
|
|
68
|
-
}],
|
|
246
|
+
}], columns: [{
|
|
69
247
|
type: Input
|
|
70
|
-
}],
|
|
248
|
+
}], responsiveStrategy: [{
|
|
71
249
|
type: Input
|
|
72
|
-
}],
|
|
250
|
+
}], selectable: [{
|
|
73
251
|
type: Input
|
|
74
|
-
}],
|
|
252
|
+
}], showActions: [{
|
|
75
253
|
type: Input
|
|
76
|
-
}],
|
|
254
|
+
}], showFilter: [{
|
|
255
|
+
type: Input
|
|
256
|
+
}], showPagination: [{
|
|
257
|
+
type: Input
|
|
258
|
+
}], showColumnSelector: [{
|
|
259
|
+
type: Input
|
|
260
|
+
}], filterPlaceholder: [{
|
|
261
|
+
type: Input
|
|
262
|
+
}], columnsLabel: [{
|
|
77
263
|
type: Input
|
|
78
264
|
}], previousLabel: [{
|
|
79
265
|
type: Input
|
|
@@ -81,6 +267,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
81
267
|
type: Input
|
|
82
268
|
}], emptyLabel: [{
|
|
83
269
|
type: Input
|
|
270
|
+
}], rowsSelectedLabel: [{
|
|
271
|
+
type: Input
|
|
272
|
+
}], statusLabel: [{
|
|
273
|
+
type: Input
|
|
274
|
+
}], emailLabel: [{
|
|
275
|
+
type: Input
|
|
276
|
+
}], amountLabel: [{
|
|
277
|
+
type: Input
|
|
84
278
|
}], rows: [{
|
|
85
279
|
type: Input
|
|
86
280
|
}], page: [{
|
|
@@ -89,6 +283,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
89
283
|
type: Input
|
|
90
284
|
}], query: [{
|
|
91
285
|
type: Input
|
|
286
|
+
}], filterFn: [{
|
|
287
|
+
type: Input
|
|
92
288
|
}], queryChange: [{
|
|
93
289
|
type: Output
|
|
94
290
|
}], rowAction: [{
|
|
@@ -97,5 +293,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
97
293
|
type: Output
|
|
98
294
|
}], selectionChange: [{
|
|
99
295
|
type: Output
|
|
296
|
+
}], columnSort: [{
|
|
297
|
+
type: Output
|
|
100
298
|
}] } });
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBZWhHLE1BQU0sT0FBTyxxQkFBcUI7SUFMbEM7UUFNVyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2Ysc0JBQWlCLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLGlCQUFZLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxPQUFPLENBQUM7UUFDckIsZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxVQUFVLENBQUM7UUFDM0IsY0FBUyxHQUFHLE1BQU0sQ0FBQztRQUNuQixlQUFVLEdBQUcsYUFBYSxDQUFDO1FBQzNCLFNBQUksR0FBc0IsRUFBRSxDQUFDO1FBRTdCLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVWLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN6QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN2QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN4QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFxQyxDQUFDO0tBMkNuRjtJQXpDQyxJQUFJLFlBQVk7UUFDZCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMs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O2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGRtRGF0YVRhYmxlUm93IHtcbiAgaWQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nO1xuICBzZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkbS1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1EYXRhVGFibGVDb21wb25lbnQge1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgZmlsdGVyUGxhY2Vob2xkZXIgPSAnRmlsdGVyLi4uJztcbiAgQElucHV0KCkgY29sdW1uc0xhYmVsID0gJ0NvbHVtbnMnO1xuICBASW5wdXQoKSBzdGF0dXNMYWJlbCA9ICdTdGF0dXMnO1xuICBASW5wdXQoKSBlbWFpbExhYmVsID0gJ0VtYWlsJztcbiAgQElucHV0KCkgYW1vdW50TGFiZWwgPSAnQW1vdW50JztcbiAgQElucHV0KCkgcHJldmlvdXNMYWJlbCA9ICdQcmV2aW91cyc7XG4gIEBJbnB1dCgpIG5leHRMYWJlbCA9ICdOZXh0JztcbiAgQElucHV0KCkgZW1wdHlMYWJlbCA9ICdObyByZXN1bHRzLic7XG4gIEBJbnB1dCgpIHJvd3M6IFBkbURhdGFUYWJsZVJvd1tdID0gW107XG5cbiAgQElucHV0KCkgcGFnZSA9IDE7XG4gIEBJbnB1dCgpIHBhZ2VTaXplID0gNTtcbiAgQElucHV0KCkgcXVlcnkgPSAnJztcblxuICBAT3V0cHV0KCkgcXVlcnlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJvd0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmc7IHNlbGVjdGVkOiBib29sZWFuIH0+KCk7XG5cbiAgZ2V0IGZpbHRlcmVkUm93cygpOiBQZG1EYXRhVGFibGVSb3dbXSB7XG4gICAgY29uc3QgcSA9IHRoaXMucXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFxKSByZXR1cm4gdGhpcy5yb3dzO1xuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKChyKSA9PiByLmVtYWlsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xuICB9XG5cbiAgZ2V0IHBhZ2VkUm93cygpOiBQZG1EYXRhVGFibGVSb3dbXSB7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplO1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLnBhZ2VTaXplKTtcbiAgfVxuXG4gIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSk7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKChyb3cpID0+IHJvdy5zZWxlY3RlZCkubGVuZ3RoO1xuICB9XG5cbiAgb25RdWVyeUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25Ub2dnbGVSb3cocm93OiBQZG1EYXRhVGFibGVSb3csIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyBpZDogcm93LmlkLCBzZWxlY3RlZDogKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkIH0pO1xuICB9XG5cbiAgcHJldmlvdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFnZSA8PSAxKSByZXR1cm47XG4gICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlIC0gMSk7XG4gIH1cblxuICBuZXh0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2UgPj0gdGhpcy50b3RhbFBhZ2VzKSByZXR1cm47XG4gICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlICsgMSk7XG4gIH1cblxuICBvbkFjdGlvbihyb3c6IFBkbURhdGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIHRoaXMucm93QWN0aW9uLmVtaXQocm93LmlkKTtcbiAgfVxufVxuIiwiPHNlY3Rpb24gW25nQ2xhc3NdPVwiWydmbGV4IHctZnVsbCBtYXgtdy0zeGwgZmxleC1jb2wgaXRlbXMtZW5kJywgY2xhc3NOYW1lXVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweS00XCI+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiZmlsdGVyUGxhY2Vob2xkZXJcIlxuICAgICAgW3ZhbHVlXT1cInF1ZXJ5XCJcbiAgICAgIChpbnB1dCk9XCJvblF1ZXJ5SW5wdXQoJGV2ZW50KVwiXG4gICAgICBjbGFzcz1cImgtOSBmbGV4LTEgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLXRyYW5zcGFyZW50IHB4LTMgcHktMSB0ZXh0LXNtIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc20gcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC1iYWNrZ3JvdW5kXCJcbiAgICAvPlxuXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTkgYXBwZWFyYW5jZS1ub25lIGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtXCI+XG4gICAgICA8c3Bhbj57eyBjb2x1bW5zTGFiZWwgfX08L3NwYW4+XG4gICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBjbGFzcz1cImgtNCB3LTQgdGV4dC1mb3JlZ3JvdW5kXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNNyAxMEwxMiAxNUwxNyAxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwidy1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLWJhY2tncm91bmRcIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ3LWZ1bGwgYm9yZGVyLWNvbGxhcHNlIHRleHQtc20gdGV4dC1mb3JlZ3JvdW5kXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0ciBjbGFzcz1cImJvcmRlci1iIGJvcmRlci1ib3JkZXJcIj5cbiAgICAgICAgICA8dGggY2xhc3M9XCJ3LTEwIHB4LTIgdGV4dC1sZWZ0IGZvbnQtbWVkaXVtXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiaC00IHctNCByb3VuZGVkLXNtIGJvcmRlciBib3JkZXItaW5wdXRcIiAvPjwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwidy0zMiBweC0yIHB5LTIgdGV4dC1sZWZ0IGZvbnQtbWVkaXVtXCI+e3sgc3RhdHVzTGFiZWwgfX08L3RoPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInB4LTIgcHktMiB0ZXh0LWxlZnQgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5saW5lLWZsZXggYXBwZWFyYW5jZS1ub25lIGl0ZW1zLWNlbnRlciBnYXAtMSByb3VuZGVkLXNtIGJvcmRlci0wIGJnLXRyYW5zcGFyZW50IHB4LTMgcHktMiB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGVtYWlsTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGNsYXNzPVwiaC00IHctNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCA2TDQgMTBMOCAxNE0xNiAxOEwyMCAxNEwxNiAxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInctMjQgcHgtMiBweS0yIHRleHQtcmlnaHQgZm9udC1tZWRpdW1cIj57eyBhbW91bnRMYWJlbCB9fTwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwicHgtMiBweS0yXCI+PC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGFnZWRSb3dzXCIgY2xhc3M9XCJib3JkZXItYiBib3JkZXItYm9yZGVyIGxhc3Q6Ym9yZGVyLWItMFwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInB4LTIgcHktMlwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJyb3cuc2VsZWN0ZWRcIiAoY2hhbmdlKT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiIGNsYXNzPVwiaC00IHctNCByb3VuZGVkLXNtIGJvcmRlciBib3JkZXItaW5wdXRcIiAvPjwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwicHgtMiBweS0yXCI+e3sgcm93LnN0YXR1cyB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwicHgtMiBweS0yXCI+e3sgcm93LmVtYWlsIH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJweC0yIHB5LTIgdGV4dC1yaWdodFwiPnt7IHJvdy5hbW91bnQgfX08L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInB4LTIgcHktMlwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTggdy04IGFwcGVhcmFuY2Utbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLTAgYmctdHJhbnNwYXJlbnQgcC0wXCIgKGNsaWNrKT1cIm9uQWN0aW9uKHJvdylcIj5cbiAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJoLTQgdy00XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjZcIiBjeT1cIjEyXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMThcIiBjeT1cIjEyXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgKm5nSWY9XCJwYWdlZFJvd3MubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgPHRkIGNvbHNwYW49XCI1XCIgY2xhc3M9XCJweC0zIHB5LTYgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBlbXB0eUxhYmVsIH19PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBnYXAtMiBweS00XCI+XG4gICAgPHAgY2xhc3M9XCJtLTAgZmxleC0xIHByLTIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBzZWxlY3RlZENvdW50IH19IG9mIHt7IHJvd3MubGVuZ3RoIH19IHJvdyhzKSBzZWxlY3RlZC48L3A+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJoLTkgYXBwZWFyYW5jZS1ub25lIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOm9wYWNpdHktNTBcIiBbZGlzYWJsZWRdPVwicGFnZSA8PSAxXCIgKGNsaWNrKT1cInByZXZpb3VzKClcIj57eyBwcmV2aW91c0xhYmVsIH19PC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJoLTkgYXBwZWFyYW5jZS1ub25lIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOm9wYWNpdHktNTBcIiBbZGlzYWJsZWRdPVwicGFnZSA+PSB0b3RhbFBhZ2VzXCIgKGNsaWNrKT1cIm5leHQoKVwiPnt7IG5leHRMYWJlbCB9fTwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvc2VjdGlvbj5cbiJdfQ==
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQzs7OztBQTJFN0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQU1ILE1BQU0sT0FBTyxxQkFBcUI7SUFMbEM7UUFNVyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXhCOzs7V0FHRztRQUNNLFlBQU8sR0FBNEIsRUFBRSxDQUFDO1FBRS9DOztXQUVHO1FBQ00sdUJBQWtCLEdBQTRCLFFBQVEsQ0FBQztRQUVoRTs7V0FFRztRQUNNLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFNUI7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUU3Qjs7V0FFRztRQUNNLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFM0I7O1dBRUc7UUFDTSxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUUvQjs7V0FFRztRQUNNLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUVwQyxjQUFjO1FBQ0wsc0JBQWlCLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLGlCQUFZLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLGtCQUFhLEdBQUcsVUFBVSxDQUFDO1FBQzNCLGNBQVMsR0FBRyxNQUFNLENBQUM7UUFDbkIsZUFBVSxHQUFHLGFBQWEsQ0FBQztRQUMzQixzQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUUvQyw4REFBOEQ7UUFDOUQ7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUNoQzs7V0FFRztRQUNNLGVBQVUsR0FBRyxPQUFPLENBQUM7UUFDOUI7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUVoQzs7V0FFRztRQUNNLFNBQUksR0FBUSxFQUFFLENBQUM7UUFFeEI7O1dBRUc7UUFDTSxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBRWxCOztXQUVHO1FBQ00sYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUV2Qjs7V0FFRztRQUNNLFVBQUssR0FBRyxFQUFFLENBQUM7UUFRVixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDekMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFLLENBQUM7UUFDbEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBaUMsQ0FBQztRQUNwRSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWdFLENBQUM7UUFFeEcsaUJBQWlCO1FBQ2pCLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUssQ0FBQztRQUU1QixrQkFBYSxHQUFtQixLQUFLLENBQUM7S0E2SnZDO0lBM0pDOztPQUVHO0lBQ0gsSUFBSSxnQkFBZ0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ3JCO1FBRUQsMkVBQTJFO1FBQzNFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFRLENBQUM7WUFDckMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztpQkFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLFVBQVUsQ0FBQztpQkFDakMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWCxHQUFHLEVBQUUsR0FBYztnQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUMvQixLQUFLLEVBQUUsR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNO2FBQzNDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxHQUFXO1FBQ2hDLE1BQU0sR0FBRyxHQUEyQjtZQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVztTQUN6QixDQUFDO1FBQ0YsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRXpCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4RDtRQUVELHNEQUFzRDtRQUN0RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzVCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDMUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQ3pELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFZO1FBQ3ZCLE1BQU0sS0FBSyxHQUFJLEtBQUssQ0FBQyxNQUEyQixDQUFDLEtBQUssQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQU0sRUFBRSxLQUFZO1FBQzlCLE1BQU0sT0FBTyxHQUFJLEtBQUssQ0FBQyxNQUEyQixDQUFDLE9BQU8sQ0FBQztRQUUzRCxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzVCO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxXQUFXLENBQUMsS0FBWTtRQUN0QixNQUFNLE9BQU8sR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxPQUFPLENBQUM7UUFFM0QsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDM0Q7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM5RDtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsR0FBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztZQUFFLE9BQU87UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQU07UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQTZCO1FBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNwRTthQUFNO1lBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFNLEVBQUUsTUFBNkI7UUFDaEQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU5QixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNsQztRQUVELE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUE2QjtRQUN4QyxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVqQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0QsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLE9BQU87WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pELElBQUksTUFBTSxDQUFDLFlBQVk7WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNqRSxJQUFJLE1BQU0sQ0FBQyxTQUFTO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFckQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBNkI7UUFDMUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUU3RCxJQUFJLE1BQU0sQ0FBQyxZQUFZO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDakUsSUFBSSxNQUFNLENBQUMsV0FBVztZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQTZCO1FBQzFDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDckQsQ0FBQzs7a0hBNVBVLHFCQUFxQjtzR0FBckIscUJBQXFCLHV6QkN0R2xDLHdoT0F5TUE7MkZEbkdhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxnQkFBZ0IsbUJBRVQsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsU0FBUztzQkFBakIsS0FBSztnQkFNRyxPQUFPO3NCQUFmLEtBQUs7Z0JBS0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFibGVSZXNwb25zaXZlU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi91dGlscy9yZXNwb25zaXZlJztcblxuLyoqXG4gKiBERVBSRUNBVEVEOiBFc3RhIGludGVyZmF6IGVzIHBhcmEgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogVXNhciBQZG1EYXRhVGFibGVDb2x1bW48VD4gY29uIHRpcG8gZ2Vuw6lyaWNvIGVuIHN1IGx1Z2FyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGRtRGF0YVRhYmxlUm93IHtcbiAgaWQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nO1xuICBzZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmaW5pY2nDs24gZGUgY29sdW1uYSBwYXJhIGRhdGEtdGFibGUgZ2Vuw6lyaWNvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGRtRGF0YVRhYmxlQ29sdW1uPFQgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEtleSBkZWwgY2FtcG8gZW4gZWwgb2JqZXRvIGRlIGRhdG9zXG4gICAqIFVzYWRvIHBhcmEgYWNjZWRlciBhbCB2YWxvcjogcm93W2tleV1cbiAgICovXG4gIGtleToga2V5b2YgVDtcbiAgXG4gIC8qKlxuICAgKiBMYWJlbCBhIG1vc3RyYXIgZW4gZWwgaGVhZGVyXG4gICAqL1xuICBsYWJlbDogc3RyaW5nO1xuICBcbiAgLyoqXG4gICAqIEFuY2hvIGRlIGxhIGNvbHVtbmEgKENTUyB3aWR0aClcbiAgICogRWo6ICcxMDBweCcsICcyMCUnLCAnYXV0bydcbiAgICovXG4gIHdpZHRoPzogc3RyaW5nO1xuICBcbiAgLyoqXG4gICAqIFNpIGxhIGNvbHVtbmEgZXMgc29ydGFibGVcbiAgICovXG4gIHNvcnRhYmxlPzogYm9vbGVhbjtcbiAgXG4gIC8qKlxuICAgKiBBbGluZWFjacOzbiBkZWwgY29udGVuaWRvXG4gICAqL1xuICBhbGlnbj86ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0JztcbiAgXG4gIC8qKlxuICAgKiBGdW5jacOzbiBjdXN0b20gcGFyYSByZW5kZXJpemFyIGVsIHZhbG9yXG4gICAqIFNpIG5vIHNlIHByb3ZlZSwgc2UgdXNhIHRvU3RyaW5nKCkgZGVsIHZhbG9yXG4gICAqL1xuICByZW5kZXI/OiAodmFsdWU6IGFueSwgcm93OiBUKSA9PiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogVGVtcGxhdGUgcGVyc29uYWxpemFkbyBwYXJhIGxhIGNlbGRhXG4gICAqIFRpZW5lIHByaW9yaWRhZCBzb2JyZSByZW5kZXIoKVxuICAgKi9cbiAgY2VsbFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IFQ7IHZhbHVlOiBhbnkgfT47XG4gIFxuICAvKipcbiAgICogU2kgZXMgdHJ1ZSwgbGEgY29sdW1uYSBzZSBvY3VsdGEgZW4gbW9iaWxlXG4gICAqIFNvbG8gc2UgbXVlc3RyYSBlbiBicmVha3BvaW50IG1kKyAoNzY4cHgpXG4gICAqL1xuICBoaWRlT25Nb2JpbGU/OiBib29sZWFuO1xuICBcbiAgLyoqXG4gICAqIENTUyBjbGFzc2VzIGFkaWNpb25hbGVzIHBhcmEgbGFzIGNlbGRhcyBkZSBlc3RhIGNvbHVtbmFcbiAgICovXG4gIGNlbGxDbGFzcz86IHN0cmluZztcbiAgXG4gIC8qKlxuICAgKiBDU1MgY2xhc3NlcyBhZGljaW9uYWxlcyBwYXJhIGVsIGhlYWRlciBkZSBlc3RhIGNvbHVtbmFcbiAgICovXG4gIGhlYWRlckNsYXNzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERhdGEtdGFibGUgZ2Vuw6lyaWNvIGNvbiBwYWdpbmFjacOzbiwgZmlsdHJhZG8geSBzZWxlY2Npw7NuXG4gKiBcbiAqIE5VRVZPOiBBaG9yYSBlcyBnZW7DqXJpY28geSBjb25maWd1cmFibGUgdmlhIGNvbHVtbmFzXG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmlyIGNvbHVtbmFzXG4gKiBjb2x1bW5zOiBQZG1EYXRhVGFibGVDb2x1bW48VXNlcj5bXSA9IFtcbiAqICAgeyBrZXk6ICduYW1lJywgbGFiZWw6ICdOYW1lJywgc29ydGFibGU6IHRydWUgfSxcbiAqICAgeyBrZXk6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICogICB7IGtleTogJ3JvbGUnLCBsYWJlbDogJ1JvbGUnLCBoaWRlT25Nb2JpbGU6IHRydWUgfSxcbiAqICAgeyBrZXk6ICdjcmVhdGVkQXQnLCBsYWJlbDogJ0NyZWF0ZWQnLCByZW5kZXI6ICh2YWwpID0+IGZvcm1hdERhdGUodmFsKSB9XG4gKiBdO1xuICogXG4gKiAvLyBFbiBlbCB0ZW1wbGF0ZVxuICogPHBkbS1kYXRhLXRhYmxlXG4gKiAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICogICBbcm93c109XCJ1c2Vyc1wiXG4gKiAgIFtzZWxlY3RhYmxlXT1cInRydWVcIlxuICogICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0KCRldmVudClcIj5cbiAqIDwvcGRtLWRhdGEtdGFibGU+XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkbS1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1EYXRhVGFibGVDb21wb25lbnQ8VCA9IGFueT4ge1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgXG4gIC8qKlxuICAgKiBDb2x1bW5hcyBhIG1vc3RyYXJcbiAgICogU2kgbm8gc2UgcHJvdmVlLCBpbnRlbnRhIGluZmVyaXIgZGVsIHByaW1lciByb3cgKGxlZ2FjeSBtb2RlKVxuICAgKi9cbiAgQElucHV0KCkgY29sdW1uczogUGRtRGF0YVRhYmxlQ29sdW1uPFQ+W10gPSBbXTtcbiAgXG4gIC8qKlxuICAgKiBFc3RyYXRlZ2lhIHJlc3BvbnNpdmUgZGUgbGEgdGFibGFcbiAgICovXG4gIEBJbnB1dCgpIHJlc3BvbnNpdmVTdHJhdGVneTogVGFibGVSZXNwb25zaXZlU3RyYXRlZ3kgPSAnc2Nyb2xsJztcbiAgXG4gIC8qKlxuICAgKiBTaSBlcyB0cnVlLCBtdWVzdHJhIGNoZWNrYm94IGRlIHNlbGVjY2nDs24gZW4gY2FkYSBmaWxhXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RhYmxlID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogU2kgZXMgdHJ1ZSwgbXVlc3RyYSBib3TDs24gZGUgYWNjaW9uZXMgKHRyZXMgcHVudG9zKSBlbiBjYWRhIGZpbGFcbiAgICovXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25zID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogU2kgZXMgdHJ1ZSwgbXVlc3RyYSBmaWx0cm8gZGUgYsO6c3F1ZWRhXG4gICAqL1xuICBASW5wdXQoKSBzaG93RmlsdGVyID0gdHJ1ZTtcbiAgXG4gIC8qKlxuICAgKiBTaSBlcyB0cnVlLCBtdWVzdHJhIGNvbnRyb2xlcyBkZSBwYWdpbmFjacOzblxuICAgKi9cbiAgQElucHV0KCkgc2hvd1BhZ2luYXRpb24gPSB0cnVlO1xuICBcbiAgLyoqXG4gICAqIFNpIGVzIHRydWUsIG11ZXN0cmEgc2VsZWN0b3IgZGUgY29sdW1uYXNcbiAgICovXG4gIEBJbnB1dCgpIHNob3dDb2x1bW5TZWxlY3RvciA9IGZhbHNlO1xuICBcbiAgLy8gTGFiZWxzIGkxOG5cbiAgQElucHV0KCkgZmlsdGVyUGxhY2Vob2xkZXIgPSAnRmlsdGVyLi4uJztcbiAgQElucHV0KCkgY29sdW1uc0xhYmVsID0gJ0NvbHVtbnMnO1xuICBASW5wdXQoKSBwcmV2aW91c0xhYmVsID0gJ1ByZXZpb3VzJztcbiAgQElucHV0KCkgbmV4dExhYmVsID0gJ05leHQnO1xuICBASW5wdXQoKSBlbXB0eUxhYmVsID0gJ05vIHJlc3VsdHMuJztcbiAgQElucHV0KCkgcm93c1NlbGVjdGVkTGFiZWwgPSAncm93KHMpIHNlbGVjdGVkJztcbiAgXG4gIC8vIERFUFJFQ0FURUQ6IExhYmVscyBoYXJkY29kZWFkb3MgcGFyYSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgY29sdW1ucyBjb25maWd1cmF0aW9uIGluc3RlYWRcbiAgICovXG4gIEBJbnB1dCgpIHN0YXR1c0xhYmVsID0gJ1N0YXR1cyc7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgY29sdW1ucyBjb25maWd1cmF0aW9uIGluc3RlYWRcbiAgICovXG4gIEBJbnB1dCgpIGVtYWlsTGFiZWwgPSAnRW1haWwnO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbHVtbnMgY29uZmlndXJhdGlvbiBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoKSBhbW91bnRMYWJlbCA9ICdBbW91bnQnO1xuICBcbiAgLyoqXG4gICAqIERhdG9zIGEgbW9zdHJhclxuICAgKi9cbiAgQElucHV0KCkgcm93czogVFtdID0gW107XG4gIFxuICAvKipcbiAgICogUMOhZ2luYSBhY3R1YWwgKDEtaW5kZXhlZClcbiAgICovXG4gIEBJbnB1dCgpIHBhZ2UgPSAxO1xuICBcbiAgLyoqXG4gICAqIENhbnRpZGFkIGRlIGZpbGFzIHBvciBww6FnaW5hXG4gICAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZSA9IDEwO1xuICBcbiAgLyoqXG4gICAqIFF1ZXJ5IGRlIGZpbHRyYWRvXG4gICAqL1xuICBASW5wdXQoKSBxdWVyeSA9ICcnO1xuICBcbiAgLyoqXG4gICAqIEZ1bmNpw7NuIGN1c3RvbSBkZSBmaWx0cmFkb1xuICAgKiBTaSBubyBzZSBwcm92ZWUsIGJ1c2NhIGVuIHRvZG9zIGxvcyBjYW1wb3Mgc3RyaW5nXG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJGbj86IChyb3c6IFQsIHF1ZXJ5OiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgQE91dHB1dCgpIHF1ZXJ5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSByb3dBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcm93OiBUOyBzZWxlY3RlZDogYm9vbGVhbiB9PigpO1xuICBAT3V0cHV0KCkgY29sdW1uU29ydCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2x1bW46IFBkbURhdGFUYWJsZUNvbHVtbjxUPjsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB9PigpO1xuXG4gIC8vIEVzdGFkbyBpbnRlcm5vXG4gIHNlbGVjdGVkUm93cyA9IG5ldyBTZXQ8VD4oKTtcbiAgc29ydENvbHVtbj86IFBkbURhdGFUYWJsZUNvbHVtbjxUPjtcbiAgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcblxuICAvKipcbiAgICogQmFja3dhcmQgY29tcGF0aWJpbGl0eTogc2kgbm8gaGF5IGNvbHVtbmFzIGRlZmluaWRhcywgaW5mZXJpciBkZWwgcHJpbWVyIHJvd1xuICAgKi9cbiAgZ2V0IGVmZmVjdGl2ZUNvbHVtbnMoKTogUGRtRGF0YVRhYmxlQ29sdW1uPFQ+W10ge1xuICAgIGlmICh0aGlzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucztcbiAgICB9XG4gICAgXG4gICAgLy8gTGVnYWN5IG1vZGU6IGluZmVyaXIgY29sdW1uYXMgZGVsIHByaW1lciByb3cgKHNvbG8gcGFyYSBQZG1EYXRhVGFibGVSb3cpXG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdFJvdyA9IHRoaXMucm93c1swXSBhcyBhbnk7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZmlyc3RSb3cpXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ3NlbGVjdGVkJylcbiAgICAgICAgLm1hcChrZXkgPT4gKHtcbiAgICAgICAgICBrZXk6IGtleSBhcyBrZXlvZiBULFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmdldExlZ2FjeUxhYmVsKGtleSksXG4gICAgICAgICAgYWxpZ246IGtleSA9PT0gJ2Ftb3VudCcgPyAncmlnaHQnIDogJ2xlZnQnXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIExFR0FDWTogbWFwZW8gZGUga2V5cyBhIGxhYmVscyBoYXJkY29kZWFkb3NcbiAgICovXG4gIHByaXZhdGUgZ2V0TGVnYWN5TGFiZWwoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXNMYWJlbCxcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsTGFiZWwsXG4gICAgICBhbW91bnQ6IHRoaXMuYW1vdW50TGFiZWxcbiAgICB9O1xuICAgIHJldHVybiBtYXBba2V5XSB8fCBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7XG4gIH1cblxuICBnZXQgZmlsdGVyZWRSb3dzKCk6IFRbXSB7XG4gICAgY29uc3QgcSA9IHRoaXMucXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFxKSByZXR1cm4gdGhpcy5yb3dzO1xuICAgIFxuICAgIGlmICh0aGlzLmZpbHRlckZuKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyb3cgPT4gdGhpcy5maWx0ZXJGbiEocm93LCBxKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbHRyYWRvIGRlZmF1bHQ6IGJ1c2NhciBlbiB0b2RvcyBsb3MgY2FtcG9zIHN0cmluZ1xuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHJvdyA9PiB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyb3cgYXMgYW55KS5zb21lKHZhbCA9PiBcbiAgICAgICAgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgcGFnZWRSb3dzKCk6IFRbXSB7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplO1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLnBhZ2VTaXplKTtcbiAgfVxuXG4gIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSk7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUm93cy5zaXplO1xuICB9XG5cbiAgb25RdWVyeUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25Ub2dnbGVSb3cocm93OiBULCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgIFxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93cy5hZGQocm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyByb3csIHNlbGVjdGVkOiBjaGVja2VkIH0pO1xuICB9XG5cbiAgb25Ub2dnbGVBbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICBcbiAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgdGhpcy5wYWdlZFJvd3MuZm9yRWFjaChyb3cgPT4gdGhpcy5zZWxlY3RlZFJvd3MuYWRkKHJvdykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VkUm93cy5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGVkUm93cy5kZWxldGUocm93KSk7XG4gICAgfVxuICB9XG5cbiAgaXNTZWxlY3RlZChyb3c6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd3MuaGFzKHJvdyk7XG4gIH1cblxuICBwcmV2aW91cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYWdlIDw9IDEpIHJldHVybjtcbiAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2UgLSAxKTtcbiAgfVxuXG4gIG5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFnZSA+PSB0aGlzLnRvdGFsUGFnZXMpIHJldHVybjtcbiAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2UgKyAxKTtcbiAgfVxuXG4gIG9uQWN0aW9uKHJvdzogVCk6IHZvaWQge1xuICAgIHRoaXMucm93QWN0aW9uLmVtaXQocm93KTtcbiAgfVxuXG4gIG9uU29ydChjb2x1bW46IFBkbURhdGFUYWJsZUNvbHVtbjxUPik6IHZvaWQge1xuICAgIGlmICghY29sdW1uLnNvcnRhYmxlKSByZXR1cm47XG4gICAgXG4gICAgaWYgKHRoaXMuc29ydENvbHVtbiA9PT0gY29sdW1uKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydENvbHVtbiA9IGNvbHVtbjtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmNvbHVtblNvcnQuZW1pdCh7IGNvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLnNvcnREaXJlY3Rpb24gfSk7XG4gIH1cblxuICBnZXRDZWxsVmFsdWUocm93OiBULCBjb2x1bW46IFBkbURhdGFUYWJsZUNvbHVtbjxUPik6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSByb3dbY29sdW1uLmtleV07XG4gICAgXG4gICAgaWYgKGNvbHVtbi5yZW5kZXIpIHtcbiAgICAgIHJldHVybiBjb2x1bW4ucmVuZGVyKHZhbHVlLCByb3cpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiAnJztcbiAgfVxuXG4gIGdldENlbGxDbGFzcyhjb2x1bW46IFBkbURhdGFUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFsncHgtMicsICdweS0yJ107XG4gICAgXG4gICAgaWYgKGNvbHVtbi5hbGlnbiA9PT0gJ2NlbnRlcicpIGNsYXNzZXMucHVzaCgndGV4dC1jZW50ZXInKTtcbiAgICBpZiAoY29sdW1uLmFsaWduID09PSAncmlnaHQnKSBjbGFzc2VzLnB1c2goJ3RleHQtcmlnaHQnKTtcbiAgICBpZiAoY29sdW1uLmhpZGVPbk1vYmlsZSkgY2xhc3Nlcy5wdXNoKCdoaWRkZW4nLCAnbWQ6dGFibGUtY2VsbCcpO1xuICAgIGlmIChjb2x1bW4uY2VsbENsYXNzKSBjbGFzc2VzLnB1c2goY29sdW1uLmNlbGxDbGFzcyk7XG4gICAgXG4gICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ2xhc3MoY29sdW1uOiBQZG1EYXRhVGFibGVDb2x1bW48VD4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbJ3B4LTInLCAncHktMicsICd0ZXh0LWxlZnQnLCAnZm9udC1tZWRpdW0nXTtcbiAgICBcbiAgICBpZiAoY29sdW1uLmhpZGVPbk1vYmlsZSkgY2xhc3Nlcy5wdXNoKCdoaWRkZW4nLCAnbWQ6dGFibGUtY2VsbCcpO1xuICAgIGlmIChjb2x1bW4uaGVhZGVyQ2xhc3MpIGNsYXNzZXMucHVzaChjb2x1bW4uaGVhZGVyQ2xhc3MpO1xuICAgIFxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldENvbHVtblN0eWxlKGNvbHVtbjogUGRtRGF0YVRhYmxlQ29sdW1uPFQ+KTogYW55IHtcbiAgICByZXR1cm4gY29sdW1uLndpZHRoID8geyB3aWR0aDogY29sdW1uLndpZHRoIH0gOiB7fTtcbiAgfVxufVxuIiwiPHNlY3Rpb24gW25nQ2xhc3NdPVwiWydmbGV4IHctZnVsbCBmbGV4LWNvbCcsIGNsYXNzTmFtZV1cIj5cbiAgPCEtLSBUb29sYmFyOiBGaWx0cm8gKyBTZWxlY3RvciBkZSBjb2x1bW5hcyAtLT5cbiAgPGRpdlxuICAgICpuZ0lmPVwic2hvd0ZpbHRlciB8fCBzaG93Q29sdW1uU2VsZWN0b3JcIlxuICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTIgcHktNCBzbTpmbGV4LXJvdyBzbTppdGVtcy1jZW50ZXJcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICAqbmdJZj1cInNob3dGaWx0ZXJcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cImZpbHRlclBsYWNlaG9sZGVyXCJcbiAgICAgIFt2YWx1ZV09XCJxdWVyeVwiXG4gICAgICAoaW5wdXQpPVwib25RdWVyeUlucHV0KCRldmVudClcIlxuICAgICAgY2xhc3M9XCJoLTkgZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy10cmFuc3BhcmVudCBweC0zIHB5LTEgdGV4dC1zbSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtYmFja2dyb3VuZFwiXG4gICAgLz5cblxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwic2hvd0NvbHVtblNlbGVjdG9yXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTkgYXBwZWFyYW5jZS1ub25lIGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICA+XG4gICAgICA8c3Bhbj57eyBjb2x1bW5zTGFiZWwgfX08L3NwYW4+XG4gICAgICA8c3ZnXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICBjbGFzcz1cImgtNCB3LTQgdGV4dC1mb3JlZ3JvdW5kXCJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgID5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTcgMTBMMTIgMTVMMTcgMTBcIlxuICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgID48L3BhdGg+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBUYWJsYSBjb24gcmVzcG9uc2l2ZSAtLT5cbiAgPHBkbS10YWJsZVxuICAgIHZhcmlhbnQ9XCJkYXRhXCJcbiAgICBbcmVzcG9uc2l2ZVN0cmF0ZWd5XT1cInJlc3BvbnNpdmVTdHJhdGVneVwiXG4gICAgW2Z1bGxCbGVlZF09XCJmYWxzZVwiXG4gID5cbiAgICA8dGhlYWQ+XG4gICAgICA8dHI+XG4gICAgICAgIDwhLS0gQ29sdW1uYSBkZSBzZWxlY2Npw7NuIC0tPlxuICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3RhYmxlXCIgY2xhc3M9XCJ3LTEwIHB4LTIgcHktMiB0ZXh0LWxlZnQgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlQWxsKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJoLTQgdy00IHJvdW5kZWQtc20gYm9yZGVyIGJvcmRlci1pbnB1dFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC90aD5cblxuICAgICAgICA8IS0tIENvbHVtbmFzIGRpbsOhbWljYXMgLS0+XG4gICAgICAgIDx0aFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgZWZmZWN0aXZlQ29sdW1uc1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0SGVhZGVyQ2xhc3MoY29sdW1uKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sdW1uU3R5bGUoY29sdW1uKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIEhlYWRlciBzb3J0YWJsZSAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNvcnQoY29sdW1uKVwiXG4gICAgICAgICAgICBjbGFzcz1cImlubGluZS1mbGV4IGFwcGVhcmFuY2Utbm9uZSBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXItMCBiZy10cmFuc3BhcmVudCBweC0zIHB5LTIgdGV4dC1zbSBob3Zlcjp1bmRlcmxpbmVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuPnt7IGNvbHVtbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNFwiXG4gICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk04IDZMNCAxMEw4IDE0TTE2IDE4TDIwIDE0TDE2IDEwXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIEhlYWRlciBubyBzb3J0YWJsZSAtLT5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjb2x1bW4uc29ydGFibGVcIj57eyBjb2x1bW4ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvdGg+XG5cbiAgICAgICAgPCEtLSBDb2x1bW5hIGRlIGFjY2lvbmVzIC0tPlxuICAgICAgICA8dGggKm5nSWY9XCJzaG93QWN0aW9uc1wiIGNsYXNzPVwidy0xMCBweC0yIHB5LTJcIj48L3RoPlxuICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuXG4gICAgPHRib2R5PlxuICAgICAgPCEtLSBGaWxhcyBjb24gZGF0b3MgLS0+XG4gICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwYWdlZFJvd3NcIj5cbiAgICAgICAgPCEtLSBDZWxkYSBkZSBzZWxlY2Npw7NuIC0tPlxuICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3RhYmxlXCIgY2xhc3M9XCJweC0yIHB5LTJcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJoLTQgdy00IHJvdW5kZWQtc20gYm9yZGVyIGJvcmRlci1pbnB1dFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC90ZD5cblxuICAgICAgICA8IS0tIENlbGRhcyBkaW7DoW1pY2FzIC0tPlxuICAgICAgICA8dGRcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGVmZmVjdGl2ZUNvbHVtbnNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENlbGxDbGFzcyhjb2x1bW4pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gVGVtcGxhdGUgcGVyc29uYWxpemFkbyBzaSBleGlzdGUgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5jZWxsVGVtcGxhdGU7IGVsc2UgZGVmYXVsdENlbGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBjb2x1bW4uY2VsbFRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3csIHZhbHVlOiByb3dbY29sdW1uLmtleV0gfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIFJlbmRlcml6YWRvIGRlZmF1bHQgLS0+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbD5cbiAgICAgICAgICAgIHt7IGdldENlbGxWYWx1ZShyb3csIGNvbHVtbikgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuXG4gICAgICAgIDwhLS0gQ2VsZGEgZGUgYWNjaW9uZXMgLS0+XG4gICAgICAgIDx0ZCAqbmdJZj1cInNob3dBY3Rpb25zXCIgY2xhc3M9XCJweC0yIHB5LTJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaC04IHctOCBhcHBlYXJhbmNlLW5vbmUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci0wIGJnLXRyYW5zcGFyZW50IHAtMCBob3Zlcjp0ZXh0LWZvcmVncm91bmRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWN0aW9uKHJvdylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNFwiXG4gICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI2XCIgY3k9XCIxMlwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMThcIiBjeT1cIjEyXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L2NpcmNsZT5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cblxuICAgICAgPCEtLSBGaWxhIHZhY8OtYSAtLT5cbiAgICAgIDx0ciAqbmdJZj1cInBhZ2VkUm93cy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgPHRkXG4gICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJcbiAgICAgICAgICAgIGVmZmVjdGl2ZUNvbHVtbnMubGVuZ3RoICtcbiAgICAgICAgICAgIChzZWxlY3RhYmxlID8gMSA6IDApICtcbiAgICAgICAgICAgIChzaG93QWN0aW9ucyA/IDEgOiAwKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgY2xhc3M9XCJweC0zIHB5LTYgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZW1wdHlMYWJlbCB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L3Rib2R5PlxuICA8L3BkbS10YWJsZT5cblxuICA8IS0tIEZvb3RlcjogSW5mbyArIFBhZ2luYWNpw7NuIC0tPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93UGFnaW5hdGlvbiB8fCBzZWxlY3RhYmxlXCJcbiAgICBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHktNCBzbTpmbGV4LW5vd3JhcFwiXG4gID5cbiAgICA8cFxuICAgICAgKm5nSWY9XCJzZWxlY3RhYmxlXCJcbiAgICAgIGNsYXNzPVwibS0wIGZsZXgtMSBwci0yIHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICA+XG4gICAgICB7eyBzZWxlY3RlZENvdW50IH19IG9mIHt7IHJvd3MubGVuZ3RoIH19IHt7IHJvd3NTZWxlY3RlZExhYmVsIH19XG4gICAgPC9wPlxuXG4gICAgPGRpdiAqbmdJZj1cInNob3dQYWdpbmF0aW9uXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBtbC1hdXRvXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgIFBhZ2Uge3sgcGFnZSB9fSBvZiB7eyB0b3RhbFBhZ2VzIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImgtOSBhcHBlYXJhbmNlLW5vbmUgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtNCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc20gcmluZy1vZmZzZXQtYmFja2dyb3VuZCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6b3BhY2l0eS01MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwicGFnZSA8PSAxXCJcbiAgICAgICAgKGNsaWNrKT1cInByZXZpb3VzKClcIlxuICAgICAgPlxuICAgICAgICB7eyBwcmV2aW91c0xhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiaC05IGFwcGVhcmFuY2Utbm9uZSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC00IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpvcGFjaXR5LTUwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJwYWdlID49IHRvdGFsUGFnZXNcIlxuICAgICAgICAoY2xpY2spPVwibmV4dCgpXCJcbiAgICAgID5cbiAgICAgICAge3sgbmV4dExhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3NlY3Rpb24+XG4iXX0=
|