@clr/angular 17.8.1 → 17.10.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 (54) hide show
  1. package/clarity.api.md +100 -50
  2. package/data/datagrid/datagrid-row.d.ts +6 -4
  3. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +9 -2
  4. package/data/datagrid/datagrid.d.ts +11 -3
  5. package/data/datagrid/index.d.ts +1 -0
  6. package/data/datagrid/interfaces/key-nav-grid-strategy.interface.d.ts +11 -0
  7. package/data/datagrid/interfaces/virtual-scroll-data-range.interface.d.ts +5 -0
  8. package/data/datagrid/providers/items.d.ts +1 -0
  9. package/data/datagrid/utils/key-navigation-grid.controller.d.ts +1 -16
  10. package/data/datagrid/utils/key-navigation-strategies/default.d.ts +15 -0
  11. package/data/datagrid/utils/key-navigation-strategies/expanded-columns-row.d.ts +14 -0
  12. package/data/datagrid/utils/key-navigation-strategies/expanded-row.d.ts +14 -0
  13. package/data/datagrid/utils/key-navigation-utils.d.ts +22 -0
  14. package/data/tree-view/tree-node.d.ts +0 -1
  15. package/esm2020/data/datagrid/datagrid-column.mjs +8 -12
  16. package/esm2020/data/datagrid/datagrid-row.mjs +30 -10
  17. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +45 -10
  18. package/esm2020/data/datagrid/datagrid.mjs +48 -17
  19. package/esm2020/data/datagrid/index.mjs +2 -1
  20. package/esm2020/data/datagrid/interfaces/key-nav-grid-strategy.interface.mjs +8 -0
  21. package/esm2020/data/datagrid/interfaces/virtual-scroll-data-range.interface.mjs +8 -0
  22. package/esm2020/data/datagrid/providers/items.mjs +5 -1
  23. package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +18 -243
  24. package/esm2020/data/datagrid/utils/key-navigation-strategies/default.mjs +132 -0
  25. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-columns-row.mjs +132 -0
  26. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-row.mjs +168 -0
  27. package/esm2020/data/datagrid/utils/key-navigation-utils.mjs +108 -0
  28. package/esm2020/data/tree-view/tree-node.mjs +3 -6
  29. package/esm2020/forms/checkbox/checkbox.mjs +5 -2
  30. package/esm2020/forms/number-input/number-input.module.mjs +3 -3
  31. package/esm2020/layout/breadcrumbs/breadcrumbs.mjs +2 -2
  32. package/esm2020/modal/modal.mjs +7 -4
  33. package/esm2020/popover/common/popover.mjs +2 -2
  34. package/esm2020/utils/animations/constants.mjs +7 -1
  35. package/esm2020/utils/animations/expandable-animation/base-expandable-animation.mjs +38 -0
  36. package/esm2020/utils/animations/expandable-animation/expandable-animation.directive.mjs +56 -0
  37. package/esm2020/utils/animations/expandable-animation/expandable-animation.mjs +10 -32
  38. package/esm2020/utils/animations/expandable-animation/expandable-animation.module.mjs +3 -2
  39. package/esm2020/utils/animations/expandable-animation/index.mjs +4 -2
  40. package/esm2020/utils/focus/focusable-item/basic-focusable-item.service.mjs +2 -2
  41. package/esm2020/wizard/wizard.mjs +29 -6
  42. package/fesm2015/clr-angular.mjs +915 -426
  43. package/fesm2015/clr-angular.mjs.map +1 -1
  44. package/fesm2020/clr-angular.mjs +936 -445
  45. package/fesm2020/clr-angular.mjs.map +1 -1
  46. package/modal/modal.d.ts +3 -2
  47. package/package.json +2 -2
  48. package/utils/animations/constants.d.ts +1 -0
  49. package/utils/animations/expandable-animation/base-expandable-animation.d.ts +13 -0
  50. package/utils/animations/expandable-animation/expandable-animation.d.ts +2 -6
  51. package/utils/animations/expandable-animation/expandable-animation.directive.d.ts +16 -0
  52. package/utils/animations/expandable-animation/expandable-animation.module.d.ts +3 -2
  53. package/utils/animations/expandable-animation/index.d.ts +1 -0
  54. package/wizard/wizard.d.ts +12 -2
@@ -8,6 +8,7 @@ import { Injectable } from '@angular/core';
8
8
  import { fromEvent, Subject } from 'rxjs';
9
9
  import { debounceTime, takeUntil } from 'rxjs/operators';
10
10
  import { Keys } from '../../../utils/enums/keys.enum';
11
+ import { KeyNavigationUtils } from './key-navigation-utils';
11
12
  import * as i0 from "@angular/core";
12
13
  const actionableItemSelectors = [
13
14
  'a[href]',
@@ -44,15 +45,6 @@ export class KeyNavigationGridController {
44
45
  keyGrid: '[role=grid]',
45
46
  };
46
47
  }
