tin-spa 2.2.2 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/esm2020/lib/components/accounts/accountDialog.component.mjs +2 -2
  2. package/esm2020/lib/components/accounts/accounts.component.mjs +2 -2
  3. package/esm2020/lib/components/attach/attach.component.mjs +1 -20
  4. package/esm2020/lib/components/change-password/change-password.component.mjs +2 -2
  5. package/esm2020/lib/components/create-account/create-account.component.mjs +2 -2
  6. package/esm2020/lib/components/customers/customers.component.mjs +2 -2
  7. package/esm2020/lib/components/departments/departments.component.mjs +6 -26
  8. package/esm2020/lib/components/employees/employees.component.mjs +10 -53
  9. package/esm2020/lib/components/form/form.component.mjs +2 -2
  10. package/esm2020/lib/components/inventory/inventory.component.mjs +2 -2
  11. package/esm2020/lib/components/inventory/quantityDialog.component.mjs +2 -2
  12. package/esm2020/lib/components/invitations-table/invitations-table.component.mjs +2 -2
  13. package/esm2020/lib/components/list-dialog/list-dialog.component.mjs +2 -2
  14. package/esm2020/lib/components/login/login.component.mjs +2 -2
  15. package/esm2020/lib/components/logs/logs.component.mjs +2 -2
  16. package/esm2020/lib/components/membership/membership.component.mjs +2 -2
  17. package/esm2020/lib/components/nav-menu/nav-menu.component.mjs +2 -2
  18. package/esm2020/lib/components/plans/plans.component.mjs +2 -2
  19. package/esm2020/lib/components/positions/positions.component.mjs +13 -6
  20. package/esm2020/lib/components/profile/profile.component.mjs +2 -2
  21. package/esm2020/lib/components/recover-account/recover-account.component.mjs +2 -2
  22. package/esm2020/lib/components/roles/addRoleDialog.component.mjs +2 -2
  23. package/esm2020/lib/components/roles/roles.component.mjs +2 -2
  24. package/esm2020/lib/components/settings/settings.component.mjs +2 -2
  25. package/esm2020/lib/components/signup/signup.component.mjs +2 -2
  26. package/esm2020/lib/components/suppliers/suppliers.component.mjs +2 -2
  27. package/esm2020/lib/components/table/detailsDialog.component.mjs +74 -142
  28. package/esm2020/lib/components/table/table.component.mjs +151 -333
  29. package/esm2020/lib/components/table-action/table-action.component.mjs +46 -0
  30. package/esm2020/lib/components/table-header/table-header.component.mjs +52 -0
  31. package/esm2020/lib/components/table-internal/detailsDialog-internal.component.mjs +78 -139
  32. package/esm2020/lib/components/table-internal/table-internal.component.mjs +153 -334
  33. package/esm2020/lib/components/table-row/table-row.component.mjs +58 -0
  34. package/esm2020/lib/components/tasks/tasks.component.mjs +2 -2
  35. package/esm2020/lib/components/tenant-settings/inviteDialog.component.mjs +2 -2
  36. package/esm2020/lib/components/tenant-settings/tenant-settings.component.mjs +2 -2
  37. package/esm2020/lib/components/tenants/tenants.component.mjs +2 -2
  38. package/esm2020/lib/components/tiles/tiles.component.mjs +2 -2
  39. package/esm2020/lib/components/transactions/transactDialog.component.mjs +2 -2
  40. package/esm2020/lib/components/transactions/transactions.component.mjs +2 -2
  41. package/esm2020/lib/components/users/users.component.mjs +2 -2
  42. package/esm2020/lib/components/viewer/viewer.component.mjs +2 -2
  43. package/esm2020/lib/components/welcome/welcome.component.mjs +2 -2
  44. package/esm2020/lib/services/button.service.mjs +100 -0
  45. package/esm2020/lib/services/condition.service.mjs +32 -0
  46. package/esm2020/lib/services/datalib.service.mjs +381 -0
  47. package/esm2020/lib/services/dialog.service.mjs +38 -0
  48. package/esm2020/lib/services/table-config.service.mjs +26 -0
  49. package/esm2020/lib/tin-spa.module.mjs +6 -3
  50. package/esm2020/public-api.mjs +3 -2
  51. package/fesm2015/tin-spa.mjs +938 -1061
  52. package/fesm2015/tin-spa.mjs.map +1 -1
  53. package/fesm2020/tin-spa.mjs +947 -1058
  54. package/fesm2020/tin-spa.mjs.map +1 -1
  55. package/lib/components/accounts/accountDialog.component.d.ts +1 -1
  56. package/lib/components/accounts/accounts.component.d.ts +1 -1
  57. package/lib/components/attach/attach.component.d.ts +0 -19
  58. package/lib/components/change-password/change-password.component.d.ts +1 -1
  59. package/lib/components/create-account/create-account.component.d.ts +1 -1
  60. package/lib/components/customers/customers.component.d.ts +1 -1
  61. package/lib/components/departments/departments.component.d.ts +2 -5
  62. package/lib/components/employees/employees.component.d.ts +3 -14
  63. package/lib/components/form/form.component.d.ts +1 -1
  64. package/lib/components/inventory/inventory.component.d.ts +1 -1
  65. package/lib/components/inventory/quantityDialog.component.d.ts +1 -1
  66. package/lib/components/invitations-table/invitations-table.component.d.ts +1 -1
  67. package/lib/components/list-dialog/list-dialog.component.d.ts +1 -1
  68. package/lib/components/login/login.component.d.ts +1 -1
  69. package/lib/components/logs/logs.component.d.ts +1 -1
  70. package/lib/components/membership/membership.component.d.ts +1 -1
  71. package/lib/components/nav-menu/nav-menu.component.d.ts +1 -1
  72. package/lib/components/plans/plans.component.d.ts +1 -1
  73. package/lib/components/positions/positions.component.d.ts +5 -1
  74. package/lib/components/profile/profile.component.d.ts +1 -1
  75. package/lib/components/recover-account/recover-account.component.d.ts +1 -1
  76. package/lib/components/roles/addRoleDialog.component.d.ts +1 -1
  77. package/lib/components/roles/roles.component.d.ts +1 -1
  78. package/lib/components/settings/settings.component.d.ts +1 -1
  79. package/lib/components/signup/signup.component.d.ts +1 -1
  80. package/lib/components/suppliers/suppliers.component.d.ts +1 -1
  81. package/lib/components/table/detailsDialog.component.d.ts +11 -4
  82. package/lib/components/table/table.component.d.ts +28 -15
  83. package/lib/components/table-action/table-action.component.d.ts +22 -0
  84. package/lib/components/table-header/table-header.component.d.ts +22 -0
  85. package/lib/components/table-internal/detailsDialog-internal.component.d.ts +16 -6
  86. package/lib/components/table-internal/table-internal.component.d.ts +28 -15
  87. package/lib/components/table-row/table-row.component.d.ts +28 -0
  88. package/lib/components/tasks/tasks.component.d.ts +1 -1
  89. package/lib/components/tenant-settings/inviteDialog.component.d.ts +1 -1
  90. package/lib/components/tenant-settings/tenant-settings.component.d.ts +1 -1
  91. package/lib/components/tenants/tenants.component.d.ts +1 -1
  92. package/lib/components/tiles/tiles.component.d.ts +1 -1
  93. package/lib/components/transactions/transactDialog.component.d.ts +1 -1
  94. package/lib/components/transactions/transactions.component.d.ts +1 -1
  95. package/lib/components/users/users.component.d.ts +1 -1
  96. package/lib/components/viewer/viewer.component.d.ts +1 -1
  97. package/lib/components/welcome/welcome.component.d.ts +1 -1
  98. package/lib/services/button.service.d.ts +27 -0
  99. package/lib/services/condition.service.d.ts +10 -0
  100. package/lib/services/{data.service.d.ts → datalib.service.d.ts} +15 -1
  101. package/lib/services/dialog.service.d.ts +18 -0
  102. package/lib/services/table-config.service.d.ts +8 -0
  103. package/lib/tin-spa.module.d.ts +8 -5
  104. package/package.json +1 -1
  105. package/public-api.d.ts +2 -1
  106. package/esm2020/lib/services/data.service.mjs +0 -236
@@ -5,33 +5,39 @@ import { DetailsDialog } from './detailsDialog.component';
5
5
  import { DetailsDialogProcessor } from '../../classes/TinCore';
6
6
  import { Subject } from 'rxjs';
7
7
  import * as i0 from "@angular/core";
8
- import * as i1 from "../../services/data.service";
8
+ import * as i1 from "../../services/datalib.service";
9
9
  import * as i2 from "../../services/message.service";
10
10
  import * as i3 from "@angular/cdk/layout";
11
11
  import * as i4 from "@angular/material/dialog";
