tin-spa 2.1.2 → 2.1.4

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.
Files changed (37) hide show
  1. package/esm2020/lib/classes/Classes.mjs +4 -2
  2. package/esm2020/lib/classes/TinCore.mjs +4 -2
  3. package/esm2020/lib/components/attach/attach.component.mjs +3 -3
  4. package/esm2020/lib/components/date/date.component.mjs +1 -1
  5. package/esm2020/lib/components/filter/filter.component.mjs +14 -11
  6. package/esm2020/lib/components/form/form.component.mjs +41 -7
  7. package/esm2020/lib/components/logs/logs.component.mjs +1 -1
  8. package/esm2020/lib/components/option/option.component.mjs +14 -6
  9. package/esm2020/lib/components/search/search.component.mjs +31 -0
  10. package/esm2020/lib/components/table/detailsDialog.component.mjs +60 -15
  11. package/esm2020/lib/components/table/table.component.mjs +159 -121
  12. package/esm2020/lib/components/text/text.component.mjs +3 -3
  13. package/esm2020/lib/components/tiles/tiles.component.mjs +57 -19
  14. package/esm2020/lib/components/users/users.component.mjs +1 -1
  15. package/esm2020/lib/components/viewer/viewer.component.mjs +58 -0
  16. package/esm2020/lib/components/viewer/viewerDialog.component.mjs +75 -0
  17. package/esm2020/lib/pipes/camelToWords.pipe.mjs +3 -9
  18. package/esm2020/lib/services/data.service.mjs +7 -2
  19. package/esm2020/lib/tin-spa.module.mjs +14 -5
  20. package/esm2020/public-api.mjs +4 -1
  21. package/fesm2015/tin-spa.mjs +537 -225
  22. package/fesm2015/tin-spa.mjs.map +1 -1
  23. package/fesm2020/tin-spa.mjs +527 -223
  24. package/fesm2020/tin-spa.mjs.map +1 -1
  25. package/lib/classes/Classes.d.ts +32 -9
  26. package/lib/components/filter/filter.component.d.ts +2 -1
  27. package/lib/components/form/form.component.d.ts +6 -1
  28. package/lib/components/option/option.component.d.ts +3 -1
  29. package/lib/components/search/search.component.d.ts +13 -0
  30. package/lib/components/table/detailsDialog.component.d.ts +7 -3
  31. package/lib/components/table/table.component.d.ts +20 -25
  32. package/lib/components/tiles/tiles.component.d.ts +15 -5
  33. package/lib/components/viewer/viewer.component.d.ts +19 -0
  34. package/lib/components/viewer/viewerDialog.component.d.ts +22 -0
  35. package/lib/tin-spa.module.d.ts +7 -4
  36. package/package.json +1 -1
  37. package/public-api.d.ts +3 -0
@@ -2,6 +2,7 @@ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core
2
2
  import { MatTableDataSource } from '@angular/material/table';
3
3
  import { FormConfig } from '../../classes/Classes';
4
4
  import { detailsDialog } from './detailsDialog.component';
5
+ import { Subject } from 'rxjs';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "../../services/data.service";
7
8
  import * as i2 from "../../services/message.service";
@@ -12,10 +13,13 @@ import * as i6 from "@angular/material/table";
12
13
  import * as i7 from "@angular/material/paginator";
13
14
  import * as i8 from "@angular/material/button";
14
15
  import * as i9 from "@angular/material/icon";