47
- get grid() {
48
- return this.host?.querySelector(this.config.keyGrid);
49
- }
50
- get rows() {
51
- return this.host?.querySelectorAll(this.config.keyGridRows);
52
- }
53
- get cells() {
54
- return this.host?.querySelectorAll(this.config.keyGridCells);
55
- }
56
48
  ngOnDestroy() {
57
49
  this.destroy$.next();
58
50
  this.destroy$.complete();
@@ -62,33 +54,33 @@ export class KeyNavigationGridController {
62
54
  return;
63
55
  }
64
56
  this.zone.runOutsideAngular(() => {
65
- fromEvent(this.grid, 'mousedown')
57
+ fromEvent(this.keyNavUtils.grid, 'mousedown')
66
58
  .pipe(takeUntil(this.destroy$))
67
59
  .subscribe((e) => {
68
60
  // preserve right click for context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard
69
61
  if (e.buttons === 1 && !e.ctrlKey) {
70
- const activeCell = this.cells
71
- ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
62
+ const activeCell = this.keyNavUtils.cells
63
+ ? Array.from(this.keyNavUtils.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
72
64
  : null;
73
65
  if (activeCell) {
74
66
  this.setActiveCell(activeCell, { keepFocus: isActionableItem(e.target) });
75
67
  }
76
68
  }
77
69
  });
78
- fromEvent(this.grid, 'wheel')
70
+ fromEvent(this.keyNavUtils.grid, 'wheel')
79
71
  .pipe(takeUntil(this.destroy$))
80
72
  .subscribe(() => {
81
73
  this.removeActiveCell();
82
74
  });
83
- fromEvent(this.grid, 'focusout')
75
+ fromEvent(this.keyNavUtils.grid, 'focusout')
84
76
  .pipe(debounceTime(0), takeUntil(this.destroy$))
85
77
  .subscribe(() => {
86
- if (this.grid.contains(document.activeElement)) {
78
+ if (this.keyNavUtils.grid.contains(document.activeElement)) {
87
79
  return;
88
80
  }
89
81
  this.removeActiveCell();
90
82
  });
91
- fromEvent(this.grid, 'keydown')
83
+ fromEvent(this.keyNavUtils.grid, 'keydown')
92
84
  .pipe(takeUntil(this.destroy$))
93
85
  .subscribe((e) => {
94
86
  // Skip column resize events
@@ -104,12 +96,9 @@ export class KeyNavigationGridController {
104
96
  e.key === Keys.Home ||
105
97
  e.key === Keys.PageUp ||
106
98
  e.key === Keys.PageDown) {
107
- const currentCellCoords = this.getCurrentCellCoordinates();
108
- const nextCellCoords = this.isExpandedRow(currentCellCoords.y) || this.isDetailsRow(currentCellCoords.y)
109
- ? this.getNextForExpandedRowCoordinate(e, currentCellCoords)
110
- : this.getNextItemCoordinate(e, currentCellCoords);
111
- const activeItem = this.rows
112
- ? Array.from(this.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
99
+ const nextCellCoords = this.keyNavUtils.getNextItemCoordinate(e);
100
+ const activeItem = this.keyNavUtils.rows
101
+ ? Array.from(this.keyNavUtils.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
113
102
  : null;
114
103
  if (activeItem) {
115
104
  this.setActiveCell(activeItem);
@@ -121,13 +110,13 @@ export class KeyNavigationGridController {
121
110
  this.listenersAdded = true;
122
111
  }
123
112
  initializeKeyGrid(host) {
124
- this.host = host;
113
+ this.keyNavUtils = new KeyNavigationUtils(host, this.config);
125
114
  this.addListeners();
126
115
  this.resetKeyGrid();
127
116
  }
128
117
  resetKeyGrid() {
129
- this.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
130
- const firstCell = this.cells ? this.cells[0] : null;
118
+ this.keyNavUtils.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
119
+ const firstCell = this.keyNavUtils.cells ? this.keyNavUtils.cells[0] : null;
131
120
  firstCell?.setAttribute('tabindex', '0');
132
121
  }
133
122
  removeActiveCell() {
@@ -137,7 +126,9 @@ export class KeyNavigationGridController {
137
126
  return this._activeCell;
138
127
  }
139
128
  setActiveCell(activeCell, { keepFocus } = { keepFocus: false }) {
140
- const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
129
+ const prior = this.keyNavUtils.cells
130
+ ? Array.from(this.keyNavUtils.cells).find(c => c.getAttribute('tabindex') === '0')
131
+ : null;
141
132
  if (prior) {
142
133
  prior.setAttribute('tabindex', '-1');
143
134
  }
@@ -155,226 +146,10 @@ export class KeyNavigationGridController {
155
146
  elementToFocus.focus();
156
147
  }
157
148
  }
158
- getNextForExpandedRowCoordinate(e, currentCellCoords) {
159
- if (e.key === Keys.PageUp || e.key === Keys.PageDown) {
160
- return this.getNextItemCoordinate(e, currentCellCoords);
161
- }
162
- if (!this.isDetailsRow(currentCellCoords.y) &&
163
- !this.isRowReplaced(currentCellCoords.y) &&
164
- (e.key === Keys.Home || e.key === Keys.End || e.key === Keys.ArrowRight || e.key === Keys.ArrowLeft)) {
165
- return this.getNextItemCoordinate(e, currentCellCoords);
166
- }
167
- const { numOfRows, numOfColumns, inlineStart, inlineEnd, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
168
- const isSingleCellExpandedRow = this.isSingleCellExpandedRow(currentCellCoords.y);
169
- if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
170
- nextCellCoords.y = currentCellCoords.y - 1;
171
- if (isSingleCellExpandedRow && !isActionCell) {
172
- if (this.isRowReplaced(currentCellCoords.y)) {
173
- nextCellCoords.y = nextCellCoords.y - 1;
174
- }
175
- if (this.isDetailsRow(nextCellCoords.y)) {
176
- nextCellCoords.x = 0;
177
- }
178
- else if (this.isDetailsRow(currentCellCoords.y) === false) {
179
- // false check is intentional, the ! operator may be missed easily in this case
180
- nextCellCoords.x = currentCellCoords.x;
181
- }
182
- else {
183
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
184
- }
185
- return nextCellCoords;
186
- }
187
- if (isActionCell && this.isDetailsRow(nextCellCoords.y)) {
188
- nextCellCoords.y = nextCellCoords.y - 1;
189
- }
190
- else if (this.isRowReplaced(nextCellCoords.y)) {
191
- nextCellCoords.y = nextCellCoords.y - 1;
192
- if (!this.isDetailsRow(nextCellCoords.y)) {
193
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
194
- }
195
- }
196
- else if (this.isDetailsRow(currentCellCoords.y) && !this.isDetailsRow(nextCellCoords.y)) {
197
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
198
- }
199
- else if (!isActionCell && this.isDetailsRow(nextCellCoords.y)) {
200
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
201
- }
202
- }
203
- else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
204
- nextCellCoords.y = currentCellCoords.y + 1;
205
- if (isSingleCellExpandedRow && !isActionCell) {
206
- if (this.isRowReplaced(nextCellCoords.y)) {
207
- nextCellCoords.y = nextCellCoords.y + 1;
208
- }
209
- if (this.isDetailsRow(nextCellCoords.y)) {
210
- nextCellCoords.x = 0;
211
- }
212
- else {
213
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
214
- }
215
- return nextCellCoords;
216
- }
217
- if (isActionCell || this.isRowReplaced(nextCellCoords.y)) {
218
- nextCellCoords.y = nextCellCoords.y + 1;
219
- }
220
- else if (this.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
221
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
222
- }
223
- else {
224
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
225
- }
226
- }
227
- else if (e.key === inlineStart) {
228
- if (currentCellCoords.x !== 0) {
229
- nextCellCoords.x = currentCellCoords.x - 1;
230
- }
231
- else if (!isActionCell) {
232
- nextCellCoords.y = currentCellCoords.y - 1;
233
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y) - 1;
234
- }
235
- }
236
- else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
237
- if (isActionCell &&
238
- currentCellCoords.x === this.actionCellCount(currentCellCoords.x) - 1 &&
239
- this.isRowReplaced(currentCellCoords.y) &&
240
- !this.isDetailsRow(currentCellCoords.y)) {
241
- nextCellCoords.y = currentCellCoords.y + 1;
242
- nextCellCoords.x = 0;
243
- }
244
- else {
245
- nextCellCoords.x = currentCellCoords.x + 1;
246
- }
247
- }
248
- else if (e.key === Keys.End) {
249
- nextCellCoords.x = this.getCellsForRow(currentCellCoords.y).length - 1;
250
- if (e.ctrlKey) {
251
- nextCellCoords.x = numOfColumns;
252
- nextCellCoords.y = numOfRows;
253
- }
254
- }
255
- else if (e.key === Keys.Home) {
256
- nextCellCoords.x = 0;
257
- nextCellCoords.y = currentCellCoords.y - 1;
258
- if (e.ctrlKey) {
259
- nextCellCoords.y = 0;
260
- }
261
- }
262
- return nextCellCoords;
263
- }
264
- getNextItemCoordinate(e, currentCellCoords) {
265
- const { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
266
- if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
267
- nextCellCoords.y = currentCellCoords.y - 1;
268
- if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isDetailsRow(nextCellCoords.y)) {
269
- nextCellCoords.x = 0;
270
- return nextCellCoords;
271
- }
272
- if (this.isDetailsRow(nextCellCoords.y)) {
273
- if (isActionCell) {
274
- nextCellCoords.y = nextCellCoords.y - 1;
275
- }
276
- else {
277
- nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
278
- }
279
- }
280
- }
281
- else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
282
- nextCellCoords.y = currentCellCoords.y + 1;
283
- if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isRowReplaced(nextCellCoords.y)) {
284
- nextCellCoords.x = 0;
285
- nextCellCoords.y = nextCellCoords.y + 1;
286
- return nextCellCoords;
287
- }
288
- if (!isActionCell && this.isRowReplaced(nextCellCoords.y)) {
289
- nextCellCoords.y = nextCellCoords.y + 1;
290
- nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
291
- }
292
- }
293
- else if (e.key === inlineStart && currentCellCoords.x !== 0) {
294
- nextCellCoords.x = currentCellCoords.x - 1;
295
- }
296
- else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
297
- nextCellCoords.x = currentCellCoords.x + 1;
298
- }
299
- else if (e.key === Keys.End) {
300
- nextCellCoords.x = numOfColumns;
301
- if (e.ctrlKey) {
302
- nextCellCoords.y = numOfRows;
303
- }
304
- }
305
- else if (e.key === Keys.Home) {
306
- nextCellCoords.x = 0;
307
- if (e.ctrlKey) {
308
- nextCellCoords.y = 0;
309
- }
310
- }
311
- else if (e.key === Keys.PageUp) {
312
- nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
313
- }
314
- else if (e.key === Keys.PageDown) {
315
- nextCellCoords.y =
316
- currentCellCoords.y + itemsPerPage < numOfRows ? currentCellCoords.y + itemsPerPage : numOfRows;
317
- }
318
- return nextCellCoords;
319
- }
320
- getCalcVariables(currentCellCoords) {
321
- const numOfRows = this.rows ? this.rows.length - 1 : 0;
322
- // calculate numOfColumns based on header cells.
323
- const numOfColumns = numOfRows ? this.getCellsForRow(0).length - 1 : 0;
324
- const dir = this.host.dir;
325
- const inlineStart = dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
326
- const inlineEnd = dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
327
- const itemsPerPage = Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
328
- const isActionCell = this.isActionCell(currentCellCoords);
329
- const nextCellCoords = {
330
- x: currentCellCoords.x,
331
- y: currentCellCoords.y,
332
- };
333
- return { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords };
334
- }
335
- getCurrentCellCoordinates() {
336
- const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
337
- const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null;
338
- const coordinates = {
339
- x: currentRow && currentCell
340
- ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
341
- : 0,
342
- y: currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0,
343
- };
344
- return coordinates;
345
- }
346
- getCellsForRow(index) {
347
- return this.rows[index].querySelectorAll(this.config.keyGridCells);
348
- }
349
- isExpandedRow(index) {
350
- const selectedElement = this.rows[index].querySelector('.datagrid-row-detail');
351
- return selectedElement ? selectedElement.style.display !== 'none' : false;
352
- }
353
- isDetailsRow(index) {
354
- return this.rows[index].classList.contains('datagrid-row-detail');
355
- }
356
- isRowReplaced(index) {
357
- return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced');
358
- }
359
- isSingleCellExpandedRow(index) {
360
- const row = this.rows[index].classList.contains('datagrid-row-detail')
361
- ? this.rows[index]
362
- : this.rows[index].querySelector('.datagrid-row-detail');
363
- return row?.querySelectorAll(this.config.keyGridCells).length === 1;
364
- }
365
- actionCellCount(index) {
366
- return this.actionCellsAsArray(index).length;
367
- }
368
- actionCellsAsArray(index) {
369
- return Array.from(this.rows[index].querySelectorAll('.datagrid-row-sticky .datagrid-cell, .datagrid-row-sticky .datagrid-column'));
370
- }
371
- isActionCell(cellCoords) {
372
- return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x];
373
- }
374
149
  }
375
150
  KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
376
151
  KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
377
152
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, decorators: [{
378
153
  type: Injectable
379
154
  }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
380
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LW5hdmlnYXRpb24tZ3JpZC5jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvZGF0YS9kYXRhZ3JpZC91dGlscy9rZXktbmF2aWdhdGlvbi1ncmlkLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFFdEQsTUFBTSx1QkFBdUIsR0FBRztJQUM5QixTQUFTO0lBQ1QsWUFBWTtJQUNaLHVCQUF1QjtJQUN2Qix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLDBCQUEwQjtJQUMxQixRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCx3QkFBd0I7SUFDeEIsK0JBQStCO0NBQ2hDLENBQUM7QUFFRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsRUFBZTtJQUM5QyxNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBRyx1QkFBdUIsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQzdGLE1BQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBa0IsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxFQUFlO0lBQ3ZDLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdE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QUNqQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxLQUFhO1FBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztZQUNwRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFM0QsT0FBTyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBYTtRQUNuQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0MsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQWE7UUFDdEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsNEVBQTRFLENBQUMsQ0FDaEgsQ0FBQztJQUNKLENBQUM7SUFFTyxZQUFZLENBQUMsVUFBMkI7UUFDOUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7d0hBclpVLDJCQUEyQjs0SEFBM0IsMkJBQTJCOzJGQUEzQiwyQkFBMkI7a0JBRHZDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjUgQnJvYWRjb20uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGUgdGVybSBcIkJyb2FkY29tXCIgcmVmZXJzIHRvIEJyb2FkY29tIEluYy4gYW5kL29yIGl0cyBzdWJzaWRpYXJpZXMuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBLZXlzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZW51bXMva2V5cy5lbnVtJztcblxuY29uc3QgYWN0aW9uYWJsZUl0ZW1TZWxlY3RvcnMgPSBbXG4gICdhW2hyZWZdJyxcbiAgJ2FyZWFbaHJlZl0nLFxuICAnaW5wdXQ6bm90KFtkaXNhYmxlZF0pJyxcbiAgJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknLFxuICAnc2VsZWN0Om5vdChbZGlzYWJsZWRdKScsXG4gICd0ZXh0YXJlYTpub3QoW2Rpc2FibGVkXSknLFxuICAnaWZyYW1lJyxcbiAgJ29iamVjdCcsXG4gICdlbWJlZCcsXG4gICdbY29udGVudGVkaXRhYmxlPXRydWVdJyxcbiAgJ1tyb2xlPWJ1dHRvbl06bm90KFtkaXNhYmxlZF0pJyxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJiYWJsZUl0ZW1zKGVsOiBIVE1MRWxlbWVudCkge1xuICBjb25zdCB0YWJiYWJsZUl0ZW1TZWxlY3RvcnMgPSBbLi4uYWN0aW9uYWJsZUl0ZW1TZWxlY3RvcnMsICdbdGFiaW5kZXg9XCIwXCJdOm5vdChbZGlzYWJsZWRdKSddO1xuICBjb25zdCB0YWJiYWJsZVNlbGVjdG9yID0gdGFiYmFibGVJdGVtU2VsZWN0b3JzLmpvaW4oJywnKTtcbiAgcmV0dXJuIEFycmF5LmZyb20oZWwucXVlcnlTZWxlY3RvckFsbCh0YWJiYWJsZVNlbGVjdG9yKSkgYXMgSFRNTEVsZW1lbnRbXTtcbn1cblxuZnVuY3Rpb24gaXNBY3Rpb25hYmxlSXRlbShlbDogSFRNTEVsZW1lbnQpIHtcbiAgY29uc3QgYWN0aW9uYWJsZVNlbGVjdG9yID0gYWN0aW9uYWJsZUl0ZW1TZWxlY3RvcnMuam9pbignLCcpO1xuICByZXR1cm4gZWwubWF0Y2hlcyhhY3Rpb25hYmxlU2VsZWN0b3IpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleU5hdmlnYXRpb25HcmlkQ29uZmlnIHtcbiAga2V5R3JpZDogc3RyaW5nO1xuICBrZXlHcmlkUm93czogc3RyaW5nO1xuICBrZXlHcmlkQ2VsbHM6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZWxsQ29vcmRpbmF0ZXMge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEtleU5hdmlnYXRpb25HcmlkQ29udHJvbGxlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHNraXBJdGVtRm9jdXMgPSBmYWxzZTtcblxuICBwcml2YXRlIGhvc3Q6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGNvbmZpZzogS2V5TmF2aWdhdGlvbkdyaWRDb25maWc7XG4gIHByaXZhdGUgbGlzdGVuZXJzQWRkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2FjdGl2ZUNlbGw6IEhUTUxFbGVtZW50ID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAga2V5R3JpZFJvd3M6ICdbcm9sZT1yb3ddOm5vdCguZGF0YWdyaWQtcGxhY2Vob2xkZXIpOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZVwiXSknLFxuICAgICAga2V5R3JpZENlbGxzOlxuICAgICAgICAnW3JvbGU9Z3JpZGNlbGxdOm5vdCguZGF0YWdyaWQtaGlkZGVuLWNvbHVtbik6bm90KC5kYXRhZ3JpZC1wbGFjZWhvbGRlci1jb250ZW50KSwgW3JvbGU9Y29sdW1uaGVhZGVyXTpub3QoLmRhdGFncmlkLWhpZGRlbi1jb2x1bW4pOm5vdCguZGF0YWdyaWQtcGxhY2Vob2xkZXItY29udGVudCksIC5kYXRhZ3JpZC1kZXRhaWwtY2FyZXQnLFxuICAgICAga2V5R3JpZDogJ1tyb2xlPWdyaWRdJyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZ3JpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0Py5xdWVyeVNlbGVjdG9yKHRoaXMuY29uZmlnLmtleUdyaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcm93cygpIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0Py5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuY29uZmlnLmtleUdyaWRSb3dzKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNlbGxzKCkge1xuICAgIHJldHVybiB0aGlzLmhvc3Q/LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5jb25maWcua2V5R3JpZENlbGxzKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PjtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFkZExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5saXN0ZW5lcnNBZGRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQodGhpcy5ncmlkLCAnbW91c2Vkb3duJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gcHJlc2VydmUgcmlnaHQgY2xpY2sgZm9yIGNvbnRleHQgbWVudXMgJiBrZXlib2FyZCBtb3VzZSBjb250cm9sIGh0dHBzOi8vYXBwbGUuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzMyNzE1L2hvdy1kby1pLW9wZW4tdGhlLWNvbnRleHQtbWVudS1mcm9tLWEtbWFjLWtleWJvYXJkXG4gICAgICAgICAgaWYgKGUuYnV0dG9ucyA9PT0gMSAmJiAhZS5jdHJsS2V5KSB7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gdGhpcy5jZWxsc1xuICAgICAgICAgICAgICA/IEFycmF5LmZyb20odGhpcy5jZWxscykuZmluZChcbiAgICAgICAgICAgICAgICAgIGMgPT4gYyA9PT0gZS50YXJnZXQgfHwgYyA9PT0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KHRoaXMuY29uZmlnLmtleUdyaWRDZWxscylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChhY3RpdmVDZWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ2VsbChhY3RpdmVDZWxsLCB7IGtlZXBGb2N1czogaXNBY3Rpb25hYmxlSXRlbShlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgZnJvbUV2ZW50KHRoaXMuZ3JpZCwgJ3doZWVsJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFjdGl2ZUNlbGwoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGZyb21FdmVudCh0aGlzLmdyaWQsICdmb2N1c291dCcpXG4gICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5ncmlkLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5yZW1vdmVBY3RpdmVDZWxsKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICBmcm9tRXZlbnQodGhpcy5ncmlkLCAna2V5ZG93bicpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgY29sdW1uIHJlc2l6ZSBldmVudHNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnZHJhZy1oYW5kbGUnKSAmJlxuICAgICAgICAgICAgKGUua2V5ID09PSBLZXlzLkFycm93TGVmdCB8fCBlLmtleSA9PT0gS2V5cy5BcnJvd1JpZ2h0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlLmtleSA9PT0gS2V5cy5BcnJvd1VwIHx8XG4gICAgICAgICAgICBlLmtleSA9PT0gS2V5cy5BcnJvd0Rvd24gfHxcbiAgICAgICAgICAgIGUua2V5ID09PSBLZXlzLkFycm93TGVmdCB8fFxuICAgICAgICAgICAgZS5rZXkgPT09IEtleXMuQXJyb3dSaWdodCB8fFxuICAgICAgICAgICAgZS5rZXkgPT09IEtleXMuRW5kIHx8XG4gICAgICAgICAgICBlLmtleSA9PT0gS2V5cy5Ib21lIHx8XG4gICAgICAgICAgICBlLmtleSA9PT0gS2V5cy5QYWdlVXAgfHxcbiAgICAgICAgICAgIGUua2V5ID09PSBLZXlzLlBhZ2VEb3duXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbENvb3JkcyA9IHRoaXMuZ2V0Q3VycmVudENlbGxDb29yZGluYXRlcygpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXh0Q2VsbENvb3JkcyA9XG4gICAgICAgICAgICAgIHRoaXMuaXNFeHBhbmRlZFJvdyhjdXJyZW50Q2VsbENvb3Jkcy55KSB8fCB0aGlzLmlzRGV0YWlsc1JvdyhjdXJyZW50Q2VsbENvb3Jkcy55KVxuICAgICAgICAgICAgICAgID8gdGhpcy5nZXROZXh0Rm9yRXhwYW5kZWRSb3dDb29yZGluYXRlKGUsIGN1cnJlbnRDZWxsQ29vcmRzKVxuICAgICAgICAgICAgICAgIDogdGhpcy5nZXROZXh0SXRlbUNvb3JkaW5hdGUoZSwgY3VycmVudENlbGxDb29yZHMpO1xuXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVJdGVtID0gdGhpcy5yb3dzXG4gICAgICAgICAgICAgID8gKEFycmF5LmZyb20odGhpcy5nZXRDZWxsc0ZvclJvdyhuZXh0Q2VsbENvb3Jkcy55KSlbbmV4dENlbGxDb29yZHMueF0gYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKGFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVDZWxsKGFjdGl2ZUl0ZW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RlbmVyc0FkZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGluaXRpYWxpemVLZXlHcmlkKGhvc3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICB0aGlzLmFkZExpc3RlbmVycygpO1xuICAgIHRoaXMucmVzZXRLZXlHcmlkKCk7XG4gIH1cblxuICByZXNldEtleUdyaWQoKSB7XG4gICAgdGhpcy5jZWxscz8uZm9yRWFjaCgoaTogSFRNTEVsZW1lbnQpID0+IGkuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpKTtcbiAgICBjb25zdCBmaXJzdENlbGwgPSB0aGlzLmNlbGxzID8gdGhpcy5jZWxsc1swXSA6IG51bGw7XG4gICAgZmlyc3RDZWxsPy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgfVxuXG4gIHJlbW92ZUFjdGl2ZUNlbGwoKSB7XG4gICAgdGhpcy5fYWN0aXZlQ2VsbCA9IG51bGw7XG4gIH1cblxuICBnZXRBY3RpdmVDZWxsKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVDZWxsO1xuICB9XG5cbiAgc2V0QWN0aXZlQ2VsbChhY3RpdmVDZWxsOiBIVE1MRWxlbWVudCwgeyBrZWVwRm9jdXMgfSA9IHsga2VlcEZvY3VzOiBmYWxzZSB9KSB7XG4gICAgY29uc3QgcHJpb3IgPSB0aGlzLmNlbGxzID8gQXJyYXkuZnJvbSh0aGlzLmNlbGxzKS5maW5kKGMgPT4gYy5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykgPT09ICcwJykgOiBudWxsO1xuXG4gICAgaWYgKHByaW9yKSB7XG4gICAgICBwcmlvci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgfVxuXG4gICAgYWN0aXZlQ2VsbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLl9hY3RpdmVDZWxsID0gYWN0aXZlQ2VsbDtcblxuICAgIGlmICghdGhpcy5za2lwSXRlbUZvY3VzICYmICFrZWVwRm9jdXMpIHtcbiAgICAgIGxldCBlbGVtZW50VG9Gb2N1czogSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmIChhY3RpdmVDZWxsLmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnY29sdW1uaGVhZGVyJykge1xuICAgICAgICBlbGVtZW50VG9Gb2N1cyA9IGFjdGl2ZUNlbGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0YWJiYWJsZUVsZW1lbnRzID0gZ2V0VGFiYmFibGVJdGVtcyhhY3RpdmVDZWxsKTtcbiAgICAgICAgZWxlbWVudFRvRm9jdXMgPSB0YWJiYWJsZUVsZW1lbnRzLmxlbmd0aCA/IHRhYmJhYmxlRWxlbWVudHNbMF0gOiBhY3RpdmVDZWxsO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50VG9Gb2N1cy5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TmV4dEZvckV4cGFuZGVkUm93Q29vcmRpbmF0ZShlOiBhbnksIGN1cnJlbnRDZWxsQ29vcmRzOiBDZWxsQ29vcmRpbmF0ZXMpIHtcbiAgICBpZiAoZS5rZXkgPT09IEtleXMuUGFnZVVwIHx8IGUua2V5ID09PSBLZXlzLlBhZ2VEb3duKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROZXh0SXRlbUNvb3JkaW5hdGUoZSwgY3VycmVudENlbGxDb29yZHMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICF0aGlzLmlzRGV0YWlsc1JvdyhjdXJyZW50Q2VsbENvb3Jkcy55KSAmJlxuICAgICAgIXRoaXMuaXNSb3dSZXBsYWNlZChjdXJyZW50Q2VsbENvb3Jkcy55KSAmJlxuICAgICAgKGUua2V5ID09PSBLZXlzLkhvbWUgfHwgZS5rZXkgPT09IEtleXMuRW5kIHx8IGUua2V5ID09PSBLZXlzLkFycm93UmlnaHQgfHwgZS5rZXkgPT09IEtleXMuQXJyb3dMZWZ0KVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV4dEl0ZW1Db29yZGluYXRlKGUsIGN1cnJlbnRDZWxsQ29vcmRzKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG51bU9mUm93cywgbnVtT2ZDb2x1bW5zLCBpbmxpbmVTdGFydCwgaW5saW5lRW5kLCBpc0FjdGlvbkNlbGwsIG5leHRDZWxsQ29vcmRzIH0gPVxuICAgICAgdGhpcy5nZXRDYWxjVmFyaWFibGVzKGN1cnJlbnRDZWxsQ29vcmRzKTtcblxuICAgIGNvbnN0IGlzU2luZ2xlQ2VsbEV4cGFuZGVkUm93ID0gdGhpcy5pc1NpbmdsZUNlbGxFeHBhbmRlZFJvdyhjdXJyZW50Q2VsbENvb3Jkcy55KTtcblxuICAgIGlmIChlLmtleSA9PT0gS2V5cy5BcnJvd1VwICYmIGN1cnJlbnRDZWxsQ29vcmRzLnkgIT09IDApIHtcbiAgICAgIG5leHRDZWxsQ29vcmRzLnkgPSBjdXJyZW50Q2VsbENvb3Jkcy55IC0gMTtcblxuICAgICAgaWYgKGlzU2luZ2xlQ2VsbEV4cGFuZGVkUm93ICYmICFpc0FjdGlvbkNlbGwpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSb3dSZXBsYWNlZChjdXJyZW50Q2VsbENvb3Jkcy55KSkge1xuICAgICAgICAgIG5leHRDZWxsQ29vcmRzLnkgPSBuZXh0Q2VsbENvb3Jkcy55IC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzRGV0YWlsc1JvdyhuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgICAgIG5leHRDZWxsQ29vcmRzLnggPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNEZXRhaWxzUm93KGN1cnJlbnRDZWxsQ29vcmRzLnkpID09PSBmYWxzZSkge1xuICAgICAgICAgIC8vIGZhbHNlIGNoZWNrIGlzIGludGVudGlvbmFsLCB0aGUgISBvcGVyYXRvciBtYXkgYmUgbWlzc2VkIGVhc2lseSBpbiB0aGlzIGNhc2VcbiAgICAgICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gY3VycmVudENlbGxDb29yZHMueDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gdGhpcy5hY3Rpb25DZWxsQ291bnQobmV4dENlbGxDb29yZHMueSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dENlbGxDb29yZHM7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FjdGlvbkNlbGwgJiYgdGhpcy5pc0RldGFpbHNSb3cobmV4dENlbGxDb29yZHMueSkpIHtcbiAgICAgICAgbmV4dENlbGxDb29yZHMueSA9IG5leHRDZWxsQ29vcmRzLnkgLSAxO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUm93UmVwbGFjZWQobmV4dENlbGxDb29yZHMueSkpIHtcbiAgICAgICAgbmV4dENlbGxDb29yZHMueSA9IG5leHRDZWxsQ29vcmRzLnkgLSAxO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0RldGFpbHNSb3cobmV4dENlbGxDb29yZHMueSkpIHtcbiAgICAgICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gY3VycmVudENlbGxDb29yZHMueCArIHRoaXMuYWN0aW9uQ2VsbENvdW50KG5leHRDZWxsQ29vcmRzLnkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNEZXRhaWxzUm93KGN1cnJlbnRDZWxsQ29vcmRzLnkpICYmICF0aGlzLmlzRGV0YWlsc1JvdyhuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gY3VycmVudENlbGxDb29yZHMueCArIHRoaXMuYWN0aW9uQ2VsbENvdW50KG5leHRDZWxsQ29vcmRzLnkpO1xuICAgICAgfSBlbHNlIGlmICghaXNBY3Rpb25DZWxsICYmIHRoaXMuaXNEZXRhaWxzUm93KG5leHRDZWxsQ29vcmRzLnkpKSB7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnggPSBjdXJyZW50Q2VsbENvb3Jkcy54IC0gdGhpcy5hY3Rpb25DZWxsQ291bnQoY3VycmVudENlbGxDb29yZHMueSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gS2V5cy5BcnJvd0Rvd24gJiYgY3VycmVudENlbGxDb29yZHMueSA8IG51bU9mUm93cykge1xuICAgICAgbmV4dENlbGxDb29yZHMueSA9IGN1cnJlbnRDZWxsQ29vcmRzLnkgKyAxO1xuXG4gICAgICBpZiAoaXNTaW5nbGVDZWxsRXhwYW5kZWRSb3cgJiYgIWlzQWN0aW9uQ2VsbCkge1xuICAgICAgICBpZiAodGhpcy5pc1Jvd1JlcGxhY2VkKG5leHRDZWxsQ29vcmRzLnkpKSB7XG4gICAgICAgICAgbmV4dENlbGxDb29yZHMueSA9IG5leHRDZWxsQ29vcmRzLnkgKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEZXRhaWxzUm93KG5leHRDZWxsQ29vcmRzLnkpKSB7XG4gICAgICAgICAgbmV4dENlbGxDb29yZHMueCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dENlbGxDb29yZHMueCA9IHRoaXMuYWN0aW9uQ2VsbENvdW50KG5leHRDZWxsQ29vcmRzLnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0Q2VsbENvb3JkcztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQWN0aW9uQ2VsbCB8fCB0aGlzLmlzUm93UmVwbGFjZWQobmV4dENlbGxDb29yZHMueSkpIHtcbiAgICAgICAgbmV4dENlbGxDb29yZHMueSA9IG5leHRDZWxsQ29vcmRzLnkgKyAxO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmdldENlbGxzRm9yUm93KGN1cnJlbnRDZWxsQ29vcmRzLnkpLmxlbmd0aCA+IG51bU9mQ29sdW1ucykge1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gY3VycmVudENlbGxDb29yZHMueCAtIHRoaXMuYWN0aW9uQ2VsbENvdW50KGN1cnJlbnRDZWxsQ29vcmRzLnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dENlbGxDb29yZHMueCA9IGN1cnJlbnRDZWxsQ29vcmRzLnggKyB0aGlzLmFjdGlvbkNlbGxDb3VudChuZXh0Q2VsbENvb3Jkcy55KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBpbmxpbmVTdGFydCkge1xuICAgICAgaWYgKGN1cnJlbnRDZWxsQ29vcmRzLnggIT09IDApIHtcbiAgICAgICAgbmV4dENlbGxDb29yZHMueCA9IGN1cnJlbnRDZWxsQ29vcmRzLnggLSAxO1xuICAgICAgfSBlbHNlIGlmICghaXNBY3Rpb25DZWxsKSB7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnkgPSBjdXJyZW50Q2VsbENvb3Jkcy55IC0gMTtcbiAgICAgICAgbmV4dENlbGxDb29yZHMueCA9IHRoaXMuYWN0aW9uQ2VsbENvdW50KG5leHRDZWxsQ29vcmRzLnkpIC0gMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBpbmxpbmVFbmQgJiYgY3VycmVudENlbGxDb29yZHMueCA8IG51bU9mQ29sdW1ucykge1xuICAgICAgaWYgKFxuICAgICAgICBpc0FjdGlvbkNlbGwgJiZcbiAgICAgICAgY3VycmVudENlbGxDb29yZHMueCA9PT0gdGhpcy5hY3Rpb25DZWxsQ291bnQoY3VycmVudENlbGxDb29yZHMueCkgLSAxICYmXG4gICAgICAgIHRoaXMuaXNSb3dSZXBsYWNlZChjdXJyZW50Q2VsbENvb3Jkcy55KSAmJlxuICAgICAgICAhdGhpcy5pc0RldGFpbHNSb3coY3VycmVudENlbGxDb29yZHMueSlcbiAgICAgICkge1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy55ID0gY3VycmVudENlbGxDb29yZHMueSArIDE7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnggPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dENlbGxDb29yZHMueCA9IGN1cnJlbnRDZWxsQ29vcmRzLnggKyAxO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IEtleXMuRW5kKSB7XG4gICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gdGhpcy5nZXRDZWxsc0ZvclJvdyhjdXJyZW50Q2VsbENvb3Jkcy55KS5sZW5ndGggLSAxO1xuXG4gICAgICBpZiAoZS5jdHJsS2V5KSB7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnggPSBudW1PZkNvbHVtbnM7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnkgPSBudW1PZlJvd3M7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gS2V5cy5Ib21lKSB7XG4gICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gMDtcbiAgICAgIG5leHRDZWxsQ29vcmRzLnkgPSBjdXJyZW50Q2VsbENvb3Jkcy55IC0gMTtcblxuICAgICAgaWYgKGUuY3RybEtleSkge1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy55ID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dENlbGxDb29yZHM7XG4gIH1cblxuICBwcml2YXRlIGdldE5leHRJdGVtQ29vcmRpbmF0ZShlOiBhbnksIGN1cnJlbnRDZWxsQ29vcmRzOiBDZWxsQ29vcmRpbmF0ZXMpIHtcbiAgICBjb25zdCB7IG51bU9mUm93cywgbnVtT2ZDb2x1bW5zLCBpbmxpbmVTdGFydCwgaW5saW5lRW5kLCBpdGVtc1BlclBhZ2UsIGlzQWN0aW9uQ2VsbCwgbmV4dENlbGxDb29yZHMgfSA9XG4gICAgICB0aGlzLmdldENhbGNWYXJpYWJsZXMoY3VycmVudENlbGxDb29yZHMpO1xuXG4gICAgaWYgKGUua2V5ID09PSBLZXlzLkFycm93VXAgJiYgY3VycmVudENlbGxDb29yZHMueSAhPT0gMCkge1xuICAgICAgbmV4dENlbGxDb29yZHMueSA9IGN1cnJlbnRDZWxsQ29vcmRzLnkgLSAxO1xuXG4gICAgICBpZiAodGhpcy5pc1NpbmdsZUNlbGxFeHBhbmRlZFJvdyhuZXh0Q2VsbENvb3Jkcy55KSAmJiAhaXNBY3Rpb25DZWxsICYmIHRoaXMuaXNEZXRhaWxzUm93KG5leHRDZWxsQ29vcmRzLnkpKSB7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnggPSAwO1xuICAgICAgICByZXR1cm4gbmV4dENlbGxDb29yZHM7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzRGV0YWlsc1JvdyhuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgICBpZiAoaXNBY3Rpb25DZWxsKSB7XG4gICAgICAgICAgbmV4dENlbGxDb29yZHMueSA9IG5leHRDZWxsQ29vcmRzLnkgLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHRDZWxsQ29vcmRzLnggPSBuZXh0Q2VsbENvb3Jkcy54IC0gdGhpcy5hY3Rpb25DZWxsQ291bnQoY3VycmVudENlbGxDb29yZHMueSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBLZXlzLkFycm93RG93biAmJiBjdXJyZW50Q2VsbENvb3Jkcy55IDwgbnVtT2ZSb3dzKSB7XG4gICAgICBuZXh0Q2VsbENvb3Jkcy55ID0gY3VycmVudENlbGxDb29yZHMueSArIDE7XG5cbiAgICAgIGlmICh0aGlzLmlzU2luZ2xlQ2VsbEV4cGFuZGVkUm93KG5leHRDZWxsQ29vcmRzLnkpICYmICFpc0FjdGlvbkNlbGwgJiYgdGhpcy5pc1Jvd1JlcGxhY2VkKG5leHRDZWxsQ29vcmRzLnkpKSB7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnggPSAwO1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy55ID0gbmV4dENlbGxDb29yZHMueSArIDE7XG4gICAgICAgIHJldHVybiBuZXh0Q2VsbENvb3JkcztcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0FjdGlvbkNlbGwgJiYgdGhpcy5pc1Jvd1JlcGxhY2VkKG5leHRDZWxsQ29vcmRzLnkpKSB7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnkgPSBuZXh0Q2VsbENvb3Jkcy55ICsgMTtcbiAgICAgICAgbmV4dENlbGxDb29yZHMueCA9IG5leHRDZWxsQ29vcmRzLnggLSB0aGlzLmFjdGlvbkNlbGxDb3VudChjdXJyZW50Q2VsbENvb3Jkcy55KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBpbmxpbmVTdGFydCAmJiBjdXJyZW50Q2VsbENvb3Jkcy54ICE9PSAwKSB7XG4gICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gY3VycmVudENlbGxDb29yZHMueCAtIDE7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gaW5saW5lRW5kICYmIGN1cnJlbnRDZWxsQ29vcmRzLnggPCBudW1PZkNvbHVtbnMpIHtcbiAgICAgIG5leHRDZWxsQ29vcmRzLnggPSBjdXJyZW50Q2VsbENvb3Jkcy54ICsgMTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBLZXlzLkVuZCkge1xuICAgICAgbmV4dENlbGxDb29yZHMueCA9IG51bU9mQ29sdW1ucztcblxuICAgICAgaWYgKGUuY3RybEtleSkge1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy55ID0gbnVtT2ZSb3dzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IEtleXMuSG9tZSkge1xuICAgICAgbmV4dENlbGxDb29yZHMueCA9IDA7XG5cbiAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgbmV4dENlbGxDb29yZHMueSA9IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gS2V5cy5QYWdlVXApIHtcbiAgICAgIG5leHRDZWxsQ29vcmRzLnkgPSBjdXJyZW50Q2VsbENvb3Jkcy55IC0gaXRlbXNQZXJQYWdlID4gMCA/IGN1cnJlbnRDZWxsQ29vcmRzLnkgLSBpdGVtc1BlclBhZ2UgKyAxIDogMTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBLZXlzLlBhZ2VEb3duKSB7XG4gICAgICBuZXh0Q2VsbENvb3Jkcy55ID1cbiAgICAgICAgY3VycmVudENlbGxDb29yZHMueSArIGl0ZW1zUGVyUGFnZSA8IG51bU9mUm93cyA/IGN1cnJlbnRDZWxsQ29vcmRzLnkgKyBpdGVtc1BlclBhZ2UgOiBudW1PZlJvd3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRDZWxsQ29vcmRzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWxjVmFyaWFibGVzKGN1cnJlbnRDZWxsQ29vcmRzOiBDZWxsQ29vcmRpbmF0ZXMpIHtcbiAgICBjb25zdCBudW1PZlJvd3MgPSB0aGlzLnJvd3MgPyB0aGlzLnJvd3MubGVuZ3RoIC0gMSA6IDA7XG5cbiAgICAvLyBjYWxjdWxhdGUgbnVtT2ZDb2x1bW5zIGJhc2VkIG9uIGhlYWRlciBjZWxscy5cbiAgICBjb25zdCBudW1PZkNvbHVtbnMgPSBudW1PZlJvd3MgPyB0aGlzLmdldENlbGxzRm9yUm93KDApLmxlbmd0aCAtIDEgOiAwO1xuXG4gICAgY29uc3QgZGlyID0gdGhpcy5ob3N0LmRpcjtcbiAgICBjb25zdCBpbmxpbmVTdGFydCA9IGRpciA9PT0gJ3J0bCcgPyBLZXlzLkFycm93UmlnaHQgOiBLZXlzLkFycm93TGVmdDtcbiAgICBjb25zdCBpbmxpbmVFbmQgPSBkaXIgPT09ICdydGwnID8gS2V5cy5BcnJvd0xlZnQgOiBLZXlzLkFycm93UmlnaHQ7XG5cbiAgICBjb25zdCBpdGVtc1BlclBhZ2UgPVxuICAgICAgTWF0aC5mbG9vcih0aGlzLmhvc3Q/LnF1ZXJ5U2VsZWN0b3IoJy5kYXRhZ3JpZCcpLmNsaWVudEhlaWdodCAvIHRoaXMucm93c1swXS5jbGllbnRIZWlnaHQpIC0gMSB8fCAwO1xuXG4gICAgY29uc3QgaXNBY3Rpb25DZWxsID0gdGhpcy5pc0FjdGlvbkNlbGwoY3VycmVudENlbGxDb29yZHMpO1xuXG4gICAgY29uc3QgbmV4dENlbGxDb29yZHM6IENlbGxDb29yZGluYXRlcyA9IHtcbiAgICAgIHg6IGN1cnJlbnRDZWxsQ29vcmRzLngsXG4gICAgICB5OiBjdXJyZW50Q2VsbENvb3Jkcy55LFxuICAgIH07XG5cbiAgICByZXR1cm4geyBudW1PZlJvd3MsIG51bU9mQ29sdW1ucywgaW5saW5lU3RhcnQsIGlubGluZUVuZCwgaXRlbXNQZXJQYWdlLCBpc0FjdGlvbkNlbGwsIG5leHRDZWxsQ29vcmRzIH07XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRDZWxsQ29vcmRpbmF0ZXMoKSB7XG4gICAgY29uc3QgY3VycmVudENlbGwgPSB0aGlzLmNlbGxzID8gQXJyYXkuZnJvbSh0aGlzLmNlbGxzKS5maW5kKGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykgPT09ICcwJykgOiBudWxsO1xuICAgIGNvbnN0IGN1cnJlbnRSb3c6IEhUTUxFbGVtZW50ID0gY3VycmVudENlbGwgPyBjdXJyZW50Q2VsbC5jbG9zZXN0KHRoaXMuY29uZmlnLmtleUdyaWRSb3dzKSA6IG51bGw7XG5cbiAgICBjb25zdCBjb29yZGluYXRlczogQ2VsbENvb3JkaW5hdGVzID0ge1xuICAgICAgeDpcbiAgICAgICAgY3VycmVudFJvdyAmJiBjdXJyZW50Q2VsbFxuICAgICAgICAgID8gQXJyYXkuZnJvbShjdXJyZW50Um93LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5jb25maWcua2V5R3JpZENlbGxzKSkuaW5kZXhPZihjdXJyZW50Q2VsbClcbiAgICAgICAgICA6IDAsXG4gICAgICB5OiBjdXJyZW50Um93ICYmIGN1cnJlbnRDZWxsICYmIHRoaXMucm93cyA/IEFycmF5LmZyb20odGhpcy5yb3dzKS5pbmRleE9mKGN1cnJlbnRSb3cpIDogMCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDZWxsc0ZvclJvdyhpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMucm93c1tpbmRleF0ucXVlcnlTZWxlY3RvckFsbCh0aGlzLmNvbmZpZy5rZXlHcmlkQ2VsbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0V4cGFuZGVkUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5yb3dzW2luZGV4XS5xdWVyeVNlbGVjdG9yKCcuZGF0YWdyaWQtcm93LWRldGFpbCcpO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudCA/IHNlbGVjdGVkRWxlbWVudC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgOiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEZXRhaWxzUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzW2luZGV4XS5jbGFzc0xpc3QuY29udGFpbnMoJ2RhdGFncmlkLXJvdy1kZXRhaWwnKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNSb3dSZXBsYWNlZChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuICEhdGhpcy5yb3dzW2luZGV4XS5jbG9zZXN0KCdjbHItZGctcm93LmRhdGFncmlkLXJvdy1yZXBsYWNlZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NpbmdsZUNlbGxFeHBhbmRlZFJvdyhpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5yb3dzW2luZGV4XS5jbGFzc0xpc3QuY29udGFpbnMoJ2RhdGFncmlkLXJvdy1kZXRhaWwnKVxuICAgICAgPyB0aGlzLnJvd3NbaW5kZXhdXG4gICAgICA6IHRoaXMucm93c1tpbmRleF0ucXVlcnlTZWxlY3RvcignLmRhdGFncmlkLXJvdy1kZXRhaWwnKTtcblxuICAgIHJldHVybiByb3c/LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5jb25maWcua2V5R3JpZENlbGxzKS5sZW5ndGggPT09IDE7XG4gIH1cblxuICBwcml2YXRlIGFjdGlvbkNlbGxDb3VudChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uQ2VsbHNBc0FycmF5KGluZGV4KS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGFjdGlvbkNlbGxzQXNBcnJheShpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnJvd3NbaW5kZXhdLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kYXRhZ3JpZC1yb3ctc3RpY2t5IC5kYXRhZ3JpZC1jZWxsLCAuZGF0YWdyaWQtcm93LXN0aWNreSAuZGF0YWdyaWQtY29sdW1uJylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FjdGlvbkNlbGwoY2VsbENvb3JkczogQ2VsbENvb3JkaW5hdGVzKSB7XG4gICAgcmV0dXJuICEhdGhpcy5hY3Rpb25DZWxsc0FzQXJyYXkoY2VsbENvb3Jkcy55KVtjZWxsQ29vcmRzLnhdO1xuICB9XG59XG4iXX0=
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LW5hdmlnYXRpb24tZ3JpZC5jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvZGF0YS9kYXRhZ3JpZC91dGlscy9rZXktbmF2aWdhdGlvbi1ncmlkLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFNUQsTUFBTSx1QkFBdUIsR0FBRztJQUM5QixTQUFTO0lBQ1QsWUFBWTtJQUNaLHVCQUF1QjtJQUN2Qix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLDBCQUEwQjtJQUMxQixRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCx3QkFBd0I7SUFDeEIsK0JBQStCO0NBQ2hDLENBQUM7QUFFRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsRUFBZTtJQUM5QyxNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBRyx1QkFBdUIsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQzdGLE1BQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBa0IsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxFQUFlO0lBQ3ZDLE1BQU0sa0JBQWtCLEdB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QUFDLEtBQUs7WUFDbEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztZQUNsRixDQUFDLENBQUMsSUFBSSxDQUFDO1FBRVQsSUFBSSxLQUFLLEVBQUU7WUFDVCxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0QztRQUVELFVBQVUsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBRTlCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3JDLElBQUksY0FBMkIsQ0FBQztZQUVoQyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssY0FBYyxFQUFFO2dCQUN0RCxjQUFjLEdBQUcsVUFBVSxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RELGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7YUFDN0U7WUFFRCxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDOzt3SEE5SVUsMkJBQTJCOzRIQUEzQiwyQkFBMkI7MkZBQTNCLDJCQUEyQjtrQkFEdkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNSBCcm9hZGNvbS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoZSB0ZXJtIFwiQnJvYWRjb21cIiByZWZlcnMgdG8gQnJvYWRjb20gSW5jLiBhbmQvb3IgaXRzIHN1YnNpZGlhcmllcy5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEtleXMgfSBmcm9tICcuLi8uLi8uLi91dGlscy9lbnVtcy9rZXlzLmVudW0nO1xuaW1wb3J0IHsgS2V5TmF2aWdhdGlvblV0aWxzIH0gZnJvbSAnLi9rZXktbmF2aWdhdGlvbi11dGlscyc7XG5cbmNvbnN0IGFjdGlvbmFibGVJdGVtU2VsZWN0b3JzID0gW1xuICAnYVtocmVmXScsXG4gICdhcmVhW2hyZWZdJyxcbiAgJ2lucHV0Om5vdChbZGlzYWJsZWRdKScsXG4gICdidXR0b246bm90KFtkaXNhYmxlZF0pJyxcbiAgJ3NlbGVjdDpub3QoW2Rpc2FibGVkXSknLFxuICAndGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pJyxcbiAgJ2lmcmFtZScsXG4gICdvYmplY3QnLFxuICAnZW1iZWQnLFxuICAnW2NvbnRlbnRlZGl0YWJsZT10cnVlXScsXG4gICdbcm9sZT1idXR0b25dOm5vdChbZGlzYWJsZWRdKScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFiYmFibGVJdGVtcyhlbDogSFRNTEVsZW1lbnQpIHtcbiAgY29uc3QgdGFiYmFibGVJdGVtU2VsZWN0b3JzID0gWy4uLmFjdGlvbmFibGVJdGVtU2VsZWN0b3JzLCAnW3RhYmluZGV4PVwiMFwiXTpub3QoW2Rpc2FibGVkXSknXTtcbiAgY29uc3QgdGFiYmFibGVTZWxlY3RvciA9IHRhYmJhYmxlSXRlbVNlbGVjdG9ycy5qb2luKCcsJyk7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsLnF1ZXJ5U2VsZWN0b3JBbGwodGFiYmFibGVTZWxlY3RvcikpIGFzIEhUTUxFbGVtZW50W107XG59XG5cbmZ1bmN0aW9uIGlzQWN0aW9uYWJsZUl0ZW0oZWw6IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IGFjdGlvbmFibGVTZWxlY3RvciA9IGFjdGlvbmFibGVJdGVtU2VsZWN0b3JzLmpvaW4oJywnKTtcbiAgcmV0dXJuIGVsLm1hdGNoZXMoYWN0aW9uYWJsZVNlbGVjdG9yKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXlOYXZpZ2F0aW9uR3JpZENvbmZpZyB7XG4gIGtleUdyaWQ6IHN0cmluZztcbiAga2V5R3JpZFJvd3M6IHN0cmluZztcbiAga2V5R3JpZENlbGxzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2VsbENvb3JkaW5hdGVzIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBLZXlOYXZpZ2F0aW9uR3JpZENvbnRyb2xsZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBza2lwSXRlbUZvY3VzID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBrZXlOYXZVdGlsczogS2V5TmF2aWdhdGlvblV0aWxzO1xuICBwcml2YXRlIGNvbmZpZzogS2V5TmF2aWdhdGlvbkdyaWRDb25maWc7XG4gIHByaXZhdGUgbGlzdGVuZXJzQWRkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2FjdGl2ZUNlbGw6IEhUTUxFbGVtZW50ID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAga2V5R3JpZFJvd3M6ICdbcm9sZT1yb3ddOm5vdCguZGF0YWdyaWQtcGxhY2Vob2xkZXIpOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZVwiXSknLFxuICAgICAga2V5R3JpZENlbGxzOlxuICAgICAgICAnW3JvbGU9Z3JpZGNlbGxdOm5vdCguZGF0YWdyaWQtaGlkZGVuLWNvbHVtbik6bm90KC5kYXRhZ3JpZC1wbGFjZWhvbGRlci1jb250ZW50KSwgW3JvbGU9Y29sdW1uaGVhZGVyXTpub3QoLmRhdGFncmlkLWhpZGRlbi1jb2x1bW4pOm5vdCguZGF0YWdyaWQtcGxhY2Vob2xkZXItY29udGVudCksIC5kYXRhZ3JpZC1kZXRhaWwtY2FyZXQnLFxuICAgICAga2V5R3JpZDogJ1tyb2xlPWdyaWRdJyxcbiAgICB9O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgYWRkTGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLmxpc3RlbmVyc0FkZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh0aGlzLmtleU5hdlV0aWxzLmdyaWQsICdtb3VzZWRvd24nKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAvLyBwcmVzZXJ2ZSByaWdodCBjbGljayBmb3IgY29udGV4dCBtZW51cyAmIGtleWJvYXJkIG1vdXNlIGNvbnRyb2wgaHR0cHM6Ly9hcHBsZS5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMzI3MTUvaG93LWRvLWktb3Blbi10aGUtY29udGV4dC1tZW51LWZyb20tYS1tYWMta2V5Ym9hcmRcbiAgICAgICAgICBpZiAoZS5idXR0b25zID09PSAxICYmICFlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSB0aGlzLmtleU5hdlV0aWxzLmNlbGxzXG4gICAgICAgICAgICAgID8gQXJyYXkuZnJvbSh0aGlzLmtleU5hdlV0aWxzLmNlbGxzKS5maW5kKFxuICAgICAgICAgICAgICAgICAgYyA9PiBjID09PSBlLnRhcmdldCB8fCBjID09PSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QodGhpcy5jb25maWcua2V5R3JpZENlbGxzKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUNlbGwpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVDZWxsKGFjdGl2ZUNlbGwsIHsga2VlcEZvY3VzOiBpc0FjdGlvbmFibGVJdGVtKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICBmcm9tRXZlbnQodGhpcy5rZXlOYXZVdGlscy5ncmlkLCAnd2hlZWwnKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWN0aXZlQ2VsbCgpO1xuICAgICAgICB9KTtcblxuICAgICAgZnJvbUV2ZW50KHRoaXMua2V5TmF2VXRpbHMuZ3JpZCwgJ2ZvY3Vzb3V0JylcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmtleU5hdlV0aWxzLmdyaWQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnJlbW92ZUFjdGl2ZUNlbGwoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGZyb21FdmVudCh0aGlzLmtleU5hdlV0aWxzLmdyaWQsICdrZXlkb3duJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gU2tpcCBjb2x1bW4gcmVzaXplIGV2ZW50c1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdkcmFnLWhhbmRsZScpICYmXG4gICAgICAgICAgICAoZS5rZXkgPT09IEtleXMuQXJyb3dMZWZ0IHx8IGUua2V5ID09PSBLZXlzLkFycm93UmlnaHQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGUua2V5ID09PSBLZXlzLkFycm93VXAgfHxcbiAgICAgICAgICAgIGUua2V5ID09PSBLZXlzLkFycm93RG93biB8fFxuICAgICAgICAgICAgZS5rZXkgPT09IEtleXMuQXJyb3dMZWZ0IHx8XG4gICAgICAgICAgICBlLmtleSA9PT0gS2V5cy5BcnJvd1JpZ2h0IHx8XG4gICAgICAgICAgICBlLmtleSA9PT0gS2V5cy5FbmQgfHxcbiAgICAgICAgICAgIGUua2V5ID09PSBLZXlzLkhvbWUgfHxcbiAgICAgICAgICAgIGUua2V5ID09PSBLZXlzLlBhZ2VVcCB8fFxuICAgICAgICAgICAgZS5rZXkgPT09IEtleXMuUGFnZURvd25cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRDZWxsQ29vcmRzID0gdGhpcy5rZXlOYXZVdGlscy5nZXROZXh0SXRlbUNvb3JkaW5hdGUoZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSB0aGlzLmtleU5hdlV0aWxzLnJvd3NcbiAgICAgICAgICAgICAgPyAoQXJyYXkuZnJvbSh0aGlzLmtleU5hdlV0aWxzLmdldENlbGxzRm9yUm93KG5leHRDZWxsQ29vcmRzLnkpKVtuZXh0Q2VsbENvb3Jkcy54XSBhcyBIVE1MRWxlbWVudClcbiAgICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoYWN0aXZlSXRlbSkge1xuICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUNlbGwoYWN0aXZlSXRlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMubGlzdGVuZXJzQWRkZWQgPSB0cnVlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUtleUdyaWQoaG9zdDogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLmtleU5hdlV0aWxzID0gbmV3IEtleU5hdmlnYXRpb25VdGlscyhob3N0LCB0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5hZGRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnJlc2V0S2V5R3JpZCgpO1xuICB9XG5cbiAgcmVzZXRLZXlHcmlkKCkge1xuICAgIHRoaXMua2V5TmF2VXRpbHMuY2VsbHM/LmZvckVhY2goKGk6IEhUTUxFbGVtZW50KSA9PiBpLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKSk7XG4gICAgY29uc3QgZmlyc3RDZWxsID0gdGhpcy5rZXlOYXZVdGlscy5jZWxscyA/IHRoaXMua2V5TmF2VXRpbHMuY2VsbHNbMF0gOiBudWxsO1xuICAgIGZpcnN0Q2VsbD8uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gIH1cblxuICByZW1vdmVBY3RpdmVDZWxsKCkge1xuICAgIHRoaXMuX2FjdGl2ZUNlbGwgPSBudWxsO1xuICB9XG5cbiAgZ2V0QWN0aXZlQ2VsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlQ2VsbDtcbiAgfVxuXG4gIHNldEFjdGl2ZUNlbGwoYWN0aXZlQ2VsbDogSFRNTEVsZW1lbnQsIHsga2VlcEZvY3VzIH0gPSB7IGtlZXBGb2N1czogZmFsc2UgfSkge1xuICAgIGNvbnN0IHByaW9yID0gdGhpcy5rZXlOYXZVdGlscy5jZWxsc1xuICAgICAgPyBBcnJheS5mcm9tKHRoaXMua2V5TmF2VXRpbHMuY2VsbHMpLmZpbmQoYyA9PiBjLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSA9PT0gJzAnKVxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKHByaW9yKSB7XG4gICAgICBwcmlvci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgfVxuXG4gICAgYWN0aXZlQ2VsbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLl9hY3RpdmVDZWxsID0gYWN0aXZlQ2VsbDtcblxuICAgIGlmICghdGhpcy5za2lwSXRlbUZvY3VzICYmICFrZWVwRm9jdXMpIHtcbiAgICAgIGxldCBlbGVtZW50VG9Gb2N1czogSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmIChhY3RpdmVDZWxsLmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnY29sdW1uaGVhZGVyJykge1xuICAgICAgICBlbGVtZW50VG9Gb2N1cyA9IGFjdGl2ZUNlbGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0YWJiYWJsZUVsZW1lbnRzID0gZ2V0VGFiYmFibGVJdGVtcyhhY3RpdmVDZWxsKTtcbiAgICAgICAgZWxlbWVudFRvRm9jdXMgPSB0YWJiYWJsZUVsZW1lbnRzLmxlbmd0aCA/IHRhYmJhYmxlRWxlbWVudHNbMF0gOiBhY3RpdmVDZWxsO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50VG9Gb2N1cy5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,132 @@
1
+ /*
2
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
3
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
4
+ * This software is released under MIT license.
5
+ * The full license information can be found in LICENSE in the root directory of this project.
6
+ */
7
+ export class DefaultKeyNavigationStrategy {
8
+ constructor(utils) {
9
+ this.utils = utils;
10
+ }
11
+ keyUp(currentCellCoords) {
12
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
13
+ if (currentCellCoords.y === 0) {
14
+ return nextCellCoords;
15
+ }
16
+ nextCellCoords.y = currentCellCoords.y - 1;
17
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
18
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y) &&
19
+ !isActionCell &&
20
+ this.utils.isDetailsRow(nextCellCoords.y)) {
21
+ nextCellCoords.x = 0;
22
+ }
23
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
24
+ if (isActionCell) {
25
+ nextCellCoords.y = nextCellCoords.y - 1;
26
+ }
27
+ else {
28
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
29
+ }
30
+ }
31
+ return nextCellCoords;
32
+ }
33
+ keyDown(currentCellCoords) {
34
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
35
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
36
+ if (currentCellCoords.y >= numOfRows) {
37
+ return nextCellCoords;
38
+ }
39
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
40
+ nextCellCoords.y = currentCellCoords.y + 1;
41
+ if (!isActionCell && this.utils.isRowReplaced(nextCellCoords.y)) {
42
+ nextCellCoords.y = nextCellCoords.y + 1;
43
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
44
+ ? 0
45
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
46
+ }
47
+ return nextCellCoords;
48
+ }
49
+ keyLeft(currentCellCoords) {
50
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
51
+ if (currentCellCoords.x === 0) {
52
+ return nextCellCoords;
53
+ }
54
+ nextCellCoords.x = currentCellCoords.x - 1;
55
+ return nextCellCoords;
56
+ }
57
+ keyRight(currentCellCoords) {
58
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
59
+ // calculate numOfColumns based on header cells.
60
+ const numOfColumns = this.utils.rows?.length - 1 ? this.utils.getCellsForRow(0).length - 1 : 0;
61
+ nextCellCoords.x = currentCellCoords.x < numOfColumns ? nextCellCoords.x + 1 : nextCellCoords.x;
62
+ return nextCellCoords;
63
+ }
64
+ keyEnd(currentCellCoords, ctrlKey) {
65
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
66
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
67
+ // calculate X based on header cells.
68
+ nextCellCoords.x = numOfRows ? this.utils.getCellsForRow(0).length - 1 : 0;
69
+ if (ctrlKey) {
70
+ nextCellCoords.y = numOfRows;
71
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
72
+ nextCellCoords.x = this.utils.getCellsForRow(nextCellCoords.y).length - 1;
73
+ }
74
+ }
75
+ return nextCellCoords;
76
+ }
77
+ keyHome(currentCellCoords, ctrlKey) {
78
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
79
+ nextCellCoords.x = 0;
80
+ if (ctrlKey) {
81
+ nextCellCoords.y = 0;
82
+ }
83
+ return nextCellCoords;
84
+ }
85
+ keyPageUp(currentCellCoords) {
86
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
87
+ const itemsPerPage = this.utils.itemsPerPage;
88
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
89
+ if (!this.utils.isActionCell(currentCellCoords)) {
90
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
91
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
92
+ ? 0
93
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
94
+ }
95
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
96
+ nextCellCoords.y = nextCellCoords.y + 1;
97
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
98
+ ? 0
99
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
100
+ }
101
+ }
102
+ else {
103
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
104
+ nextCellCoords.y = nextCellCoords.y - 1;
105
+ }
106
+ }
107
+ return nextCellCoords;
108
+ }
109
+ keyPageDown(currentCellCoords) {
110
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
111
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
112
+ const itemsPerPage = this.utils.itemsPerPage;
113
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
114
+ if (this.utils.isActionCell(currentCellCoords) && this.utils.isDetailsRow(nextCellCoords.y)) {
115
+ nextCellCoords.y = nextCellCoords.y - 1;
116
+ }
117
+ else if (this.utils.isDetailsRow(nextCellCoords.y) && this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
118
+ nextCellCoords.x = 0;
119
+ }
120
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
121
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
122
+ }
123
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
124
+ nextCellCoords.y = nextCellCoords.y + 1;
125
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
126
+ ? 0
127
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
128
+ }
129
+ return nextCellCoords;
130
+ }
131
+ }
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjL2RhdGEvZGF0YWdyaWQvdXRpbHMva2V5LW5hdmlnYXRpb24tc3RyYXRlZ2llcy9kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBTUgsTUFBTSxPQUFPLDRCQUE0QjtJQUN2QyxZQUFzQixLQUF5QjtRQUF6QixVQUFLLEdBQUwsS0FBSyxDQUFvQjtJQUFHLENBQUM7SUFFbkQsS0FBSyxDQUFDLGlCQUFrQztRQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFMUUsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU8sY0FBYyxDQUFDO1NBQ3ZCO1FBRUQsY0FBYyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFaEUsSUFDRSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsQ0FBQyxZQUFZO1lBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUN6QztZQUNBLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEQsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLGNBQWMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekM7aUJBQU07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QUMsQ0FBQztTQUN2RjthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JELGNBQWMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLENBQUMsQ0FBQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hFO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDI1IEJyb2FkY29tLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhlIHRlcm0gXCJCcm9hZGNvbVwiIHJlZmVycyB0byBCcm9hZGNvbSBJbmMuIGFuZC9vciBpdHMgc3Vic2lkaWFyaWVzLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBLZXlOYXZpZ2F0aW9uR3JpZFN0cmF0ZWd5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9rZXktbmF2LWdyaWQtc3RyYXRlZ3kuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGxDb29yZGluYXRlcyB9IGZyb20gJy4uL2tleS1uYXZpZ2F0aW9uLWdyaWQuY29udHJvbGxlcic7XG5pbXBvcnQgeyBLZXlOYXZpZ2F0aW9uVXRpbHMgfSBmcm9tICcuLi9rZXktbmF2aWdhdGlvbi11dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0S2V5TmF2aWdhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgS2V5TmF2aWdhdGlvbkdyaWRTdHJhdGVneUludGVyZmFjZSB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB1dGlsczogS2V5TmF2aWdhdGlvblV0aWxzKSB7fVxuXG4gIGtleVVwKGN1cnJlbnRDZWxsQ29vcmRzOiBDZWxsQ29vcmRpbmF0ZXMpIHtcbiAgICBjb25zdCBuZXh0Q2VsbENvb3JkcyA9IHRoaXMudXRpbHMuY3JlYXRlTmV4dENlbGxDb29yZHMoY3VycmVudENlbGxDb29yZHMpO1xuXG4gICAgaWYgKGN1cnJlbnRDZWxsQ29vcmRzLnkgPT09IDApIHtcbiAgICAgIHJldHVybiBuZXh0Q2VsbENvb3JkcztcbiAgICB9XG5cbiAgICBuZXh0Q2VsbENvb3Jkcy55ID0gY3VycmVudENlbGxDb29yZHMueSAtIDE7XG5cbiAgICBjb25zdCBpc0FjdGlvbkNlbGwgPSB0aGlzLnV0aWxzLmlzQWN0aW9uQ2VsbChjdXJyZW50Q2VsbENvb3Jkcyk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnV0aWxzLmlzU2luZ2xlQ2VsbEV4cGFuZGVkUm93KG5leHRDZWxsQ29vcmRzLnkpICYmXG4gICAgICAhaXNBY3Rpb25DZWxsICYmXG4gICAgICB0aGlzLnV0aWxzLmlzRGV0YWlsc1JvdyhuZXh0Q2VsbENvb3Jkcy55KVxuICAgICkge1xuICAgICAgbmV4dENlbGxDb29yZHMueCA9IDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLnV0aWxzLmlzRGV0YWlsc1JvdyhuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgaWYgKGlzQWN0aW9uQ2VsbCkge1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy55ID0gbmV4dENlbGxDb29yZHMueSAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gbmV4dENlbGxDb29yZHMueCAtIHRoaXMudXRpbHMuYWN0aW9uQ2VsbENvdW50KGN1cnJlbnRDZWxsQ29vcmRzLnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0Q2VsbENvb3JkcztcbiAgfVxuXG4gIGtleURvd24oY3VycmVudENlbGxDb29yZHM6IENlbGxDb29yZGluYXRlcykge1xuICAgIGNvbnN0IG5leHRDZWxsQ29vcmRzID0gdGhpcy51dGlscy5jcmVhdGVOZXh0Q2VsbENvb3JkcyhjdXJyZW50Q2VsbENvb3Jkcyk7XG5cbiAgICBjb25zdCBudW1PZlJvd3MgPSB0aGlzLnV0aWxzLnJvd3MgPyB0aGlzLnV0aWxzLnJvd3MubGVuZ3RoIC0gMSA6IDA7XG4gICAgaWYgKGN1cnJlbnRDZWxsQ29vcmRzLnkgPj0gbnVtT2ZSb3dzKSB7XG4gICAgICByZXR1cm4gbmV4dENlbGxDb29yZHM7XG4gICAgfVxuXG4gICAgY29uc3QgaXNBY3Rpb25DZWxsID0gdGhpcy51dGlscy5pc0FjdGlvbkNlbGwoY3VycmVudENlbGxDb29yZHMpO1xuICAgIG5leHRDZWxsQ29vcmRzLnkgPSBjdXJyZW50Q2VsbENvb3Jkcy55ICsgMTtcblxuICAgIGlmICghaXNBY3Rpb25DZWxsICYmIHRoaXMudXRpbHMuaXNSb3dSZXBsYWNlZChuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgbmV4dENlbGxDb29yZHMueSA9IG5leHRDZWxsQ29vcmRzLnkgKyAxO1xuXG4gICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gdGhpcy51dGlscy5pc1NpbmdsZUNlbGxFeHBhbmRlZFJvdyhuZXh0Q2VsbENvb3Jkcy55KVxuICAgICAgICA/IDBcbiAgICAgICAgOiBuZXh0Q2VsbENvb3Jkcy54IC0gdGhpcy51dGlscy5hY3Rpb25DZWxsQ291bnQoY3VycmVudENlbGxDb29yZHMueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRDZWxsQ29vcmRzO1xuICB9XG5cbiAga2V5TGVmdChjdXJyZW50Q2VsbENvb3JkczogQ2VsbENvb3JkaW5hdGVzKSB7XG4gICAgY29uc3QgbmV4dENlbGxDb29yZHMgPSB0aGlzLnV0aWxzLmNyZWF0ZU5leHRDZWxsQ29vcmRzKGN1cnJlbnRDZWxsQ29vcmRzKTtcblxuICAgIGlmIChjdXJyZW50Q2VsbENvb3Jkcy54ID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV4dENlbGxDb29yZHM7XG4gICAgfVxuXG4gICAgbmV4dENlbGxDb29yZHMueCA9IGN1cnJlbnRDZWxsQ29vcmRzLnggLSAxO1xuXG4gICAgcmV0dXJuIG5leHRDZWxsQ29vcmRzO1xuICB9XG5cbiAga2V5UmlnaHQoY3VycmVudENlbGxDb29yZHM6IENlbGxDb29yZGluYXRlcykge1xuICAgIGNvbnN0IG5leHRDZWxsQ29vcmRzID0gdGhpcy51dGlscy5jcmVhdGVOZXh0Q2VsbENvb3JkcyhjdXJyZW50Q2VsbENvb3Jkcyk7XG5cbiAgICAvLyBjYWxjdWxhdGUgbnVtT2ZDb2x1bW5zIGJhc2VkIG9uIGhlYWRlciBjZWxscy5cbiAgICBjb25zdCBudW1PZkNvbHVtbnMgPSB0aGlzLnV0aWxzLnJvd3M/Lmxlbmd0aCAtIDEgPyB0aGlzLnV0aWxzLmdldENlbGxzRm9yUm93KDApLmxlbmd0aCAtIDEgOiAwO1xuXG4gICAgbmV4dENlbGxDb29yZHMueCA9IGN1cnJlbnRDZWxsQ29vcmRzLnggPCBudW1PZkNvbHVtbnMgPyBuZXh0Q2VsbENvb3Jkcy54ICsgMSA6IG5leHRDZWxsQ29vcmRzLng7XG5cbiAgICByZXR1cm4gbmV4dENlbGxDb29yZHM7XG4gIH1cblxuICBrZXlFbmQoY3VycmVudENlbGxDb29yZHM6IENlbGxDb29yZGluYXRlcywgY3RybEtleTogYm9vbGVhbikge1xuICAgIGNvbnN0IG5leHRDZWxsQ29vcmRzID0gdGhpcy51dGlscy5jcmVhdGVOZXh0Q2VsbENvb3JkcyhjdXJyZW50Q2VsbENvb3Jkcyk7XG4gICAgY29uc3QgbnVtT2ZSb3dzID0gdGhpcy51dGlscy5yb3dzID8gdGhpcy51dGlscy5yb3dzLmxlbmd0aCAtIDEgOiAwO1xuXG4gICAgLy8gY2FsY3VsYXRlIFggYmFzZWQgb24gaGVhZGVyIGNlbGxzLlxuICAgIG5leHRDZWxsQ29vcmRzLnggPSBudW1PZlJvd3MgPyB0aGlzLnV0aWxzLmdldENlbGxzRm9yUm93KDApLmxlbmd0aCAtIDEgOiAwO1xuXG4gICAgaWYgKGN0cmxLZXkpIHtcbiAgICAgIG5leHRDZWxsQ29vcmRzLnkgPSBudW1PZlJvd3M7XG5cbiAgICAgIGlmICh0aGlzLnV0aWxzLmlzRGV0YWlsc1JvdyhuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy54ID0gdGhpcy51dGlscy5nZXRDZWxsc0ZvclJvdyhuZXh0Q2VsbENvb3Jkcy55KS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0Q2VsbENvb3JkcztcbiAgfVxuXG4gIGtleUhvbWUoY3VycmVudENlbGxDb29yZHM6IENlbGxDb29yZGluYXRlcywgY3RybEtleTogYm9vbGVhbikge1xuICAgIGNvbnN0IG5leHRDZWxsQ29vcmRzID0gdGhpcy51dGlscy5jcmVhdGVOZXh0Q2VsbENvb3JkcyhjdXJyZW50Q2VsbENvb3Jkcyk7XG5cbiAgICBuZXh0Q2VsbENvb3Jkcy54ID0gMDtcblxuICAgIGlmIChjdHJsS2V5KSB7XG4gICAgICBuZXh0Q2VsbENvb3Jkcy55ID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dENlbGxDb29yZHM7XG4gIH1cblxuICBrZXlQYWdlVXAoY3VycmVudENlbGxDb29yZHM6IENlbGxDb29yZGluYXRlcykge1xuICAgIGNvbnN0IG5leHRDZWxsQ29vcmRzID0gdGhpcy51dGlscy5jcmVhdGVOZXh0Q2VsbENvb3JkcyhjdXJyZW50Q2VsbENvb3Jkcyk7XG4gICAgY29uc3QgaXRlbXNQZXJQYWdlID0gdGhpcy51dGlscy5pdGVtc1BlclBhZ2U7XG5cbiAgICBuZXh0Q2VsbENvb3Jkcy55ID0gY3VycmVudENlbGxDb29yZHMueSAtIGl0ZW1zUGVyUGFnZSA+IDAgPyBjdXJyZW50Q2VsbENvb3Jkcy55IC0gaXRlbXNQZXJQYWdlICsgMSA6IDE7XG5cbiAgICBpZiAoIXRoaXMudXRpbHMuaXNBY3Rpb25DZWxsKGN1cnJlbnRDZWxsQ29vcmRzKSkge1xuICAgICAgaWYgKHRoaXMudXRpbHMuaXNEZXRhaWxzUm93KG5leHRDZWxsQ29vcmRzLnkpKSB7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnggPSB0aGlzLnV0aWxzLmlzU2luZ2xlQ2VsbEV4cGFuZGVkUm93KG5leHRDZWxsQ29vcmRzLnkpXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiBuZXh0Q2VsbENvb3Jkcy54IC0gdGhpcy51dGlscy5hY3Rpb25DZWxsQ291bnQoY3VycmVudENlbGxDb29yZHMueSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudXRpbHMuaXNSb3dSZXBsYWNlZChuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgICBuZXh0Q2VsbENvb3Jkcy55ID0gbmV4dENlbGxDb29yZHMueSArIDE7XG5cbiAgICAgICAgbmV4dENlbGxDb29yZHMueCA9IHRoaXMudXRpbHMuaXNTaW5nbGVDZWxsRXhwYW5kZWRSb3cobmV4dENlbGxDb29yZHMueSlcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IG5leHRDZWxsQ29vcmRzLnggLSB0aGlzLnV0aWxzLmFjdGlvbkNlbGxDb3VudChjdXJyZW50Q2VsbENvb3Jkcy55KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMudXRpbHMuaXNEZXRhaWxzUm93KG5leHRDZWxsQ29vcmRzLnkpKSB7XG4gICAgICAgIG5leHRDZWxsQ29vcmRzLnkgPSBuZXh0Q2VsbENvb3Jkcy55IC0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dENlbGxDb29yZHM7XG4gIH1cblxuICBrZXlQYWdlRG93bihjdXJyZW50Q2VsbENvb3JkczogQ2VsbENvb3JkaW5hdGVzKSB7XG4gICAgY29uc3QgbmV4dENlbGxDb29yZHMgPSB0aGlzLnV0aWxzLmNyZWF0ZU5leHRDZWxsQ29vcmRzKGN1cnJlbnRDZWxsQ29vcmRzKTtcbiAgICBjb25zdCBudW1PZlJvd3MgPSB0aGlzLnV0aWxzLnJvd3MgPyB0aGlzLnV0aWxzLnJvd3MubGVuZ3RoIC0gMSA6IDA7XG4gICAgY29uc3QgaXRlbXNQZXJQYWdlID0gdGhpcy51dGlscy5pdGVtc1BlclBhZ2U7XG5cbiAgICBuZXh0Q2VsbENvb3Jkcy55ID0gY3VycmVudENlbGxDb29yZHMueSArIGl0ZW1zUGVyUGFnZSA+PSBudW1PZlJvd3MgPyBudW1PZlJvd3MgOiBjdXJyZW50Q2VsbENvb3Jkcy55ICsgaXRlbXNQZXJQYWdlO1xuXG4gICAgaWYgKHRoaXMudXRpbHMuaXNBY3Rpb25DZWxsKGN1cnJlbnRDZWxsQ29vcmRzKSAmJiB0aGlzLnV0aWxzLmlzRGV0YWlsc1JvdyhuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgbmV4dENlbGxDb29yZHMueSA9IG5leHRDZWxsQ29vcmRzLnkgLSAxO1xuICAgIH0gZWxzZSBpZiAodGhpcy51dGlscy5pc0RldGFpbHNSb3cobmV4dENlbGxDb29yZHMueSkgJiYgdGhpcy51dGlscy5pc1NpbmdsZUNlbGxFeHBhbmRlZFJvdyhuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgbmV4dENlbGxDb29yZHMueCA9IDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLnV0aWxzLmlzRGV0YWlsc1JvdyhuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgbmV4dENlbGxDb29yZHMueCA9IG5leHRDZWxsQ29vcmRzLnggLSB0aGlzLnV0aWxzLmFjdGlvbkNlbGxDb3VudChjdXJyZW50Q2VsbENvb3Jkcy55KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudXRpbHMuaXNSb3dSZXBsYWNlZChuZXh0Q2VsbENvb3Jkcy55KSkge1xuICAgICAgbmV4dENlbGxDb29yZHMueSA9IG5leHRDZWxsQ29vcmRzLnkgKyAxO1xuICAgICAgbmV4dENlbGxDb29yZHMueCA9IHRoaXMudXRpbHMuaXNTaW5nbGVDZWxsRXhwYW5kZWRSb3cobmV4dENlbGxDb29yZHMueSlcbiAgICAgICAgPyAwXG4gICAgICAgIDogbmV4dENlbGxDb29yZHMueCAtIHRoaXMudXRpbHMuYWN0aW9uQ2VsbENvdW50KGN1cnJlbnRDZWxsQ29vcmRzLnkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0Q2VsbENvb3JkcztcbiAgfVxufVxuIl19