12
- import * as i5 from "@angular/common";
13
- import * as i6 from "@angular/material/table";
14
- import * as i7 from "@angular/material/paginator";
15
- import * as i8 from "@angular/material/button";
16
- import * as i9 from "@angular/material/icon";
17
- import * as i10 from "@angular/material/chips";
18
- import * as i11 from "@angular/material/tooltip";
19
- import * as i12 from "../check/check.component";
20
- import * as i13 from "../select/select.component";
21
- import * as i14 from "../filter/filter.component";
22
- import * as i15 from "../tiles/tiles.component";
23
- import * as i16 from "../search/search.component";
24
- import * as i17 from "../../pipes/camelToWords.pipe";
12
+ import * as i5 from "../../services/button.service";
13
+ import * as i6 from "../../services/dialog.service";
14
+ import * as i7 from "../../services/table-config.service";
15
+ import * as i8 from "../../services/condition.service";
16
+ import * as i9 from "@angular/common";
17
+ import * as i10 from "@angular/material/table";
18
+ import * as i11 from "@angular/material/paginator";
19
+ import * as i12 from "../search/search.component";
20
+ import * as i13 from "../table-header/table-header.component";
21
+ import * as i14 from "../table-row/table-row.component";
22
+ import * as i15 from "../table-action/table-action.component";
23
+ import * as i16 from "../../pipes/camelToWords.pipe";
25
24
  export class TableComponent {
26
- constructor(dataService, messageService, breakpointObserver, dialog) {
25
+ constructor(dataService, messageService, breakpointObserver, dialog, buttonService, dialogService, tableConfigService, conditionService) {
27
26
  this.dataService = dataService;
28
27
  this.messageService = messageService;
29
28
  this.breakpointObserver = breakpointObserver;
30
29
  this.dialog = dialog;
30
+ this.buttonService = buttonService;
31
+ this.dialogService = dialogService;
32
+ this.tableConfigService = tableConfigService;
33
+ this.conditionService = conditionService;
31
34
  this.elevation = "mat-elevation-z5";
32
35
  this.actionsWidth = "50px";
33
36
  this.showFilterButton = true;
34
37
  this.tileReload = new Subject();
38
+ this.smallScreen = false;
39
+ this.displayedColumns = [];
40
+ this.displayedButtons = [];
35
41
  this.hideTitle = false;
36
42
  this.data = [];
37
43
  this.dataLoad = new EventEmitter();
@@ -40,69 +46,73 @@ export class TableComponent {
40
46
  this.createClick = new EventEmitter();
41
47
  this.actionClick = new EventEmitter();
42
48
  this.inputChange = new EventEmitter();
43
- this.smallScreen = false;
44
- // columns: Column[] = [];
45
- this.displayedColumns = [];
46
- // @Input() optionValue = "";
47
- // @Input() optionDisplay = "";
48
- this.displayedButtons = [];
49
49
  // detect screen size changes
50
50
  this.breakpointObserver.observe(["(max-width: 600px)"]).subscribe((result) => {
51
- if (result.matches) {
52
- this.smallScreen = true;
53
- this.setColumns();
54
- }
55
- else {
56
- this.smallScreen = false;
57
- this.setColumns();
58
- }
51
+ this.smallScreen = result.matches;
52
+ this.updateTableConfiguration();
59
53
  });
60
54
  }
61
55
  ngOnInit() {
62
- if (this.config.elevation) {
63
- if (this.config.elevation == "none") {
64
- this.elevation = "";
65
- }
66
- else if (this.config.elevation == "low") {
67
- this.elevation = "mat-elevation-z1";
68
- }
69
- else if (this.config.elevation == "medium") {
70
- this.elevation = "mat-elevation-z5";
71
- }
72
- else if (this.config.elevation == "high") {
73
- this.elevation = "mat-elevation-z9";
74
- }
56
+ this.initializeComponent();
57
+ }
58
+ ngOnChanges() {
59
+ if (!this.config.loadAction) {
60
+ this.dataSource = this.data;
61
+ this.tableDataSource = new MatTableDataSource(this.dataSource);
75
62
  }
76
- this.setColumns();
77
- this.createButton = this.getButton('create');
63
+ setTimeout(() => { this.tableDataSource.paginator = this.tablePaginator; }, 1000);
64
+ }
65
+ initializeComponent() {
66
+ this.updateTableConfiguration();
67
+ this.setupDataLoading();
68
+ this.formDefaults();
69
+ }
70
+ updateTableConfiguration() {
71
+ this.elevation = this.getElevationClass(this.config?.elevation);
72
+ this.displayedColumns = this.tableConfigService.setColumns(this.config, this.smallScreen);
73
+ this.displayedButtons = this.buttonService.getDisplayedButtons(this.config?.buttons, this.smallScreen, this.config?.minButtons);
74
+ this.actionsWidth = this.tableConfigService.getActionsWidth(this.displayedButtons);
75
+ this.createButton = this.buttonService.getCreateButton(this.config?.buttons);
76
+ this.showFilterButton = !this.config?.searchConfig;
77
+ if (this.displayedButtons?.length > 0 && !this.displayedColumns.includes('action')) {
78
+ this.displayedColumns.push('action');
79
+ }
80
+ }
81
+ setupDataLoading() {
78
82
  if (this.config.loadAction) {
79
83
  this.loadData(this.config.loadAction, "");
80
84
  }
81
- this.formDefaults();
82
- if (this.config.searchConfig) {
83
- this.showFilterButton = false;
84
- }
85
- if (this.reload != null) {
85
+ if (this.reload) {
86
86
  this.reload.subscribe(v => {
87
- if (v == true) {
88
- if (this.config?.loadAction) {
89
- this.loadData(this.config?.loadAction, "");
90
- }
87
+ if (v && this.config?.loadAction) {
88
+ this.loadData(this.config.loadAction, "");
91
89
  }
92
90
  });
93
91
  }
94
92
  }
95
- ngOnChanges() {
96
- if (!this.config.loadAction) {
97
- // console.log("Table data Changed")
98
- // this.dataSource = this.data;
99
- this.tableDataSource = new MatTableDataSource(this.dataSource);
93
+ loadData(action, data) {
94
+ console.log("loading");
95
+ if (action) {
96
+ this.dataService.CallApi(action, data).subscribe((apiResponse) => {
97
+ if (this.config.logResponse) {
98
+ console.log(apiResponse);
99
+ }
100
+ this.dataSource = apiResponse.data;
101
+ this.tableDataSource = new MatTableDataSource(apiResponse.data);
102
+ this.tableDataSource.paginator = this.tablePaginator;
103
+ if (apiResponse.success) {
104
+ this.tableDataSource = new MatTableDataSource(apiResponse.data);
105
+ this.tableDataSource.paginator = this.tablePaginator;
106
+ this.dataLoaded(apiResponse.data);
107
+ }
108
+ else {
109
+ this.messageService.toast("Error: " + apiResponse.message);
110
+ }
111
+ });
100
112
  }
101
- setTimeout(() => { this.tableDataSource.paginator = this.tablePaginator; }, 1000);
102
113
  }
103
114
  inputChanged(event) {
104
115
  this.inputChange.emit({ field: event.field, value: event.value });
105
- // console.log("Changed " + JSON.stringify(event))
106
116
  }
107
117
  formDefaults() {
108
118
  if (!this.config.formConfig) {
@@ -116,46 +126,11 @@ export class TableComponent {
116
126
  }
117
127
  }
118
128
  setColumns() {
119
- //columns
120
- if (!this.config?.columns) {
121
- return;
122
- }
123
- if (this.smallScreen) {
124
- let cols = [];
125
- if (this.config.minColumns) {
126
- cols = this.config.minColumns.filter(col => this.config.columns.some(x => x.name === col));
127
- }
128
- if (cols.length > 0) {
129
- this.displayedColumns = cols;
130
- }
131
- else {
132
- this.displayedColumns = this.config.columns.map(({ name }) => name);
133
- }
134
- }
135
- else {
136
- this.displayedColumns = this.config.columns.map(({ name }) => name);
137
- }
138
- //buttons
139
- if (!this.config?.buttons) {
140
- return;
141
- }
142
- let buttonsCount = this.config.buttons.filter(x => x.name != 'create').length ?? 0;
143
- if (buttonsCount > 0) {
144
- if (!this.displayedColumns.find(x => x == 'action') && this.config.buttons) {
145
- this.displayedColumns.push("action");
146
- }
147
- if (this.smallScreen) {
148
- if (this.config.minButtons) {
149
- this.displayedButtons = this.config.buttons.filter(x => this.config.minButtons.includes(x.name));
150
- }
151
- else {
152
- this.displayedButtons = this.config.buttons.filter(x => x.name != 'create').slice(0, 1);
153
- }
154
- }
155
- else {
156
- this.displayedButtons = this.config.buttons.filter(x => x.name != 'create');
157
- }
158
- this.actionsWidth = `${this.displayedButtons.length * 40 + 20}px`;
129
+ this.displayedColumns = this.tableConfigService.setColumns(this.config, this.smallScreen);
130
+ this.displayedButtons = this.buttonService.getDisplayedButtons(this.config.buttons, this.smallScreen, this.config.minButtons);
131
+ this.actionsWidth = this.tableConfigService.getActionsWidth(this.displayedButtons);
132
+ if (this.displayedButtons.length > 0 && !this.displayedColumns.includes('action')) {
133
+ this.displayedColumns.push('action');
159
134
  }
160
135
  }
161
136
  setButtons() {
@@ -169,132 +144,45 @@ export class TableComponent {
169
144
  }
170
145
  }
171
146
  getButton(name) {
172
- if (!this.config.buttons) {
173
- console.log("No buttons found");
174
- return null;
175
- }
176
- return this.config.buttons.find(x => x.name == name);
147
+ return this.buttonService.getButton(this.config.buttons, name);
177
148
  }
178
149
  getIcon(buttonName) {
179
- let b = this.getButton(buttonName);
180
- if (b.icon) {
181
- return b.icon.name;
182
- }
183
- let i = 'open_in_new';
184
- switch (buttonName) {
185
- case 'view':
186
- i = this.config.flatButtons ? 'open_in_new' : 'pageview';
187
- break;
188
- case 'edit':
189
- i = 'edit';
190
- break;
191
- case 'delete':
192
- i = 'delete';
193
- break;
194
- default:
195
- break;
196
- }
197
- return i;
150
+ const button = this.getButton(buttonName);
151
+ return this.buttonService.getIcon(button, this.config);
198
152
  }
199
153
  getButtonColor(button, row) {
200
- if (button.disabled) {
201
- if (button.disabled(row)) {
202
- return 'lightgray';
203
- }
204
- }
205
- if (button.color) {
206
- return button.color;
207
- }
208
- if (button.name == 'delete') {
209
- return '#F44336';
210
- }
211
- if (button.name == 'create') {
212
- return 'green';
213
- }
214
- return ' #4050B5';
154
+ return this.buttonService.getButtonColor(button, row);
215
155
  }
216
156
  getOptions(column) {
217
157
  let x = this.config.columns.find(opt => opt.name === column);
218
158
  return x;
219
159
  }
220
- getColor(v, options) {
221
- let defaultColor = 'lightgrey';
222
- if (!options)
223
- return defaultColor;
224
- let c = options.find(x => x.value == v);
225
- if (c) {
226
- return c.color;
227
- }
228
- else {
229
- return defaultColor;
230
- }
160
+ getColor(value, options) {
161
+ return this.conditionService.getColor(value, options);
231
162
  }
232
- testIconCondition(value, icon) {
233
- if (icon.condition) {
234
- return icon.condition(value);
235
- }
236
- else {
237
- return true;
238
- }
163
+ testIconCondition(row, icon) {
164
+ return this.conditionService.testIconCondition(icon, row);
239
165
  }
240
- testColorCondition(value, color) {
241
- if (!color)
242
- return false;
243
- if (color.condition) {
244
- return color.condition(value);
245
- }
246
- else {
247
- return true;
248
- }
166
+ testColorCondition(row, color) {
167
+ return this.conditionService.testColorCondition(color, row);
249
168
  }
250
169
  showBanner(message) {
251
- if (!message)
252
- return;
253
- if (message == '')
254
- return;
255
- this.messageService.info(message);
170
+ if (message && message !== '') {
171
+ this.messageService.info(message);
172
+ }
256
173
  }
257
174
  testDisabled(row, buttonName) {
258
- let button = this.getButton(buttonName);
259
- if (button.disabled) {
260
- return button.disabled(row);
261
- }
262
- return false;
175
+ const button = this.getButton(buttonName);
176
+ return this.buttonService.testDisabled(button, row);
263
177
  }
264
178
  testVisible(row, buttonName) {
265
- let button = this.getButton(buttonName);
266
- if (button.visible) {
267
- return button.visible(row);
268
- }
269
- return true;
270
- }
271
- //Actions
272
- loadData(action, data) {
273
- console.log("loading");
274
- if (action) {
275
- this.dataService.CallApi(action, data).subscribe((apiResponse) => {
276
- if (this.config.logResponse) {
277
- console.log(apiResponse);
278
- }
279
- this.dataSource = apiResponse.data;
280
- this.tableDataSource = new MatTableDataSource(apiResponse.data);
281
- this.tableDataSource.paginator = this.tablePaginator;
282
- if (apiResponse.success) {
283
- this.tableDataSource = new MatTableDataSource(apiResponse.data);
284
- this.tableDataSource.paginator = this.tablePaginator;
285
- this.dataLoaded(apiResponse.data);
286
- }
287
- else {
288
- this.messageService.toast("Error: " + apiResponse.message);
289
- }
290
- });
291
- }
179
+ const button = this.getButton(buttonName);
180
+ return this.buttonService.testVisible(button, row);
292
181
  }
293
182
  //Events
294
183
  searchClicked(x) {
295
184
  console.log("Search");
296
185
  this.searchClick.emit(x);
297
- // console.log(x)
298
186
  if (this.config.searchConfig.searchAction) {
299
187
  this.config.searchConfig.searchAction.method == 'post';
300
188
  this.loadData(this.config.searchConfig.searchAction, x);
@@ -311,73 +199,37 @@ export class TableComponent {
311
199
  }
312
200
  }
313
201
  dataLoaded(x) {
314
- this.dataLoad.emit(x);
315
202
  console.log("dataloaded");
203
+ this.dataLoad.emit(x);
316
204
  if (this.config.tileConfig?.loadAction) {
317
205
  this.tileReload.next(true);
318
206
  }
319
207
  }
320
208
  actionClicked(name, row) {
321
- if (name == 'view') {
209
+ if (name === 'view') {
322
210
  this.viewModel(row);
323
211
  }
324
- else if (name == 'edit') {
212
+ else if (name === 'edit') {
325
213
  this.editModel(row);
326
214
  }
327
- else if (name == 'delete') {
215
+ else if (name === 'delete') {
328
216
  this.deleteModel(row);
329
217
  }
330
218
  else {
331
219
  this.customModel(name, row);
332
220
  }
333
221
  }
222
+ //Dialog events
334
223
  columnClicked(column, row) {
335
224
  if (column.detailsConfig) {
336
- let conf = DetailsDialogProcessor.processDetailsConfig(column.detailsConfig, row);
337
- const dialogRef = this.dialog.open(DetailsDialog, {
338
- width: "900px",
339
- data: conf
340
- });
341
- dialogRef.afterClosed().subscribe((result) => {
342
- if (result.message == "success") {
343
- this.actionClickedEmit(column.name, row);
344
- this.refreshClicked();
345
- }
346
- });
225
+ this.openDetailsDialog(column.name, row, column);
347
226
  }
348
227
  else {
349
228
  this.actionClickedEmit(column.name, row);
350
229
  }
351
230
  }
352
231
  customModel(name, row) {
353
- let button = this.getButton(name);
354
- if (button) {
355
- if (!button.dialog) {
356
- this.doAction(button.name, row);
357
- this.actionClickedEmit(name, row);
358
- }
359
- else {
360
- if (button.detailsConfig) {
361
- let conf = DetailsDialogProcessor.processDetailsConfig(button.detailsConfig, row);
362
- const dialogRef = this.dialog.open(DetailsDialog, {
363
- width: "900px",
364
- data: conf
365
- });
366
- dialogRef.afterClosed().subscribe((result) => {
367
- if (result.message == "success") {
368
- this.actionClickedEmit(button.name, row);
369
- this.refreshClicked();
370
- }
371
- });
372
- }
373
- else {
374
- this.actionClickedEmit(button.name, row);
375
- }
376
- }
377
- }
378
- else {
379
- this.actionClickedEmit(name, row);
380
- }
232
+ this.openDetailsDialog(name, row);
381
233
  }
382
234
  actionClickedEmit(name, row) {
383
235
  console.log("Action clicked");
@@ -385,82 +237,24 @@ export class TableComponent {
385
237
  }
386
238
  viewModel(row) {
387
239
  console.log("view Clicked");
388
- let button = this.getButton('view');
389
- if (!button)
390
- return;
391
- if (!button.dialog) {
392
- this.actionClickedEmit(button.name, row);
393
- return;
394
- }
395
- if (!this.config.formConfig) {
396
- this.messageService.toast("Please configure form");
397
- return;
398
- }
399
- let conf = {
400
- formConfig: this.config.formConfig,
401
- buttons: this.config.buttons,
402
- details: row,
403
- };
404
- if (button.detailsConfig) {
405
- conf = DetailsDialogProcessor.processDetailsConfig(button.detailsConfig, row);
406
- }
407
- conf.formConfig.mode = "view";
408
- const dialogRef = this.dialog.open(DetailsDialog, {
409
- width: "900px",
410
- data: conf
411
- });
412
- dialogRef.afterClosed().subscribe((result) => {
413
- if (result.message) {
414
- this.refreshClicked();
415
- }
416
- });
240
+ this.openDetailsDialog('view', row);
417
241
  }
418
242
  newModel() {
419
- let button = this.getButton('create');
420
- if (!button)
421
- return;
422
- if (!button.dialog) {
423
- this.actionClickedEmit(button.name, null);
424
- return;
425
- }
426
- if (!this.config.formConfig) {
427
- this.messageService.toast("Please configure form");
428
- return;
429
- }
430
- this.config.formConfig.mode = "create";
431
- let conf = {
432
- formConfig: this.config.formConfig,
433
- buttons: this.config.buttons,
434
- };
435
- if (button.detailsConfig) {
436
- conf = button.detailsConfig;
437
- }
438
- conf.formConfig.mode = "create";
439
- conf.heroField = this.config?.heroField;
440
- conf.heroValue = this.config?.heroValue;
441
- const dialogRef = this.dialog.open(DetailsDialog, {
442
- width: "900px",
443
- data: conf,
444
- });
445
- dialogRef.afterClosed().subscribe((result) => {
446
- if (result.message == "success") {
447
- this.actionClickedEmit('create', result.data);
448
- this.refreshClicked();
449
- }
450
- else if (result.message == "emit") {
451
- this.actionClickedEmit('create', result.data);
452
- }
453
- });
243
+ this.openDetailsDialog('create', null);
454
244
  }
455
245
  editModel(row) {
456
- let button = this.getButton('edit');
246
+ this.openDetailsDialog('edit', row);
247
+ }
248
+ openDetailsDialog(buttonName, row, column) {
249
+ const button = column ? { name: column.name, dialog: true, detailsConfig: column.detailsConfig } : this.getButton(buttonName);
457
250
  if (!button)
458
251
  return;
459
252
  if (!button.dialog) {
253
+ this.doAction(button.name, row);
460
254
  this.actionClickedEmit(button.name, row);
461
255
  return;
462
256
  }
463
- if (!this.config.formConfig) {
257
+ if (!this.config.formConfig && !button.detailsConfig) {
464
258
  this.messageService.toast("Please configure form");
465
259
  return;
466
260
  }
@@ -470,24 +264,28 @@ export class TableComponent {
470
264
  details: row,
471
265
  };
472
266
  if (button.detailsConfig) {
473
- conf = DetailsDialogProcessor.processDetailsConfig(button.detailsConfig, row);
267
+ conf = buttonName === 'create'
268
+ ? button.detailsConfig
269
+ : DetailsDialogProcessor.processDetailsConfig(button.detailsConfig, row);
270
+ }
271
+ conf.formConfig.mode = buttonName === 'create' ? 'create' : (buttonName === 'edit' ? 'edit' : 'view');
272
+ if (buttonName === 'create') {
273
+ conf.heroField = this.config?.heroField;
274
+ conf.heroValue = this.config?.heroValue;
275
+ }
276
+ const dialogResult = this.dialogService.openDetailsDialog(conf, DetailsDialog);
277
+ if (buttonName === 'edit') {
278
+ dialogResult.inputChange.subscribe((x) => {
279
+ this.inputChanged(x);
280
+ });
474
281
  }
475
- conf.formConfig.mode = "edit";
476
- const dialogRef = this.dialog.open(DetailsDialog, {
477
- width: "900px",
478
- data: conf
479
- });
480
- dialogRef.componentInstance.inputChange.subscribe((x) => {
481
- this.inputChanged(x);
482
- });
483
- dialogRef.afterClosed().subscribe((result) => {
484
- console.log(result);
485
- if (result.message == "success") {
486
- this.actionClickedEmit('edit', result.data);
282
+ dialogResult.afterClosed.subscribe((result) => {
283
+ if (result.message === 'success') {
284
+ this.actionClickedEmit(button.name, result.data);
487
285
  this.refreshClicked();
488
286
  }
489
- else if (result.message == "emit") {
490
- this.actionClickedEmit('edit', result.data);
287
+ else if (result.message === 'emit') {
288
+ this.actionClickedEmit(button.name, result.data);
491
289
  }
492
290
  });
493
291
  }
@@ -502,6 +300,7 @@ export class TableComponent {
502
300
  }
503
301
  });
504
302
  }
303
+ //Actions
505
304
  doAction(buttonName, row) {
506
305
  let b = this.getButton(buttonName);
507
306
  if (!b)
@@ -537,13 +336,32 @@ export class TableComponent {
537
336
  this.messageService.toast("Error: " + error);
538
337
  });
539
338
  }
339
+ //Misc
340
+ getElevationClass(elevation) {
341
+ console.log(elevation);
342
+ if (elevation == "none") {
343
+ return "";
344
+ }
345
+ else if (elevation == "low") {
346
+ return "mat-elevation-z1";
347
+ }
348
+ else if (elevation == "medium") {
349
+ return "mat-elevation-z5";
350
+ }
351
+ else if (elevation == "high") {
352
+ return "mat-elevation-z9";
353
+ }
354
+ else {
355
+ return "mat-elevation-z5";
356
+ }
357
+ }
540
358
  }
541
- 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 });
542
- TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableComponent, selector: "spa-table", inputs: { hideTitle: "hideTitle", data: "data", config: "config", reload: "reload" }, 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 && !config.flatButtons\" id=\"btnNew\" mat-raised-button color=\"primary\" style=\"margin-right: 10px;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <button *ngIf=\"createButton && config.flatButtons\" id=\"btnNew\" mat-stroked-button style=\"margin-right: 10px; color: green;\" (click)=\"newModel()\">{{createButton.display}}</button>\n </div>\n\n <div *ngIf=\"config.tileConfig && !smallScreen\" style=\"min-width: 75%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [showText]=\"!smallScreen || (smallScreen && dataSource?.length > 10)\" [showButton]=\"showFilterButton\" [data]=\"tableDataSource\" [flatButtons]=\"config.flatButtons\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n<div *ngIf=\"config.tileConfig && smallScreen\" style=\"width: 100%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n</div>\n\n<div *ngIf=\"config.title && !hideTitle\" 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 && (!smallScreen || (smallScreen && dataSource?.length > 0))\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" [ngClass]=\"elevation\">\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;\" class=\"right-padding\" >\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 <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'select'\">\n <spa-select [options]=\"column.options\" [optionDisplay]=\"column.optionDisplay\" [optionValue]=\"column.optionValue\" [(value)]=\"row[column.name]\" width=\"90%\" ></spa-select>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip'\">\n <mat-chip-list>\n <mat-chip (click)=\"columnClicked(column, row)\" [ngStyle]=\"{'background-color': testColorCondition(row, column.color) ? column.color.name : 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]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name] | currency:'':''}}</label>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n\n <button mat-button [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\" (click)=\"actionClicked(column.name, row)\">{{row[column.name]}}</button>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name]}}</label>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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:false ? '50px' : actionsWidth}\">\n <div class=\"action-buttons-container\">\n\n <ng-container *ngFor=\"let button of displayedButtons\">\n\n <ng-container *ngIf=\"button.name != 'create' && testVisible(row,button.name)\">\n\n <button *ngIf=\"!config.flatButtons\" 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 <button *ngIf=\"config.flatButtons\" mat-icon-button [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon [ngStyle]=\"{'color':getButtonColor(button, row)}\">{{getIcon(button.name)}}</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-container *ngIf=\"button.name != 'create' && !testVisible(row,button.name) && !config.collapseButtons\">\n <label style=\"margin-right: 35px;\"></label>\n </ng-container>\n\n </ng-container>\n </div>\n\n\n\n\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;\" [ngClass]=\"{'make-gray': config.greyOut && config.greyOut(row)}\"></tr>\n </table>\n\n </div>\n\n <mat-paginator *ngIf=\"dataSource && (!smallScreen || (smallScreen && dataSource?.length > 0))\" #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<div class=\"tin-center\">\n <p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n</div>\n\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}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}.action-buttons-container{display:flex;justify-content:flex-end;align-items:center}.refreshIcon{font-size:22px!important;margin-top:-7px!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.SelectComponent, selector: "spa-select", inputs: ["width", "readonly", "required", "defaultFirstValue", "readonlyMode", "hint", "placeholder", "multiple", "display", "value", "options", "masterOptions", "optionValue", "optionDisplay", "optionDisplayExtra", "nullable"], outputs: ["valueChange"] }, { kind: "component", type: i14.FilterComponent, selector: "spa-filter", inputs: ["flatButtons", "showText", "showButton", "data"], outputs: ["refreshClick"] }, { kind: "component", type: i15.TilesComponent, selector: "spa-tiles", inputs: ["config", "data", "reload"], outputs: ["tileClick"] }, { kind: "component", type: i16.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: i17.CamelToWordsPipe, name: "camelToWords" }] });
359
+ 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 }, { token: i5.ButtonService }, { token: i6.DialogService }, { token: i7.TableConfigService }, { token: i8.ConditionService }], target: i0.ɵɵFactoryTarget.Component });
360
+ TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableComponent, selector: "spa-table", inputs: { hideTitle: "hideTitle", data: "data", config: "config", reload: "reload" }, 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: "\r\n<!-- Search -->\r\n<spa-search\r\n *ngIf=\"config.searchConfig\" [config]=\"config.searchConfig\" style=\"margin-bottom: 20px;\" (searchClick)=\"searchClicked($event)\">\r\n</spa-search>\r\n\r\n<!-- Header -->\r\n<app-table-header\r\n [config]=\"config\" [hideTitle]=\"false\" [tableDataSource]=\"tableDataSource\" [createButton]=\"createButton\" [tileConfig]=\"config.tileConfig\" [smallScreen]=\"smallScreen\"\r\n [tileReload]=\"tileReload\" [showFilterButton]=\"showFilterButton\" (createClick)=\"newModel()\" (refreshClick)=\"refreshClicked()\">\r\n</app-table-header>\r\n\r\n\r\n<!-- Table -->\r\n<div>\r\n\r\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\r\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\r\n\r\n <div *ngIf=\"dataSource && (!smallScreen || (smallScreen && dataSource?.length > 0))\">\r\n\r\n <table mat-table [dataSource]=\"tableDataSource\" [ngClass]=\"elevation\">\r\n\r\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\r\n <th mat-header-cell *matHeaderCellDef >{{ column.alias ?? column.name | camelToWords }}</th>\r\n <td mat-cell *matCellDef=\"let row;\" class=\"right-padding\" >\r\n\r\n <!-- Rows -->\r\n <app-table-row [column]=\"column\" [row]=\"row\" [config]=\"config\"\r\n (actionClick)=\"actionClicked(column.name, row)\" (columnClick)=\"columnClicked(column, row)\" (showBannerEvent)=\"showBanner($event)\">\r\n </app-table-row>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"action\">\r\n <th mat-header-cell *matHeaderCellDef> Action </th>\r\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:false ? '50px' : actionsWidth}\">\r\n <div class=\"action-buttons-container\">\r\n\r\n <!-- Actions -->\r\n <app-table-action\r\n [displayedButtons]=\"displayedButtons\" [config]=\"config\" [row]=\"row\" (actionClick)=\"actionClicked($event.name, $event.row)\">\r\n </app-table-action>\r\n\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\" [ngClass]=\"{'make-gray': config.greyOut && config.greyOut(row)}\"></tr>\r\n </table>\r\n\r\n </div>\r\n\r\n <mat-paginator *ngIf=\"dataSource && (!smallScreen || (smallScreen && dataSource?.length > 0))\" #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\r\n\r\n</div>\r\n\r\n<div class=\"tin-center\">\r\n <p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\r\n</div>\r\n\r\n\r\n\r\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}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}.action-buttons-container{display:flex;justify-content:flex-end;align-items:center}.refreshIcon{font-size:22px!important;margin-top:-7px!important}.dialog-container{display:flex;flex-direction:column;height:100%}.dialog-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.dialog-scroll-content{flex:1;overflow-y:auto}mat-dialog-actions{flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i10.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i10.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i10.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i10.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i10.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i10.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i10.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i10.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i10.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i10.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i11.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i12.SearchComponent, selector: "spa-search", inputs: ["config"], outputs: ["searchClick"] }, { kind: "component", type: i13.TableHeaderComponent, selector: "app-table-header", inputs: ["config", "hideTitle", "tableDataSource", "createButton", "tileConfig", "smallScreen", "tileReload", "showFilterButton"], outputs: ["createClick", "refreshClick", "tileClick"] }, { kind: "component", type: i14.TableRowComponent, selector: "app-table-row", inputs: ["column", "row", "config"], outputs: ["actionClick", "columnClick", "showBannerEvent"] }, { kind: "component", type: i15.TableActionComponent, selector: "app-table-action", inputs: ["displayedButtons", "config", "row"], outputs: ["actionClick"] }, { kind: "pipe", type: i16.CamelToWordsPipe, name: "camelToWords" }] });
543
361
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponent, decorators: [{
544
362
  type: Component,
545
- 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 && !config.flatButtons\" id=\"btnNew\" mat-raised-button color=\"primary\" style=\"margin-right: 10px;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <button *ngIf=\"createButton && config.flatButtons\" id=\"btnNew\" mat-stroked-button style=\"margin-right: 10px; color: green;\" (click)=\"newModel()\">{{createButton.display}}</button>\n </div>\n\n <div *ngIf=\"config.tileConfig && !smallScreen\" style=\"min-width: 75%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [showText]=\"!smallScreen || (smallScreen && dataSource?.length > 10)\" [showButton]=\"showFilterButton\" [data]=\"tableDataSource\" [flatButtons]=\"config.flatButtons\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n<div *ngIf=\"config.tileConfig && smallScreen\" style=\"width: 100%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n</div>\n\n<div *ngIf=\"config.title && !hideTitle\" 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 && (!smallScreen || (smallScreen && dataSource?.length > 0))\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" [ngClass]=\"elevation\">\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;\" class=\"right-padding\" >\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 <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'select'\">\n <spa-select [options]=\"column.options\" [optionDisplay]=\"column.optionDisplay\" [optionValue]=\"column.optionValue\" [(value)]=\"row[column.name]\" width=\"90%\" ></spa-select>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip'\">\n <mat-chip-list>\n <mat-chip (click)=\"columnClicked(column, row)\" [ngStyle]=\"{'background-color': testColorCondition(row, column.color) ? column.color.name : 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]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name] | currency:'':''}}</label>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n\n <button mat-button [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\" (click)=\"actionClicked(column.name, row)\">{{row[column.name]}}</button>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name]}}</label>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" (click)=\"showBanner(row[column.icon.tipField])\" [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]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [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:false ? '50px' : actionsWidth}\">\n <div class=\"action-buttons-container\">\n\n <ng-container *ngFor=\"let button of displayedButtons\">\n\n <ng-container *ngIf=\"button.name != 'create' && testVisible(row,button.name)\">\n\n <button *ngIf=\"!config.flatButtons\" 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 <button *ngIf=\"config.flatButtons\" mat-icon-button [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon [ngStyle]=\"{'color':getButtonColor(button, row)}\">{{getIcon(button.name)}}</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-container *ngIf=\"button.name != 'create' && !testVisible(row,button.name) && !config.collapseButtons\">\n <label style=\"margin-right: 35px;\"></label>\n </ng-container>\n\n </ng-container>\n </div>\n\n\n\n\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;\" [ngClass]=\"{'make-gray': config.greyOut && config.greyOut(row)}\"></tr>\n </table>\n\n </div>\n\n <mat-paginator *ngIf=\"dataSource && (!smallScreen || (smallScreen && dataSource?.length > 0))\" #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<div class=\"tin-center\">\n <p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n</div>\n\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}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}.action-buttons-container{display:flex;justify-content:flex-end;align-items:center}.refreshIcon{font-size:22px!important;margin-top:-7px!important}\n"] }]
546
- }], ctorParameters: function () { return [{ type: i1.DataServiceLib }, { type: i2.MessageService }, { type: i3.BreakpointObserver }, { type: i4.MatDialog }]; }, propDecorators: { tablePaginator: [{
363
+ args: [{ selector: 'spa-table', template: "\r\n<!-- Search -->\r\n<spa-search\r\n *ngIf=\"config.searchConfig\" [config]=\"config.searchConfig\" style=\"margin-bottom: 20px;\" (searchClick)=\"searchClicked($event)\">\r\n</spa-search>\r\n\r\n<!-- Header -->\r\n<app-table-header\r\n [config]=\"config\" [hideTitle]=\"false\" [tableDataSource]=\"tableDataSource\" [createButton]=\"createButton\" [tileConfig]=\"config.tileConfig\" [smallScreen]=\"smallScreen\"\r\n [tileReload]=\"tileReload\" [showFilterButton]=\"showFilterButton\" (createClick)=\"newModel()\" (refreshClick)=\"refreshClicked()\">\r\n</app-table-header>\r\n\r\n\r\n<!-- Table -->\r\n<div>\r\n\r\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\r\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\r\n\r\n <div *ngIf=\"dataSource && (!smallScreen || (smallScreen && dataSource?.length > 0))\">\r\n\r\n <table mat-table [dataSource]=\"tableDataSource\" [ngClass]=\"elevation\">\r\n\r\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\r\n <th mat-header-cell *matHeaderCellDef >{{ column.alias ?? column.name | camelToWords }}</th>\r\n <td mat-cell *matCellDef=\"let row;\" class=\"right-padding\" >\r\n\r\n <!-- Rows -->\r\n <app-table-row [column]=\"column\" [row]=\"row\" [config]=\"config\"\r\n (actionClick)=\"actionClicked(column.name, row)\" (columnClick)=\"columnClicked(column, row)\" (showBannerEvent)=\"showBanner($event)\">\r\n </app-table-row>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"action\">\r\n <th mat-header-cell *matHeaderCellDef> Action </th>\r\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:false ? '50px' : actionsWidth}\">\r\n <div class=\"action-buttons-container\">\r\n\r\n <!-- Actions -->\r\n <app-table-action\r\n [displayedButtons]=\"displayedButtons\" [config]=\"config\" [row]=\"row\" (actionClick)=\"actionClicked($event.name, $event.row)\">\r\n </app-table-action>\r\n\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\" [ngClass]=\"{'make-gray': config.greyOut && config.greyOut(row)}\"></tr>\r\n </table>\r\n\r\n </div>\r\n\r\n <mat-paginator *ngIf=\"dataSource && (!smallScreen || (smallScreen && dataSource?.length > 0))\" #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\r\n\r\n</div>\r\n\r\n<div class=\"tin-center\">\r\n <p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\r\n</div>\r\n\r\n\r\n\r\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}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}.action-buttons-container{display:flex;justify-content:flex-end;align-items:center}.refreshIcon{font-size:22px!important;margin-top:-7px!important}.dialog-container{display:flex;flex-direction:column;height:100%}.dialog-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.dialog-scroll-content{flex:1;overflow-y:auto}mat-dialog-actions{flex-shrink:0}\n"] }]
364
+ }], ctorParameters: function () { return [{ type: i1.DataServiceLib }, { type: i2.MessageService }, { type: i3.BreakpointObserver }, { type: i4.MatDialog }, { type: i5.ButtonService }, { type: i6.DialogService }, { type: i7.TableConfigService }, { type: i8.ConditionService }]; }, propDecorators: { tablePaginator: [{
547
365
  type: ViewChild,
548
366
  args: ['tablePaginator']
549
367
  }], hideTitle: [{
@@ -567,4 +385,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
567
385
  }], inputChange: [{
568
386
  type: Output
569
387
  }] } });
570
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsT0FBTyxFQUFzRCxVQUFVLEVBQWtDLE1BQU0sdUJBQXVCLENBQUM7QUFJdkksT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzFELE9BQU8sRUFBUSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPL0IsTUFBTSxPQUFPLGNBQWM7SUFFekIsWUFBb0IsV0FBMkIsRUFBVSxjQUE4QixFQUFVLGtCQUFzQyxFQUFTLE1BQWlCO1FBQTdJLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBaUVqSyxjQUFTLEdBQUcsa0JBQWtCLENBQUM7UUFDL0IsaUJBQVksR0FBRyxNQUFNLENBQUM7UUFFdEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLGVBQVUsR0FBc0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQW9CckMsY0FBUyxHQUFHLEtBQUss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Q0FBQzthQUN2QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzVEO1FBQ0gsQ0FBQyxFQUNDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDOzsyR0F2dEJVLGNBQWM7K0ZBQWQsY0FBYywrYkNsQjNCLG0wWEFnTUE7MkZEOUthLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0UsV0FBVzsyTEE2RlEsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBRWxCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSwgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWN0aW9uLCBCdXR0b24sIENvbG9yLCBDb2x1bW4sIERldGFpbHNEaWFsb2dDb25maWcsIEZvcm1Db25maWcsIEljb24sIFRhYmxlQ29uZmlnLCBBcGlSZXNwb25zZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvQ2xhc3Nlcyc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgRGV0YWlsc0RpYWxvZyB9IGZyb20gJy4vZGV0YWlsc0RpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIsIEJyZWFrcG9pbnRTdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmUsIERldGFpbHNEaWFsb2dQcm9jZXNzb3IgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RpbkNvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NwYS10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2VMaWIsIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLCBwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyLCBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2cpXHJcbiAge1xyXG4gICAgLy8gZGV0ZWN0IHNjcmVlbiBzaXplIGNoYW5nZXNcclxuICAgIHRoaXMuYnJlYWtwb2ludE9ic2VydmVyLm9ic2VydmUoWyBcIihtYXgtd2lkdGg6IDYwMHB4KVwiXSkuc3Vic2NyaWJlKChyZXN1bHQ6IEJyZWFrcG9pbnRTdGF0ZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKHJlc3VsdC5tYXRjaGVzKSB7XHJcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IHRydWVcclxuICAgICAgICB0aGlzLnNldENvbHVtbnMoKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW4gPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuc2V0Q29sdW1ucygpXHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcuZWxldmF0aW9uKXtcclxuICAgICAgaWYgKHRoaXMuY29uZmlnLmVsZXZhdGlvbiA9PSBcIm5vbmVcIil7XHJcbiAgICAgICAgdGhpcy5lbGV2YXRpb24gPSBcIlwiXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5jb25maWcuZWxldmF0aW9uID09IFwibG93XCIpIHtcclxuICAgICAgICB0aGlzLmVsZXZhdGlvbiA9IFwibWF0LWVsZXZhdGlvbi16MVwiXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5jb25maWcuZWxldmF0aW9uID09IFwibWVkaXVtXCIpIHtcclxuICAgICAgICB0aGlzLmVsZXZhdGlvbiA9IFwibWF0LWVsZXZhdGlvbi16NVwiXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5jb25maWcuZWxldmF0aW9uID09IFwiaGlnaFwiKSB7XHJcbiAgICAgICAgdGhpcy5lbGV2YXRpb24gPSBcIm1hdC1lbGV2YXRpb24tejlcIlxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRDb2x1bW5zKClcclxuXHJcbiAgICB0aGlzLmNyZWF0ZUJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdjcmVhdGUnKVxyXG5cclxuXHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvYWRBY3Rpb24pe1xyXG4gICAgICB0aGlzLmxvYWREYXRhKHRoaXMuY29uZmlnLmxvYWRBY3Rpb24sIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9ybURlZmF1bHRzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLnNlYXJjaENvbmZpZyl7XHJcbiAgICAgIHRoaXMuc2hvd0ZpbHRlckJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlbG9hZCAhPSBudWxsKXtcclxuICAgICAgdGhpcy5yZWxvYWQuc3Vic2NyaWJlKHYgPT4ge1xyXG5cclxuICAgICAgICBpZiAodiA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWc/LmxvYWRBY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmNvbmZpZz8ubG9hZEFjdGlvbiwgXCJcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGVsZXZhdGlvbiA9IFwibWF0LWVsZXZhdGlvbi16NVwiO1xyXG4gIGFjdGlvbnNXaWR0aCA9IFwiNTBweFwiO1xyXG5cclxuICBzaG93RmlsdGVyQnV0dG9uID0gdHJ1ZTtcclxuICB0aWxlUmVsb2FkIDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmxvYWRBY3Rpb24pe1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlRhYmxlIGRhdGEgQ2hhbmdlZFwiKVxyXG4gICAgICAvLyB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55Pih0aGlzLmRhdGFTb3VyY2UpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy50YWJsZVBhZ2luYXRvcjsgfSwgMTAwMClcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgQFZpZXdDaGlsZCgndGFibGVQYWdpbmF0b3InKSB0YWJsZVBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xyXG5cclxuICBASW5wdXQoKSBoaWRlVGl0bGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBkYXRhOiBhbnkgPVtdO1xyXG4gIEBJbnB1dCgpIGNvbmZpZzogVGFibGVDb25maWc7XHJcbiAgQElucHV0KCkgcmVsb2FkOiBTdWJqZWN0PGJvb2xlYW4+O1xyXG4gIEBPdXRwdXQoKSBkYXRhTG9hZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgcmVmcmVzaENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBzZWFyY2hDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgY3JlYXRlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGFjdGlvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBpbnB1dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgaW5wdXRDaGFuZ2VkKGV2ZW50KSB7XHJcbiAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQoeyBmaWVsZDogZXZlbnQuZmllbGQsIHZhbHVlOiBldmVudC52YWx1ZSB9KVxyXG4gICAgLy8gY29uc29sZS5sb2coXCJDaGFuZ2VkIFwiICsgSlNPTi5zdHJpbmdpZnkoZXZlbnQpKVxyXG4gIH1cclxuXHJcbiAgc21hbGxTY3JlZW4gPSBmYWxzZVxyXG5cclxuICBjcmVhdGVCdXR0b246IEJ1dHRvbjtcclxuXHJcblxyXG4gIC8vVGFibGVcclxuICB0YWJsZURhdGFTb3VyY2U7XHJcbiAgZGF0YVNvdXJjZTogYW55W107XHJcbiAgLy8gY29sdW1uczogQ29sdW1uW10gPSBbXTtcclxuICBkaXNwbGF5ZWRDb2x1bW5zID0gW11cclxuICAvLyBASW5wdXQoKSBvcHRpb25WYWx1ZSA9IFwiXCI7XHJcbiAgLy8gQElucHV0KCkgb3B0aW9uRGlzcGxheSA9IFwiXCI7XHJcbiAgZGlzcGxheWVkQnV0dG9ucyA9IFtdXHJcblxyXG4gIGZvcm1EZWZhdWx0cygpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1Db25maWcpIHtcclxuICAgICAgbGV0IGNvbmZpZyA9IG5ldyBGb3JtQ29uZmlnXHJcblxyXG4gICAgICBjb25maWcuZmllbGRzID0gW11cclxuXHJcbiAgICAgIHRoaXMuY29uZmlnLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG5cclxuICAgICAgICBsZXQgZmllbGQgPSB7IG5hbWU6IGNvbHVtbi5uYW1lLCB0eXBlOiBjb2x1bW4udHlwZSB9XHJcbiAgICAgICAgY29uZmlnLmZpZWxkcy5wdXNoKGZpZWxkKVxyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZy5mb3JtQ29uZmlnID0gY29uZmlnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Q29sdW1ucygpIHtcclxuXHJcbiAgICAvL2NvbHVtbnNcclxuICAgIGlmICghdGhpcy5jb25maWc/LmNvbHVtbnMpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc21hbGxTY3JlZW4pIHtcclxuXHJcbiAgICAgIGxldCBjb2xzID0gW107XHJcblxyXG4gICAgICBpZiAodGhpcy5jb25maWcubWluQ29sdW1ucyl7XHJcbiAgICAgICAgY29scyA9IHRoaXMuY29uZmlnLm1pbkNvbHVtbnMuZmlsdGVyKGNvbCA9PlxyXG4gICAgICAgICAgdGhpcy5jb25maWcuY29sdW1ucy5zb21lKHggPT4geC5uYW1lID09PSBjb2wpXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgaWYgKGNvbHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gY29scztcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1ucy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKVxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1ucy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL2J1dHRvbnNcclxuICAgIGlmICghdGhpcy5jb25maWc/LmJ1dHRvbnMpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJ1dHRvbnNDb3VudCA9IHRoaXMuY29uZmlnLmJ1dHRvbnMuZmlsdGVyKHggPT4geC5uYW1lICE9ICdjcmVhdGUnKS5sZW5ndGggPz8gMFxyXG4gICAgaWYgKGJ1dHRvbnNDb3VudCA+IDApIHtcclxuXHJcbiAgICAgIGlmICghdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmZpbmQoeCA9PiB4ID09ICdhY3Rpb24nKSAmJiB0aGlzLmNvbmZpZy5idXR0b25zKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goXCJhY3Rpb25cIilcclxuICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICBpZiAodGhpcy5zbWFsbFNjcmVlbikge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcubWluQnV0dG9ucyl7XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXllZEJ1dHRvbnMgPSB0aGlzLmNvbmZpZy5idXR0b25zLmZpbHRlcih4ID0+IHRoaXMuY29uZmlnLm1pbkJ1dHRvbnMuaW5jbHVkZXMoeC5uYW1lKSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheWVkQnV0dG9ucyA9IHRoaXMuY29uZmlnLmJ1dHRvbnMuZmlsdGVyKHggPT4geC5uYW1lICE9ICdjcmVhdGUnKS5zbGljZSgwLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRCdXR0b25zID0gdGhpcy5jb25maWcuYnV0dG9ucy5maWx0ZXIoeCA9PiB4Lm5hbWUgIT0gJ2NyZWF0ZScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmFjdGlvbnNXaWR0aCA9IGAke3RoaXMuZGlzcGxheWVkQnV0dG9ucy5sZW5ndGggKiA0MCArMjB9cHhgXHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzZXRCdXR0b25zKCl7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5idXR0b25zKSByZXR1cm5cclxuXHJcbiAgICBpZiAoIXRoaXMuc21hbGxTY3JlZW4pe1xyXG4gICAgICB0aGlzLmRpc3BsYXllZEJ1dHRvbnMgPSB0aGlzLmNvbmZpZy5idXR0b25zO1xyXG5cclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmRpc3BsYXllZEJ1dHRvbnMgPSB0aGlzLmNvbmZpZy5idXR0b25zO1xyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0QnV0dG9uKG5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5idXR0b25zKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiTm8gYnV0dG9ucyBmb3VuZFwiKVxyXG4gICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmJ1dHRvbnMuZmluZCh4ID0+IHgubmFtZSA9PSBuYW1lKVxyXG4gIH1cclxuXHJcbiAgZ2V0SWNvbihidXR0b25OYW1lOiBzdHJpbmcpe1xyXG5cclxuICAgIGxldCBiID0gdGhpcy5nZXRCdXR0b24oYnV0dG9uTmFtZSk7XHJcbiAgICBpZiAoYi5pY29uKXtcclxuICAgICAgcmV0dXJuIGIuaWNvbi5uYW1lXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGkgPSAnb3Blbl9pbl9uZXcnXHJcblxyXG4gICAgc3dpdGNoIChidXR0b25OYW1lKSB7XHJcblxyXG4gICAgICBjYXNlICd2aWV3JzpcclxuXHJcbiAgICAgICAgaSA9IHRoaXMuY29uZmlnLmZsYXRCdXR0b25zID8gJ29wZW5faW5fbmV3JyA6ICdwYWdldmlldyc7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdlZGl0JzpcclxuICAgICAgICBpID0gJ2VkaXQnXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XHJcbiAgICAgICAgaSA9ICdkZWxldGUnXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QnV0dG9uQ29sb3IoYnV0dG9uOiBCdXR0b24sIHJvdykge1xyXG5cclxuICAgIGlmIChidXR0b24uZGlzYWJsZWQpe1xyXG4gICAgICBpZiAoYnV0dG9uLmRpc2FibGVkKHJvdykpe1xyXG4gICAgICAgIHJldHVybiAnbGlnaHRncmF5J1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJ1dHRvbi5jb2xvcil7XHJcbiAgICAgIHJldHVybiBidXR0b24uY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJ1dHRvbi5uYW1lID09ICdkZWxldGUnKXtcclxuICAgICAgcmV0dXJuICcjRjQ0MzM2J1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24ubmFtZSA9PSAnY3JlYXRlJykge1xyXG4gICAgICByZXR1cm4gJ2dyZWVuJ1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybicgIzQwNTBCNSdcclxuICB9XHJcblxyXG5cclxuICBnZXRPcHRpb25zKGNvbHVtbil7XHJcbiAgICBsZXQgeCA9IHRoaXMuY29uZmlnLmNvbHVtbnMuZmluZChvcHQgPT4gb3B0Lm5hbWUgPT09IGNvbHVtbik7XHJcbiAgICByZXR1cm4gIHhcclxuICB9XHJcblxyXG4gIGdldENvbG9yKHYsIG9wdGlvbnMpIHtcclxuXHJcbiAgICBsZXQgZGVmYXVsdENvbG9yID0gJ2xpZ2h0Z3JleSdcclxuXHJcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybiBkZWZhdWx0Q29sb3JcclxuXHJcbiAgICBsZXQgYyA9IG9wdGlvbnMuZmluZCh4ID0+IHgudmFsdWUgPT0gdilcclxuXHJcbiAgICBpZiAoYykge1xyXG4gICAgICByZXR1cm4gYy5jb2xvclxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRlZmF1bHRDb2xvclxyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgdGVzdEljb25Db25kaXRpb24odmFsdWU6IGFueSwgaWNvbiA6IEljb24pOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoaWNvbi5jb25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuIGljb24uY29uZGl0aW9uKHZhbHVlKTtcclxuXHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0ZXN0Q29sb3JDb25kaXRpb24odmFsdWU6IGFueSwgY29sb3I6IENvbG9yKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKCFjb2xvcikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChjb2xvci5jb25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuIGNvbG9yLmNvbmRpdGlvbih2YWx1ZSk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93QmFubmVyKG1lc3NhZ2Upe1xyXG5cclxuICAgIGlmICghbWVzc2FnZSkgcmV0dXJuO1xyXG4gICAgaWYgKG1lc3NhZ2UgPT0gJycpIHJldHVybjtcclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuaW5mbyhtZXNzYWdlKTtcclxuICB9XHJcblxyXG4gIHRlc3REaXNhYmxlZChyb3csIGJ1dHRvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW57XHJcblxyXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpXHJcblxyXG4gICAgaWYgKGJ1dHRvbi5kaXNhYmxlZCl7XHJcblxyXG4gICAgICByZXR1cm4gYnV0dG9uLmRpc2FibGVkKHJvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHRlc3RWaXNpYmxlKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpXHJcblxyXG4gICAgaWYgKGJ1dHRvbi52aXNpYmxlKSB7XHJcblxyXG4gICAgICByZXR1cm4gYnV0dG9uLnZpc2libGUocm93KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvL0FjdGlvbnNcclxuXHJcblxyXG5cclxuICBsb2FkRGF0YShhY3Rpb246IEFjdGlvbiwgZGF0YTogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcImxvYWRpbmdcIilcclxuXHJcbiAgICBpZiAoYWN0aW9uKSB7XHJcblxyXG5cclxuXHJcblxyXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLkNhbGxBcGkoYWN0aW9uLCBkYXRhKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcubG9nUmVzcG9uc2Upe1xyXG4gICAgICAgICAgY29uc29sZS5sb2coYXBpUmVzcG9uc2UpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBhcGlSZXNwb25zZS5kYXRhXHJcblxyXG4gICAgICAgIHRoaXMudGFibGVEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KGFwaVJlc3BvbnNlLmRhdGEpO1xyXG4gICAgICAgIHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMudGFibGVQYWdpbmF0b3I7XHJcblxyXG4gICAgICAgIGlmIChhcGlSZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoYXBpUmVzcG9uc2UuZGF0YSk7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnRhYmxlUGFnaW5hdG9yO1xyXG5cclxuICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZChhcGlSZXNwb25zZS5kYXRhKTtcclxuXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vRXZlbnRzXHJcbiAgc2VhcmNoQ2xpY2tlZCh4KXtcclxuICAgIGNvbnNvbGUubG9nKFwiU2VhcmNoXCIpXHJcbiAgICB0aGlzLnNlYXJjaENsaWNrLmVtaXQoeCk7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coeClcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcuc2VhcmNoQ29uZmlnLnNlYXJjaEFjdGlvbil7XHJcbiAgICAgIHRoaXMuY29uZmlnLnNlYXJjaENvbmZpZy5zZWFyY2hBY3Rpb24ubWV0aG9kID09ICdwb3N0J1xyXG4gICAgICB0aGlzLmxvYWREYXRhKHRoaXMuY29uZmlnLnNlYXJjaENvbmZpZy5zZWFyY2hBY3Rpb24sIHgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaENsaWNrZWQoKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIlJlZnJlc2hcIilcclxuICAgIHRoaXMucmVmcmVzaENsaWNrLmVtaXQoKTtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvYWRBY3Rpb24pIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uLFwiXCIpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMuZGF0YUxvYWQuZW1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0YUxvYWRlZCh4KSB7XHJcblxyXG4gICAgdGhpcy5kYXRhTG9hZC5lbWl0KHgpXHJcblxyXG4gICAgY29uc29sZS5sb2coXCJkYXRhbG9hZGVkXCIpXHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLnRpbGVDb25maWc/LmxvYWRBY3Rpb24pIHtcclxuICAgICAgdGhpcy50aWxlUmVsb2FkLm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGFjdGlvbkNsaWNrZWQobmFtZSwgcm93KSB7XHJcblxyXG4gICAgaWYgKG5hbWUgPT0gJ3ZpZXcnKSB7XHJcbiAgICAgIHRoaXMudmlld01vZGVsKHJvdylcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG5hbWUgPT0gJ2VkaXQnKSB7XHJcbiAgICAgIHRoaXMuZWRpdE1vZGVsKHJvdyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChuYW1lID09ICdkZWxldGUnKSB7XHJcbiAgICAgIHRoaXMuZGVsZXRlTW9kZWwocm93KTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmN1c3RvbU1vZGVsKG5hbWUscm93KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICBjb2x1bW5DbGlja2VkKGNvbHVtbiA6IENvbHVtbiwgcm93KXtcclxuXHJcbiAgICBpZiAoY29sdW1uLmRldGFpbHNDb25maWcpe1xyXG5cclxuICAgICAgbGV0IGNvbmYgPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnByb2Nlc3NEZXRhaWxzQ29uZmlnKGNvbHVtbi5kZXRhaWxzQ29uZmlnLCByb3cpXHJcblxyXG5cclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXRhaWxzRGlhbG9nLCB7XHJcbiAgICAgICAgd2lkdGg6IFwiOTAwcHhcIixcclxuICAgICAgICBkYXRhOiBjb25mXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGNvbHVtbi5uYW1lLCByb3cpXHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGNvbHVtbi5uYW1lLCByb3cpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjdXN0b21Nb2RlbChuYW1lLCByb3cpIHtcclxuXHJcbiAgICBsZXQgYnV0dG9uID0gdGhpcy5nZXRCdXR0b24obmFtZSk7XHJcbiAgICBpZiAoYnV0dG9uKSB7XHJcblxyXG4gICAgICBpZiAoIWJ1dHRvbi5kaWFsb2cpe1xyXG4gICAgICAgIHRoaXMuZG9BY3Rpb24oYnV0dG9uLm5hbWUsIHJvdylcclxuICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KG5hbWUsIHJvdyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZXtcclxuXHJcbiAgICAgICAgaWYgKGJ1dHRvbi5kZXRhaWxzQ29uZmlnKSB7XHJcblxyXG4gICAgICAgICAgbGV0IGNvbmYgPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnByb2Nlc3NEZXRhaWxzQ29uZmlnKGJ1dHRvbi5kZXRhaWxzQ29uZmlnLCByb3cpXHJcblxyXG4gICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXRhaWxzRGlhbG9nLCB7XHJcbiAgICAgICAgICAgIHdpZHRoOiBcIjkwMHB4XCIsXHJcbiAgICAgICAgICAgIGRhdGE6IGNvbmZcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgPT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCByb3cpXHJcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdChidXR0b24ubmFtZSwgcm93KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KG5hbWUsIHJvdyk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgYWN0aW9uQ2xpY2tlZEVtaXQobmFtZSwgcm93KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkFjdGlvbiBjbGlja2VkXCIpXHJcbiAgICB0aGlzLmFjdGlvbkNsaWNrLmVtaXQoe25hbWU6bmFtZSxkYXRhIDogcm93fSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICB2aWV3TW9kZWwocm93KSB7XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJ2aWV3IENsaWNrZWRcIilcclxuXHJcbiAgICBsZXQgYnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ3ZpZXcnKTtcclxuXHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuO1xyXG5cclxuICAgIGlmICghYnV0dG9uLmRpYWxvZykge1xyXG4gICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCByb3cpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJQbGVhc2UgY29uZmlndXJlIGZvcm1cIilcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBsZXQgY29uZjogRGV0YWlsc0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgZm9ybUNvbmZpZzogdGhpcy5jb25maWcuZm9ybUNvbmZpZyxcclxuICAgICAgYnV0dG9uczogdGhpcy5jb25maWcuYnV0dG9ucyxcclxuICAgICAgZGV0YWlsczogcm93LFxyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24uZGV0YWlsc0NvbmZpZykge1xyXG4gICAgICBjb25mID0gRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5wcm9jZXNzRGV0YWlsc0NvbmZpZyhidXR0b24uZGV0YWlsc0NvbmZpZywgcm93KVxyXG4gICAgfVxyXG5cclxuICAgIGNvbmYuZm9ybUNvbmZpZy5tb2RlID0gXCJ2aWV3XCI7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXRhaWxzRGlhbG9nLCB7XHJcbiAgICAgIHdpZHRoOiBcIjkwMHB4XCIsXHJcbiAgICAgIGRhdGE6IGNvbmZcclxuICAgIH0pO1xyXG5cclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQubWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaENsaWNrZWQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBuZXdNb2RlbCgpIHtcclxuXHJcbiAgICBsZXQgYnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ2NyZWF0ZScpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuXHJcbiAgICBpZiAoIWJ1dHRvbi5kaWFsb2cpIHtcclxuICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdChidXR0b24ubmFtZSwgbnVsbCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1Db25maWcpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlBsZWFzZSBjb25maWd1cmUgZm9ybVwiKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb25maWcuZm9ybUNvbmZpZy5tb2RlID0gXCJjcmVhdGVcIjtcclxuICAgIGxldCBjb25mIDogRGV0YWlsc0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgZm9ybUNvbmZpZyA6IHRoaXMuY29uZmlnLmZvcm1Db25maWcsXHJcbiAgICAgIGJ1dHRvbnMgOiB0aGlzLmNvbmZpZy5idXR0b25zLFxyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24uZGV0YWlsc0NvbmZpZykge1xyXG4gICAgICBjb25mID0gYnV0dG9uLmRldGFpbHNDb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZi5mb3JtQ29uZmlnLm1vZGUgPSBcImNyZWF0ZVwiO1xyXG4gICAgY29uZi5oZXJvRmllbGQgPSB0aGlzLmNvbmZpZz8uaGVyb0ZpZWxkO1xyXG4gICAgY29uZi5oZXJvVmFsdWUgPSB0aGlzLmNvbmZpZz8uaGVyb1ZhbHVlO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGV0YWlsc0RpYWxvZywge1xyXG4gICAgICB3aWR0aDogXCI5MDBweFwiLFxyXG4gICAgICBkYXRhOiBjb25mLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnY3JlYXRlJyxyZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwiZW1pdFwiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnY3JlYXRlJyxyZXN1bHQuZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBlZGl0TW9kZWwocm93KSB7XHJcblxyXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdlZGl0Jyk7XHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuO1xyXG5cclxuICAgIGlmICghYnV0dG9uLmRpYWxvZykge1xyXG4gICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCByb3cpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJQbGVhc2UgY29uZmlndXJlIGZvcm1cIilcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjb25mOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICBmb3JtQ29uZmlnOiB0aGlzLmNvbmZpZy5mb3JtQ29uZmlnLFxyXG4gICAgICBidXR0b25zOiB0aGlzLmNvbmZpZy5idXR0b25zLFxyXG4gICAgICBkZXRhaWxzIDogcm93LFxyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24uZGV0YWlsc0NvbmZpZykge1xyXG4gICAgICBjb25mID0gRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5wcm9jZXNzRGV0YWlsc0NvbmZpZyhidXR0b24uZGV0YWlsc0NvbmZpZywgcm93KVxyXG4gICAgfVxyXG5cclxuICAgIGNvbmYuZm9ybUNvbmZpZy5tb2RlID0gXCJlZGl0XCI7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXRhaWxzRGlhbG9nLCB7XHJcbiAgICAgIHdpZHRoOiBcIjkwMHB4XCIsXHJcbiAgICAgIGRhdGE6IGNvbmZcclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuaW5wdXRDaGFuZ2Uuc3Vic2NyaWJlKCh4KSA9PiB7XHJcbiAgICAgIHRoaXMuaW5wdXRDaGFuZ2VkKHgpXHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxyXG4gICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgPT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KCdlZGl0JyxyZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwiZW1pdFwiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnZWRpdCcscmVzdWx0LmRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZU1vZGVsKHJvdykge1xyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbignZGVsZXRlJyk7XHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuO1xyXG5cclxuXHJcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNvbmZpcm0oYERFTEVURSA/YCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PSBcInllc1wiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnZGVsZXRlJywgcm93KVxyXG4gICAgICAgIHRoaXMuZG9BY3Rpb24oYnV0dG9uLm5hbWUscm93KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGRvQWN0aW9uKGJ1dHRvbk5hbWU6IHN0cmluZywgcm93KSB7XHJcblxyXG4gICAgbGV0IGIgPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKVxyXG5cclxuICAgIGlmICghYikgcmV0dXJuO1xyXG5cclxuICAgIGlmICghYi5hY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICBpZiAoYi5jb25maXJtKXtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5jb25maXJtKGAke2IuY29uZmlybS5tZXNzYWdlfWApLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PSBcInllc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWNBY3Rpb24oYixyb3cpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmV4ZWNBY3Rpb24oYiwgcm93KVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuICBleGVjQWN0aW9uKGI6IEJ1dHRvbiwgcm93KXtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaShiLmFjdGlvbiwgcm93KS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlKSA9PiB7XHJcblxyXG4gICAgICBpZiAoYXBpUmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgIGlmIChiLmFjdGlvbi5zdWNjZXNzTWVzc2FnZSkge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChiLmFjdGlvbi5zdWNjZXNzTWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiVXBkYXRlZFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaENsaWNrZWQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJFcnJvcjogXCIgKyBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIiwiXG48c3BhLXNlYXJjaCAqbmdJZj1cImNvbmZpZy5zZWFyY2hDb25maWdcIiBbY29uZmlnXT1cImNvbmZpZy5zZWFyY2hDb25maWdcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7XCIgKHNlYXJjaENsaWNrKT1cInNlYXJjaENsaWNrZWQoJGV2ZW50KVwiPjwvc3BhLXNlYXJjaD5cblxuPGRpdiBjbGFzcz1cInRvcFwiPlxuXG4gIDxkaXYgY2xhc3M9XCJ0aW4tcm93XCIgPlxuICAgIDxidXR0b24gKm5nSWY9XCJjcmVhdGVCdXR0b24gJiYgIWNvbmZpZy5mbGF0QnV0dG9uc1wiIGlkPVwiYnRuTmV3XCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgKGNsaWNrKT1cIm5ld01vZGVsKClcIj57e2NyZWF0ZUJ1dHRvbi5kaXNwbGF5fX08L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiY3JlYXRlQnV0dG9uICYmIGNvbmZpZy5mbGF0QnV0dG9uc1wiIGlkPVwiYnRuTmV3XCIgbWF0LXN0cm9rZWQtYnV0dG9uIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4OyBjb2xvcjogZ3JlZW47XCIgKGNsaWNrKT1cIm5ld01vZGVsKClcIj57e2NyZWF0ZUJ1dHRvbi5kaXNwbGF5fX08L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImNvbmZpZy50aWxlQ29uZmlnICYmICFzbWFsbFNjcmVlblwiIHN0eWxlPVwibWluLXdpZHRoOiA3NSU7XCI+XG4gICAgPHNwYS10aWxlcyAgW3JlbG9hZF09XCJ0aWxlUmVsb2FkXCIgW2NvbmZpZ109XCJjb25maWcudGlsZUNvbmZpZ1wiPjwvc3BhLXRpbGVzPlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnNob3dGaWx0ZXJcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgPHNwYS1maWx0ZXIgW3Nob3dUZXh0XT1cIiFzbWFsbFNjcmVlbiB8fCAoc21hbGxTY3JlZW4gJiYgZGF0YVNvdXJjZT8ubGVuZ3RoID4gMTApXCIgW3Nob3dCdXR0b25dPVwic2hvd0ZpbHRlckJ1dHRvblwiIFtkYXRhXT1cInRhYmxlRGF0YVNvdXJjZVwiIFtmbGF0QnV0dG9uc109XCJjb25maWcuZmxhdEJ1dHRvbnNcIiAocmVmcmVzaENsaWNrKT1cInJlZnJlc2hDbGlja2VkKClcIj48L3NwYS1maWx0ZXI+XG4gIDwvZGl2PlxuXG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImNvbmZpZy50aWxlQ29uZmlnICYmIHNtYWxsU2NyZWVuXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgPHNwYS10aWxlcyBbcmVsb2FkXT1cInRpbGVSZWxvYWRcIiBbY29uZmlnXT1cImNvbmZpZy50aWxlQ29uZmlnXCI+PC9zcGEtdGlsZXM+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImNvbmZpZy50aXRsZSAmJiAhaGlkZVRpdGxlXCIgY2xhc3M9XCJ0aXRsZVwiPlxuICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IGxhcmdlcjtcIj57e2NvbmZpZy50aXRsZSB8IGNhbWVsVG9Xb3Jkc319PC9sYWJlbD5cbjwvZGl2PlxuXG48ZGl2PlxuXG4gIDxwICpuZ0lmPVwiIWNvbmZpZ1wiPjxlbT5Db25maWd1cmUgVGFibGU8L2VtPjwvcD5cbiAgPHAgKm5nSWY9XCIhZGF0YVNvdXJjZVwiPjxlbT5Mb2FkaW5nLi4uPC9lbT48L3A+XG5cblxuXG4gIDxkaXYgKm5nSWY9XCJkYXRhU291cmNlICYmICghc21hbGxTY3JlZW4gfHwgKHNtYWxsU2NyZWVuICYmIGRhdGFTb3VyY2U/Lmxlbmd0aCA+IDApKVwiPlxuXG5cbiAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInRhYmxlRGF0YVNvdXJjZVwiICBbbmdDbGFzc109XCJlbGV2YXRpb25cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb25maWcuY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiA+e3sgY29sdW1uLmFsaWFzID8/IGNvbHVtbi5uYW1lIHwgY2FtZWxUb1dvcmRzIH19PC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztcIiBjbGFzcz1cInJpZ2h0LXBhZGRpbmdcIiA+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4udHlwZVwiPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XG4gICAgICAgICAgICAgIDxzcGEtY2hlY2sgW3ZhbHVlXT1cInJvd1tjb2x1bW4ubmFtZV1cIiBbcmVhZG9ubHldPVwidHJ1ZVwiPjwvc3BhLWNoZWNrPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwiY29sdW1uLmljb24gJiYgdGVzdEljb25Db25kaXRpb24ocm93LCBjb2x1bW4uaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbY29sdW1uLmljb24udGlwRmllbGRdID8/IGNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6Y29sdW1uLmljb24/LmNvbG9yfVwiPnt7Y29sdW1uLmljb24ubmFtZSB9fTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjb2x1bW4uaWNvbnNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwidGVzdEljb25Db25kaXRpb24ocm93LCBpY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tpY29uLnRpcEZpZWxkXSA/PyBpY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tpY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzppY29uPy5jb2xvcn1cIj57e2ljb24ubmFtZSB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWxlY3QnXCI+XG4gICAgICAgICAgICAgIDxzcGEtc2VsZWN0IFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW29wdGlvbkRpc3BsYXldPVwiY29sdW1uLm9wdGlvbkRpc3BsYXlcIiBbb3B0aW9uVmFsdWVdPVwiY29sdW1uLm9wdGlvblZhbHVlXCIgWyh2YWx1ZSldPVwicm93W2NvbHVtbi5uYW1lXVwiIHdpZHRoPVwiOTAlXCIgPjwvc3BhLXNlbGVjdD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hpcCdcIj5cbiAgICAgICAgICAgICAgPG1hdC1jaGlwLWxpc3Q+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGlwIChjbGljayk9XCJjb2x1bW5DbGlja2VkKGNvbHVtbiwgcm93KVwiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6IHRlc3RDb2xvckNvbmRpdGlvbihyb3csIGNvbHVtbi5jb2xvcikgPyBjb2x1bW4uY29sb3IubmFtZSA6IGdldENvbG9yKHJvd1tjb2x1bW4ubmFtZV0sIGNvbHVtbj8ub3B0aW9ucyl9XCIgc3R5bGU9XCJmb250LXNpemU6IDEycHg7XCI+IHt7cm93W2NvbHVtbi5uYW1lXX19IDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwiY29sdW1uLmljb24gJiYgdGVzdEljb25Db25kaXRpb24ocm93LCBjb2x1bW4uaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbY29sdW1uLmljb24udGlwRmllbGRdID8/IGNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6Y29sdW1uLmljb24/LmNvbG9yfVwiPnt7Y29sdW1uLmljb24ubmFtZSB9fTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ljb24nXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICAgIHt7cm93W2NvbHVtbi5uYW1lXSB8IGRhdGUgOiAnZGQvTU0veXl5eSd9fVxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwiY29sdW1uLmljb24gJiYgdGVzdEljb25Db25kaXRpb24ocm93LCBjb2x1bW4uaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbY29sdW1uLmljb24udGlwRmllbGRdID8/IGNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6Y29sdW1uLmljb24/LmNvbG9yfVwiPnt7Y29sdW1uLmljb24ubmFtZSB9fTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjb2x1bW4uaWNvbnNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwidGVzdEljb25Db25kaXRpb24ocm93LCBpY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tpY29uLnRpcEZpZWxkXSA/PyBpY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tpY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzppY29uPy5jb2xvcn1cIj57e2ljb24ubmFtZSB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIj5cbiAgICAgICAgICAgICAge3tyb3dbY29sdW1uLm5hbWVdIHwgZGF0ZSA6ICdkZC9NTS95eXl5IEhIOm1tJ319XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3Bpbm5lcidcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjIwXCI+XG5cbiAgICAgICAgICAgICAgICA8L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbW9uZXknXCI+XG5cbiAgICAgICAgICAgICAgPGxhYmVsIFtuZ1N0eWxlXT1cInsnY29sb3InOiB0ZXN0Q29sb3JDb25kaXRpb24ocm93LCBjb2x1bW4uY29sb3IpID8gY29sdW1uLmNvbG9yLm5hbWUgOiAnJ31cIj57e3Jvd1tjb2x1bW4ubmFtZV0gfCBjdXJyZW5jeTonJzonJ319PC9sYWJlbD5cblxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwiY29sdW1uLmljb24gJiYgdGVzdEljb25Db25kaXRpb24ocm93LCBjb2x1bW4uaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbY29sdW1uLmljb24udGlwRmllbGRdID8/IGNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6Y29sdW1uLmljb24/LmNvbG9yfVwiPnt7Y29sdW1uLmljb24ubmFtZSB9fTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjb2x1bW4uaWNvbnNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwidGVzdEljb25Db25kaXRpb24ocm93LCBpY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tpY29uLnRpcEZpZWxkXSA/PyBpY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tpY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzppY29uPy5jb2xvcn1cIj57e2ljb24ubmFtZSB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIididXR0b24nXCI+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFtuZ1N0eWxlXT1cInsnY29sb3InOiB0ZXN0Q29sb3JDb25kaXRpb24ocm93LCBjb2x1bW4uY29sb3IpID8gY29sdW1uLmNvbG9yLm5hbWUgOiAnJ31cIiAoY2xpY2spPVwiYWN0aW9uQ2xpY2tlZChjb2x1bW4ubmFtZSwgcm93KVwiPnt7cm93W2NvbHVtbi5uYW1lXX19PC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cImNvbHVtbi5pY29uICYmIHRlc3RJY29uQ29uZGl0aW9uKHJvdywgY29sdW1uLmljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSA/PyBjb2x1bW4uaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbY29sdW1uLmljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbaWNvbi50aXBGaWVsZF0gPz8gaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgICAgIDxsYWJlbCBbbmdTdHlsZV09XCJ7J2NvbG9yJzogdGVzdENvbG9yQ29uZGl0aW9uKHJvdywgY29sdW1uLmNvbG9yKSA/IGNvbHVtbi5jb2xvci5uYW1lIDogJyd9XCI+e3tyb3dbY29sdW1uLm5hbWVdfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwiY29sdW1uLmljb24gJiYgdGVzdEljb25Db25kaXRpb24ocm93LCBjb2x1bW4uaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbY29sdW1uLmljb24udGlwRmllbGRdID8/IGNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0pXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFjdGlvbiA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW25nU3R5bGVdPVwie3dpZHRoOmZhbHNlID8gJzUwcHgnIDogYWN0aW9uc1dpZHRofVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9ucy1jb250YWluZXJcIj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGRpc3BsYXllZEJ1dHRvbnNcIj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnV0dG9uLm5hbWUgIT0gJ2NyZWF0ZScgJiYgdGVzdFZpc2libGUocm93LGJ1dHRvbi5uYW1lKVwiPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFjb25maWcuZmxhdEJ1dHRvbnNcIiBtYXQtbWluaS1mYWIgW21hdFRvb2x0aXBdPVwiYnV0dG9uLnRpcCA/PyBidXR0b24ubmFtZSBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjVweFwiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOmdldEJ1dHRvbkNvbG9yKGJ1dHRvbiwgcm93KX1cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRlc3REaXNhYmxlZChyb3csYnV0dG9uLm5hbWUpXCIgKGNsaWNrKT1cImFjdGlvbkNsaWNrZWQoYnV0dG9uLm5hbWUsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj57e2dldEljb24oYnV0dG9uLm5hbWUpfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5mbGF0QnV0dG9uc1wiIG1hdC1pY29uLWJ1dHRvbiBbbWF0VG9vbHRpcF09XCJidXR0b24udGlwID8/IGJ1dHRvbi5uYW1lIFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NXB4XCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQocm93LGJ1dHRvbi5uYW1lKVwiIChjbGljayk9XCJhY3Rpb25DbGlja2VkKGJ1dHRvbi5uYW1lLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gW25nU3R5bGVdPVwieydjb2xvcic6Z2V0QnV0dG9uQ29sb3IoYnV0dG9uLCByb3cpfVwiPnt7Z2V0SWNvbihidXR0b24ubmFtZSl9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJ1dHRvbi5uYW1lICE9ICdjcmVhdGUnICYmICF0ZXN0VmlzaWJsZShyb3csYnV0dG9uLm5hbWUpICYmICFjb25maWcuY29sbGFwc2VCdXR0b25zXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAzNXB4O1wiPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuXG5cblxuXG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCIgW25nQ2xhc3NdPVwieydtYWtlLWdyYXknOiBjb25maWcuZ3JleU91dCAmJiBjb25maWcuZ3JleU91dChyb3cpfVwiPjwvdHI+XG4gICAgPC90YWJsZT5cblxuICA8L2Rpdj5cblxuICA8bWF0LXBhZ2luYXRvciAqbmdJZj1cImRhdGFTb3VyY2UgJiYgKCFzbWFsbFNjcmVlbiB8fCAoc21hbGxTY3JlZW4gJiYgZGF0YVNvdXJjZT8ubGVuZ3RoID4gMCkpXCIgI3RhYmxlUGFnaW5hdG9yIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzEwLCAyMCwgNTBdXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM+PC9tYXQtcGFnaW5hdG9yPlxuXG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInRpbi1jZW50ZXJcIj5cbiAgPHAgKm5nSWY9XCJkYXRhU291cmNlPy5sZW5ndGggPT0gMFwiPjxlbT5ObyBEYXRhPC9lbT48L3A+XG48L2Rpdj5cblxuXG5cbiJdfQ==
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsT0FBTyxFQUFzRCxVQUFVLEVBQWtDLE1BQU0sdUJBQXVCLENBQUM7QUFJdkksT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzFELE9BQU8sRUFBUSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVcvQixNQUFNLE9BQU8sY0FBYztJQUV6QixZQUFvQixXQUEyQixFQUFVLGNBQThCLEVBQVUsa0JBQXNDLEVBQVMsTUFBaUIsRUFDdkosYUFBNEIsRUFBVSxhQUE0QixFQUFVLGtCQUFzQyxFQUFVLGdCQUFrQztRQURwSixnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUN2SixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFVLHFCQUFnQixH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QUM7YUFDNUQ7UUFDSCxDQUFDLEVBQ0MsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFHRCxNQUFNO0lBQ0UsaUJBQWlCLENBQUMsU0FBaUI7UUFFekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN0QixJQUFJLFNBQVMsSUFBSSxNQUFNLEVBQUM7WUFDdEIsT0FBTyxFQUFFLENBQUE7U0FDVjthQUNJLElBQUksU0FBUyxJQUFJLEtBQUssRUFBQztZQUMxQixPQUFPLGtCQUFrQixDQUFBO1NBQzFCO2FBQ0ksSUFBSSxTQUFTLElBQUksUUFBUSxFQUFDO1lBQzdCLE9BQU8sa0JBQWtCLENBQUE7U0FDMUI7YUFDSSxJQUFJLFNBQVMsSUFBSSxNQUFNLEVBQUM7WUFDM0IsT0FBTyxrQkFBa0IsQ0FBQTtTQUMxQjthQUNHO1lBQ0YsT0FBTyxrQkFBa0IsQ0FBQTtTQUMxQjtJQUVILENBQUM7OzJHQTFaVSxjQUFjOytGQUFkLGNBQWMsK2JDdEIzQixzcEZBa0VBOzJGRDVDYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFdBQVc7bVRBNkNRLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUVsQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgRGF0ZVBpcGUsIEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEFjdGlvbiwgQnV0dG9uLCBDb2xvciwgQ29sdW1uLCBEZXRhaWxzRGlhbG9nQ29uZmlnLCBGb3JtQ29uZmlnLCBJY29uLCBUYWJsZUNvbmZpZywgQXBpUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IERldGFpbHNEaWFsb2cgfSBmcm9tICcuL2RldGFpbHNEaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQnJlYWtwb2ludE9ic2VydmVyLCBCcmVha3BvaW50U3RhdGUgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2VMaWIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhbGliLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JlLCBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9UaW5Db3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBCdXR0b25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYnV0dG9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUYWJsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmRpdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25kaXRpb24uc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NwYS10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2VMaWIsIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLCBwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyLCBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGJ1dHRvblNlcnZpY2U6IEJ1dHRvblNlcnZpY2UsIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSwgcHJpdmF0ZSB0YWJsZUNvbmZpZ1NlcnZpY2U6IFRhYmxlQ29uZmlnU2VydmljZSwgcHJpdmF0ZSBjb25kaXRpb25TZXJ2aWNlOiBDb25kaXRpb25TZXJ2aWNlIClcclxuICB7XHJcbiAgICAvLyBkZXRlY3Qgc2NyZWVuIHNpemUgY2hhbmdlc1xyXG4gICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZShbXCIobWF4LXdpZHRoOiA2MDBweClcIl0pLnN1YnNjcmliZSgocmVzdWx0OiBCcmVha3BvaW50U3RhdGUpID0+IHtcclxuICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IHJlc3VsdC5tYXRjaGVzO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRhYmxlQ29uZmlndXJhdGlvbigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5sb2FkQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZGF0YTtcclxuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4odGhpcy5kYXRhU291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy50YWJsZVBhZ2luYXRvcjsgfSwgMTAwMClcclxuICB9XHJcblxyXG5cclxuICBlbGV2YXRpb24gPSBcIm1hdC1lbGV2YXRpb24tejVcIjtcclxuICBhY3Rpb25zV2lkdGggPSBcIjUwcHhcIjtcclxuICBzaG93RmlsdGVyQnV0dG9uID0gdHJ1ZTtcclxuICB0aWxlUmVsb2FkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgc21hbGxTY3JlZW4gPSBmYWxzZVxyXG4gIGNyZWF0ZUJ1dHRvbjogQnV0dG9uO1xyXG5cclxuICAvL1RhYmxlXHJcbiAgdGFibGVEYXRhU291cmNlO1xyXG4gIGRhdGFTb3VyY2U6IGFueVtdO1xyXG4gIGRpc3BsYXllZENvbHVtbnMgPSBbXVxyXG4gIGRpc3BsYXllZEJ1dHRvbnMgPSBbXVxyXG5cclxuICBAVmlld0NoaWxkKCd0YWJsZVBhZ2luYXRvcicpIHRhYmxlUGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XHJcblxyXG4gIEBJbnB1dCgpIGhpZGVUaXRsZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRhdGE6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNvbmZpZzogVGFibGVDb25maWc7XHJcbiAgQElucHV0KCkgcmVsb2FkOiBTdWJqZWN0PGJvb2xlYW4+O1xyXG4gIEBPdXRwdXQoKSBkYXRhTG9hZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgcmVmcmVzaENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBzZWFyY2hDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgY3JlYXRlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGFjdGlvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBpbnB1dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCkge1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUNvbmZpZ3VyYXRpb24oKTtcclxuICAgIHRoaXMuc2V0dXBEYXRhTG9hZGluZygpO1xyXG4gICAgdGhpcy5mb3JtRGVmYXVsdHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGFibGVDb25maWd1cmF0aW9uKCkge1xyXG4gICAgdGhpcy5lbGV2YXRpb24gPSB0aGlzLmdldEVsZXZhdGlvbkNsYXNzKHRoaXMuY29uZmlnPy5lbGV2YXRpb24pO1xyXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy50YWJsZUNvbmZpZ1NlcnZpY2Uuc2V0Q29sdW1ucyh0aGlzLmNvbmZpZywgdGhpcy5zbWFsbFNjcmVlbik7XHJcbiAgICB0aGlzLmRpc3BsYXllZEJ1dHRvbnMgPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0RGlzcGxheWVkQnV0dG9ucyh0aGlzLmNvbmZpZz8uYnV0dG9ucywgdGhpcy5zbWFsbFNjcmVlbiwgdGhpcy5jb25maWc/Lm1pbkJ1dHRvbnMpO1xyXG4gICAgdGhpcy5hY3Rpb25zV2lkdGggPSB0aGlzLnRhYmxlQ29uZmlnU2VydmljZS5nZXRBY3Rpb25zV2lkdGgodGhpcy5kaXNwbGF5ZWRCdXR0b25zKTtcclxuICAgIHRoaXMuY3JlYXRlQnV0dG9uID0gdGhpcy5idXR0b25TZXJ2aWNlLmdldENyZWF0ZUJ1dHRvbih0aGlzLmNvbmZpZz8uYnV0dG9ucyk7XHJcbiAgICB0aGlzLnNob3dGaWx0ZXJCdXR0b24gPSAhdGhpcy5jb25maWc/LnNlYXJjaENvbmZpZztcclxuXHJcbiAgICBpZiAodGhpcy5kaXNwbGF5ZWRCdXR0b25zPy5sZW5ndGggPiAwICYmICF0aGlzLmRpc3BsYXllZENvbHVtbnMuaW5jbHVkZXMoJ2FjdGlvbicpKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5wdXNoKCdhY3Rpb24nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBEYXRhTG9hZGluZygpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGEodGhpcy5jb25maWcubG9hZEFjdGlvbiwgXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVsb2FkKSB7XHJcbiAgICAgIHRoaXMucmVsb2FkLnN1YnNjcmliZSh2ID0+IHtcclxuICAgICAgICBpZiAodiAmJiB0aGlzLmNvbmZpZz8ubG9hZEFjdGlvbikge1xyXG4gICAgICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZERhdGEoYWN0aW9uOiBBY3Rpb24sIGRhdGE6IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nXCIpXHJcblxyXG4gICAgaWYgKGFjdGlvbikge1xyXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLkNhbGxBcGkoYWN0aW9uLCBkYXRhKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcubG9nUmVzcG9uc2UpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGFwaVJlc3BvbnNlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gYXBpUmVzcG9uc2UuZGF0YVxyXG5cclxuICAgICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihhcGlSZXNwb25zZS5kYXRhKTtcclxuICAgICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnRhYmxlUGFnaW5hdG9yO1xyXG5cclxuICAgICAgICBpZiAoYXBpUmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGFwaVJlc3BvbnNlLmRhdGEpO1xyXG4gICAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy50YWJsZVBhZ2luYXRvcjtcclxuXHJcbiAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQoYXBpUmVzcG9uc2UuZGF0YSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBpbnB1dENoYW5nZWQoZXZlbnQpIHtcclxuICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh7IGZpZWxkOiBldmVudC5maWVsZCwgdmFsdWU6IGV2ZW50LnZhbHVlIH0pXHJcbiAgfVxyXG5cclxuICBmb3JtRGVmYXVsdHMoKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtQ29uZmlnKSB7XHJcbiAgICAgIGxldCBjb25maWcgPSBuZXcgRm9ybUNvbmZpZ1xyXG5cclxuICAgICAgY29uZmlnLmZpZWxkcyA9IFtdXHJcblxyXG4gICAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkID0geyBuYW1lOiBjb2x1bW4ubmFtZSwgdHlwZTogY29sdW1uLnR5cGUgfVxyXG4gICAgICAgIGNvbmZpZy5maWVsZHMucHVzaChmaWVsZClcclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcuZm9ybUNvbmZpZyA9IGNvbmZpZztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldENvbHVtbnMoKSB7XHJcbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLnRhYmxlQ29uZmlnU2VydmljZS5zZXRDb2x1bW5zKHRoaXMuY29uZmlnLCB0aGlzLnNtYWxsU2NyZWVuKTtcclxuICAgIHRoaXMuZGlzcGxheWVkQnV0dG9ucyA9IHRoaXMuYnV0dG9uU2VydmljZS5nZXREaXNwbGF5ZWRCdXR0b25zKHRoaXMuY29uZmlnLmJ1dHRvbnMsIHRoaXMuc21hbGxTY3JlZW4sIHRoaXMuY29uZmlnLm1pbkJ1dHRvbnMpO1xyXG4gICAgdGhpcy5hY3Rpb25zV2lkdGggPSB0aGlzLnRhYmxlQ29uZmlnU2VydmljZS5nZXRBY3Rpb25zV2lkdGgodGhpcy5kaXNwbGF5ZWRCdXR0b25zKTtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNwbGF5ZWRCdXR0b25zLmxlbmd0aCA+IDAgJiYgIXRoaXMuZGlzcGxheWVkQ29sdW1ucy5pbmNsdWRlcygnYWN0aW9uJykpIHtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goJ2FjdGlvbicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0QnV0dG9ucygpe1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5idXR0b25zKSByZXR1cm5cclxuICAgIGlmICghdGhpcy5zbWFsbFNjcmVlbil7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQnV0dG9ucyA9IHRoaXMuY29uZmlnLmJ1dHRvbnM7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRCdXR0b25zID0gdGhpcy5jb25maWcuYnV0dG9ucztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbihuYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0QnV0dG9uKHRoaXMuY29uZmlnLmJ1dHRvbnMsIG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SWNvbihidXR0b25OYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uU2VydmljZS5nZXRJY29uKGJ1dHRvbiwgdGhpcy5jb25maWcpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QnV0dG9uQ29sb3IoYnV0dG9uOiBCdXR0b24sIHJvdykge1xyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uU2VydmljZS5nZXRCdXR0b25Db2xvcihidXR0b24sIHJvdyk7XHJcbiAgfVxyXG5cclxuICBnZXRPcHRpb25zKGNvbHVtbil7XHJcbiAgICBsZXQgeCA9IHRoaXMuY29uZmlnLmNvbHVtbnMuZmluZChvcHQgPT4gb3B0Lm5hbWUgPT09IGNvbHVtbik7XHJcbiAgICByZXR1cm4gIHhcclxuICB9XHJcblxyXG4gIGdldENvbG9yKHZhbHVlOiBhbnksIG9wdGlvbnM6IGFueVtdKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblNlcnZpY2UuZ2V0Q29sb3IodmFsdWUsIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgdGVzdEljb25Db25kaXRpb24ocm93OiBhbnksIGljb246IEljb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblNlcnZpY2UudGVzdEljb25Db25kaXRpb24oaWNvbiwgcm93KTtcclxuICB9XHJcblxyXG4gIHRlc3RDb2xvckNvbmRpdGlvbihyb3c6IGFueSwgY29sb3I6IENvbG9yKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TZXJ2aWNlLnRlc3RDb2xvckNvbmRpdGlvbihjb2xvciwgcm93KTtcclxuICB9XHJcblxyXG4gIHNob3dCYW5uZXIobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlICE9PSAnJykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmluZm8obWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0ZXN0RGlzYWJsZWQocm93LCBidXR0b25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uU2VydmljZS50ZXN0RGlzYWJsZWQoYnV0dG9uLCByb3cpO1xyXG4gIH1cclxuXHJcbiAgdGVzdFZpc2libGUocm93LCBidXR0b25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uU2VydmljZS50ZXN0VmlzaWJsZShidXR0b24sIHJvdyk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vRXZlbnRzXHJcbiAgc2VhcmNoQ2xpY2tlZCh4KXtcclxuICAgIGNvbnNvbGUubG9nKFwiU2VhcmNoXCIpXHJcbiAgICB0aGlzLnNlYXJjaENsaWNrLmVtaXQoeCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLnNlYXJjaENvbmZpZy5zZWFyY2hBY3Rpb24pe1xyXG4gICAgICB0aGlzLmNvbmZpZy5zZWFyY2hDb25maWcuc2VhcmNoQWN0aW9uLm1ldGhvZCA9PSAncG9zdCdcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmNvbmZpZy5zZWFyY2hDb25maWcuc2VhcmNoQWN0aW9uLCB4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hDbGlja2VkKCkge1xyXG4gICAgY29uc29sZS5sb2coXCJSZWZyZXNoXCIpXHJcbiAgICB0aGlzLnJlZnJlc2hDbGljay5lbWl0KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvYWRBY3Rpb24pIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uLFwiXCIpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMuZGF0YUxvYWQuZW1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0YUxvYWRlZCh4KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcImRhdGFsb2FkZWRcIilcclxuICAgIHRoaXMuZGF0YUxvYWQuZW1pdCh4KVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy50aWxlQ29uZmlnPy5sb2FkQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMudGlsZVJlbG9hZC5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWN0aW9uQ2xpY2tlZChuYW1lOiBzdHJpbmcsIHJvdzogYW55KSB7XHJcbiAgICBpZiAobmFtZSA9PT0gJ3ZpZXcnKSB7XHJcbiAgICAgIHRoaXMudmlld01vZGVsKHJvdyk7XHJcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdlZGl0Jykge1xyXG4gICAgICB0aGlzLmVkaXRNb2RlbChyb3cpO1xyXG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAnZGVsZXRlJykge1xyXG4gICAgICB0aGlzLmRlbGV0ZU1vZGVsKHJvdyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1c3RvbU1vZGVsKG5hbWUsIHJvdyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy9EaWFsb2cgZXZlbnRzXHJcbiAgY29sdW1uQ2xpY2tlZChjb2x1bW4gOiBDb2x1bW4sIHJvdyl7XHJcbiAgICBpZiAoY29sdW1uLmRldGFpbHNDb25maWcpIHtcclxuICAgICAgdGhpcy5vcGVuRGV0YWlsc0RpYWxvZyhjb2x1bW4ubmFtZSwgcm93LCBjb2x1bW4pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdChjb2x1bW4ubmFtZSwgcm93KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGN1c3RvbU1vZGVsKG5hbWUsIHJvdykge1xyXG4gICAgdGhpcy5vcGVuRGV0YWlsc0RpYWxvZyhuYW1lLCByb3cpO1xyXG4gIH1cclxuXHJcblxyXG4gIGFjdGlvbkNsaWNrZWRFbWl0KG5hbWUsIHJvdykge1xyXG4gICAgY29uc29sZS5sb2coXCJBY3Rpb24gY2xpY2tlZFwiKVxyXG4gICAgdGhpcy5hY3Rpb25DbGljay5lbWl0KHtuYW1lOm5hbWUsZGF0YSA6IHJvd30pO1xyXG4gIH1cclxuXHJcbiAgdmlld01vZGVsKHJvdykge1xyXG4gICAgY29uc29sZS5sb2coXCJ2aWV3IENsaWNrZWRcIik7XHJcbiAgICB0aGlzLm9wZW5EZXRhaWxzRGlhbG9nKCd2aWV3Jywgcm93KTtcclxuICB9XHJcblxyXG4gIG5ld01vZGVsKCkge1xyXG4gICAgdGhpcy5vcGVuRGV0YWlsc0RpYWxvZygnY3JlYXRlJywgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBlZGl0TW9kZWwocm93KSB7XHJcbiAgICB0aGlzLm9wZW5EZXRhaWxzRGlhbG9nKCdlZGl0Jywgcm93KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkRldGFpbHNEaWFsb2coYnV0dG9uTmFtZTogc3RyaW5nLCByb3c6IGFueSB8IG51bGwsIGNvbHVtbj86IENvbHVtbik6IHZvaWQge1xyXG4gICAgY29uc3QgYnV0dG9uID0gY29sdW1uID8geyBuYW1lOiBjb2x1bW4ubmFtZSwgZGlhbG9nOiB0cnVlLCBkZXRhaWxzQ29uZmlnOiBjb2x1bW4uZGV0YWlsc0NvbmZpZyB9IDogdGhpcy5nZXRCdXR0b24oYnV0dG9uTmFtZSk7XHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuO1xyXG5cclxuICAgIGlmICghYnV0dG9uLmRpYWxvZykge1xyXG4gICAgICB0aGlzLmRvQWN0aW9uKGJ1dHRvbi5uYW1lLCByb3cpXHJcbiAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQoYnV0dG9uLm5hbWUsIHJvdyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1Db25maWcgJiYgIWJ1dHRvbi5kZXRhaWxzQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJQbGVhc2UgY29uZmlndXJlIGZvcm1cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29uZjogRGV0YWlsc0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgZm9ybUNvbmZpZzogdGhpcy5jb25maWcuZm9ybUNvbmZpZyxcclxuICAgICAgYnV0dG9uczogdGhpcy5jb25maWcuYnV0dG9ucyxcclxuICAgICAgZGV0YWlsczogcm93LFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoYnV0dG9uLmRldGFpbHNDb25maWcpIHtcclxuICAgICAgY29uZiA9IGJ1dHRvbk5hbWUgPT09ICdjcmVhdGUnXHJcbiAgICAgICAgPyBidXR0b24uZGV0YWlsc0NvbmZpZ1xyXG4gICAgICAgIDogRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5wcm9jZXNzRGV0YWlsc0NvbmZpZyhidXR0b24uZGV0YWlsc0NvbmZpZywgcm93KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25mLmZvcm1Db25maWcubW9kZSA9IGJ1dHRvbk5hbWUgPT09ICdjcmVhdGUnID8gJ2NyZWF0ZScgOiAoYnV0dG9uTmFtZSA9PT0gJ2VkaXQnID8gJ2VkaXQnIDogJ3ZpZXcnKTtcclxuXHJcbiAgICBpZiAoYnV0dG9uTmFtZSA9PT0gJ2NyZWF0ZScpIHtcclxuICAgICAgY29uZi5oZXJvRmllbGQgPSB0aGlzLmNvbmZpZz8uaGVyb0ZpZWxkO1xyXG4gICAgICBjb25mLmhlcm9WYWx1ZSA9IHRoaXMuY29uZmlnPy5oZXJvVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVzdWx0ID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5EZXRhaWxzRGlhbG9nKGNvbmYsIERldGFpbHNEaWFsb2cpO1xyXG5cclxuICAgIGlmIChidXR0b25OYW1lID09PSAnZWRpdCcpIHtcclxuICAgICAgZGlhbG9nUmVzdWx0LmlucHV0Q2hhbmdlLnN1YnNjcmliZSgoeCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VkKHgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkaWFsb2dSZXN1bHQuYWZ0ZXJDbG9zZWQuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCByZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5tZXNzYWdlID09PSAnZW1pdCcpIHtcclxuICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCByZXN1bHQuZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlTW9kZWwocm93KSB7XHJcblxyXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdkZWxldGUnKTtcclxuICAgIGlmICghYnV0dG9uKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5jb25maXJtKGBERUxFVEUgP2ApLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQgPT0gXCJ5ZXNcIikge1xyXG4gICAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQoJ2RlbGV0ZScsIHJvdylcclxuICAgICAgICB0aGlzLmRvQWN0aW9uKGJ1dHRvbi5uYW1lLHJvdyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvL0FjdGlvbnNcclxuICBkb0FjdGlvbihidXR0b25OYW1lOiBzdHJpbmcsIHJvdykge1xyXG5cclxuICAgIGxldCBiID0gdGhpcy5nZXRCdXR0b24oYnV0dG9uTmFtZSlcclxuXHJcbiAgICBpZiAoIWIpIHJldHVybjtcclxuICAgIGlmICghYi5hY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICBpZiAoYi5jb25maXJtKXtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5jb25maXJtKGAke2IuY29uZmlybS5tZXNzYWdlfWApLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PSBcInllc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWNBY3Rpb24oYixyb3cpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmV4ZWNBY3Rpb24oYiwgcm93KVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGV4ZWNBY3Rpb24oYjogQnV0dG9uLCByb3cpe1xyXG4gICAgdGhpcy5kYXRhU2VydmljZS5DYWxsQXBpKGIuYWN0aW9uLCByb3cpLnN1YnNjcmliZSgoYXBpUmVzcG9uc2UpID0+IHtcclxuXHJcbiAgICAgIGlmIChhcGlSZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgaWYgKGIuYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KGIuYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlVwZGF0ZWRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIkVycm9yOiBcIiArIGFwaVJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vTWlzY1xyXG4gIHByaXZhdGUgZ2V0RWxldmF0aW9uQ2xhc3MoZWxldmF0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKGVsZXZhdGlvbilcclxuICAgIGlmIChlbGV2YXRpb24gPT0gXCJub25lXCIpe1xyXG4gICAgICByZXR1cm4gXCJcIlxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZWxldmF0aW9uID09IFwibG93XCIpe1xyXG4gICAgICByZXR1cm4gXCJtYXQtZWxldmF0aW9uLXoxXCJcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGVsZXZhdGlvbiA9PSBcIm1lZGl1bVwiKXtcclxuICAgICAgcmV0dXJuIFwibWF0LWVsZXZhdGlvbi16NVwiXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChlbGV2YXRpb24gPT0gXCJoaWdoXCIpe1xyXG4gICAgICByZXR1cm4gXCJtYXQtZWxldmF0aW9uLXo5XCJcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIHJldHVybiBcIm1hdC1lbGV2YXRpb24tejVcIlxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG59XHJcbiIsIlxyXG48IS0tIFNlYXJjaCAtLT5cclxuPHNwYS1zZWFyY2hcclxuICAqbmdJZj1cImNvbmZpZy5zZWFyY2hDb25maWdcIiBbY29uZmlnXT1cImNvbmZpZy5zZWFyY2hDb25maWdcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7XCIgKHNlYXJjaENsaWNrKT1cInNlYXJjaENsaWNrZWQoJGV2ZW50KVwiPlxyXG48L3NwYS1zZWFyY2g+XHJcblxyXG48IS0tIEhlYWRlciAtLT5cclxuPGFwcC10YWJsZS1oZWFkZXJcclxuICBbY29uZmlnXT1cImNvbmZpZ1wiIFtoaWRlVGl0bGVdPVwiZmFsc2VcIiBbdGFibGVEYXRhU291cmNlXT1cInRhYmxlRGF0YVNvdXJjZVwiIFtjcmVhdGVCdXR0b25dPVwiY3JlYXRlQnV0dG9uXCIgW3RpbGVDb25maWddPVwiY29uZmlnLnRpbGVDb25maWdcIiBbc21hbGxTY3JlZW5dPVwic21hbGxTY3JlZW5cIlxyXG4gIFt0aWxlUmVsb2FkXT1cInRpbGVSZWxvYWRcIiBbc2hvd0ZpbHRlckJ1dHRvbl09XCJzaG93RmlsdGVyQnV0dG9uXCIgKGNyZWF0ZUNsaWNrKT1cIm5ld01vZGVsKClcIiAocmVmcmVzaENsaWNrKT1cInJlZnJlc2hDbGlja2VkKClcIj5cclxuPC9hcHAtdGFibGUtaGVhZGVyPlxyXG5cclxuXHJcbjwhLS0gVGFibGUgLS0+XHJcbjxkaXY+XHJcblxyXG4gIDxwICpuZ0lmPVwiIWNvbmZpZ1wiPjxlbT5Db25maWd1cmUgVGFibGU8L2VtPjwvcD5cclxuICA8cCAqbmdJZj1cIiFkYXRhU291cmNlXCI+PGVtPkxvYWRpbmcuLi48L2VtPjwvcD5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImRhdGFTb3VyY2UgJiYgKCFzbWFsbFNjcmVlbiB8fCAoc21hbGxTY3JlZW4gJiYgZGF0YVNvdXJjZT8ubGVuZ3RoID4gMCkpXCI+XHJcblxyXG4gICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJ0YWJsZURhdGFTb3VyY2VcIiAgW25nQ2xhc3NdPVwiZWxldmF0aW9uXCI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29uZmlnLmNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCI+XHJcbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiA+e3sgY29sdW1uLmFsaWFzID8/IGNvbHVtbi5uYW1lIHwgY2FtZWxUb1dvcmRzIH19PC90aD5cclxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O1wiIGNsYXNzPVwicmlnaHQtcGFkZGluZ1wiID5cclxuXHJcbiAgICAgICAgICA8IS0tIFJvd3MgLS0+XHJcbiAgICAgICAgICA8YXBwLXRhYmxlLXJvdyBbY29sdW1uXT1cImNvbHVtblwiIFtyb3ddPVwicm93XCIgW2NvbmZpZ109XCJjb25maWdcIlxyXG4gICAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwiYWN0aW9uQ2xpY2tlZChjb2x1bW4ubmFtZSwgcm93KVwiIChjb2x1bW5DbGljayk9XCJjb2x1bW5DbGlja2VkKGNvbHVtbiwgcm93KVwiIChzaG93QmFubmVyRXZlbnQpPVwic2hvd0Jhbm5lcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8L2FwcC10YWJsZS1yb3c+XHJcblxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25cIj5cclxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpb24gPC90aD5cclxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW25nU3R5bGVdPVwie3dpZHRoOmZhbHNlID8gJzUwcHgnIDogYWN0aW9uc1dpZHRofVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zLWNvbnRhaW5lclwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBBY3Rpb25zIC0tPlxyXG4gICAgICAgICAgICA8YXBwLXRhYmxlLWFjdGlvblxyXG4gICAgICAgICAgICAgIFtkaXNwbGF5ZWRCdXR0b25zXT1cImRpc3BsYXllZEJ1dHRvbnNcIiBbY29uZmlnXT1cImNvbmZpZ1wiIFtyb3ddPVwicm93XCIgKGFjdGlvbkNsaWNrKT1cImFjdGlvbkNsaWNrZWQoJGV2ZW50Lm5hbWUsICRldmVudC5yb3cpXCI+XHJcbiAgICAgICAgICAgIDwvYXBwLXRhYmxlLWFjdGlvbj5cclxuXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxyXG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIiBbbmdDbGFzc109XCJ7J21ha2UtZ3JheSc6IGNvbmZpZy5ncmV5T3V0ICYmIGNvbmZpZy5ncmV5T3V0KHJvdyl9XCI+PC90cj5cclxuICAgIDwvdGFibGU+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8bWF0LXBhZ2luYXRvciAqbmdJZj1cImRhdGFTb3VyY2UgJiYgKCFzbWFsbFNjcmVlbiB8fCAoc21hbGxTY3JlZW4gJiYgZGF0YVNvdXJjZT8ubGVuZ3RoID4gMCkpXCIgI3RhYmxlUGFnaW5hdG9yIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzEwLCAyMCwgNTBdXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM+PC9tYXQtcGFnaW5hdG9yPlxyXG5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwidGluLWNlbnRlclwiPlxyXG4gIDxwICpuZ0lmPVwiZGF0YVNvdXJjZT8ubGVuZ3RoID09IDBcIj48ZW0+Tm8gRGF0YTwvZW0+PC9wPlxyXG48L2Rpdj5cclxuXHJcblxyXG5cclxuIl19