15
- import * as i10 from "@angular/material/tooltip";
16
- import * as i11 from "../check/check.component";
17
- import * as i12 from "../filter/filter.component";
18
- import * as i13 from "../../pipes/camelToWords.pipe";
16
+ import * as i10 from "@angular/material/chips";
17
+ import * as i11 from "@angular/material/tooltip";
18
+ import * as i12 from "../check/check.component";
19
+ import * as i13 from "../filter/filter.component";
20
+ import * as i14 from "../tiles/tiles.component";
21
+ import * as i15 from "../search/search.component";
22
+ import * as i16 from "../../pipes/camelToWords.pipe";
19
23
  export class TableComponent {
20
24
  constructor(dataService, messageService, breakpointObserver, dialog) {
21
25
  this.dataService = dataService;
@@ -23,15 +27,15 @@ export class TableComponent {
23
27
  this.breakpointObserver = breakpointObserver;
24
28
  this.dialog = dialog;
25
29
  this.actionsWidth = "50px";
30
+ this.showFilterButton = true;
31
+ this.tileReload = new Subject();
26
32
  this.data = [];
33
+ this.dataLoad = new EventEmitter();
27
34
  this.refreshClick = new EventEmitter();
35
+ this.searchClick = new EventEmitter();
28
36
  this.createClick = new EventEmitter();
29
- this.viewClick = new EventEmitter();
30
- this.editClick = new EventEmitter();
31
- this.deleteClick = new EventEmitter();
32
- this.custom1Click = new EventEmitter();
33
- this.custom2Click = new EventEmitter();
34
- this.custom3Click = new EventEmitter();
37
+ this.actionClick = new EventEmitter();
38
+ this.inputChange = new EventEmitter();
35
39
  this.smallScreen = false;
36
40
  this.options = [];
37
41
  this.displayedColumns = [];
@@ -51,16 +55,19 @@ export class TableComponent {
51
55
  this.options = this.config.columns;
52
56
  this.setColumns();
53
57
  this.createButton = this.getButton('create');
54
- this.viewButton = this.getButton('view');
55
- this.editButton = this.getButton('edit');
56
- this.deleteButton = this.getButton('delete');
57
- this.custom1Button = this.getButton('custom1');
58
- this.custom2Button = this.getButton('custom2');
59
- this.custom3Button = this.getButton('custom3');
58
+ // this.viewButton = this.getButton('view')
59
+ // this.editButton = this.getButton('edit')
60
+ // this.deleteButton = this.getButton('delete')
61
+ // this.custom1Button = this.getButton('custom1')
62
+ // this.custom2Button = this.getButton('custom2')
63
+ // this.custom3Button = this.getButton('custom3')
60
64
  if (this.config.loadAction) {
61
- this.loadData();
65
+ this.loadData(this.config.loadAction, "");
62
66
  }
63
67
  this.formDefaults();
68
+ if (this.config.searchConfig) {
69
+ this.showFilterButton = false;
70
+ }
64
71
  }
65
72
  ngOnChanges() {
66
73
  if (!this.config.loadAction) {
@@ -70,6 +77,39 @@ export class TableComponent {
70
77
  setTimeout(() => { this.tableDataSource.paginator = this.tablePaginator; }, 5);
71
78
  }
72
79
  }
80
+ inputChanged(event) {
81
+ this.inputChange.emit({ name: event.name, value: event.value });
82
+ console.log("Changed " + JSON.stringify(event));
83
+ }
84
+ formDefaults() {
85
+ if (!this.config.formConfig) {
86
+ let config = new FormConfig;
87
+ config.fields = [];
88
+ this.config.columns.forEach(column => {
89
+ let field = { name: column.name, type: column.type };
90
+ config.fields.push(field);
91
+ });
92
+ this.config.formConfig = config;
93
+ }
94
+ }
95
+ setColumns() {
96
+ if (!this.config?.columns) {
97
+ return;
98
+ }
99
+ if (this.smallScreen) {
100
+ this.displayedColumns = this.config.minColumns;
101
+ }
102
+ else {
103
+ this.displayedColumns = this.config.columns.map(({ name }) => name);
104
+ }
105
+ let buttonsCount = this.config.buttons.filter(x => x.name != 'create').length ?? 0;
106
+ if (buttonsCount > 0) {
107
+ if (!this.displayedColumns.find(x => x == 'action') && this.config.buttons) {
108
+ this.displayedColumns.push("action");
109
+ }
110
+ this.actionsWidth = `${buttonsCount * 40 + 20}px`;
111
+ }
112
+ }
73
113
  getButton(name) {
74
114
  if (!this.config.buttons)
75
115
  return null;
@@ -96,37 +136,44 @@ export class TableComponent {
96
136
  }
97
137
  return i;
98
138
  }
99
- setColumns() {
100
- if (!this.config?.columns) {
101
- return;
102
- }
103
- if (this.smallScreen) {
104
- this.displayedColumns = this.config.minColumns;
139
+ getButtonColor(button, row) {
140
+ if (button.disabled) {
141
+ if (button.disabled(row)) {
142
+ return 'lightgray';
143
+ }
105
144
  }
106
- else {
107
- this.displayedColumns = this.config.columns.map(({ name }) => name);
145
+ if (button.color) {
146
+ return button.color;
108
147
  }
109
- let buttonsCount = this.config.buttons.filter(x => x.name != 'create').length ?? 0;
110
- if (buttonsCount > 0) {
111
- if (!this.displayedColumns.find(x => x == 'action') && this.config.buttons) {
112
- this.displayedColumns.push("action");
113
- }
114
- this.actionsWidth = `${buttonsCount * 40 + 20}px`;
148
+ if (button.name == 'delete') {
149
+ return '#F44336';
115
150
  }
151
+ return ' #4050B5';
116
152
  }
117
153
  getOptions(column) {
118
154
  let x = this.options.find(opt => opt.name === column);
119
155
  return x;
120
156
  }
121
- testIconCondition(column, row) {
122
- const option = this.getOptions(column);
123
- if (option && option.icon && !option.icon.condition) {
124
- return true;
157
+ getColor(v, options) {
158
+ let defaultColor = 'lightgrey';
159
+ if (!options)
160
+ return defaultColor;
161
+ let c = options.find(x => x.value == v);
162
+ if (c) {
163
+ return c.color;
164
+ }
165
+ else {
166
+ return defaultColor;
125
167
  }
126
- if (option && option.icon && option.icon.condition) {
127
- return option.icon.condition(row[column]);
168
+ }
169
+ testIconCondition(value, icon) {
170
+ // const option = this.getOptions(column);
171
+ if (icon.condition) {
172
+ return icon.condition(value);
173
+ }
174
+ else {
175
+ return true;
128
176
  }
129
- return false;
130
177
  }
131
178
  testDisabled(row, buttonName) {
132
179
  let button = this.getButton(buttonName);
@@ -143,52 +190,72 @@ export class TableComponent {
143
190
  return true;
144
191
  }
145
192
  //Actions
193
+ loadData(action, data) {
194
+ console.log("loading");
195
+ if (action) {
196
+ this.dataService.CallApi(action, data).subscribe((apiResponse) => {
197
+ this.dataSource = apiResponse.data;
198
+ this.tableDataSource = new MatTableDataSource(apiResponse.data);
199
+ this.tableDataSource.paginator = this.tablePaginator;
200
+ if (apiResponse.success) {
201
+ this.tableDataSource = new MatTableDataSource(apiResponse.data);
202
+ this.tableDataSource.paginator = this.tablePaginator;
203
+ this.dataLoaded(apiResponse.data);
204
+ }
205
+ else {
206
+ this.messageService.toast("Error: " + apiResponse.message);
207
+ }
208
+ });
209
+ }
210
+ }
211
+ //Events
212
+ searchClicked(x) {
213
+ console.log("Search");
214
+ this.refreshClick.emit(x);
215
+ console.log(x);
216
+ if (this.config.searchConfig.searchAction) {
217
+ this.config.searchConfig.searchAction.method == 'post';
218
+ this.loadData(this.config.searchConfig.searchAction, x);
219
+ }
220
+ }
146
221
  refreshClicked() {
147
222
  console.log("Refresh");
148
223
  this.refreshClick.emit();
149
224
  if (this.config.loadAction) {
150
- this.loadData();
225
+ this.loadData(this.config.loadAction, "");
151
226
  }
152
227
  }
153
- view(x) {
154
- console.log("View");
155
- this.viewClick.emit(x);
156
- // this.doAction('view', x);
157
- }
158
- create(x) {
159
- console.log("Create " + x);
160
- this.createClick.emit(x);
161
- this.doAction('create', x);
162
- }
163
- edit(x) {
164
- console.log("Edit " + x);
165
- this.editClick.emit(x);
166
- this.doAction('edit', x);
167
- }
168
- delete(x) {
169
- console.log("Delete");
170
- this.deleteClick.emit(x);
171
- this.doAction('delete', x);
172
- }
173
- custom1(x) {
174
- console.log("Custom 1");
175
- this.custom1Click.emit(x);
176
- this.doAction('custom1', x);
228
+ dataLoaded(x) {
229
+ this.dataLoad.emit(x);
230
+ console.log("dataloaded");
231
+ if (this.config.tileConfig?.loadAction) {
232
+ this.tileReload.next(true);
233
+ ;
234
+ }
177
235
  }
178
- custom2(x) {
179
- console.log("Custom 2");
180
- this.custom2Click.emit(x);
181
- this.doAction('custom2', x);
236
+ actionClicked(name, row) {
237
+ if (name == 'view') {
238
+ this.viewModel(row);
239
+ }
240
+ else if (name == 'edit') {
241
+ this.editModel(row);
242
+ }
243
+ else if (name == 'delete') {
244
+ this.deleteModel(row);
245
+ }
246
+ else {
247
+ this.actionClickedEmit(name, row);
248
+ }
249
+ this.doAction(name, row);
182
250
  }
183
- custom3(x) {
184
- console.log("Custom 3");
185
- this.custom3Click.emit(x);
186
- this.doAction('custom3', x);
251
+ actionClickedEmit(name, row) {
252
+ console.log("Action clicked");
253
+ this.actionClick.emit({ name: name, data: row });
187
254
  }
188
255
  viewModel(row) {
189
256
  let button = this.getButton('view');
190
257
  if (button && !button.dialog) {
191
- this.view(row);
258
+ // this.actionClicked('view',row);
192
259
  return;
193
260
  }
194
261
  if (!this.config.formConfig) {
@@ -208,7 +275,7 @@ export class TableComponent {
208
275
  newModel() {
209
276
  let button = this.getButton('create');
210
277
  if (button && !button.dialog) {
211
- this.create('');
278
+ // this.actionClickedEmit('create','');
212
279
  return;
213
280
  }
214
281
  if (!this.config.formConfig) {
@@ -221,18 +288,18 @@ export class TableComponent {
221
288
  });
222
289
  dialogRef.afterClosed().subscribe((result) => {
223
290
  if (result.message == "success") {
224
- this.create(result.data);
291
+ this.actionClickedEmit('create', result.data);
225
292
  this.refreshClicked();
226
293
  }
227
294
  else if (result.message == "emit") {
228
- this.create(result.data);
295
+ this.actionClickedEmit('create', result.data);
229
296
  }
230
297
  });
231
298
  }
232
299
  editModel(row) {
233
300
  let button = this.getButton('edit');
234
301
  if (button && !button.dialog) {
235
- this.edit(row);
302
+ // this.actionClicked('edit',row);
236
303
  return;
237
304
  }
238
305
  if (!this.config.formConfig) {
@@ -243,25 +310,28 @@ export class TableComponent {
243
310
  width: "900px",
244
311
  data: { mode: "edit", config: this.config, details: row, smallScreen: this.smallScreen },
245
312
  });
313
+ dialogRef.componentInstance.inputChange.subscribe((x) => {
314
+ this.inputChanged(x);
315
+ });
246
316
  dialogRef.afterClosed().subscribe((result) => {
247
317
  if (result.message == "success") {
248
- this.edit(result.data);
318
+ this.actionClickedEmit('edit', result.data);
249
319
  this.refreshClicked();
250
320
  }
251
321
  else if (result.message == "emit") {
252
- this.edit(result.data);
322
+ this.actionClickedEmit('edit', result.data);
253
323
  }
254
324
  });
255
325
  }
256
326
  deleteModel(row) {
257
327
  let button = this.getButton('delete');
258
328
  if (button && !button.dialog) {
259
- this.delete(row);
329
+ // this.actionClicked('delete', row);
260
330
  return;
261
331
  }
262
332
  this.messageService.confirm(`DELETE ?`).subscribe((result) => {
263
333
  if (result == "yes") {
264
- this.delete(row);
334
+ this.actionClickedEmit('delete', row);
265
335
  this.refreshClicked();
266
336
  }
267
337
  });
@@ -289,40 +359,12 @@ export class TableComponent {
289
359
  }
290
360
  });
291
361
  }
292
- loadData() {
293
- console.log("loading");
294
- if (this.config.loadAction) {
295
- this.dataService.CallApi(this.config.loadAction, "").subscribe((apiResponse) => {
296
- this.dataSource = apiResponse.data;
297
- this.tableDataSource = new MatTableDataSource(apiResponse.data);
298
- this.tableDataSource.paginator = this.tablePaginator;
299
- if (apiResponse.success) {
300
- this.tableDataSource = new MatTableDataSource(apiResponse.data);
301
- this.tableDataSource.paginator = this.tablePaginator;
302
- }
303
- else {
304
- this.messageService.toast("Error: " + JSON.stringify(apiResponse));
305
- }
306
- });
307
- }
308
- }
309
- formDefaults() {
310
- if (!this.config.formConfig) {
311
- let config = new FormConfig;
312
- config.fields = [];
313
- this.config.columns.forEach(column => {
314
- let field = { name: column.name, type: column.type };
315
- config.fields.push(field);
316
- });
317
- this.config.formConfig = config;
318
- }
319
- }
320
362
  }
321
363
  TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponent, deps: [{ token: i1.DataServiceLib }, { token: i2.MessageService }, { token: i3.BreakpointObserver }, { token: i4.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
322
- TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableComponent, selector: "spa-table", inputs: { data: "data", config: "config" }, outputs: { refreshClick: "refreshClick", createClick: "createClick", viewClick: "viewClick", editClick: "editClick", deleteClick: "deleteClick", custom1Click: "custom1Click", custom2Click: "custom2Click", custom3Click: "custom3Click" }, viewQueries: [{ propertyName: "tablePaginator", first: true, predicate: ["tablePaginator"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "\n<div class=\"top\">\n\n <div >\n <!-- <button *ngIf=\"config.newText\" id=\"btnNew\" mat-raised-button color=\"primary\" (click)=\"newModel()\">{{config.newText}}</button> -->\n <button *ngIf=\"createButton\" id=\"btnNew\" mat-raised-button color=\"primary\" (click)=\"newModel()\">{{createButton.display}}</button>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [data]=\"tableDataSource\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n<div>\n\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\n\n\n\n <div *ngIf=\"dataSource\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" class=\"mat-elevation-z8\">\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\n <th mat-header-cell *matHeaderCellDef>{{ column.name | camelToWords }}</th>\n <td mat-cell *matCellDef=\"let row;\" >\n\n <ng-container [ngSwitch]=\"column.type\">\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <spa-check [value]=\"row[column.name]\" [readonly]=\"true\"></spa-check>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{row[column.name] | date : 'dd/MM/yyyy'}}\n <mat-icon *ngIf=\"column.icon && testIconCondition(column.name, row)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'money'\">\n {{row[column.name] | currency:'':''}}\n <mat-icon *ngIf=\"column.icon && testIconCondition(column.name, row)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label>{{row[column.name]}}</label>\n <mat-icon *ngIf=\"column.icon && testIconCondition(column.name, row)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:smallScreen ? '50px' : actionsWidth}\">\n\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"viewButton.tip ?? 'view' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':viewButton.color}\" [disabled]=\"testDisabled(row,'view')\" *ngIf=\"viewButton && testVisible(row,'view')\" (click)=\"viewModel(row)\">\n <mat-icon>{{getIcon('view')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom1Button.tip ?? 'custom1' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom1Button.color}\" [disabled]=\"testDisabled(row,'custom1')\" *ngIf=\"!smallScreen && custom1Button && testVisible(row,'custom1')\" (click)=\"custom1(row)\">\n <mat-icon>{{getIcon('custom1')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom2Button.tip ?? 'custom2' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom2Button.color}\" [disabled]=\"testDisabled(row,'custom2')\" *ngIf=\"!smallScreen && custom2Button && testVisible(row,'custom2')\" (click)=\"custom2(row)\">\n <mat-icon>{{getIcon('custom2')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom3Button.tip ?? 'custom3' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom3Button.color}\" [disabled]=\"testDisabled(row,'custom3')\" *ngIf=\"!smallScreen && custom3Button && testVisible(row,'custom3')\" (click)=\"custom3(row)\">\n <mat-icon>{{getIcon('custom3')}}</mat-icon>\n </button>\n\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"editButton.tip ?? 'edit' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':editButton.color}\" [disabled]=\"testDisabled(row,'edit')\" *ngIf=\"!smallScreen && editButton && testVisible(row,'edit')\" (click)=\"editModel(row)\">\n <mat-icon>{{getIcon('edit')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"warn\" [matTooltip]=\"deleteButton.tip ?? 'delete' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':deleteButton.color}\" [disabled]=\"testDisabled(row,'delete')\" *ngIf=\"!smallScreen && deleteButton && testVisible(row,'delete')\" (click)=\"deleteModel(row)\">\n <mat-icon>{{getIcon('delete')}}</mat-icon>\n </button>\n\n </td>\n </ng-container>\n\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n </div>\n\n <mat-paginator #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n\n\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i8.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: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.CheckComponent, selector: "spa-check", inputs: ["readonly", "display", "value"], outputs: ["valueChange", "click", "check", "uncheck"] }, { kind: "component", type: i12.FilterComponent, selector: "spa-filter", inputs: ["data"], outputs: ["refreshClick"] }, { kind: "pipe", type: i5.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i13.CamelToWordsPipe, name: "camelToWords" }] });
364
+ TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableComponent, selector: "spa-table", inputs: { data: "data", config: "config" }, outputs: { dataLoad: "dataLoad", refreshClick: "refreshClick", searchClick: "searchClick", createClick: "createClick", actionClick: "actionClick", inputChange: "inputChange" }, viewQueries: [{ propertyName: "tablePaginator", first: true, predicate: ["tablePaginator"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "\n<spa-search *ngIf=\"config.searchConfig\" [config]=\"config.searchConfig\" style=\"margin-bottom: 20px;\" (searchClick)=\"searchClicked($event)\"></spa-search>\n\n<div class=\"top\">\n\n <div class=\"tin-row\" >\n <button *ngIf=\"createButton\" id=\"btnNew\" mat-raised-button color=\"primary\" style=\"margin-right: 10px;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <spa-tiles *ngIf=\"config.tileConfig\" [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [showButton]=\"showFilterButton\" [data]=\"tableDataSource\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n\n<div *ngIf=\"config.title\" class=\"title\">\n <label style=\"font-size: larger;\">{{config.title | camelToWords}}</label>\n</div>\n\n<div>\n\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\n\n\n\n <div *ngIf=\"dataSource\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" class=\"mat-elevation-z8\">\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\n <th mat-header-cell *matHeaderCellDef>{{ column.alias ?? column.name | camelToWords }}</th>\n <td mat-cell *matCellDef=\"let row;\" >\n\n <ng-container [ngSwitch]=\"column.type\">\n\n\n\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <spa-check [value]=\"row[column.name]\" [readonly]=\"true\"></spa-check>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip'\">\n <mat-chip-list>\n <mat-chip (click)=\"viewModel(row)\" [ngStyle]=\"{'background-color':getColor(row[column.name], column?.options)}\" style=\"font-size: 12px;\"> {{row[column.name]}} </mat-chip>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </mat-chip-list>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{row[column.name] | date : 'dd/MM/yyyy'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'datetime'\">\n {{row[column.name] | date : 'dd/MM/yyyy HH:mm'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <!-- <ng-container *ngSwitchCase=\"'spinner'\">\n <mat-spinner [diameter]=\"20\">\n\n </mat-spinner>\n </ng-container> -->\n\n <ng-container *ngSwitchCase=\"'money'\">\n {{row[column.name] | currency:'':''}}\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label>{{row[column.name]}}</label>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:smallScreen ? '50px' : actionsWidth}\">\n\n\n <ng-container *ngFor=\"let button of config.buttons\">\n\n <ng-container *ngIf=\"button.name != 'create' && testVisible(row,button.name)\">\n\n <!-- [color]=\"button.name =='delete' ? 'warn' : 'primary'\" -->\n <button *ngIf=\"!smallScreen || button.name == 'view'\" mat-mini-fab [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n [ngStyle]=\"{'background-color':getButtonColor(button, row)}\"\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon>{{getIcon(button.name)}}</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-container *ngIf=\"button.name != 'create' && !testVisible(row,button.name)\">\n <label style=\"margin-right: 35px;\"></label>\n </ng-container>\n\n </ng-container>\n\n\n\n <!-- <button mat-mini-fab color=\"primary\" [matTooltip]=\"viewButton.tip ?? 'view' \" matTooltipPosition=\"above\" style=\"margin-right:5px; margin-left: 20px;\" [ngStyle]=\"{'background-color':viewButton.color}\" [disabled]=\"testDisabled(row,'view')\" *ngIf=\"viewButton && testVisible(row,'view')\" (click)=\"viewModel(row)\">\n <mat-icon>{{getIcon('view')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom1Button.tip ?? 'custom1' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom1Button.color}\" [disabled]=\"testDisabled(row,'custom1')\" *ngIf=\"!smallScreen && custom1Button && testVisible(row,'custom1')\" (click)=\"custom1(row)\">\n <mat-icon>{{getIcon('custom1')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom2Button.tip ?? 'custom2' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom2Button.color}\" [disabled]=\"testDisabled(row,'custom2')\" *ngIf=\"!smallScreen && custom2Button && testVisible(row,'custom2')\" (click)=\"custom2(row)\">\n <mat-icon>{{getIcon('custom2')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom3Button.tip ?? 'custom3' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom3Button.color}\" [disabled]=\"testDisabled(row,'custom3')\" *ngIf=\"!smallScreen && custom3Button && testVisible(row,'custom3')\" (click)=\"custom3(row)\">\n <mat-icon>{{getIcon('custom3')}}</mat-icon>\n </button>\n\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"editButton.tip ?? 'edit' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':editButton.color}\" [disabled]=\"testDisabled(row,'edit')\" *ngIf=\"!smallScreen && editButton && testVisible(row,'edit')\" (click)=\"editModel(row)\">\n <mat-icon>{{getIcon('edit')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"warn\" [matTooltip]=\"deleteButton.tip ?? 'delete' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':deleteButton.color}\" [disabled]=\"testDisabled(row,'delete')\" *ngIf=\"!smallScreen && deleteButton && testVisible(row,'delete')\" (click)=\"deleteModel(row)\">\n <mat-icon>{{getIcon('delete')}}</mat-icon>\n </button> -->\n\n </td>\n </ng-container>\n\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n </div>\n\n <mat-paginator #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n\n\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:10px;margin-top:10px}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i8.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: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i10.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.CheckComponent, selector: "spa-check", inputs: ["readonly", "display", "value"], outputs: ["valueChange", "click", "check", "uncheck"] }, { kind: "component", type: i13.FilterComponent, selector: "spa-filter", inputs: ["showButton", "data"], outputs: ["refreshClick"] }, { kind: "component", type: i14.TilesComponent, selector: "spa-tiles", inputs: ["config", "data", "reload"], outputs: ["tileClick"] }, { kind: "component", type: i15.SearchComponent, selector: "spa-search", inputs: ["config"], outputs: ["searchClick"] }, { kind: "pipe", type: i5.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i16.CamelToWordsPipe, name: "camelToWords" }] });
323
365
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponent, decorators: [{
324
366
  type: Component,
325
- args: [{ selector: 'spa-table', template: "\n<div class=\"top\">\n\n <div >\n <!-- <button *ngIf=\"config.newText\" id=\"btnNew\" mat-raised-button color=\"primary\" (click)=\"newModel()\">{{config.newText}}</button> -->\n <button *ngIf=\"createButton\" id=\"btnNew\" mat-raised-button color=\"primary\" (click)=\"newModel()\">{{createButton.display}}</button>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [data]=\"tableDataSource\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n<div>\n\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\n\n\n\n <div *ngIf=\"dataSource\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" class=\"mat-elevation-z8\">\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\n <th mat-header-cell *matHeaderCellDef>{{ column.name | camelToWords }}</th>\n <td mat-cell *matCellDef=\"let row;\" >\n\n <ng-container [ngSwitch]=\"column.type\">\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <spa-check [value]=\"row[column.name]\" [readonly]=\"true\"></spa-check>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{row[column.name] | date : 'dd/MM/yyyy'}}\n <mat-icon *ngIf=\"column.icon && testIconCondition(column.name, row)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'money'\">\n {{row[column.name] | currency:'':''}}\n <mat-icon *ngIf=\"column.icon && testIconCondition(column.name, row)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label>{{row[column.name]}}</label>\n <mat-icon *ngIf=\"column.icon && testIconCondition(column.name, row)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:smallScreen ? '50px' : actionsWidth}\">\n\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"viewButton.tip ?? 'view' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':viewButton.color}\" [disabled]=\"testDisabled(row,'view')\" *ngIf=\"viewButton && testVisible(row,'view')\" (click)=\"viewModel(row)\">\n <mat-icon>{{getIcon('view')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom1Button.tip ?? 'custom1' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom1Button.color}\" [disabled]=\"testDisabled(row,'custom1')\" *ngIf=\"!smallScreen && custom1Button && testVisible(row,'custom1')\" (click)=\"custom1(row)\">\n <mat-icon>{{getIcon('custom1')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom2Button.tip ?? 'custom2' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom2Button.color}\" [disabled]=\"testDisabled(row,'custom2')\" *ngIf=\"!smallScreen && custom2Button && testVisible(row,'custom2')\" (click)=\"custom2(row)\">\n <mat-icon>{{getIcon('custom2')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom3Button.tip ?? 'custom3' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom3Button.color}\" [disabled]=\"testDisabled(row,'custom3')\" *ngIf=\"!smallScreen && custom3Button && testVisible(row,'custom3')\" (click)=\"custom3(row)\">\n <mat-icon>{{getIcon('custom3')}}</mat-icon>\n </button>\n\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"editButton.tip ?? 'edit' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':editButton.color}\" [disabled]=\"testDisabled(row,'edit')\" *ngIf=\"!smallScreen && editButton && testVisible(row,'edit')\" (click)=\"editModel(row)\">\n <mat-icon>{{getIcon('edit')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"warn\" [matTooltip]=\"deleteButton.tip ?? 'delete' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':deleteButton.color}\" [disabled]=\"testDisabled(row,'delete')\" *ngIf=\"!smallScreen && deleteButton && testVisible(row,'delete')\" (click)=\"deleteModel(row)\">\n <mat-icon>{{getIcon('delete')}}</mat-icon>\n </button>\n\n </td>\n </ng-container>\n\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n </div>\n\n <mat-paginator #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n\n\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}\n"] }]
367
+ args: [{ selector: 'spa-table', template: "\n<spa-search *ngIf=\"config.searchConfig\" [config]=\"config.searchConfig\" style=\"margin-bottom: 20px;\" (searchClick)=\"searchClicked($event)\"></spa-search>\n\n<div class=\"top\">\n\n <div class=\"tin-row\" >\n <button *ngIf=\"createButton\" id=\"btnNew\" mat-raised-button color=\"primary\" style=\"margin-right: 10px;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <spa-tiles *ngIf=\"config.tileConfig\" [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [showButton]=\"showFilterButton\" [data]=\"tableDataSource\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n\n<div *ngIf=\"config.title\" class=\"title\">\n <label style=\"font-size: larger;\">{{config.title | camelToWords}}</label>\n</div>\n\n<div>\n\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\n\n\n\n <div *ngIf=\"dataSource\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" class=\"mat-elevation-z8\">\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\n <th mat-header-cell *matHeaderCellDef>{{ column.alias ?? column.name | camelToWords }}</th>\n <td mat-cell *matCellDef=\"let row;\" >\n\n <ng-container [ngSwitch]=\"column.type\">\n\n\n\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <spa-check [value]=\"row[column.name]\" [readonly]=\"true\"></spa-check>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip'\">\n <mat-chip-list>\n <mat-chip (click)=\"viewModel(row)\" [ngStyle]=\"{'background-color':getColor(row[column.name], column?.options)}\" style=\"font-size: 12px;\"> {{row[column.name]}} </mat-chip>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </mat-chip-list>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{row[column.name] | date : 'dd/MM/yyyy'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'datetime'\">\n {{row[column.name] | date : 'dd/MM/yyyy HH:mm'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <!-- <ng-container *ngSwitchCase=\"'spinner'\">\n <mat-spinner [diameter]=\"20\">\n\n </mat-spinner>\n </ng-container> -->\n\n <ng-container *ngSwitchCase=\"'money'\">\n {{row[column.name] | currency:'':''}}\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label>{{row[column.name]}}</label>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"column.icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"icon?.tip\" matTooltipPosition=\"above\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:smallScreen ? '50px' : actionsWidth}\">\n\n\n <ng-container *ngFor=\"let button of config.buttons\">\n\n <ng-container *ngIf=\"button.name != 'create' && testVisible(row,button.name)\">\n\n <!-- [color]=\"button.name =='delete' ? 'warn' : 'primary'\" -->\n <button *ngIf=\"!smallScreen || button.name == 'view'\" mat-mini-fab [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n [ngStyle]=\"{'background-color':getButtonColor(button, row)}\"\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon>{{getIcon(button.name)}}</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-container *ngIf=\"button.name != 'create' && !testVisible(row,button.name)\">\n <label style=\"margin-right: 35px;\"></label>\n </ng-container>\n\n </ng-container>\n\n\n\n <!-- <button mat-mini-fab color=\"primary\" [matTooltip]=\"viewButton.tip ?? 'view' \" matTooltipPosition=\"above\" style=\"margin-right:5px; margin-left: 20px;\" [ngStyle]=\"{'background-color':viewButton.color}\" [disabled]=\"testDisabled(row,'view')\" *ngIf=\"viewButton && testVisible(row,'view')\" (click)=\"viewModel(row)\">\n <mat-icon>{{getIcon('view')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom1Button.tip ?? 'custom1' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom1Button.color}\" [disabled]=\"testDisabled(row,'custom1')\" *ngIf=\"!smallScreen && custom1Button && testVisible(row,'custom1')\" (click)=\"custom1(row)\">\n <mat-icon>{{getIcon('custom1')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom2Button.tip ?? 'custom2' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom2Button.color}\" [disabled]=\"testDisabled(row,'custom2')\" *ngIf=\"!smallScreen && custom2Button && testVisible(row,'custom2')\" (click)=\"custom2(row)\">\n <mat-icon>{{getIcon('custom2')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"custom3Button.tip ?? 'custom3' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':custom3Button.color}\" [disabled]=\"testDisabled(row,'custom3')\" *ngIf=\"!smallScreen && custom3Button && testVisible(row,'custom3')\" (click)=\"custom3(row)\">\n <mat-icon>{{getIcon('custom3')}}</mat-icon>\n </button>\n\n\n <button mat-mini-fab color=\"primary\" [matTooltip]=\"editButton.tip ?? 'edit' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':editButton.color}\" [disabled]=\"testDisabled(row,'edit')\" *ngIf=\"!smallScreen && editButton && testVisible(row,'edit')\" (click)=\"editModel(row)\">\n <mat-icon>{{getIcon('edit')}}</mat-icon>\n </button>\n\n <button mat-mini-fab color=\"warn\" [matTooltip]=\"deleteButton.tip ?? 'delete' \" matTooltipPosition=\"above\" style=\"margin-right:5px\" [ngStyle]=\"{'background-color':deleteButton.color}\" [disabled]=\"testDisabled(row,'delete')\" *ngIf=\"!smallScreen && deleteButton && testVisible(row,'delete')\" (click)=\"deleteModel(row)\">\n <mat-icon>{{getIcon('delete')}}</mat-icon>\n </button> -->\n\n </td>\n </ng-container>\n\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n </div>\n\n <mat-paginator #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n\n\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:10px;margin-top:10px}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}\n"] }]
326
368
  }], ctorParameters: function () { return [{ type: i1.DataServiceLib }, { type: i2.MessageService }, { type: i3.BreakpointObserver }, { type: i4.MatDialog }]; }, propDecorators: { tablePaginator: [{
327
369
  type: ViewChild,
328
370
  args: ['tablePaginator']
@@ -330,21 +372,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
330
372
  type: Input
331
373
  }], config: [{
332
374
  type: Input
333
- }], refreshClick: [{
334
- type: Output
335
- }], createClick: [{
375
+ }], dataLoad: [{
336
376
  type: Output
337
- }], viewClick: [{
338
- type: Output
339
- }], editClick: [{
377
+ }], refreshClick: [{
340
378
  type: Output
341
- }], deleteClick: [{
379
+ }], searchClick: [{
342
380
  type: Output
343
- }], custom1Click: [{
381
+ }], createClick: [{
344
382
  type: Output
345
- }], custom2Click: [{
383
+ }], actionClick: [{
346
384
  type: Output
347
- }], custom3Click: [{
385
+ }], inputChange: [{
348
386
  type: Output
349
387
  }] } });
350
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsT0FBTyxFQUFrQixVQUFVLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUloRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVUxRCxNQUFNLE9BQU8sY0FBYztJQUV6QixZQUFvQixXQUEyQixFQUFVLGNBQThCLEVBQVUsa0JBQXNDLEVBQVMsTUFBaUI7UUFBN0ksZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFTLFdBQU0sR0FBTixNQUFNLENBQVc7UUEyQ2pLLGlCQUFZLEdBQUcsTUFBTSxDQUFDO1FBb0JiLFNBQUksR0FBTyxFQUFFLENBQUM7UUFHYixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9CLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FB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QUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgRGF0ZVBpcGUsIEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCdXR0b24sIENvbHVtbiwgRm9ybUNvbmZpZywgVGFibGVDb25maWcgfSBmcm9tICcuLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWVzc2FnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBkZXRhaWxzRGlhbG9nIH0gZnJvbSAnLi9kZXRhaWxzRGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIsIEJyZWFrcG9pbnRTdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgRGF0YVNlcnZpY2VMaWIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RpbkNvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlTGliLCBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgcHJpdmF0ZSBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlciwgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nKVxuICB7XG4gICAgLy8gZGV0ZWN0IHNjcmVlbiBzaXplIGNoYW5nZXNcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFsgXCIobWF4LXdpZHRoOiA2MDBweClcIl0pLnN1YnNjcmliZSgocmVzdWx0OiBCcmVha3BvaW50U3RhdGUpID0+IHtcblxuICAgICAgaWYgKHJlc3VsdC5tYXRjaGVzKSB7XG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW4gPSB0cnVlXG4gICAgICAgIHRoaXMuc2V0Q29sdW1ucygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNtYWxsU2NyZWVuID0gZmFsc2VcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5zKClcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuY29uZmlnLmNvbHVtbnM7XG5cbiAgICB0aGlzLnNldENvbHVtbnMoKVxuXG4gICAgdGhpcy5jcmVhdGVCdXR0b24gPSB0aGlzLmdldEJ1dHRvbignY3JlYXRlJylcbiAgICB0aGlzLnZpZXdCdXR0b24gPSB0aGlzLmdldEJ1dHRvbigndmlldycpXG4gICAgdGhpcy5lZGl0QnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ2VkaXQnKVxuICAgIHRoaXMuZGVsZXRlQnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ2RlbGV0ZScpXG4gICAgdGhpcy5jdXN0b20xQnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ2N1c3RvbTEnKVxuICAgIHRoaXMuY3VzdG9tMkJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdjdXN0b20yJylcbiAgICB0aGlzLmN1c3RvbTNCdXR0b24gPSB0aGlzLmdldEJ1dHRvbignY3VzdG9tMycpXG5cblxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uKXtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1EZWZhdWx0cygpO1xuXG5cblxuICB9XG5cblxuICBhY3Rpb25zV2lkdGggPSBcIjUwcHhcIjtcblxuXG5cbiAgbmdPbkNoYW5nZXMoKSB7XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnLmxvYWRBY3Rpb24pe1xuICAgICAgY29uc29sZS5sb2coXCJUYWJsZSBkYXRhIENoYW5nZWRcIilcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZGF0YTtcblxuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4odGhpcy5kYXRhU291cmNlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnRhYmxlRGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnRhYmxlUGFnaW5hdG9yOyB9LCA1KVxuICAgIH1cblxuICB9XG5cblxuICBAVmlld0NoaWxkKCd0YWJsZVBhZ2luYXRvcicpIHRhYmxlUGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cblxuICBASW5wdXQoKSBkYXRhOiBhbnkgPVtdO1xuICBASW5wdXQoKSBjb25maWc6IFRhYmxlQ29uZmlnO1xuXG4gIEBPdXRwdXQoKSByZWZyZXNoQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHZpZXdDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGVkaXRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGRlbGV0ZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY3VzdG9tMUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY3VzdG9tMkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY3VzdG9tM0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHNtYWxsU2NyZWVuID0gZmFsc2VcblxuICBjcmVhdGVCdXR0b246IEJ1dHRvbjtcbiAgdmlld0J1dHRvblxuICBlZGl0QnV0dG9uXG4gIGRlbGV0ZUJ1dHRvblxuICBjdXN0b20xQnV0dG9uXG4gIGN1c3RvbTJCdXR0b25cbiAgY3VzdG9tM0J1dHRvblxuXG4gIC8vVGFibGVcbiAgdGFibGVEYXRhU291cmNlO1xuICBkYXRhU291cmNlOiBhbnlbXTtcbiAgb3B0aW9uczogQ29sdW1uW10gPSBbXTtcbiAgZGlzcGxheWVkQ29sdW1ucyA9IFtdXG5cblxuICBnZXRCdXR0b24obmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5idXR0b25zKSByZXR1cm4gbnVsbFxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5idXR0b25zLmZpbmQoeCA9PiB4Lm5hbWUgPT0gbmFtZSlcbiAgfVxuXG4gIGdldEljb24oYnV0dG9uTmFtZTogc3RyaW5nKXtcblxuICAgIGxldCBiID0gdGhpcy5nZXRCdXR0b24oYnV0dG9uTmFtZSk7XG4gICAgaWYgKGIuaWNvbil7XG4gICAgICByZXR1cm4gYi5pY29uLm5hbWVcbiAgICB9XG5cbiAgICBsZXQgaSA9ICdwYWdldmlldydcblxuICAgIHN3aXRjaCAoYnV0dG9uTmFtZSkge1xuXG4gICAgICBjYXNlICd2aWV3JzpcbiAgICAgICAgaSA9ICdwYWdldmlldydcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgaSA9ICdlZGl0J1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIGkgPSAnZGVsZXRlJ1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGk7XG4gIH1cblxuICBzZXRDb2x1bW5zICgpe1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uY29sdW1ucyl7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zbWFsbFNjcmVlbikge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb25maWcubWluQ29sdW1uc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbmZpZy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpXG4gICAgfVxuXG5cbiAgICBsZXQgYnV0dG9uc0NvdW50ID0gdGhpcy5jb25maWcuYnV0dG9ucy5maWx0ZXIoeCA9PiB4Lm5hbWUgIT0gJ2NyZWF0ZScpLmxlbmd0aCA/PyAwXG4gICAgaWYgKGJ1dHRvbnNDb3VudCA+IDApe1xuXG4gICAgICBpZiAoIXRoaXMuZGlzcGxheWVkQ29sdW1ucy5maW5kKHggPT4geCA9PSAnYWN0aW9uJykgJiYgdGhpcy5jb25maWcuYnV0dG9ucykge1xuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMucHVzaChcImFjdGlvblwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmFjdGlvbnNXaWR0aCA9IGAke2J1dHRvbnNDb3VudCAqIDQwICsgMjB9cHhgXG5cbiAgICB9XG5cbiAgfVxuXG4gIGdldE9wdGlvbnMoY29sdW1uKXtcbiAgICBsZXQgeCA9IHRoaXMub3B0aW9ucy5maW5kKG9wdCA9PiBvcHQubmFtZSA9PT0gY29sdW1uKTtcbiAgICByZXR1cm4gIHhcbiAgfVxuXG5cbiAgdGVzdEljb25Db25kaXRpb24oY29sdW1uOiBzdHJpbmcsIHJvdzogYW55KTogYm9vbGVhbiB7XG5cbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLmdldE9wdGlvbnMoY29sdW1uKTtcblxuICAgIGlmIChvcHRpb24gJiYgb3B0aW9uLmljb24gJiYgIW9wdGlvbi5pY29uLmNvbmRpdGlvbil7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uICYmIG9wdGlvbi5pY29uICYmIG9wdGlvbi5pY29uLmNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG9wdGlvbi5pY29uLmNvbmRpdGlvbihyb3dbY29sdW1uXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGVzdERpc2FibGVkKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbntcblxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKVxuXG4gICAgaWYgKGJ1dHRvbi5kaXNhYmxlZCl7XG5cbiAgICAgIHJldHVybiBidXR0b24uZGlzYWJsZWQocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0ZXN0VmlzaWJsZShyb3csIGJ1dHRvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpXG5cbiAgICBpZiAoYnV0dG9uLnZpc2libGUpIHtcblxuICAgICAgcmV0dXJuIGJ1dHRvbi52aXNpYmxlKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuXG4gIC8vQWN0aW9uc1xuXG4gIHJlZnJlc2hDbGlja2VkKCkge1xuICAgIGNvbnNvbGUubG9nKFwiUmVmcmVzaFwiKVxuICAgIHRoaXMucmVmcmVzaENsaWNrLmVtaXQoKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uKSB7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgdmlldyh4KSB7XG4gICAgY29uc29sZS5sb2coXCJWaWV3XCIpXG4gICAgdGhpcy52aWV3Q2xpY2suZW1pdCh4KTtcbiAgICAvLyB0aGlzLmRvQWN0aW9uKCd2aWV3JywgeCk7XG4gIH1cblxuICBjcmVhdGUoeCkge1xuICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRlIFwiICsgeClcbiAgICB0aGlzLmNyZWF0ZUNsaWNrLmVtaXQoeCk7XG4gICAgdGhpcy5kb0FjdGlvbignY3JlYXRlJywgeCk7XG4gIH1cblxuICBlZGl0KHgpIHtcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyB4KVxuICAgIHRoaXMuZWRpdENsaWNrLmVtaXQoeCk7XG4gICAgdGhpcy5kb0FjdGlvbignZWRpdCcsIHgpO1xuICB9XG5cbiAgZGVsZXRlKHgpIHtcbiAgICBjb25zb2xlLmxvZyhcIkRlbGV0ZVwiKVxuICAgIHRoaXMuZGVsZXRlQ2xpY2suZW1pdCh4KTtcbiAgICB0aGlzLmRvQWN0aW9uKCdkZWxldGUnLCB4KTtcbiAgfVxuXG4gIGN1c3RvbTEoeCkge1xuICAgIGNvbnNvbGUubG9nKFwiQ3VzdG9tIDFcIilcbiAgICB0aGlzLmN1c3RvbTFDbGljay5lbWl0KHgpO1xuICAgIHRoaXMuZG9BY3Rpb24oJ2N1c3RvbTEnLCB4KTtcbiAgfVxuXG4gIGN1c3RvbTIoeCkge1xuICAgIGNvbnNvbGUubG9nKFwiQ3VzdG9tIDJcIilcbiAgICB0aGlzLmN1c3RvbTJDbGljay5lbWl0KHgpO1xuICAgIHRoaXMuZG9BY3Rpb24oJ2N1c3RvbTInLCB4KTtcbiAgfVxuXG4gIGN1c3RvbTMoeCkge1xuICAgIGNvbnNvbGUubG9nKFwiQ3VzdG9tIDNcIilcbiAgICB0aGlzLmN1c3RvbTNDbGljay5lbWl0KHgpO1xuICAgIHRoaXMuZG9BY3Rpb24oJ2N1c3RvbTMnLCB4KTtcbiAgfVxuXG5cbiAgdmlld01vZGVsKHJvdykge1xuXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCd2aWV3Jyk7XG4gICAgaWYgKGJ1dHRvbiAmJiAhYnV0dG9uLmRpYWxvZykge1xuICAgICAgdGhpcy52aWV3KHJvdyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtQ29uZmlnKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGNvbmZpZ3VyZSBmb3JtXCIpXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihkZXRhaWxzRGlhbG9nLCB7XG4gICAgICB3aWR0aDogXCI5MDBweFwiLFxuICAgICAgZGF0YTogeyBtb2RlOiBcInZpZXdcIiwgY29uZmlnOiB0aGlzLmNvbmZpZywgZGV0YWlsczogcm93LCBzbWFsbFNjcmVlbjogdGhpcy5zbWFsbFNjcmVlbiB9LFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQubWVzc2FnZSkge1xuICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIG5ld01vZGVsKCkge1xuXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdjcmVhdGUnKTtcbiAgICBpZiAoYnV0dG9uICYmICFidXR0b24uZGlhbG9nKXtcbiAgICAgIHRoaXMuY3JlYXRlKCcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1Db25maWcpe1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlBsZWFzZSBjb25maWd1cmUgZm9ybVwiKVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oZGV0YWlsc0RpYWxvZywge1xuICAgICAgd2lkdGg6IFwiOTAwcHhcIixcbiAgICAgIGRhdGE6IHsgbW9kZTogXCJjcmVhdGVcIiwgY29uZmlnOiB0aGlzLmNvbmZpZywgc21hbGxTY3JlZW46IHRoaXMuc21hbGxTY3JlZW4gfVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQubWVzc2FnZSA9PVwic3VjY2Vzc1wiKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xuICAgICAgfWVsc2UgaWYgKHJlc3VsdC5tZXNzYWdlID09XCJlbWl0XCIpe1xuICAgICAgICB0aGlzLmNyZWF0ZShyZXN1bHQuZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG5cbiAgZWRpdE1vZGVsKHJvdykge1xuXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdlZGl0Jyk7XG4gICAgaWYgKGJ1dHRvbiAmJiAhYnV0dG9uLmRpYWxvZykge1xuICAgICAgdGhpcy5lZGl0KHJvdyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtQ29uZmlnKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGNvbmZpZ3VyZSBmb3JtXCIpXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihkZXRhaWxzRGlhbG9nLCB7XG4gICAgICB3aWR0aDogXCI5MDBweFwiLFxuICAgICAgZGF0YTogeyBtb2RlOiBcImVkaXRcIiwgY29uZmlnOiB0aGlzLmNvbmZpZywgZGV0YWlsczogcm93LCBzbWFsbFNjcmVlbjogdGhpcy5zbWFsbFNjcmVlbiB9LFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQubWVzc2FnZSA9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICB0aGlzLmVkaXQocmVzdWx0LmRhdGEpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwiZW1pdFwiKSB7XG4gICAgICAgIHRoaXMuZWRpdChyZXN1bHQuZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGVNb2RlbChyb3cpIHtcblxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbignZGVsZXRlJyk7XG4gICAgaWYgKGJ1dHRvbiAmJiAhYnV0dG9uLmRpYWxvZykge1xuICAgICAgdGhpcy5kZWxldGUocm93KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNvbmZpcm0oYERFTEVURSA/YCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCA9PSBcInllc1wiKSB7XG4gICAgICAgICAgdGhpcy5kZWxldGUocm93KVxuICAgICAgICAgIHRoaXMucmVmcmVzaENsaWNrZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBkb0FjdGlvbihidXR0b25OYW1lLHJvdyl7XG5cblxuICAgIGxldCBiID0gdGhpcy5nZXRCdXR0b24oYnV0dG9uTmFtZSlcblxuICAgIGlmICghYikgcmV0dXJuO1xuXG4gICAgaWYgKGIuYWN0aW9uICYmIGJ1dHRvbk5hbWUgIT0gJ2RlbGV0ZScpIHJldHVybjtcblxuICAgIGlmICghYi5hY3Rpb24pIHJldHVybjtcblxuXG4gICAgdGhpcy5kYXRhU2VydmljZS5DYWxsQXBpKGIuYWN0aW9uLCByb3cpLnN1YnNjcmliZSgoYXBpUmVzcG9uc2UpID0+IHtcblxuICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgaWYgKGIuYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlKXtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KGIuYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlVwZGF0ZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIGxvYWREYXRhKCl7XG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nXCIpXG5cbiAgICBpZiAodGhpcy5jb25maWcubG9hZEFjdGlvbil7XG5cbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaSh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uLCBcIlwiKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xuXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IGFwaVJlc3BvbnNlLmRhdGFcblxuICAgICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihhcGlSZXNwb25zZS5kYXRhKTtcbiAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy50YWJsZVBhZ2luYXRvcjtcblxuICAgICAgICBpZiAoYXBpUmVzcG9uc2Uuc3VjY2Vzcyl7XG4gICAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGFwaVJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgIHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMudGFibGVQYWdpbmF0b3I7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJFcnJvcjogXCIgKyBKU09OLnN0cmluZ2lmeShhcGlSZXNwb25zZSkpO1xuICAgICAgICB9XG5cbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG5cbiAgZm9ybURlZmF1bHRzKCl7XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1Db25maWcpe1xuICAgICAgbGV0IGNvbmZpZyA9IG5ldyBGb3JtQ29uZmlnXG5cbiAgICAgIGNvbmZpZy5maWVsZHMgPSBbXVxuXG4gICAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcblxuICAgICAgICBsZXQgZmllbGQgPSB7bmFtZTogY29sdW1uLm5hbWUsIHR5cGU6IGNvbHVtbi50eXBlfVxuICAgICAgICBjb25maWcuZmllbGRzLnB1c2goZmllbGQpXG5cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNvbmZpZy5mb3JtQ29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgfVxuXG59XG4iLCJcbjxkaXYgY2xhc3M9XCJ0b3BcIj5cblxuICA8ZGl2ID5cbiAgICA8IS0tIDxidXR0b24gKm5nSWY9XCJjb25maWcubmV3VGV4dFwiIGlkPVwiYnRuTmV3XCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIm5ld01vZGVsKClcIj57e2NvbmZpZy5uZXdUZXh0fX08L2J1dHRvbj4gLS0+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImNyZWF0ZUJ1dHRvblwiIGlkPVwiYnRuTmV3XCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIm5ld01vZGVsKClcIj57e2NyZWF0ZUJ1dHRvbi5kaXNwbGF5fX08L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImNvbmZpZy5zaG93RmlsdGVyXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgIDxzcGEtZmlsdGVyIFtkYXRhXT1cInRhYmxlRGF0YVNvdXJjZVwiIChyZWZyZXNoQ2xpY2spPVwicmVmcmVzaENsaWNrZWQoKVwiPjwvc3BhLWZpbHRlcj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuXG48ZGl2PlxuXG4gIDxwICpuZ0lmPVwiIWNvbmZpZ1wiPjxlbT5Db25maWd1cmUgVGFibGU8L2VtPjwvcD5cbiAgPHAgKm5nSWY9XCIhZGF0YVNvdXJjZVwiPjxlbT5Mb2FkaW5nLi4uPC9lbT48L3A+XG5cblxuXG4gIDxkaXYgKm5nSWY9XCJkYXRhU291cmNlXCI+XG5cblxuICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwidGFibGVEYXRhU291cmNlXCIgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXo4XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29uZmlnLmNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+e3sgY29sdW1uLm5hbWUgfCBjYW1lbFRvV29yZHMgfX08L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O1wiID5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgPHNwYS1jaGVjayBbdmFsdWVdPVwicm93W2NvbHVtbi5uYW1lXVwiIFtyZWFkb25seV09XCJ0cnVlXCI+PC9zcGEtY2hlY2s+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICAgIHt7cm93W2NvbHVtbi5uYW1lXSB8IGRhdGUgOiAnZGQvTU0veXl5eSd9fVxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihjb2x1bW4ubmFtZSwgcm93KVwiIFttYXRUb29sdGlwXT1cImNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtb25leSdcIj5cbiAgICAgICAgICAgICAge3tyb3dbY29sdW1uLm5hbWVdIHwgY3VycmVuY3k6Jyc6Jyd9fVxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihjb2x1bW4ubmFtZSwgcm93KVwiIFttYXRUb29sdGlwXT1cImNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgPGxhYmVsPnt7cm93W2NvbHVtbi5uYW1lXX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24gJiYgdGVzdEljb25Db25kaXRpb24oY29sdW1uLm5hbWUsIHJvdylcIiBbbWF0VG9vbHRpcF09XCJjb2x1bW4uaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFjdGlvbiA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW25nU3R5bGVdPVwie3dpZHRoOnNtYWxsU2NyZWVuID8gJzUwcHgnIDogYWN0aW9uc1dpZHRofVwiPlxuXG5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cInByaW1hcnlcIiBbbWF0VG9vbHRpcF09XCJ2aWV3QnV0dG9uLnRpcCA/PyAndmlldycgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOnZpZXdCdXR0b24uY29sb3J9XCIgW2Rpc2FibGVkXT1cInRlc3REaXNhYmxlZChyb3csJ3ZpZXcnKVwiICpuZ0lmPVwidmlld0J1dHRvbiAmJiB0ZXN0VmlzaWJsZShyb3csJ3ZpZXcnKVwiIChjbGljayk9XCJ2aWV3TW9kZWwocm93KVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7Z2V0SWNvbigndmlldycpfX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XCJwcmltYXJ5XCIgW21hdFRvb2x0aXBdPVwiY3VzdG9tMUJ1dHRvbi50aXAgPz8gJ2N1c3RvbTEnIFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NXB4XCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzpjdXN0b20xQnV0dG9uLmNvbG9yfVwiIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQocm93LCdjdXN0b20xJylcIiAqbmdJZj1cIiFzbWFsbFNjcmVlbiAmJiBjdXN0b20xQnV0dG9uICYmIHRlc3RWaXNpYmxlKHJvdywnY3VzdG9tMScpXCIgKGNsaWNrKT1cImN1c3RvbTEocm93KVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7Z2V0SWNvbignY3VzdG9tMScpfX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XCJwcmltYXJ5XCIgW21hdFRvb2x0aXBdPVwiY3VzdG9tMkJ1dHRvbi50aXAgPz8gJ2N1c3RvbTInIFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NXB4XCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzpjdXN0b20yQnV0dG9uLmNvbG9yfVwiIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQocm93LCdjdXN0b20yJylcIiAqbmdJZj1cIiFzbWFsbFNjcmVlbiAmJiBjdXN0b20yQnV0dG9uICYmIHRlc3RWaXNpYmxlKHJvdywnY3VzdG9tMicpXCIgKGNsaWNrKT1cImN1c3RvbTIocm93KVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7Z2V0SWNvbignY3VzdG9tMicpfX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XCJwcmltYXJ5XCIgW21hdFRvb2x0aXBdPVwiY3VzdG9tM0J1dHRvbi50aXAgPz8gJ2N1c3RvbTMnIFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NXB4XCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzpjdXN0b20zQnV0dG9uLmNvbG9yfVwiIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQocm93LCdjdXN0b20zJylcIiAqbmdJZj1cIiFzbWFsbFNjcmVlbiAmJiBjdXN0b20zQnV0dG9uICYmIHRlc3RWaXNpYmxlKHJvdywnY3VzdG9tMycpXCIgKGNsaWNrKT1cImN1c3RvbTMocm93KVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7Z2V0SWNvbignY3VzdG9tMycpfX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cInByaW1hcnlcIiBbbWF0VG9vbHRpcF09XCJlZGl0QnV0dG9uLnRpcCA/PyAnZWRpdCcgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOmVkaXRCdXR0b24uY29sb3J9XCIgW2Rpc2FibGVkXT1cInRlc3REaXNhYmxlZChyb3csJ2VkaXQnKVwiICpuZ0lmPVwiIXNtYWxsU2NyZWVuICYmIGVkaXRCdXR0b24gJiYgdGVzdFZpc2libGUocm93LCdlZGl0JylcIiAoY2xpY2spPVwiZWRpdE1vZGVsKHJvdylcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj57e2dldEljb24oJ2VkaXQnKX19PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b24gbWF0LW1pbmktZmFiIGNvbG9yPVwid2FyblwiIFttYXRUb29sdGlwXT1cImRlbGV0ZUJ1dHRvbi50aXAgPz8gJ2RlbGV0ZScgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOmRlbGV0ZUJ1dHRvbi5jb2xvcn1cIiBbZGlzYWJsZWRdPVwidGVzdERpc2FibGVkKHJvdywnZGVsZXRlJylcIiAqbmdJZj1cIiFzbWFsbFNjcmVlbiAmJiBkZWxldGVCdXR0b24gJiYgdGVzdFZpc2libGUocm93LCdkZWxldGUnKVwiIChjbGljayk9XCJkZWxldGVNb2RlbChyb3cpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+e3tnZXRJY29uKCdkZWxldGUnKX19PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgPC90YWJsZT5cblxuICA8L2Rpdj5cblxuICA8bWF0LXBhZ2luYXRvciAjdGFibGVQYWdpbmF0b3IgW3BhZ2VTaXplT3B0aW9uc109XCJbMTAsIDIwLCA1MF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz48L21hdC1wYWdpbmF0b3I+XG5cbjwvZGl2PlxuXG48cCAqbmdJZj1cImRhdGFTb3VyY2U/Lmxlbmd0aCA9PSAwXCI+PGVtPk5vIERhdGE8L2VtPjwvcD5cblxuXG4iXX0=
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsT0FBTyxFQUEwQixVQUFVLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFJOUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBSTFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU8vQixNQUFNLE9BQU8sY0FBYztJQUV6QixZQUFvQixXQUEyQixFQUFVLGNBQThCLEVBQVUsa0JBQXNDLEVBQVMsTUFBaUI7UUFBN0ksZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFTLFdBQU0sR0FBTixNQUFNLENBQVc7UUE4Q2pLLGlCQUFZLEdBQUcsTUFBTSxDQUFDO1FBRXRCLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixlQUFVLEdBQXNCLElBQUksT0FBTyxFQUFFLENBQUM7UUFtQnJDLFNBQUksR0FBTyxFQUFFLENBQUM7UUFHYixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM5QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENB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QyxNQUFNLENBQUMsY0FBYyxFQUFFO29CQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUNwRDtxQkFBTTtvQkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDdEM7Z0JBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDNUQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7OzJHQWxlVSxjQUFjOytGQUFkLGNBQWMscVpDbEIzQiw4L1RBc0xBOzJGRHBLYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFdBQVc7MkxBdUVRLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUdsQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBEYXRlUGlwZSwgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFjdGlvbiwgQnV0dG9uLCBDb2x1bW4sIEZvcm1Db25maWcsIEljb24sIFRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9DbGFzc2VzJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21lc3NhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgZGV0YWlsc0RpYWxvZyB9IGZyb20gJy4vZGV0YWlsc0RpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnJlYWtwb2ludE9ic2VydmVyLCBCcmVha3BvaW50U3RhdGUgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcbmltcG9ydCB7IERhdGFTZXJ2aWNlTGliIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9UaW5Db3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3BhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZUxpYiwgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsIHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIsIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZylcbiAge1xuICAgIC8vIGRldGVjdCBzY3JlZW4gc2l6ZSBjaGFuZ2VzXG4gICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZShbIFwiKG1heC13aWR0aDogNjAwcHgpXCJdKS5zdWJzY3JpYmUoKHJlc3VsdDogQnJlYWtwb2ludFN0YXRlKSA9PiB7XG5cbiAgICAgIGlmIChyZXN1bHQubWF0Y2hlcykge1xuICAgICAgICB0aGlzLnNtYWxsU2NyZWVuID0gdHJ1ZVxuICAgICAgICB0aGlzLnNldENvbHVtbnMoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IGZhbHNlXG4gICAgICAgIHRoaXMuc2V0Q29sdW1ucygpXG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuXG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmNvbmZpZy5jb2x1bW5zO1xuXG4gICAgdGhpcy5zZXRDb2x1bW5zKClcblxuICAgIHRoaXMuY3JlYXRlQnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ2NyZWF0ZScpXG4gICAgLy8gdGhpcy52aWV3QnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ3ZpZXcnKVxuICAgIC8vIHRoaXMuZWRpdEJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdlZGl0JylcbiAgICAvLyB0aGlzLmRlbGV0ZUJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdkZWxldGUnKVxuICAgIC8vIHRoaXMuY3VzdG9tMUJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdjdXN0b20xJylcbiAgICAvLyB0aGlzLmN1c3RvbTJCdXR0b24gPSB0aGlzLmdldEJ1dHRvbignY3VzdG9tMicpXG4gICAgLy8gdGhpcy5jdXN0b20zQnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ2N1c3RvbTMnKVxuXG5cbiAgICBpZiAodGhpcy5jb25maWcubG9hZEFjdGlvbil7XG4gICAgICB0aGlzLmxvYWREYXRhKHRoaXMuY29uZmlnLmxvYWRBY3Rpb24sIFwiXCIpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybURlZmF1bHRzKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuc2VhcmNoQ29uZmlnKXtcbiAgICAgIHRoaXMuc2hvd0ZpbHRlckJ1dHRvbiA9IGZhbHNlO1xuICAgIH1cblxuXG4gIH1cblxuXG4gIGFjdGlvbnNXaWR0aCA9IFwiNTBweFwiO1xuXG4gIHNob3dGaWx0ZXJCdXR0b24gPSB0cnVlO1xuICB0aWxlUmVsb2FkIDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG5cblxuICBuZ09uQ2hhbmdlcygpIHtcblxuICAgIGlmICghdGhpcy5jb25maWcubG9hZEFjdGlvbil7XG4gICAgICBjb25zb2xlLmxvZyhcIlRhYmxlIGRhdGEgQ2hhbmdlZFwiKVxuICAgICAgdGhpcy5kYXRhU291cmNlID0gdGhpcy5kYXRhO1xuXG4gICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55Pih0aGlzLmRhdGFTb3VyY2UpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMudGFibGVQYWdpbmF0b3I7IH0sIDUpXG4gICAgfVxuXG4gIH1cblxuXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlUGFnaW5hdG9yJykgdGFibGVQYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcblxuXG4gIEBJbnB1dCgpIGRhdGE6IGFueSA9W107XG4gIEBJbnB1dCgpIGNvbmZpZzogVGFibGVDb25maWc7XG5cbiAgQE91dHB1dCgpIGRhdGFMb2FkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcmVmcmVzaENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VhcmNoQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFjdGlvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgaW5wdXRDaGFuZ2VkKGV2ZW50KSB7XG4gICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KHsgbmFtZTogZXZlbnQubmFtZSwgdmFsdWU6IGV2ZW50LnZhbHVlIH0pXG4gICAgY29uc29sZS5sb2coXCJDaGFuZ2VkIFwiICsgSlNPTi5zdHJpbmdpZnkoZXZlbnQpKVxuICB9XG5cbiAgc21hbGxTY3JlZW4gPSBmYWxzZVxuXG4gIGNyZWF0ZUJ1dHRvbjogQnV0dG9uO1xuXG5cbiAgLy9UYWJsZVxuICB0YWJsZURhdGFTb3VyY2U7XG4gIGRhdGFTb3VyY2U6IGFueVtdO1xuICBvcHRpb25zOiBDb2x1bW5bXSA9IFtdO1xuICBkaXNwbGF5ZWRDb2x1bW5zID0gW11cblxuXG4gIGZvcm1EZWZhdWx0cygpIHtcblxuICAgIGlmICghdGhpcy5jb25maWcuZm9ybUNvbmZpZykge1xuICAgICAgbGV0IGNvbmZpZyA9IG5ldyBGb3JtQ29uZmlnXG5cbiAgICAgIGNvbmZpZy5maWVsZHMgPSBbXVxuXG4gICAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcblxuICAgICAgICBsZXQgZmllbGQgPSB7IG5hbWU6IGNvbHVtbi5uYW1lLCB0eXBlOiBjb2x1bW4udHlwZSB9XG4gICAgICAgIGNvbmZpZy5maWVsZHMucHVzaChmaWVsZClcblxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY29uZmlnLmZvcm1Db25maWcgPSBjb25maWc7XG4gICAgfVxuICB9XG5cbiAgc2V0Q29sdW1ucygpIHtcblxuICAgIGlmICghdGhpcy5jb25maWc/LmNvbHVtbnMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLnNtYWxsU2NyZWVuKSB7XG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbmZpZy5taW5Db2x1bW5zXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29uZmlnLmNvbHVtbnMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSlcbiAgICB9XG5cbiAgICBsZXQgYnV0dG9uc0NvdW50ID0gdGhpcy5jb25maWcuYnV0dG9ucy5maWx0ZXIoeCA9PiB4Lm5hbWUgIT0gJ2NyZWF0ZScpLmxlbmd0aCA/PyAwXG4gICAgaWYgKGJ1dHRvbnNDb3VudCA+IDApIHtcblxuICAgICAgaWYgKCF0aGlzLmRpc3BsYXllZENvbHVtbnMuZmluZCh4ID0+IHggPT0gJ2FjdGlvbicpICYmIHRoaXMuY29uZmlnLmJ1dHRvbnMpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goXCJhY3Rpb25cIilcbiAgICAgIH1cblxuICAgICAgdGhpcy5hY3Rpb25zV2lkdGggPSBgJHtidXR0b25zQ291bnQgKiA0MCArIDIwfXB4YFxuXG4gICAgfVxuXG4gIH1cblxuXG4gIGdldEJ1dHRvbihuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmJ1dHRvbnMpIHJldHVybiBudWxsXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmJ1dHRvbnMuZmluZCh4ID0+IHgubmFtZSA9PSBuYW1lKVxuICB9XG5cbiAgZ2V0SWNvbihidXR0b25OYW1lOiBzdHJpbmcpe1xuXG4gICAgbGV0IGIgPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKTtcbiAgICBpZiAoYi5pY29uKXtcbiAgICAgIHJldHVybiBiLmljb24ubmFtZVxuICAgIH1cblxuICAgIGxldCBpID0gJ3BhZ2V2aWV3J1xuXG4gICAgc3dpdGNoIChidXR0b25OYW1lKSB7XG5cbiAgICAgIGNhc2UgJ3ZpZXcnOlxuICAgICAgICBpID0gJ3BhZ2V2aWV3J1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VkaXQnOlxuICAgICAgICBpID0gJ2VkaXQnXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgaSA9ICdkZWxldGUnXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIGdldEJ1dHRvbkNvbG9yKGJ1dHRvbjogQnV0dG9uLCByb3cpIHtcblxuICAgIGlmIChidXR0b24uZGlzYWJsZWQpe1xuICAgICAgaWYgKGJ1dHRvbi5kaXNhYmxlZChyb3cpKXtcbiAgICAgICAgcmV0dXJuICdsaWdodGdyYXknXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJ1dHRvbi5jb2xvcil7XG4gICAgICByZXR1cm4gYnV0dG9uLmNvbG9yO1xuICAgIH1cblxuICAgIGlmIChidXR0b24ubmFtZSA9PSAnZGVsZXRlJyl7XG4gICAgICByZXR1cm4gJyNGNDQzMzYnXG4gICAgfVxuXG4gICAgcmV0dXJuJyAjNDA1MEI1J1xuICB9XG5cblxuICBnZXRPcHRpb25zKGNvbHVtbil7XG4gICAgbGV0IHggPSB0aGlzLm9wdGlvbnMuZmluZChvcHQgPT4gb3B0Lm5hbWUgPT09IGNvbHVtbik7XG4gICAgcmV0dXJuICB4XG4gIH1cblxuICBnZXRDb2xvcih2LCBvcHRpb25zKSB7XG5cbiAgICBsZXQgZGVmYXVsdENvbG9yID0gJ2xpZ2h0Z3JleSdcblxuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIGRlZmF1bHRDb2xvclxuXG4gICAgbGV0IGMgPSBvcHRpb25zLmZpbmQoeCA9PiB4LnZhbHVlID09IHYpXG5cbiAgICBpZiAoYykge1xuICAgICAgcmV0dXJuIGMuY29sb3JcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRlZmF1bHRDb2xvclxuICAgIH1cblxuXG4gIH1cblxuXG4gIHRlc3RJY29uQ29uZGl0aW9uKHZhbHVlOiBhbnksIGljb24gOiBJY29uKTogYm9vbGVhbiB7XG5cbiAgICAvLyBjb25zdCBvcHRpb24gPSB0aGlzLmdldE9wdGlvbnMoY29sdW1uKTtcblxuICAgIGlmIChpY29uLmNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIGljb24uY29uZGl0aW9uKHZhbHVlKTtcblxuICAgIH1lbHNle1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGVzdERpc2FibGVkKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbntcblxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKVxuXG4gICAgaWYgKGJ1dHRvbi5kaXNhYmxlZCl7XG5cbiAgICAgIHJldHVybiBidXR0b24uZGlzYWJsZWQocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0ZXN0VmlzaWJsZShyb3csIGJ1dHRvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpXG5cbiAgICBpZiAoYnV0dG9uLnZpc2libGUpIHtcblxuICAgICAgcmV0dXJuIGJ1dHRvbi52aXNpYmxlKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuXG4gIC8vQWN0aW9uc1xuXG4gIGxvYWREYXRhKGFjdGlvbjogQWN0aW9uLCBkYXRhOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZyhcImxvYWRpbmdcIilcblxuICAgIGlmIChhY3Rpb24pIHtcblxuICAgICAgdGhpcy5kYXRhU2VydmljZS5DYWxsQXBpKGFjdGlvbiwgZGF0YSkuc3Vic2NyaWJlKChhcGlSZXNwb25zZTogQXBpUmVzcG9uc2UpID0+IHtcblxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBhcGlSZXNwb25zZS5kYXRhXG5cbiAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oYXBpUmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMudGFibGVQYWdpbmF0b3I7XG5cbiAgICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoYXBpUmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy50YWJsZVBhZ2luYXRvcjtcblxuICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZChhcGlSZXNwb25zZS5kYXRhKTtcblxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIkVycm9yOiBcIiArIGFwaVJlc3BvbnNlLm1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG5cblxuICAvL0V2ZW50c1xuICBzZWFyY2hDbGlja2VkKHgpe1xuICAgIGNvbnNvbGUubG9nKFwiU2VhcmNoXCIpXG4gICAgdGhpcy5yZWZyZXNoQ2xpY2suZW1pdCh4KTtcblxuICAgIGNvbnNvbGUubG9nKHgpXG5cbiAgICBpZiAodGhpcy5jb25maWcuc2VhcmNoQ29uZmlnLnNlYXJjaEFjdGlvbil7XG4gICAgICB0aGlzLmNvbmZpZy5zZWFyY2hDb25maWcuc2VhcmNoQWN0aW9uLm1ldGhvZCA9PSAncG9zdCdcbiAgICAgIHRoaXMubG9hZERhdGEodGhpcy5jb25maWcuc2VhcmNoQ29uZmlnLnNlYXJjaEFjdGlvbiwgeCk7XG4gICAgfVxuICB9XG5cbiAgcmVmcmVzaENsaWNrZWQoKSB7XG4gICAgY29uc29sZS5sb2coXCJSZWZyZXNoXCIpXG4gICAgdGhpcy5yZWZyZXNoQ2xpY2suZW1pdCgpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvYWRBY3Rpb24pIHtcbiAgICAgIHRoaXMubG9hZERhdGEodGhpcy5jb25maWcubG9hZEFjdGlvbixcIlwiKTtcbiAgICB9XG4gIH1cblxuICBkYXRhTG9hZGVkKHgpIHtcblxuICAgIHRoaXMuZGF0YUxvYWQuZW1pdCh4KVxuXG4gICAgY29uc29sZS5sb2coXCJkYXRhbG9hZGVkXCIpXG5cbiAgICBpZiAodGhpcy5jb25maWcudGlsZUNvbmZpZz8ubG9hZEFjdGlvbikge1xuICAgICAgdGhpcy50aWxlUmVsb2FkLm5leHQodHJ1ZSk7O1xuICAgIH1cbiAgfVxuXG5cblxuICBhY3Rpb25DbGlja2VkKG5hbWUsIHJvdykge1xuXG4gICAgaWYgKG5hbWUgPT0gJ3ZpZXcnKSB7XG4gICAgICB0aGlzLnZpZXdNb2RlbChyb3cpXG4gICAgfVxuICAgIGVsc2UgaWYgKG5hbWUgPT0gJ2VkaXQnKSB7XG4gICAgICB0aGlzLmVkaXRNb2RlbChyb3cpO1xuICAgIH1cbiAgICBlbHNlIGlmIChuYW1lID09ICdkZWxldGUnKSB7XG4gICAgICB0aGlzLmRlbGV0ZU1vZGVsKHJvdyk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KG5hbWUsIHJvdylcbiAgICB9XG5cblxuXG4gICAgdGhpcy5kb0FjdGlvbihuYW1lLCByb3cpO1xuXG5cbiAgfVxuXG5cbiAgYWN0aW9uQ2xpY2tlZEVtaXQobmFtZSwgcm93KSB7XG4gICAgY29uc29sZS5sb2coXCJBY3Rpb24gY2xpY2tlZFwiKVxuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdCh7bmFtZTpuYW1lLGRhdGEgOiByb3d9KTtcbiAgfVxuXG5cbiAgdmlld01vZGVsKHJvdykge1xuXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCd2aWV3Jyk7XG4gICAgaWYgKGJ1dHRvbiAmJiAhYnV0dG9uLmRpYWxvZykge1xuICAgICAgLy8gdGhpcy5hY3Rpb25DbGlja2VkKCd2aWV3Jyxyb3cpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuZm9ybUNvbmZpZykge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlBsZWFzZSBjb25maWd1cmUgZm9ybVwiKVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oZGV0YWlsc0RpYWxvZywge1xuICAgICAgd2lkdGg6IFwiOTAwcHhcIixcbiAgICAgIGRhdGE6IHsgbW9kZTogXCJ2aWV3XCIsIGNvbmZpZzogdGhpcy5jb25maWcsIGRldGFpbHM6IHJvdywgc21hbGxTY3JlZW46IHRoaXMuc21hbGxTY3JlZW4gfSxcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG5cblxuICB9XG5cbiAgbmV3TW9kZWwoKSB7XG5cbiAgICBsZXQgYnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ2NyZWF0ZScpO1xuICAgIGlmIChidXR0b24gJiYgIWJ1dHRvbi5kaWFsb2cpIHtcbiAgICAgIC8vIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQoJ2NyZWF0ZScsJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuZm9ybUNvbmZpZykge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlBsZWFzZSBjb25maWd1cmUgZm9ybVwiKVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oZGV0YWlsc0RpYWxvZywge1xuICAgICAgd2lkdGg6IFwiOTAwcHhcIixcbiAgICAgIGRhdGE6IHsgbW9kZTogXCJjcmVhdGVcIiwgY29uZmlnOiB0aGlzLmNvbmZpZywgc21hbGxTY3JlZW46IHRoaXMuc21hbGxTY3JlZW4gfVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQubWVzc2FnZSA9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KCdjcmVhdGUnLHJlc3VsdC5kYXRhKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQubWVzc2FnZSA9PSBcImVtaXRcIikge1xuICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KCdjcmVhdGUnLHJlc3VsdC5kYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGVkaXRNb2RlbChyb3cpIHtcblxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbignZWRpdCcpO1xuICAgIGlmIChidXR0b24gJiYgIWJ1dHRvbi5kaWFsb2cpIHtcbiAgICAgIC8vIHRoaXMuYWN0aW9uQ2xpY2tlZCgnZWRpdCcscm93KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1Db25maWcpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJQbGVhc2UgY29uZmlndXJlIGZvcm1cIilcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKGRldGFpbHNEaWFsb2csIHtcbiAgICAgIHdpZHRoOiBcIjkwMHB4XCIsXG4gICAgICBkYXRhOiB7IG1vZGU6IFwiZWRpdFwiLCBjb25maWc6IHRoaXMuY29uZmlnLCBkZXRhaWxzOiByb3csIHNtYWxsU2NyZWVuOiB0aGlzLnNtYWxsU2NyZWVuIH0sXG4gICAgfSk7XG5cblxuICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5pbnB1dENoYW5nZS5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHRoaXMuaW5wdXRDaGFuZ2VkKHgpXG4gICAgfSk7XG5cblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnZWRpdCcscmVzdWx0LmRhdGEpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwiZW1pdFwiKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQoJ2VkaXQnLHJlc3VsdC5kYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZU1vZGVsKHJvdykge1xuXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdkZWxldGUnKTtcbiAgICBpZiAoYnV0dG9uICYmICFidXR0b24uZGlhbG9nKSB7XG4gICAgICAvLyB0aGlzLmFjdGlvbkNsaWNrZWQoJ2RlbGV0ZScsIHJvdyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5jb25maXJtKGBERUxFVEUgP2ApLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09IFwieWVzXCIpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnZGVsZXRlJywgcm93KVxuICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGRvQWN0aW9uKGJ1dHRvbk5hbWUsIHJvdykge1xuXG5cbiAgICBsZXQgYiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpXG5cbiAgICBpZiAoIWIpIHJldHVybjtcblxuICAgIGlmIChiLmFjdGlvbiAmJiBidXR0b25OYW1lICE9ICdkZWxldGUnKSByZXR1cm47XG5cbiAgICBpZiAoIWIuYWN0aW9uKSByZXR1cm47XG5cblxuICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaShiLmFjdGlvbiwgcm93KS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlKSA9PiB7XG5cbiAgICAgIGlmIChhcGlSZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgIGlmIChiLmFjdGlvbi5zdWNjZXNzTWVzc2FnZSkge1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoYi5hY3Rpb24uc3VjY2Vzc01lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJVcGRhdGVkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIkVycm9yOiBcIiArIGFwaVJlc3BvbnNlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuXG59XG4iLCJcbjxzcGEtc2VhcmNoICpuZ0lmPVwiY29uZmlnLnNlYXJjaENvbmZpZ1wiIFtjb25maWddPVwiY29uZmlnLnNlYXJjaENvbmZpZ1wiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDtcIiAoc2VhcmNoQ2xpY2spPVwic2VhcmNoQ2xpY2tlZCgkZXZlbnQpXCI+PC9zcGEtc2VhcmNoPlxuXG48ZGl2IGNsYXNzPVwidG9wXCI+XG5cbiAgPGRpdiBjbGFzcz1cInRpbi1yb3dcIiA+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImNyZWF0ZUJ1dHRvblwiIGlkPVwiYnRuTmV3XCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgKGNsaWNrKT1cIm5ld01vZGVsKClcIj57e2NyZWF0ZUJ1dHRvbi5kaXNwbGF5fX08L2J1dHRvbj5cbiAgICA8c3BhLXRpbGVzICpuZ0lmPVwiY29uZmlnLnRpbGVDb25maWdcIiBbcmVsb2FkXT1cInRpbGVSZWxvYWRcIiBbY29uZmlnXT1cImNvbmZpZy50aWxlQ29uZmlnXCI+PC9zcGEtdGlsZXM+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJjb25maWcuc2hvd0ZpbHRlclwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICA8c3BhLWZpbHRlciBbc2hvd0J1dHRvbl09XCJzaG93RmlsdGVyQnV0dG9uXCIgW2RhdGFdPVwidGFibGVEYXRhU291cmNlXCIgKHJlZnJlc2hDbGljayk9XCJyZWZyZXNoQ2xpY2tlZCgpXCI+PC9zcGEtZmlsdGVyPlxuICA8L2Rpdj5cblxuPC9kaXY+XG5cblxuPGRpdiAqbmdJZj1cImNvbmZpZy50aXRsZVwiIGNsYXNzPVwidGl0bGVcIj5cbiAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOiBsYXJnZXI7XCI+e3tjb25maWcudGl0bGUgfCBjYW1lbFRvV29yZHN9fTwvbGFiZWw+XG48L2Rpdj5cblxuPGRpdj5cblxuICA8cCAqbmdJZj1cIiFjb25maWdcIj48ZW0+Q29uZmlndXJlIFRhYmxlPC9lbT48L3A+XG4gIDxwICpuZ0lmPVwiIWRhdGFTb3VyY2VcIj48ZW0+TG9hZGluZy4uLjwvZW0+PC9wPlxuXG5cblxuICA8ZGl2ICpuZ0lmPVwiZGF0YVNvdXJjZVwiPlxuXG5cbiAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInRhYmxlRGF0YVNvdXJjZVwiIGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbmZpZy5jb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPnt7IGNvbHVtbi5hbGlhcyA/PyBjb2x1bW4ubmFtZSB8IGNhbWVsVG9Xb3JkcyB9fTwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7XCIgPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cblxuXG5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICA8c3BhLWNoZWNrIFt2YWx1ZV09XCJyb3dbY29sdW1uLm5hbWVdXCIgW3JlYWRvbmx5XT1cInRydWVcIj48L3NwYS1jaGVjaz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hpcCdcIj5cbiAgICAgICAgICAgICAgPG1hdC1jaGlwLWxpc3Q+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGlwIChjbGljayk9XCJ2aWV3TW9kZWwocm93KVwiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6Z2V0Q29sb3Iocm93W2NvbHVtbi5uYW1lXSwgY29sdW1uPy5vcHRpb25zKX1cIiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIj4ge3tyb3dbY29sdW1uLm5hbWVdfX0gPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cImNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwidGVzdEljb25Db25kaXRpb24ocm93LCBpY29uKVwiIFttYXRUb29sdGlwXT1cImljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaWNvbidcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cImNvbHVtbi5pY29uICYmIHRlc3RJY29uQ29uZGl0aW9uKHJvdywgY29sdW1uLmljb24pXCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgW25nU3R5bGVdPVwieydjb2xvcic6Y29sdW1uLmljb24/LmNvbG9yfVwiPnt7Y29sdW1uLmljb24ubmFtZSB9fTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjb2x1bW4uaWNvbnNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwidGVzdEljb25Db25kaXRpb24ocm93LCBpY29uKVwiIFttYXRUb29sdGlwXT1cImljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cbiAgICAgICAgICAgICAge3tyb3dbY29sdW1uLm5hbWVdIHwgZGF0ZSA6ICdkZC9NTS95eXl5J319XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cImNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJpY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiPlxuICAgICAgICAgICAgICB7e3Jvd1tjb2x1bW4ubmFtZV0gfCBkYXRlIDogJ2RkL01NL3l5eXkgSEg6bW0nfX1cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cImNvbHVtbi5pY29uICYmIHRlc3RJY29uQ29uZGl0aW9uKHJvdywgY29sdW1uLmljb24pXCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgW25nU3R5bGVdPVwieydjb2xvcic6Y29sdW1uLmljb24/LmNvbG9yfVwiPnt7Y29sdW1uLmljb24ubmFtZSB9fTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjb2x1bW4uaWNvbnNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwidGVzdEljb25Db25kaXRpb24ocm93LCBpY29uKVwiIFttYXRUb29sdGlwXT1cImljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzcGlubmVyJ1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiMjBcIj5cblxuICAgICAgICAgICAgICAgIDwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtb25leSdcIj5cbiAgICAgICAgICAgICAge3tyb3dbY29sdW1uLm5hbWVdIHwgY3VycmVuY3k6Jyc6Jyd9fVxuXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cImNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJpY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICA8bGFiZWw+e3tyb3dbY29sdW1uLm5hbWVdfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwiY29sdW1uLmljb24gJiYgdGVzdEljb25Db25kaXRpb24ocm93LCBjb2x1bW4uaWNvbilcIiBbbWF0VG9vbHRpcF09XCJjb2x1bW4uaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwiaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzppY29uPy5jb2xvcn1cIj57e2ljb24ubmFtZSB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvblwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpb24gPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtuZ1N0eWxlXT1cInt3aWR0aDpzbWFsbFNjcmVlbiA/ICc1MHB4JyA6IGFjdGlvbnNXaWR0aH1cIj5cblxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGNvbmZpZy5idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJidXR0b24ubmFtZSAhPSAnY3JlYXRlJyAmJiB0ZXN0VmlzaWJsZShyb3csYnV0dG9uLm5hbWUpXCI+XG5cbiAgICAgICAgICAgICAgPCEtLSBbY29sb3JdPVwiYnV0dG9uLm5hbWUgPT0nZGVsZXRlJyA/ICd3YXJuJyA6ICdwcmltYXJ5J1wiIC0tPlxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuIHx8IGJ1dHRvbi5uYW1lID09ICd2aWV3J1wiIG1hdC1taW5pLWZhYiAgW21hdFRvb2x0aXBdPVwiYnV0dG9uLnRpcCA/PyBidXR0b24ubmFtZSBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjVweFwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6Z2V0QnV0dG9uQ29sb3IoYnV0dG9uLCByb3cpfVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQocm93LGJ1dHRvbi5uYW1lKVwiICAoY2xpY2spPVwiYWN0aW9uQ2xpY2tlZChidXR0b24ubmFtZSwgcm93KVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj57e2dldEljb24oYnV0dG9uLm5hbWUpfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJidXR0b24ubmFtZSAhPSAnY3JlYXRlJyAmJiAhdGVzdFZpc2libGUocm93LGJ1dHRvbi5uYW1lKVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDM1cHg7XCI+PC9sYWJlbD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuXG4gICAgICAgICAgPCEtLSA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cInByaW1hcnlcIiBbbWF0VG9vbHRpcF09XCJ2aWV3QnV0dG9uLnRpcCA/PyAndmlldycgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHg7IG1hcmdpbi1sZWZ0OiAyMHB4O1wiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6dmlld0J1dHRvbi5jb2xvcn1cIiBbZGlzYWJsZWRdPVwidGVzdERpc2FibGVkKHJvdywndmlldycpXCIgKm5nSWY9XCJ2aWV3QnV0dG9uICYmIHRlc3RWaXNpYmxlKHJvdywndmlldycpXCIgKGNsaWNrKT1cInZpZXdNb2RlbChyb3cpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+e3tnZXRJY29uKCd2aWV3Jyl9fTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cInByaW1hcnlcIiBbbWF0VG9vbHRpcF09XCJjdXN0b20xQnV0dG9uLnRpcCA/PyAnY3VzdG9tMScgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOmN1c3RvbTFCdXR0b24uY29sb3J9XCIgW2Rpc2FibGVkXT1cInRlc3REaXNhYmxlZChyb3csJ2N1c3RvbTEnKVwiICpuZ0lmPVwiIXNtYWxsU2NyZWVuICYmIGN1c3RvbTFCdXR0b24gJiYgdGVzdFZpc2libGUocm93LCdjdXN0b20xJylcIiAoY2xpY2spPVwiY3VzdG9tMShyb3cpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+e3tnZXRJY29uKCdjdXN0b20xJyl9fTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cInByaW1hcnlcIiBbbWF0VG9vbHRpcF09XCJjdXN0b20yQnV0dG9uLnRpcCA/PyAnY3VzdG9tMicgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOmN1c3RvbTJCdXR0b24uY29sb3J9XCIgW2Rpc2FibGVkXT1cInRlc3REaXNhYmxlZChyb3csJ2N1c3RvbTInKVwiICpuZ0lmPVwiIXNtYWxsU2NyZWVuICYmIGN1c3RvbTJCdXR0b24gJiYgdGVzdFZpc2libGUocm93LCdjdXN0b20yJylcIiAoY2xpY2spPVwiY3VzdG9tMihyb3cpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+e3tnZXRJY29uKCdjdXN0b20yJyl9fTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cInByaW1hcnlcIiBbbWF0VG9vbHRpcF09XCJjdXN0b20zQnV0dG9uLnRpcCA/PyAnY3VzdG9tMycgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOmN1c3RvbTNCdXR0b24uY29sb3J9XCIgW2Rpc2FibGVkXT1cInRlc3REaXNhYmxlZChyb3csJ2N1c3RvbTMnKVwiICpuZ0lmPVwiIXNtYWxsU2NyZWVuICYmIGN1c3RvbTNCdXR0b24gJiYgdGVzdFZpc2libGUocm93LCdjdXN0b20zJylcIiAoY2xpY2spPVwiY3VzdG9tMyhyb3cpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+e3tnZXRJY29uKCdjdXN0b20zJyl9fTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cblxuICAgICAgICAgIDxidXR0b24gbWF0LW1pbmktZmFiIGNvbG9yPVwicHJpbWFyeVwiIFttYXRUb29sdGlwXT1cImVkaXRCdXR0b24udGlwID8/ICdlZGl0JyBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjVweFwiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6ZWRpdEJ1dHRvbi5jb2xvcn1cIiBbZGlzYWJsZWRdPVwidGVzdERpc2FibGVkKHJvdywnZWRpdCcpXCIgKm5nSWY9XCIhc21hbGxTY3JlZW4gJiYgZWRpdEJ1dHRvbiAmJiB0ZXN0VmlzaWJsZShyb3csJ2VkaXQnKVwiIChjbGljayk9XCJlZGl0TW9kZWwocm93KVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7Z2V0SWNvbignZWRpdCcpfX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XCJ3YXJuXCIgW21hdFRvb2x0aXBdPVwiZGVsZXRlQnV0dG9uLnRpcCA/PyAnZGVsZXRlJyBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjVweFwiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6ZGVsZXRlQnV0dG9uLmNvbG9yfVwiIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQocm93LCdkZWxldGUnKVwiICpuZ0lmPVwiIXNtYWxsU2NyZWVuICYmIGRlbGV0ZUJ1dHRvbiAmJiB0ZXN0VmlzaWJsZShyb3csJ2RlbGV0ZScpXCIgKGNsaWNrKT1cImRlbGV0ZU1vZGVsKHJvdylcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj57e2dldEljb24oJ2RlbGV0ZScpfX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPiAtLT5cblxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgPC90YWJsZT5cblxuICA8L2Rpdj5cblxuICA8bWF0LXBhZ2luYXRvciAjdGFibGVQYWdpbmF0b3IgW3BhZ2VTaXplT3B0aW9uc109XCJbMTAsIDIwLCA1MF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz48L21hdC1wYWdpbmF0b3I+XG5cbjwvZGl2PlxuXG48cCAqbmdJZj1cImRhdGFTb3VyY2U/Lmxlbmd0aCA9PSAwXCI+PGVtPk5vIERhdGE8L2VtPjwvcD5cblxuXG4iXX0=