@lumeer/pivot 0.0.6 → 0.0.7

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 (30) hide show
  1. package/esm2022/lib/lmr-pivot-table.component.mjs +70 -10
  2. package/esm2022/lib/lmr-pivot-table.module.mjs +16 -4
  3. package/esm2022/lib/lmr-simple-pivot-table.component.mjs +6 -3
  4. package/esm2022/lib/pipes/cell-has-value.pipe.mjs +35 -0
  5. package/esm2022/lib/pipes/filter-visible-cells.pipe.mjs +35 -0
  6. package/esm2022/lib/pipes/is-cell-expandable.pipe.mjs +35 -0
  7. package/esm2022/lib/pipes/is-cell-expanded.pipe.mjs +37 -0
  8. package/esm2022/lib/pipes/is-cell-rows-expandable.pipe.mjs +35 -0
  9. package/esm2022/lib/util/lmr-pivot-state.mjs +150 -0
  10. package/esm2022/lib/util/lmr-pivot-table.mjs +1 -1
  11. package/esm2022/lib/util/pivot-table-converter.mjs +62 -40
  12. package/esm2022/lib/util/pivot-util.mjs +7 -4
  13. package/fesm2022/lumeer-pivot.mjs +428 -58
  14. package/fesm2022/lumeer-pivot.mjs.map +1 -1
  15. package/lib/lmr-pivot-table.component.d.ts +20 -4
  16. package/lib/lmr-pivot-table.module.d.ts +10 -6
  17. package/lib/lmr-simple-pivot-table.component.d.ts +8 -2
  18. package/lib/pipes/cell-has-value.pipe.d.ts +8 -0
  19. package/lib/pipes/filter-visible-cells.pipe.d.ts +9 -0
  20. package/lib/pipes/is-cell-expandable.pipe.d.ts +8 -0
  21. package/lib/pipes/is-cell-expanded.pipe.d.ts +9 -0
  22. package/lib/pipes/is-cell-rows-expandable.pipe.d.ts +8 -0
  23. package/lib/util/lmr-pivot-state.d.ts +14 -0
  24. package/lib/util/lmr-pivot-table.d.ts +7 -1
  25. package/lib/util/pivot-table-converter.d.ts +1 -0
  26. package/lumeer-pivot-0.0.7.tgz +0 -0
  27. package/package.json +1 -1
  28. package/esm2022/lib/pipes/pivot-table-value.pipe.mjs +0 -35
  29. package/lib/pipes/pivot-table-value.pipe.d.ts +0 -8
  30. package/lumeer-pivot-0.0.6.tgz +0 -0
@@ -17,7 +17,7 @@
17
17
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
18
  */
19
19
  import { aggregateDataValues, DataAggregationType, isValueAggregation, NumberConstraint, PercentageConstraint, UnknownConstraint, } from '@lumeer/data-filters';
20
- import { deepObjectCopy, isArray, isNotNullOrUndefined, isNullOrUndefined, isNumeric, shadeColor, toNumber, uniqueValues, } from '@lumeer/utils';
20
+ import { createRange, deepObjectCopy, isArray, isNotNullOrUndefined, isNullOrUndefined, isNumeric, shadeColor, toNumber, uniqueValues, } from '@lumeer/utils';
21
21
  import { LmrPivotValueType } from './lmr-pivot-config';
22
22
  import { COLOR_GRAY100, COLOR_GRAY200, COLOR_GRAY300, COLOR_GRAY400, COLOR_GRAY500 } from './lmr-pivot-constants';
23
23
  export class PivotTableConverter {
@@ -118,6 +118,7 @@ export class PivotTableConverter {
118
118
  background: this.getHeaderBackground(header, level),
119
119
  constraint: header.constraint,
120
120
  label: header.attributeName,
121
+ childIndexes: createRange(currentIndex, currentIndex + (header.children?.length || 1))
121
122
  };
122
123
  if (header.children) {
123
124
  this.iterateAndFillCellsByRows(cells, rowGroupsInfo, header.children, currentIndex, showSums, level + 1, header);
@@ -130,24 +131,23 @@ export class PivotTableConverter {
130
131
  for (let i = 0; i < expressions.length; i++) {
131
132
  const expressionIndex = currentIndex - (expressions.length - i);
132
133
  const background = this.getSummaryBackground(level);
133
- this.splitRowGroupHeader(cells, level, expressionIndex, background, expressions[i].title);
134
- this.fillCellsForExpressionRow(cells, expressions[i], expressionIndex, background);
134
+ const { indexes } = this.fillCellsForExpressionRow(cells, expressions[i], expressionIndex, background);
135
+ this.splitRowGroupHeader(cells, level, expressionIndex, background, expressions[i].title, indexes);
136
+ rowGroupsInfo[expressionIndex] = { background, indexes: [], expression: expressions[i], level };
135
137
  }
136
138
  }
137
139
  if (showSums[level]) {
138
140
  const { title, summary } = this.formatSummaryHeader(parentHeader, level);
139
141
  const background = this.getSummaryBackground(level);
140
142
  const columnIndex = Math.max(level - 1, 0);
141
- this.splitRowGroupHeader(cells, columnIndex, currentIndex, background, summary, title, parentHeader?.constraint, parentHeader?.attributeName);
143
+ this.splitRowGroupHeader(cells, columnIndex, currentIndex, background, summary, [], title, parentHeader?.constraint, parentHeader?.attributeName);
142
144
  const rowIndexes = getTargetIndexesForHeaders(headers);
143
- const transformedRowIndexes = rowIndexes
144
- .map(v => this.rowsTransformationArray[v])
145
- .filter(v => isNotNullOrUndefined(v));
145
+ const transformedRowIndexes = this.transformRowIndexes(rowIndexes);
146
146
  rowGroupsInfo[currentIndex] = { background, indexes: transformedRowIndexes, level };
147
147
  this.fillCellsForGroupedRow(cells, rowIndexes, currentIndex, background);
148
148
  }
149
149
  }
150
- splitRowGroupHeader(cells, columnIndex, currentIndex, background, summary, title, constraint, label) {
150
+ splitRowGroupHeader(cells, columnIndex, currentIndex, background, summary, rowIndexes, title, constraint, label) {
151
151
  let colSpan = this.rowLevels - columnIndex;
152
152
  const stickyStart = this.isRowLevelSticky(columnIndex);
153
153
  // split row group header cell because of correct sticky scroll
@@ -158,7 +158,7 @@ export class PivotTableConverter {
158
158
  constraint: undefined,
159
159
  label: undefined,
160
160
  cssClass: PivotTableConverter.rowGroupHeaderClass,
161
- isHeader: true,
161
+ isSummary: true,
162
162
  rowSpan: 1,
163
163
  colSpan: colSpan - newColspan,
164
164
  background,
@@ -171,12 +171,13 @@ export class PivotTableConverter {
171
171
  constraint,
172
172
  label,
173
173
  cssClass: PivotTableConverter.rowGroupHeaderClass,
174
- isHeader: true,
174
+ isSummary: true,
175
175
  stickyStart,
176
176
  rowSpan: 1,
177
177
  colSpan,
178
178
  background,
179
179
  summary,
180
+ rowIndexes,
180
181
  };
181
182
  }
182
183
  formatSummaryHeader(header, level) {
@@ -227,7 +228,7 @@ export class PivotTableConverter {
227
228
  rowSpan: 1,
228
229
  colSpan: 1,
229
230
  cssClass: PivotTableConverter.dataClass,
230
- isHeader: false,
231
+ isValue: true,
231
232
  };
232
233
  }
233
234
  }
@@ -296,17 +297,19 @@ export class PivotTableConverter {
296
297
  colSpan: 1,
297
298
  rowSpan: 1,
298
299
  cssClass: PivotTableConverter.groupDataClass,
299
- isHeader: false,
300
300
  background,
301
+ isValue: true,
301
302
  };
302
303
  }
303
304
  }
304
305
  }
305
306
  fillCellsForExpressionRow(cells, expression, rowIndexInCells, background) {
307
+ let rowIndexes = [];
306
308
  for (let column = 0; column < this.columnsTransformationArray.length; column++) {
307
309
  const columnIndexInCells = this.columnsTransformationArray[column];
308
310
  if (isNotNullOrUndefined(columnIndexInCells)) {
309
- const { value, dataResources } = this.evaluateExpression(expression, column);
311
+ const { value, dataResources, indexes } = this.evaluateExpression(expression, [column]);
312
+ rowIndexes = indexes;
310
313
  const valueIndex = column % this.data.valueTitles.length;
311
314
  const formattedValue = this.formatValueByConstraint(value, valueIndex);
312
315
  cells[rowIndexInCells][columnIndexInCells] = {
@@ -315,21 +318,23 @@ export class PivotTableConverter {
315
318
  colSpan: 1,
316
319
  rowSpan: 1,
317
320
  cssClass: PivotTableConverter.groupDataClass,
318
- isHeader: false,
319
321
  background,
322
+ isValue: true,
320
323
  };
321
324
  }
322
325
  }
326
+ return { indexes: uniqueValues([...rowIndexes, rowIndexInCells]) };
323
327
  }
324
- evaluateExpression(expression, column) {
328
+ evaluateExpression(expression, columns) {
325
329
  return (expression.operands || []).reduce((result, operand, index) => {
326
- const { value, dataResources } = this.evaluateOperand(operand, column);
330
+ const { value, dataResources, indexes } = this.evaluateOperand(operand, columns);
327
331
  result.dataResources.push(...dataResources);
332
+ result.indexes.push(...indexes);
328
333
  switch (expression.operation) {
329
- case "add":
334
+ case 'add':
330
335
  result.value += value;
331
336
  break;
332
- case "subtract":
337
+ case 'subtract':
333
338
  result.value = (index === 0 ? value : result.value - value);
334
339
  break;
335
340
  case 'multiply':
@@ -340,20 +345,25 @@ export class PivotTableConverter {
340
345
  break;
341
346
  }
342
347
  return result;
343
- }, { value: 0, dataResources: [] });
348
+ }, { value: 0, dataResources: [], indexes: [] });
344
349
  }
345
- evaluateOperand(operand, column) {
350
+ evaluateOperand(operand, columns) {
346
351
  switch (operand.type) {
347
- case "expression": return this.evaluateExpression(operand, column);
348
- case "value": return { value: operand.value, dataResources: [] };
349
- case "header": {
352
+ case 'expression': return this.evaluateExpression(operand, columns);
353
+ case 'value': return { value: operand.value, dataResources: [], indexes: [] };
354
+ case 'header': {
350
355
  const rows = getTargetIndexesForHeaders(operand.headers);
351
- const { values, dataResources } = this.getGroupedValuesForRowsAndCols(rows, [column]);
352
- const { value } = this.aggregateDataValues(values, [column]);
353
- return { value, dataResources };
356
+ const { values, dataResources } = this.getGroupedValuesForRowsAndCols(rows, columns);
357
+ const { value } = this.aggregateDataValues(values, columns);
358
+ return { value, dataResources, indexes: this.transformRowIndexes(rows) };
354
359
  }
355
360
  }
356
361
  }
362
+ transformRowIndexes(rows) {
363
+ return rows
364
+ .map(v => this.rowsTransformationArray[v])
365
+ .filter(v => isNotNullOrUndefined(v));
366
+ }
357
367
  getGroupedValuesForRowsAndCols(rows, columns) {
358
368
  const values = [];
359
369
  const dataResources = [];
@@ -411,7 +421,7 @@ export class PivotTableConverter {
411
421
  constraint: parentHeader?.constraint,
412
422
  label: parentHeader?.attributeName,
413
423
  cssClass: PivotTableConverter.columnGroupHeaderClass,
414
- isHeader: true,
424
+ isSummary: true,
415
425
  stickyTop: this.isColumnLevelSticky(level),
416
426
  rowSpan: this.columnLevels - rowIndex - (shouldAddValueHeaders ? 1 : 0),
417
427
  colSpan: numberOfSums,
@@ -426,7 +436,7 @@ export class PivotTableConverter {
426
436
  cells[this.columnLevels - 1][columnIndexInCells] = {
427
437
  value: valueTitle,
428
438
  cssClass: PivotTableConverter.columnGroupHeaderClass,
429
- isHeader: true,
439
+ isSummary: true,
430
440
  stickyTop: this.isColumnLevelSticky(level),
431
441
  rowSpan: 1,
432
442
  colSpan: 1,
@@ -459,8 +469,8 @@ export class PivotTableConverter {
459
469
  colSpan: 1,
460
470
  rowSpan: 1,
461
471
  cssClass: PivotTableConverter.groupDataClass,
462
- isHeader: false,
463
472
  background,
473
+ isValue: true,
464
474
  };
465
475
  }
466
476
  }
@@ -499,7 +509,7 @@ export class PivotTableConverter {
499
509
  rowSpan: 1,
500
510
  colSpan: 1,
501
511
  cssClass: PivotTableConverter.dataClass,
502
- isHeader: false,
512
+ isValue: true,
503
513
  };
504
514
  }
505
515
  }
@@ -516,23 +526,35 @@ export class PivotTableConverter {
516
526
  }
517
527
  fillCellsByGroupIntersection(cells, rowGroupsInfo, columnGroupsInfo) {
518
528
  const rowsCount = cells.length;
519
- const columnsCount = (cells[0] && cells[0].length) || 0;
529
+ const columnsCount = cells[0]?.length || 0;
520
530
  for (let i = 0; i < rowGroupsInfo.length; i++) {
521
531
  const rowGroupInfo = rowGroupsInfo[i];
522
532
  if (rowGroupInfo) {
523
533
  for (let j = 0; j < columnGroupsInfo.length; j++) {
524
534
  if (columnGroupsInfo[j]) {
525
- // it's enough to fill group values only from row side
526
- const { rowsIndexes, columnsIndexes } = this.getValuesIndexesFromCellsIndexes(rowGroupInfo.indexes, columnGroupsInfo[j].indexes);
527
- const { values, dataResources } = this.getGroupedValuesForRowsAndCols(rowsIndexes, columnsIndexes);
528
- const formattedValue = this.aggregateAndFormatDataValues(values, rowsIndexes, columnsIndexes);
535
+ const columns = columnGroupsInfo[j].indexes;
536
+ let formattedValue;
537
+ let dataResources;
538
+ if (rowGroupInfo.expression) {
539
+ const result = this.evaluateExpression(rowGroupInfo.expression, columns);
540
+ const valueIndex = columns[0] % this.data.valueTitles.length;
541
+ formattedValue = this.formatValueByConstraint(result.value, valueIndex);
542
+ dataResources = result.dataResources;
543
+ }
544
+ else {
545
+ // it's enough to fill group values only from row side
546
+ const { rowsIndexes, columnsIndexes } = this.getValuesIndexesFromCellsIndexes(rowGroupInfo.indexes, columns);
547
+ const result = this.getGroupedValuesForRowsAndCols(rowsIndexes, columnsIndexes);
548
+ formattedValue = this.aggregateAndFormatDataValues(result.values, rowsIndexes, columnsIndexes);
549
+ dataResources = result.dataResources;
550
+ }
529
551
  cells[i][j] = {
530
552
  value: String(formattedValue),
531
553
  dataResources,
532
554
  colSpan: 1,
533
555
  rowSpan: 1,
534
556
  cssClass: PivotTableConverter.groupDataClass,
535
- isHeader: false,
557
+ isValue: true,
536
558
  };
537
559
  }
538
560
  }
@@ -582,7 +604,7 @@ export class PivotTableConverter {
582
604
  cssClass: isDataClass ? PivotTableConverter.dataClass : PivotTableConverter.groupDataClass,
583
605
  rowSpan: 1,
584
606
  colSpan: 1,
585
- isHeader: false,
607
+ isValue: true,
586
608
  };
587
609
  }
588
610
  else {
@@ -598,7 +620,7 @@ export class PivotTableConverter {
598
620
  matrix[0][j] = {
599
621
  value: rowHeaderAttribute.title,
600
622
  cssClass: PivotTableConverter.rowAttributeHeaderClass,
601
- isHeader: true,
623
+ isAttributeHeader: true,
602
624
  rowSpan: 1,
603
625
  colSpan: titleColSpan,
604
626
  stickyTop: this.isColumnLevelSticky(0),
@@ -609,7 +631,7 @@ export class PivotTableConverter {
609
631
  matrix[this.nonStickyColumnIndex][j] = {
610
632
  value: '',
611
633
  cssClass: PivotTableConverter.rowAttributeHeaderClass,
612
- isHeader: true,
634
+ isAttributeHeader: true,
613
635
  rowSpan: 1,
614
636
  colSpan: this.columnLevels - titleColSpan,
615
637
  background: rowHeaderAttribute.color,
@@ -972,4 +994,4 @@ function divideValues(value, divider) {
972
994
  }
973
995
  return null;
974
996
  }
975
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3QtdGFibGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbG1yLXBpdm90LXRhYmxlL3NyYy9saWIvdXRpbC9waXZvdC10YWJsZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsT0FBTyxFQUFDLG1CQUFtQixFQUE4QixtQkFBbUIsRUFBZ0Isa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEdBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4TSxPQUFPLEVBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEdBQUUsTUFBTSxlQUFlLENBQUM7QUFJL0ksT0FBTyxFQUE4RixpQkFBaUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xKLE9BQU8sRUFBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFlaEgsTUFBTSxPQUFPLG1CQUFtQjtJQUN2QixNQUFNLENBQVUsVUFBVSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hELE1BQU0sQ0FBVSxTQUFTLEdBQUcsaUJBQWlCLENBQUM7SUFDOUMsTUFBTSxDQUFVLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQztJQUN6RCxNQUFNLENBQVUsY0FBYyxHQUFHLHVCQUF1QixDQUFDO0lBQ3pELE1BQU0sQ0FBVSxtQkFBbUIsR0FBRyw2QkFBNkIsQ0FBQztJQUNwRSxNQUFNLENBQVUsdUJBQXVCLEdBQUcsaUNBQWlDLENBQUM7SUFDNUUsTUFBTSxDQUFVLGlCQUFpQixHQUFHLDBCQUEwQixDQUFDO0lBQy9ELE1BQU0sQ0FBVSxzQkFBc0IsR0FBRyxnQ0FBZ0MsQ0FBQztJQUVoRSxXQUFX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QyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBVSxFQUFFLE9BQVk7SUFDNUMsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM1QixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzFDLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtZQUNqQixPQUFPLEtBQUssR0FBRyxPQUFPLENBQUM7U0FDeEI7YUFBTTtZQUNMLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBMdW1lZXI6IE1vZGVybiBEYXRhIERlZmluaXRpb24gYW5kIFByb2Nlc3NpbmcgUGxhdGZvcm1cbiAqXG4gKiBDb3B5cmlnaHQgKEMpIHNpbmNlIDIwMTcgTHVtZWVyLmlvLCBzLnIuby4gYW5kL29yIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cbmltcG9ydCB7YWdncmVnYXRlRGF0YVZhbHVlcywgQ29uc3RyYWludCwgQ29uc3RyYWludERhdGEsIERhdGFBZ2dyZWdhdGlvblR5cGUsIERhdGFSZXNvdXJjZSwgaXNWYWx1ZUFnZ3JlZ2F0aW9uLCBOdW1iZXJDb25zdHJhaW50LCBQZXJjZW50YWdlQ29uc3RyYWludCwgVW5rbm93bkNvbnN0cmFpbnQsfSBmcm9tICdAbHVtZWVyL2RhdGEtZmlsdGVycyc7XG5pbXBvcnQge2RlZXBPYmplY3RDb3B5LCBpc0FycmF5LCBpc05vdE51bGxPclVuZGVmaW5lZCwgaXNOdWxsT3JVbmRlZmluZWQsIGlzTnVtZXJpYywgc2hhZGVDb2xvciwgdG9OdW1iZXIsIHVuaXF1ZVZhbHVlcyx9IGZyb20gJ0BsdW1lZXIvdXRpbHMnO1xuXG5pbXBvcnQge0xtclBpdm90RGF0YSwgTG1yUGl2b3REYXRhSGVhZGVyLCBMbXJQaXZvdERhdGFIZWFkZXJFeHByZXNzaW9uLCBMbXJQaXZvdERhdGFIZWFkZXJPcGVyYW5kLCBMbXJQaXZvdERpbWVuc2lvbkNvbmZpZywgTG1yUGl2b3RTdGVtRGF0YX0gZnJvbSAnLi9sbXItcGl2b3QtZGF0YSc7XG5pbXBvcnQge0xtclBpdm90VGFibGUsIExtclBpdm90VGFibGVDZWxsfSBmcm9tICcuL2xtci1waXZvdC10YWJsZSc7XG5pbXBvcnQge0xtclBpdm90RXhwcmVzc2lvbiwgTG1yUGl2b3RIZWFkZXJPcGVyYW5kLCBMbXJQaXZvdE9wZXJhbmQsIExtclBpdm90U29ydCwgTG1yUGl2b3RUcmFuc2Zvcm0sIExtclBpdm90VmFsdWVUeXBlfSBmcm9tICcuL2xtci1waXZvdC1jb25maWcnO1xuaW1wb3J0IHtDT0xPUl9HUkFZMTAwLCBDT0xPUl9HUkFZMjAwLCBDT0xPUl9HUkFZMzAwLCBDT0xPUl9HUkFZNDAwLCBDT0xPUl9HUkFZNTAwfSBmcm9tICcuL2xtci1waXZvdC1jb25zdGFudHMnO1xuXG5pbnRlcmZhY2UgSGVhZGVyR3JvdXBJbmZvIHtcbiAgYmFja2dyb3VuZDogc3RyaW5nO1xuICBpbmRleGVzOiBudW1iZXJbXTtcbiAgbGV2ZWw6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZhbHVlVHlwZUluZm8ge1xuICBzdW0/OiBudW1iZXI7XG4gIHN1bXNSb3dzPzogbnVtYmVyW107XG4gIHN1bXNDb2x1bW5zPzogbnVtYmVyW107XG4gIGRlZmF1bHRDb25zdHJhaW50PzogQ29uc3RyYWludDtcbn1cblxuZXhwb3J0IGNsYXNzIFBpdm90VGFibGVDb252ZXJ0ZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGVtcHR5Q2xhc3MgPSAncGl2b3QtZW1wdHktY2VsbCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGF0YUNsYXNzID0gJ3Bpdm90LWRhdGEtY2VsbCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZ3JvdXBEYXRhQ2xhc3MgPSAncGl2b3QtZGF0YS1ncm91cC1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSByb3dIZWFkZXJDbGFzcyA9ICdwaXZvdC1yb3ctaGVhZGVyLWNlbGwnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHJvd0dyb3VwSGVhZGVyQ2xhc3MgPSAncGl2b3Qtcm93LWdyb3VwLWhlYWRlci1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSByb3dBdHRyaWJ1dGVIZWFkZXJDbGFzcyA9ICdwaXZvdC1yb3ctYXR0cmlidXRlLWhlYWRlci1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb2x1bW5IZWFkZXJDbGFzcyA9ICdwaXZvdC1jb2x1bW4taGVhZGVyLWNlbGwnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNvbHVtbkdyb3VwSGVhZGVyQ2xhc3MgPSAncGl2b3QtY29sdW1uLWdyb3VwLWhlYWRlci1jZWxsJztcblxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwQ29sb3JzID0gW0NPTE9SX0dSQVkxMDAsIENPTE9SX0dSQVkyMDAsIENPTE9SX0dSQVkzMDAsIENPTE9SX0dSQVk0MDAsIENPTE9SX0dSQVk1MDBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyY2VudGFnZUNvbnN0cmFpbnQgPSBuZXcgUGVyY2VudGFnZUNvbnN0cmFpbnQoe2RlY2ltYWxzOiAyfSk7XG5cbiAgcHJpdmF0ZSBkYXRhOiBMbXJQaXZvdFN0ZW1EYXRhO1xuICBwcml2YXRlIHRyYW5zZm9ybTogTG1yUGl2b3RUcmFuc2Zvcm07XG4gIHByaXZhdGUgdmFsdWVzOiBhbnlbXVtdO1xuICBwcml2YXRlIGRhdGFSZXNvdXJjZXM6IERhdGFSZXNvdXJjZVtdW11bXTtcbiAgcHJpdmF0ZSBjb25zdHJhaW50RGF0YTogQ29uc3RyYWludERhdGE7XG4gIHByaXZhdGUgcm93TGV2ZWxzOiBudW1iZXI7XG4gIHByaXZhdGUgcm93c1RyYW5zZm9ybWF0aW9uQXJyYXk6IG51bWJlcltdO1xuICBwcml2YXRlIGNvbHVtbkxldmVsczogbnVtYmVyO1xuICBwcml2YXRlIGNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5OiBudW1iZXJbXTtcbiAgcHJpdmF0ZSB2YWx1ZVR5cGVJbmZvOiBWYWx1ZVR5cGVJbmZvW107XG4gIHByaXZhdGUgbm9uU3RpY2t5Um93SW5kZXg6IG51bWJlcjtcbiAgcHJpdmF0ZSBub25TdGlja3lDb2x1bW5JbmRleDogbnVtYmVyO1xuXG4gIHB1YmxpYyBjcmVhdGVUYWJsZXMocGl2b3REYXRhOiBMbXJQaXZvdERhdGEsIHRyYW5zZm9ybTogTG1yUGl2b3RUcmFuc2Zvcm0pOiBMbXJQaXZvdFRhYmxlW10ge1xuICAgIGlmICghcGl2b3REYXRhKSB7XG4gICAgICByZXR1cm4gW3tjZWxsczogW119XTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICB0aGlzLmNvbnN0cmFpbnREYXRhID0gcGl2b3REYXRhLmNvbnN0cmFpbnREYXRhO1xuXG4gICAgcmV0dXJuIChwaXZvdERhdGEuZGF0YSB8fCBbXSkubWFwKGQgPT4ge1xuICAgICAgaWYgKHRoaXMuZGF0YUFyZUVtcHR5KGQpKSB7XG4gICAgICAgIHJldHVybiB7Y2VsbHM6IFtdfTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRGF0YShkKTtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybURhdGEoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGF0YUFyZUVtcHR5KGRhdGE6IExtclBpdm90U3RlbURhdGEpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGRhdGEucm93SGVhZGVycyB8fCBbXSkubGVuZ3RoID09PSAwICYmIChkYXRhLmNvbHVtbkhlYWRlcnMgfHwgW10pLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0YShkYXRhOiBMbXJQaXZvdFN0ZW1EYXRhKSB7XG4gICAgY29uc3QgbnVtYmVyT2ZTdW1zID0gTWF0aC5tYXgoMSwgKGRhdGEudmFsdWVUaXRsZXMgfHwgW10pLmxlbmd0aCk7XG4gICAgdGhpcy52YWx1ZVR5cGVJbmZvID0gZ2V0VmFsdWVzVHlwZUluZm8oZGF0YS52YWx1ZXMsIGRhdGEudmFsdWVUeXBlcywgbnVtYmVyT2ZTdW1zKTtcbiAgICB0aGlzLmRhdGEgPSBwcmVwYXJlUGl2b3REYXRhKGRhdGEsIHRoaXMuY29uc3RyYWludERhdGEsIHRoaXMudmFsdWVUeXBlSW5mbyk7XG4gICAgdGhpcy52YWx1ZXMgPSBkYXRhLnZhbHVlcyB8fCBbXTtcbiAgICB0aGlzLmRhdGFSZXNvdXJjZXMgPSBkYXRhLmRhdGFSZXNvdXJjZXMgfHwgW107XG4gICAgdGhpcy5yb3dMZXZlbHMgPSAoZGF0YS5yb3dzQ29uZmlnIHx8IFtdKS5sZW5ndGg7XG4gICAgdGhpcy5jb2x1bW5MZXZlbHMgPSAoZGF0YS5jb2x1bW5zQ29uZmlnIHx8IFtdKS5sZW5ndGggKyAoZGF0YS5oYXNBZGRpdGlvbmFsQ29sdW1uTGV2ZWwgPyAxIDogMCk7XG4gICAgY29uc3Qgcm93QWxsU3RpY2t5ID0gdGhpcy5kYXRhLnJvd3NDb25maWc/Lmxlbmd0aCAmJiB0aGlzLmRhdGEucm93c0NvbmZpZy5ldmVyeShjb25maWcgPT4gISFjb25maWc/LnN0aWNreSlcbiAgICB0aGlzLm5vblN0aWNreVJvd0luZGV4ID0gTWF0aC5tYXgocm93QWxsU3RpY2t5ID8gdGhpcy5yb3dMZXZlbHMgOiAodGhpcy5kYXRhLnJvd3NDb25maWc/LmZpbmRJbmRleChjb25maWcgPT4gIWNvbmZpZz8uc3RpY2t5KSB8fCAwKSwgMCk7XG4gICAgY29uc3QgY29sdW1uQWxsU3RpY2t5ID0gdGhpcy5kYXRhLmNvbHVtbnNDb25maWc/Lmxlbmd0aCAmJiB0aGlzLmRhdGEuY29sdW1uc0NvbmZpZy5ldmVyeShjb25maWcgPT4gISFjb25maWc/LnN0aWNreSlcbiAgICB0aGlzLm5vblN0aWNreUNvbHVtbkluZGV4ID0gTWF0aC5tYXgoY29sdW1uQWxsU3RpY2t5ID8gdGhpcy5jb2x1bW5MZXZlbHMgOiAodGhpcy5kYXRhLmNvbHVtbnNDb25maWc/LmZpbmRJbmRleChjb25maWcgPT4gIWNvbmZpZz8uc3RpY2t5KSB8fCAwKSwgMCk7XG4gICAgY29uc3QgaGFzVmFsdWUgPSAoZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoID4gMDtcbiAgICBpZiAoKHRoaXMuZGF0YS5yb3dIZWFkZXJzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5ID0gY3JlYXRlVHJhbnNmb3JtYXRpb25NYXAoXG4gICAgICAgIHRoaXMuZGF0YS5yb3dIZWFkZXJzLFxuICAgICAgICB0aGlzLnJvd1Nob3dTdW1zLFxuICAgICAgICB0aGlzLmNvbHVtbkxldmVscyxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheSA9IGhhc1ZhbHVlID8gW3RoaXMuY29sdW1uTGV2ZWxzXSA6IFtdO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkgPSBjcmVhdGVUcmFuc2Zvcm1hdGlvbk1hcChcbiAgICAgICAgdGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMsXG4gICAgICAgIHRoaXMuY29sdW1uU2hvd1N1bXMsXG4gICAgICAgIHRoaXMucm93TGV2ZWxzLFxuICAgICAgICBudW1iZXJPZlN1bXNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkgPSBoYXNWYWx1ZSA/IFt0aGlzLnJvd0xldmVsc10gOiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCByb3dTaG93U3VtcygpOiBib29sZWFuW10ge1xuICAgIHJldHVybiAodGhpcy5kYXRhLnJvd3NDb25maWcgfHwgW10pLm1hcChjb25maWcgPT4gY29uZmlnLnNob3dTdW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvbHVtblNob3dTdW1zKCk6IGJvb2xlYW5bXSB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGEuY29sdW1uc0NvbmZpZyB8fCBbXSkubWFwKGNvbmZpZyA9PiBjb25maWcuc2hvd1N1bXMpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1EYXRhKCk6IExtclBpdm90VGFibGUge1xuICAgIGNvbnN0IGNlbGxzID0gdGhpcy5pbml0Q2VsbHMoKTtcbiAgICBjb25zdCByb3dHcm91cHMgPSB0aGlzLmZpbGxDZWxsc0J5Um93cyhjZWxscyk7XG4gICAgY29uc3QgY29sdW1uR3JvdXBzID0gdGhpcy5maWxsQ2VsbHNCeUNvbHVtbnMoY2VsbHMpO1xuICAgIHRoaXMuZmlsbENlbGxzQnlHcm91cEludGVyc2VjdGlvbihjZWxscywgcm93R3JvdXBzLCBjb2x1bW5Hcm91cHMpO1xuICAgIHJldHVybiB7Y2VsbHN9O1xuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNCeVJvd3MoY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSk6IEhlYWRlckdyb3VwSW5mb1tdIHtcbiAgICBjb25zdCByb3dHcm91cHMgPSBbXTtcbiAgICB0aGlzLml0ZXJhdGVBbmRGaWxsQ2VsbHNCeVJvd3MoY2VsbHMsIHJvd0dyb3VwcywgdGhpcy5kYXRhLnJvd0hlYWRlcnMsIHRoaXMuY29sdW1uTGV2ZWxzLCB0aGlzLnJvd1Nob3dTdW1zLCAwKTtcbiAgICByZXR1cm4gcm93R3JvdXBzO1xuICB9XG5cbiAgcHJpdmF0ZSBpdGVyYXRlQW5kRmlsbENlbGxzQnlSb3dzKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgcm93R3JvdXBzSW5mbzogSGVhZGVyR3JvdXBJbmZvW10sXG4gICAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIHNob3dTdW1zOiBib29sZWFuW10sXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgICBwYXJlbnRIZWFkZXI/OiBMbXJQaXZvdERhdGFIZWFkZXJcbiAgKSB7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgZm9yIChjb25zdCBoZWFkZXIgb2YgaGVhZGVycykge1xuICAgICAgY29uc3Qgcm93U3BhbiA9IGdldERpcmVjdEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMpO1xuICAgICAgY2VsbHNbY3VycmVudEluZGV4XVtsZXZlbF0gPSB7XG4gICAgICAgIHZhbHVlOiB0aGlzLmZvcm1hdFJvd0hlYWRlcihoZWFkZXIudGl0bGUsIGxldmVsKSxcbiAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIucm93SGVhZGVyQ2xhc3MsXG4gICAgICAgIGlzSGVhZGVyOiB0cnVlLFxuICAgICAgICBzdGlja3lTdGFydDogdGhpcy5pc1Jvd0xldmVsU3RpY2t5KGxldmVsKSxcbiAgICAgICAgcm93U3BhbixcbiAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy5nZXRIZWFkZXJCYWNrZ3JvdW5kKGhlYWRlciwgbGV2ZWwpLFxuICAgICAgICBjb25zdHJhaW50OiBoZWFkZXIuY29uc3RyYWludCxcbiAgICAgICAgbGFiZWw6IGhlYWRlci5hdHRyaWJ1dGVOYW1lLFxuICAgICAgfTtcblxuICAgICAgaWYgKGhlYWRlci5jaGlsZHJlbikge1xuICAgICAgICB0aGlzLml0ZXJhdGVBbmRGaWxsQ2VsbHNCeVJvd3MoXG4gICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgcm93R3JvdXBzSW5mbyxcbiAgICAgICAgICBoZWFkZXIuY2hpbGRyZW4sXG4gICAgICAgICAgY3VycmVudEluZGV4LFxuICAgICAgICAgIHNob3dTdW1zLFxuICAgICAgICAgIGxldmVsICsgMSxcbiAgICAgICAgICBoZWFkZXJcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoaGVhZGVyLnRhcmdldEluZGV4KSkge1xuICAgICAgICB0aGlzLmZpbGxDZWxsc0ZvclJvdyhjZWxscywgaGVhZGVyLnRhcmdldEluZGV4KTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEluZGV4ICs9IGdldEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMpO1xuXG4gICAgICBjb25zdCBleHByZXNzaW9ucyA9IGhlYWRlci5leHByZXNzaW9ucyB8fCBbXVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uSW5kZXggPSBjdXJyZW50SW5kZXggLSAoZXhwcmVzc2lvbnMubGVuZ3RoIC0gaSlcbiAgICAgICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMuZ2V0U3VtbWFyeUJhY2tncm91bmQobGV2ZWwpO1xuICAgICAgICB0aGlzLnNwbGl0Um93R3JvdXBIZWFkZXIoY2VsbHMsIGxldmVsLCBleHByZXNzaW9uSW5kZXgsIGJhY2tncm91bmQsIGV4cHJlc3Npb25zW2ldLnRpdGxlKVxuICAgICAgICB0aGlzLmZpbGxDZWxsc0ZvckV4cHJlc3Npb25Sb3coY2VsbHMsIGV4cHJlc3Npb25zW2ldLCBleHByZXNzaW9uSW5kZXgsIGJhY2tncm91bmQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dTdW1zW2xldmVsXSkge1xuICAgICAgY29uc3QgeyB0aXRsZSwgc3VtbWFyeSB9ID0gdGhpcy5mb3JtYXRTdW1tYXJ5SGVhZGVyKHBhcmVudEhlYWRlciwgbGV2ZWwpXG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5nZXRTdW1tYXJ5QmFja2dyb3VuZChsZXZlbCk7XG4gICAgICBjb25zdCBjb2x1bW5JbmRleCA9IE1hdGgubWF4KGxldmVsIC0gMSwgMCk7XG4gICAgICB0aGlzLnNwbGl0Um93R3JvdXBIZWFkZXIoY2VsbHMsIGNvbHVtbkluZGV4LCBjdXJyZW50SW5kZXgsIGJhY2tncm91bmQsIHN1bW1hcnksIHRpdGxlLCBwYXJlbnRIZWFkZXI/LmNvbnN0cmFpbnQsIHBhcmVudEhlYWRlcj8uYXR0cmlidXRlTmFtZSlcblxuICAgICAgY29uc3Qgcm93SW5kZXhlcyA9IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRSb3dJbmRleGVzID0gcm93SW5kZXhlc1xuICAgICAgICAubWFwKHYgPT4gdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheVt2XSlcbiAgICAgICAgLmZpbHRlcih2ID0+IGlzTm90TnVsbE9yVW5kZWZpbmVkKHYpKTtcblxuICAgICAgcm93R3JvdXBzSW5mb1tjdXJyZW50SW5kZXhdID0ge2JhY2tncm91bmQsIGluZGV4ZXM6IHRyYW5zZm9ybWVkUm93SW5kZXhlcywgbGV2ZWx9O1xuXG4gICAgICB0aGlzLmZpbGxDZWxsc0Zvckdyb3VwZWRSb3coY2VsbHMsIHJvd0luZGV4ZXMsIGN1cnJlbnRJbmRleCwgYmFja2dyb3VuZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzcGxpdFJvd0dyb3VwSGVhZGVyKGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sIGNvbHVtbkluZGV4OiBudW1iZXIsIGN1cnJlbnRJbmRleDogbnVtYmVyLCBiYWNrZ3JvdW5kOiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcsIGNvbnN0cmFpbnQ/OiBDb25zdHJhaW50LCBsYWJlbD86IHN0cmluZykge1xuICAgIGxldCBjb2xTcGFuID0gdGhpcy5yb3dMZXZlbHMgLSBjb2x1bW5JbmRleDtcbiAgICBjb25zdCBzdGlja3lTdGFydCA9IHRoaXMuaXNSb3dMZXZlbFN0aWNreShjb2x1bW5JbmRleCk7XG5cbiAgICAvLyBzcGxpdCByb3cgZ3JvdXAgaGVhZGVyIGNlbGwgYmVjYXVzZSBvZiBjb3JyZWN0IHN0aWNreSBzY3JvbGxcbiAgICBpZiAoc3RpY2t5U3RhcnQgJiYgdGhpcy5ub25TdGlja3lSb3dJbmRleCA+IDAgJiYgdGhpcy5ub25TdGlja3lSb3dJbmRleCA8IHRoaXMucm93TGV2ZWxzICYmIGNvbFNwYW4gPiAxKSB7XG4gICAgICBjb25zdCBuZXdDb2xzcGFuID0gdGhpcy5ub25TdGlja3lSb3dJbmRleCAtIGNvbHVtbkluZGV4O1xuXG4gICAgICBjZWxsc1tjdXJyZW50SW5kZXhdW3RoaXMubm9uU3RpY2t5Um93SW5kZXhdID0ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBjb25zdHJhaW50OiB1bmRlZmluZWQsXG4gICAgICAgIGxhYmVsOiB1bmRlZmluZWQsXG4gICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLnJvd0dyb3VwSGVhZGVyQ2xhc3MsXG4gICAgICAgIGlzSGVhZGVyOiB0cnVlLFxuICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICBjb2xTcGFuOiBjb2xTcGFuIC0gbmV3Q29sc3BhbixcbiAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgICAgc3VtbWFyeTogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgY29sU3BhbiA9IG5ld0NvbHNwYW47XG4gICAgfVxuXG4gICAgY2VsbHNbY3VycmVudEluZGV4XVtjb2x1bW5JbmRleF0gPSB7XG4gICAgICB2YWx1ZTogdGl0bGUsXG4gICAgICBjb25zdHJhaW50LFxuICAgICAgbGFiZWwsXG4gICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5yb3dHcm91cEhlYWRlckNsYXNzLFxuICAgICAgaXNIZWFkZXI6IHRydWUsXG4gICAgICBzdGlja3lTdGFydCxcbiAgICAgIHJvd1NwYW46IDEsXG4gICAgICBjb2xTcGFuLFxuICAgICAgYmFja2dyb3VuZCxcbiAgICAgIHN1bW1hcnksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0U3VtbWFyeUhlYWRlcihoZWFkZXI6IExtclBpdm90RGF0YUhlYWRlciwgbGV2ZWw6IG51bWJlcik6IHt0aXRsZT86IHN0cmluZzsgc3VtbWFyeTogc3RyaW5nfSB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmZvcm1hdFN1bW1hcnlIZWFkZXI/LihoZWFkZXIsIGxldmVsKSB8fCB7XG4gICAgICB0aXRsZTogaGVhZGVyPy50aXRsZSxcbiAgICAgIHN1bW1hcnk6ICcnLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Um93SGVhZGVyKHRpdGxlOiBzdHJpbmcsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybT8uZm9ybWF0Um93SGVhZGVyPy4odGl0bGUsIGxldmVsKSB8fCB0aXRsZVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb2x1bW5IZWFkZXIodGl0bGU6IHN0cmluZywgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtPy5mb3JtYXRDb2x1bW5IZWFkZXI/Lih0aXRsZSwgbGV2ZWwpIHx8IHRpdGxlXG4gIH1cblxuICBwcml2YXRlIGdldEhlYWRlckJhY2tncm91bmQoaGVhZGVyOiB7IGNvbG9yOiBzdHJpbmcgfSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGhlYWRlcj8uY29sb3IpIHtcbiAgICAgIHJldHVybiBzaGFkZUNvbG9yKGhlYWRlci5jb2xvciwgdGhpcy5nZXRMZXZlbE9wYWNpdHkobGV2ZWwpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZXZlbE9wYWNpdHkobGV2ZWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWluKDgwLCA1MCArIGxldmVsICogNSkgLyAxMDA7XG4gIH1cblxuICBwcml2YXRlIGlzUm93TGV2ZWxTdGlja3kobGV2ZWw6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGE/LnJvd3NDb25maWc/LltsZXZlbF0/LnN0aWNreTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDb2x1bW5MZXZlbFN0aWNreShsZXZlbDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWF4TGV2ZWwgPSBNYXRoLm1pbihsZXZlbCwgKHRoaXMuZGF0YT8uY29sdW1uc0NvbmZpZz8ubGVuZ3RoID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSAtIDEpO1xuICAgIHJldHVybiB0aGlzLmRhdGE/LmNvbHVtbnNDb25maWc/LlttYXhMZXZlbF0/LnN0aWNreTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VtbWFyeUJhY2tncm91bmQobGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLm1pbihsZXZlbCwgdGhpcy5ncm91cENvbG9ycy5sZW5ndGggLSAxKTtcbiAgICByZXR1cm4gdGhpcy5ncm91cENvbG9yc1tpbmRleF07XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0ZvclJvdyhjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLCByb3c6IG51bWJlcikge1xuICAgIGNvbnN0IHJvd0luZGV4SW5DZWxscyA9IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXlbcm93XTtcbiAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQocm93SW5kZXhJbkNlbGxzKSkge1xuICAgICAgZm9yIChsZXQgY29sdW1uID0gMDsgY29sdW1uIDwgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5sZW5ndGg7IGNvbHVtbisrKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkluZGV4SW5DZWxscyA9IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbY29sdW1uXTtcbiAgICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS52YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgICAgIGNvbnN0IGRhdGFSZXNvdXJjZXMgPSB0aGlzLmRhdGFSZXNvdXJjZXM/Lltyb3ddPy5bY29sdW1uXSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuYWdncmVnYXRlT3JGb3JtYXRTaW5nbGVWYWx1ZSh2YWx1ZSwgY29sdW1uKTtcbiAgICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IGlzTm90TnVsbE9yVW5kZWZpbmVkKGZvcm1hdHRlZFZhbHVlKSA/IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSkgOiAnJztcbiAgICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogc3RyaW5nVmFsdWUsXG4gICAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5kYXRhQ2xhc3MsXG4gICAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVJbmRleEZvckNvbHVtbnMoY29sdW1uczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIHJldHVybiBjb2x1bW5zWzBdICUgdGhpcy5kYXRhLnZhbHVlVGl0bGVzLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VmFsdWVCeVZhbHVlVHlwZSh2YWx1ZTogYW55LCB2YWx1ZUluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9ICh0aGlzLmRhdGEudmFsdWVUeXBlcyB8fCBbXSlbdmFsdWVJbmRleF07XG4gICAgaWYgKCF2YWx1ZVR5cGUgfHwgdmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5EZWZhdWx0KSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0xtclBpdm90VmFsdWVUeXBlLkFsbFBlcmNlbnRhZ2UsIExtclBpdm90VmFsdWVUeXBlLkNvbHVtblBlcmNlbnRhZ2UsIExtclBpdm90VmFsdWVUeXBlLlJvd1BlcmNlbnRhZ2VdLmluY2x1ZGVzKHZhbHVlVHlwZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFZhbHVlQnlQZXJjZW50YWdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEdyb3VwZWRWYWx1ZUJ5VmFsdWVUeXBlKHZhbHVlOiBhbnksIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IGFueSB7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IGNvbHVtbnNbMF0gJSB0aGlzLmRhdGEudmFsdWVUaXRsZXMubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuZGF0YS52YWx1ZVR5cGVzICYmIHRoaXMuZGF0YS52YWx1ZVR5cGVzW3ZhbHVlSW5kZXhdO1xuICAgIGNvbnN0IHZhbHVlVHlwZUluZm8gPSB0aGlzLnZhbHVlVHlwZUluZm9bdmFsdWVJbmRleF07XG4gICAgaWYgKCF2YWx1ZVR5cGVJbmZvIHx8ICF2YWx1ZVR5cGUgfHwgdmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5EZWZhdWx0KSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQWxsUGVyY2VudGFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeVBlcmNlbnRhZ2UoZGl2aWRlVmFsdWVzKHZhbHVlLCB2YWx1ZVR5cGVJbmZvLnN1bSkpO1xuICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5Db2x1bW5QZXJjZW50YWdlKSB7XG4gICAgICBjb25zdCBjb2x1bW5zRGl2aWRlcnMgPSBjb2x1bW5zLnJlZHVjZSgoZGl2aWRlcnMsIGNvbHVtbikgPT4ge1xuICAgICAgICBkaXZpZGVycy5wdXNoKHZhbHVlVHlwZUluZm8uc3Vtc0NvbHVtbnNbY29sdW1uXSk7XG4gICAgICAgIHJldHVybiBkaXZpZGVycztcbiAgICAgIH0sIFtdKTtcbiAgICAgIGNvbnN0IGNvbHVtbnNEaXZpZGVyID0gYWdncmVnYXRlRGF0YVZhbHVlcyhEYXRhQWdncmVnYXRpb25UeXBlLlN1bSwgY29sdW1uc0RpdmlkZXJzKTtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFZhbHVlQnlQZXJjZW50YWdlKGRpdmlkZVZhbHVlcyh2YWx1ZSwgY29sdW1uc0RpdmlkZXIpKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuUm93UGVyY2VudGFnZSkge1xuICAgICAgY29uc3Qgcm93c0RpdmlkZXJzID0gcm93cy5yZWR1Y2UoKGRpdmlkZXJzLCByb3cpID0+IHtcbiAgICAgICAgZGl2aWRlcnMucHVzaCh2YWx1ZVR5cGVJbmZvLnN1bXNSb3dzW3Jvd10pO1xuICAgICAgICByZXR1cm4gZGl2aWRlcnM7XG4gICAgICB9LCBbXSk7XG4gICAgICBjb25zdCByb3dzRGl2aWRlciA9IGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoRGF0YUFnZ3JlZ2F0aW9uVHlwZS5TdW0sIHJvd3NEaXZpZGVycyk7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5UGVyY2VudGFnZShkaXZpZGVWYWx1ZXModmFsdWUsIHJvd3NEaXZpZGVyKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeUNvbnN0cmFpbnQodmFsdWUsIHZhbHVlSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZUJ5UGVyY2VudGFnZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wZXJjZW50YWdlQ29uc3RyYWludC5jcmVhdGVEYXRhVmFsdWUodmFsdWUpLmZvcm1hdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZTogYW55LCB2YWx1ZUluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IGNvbnN0cmFpbnQgPSB0aGlzLmRhdGEudmFsdWVzQ29uc3RyYWludHM/Llt2YWx1ZUluZGV4XSB8fCB0aGlzLnZhbHVlVHlwZUluZm9bdmFsdWVJbmRleF0/LmRlZmF1bHRDb25zdHJhaW50O1xuICAgIGlmIChjb25zdHJhaW50KSB7XG4gICAgICByZXR1cm4gY29uc3RyYWludC5jcmVhdGVEYXRhVmFsdWUodmFsdWUsIHRoaXMuY29uc3RyYWludERhdGEpLnByZXZpZXcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JHcm91cGVkUm93KFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgcm93czogbnVtYmVyW10sXG4gICAgcm93SW5kZXhJbkNlbGxzOiBudW1iZXIsXG4gICAgYmFja2dyb3VuZDogc3RyaW5nXG4gICkge1xuICAgIGZvciAobGV0IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyBjb2x1bW4rKykge1xuICAgICAgY29uc3QgY29sdW1uSW5kZXhJbkNlbGxzID0gdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheVtjb2x1bW5dO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhyb3dzLCBbY29sdW1uXSk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5hZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlcywgcm93cywgW2NvbHVtbl0pO1xuICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgdmFsdWU6IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSksXG4gICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZ3JvdXBEYXRhQ2xhc3MsXG4gICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JFeHByZXNzaW9uUm93KFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgZXhwcmVzc2lvbjogTG1yUGl2b3REYXRhSGVhZGVyRXhwcmVzc2lvbixcbiAgICByb3dJbmRleEluQ2VsbHM6IG51bWJlcixcbiAgICBiYWNrZ3JvdW5kOiBzdHJpbmdcbiAgKSB7XG4gICAgZm9yIChsZXQgY29sdW1uID0gMDsgY29sdW1uIDwgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5sZW5ndGg7IGNvbHVtbisrKSB7XG4gICAgICBjb25zdCBjb2x1bW5JbmRleEluQ2VsbHMgPSB0aGlzLmNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5W2NvbHVtbl07XG4gICAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoY29sdW1uSW5kZXhJbkNlbGxzKSkge1xuICAgICAgICBjb25zdCB7dmFsdWUsIGRhdGFSZXNvdXJjZXN9ID0gdGhpcy5ldmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29sdW1uKTtcbiAgICAgICAgY29uc3QgdmFsdWVJbmRleCA9IGNvbHVtbiAlIHRoaXMuZGF0YS52YWx1ZVRpdGxlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgICAgIGNlbGxzW3Jvd0luZGV4SW5DZWxsc11bY29sdW1uSW5kZXhJbkNlbGxzXSA9IHtcbiAgICAgICAgICB2YWx1ZTogU3RyaW5nKGZvcm1hdHRlZFZhbHVlKSxcbiAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5ncm91cERhdGFDbGFzcyxcbiAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlRXhwcmVzc2lvbihleHByZXNzaW9uOiBMbXJQaXZvdERhdGFIZWFkZXJFeHByZXNzaW9uLCBjb2x1bW46IG51bWJlcik6IHt2YWx1ZTogbnVtYmVyOyBkYXRhUmVzb3VyY2VzOiBEYXRhUmVzb3VyY2VbXSB9IHtcbiAgICByZXR1cm4gKGV4cHJlc3Npb24ub3BlcmFuZHMgfHwgW10pLnJlZHVjZSgocmVzdWx0LCBvcGVyYW5kLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBkYXRhUmVzb3VyY2VzIH0gPSB0aGlzLmV2YWx1YXRlT3BlcmFuZChvcGVyYW5kLCBjb2x1bW4pXG4gICAgICByZXN1bHQuZGF0YVJlc291cmNlcy5wdXNoKC4uLmRhdGFSZXNvdXJjZXMpXG4gICAgICBzd2l0Y2ggKGV4cHJlc3Npb24ub3BlcmF0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICByZXN1bHQudmFsdWUgKz0gdmFsdWVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInN1YnRyYWN0XCI6XG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gKGluZGV4ID09PSAwID8gdmFsdWUgOiByZXN1bHQudmFsdWUgLSB2YWx1ZSlcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbXVsdGlwbHknOlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IGluZGV4ID09PSAwID8gdmFsdWUgOiByZXN1bHQudmFsdWUgKiB2YWx1ZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkaXZpZGUnOlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IGluZGV4ID09PSAwID8gdmFsdWUgOiB2YWx1ZSA/IHJlc3VsdC52YWx1ZSAvIHZhbHVlIDogcmVzdWx0LnZhbHVlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9ICwge3ZhbHVlOiAwLCBkYXRhUmVzb3VyY2VzOiBbXX0pXG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlT3BlcmFuZChvcGVyYW5kOiBMbXJQaXZvdERhdGFIZWFkZXJPcGVyYW5kLCBjb2x1bW46IG51bWJlcik6IHt2YWx1ZTogbnVtYmVyOyBkYXRhUmVzb3VyY2VzOiBEYXRhUmVzb3VyY2VbXSB9IHtcbiAgICBzd2l0Y2ggKG9wZXJhbmQudHlwZSkge1xuICAgICAgY2FzZSBcImV4cHJlc3Npb25cIjogcmV0dXJuIHRoaXMuZXZhbHVhdGVFeHByZXNzaW9uKG9wZXJhbmQsIGNvbHVtbilcbiAgICAgIGNhc2UgXCJ2YWx1ZVwiOiByZXR1cm4ge3ZhbHVlOiBvcGVyYW5kLnZhbHVlLCBkYXRhUmVzb3VyY2VzOiBbXX1cbiAgICAgIGNhc2UgXCJoZWFkZXJcIjoge1xuICAgICAgICBjb25zdCByb3dzID0gZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcnMob3BlcmFuZC5oZWFkZXJzKTtcbiAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhyb3dzLCBbY29sdW1uXSk7XG4gICAgICAgIGNvbnN0IHt2YWx1ZX0gPSB0aGlzLmFnZ3JlZ2F0ZURhdGFWYWx1ZXModmFsdWVzLCBbY29sdW1uXSk7XG4gICAgICAgIHJldHVybiB7dmFsdWUsIGRhdGFSZXNvdXJjZXN9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRHcm91cGVkVmFsdWVzRm9yUm93c0FuZENvbHMoXG4gICAgcm93czogbnVtYmVyW10sXG4gICAgY29sdW1uczogbnVtYmVyW11cbiAgKTogeyB2YWx1ZXM6IGFueVtdOyBkYXRhUmVzb3VyY2VzOiBEYXRhUmVzb3VyY2VbXSB9IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICBjb25zdCBkYXRhUmVzb3VyY2VzID0gW107XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgICBjb25zdCByb3dDb2x1bW5WYWx1ZSA9IHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgICAgICAgaWYgKGlzQXJyYXkocm93Q29sdW1uVmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWVzLnB1c2goLi4ucm93Q29sdW1uVmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKHJvd0NvbHVtblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUmVzb3VyY2VzLnB1c2goLi4uKHRoaXMuZGF0YVJlc291cmNlcz8uW3Jvd10/Lltjb2x1bW5dIHx8IFtdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWVzLCBkYXRhUmVzb3VyY2VzfTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsbENlbGxzQnlDb2x1bW5zKGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10pOiBIZWFkZXJHcm91cEluZm9bXSB7XG4gICAgY29uc3QgY29sdW1uR3JvdXBzID0gW107XG4gICAgdGhpcy5pdGVyYXRlQW5kRmlsbENlbGxzQnlDb2x1bW5zKFxuICAgICAgY2VsbHMsXG4gICAgICBjb2x1bW5Hcm91cHMsXG4gICAgICB0aGlzLmRhdGEuY29sdW1uSGVhZGVycyxcbiAgICAgIHRoaXMucm93TGV2ZWxzLFxuICAgICAgdGhpcy5jb2x1bW5TaG93U3VtcyxcbiAgICAgIDBcbiAgICApO1xuICAgIHJldHVybiBjb2x1bW5Hcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGl0ZXJhdGVBbmRGaWxsQ2VsbHNCeUNvbHVtbnMoXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICBjb2x1bW5Hcm91cHNJbmZvOiBIZWFkZXJHcm91cEluZm9bXSxcbiAgICBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgc2hvd1N1bXM6IGJvb2xlYW5bXSxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIHBhcmVudEhlYWRlcj86IExtclBpdm90RGF0YUhlYWRlclxuICApIHtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICBjb25zdCBudW1iZXJPZlN1bXMgPSBNYXRoLm1heCgxLCB0aGlzLmRhdGEudmFsdWVUaXRsZXMubGVuZ3RoKTtcbiAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiBoZWFkZXJzKSB7XG4gICAgICBjb25zdCBjb2xTcGFuID0gZ2V0RGlyZWN0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsLCBzaG93U3VtcywgbnVtYmVyT2ZTdW1zKTtcbiAgICAgIGNlbGxzW2xldmVsXVtjdXJyZW50SW5kZXhdID0ge1xuICAgICAgICB2YWx1ZTogdGhpcy5mb3JtYXRDb2x1bW5IZWFkZXIoaGVhZGVyLnRpdGxlLCBsZXZlbCksXG4gICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLmNvbHVtbkhlYWRlckNsYXNzLFxuICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgY29sU3BhbixcbiAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0aGlzLmdldEhlYWRlckJhY2tncm91bmQoaGVhZGVyLCBsZXZlbCksXG4gICAgICAgIGNvbnN0cmFpbnQ6IGhlYWRlci5jb25zdHJhaW50LFxuICAgICAgICBsYWJlbDogaGVhZGVyLmF0dHJpYnV0ZU5hbWUsXG4gICAgICB9O1xuXG4gICAgICBpZiAoaGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0ZUFuZEZpbGxDZWxsc0J5Q29sdW1ucyhcbiAgICAgICAgICBjZWxscyxcbiAgICAgICAgICBjb2x1bW5Hcm91cHNJbmZvLFxuICAgICAgICAgIGhlYWRlci5jaGlsZHJlbixcbiAgICAgICAgICBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgc2hvd1N1bXMsXG4gICAgICAgICAgbGV2ZWwgKyAxLFxuICAgICAgICAgIGhlYWRlclxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpc05vdE51bGxPclVuZGVmaW5lZChoZWFkZXIudGFyZ2V0SW5kZXgpKSB7XG4gICAgICAgIHRoaXMuZmlsbENlbGxzRm9yQ29sdW1uKGNlbGxzLCBoZWFkZXIudGFyZ2V0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50SW5kZXggKz0gZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsLCBzaG93U3VtcywgbnVtYmVyT2ZTdW1zKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1N1bXNbbGV2ZWxdKSB7XG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5nZXRTdW1tYXJ5QmFja2dyb3VuZChsZXZlbCk7XG4gICAgICBjb25zdCB7IHRpdGxlLCBzdW1tYXJ5IH0gPSB0aGlzLmZvcm1hdFN1bW1hcnlIZWFkZXIocGFyZW50SGVhZGVyLCBsZXZlbClcbiAgICAgIGNvbnN0IG51bWJlck9mVmFsdWVzID0gdGhpcy5kYXRhLnZhbHVlVGl0bGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJvd0luZGV4ID0gTWF0aC5tYXgobGV2ZWwgLSAxLCAwKTtcbiAgICAgIGNvbnN0IHNob3VsZEFkZFZhbHVlSGVhZGVycyA9IG51bWJlck9mVmFsdWVzID4gMTtcblxuICAgICAgY2VsbHNbcm93SW5kZXhdW2N1cnJlbnRJbmRleF0gPSB7XG4gICAgICAgIHZhbHVlOiB0aXRsZSxcbiAgICAgICAgY29uc3RyYWludDogcGFyZW50SGVhZGVyPy5jb25zdHJhaW50LFxuICAgICAgICBsYWJlbDogcGFyZW50SGVhZGVyPy5hdHRyaWJ1dGVOYW1lLFxuICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5jb2x1bW5Hcm91cEhlYWRlckNsYXNzLFxuICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICByb3dTcGFuOiB0aGlzLmNvbHVtbkxldmVscyAtIHJvd0luZGV4IC0gKHNob3VsZEFkZFZhbHVlSGVhZGVycyA/IDEgOiAwKSxcbiAgICAgICAgY29sU3BhbjogbnVtYmVyT2ZTdW1zLFxuICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICBzdW1tYXJ5LFxuICAgICAgfTtcblxuICAgICAgaWYgKG51bWJlck9mVmFsdWVzID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mVmFsdWVzOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleEluQ2VsbHMgPSBjdXJyZW50SW5kZXggKyBpO1xuICAgICAgICAgIGlmIChzaG91bGRBZGRWYWx1ZUhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlVGl0bGUgPSB0aGlzLmRhdGEudmFsdWVUaXRsZXNbaV07XG4gICAgICAgICAgICBjZWxsc1t0aGlzLmNvbHVtbkxldmVscyAtIDFdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVRpdGxlLFxuICAgICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5jb2x1bW5Hcm91cEhlYWRlckNsYXNzLFxuICAgICAgICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5zSW5kZXhlcyA9IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1uc0luZGV4ZXMgPSBjb2x1bW5zSW5kZXhlcy5maWx0ZXIoaW5kZXggPT4gaW5kZXggJSBudW1iZXJPZlZhbHVlcyA9PT0gaSk7XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2x1bW5JbmRleGVzID0gdmFsdWVDb2x1bW5zSW5kZXhlc1xuICAgICAgICAgICAgLm1hcCh2ID0+IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbdl0pXG4gICAgICAgICAgICAuZmlsdGVyKHYgPT4gaXNOb3ROdWxsT3JVbmRlZmluZWQodikpO1xuICAgICAgICAgIGNvbHVtbkdyb3Vwc0luZm9bY29sdW1uSW5kZXhJbkNlbGxzXSA9IHtiYWNrZ3JvdW5kLCBpbmRleGVzOiB0cmFuc2Zvcm1lZENvbHVtbkluZGV4ZXMsIGxldmVsfTtcblxuICAgICAgICAgIHRoaXMuZmlsbENlbGxzRm9yR3JvdXBlZENvbHVtbihjZWxscywgdmFsdWVDb2x1bW5zSW5kZXhlcywgY29sdW1uSW5kZXhJbkNlbGxzLCBiYWNrZ3JvdW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sdW1uR3JvdXBzSW5mb1tjdXJyZW50SW5kZXhdID0ge2JhY2tncm91bmQsIGluZGV4ZXM6IFtdLCBsZXZlbH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JHcm91cGVkQ29sdW1uKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgY29sdW1uczogbnVtYmVyW10sXG4gICAgY29sdW1uSW5kZXhJbkNlbGxzOiBudW1iZXIsXG4gICAgYmFja2dyb3VuZDogc3RyaW5nXG4gICkge1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyByb3crKykge1xuICAgICAgY29uc3Qgcm93SW5kZXhJbkNlbGxzID0gdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheVtyb3ddO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKHJvd0luZGV4SW5DZWxscykpIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhbcm93XSwgY29sdW1ucyk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5hZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlcywgW3Jvd10sIGNvbHVtbnMpO1xuICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgdmFsdWU6IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSksXG4gICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZ3JvdXBEYXRhQ2xhc3MsXG4gICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlczogYW55W10sIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IGFueSB7XG4gICAgY29uc3Qge3ZhbHVlLCBhZ2dyZWdhdGlvbn0gPSB0aGlzLmFnZ3JlZ2F0ZURhdGFWYWx1ZXModmFsdWVzLCBjb2x1bW5zKTtcbiAgICByZXR1cm4gYWdncmVnYXRpb24gPT09IERhdGFBZ2dyZWdhdGlvblR5cGUuSm9pbiA/IHZhbHVlIDogdGhpcy5mb3JtYXRHcm91cGVkVmFsdWVCeVZhbHVlVHlwZSh2YWx1ZSwgcm93cywgY29sdW1ucylcbiAgfVxuXG4gIHByaXZhdGUgYWdncmVnYXRlRGF0YVZhbHVlcyh2YWx1ZXM6IGFueVtdLCBjb2x1bW5zOiBudW1iZXJbXSk6IHt2YWx1ZTogYW55OyBhZ2dyZWdhdGlvbjogRGF0YUFnZ3JlZ2F0aW9uVHlwZX0ge1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uID0gdGhpcy5hZ2dyZWdhdGlvbkJ5Q29sdW1ucyhjb2x1bW5zKTtcbiAgICBpZiAoYWdncmVnYXRpb24gPT09IERhdGFBZ2dyZWdhdGlvblR5cGUuSm9pbikge1xuICAgICAgY29uc3QgdmFsdWVJbmRleCA9IHRoaXMuZ2V0VmFsdWVJbmRleEZvckNvbHVtbnMoY29sdW1ucyk7XG4gICAgICBjb25zdCBjb25zdHJhaW50ID0gdGhpcy5kYXRhLnZhbHVlc0NvbnN0cmFpbnRzPy5bdmFsdWVJbmRleF0gfHwgdGhpcy52YWx1ZVR5cGVJbmZvW3ZhbHVlSW5kZXhdPy5kZWZhdWx0Q29uc3RyYWludDtcbiAgICAgIHJldHVybiB7dmFsdWU6IGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoYWdncmVnYXRpb24sIHZhbHVlcywgY29uc3RyYWludCwgZmFsc2UsIHRoaXMuY29uc3RyYWludERhdGEpLCBhZ2dyZWdhdGlvbn07XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoYWdncmVnYXRpb24sIHZhbHVlcyksIGFnZ3JlZ2F0aW9ufTtcbiAgfVxuXG4gIHByaXZhdGUgYWdncmVnYXRpb25CeUNvbHVtbnMoY29sdW1uczogbnVtYmVyW10pOiBEYXRhQWdncmVnYXRpb25UeXBlIHtcbiAgICBjb25zdCB2YWx1ZUluZGV4ID0gY29sdW1uc1swXSAlIHRoaXMuZGF0YS52YWx1ZVRpdGxlcy5sZW5ndGg7XG4gICAgY29uc3QgYWdncmVnYXRpb24gPSB0aGlzLmRhdGEudmFsdWVBZ2dyZWdhdGlvbnM/Llt2YWx1ZUluZGV4XTtcbiAgICByZXR1cm4gaXNWYWx1ZUFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uKSA/IGFnZ3JlZ2F0aW9uIDogRGF0YUFnZ3JlZ2F0aW9uVHlwZS5TdW07XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0ZvckNvbHVtbihjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLCBjb2x1bW46IG51bWJlcikge1xuICAgIGNvbnN0IGNvbHVtbkluZGV4SW5DZWxscyA9IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbY29sdW1uXTtcbiAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoY29sdW1uSW5kZXhJbkNlbGxzKSkge1xuICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICAgIGNvbnN0IHJvd0luZGV4SW5DZWxscyA9IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXlbcm93XTtcbiAgICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKHJvd0luZGV4SW5DZWxscykpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS52YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgICAgIGNvbnN0IGRhdGFSZXNvdXJjZXMgPSB0aGlzLmRhdGFSZXNvdXJjZXM/Lltyb3ddPy5bY29sdW1uXSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuYWdncmVnYXRlT3JGb3JtYXRTaW5nbGVWYWx1ZSh2YWx1ZSwgY29sdW1uKTtcbiAgICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IGlzTm90TnVsbE9yVW5kZWZpbmVkKGZvcm1hdHRlZFZhbHVlKSA/IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSkgOiAnJztcbiAgICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogc3RyaW5nVmFsdWUsXG4gICAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5kYXRhQ2xhc3MsXG4gICAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWdncmVnYXRlT3JGb3JtYXRTaW5nbGVWYWx1ZSh2YWx1ZTogYW55LCBjb2x1bW46IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgYWdncmVnYXRpb24gPSB0aGlzLmFnZ3JlZ2F0aW9uQnlDb2x1bW5zKFtjb2x1bW5dKTtcbiAgICBjb25zdCB2YWx1ZUluZGV4ID0gdGhpcy5nZXRWYWx1ZUluZGV4Rm9yQ29sdW1ucyhbY29sdW1uXSk7XG4gICAgaWYgKGFnZ3JlZ2F0aW9uID09PSBEYXRhQWdncmVnYXRpb25UeXBlLkpvaW4pIHtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnQgPSB0aGlzLmRhdGEudmFsdWVzQ29uc3RyYWludHM/Llt2YWx1ZUluZGV4XSB8fCB0aGlzLnZhbHVlVHlwZUluZm9bdmFsdWVJbmRleF0/LmRlZmF1bHRDb25zdHJhaW50O1xuICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoYWdncmVnYXRpb24sIFt2YWx1ZV0sIGNvbnN0cmFpbnQsIGZhbHNlLCB0aGlzLmNvbnN0cmFpbnREYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeVZhbHVlVHlwZSh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0J5R3JvdXBJbnRlcnNlY3Rpb24oXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICByb3dHcm91cHNJbmZvOiBIZWFkZXJHcm91cEluZm9bXSxcbiAgICBjb2x1bW5Hcm91cHNJbmZvOiBIZWFkZXJHcm91cEluZm9bXVxuICApIHtcbiAgICBjb25zdCByb3dzQ291bnQgPSBjZWxscy5sZW5ndGg7XG4gICAgY29uc3QgY29sdW1uc0NvdW50ID0gKGNlbGxzWzBdICYmIGNlbGxzWzBdLmxlbmd0aCkgfHwgMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93R3JvdXBzSW5mby5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm93R3JvdXBJbmZvID0gcm93R3JvdXBzSW5mb1tpXTtcbiAgICAgIGlmIChyb3dHcm91cEluZm8pIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2x1bW5Hcm91cHNJbmZvLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKGNvbHVtbkdyb3Vwc0luZm9bal0pIHtcbiAgICAgICAgICAgIC8vIGl0J3MgZW5vdWdoIHRvIGZpbGwgZ3JvdXAgdmFsdWVzIG9ubHkgZnJvbSByb3cgc2lkZVxuICAgICAgICAgICAgY29uc3Qge3Jvd3NJbmRleGVzLCBjb2x1bW5zSW5kZXhlc30gPSB0aGlzLmdldFZhbHVlc0luZGV4ZXNGcm9tQ2VsbHNJbmRleGVzKFxuICAgICAgICAgICAgICByb3dHcm91cEluZm8uaW5kZXhlcyxcbiAgICAgICAgICAgICAgY29sdW1uR3JvdXBzSW5mb1tqXS5pbmRleGVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhyb3dzSW5kZXhlcywgY29sdW1uc0luZGV4ZXMpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmFnZ3JlZ2F0ZUFuZEZvcm1hdERhdGFWYWx1ZXModmFsdWVzLCByb3dzSW5kZXhlcywgY29sdW1uc0luZGV4ZXMpO1xuICAgICAgICAgICAgY2VsbHNbaV1bal0gPSB7XG4gICAgICAgICAgICAgIHZhbHVlOiBTdHJpbmcoZm9ybWF0dGVkVmFsdWUpLFxuICAgICAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5ncm91cERhdGFDbGFzcyxcbiAgICAgICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbGxSb3dXaXRoQ29sb3IoY2VsbHMsIGksIHJvd0dyb3VwSW5mbywgY29sdW1uc0NvdW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkdyb3Vwc0luZm8ubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChjb2x1bW5Hcm91cHNJbmZvW2pdKSB7XG4gICAgICAgIHRoaXMuZmlsbENvbHVtbldpdGhDb2xvcihjZWxscywgaiwgY29sdW1uR3JvdXBzSW5mb1tqXSwgcm93R3JvdXBzSW5mbywgcm93c0NvdW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFZhbHVlc0luZGV4ZXNGcm9tQ2VsbHNJbmRleGVzKFxuICAgIHJvd3M6IG51bWJlcltdLFxuICAgIGNvbHVtbnM6IG51bWJlcltdXG4gICk6IHsgcm93c0luZGV4ZXM6IG51bWJlcltdOyBjb2x1bW5zSW5kZXhlczogbnVtYmVyW10gfSB7XG4gICAgY29uc3Qgcm93c0luZGV4ZXMgPSByb3dzXG4gICAgICAubWFwKHJvdyA9PiB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5LmZpbmRJbmRleCh0Um93ID0+IHRSb3cgPT09IHJvdykpXG4gICAgICAuZmlsdGVyKGluZGV4ID0+IGluZGV4ID49IDApO1xuICAgIGNvbnN0IGNvbHVtbnNJbmRleGVzID0gY29sdW1uc1xuICAgICAgLm1hcChjb2x1bW4gPT4gdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5maW5kSW5kZXgodENvbHVtbiA9PiB0Q29sdW1uID09PSBjb2x1bW4pKVxuICAgICAgLmZpbHRlcihpbmRleCA9PiBpbmRleCA+PSAwKTtcbiAgICByZXR1cm4ge3Jvd3NJbmRleGVzLCBjb2x1bW5zSW5kZXhlc307XG4gIH1cblxuICBwcml2YXRlIGZpbGxSb3dXaXRoQ29sb3IoXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICByb3c6IG51bWJlcixcbiAgICByb3dHcm91cEluZm86IEhlYWRlckdyb3VwSW5mbyxcbiAgICBjb2x1bW5zQ291bnQ6IG51bWJlclxuICApIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5yb3dMZXZlbHM7IGkgPCBjb2x1bW5zQ291bnQ7IGkrKykge1xuICAgICAgY2VsbHNbcm93XVtpXSAmJiAoY2VsbHNbcm93XVtpXS5iYWNrZ3JvdW5kID0gcm93R3JvdXBJbmZvLmJhY2tncm91bmQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmlsbENvbHVtbldpdGhDb2xvcihcbiAgICBjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLFxuICAgIGNvbHVtbjogbnVtYmVyLFxuICAgIGNvbHVtbkdyb3VwSW5mbzogSGVhZGVyR3JvdXBJbmZvLFxuICAgIHJvd0dyb3Vwc0luZm86IEhlYWRlckdyb3VwSW5mb1tdLFxuICAgIHJvd0NvdW50OiBudW1iZXJcbiAgKSB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMuY29sdW1uTGV2ZWxzOyBpIDwgcm93Q291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgcm93R3JvdXBJbmZvID0gcm93R3JvdXBzSW5mb1tpXTtcbiAgICAgIGlmICghcm93R3JvdXBJbmZvIHx8IHJvd0dyb3VwSW5mby5sZXZlbCA+IGNvbHVtbkdyb3VwSW5mby5sZXZlbCkge1xuICAgICAgICBjZWxsc1tpXVtjb2x1bW5dICYmIChjZWxsc1tpXVtjb2x1bW5dLmJhY2tncm91bmQgPSBjb2x1bW5Hcm91cEluZm8uYmFja2dyb3VuZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q2VsbHMoKTogTG1yUGl2b3RUYWJsZUNlbGxbXVtdIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzQ291bnQoKSArIHRoaXMuY29sdW1uTGV2ZWxzO1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldENvbHVtbnNDb3VudCgpICsgdGhpcy5yb3dMZXZlbHM7XG5cbiAgICBjb25zdCBtYXRyaXg6IExtclBpdm90VGFibGVDZWxsW11bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICBtYXRyaXhbaV0gPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uczsgaisrKSB7XG4gICAgICAgIGlmIChpID49IHRoaXMuY29sdW1uTGV2ZWxzICYmIGogPj0gdGhpcy5yb3dMZXZlbHMpIHtcbiAgICAgICAgICBjb25zdCBpc0RhdGFDbGFzcyA9IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkuaW5jbHVkZXMoaSkgJiYgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5pbmNsdWRlcyhqKTtcbiAgICAgICAgICBtYXRyaXhbaV1bal0gPSB7XG4gICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICBkYXRhUmVzb3VyY2VzOiBbXSxcbiAgICAgICAgICAgIGNzc0NsYXNzOiBpc0RhdGFDbGFzcyA/IFBpdm90VGFibGVDb252ZXJ0ZXIuZGF0YUNsYXNzIDogUGl2b3RUYWJsZUNvbnZlcnRlci5ncm91cERhdGFDbGFzcyxcbiAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgaXNIZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF0cml4W2ldW2pdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucm93TGV2ZWxzID4gMCAmJiB0aGlzLmNvbHVtbkxldmVscyA+IDApIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5yb3dMZXZlbHM7IGorKykge1xuICAgICAgICBjb25zdCByb3dIZWFkZXJBdHRyaWJ1dGUgPSB0aGlzLmRhdGEucm93SGVhZGVyQXR0cmlidXRlc1tqXTtcbiAgICAgICAgaWYgKHJvd0hlYWRlckF0dHJpYnV0ZSkge1xuICAgICAgICAgIGNvbnN0IHRpdGxlQ29sU3BhbiA9IHRoaXMubm9uU3RpY2t5Q29sdW1uSW5kZXggfHwgdGhpcy5jb2x1bW5MZXZlbHNcbiAgICAgICAgICBtYXRyaXhbMF1bal0gPSB7XG4gICAgICAgICAgICB2YWx1ZTogcm93SGVhZGVyQXR0cmlidXRlLnRpdGxlLFxuICAgICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIucm93QXR0cmlidXRlSGVhZGVyQ2xhc3MsXG4gICAgICAgICAgICBpc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICBjb2xTcGFuOiB0aXRsZUNvbFNwYW4sXG4gICAgICAgICAgICBzdGlja3lUb3A6IHRoaXMuaXNDb2x1bW5MZXZlbFN0aWNreSgwKSxcbiAgICAgICAgICAgIHN0aWNreVN0YXJ0OiB0aGlzLmlzUm93TGV2ZWxTdGlja3koaiksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiByb3dIZWFkZXJBdHRyaWJ1dGUuY29sb3IsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbkxldmVscyAtIHRpdGxlQ29sU3BhbiA+IDApIHtcbiAgICAgICAgICAgIG1hdHJpeFt0aGlzLm5vblN0aWNreUNvbHVtbkluZGV4XVtqXSA9IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5yb3dBdHRyaWJ1dGVIZWFkZXJDbGFzcyxcbiAgICAgICAgICAgICAgaXNIZWFkZXI6IHRydWUsXG4gICAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICAgIGNvbFNwYW46IHRoaXMuY29sdW1uTGV2ZWxzIC0gdGl0bGVDb2xTcGFuLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiByb3dIZWFkZXJBdHRyaWJ1dGUuY29sb3IsXG4gICAgICAgICAgICAgIHN0aWNreVN0YXJ0OiB0aGlzLmlzUm93TGV2ZWxTdGlja3koaiksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5MZXZlbHM7IGkrKykge1xuICAgICAgICAgICAgbWF0cml4W2ldW2pdID0ge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLmVtcHR5Q2xhc3MsXG4gICAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICAgIHN0aWNreVN0YXJ0OiB0aGlzLmlzUm93TGV2ZWxTdGlja3koaiksXG4gICAgICAgICAgICAgIHN0aWNreVRvcDogdGhpcy5pc0NvbHVtbkxldmVsU3RpY2t5KGkpLFxuICAgICAgICAgICAgICBpc0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um93c0NvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YS5yb3dIZWFkZXJzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy5kYXRhLnZhbHVlVGl0bGVzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEhlYWRlcnNDaGlsZENvdW50KHRoaXMuZGF0YS5yb3dIZWFkZXJzLCB0aGlzLnJvd1Nob3dTdW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uc0NvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YS5jb2x1bW5IZWFkZXJzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy5kYXRhLnZhbHVlVGl0bGVzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgY29uc3QgbnVtYmVyT2ZTdW1zID0gTWF0aC5tYXgoMSwgKHRoaXMuZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoKTtcbiAgICByZXR1cm4gZ2V0SGVhZGVyc0NoaWxkQ291bnQodGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMsIHRoaXMuY29sdW1uU2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVBpdm90RGF0YShcbiAgZGF0YTogTG1yUGl2b3RTdGVtRGF0YSxcbiAgY29uc3RyYWludERhdGE6IENvbnN0cmFpbnREYXRhLFxuICB2YWx1ZVR5cGVJbmZvOiBWYWx1ZVR5cGVJbmZvW11cbik6IExtclBpdm90U3RlbURhdGEge1xuICBjb25zdCBudW1iZXJPZlN1bXMgPSBNYXRoLm1heCgxLCAoZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWVzID0gY29tcHV0ZVZhbHVlc0J5VmFsdWVUeXBlKGRhdGEudmFsdWVzLCBkYXRhLnZhbHVlVHlwZXMsIG51bWJlck9mU3VtcywgdmFsdWVUeXBlSW5mbyk7XG4gIGNvbnN0IHNvcnRlZCA9IHNvcnRQaXZvdERhdGEoey4uLmRhdGEsIHZhbHVlc30sIGNvbnN0cmFpbnREYXRhKTtcbiAgcmV0dXJuIGZpbGxFeHByZXNzaW9uc1RvRGF0YShzb3J0ZWQpXG59XG5cbmZ1bmN0aW9uIGZpbGxFeHByZXNzaW9uc1RvRGF0YShkYXRhOiBMbXJQaXZvdFN0ZW1EYXRhKTogTG1yUGl2b3RTdGVtRGF0YSB7XG4gIHJldHVybiB7XG4gICAgLi4uZGF0YSxcbiAgICByb3dIZWFkZXJzOiBmaWxsRXhwcmVzc2lvbnNUb0hlYWRlcnMoZGF0YS5yb3dIZWFkZXJzLCBkYXRhLnJvd3NDb25maWcsIDApLFxuICAgIGNvbHVtbkhlYWRlcnM6IGZpbGxFeHByZXNzaW9uc1RvSGVhZGVycyhkYXRhLmNvbHVtbkhlYWRlcnMsIGRhdGEuY29sdW1uc0NvbmZpZywgMCksXG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsbEV4cHJlc3Npb25zVG9IZWFkZXJzKGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLCBjb25maWdzOiBMbXJQaXZvdERpbWVuc2lvbkNvbmZpZ1tdLCBpbmRleDogbnVtYmVyKTogTG1yUGl2b3REYXRhSGVhZGVyW10ge1xuICBjb25zdCBleHByZXNzaW9ucyA9IGNvbmZpZ3M/LltpbmRleF0/LmV4cHJlc3Npb25zIHx8IFtdXG4gIGNvbnN0IGhlYWRlcnNDb3B5ID0gWy4uLihoZWFkZXJzIHx8IFtdKV1cbiAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIGV4cHJlc3Npb25zKSB7XG4gICAgY29uc3QgZGF0YUhlYWRlckV4cHJlc3Npb24gPSBleHRlbmRQaXZvdEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgaGVhZGVycylcbiAgICBpZiAoZGF0YUhlYWRlckV4cHJlc3Npb24ubGFzdEhlYWRlckluZGV4ID49IDApIHtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGRhdGFIZWFkZXJFeHByZXNzaW9uLmxhc3RIZWFkZXJJbmRleFxuICAgICAgY29uc3QgbmV3SGVhZGVyOiBMbXJQaXZvdERhdGFIZWFkZXIgPSB7Li4uaGVhZGVyc0NvcHlbbGFzdEhlYWRlckluZGV4XSwgZXhwcmVzc2lvbnM6IFsuLi4oaGVhZGVyc0NvcHlbbGFzdEhlYWRlckluZGV4XS5leHByZXNzaW9ucyB8fCBbXSksIGRhdGFIZWFkZXJFeHByZXNzaW9uXX1cbiAgICAgIGhlYWRlcnNDb3B5LnNwbGljZShsYXN0SGVhZGVySW5kZXgsIDEsIG5ld0hlYWRlcilcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlncz8uW2luZGV4ICsgMV0pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnNDb3B5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBoZWFkZXJzQ29weS5zcGxpY2UoaSwgMSwgey4uLmhlYWRlcnNDb3B5W2ldLCBjaGlsZHJlbjogZmlsbEV4cHJlc3Npb25zVG9IZWFkZXJzKGhlYWRlcnNDb3B5W2ldLmNoaWxkcmVuLCBjb25maWdzLCBpbmRleCArIDEpfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGVhZGVyc0NvcHlcbn1cblxuZnVuY3Rpb24gZXh0ZW5kUGl2b3RFeHByZXNzaW9uKGV4cHJlc3Npb246IExtclBpdm90RXhwcmVzc2lvbiwgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10pOiBMbXJQaXZvdERhdGFIZWFkZXJFeHByZXNzaW9uIHtcbiAgY29uc3QgZGF0YUhlYWRlck9wZXJhbmRzOiBMbXJQaXZvdERhdGFIZWFkZXJPcGVyYW5kW10gPSBbXTtcbiAgbGV0IGxhc3RIZWFkZXJJbmRleDogbnVtYmVyID0gLTFcblxuICBmdW5jdGlvbiB0cmF2ZXJzZShvcGVyYW5kczogTG1yUGl2b3RPcGVyYW5kW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9wZXJhbmQgb2Ygb3BlcmFuZHMpe1xuICAgICAgaWYgKG9wZXJhbmQudHlwZSA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IGdldE9wZXJhbmRJbmRleGVzSW5IZWFkZXJzKG9wZXJhbmQsIGhlYWRlcnMpXG4gICAgICAgIGxhc3RIZWFkZXJJbmRleCA9IE1hdGgubWF4KGxhc3RIZWFkZXJJbmRleCwgLi4uaW5kZXhlcylcbiAgICAgICAgY29uc3Qgb3BlcmFuZEhlYWRlcnMgPSBpbmRleGVzLm1hcChpbmRleCA9PiBoZWFkZXJzW2luZGV4XSlcbiAgICAgICAgZGF0YUhlYWRlck9wZXJhbmRzLnB1c2goey4uLm9wZXJhbmQsIGhlYWRlcnM6IG9wZXJhbmRIZWFkZXJzfSk7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhbmQudHlwZSA9PT0gJ2V4cHJlc3Npb24nKSB7XG4gICAgICAgIHRyYXZlcnNlKG9wZXJhbmQub3BlcmFuZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YUhlYWRlck9wZXJhbmRzLnB1c2gob3BlcmFuZClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmF2ZXJzZShleHByZXNzaW9uLm9wZXJhbmRzKTtcblxuICByZXR1cm4gey4uLmV4cHJlc3Npb24sIGxhc3RIZWFkZXJJbmRleCwgb3BlcmFuZHM6IGRhdGFIZWFkZXJPcGVyYW5kc307XG59XG5cbmZ1bmN0aW9uIGdldE9wZXJhbmRJbmRleGVzSW5IZWFkZXJzKG9wZXJhbmQ6IExtclBpdm90SGVhZGVyT3BlcmFuZCwgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiAoaGVhZGVycyB8fCBbXSkucmVkdWNlPG51bWJlcltdPigoaW5kZXhlcywgaGVhZGVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChvcGVyYW5kQ29udGFpbnNIZWFkZXIob3BlcmFuZCwgaGVhZGVyKSkge1xuICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXhlc1xuICB9LCBbXSlcbn1cblxuZnVuY3Rpb24gb3BlcmFuZENvbnRhaW5zSGVhZGVyKG9wZXJhbmQ6IExtclBpdm90SGVhZGVyT3BlcmFuZCwgaGVhZGVyOiBMbXJQaXZvdERhdGFIZWFkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhlYWRlci50aXRsZS5tYXRjaChuZXcgUmVnRXhwKG9wZXJhbmQudmFsdWUpKT8ubGVuZ3RoID4gMFxufVxuXG5mdW5jdGlvbiBjb21wdXRlVmFsdWVzQnlWYWx1ZVR5cGUoXG4gIHZhbHVlczogYW55W11bXSxcbiAgdmFsdWVUeXBlczogTG1yUGl2b3RWYWx1ZVR5cGVbXSxcbiAgbnVtVmFsdWVzOiBudW1iZXIsXG4gIHZhbHVlVHlwZUluZm86IFZhbHVlVHlwZUluZm9bXVxuKTogYW55W11bXSB7XG4gIGNvbnN0IHJvd3NJbmRleGVzID0gWy4uLkFycmF5KHZhbHVlcy5sZW5ndGgpLmtleXMoKV07XG4gIGNvbnN0IG1vZGlmaWVkVmFsdWVzID0gZGVlcE9iamVjdENvcHkodmFsdWVzKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7XG4gICAgY29uc3QgdmFsdWVUeXBlID0gdmFsdWVUeXBlcyAmJiB2YWx1ZVR5cGVzW2ldO1xuICAgIGlmICghdmFsdWVUeXBlIHx8IHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuRGVmYXVsdCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uc0NvdW50ID0gKHZhbHVlc1swXSAmJiB2YWx1ZXNbMF0ubGVuZ3RoKSB8fCAwO1xuICAgIGNvbnN0IGNvbHVtbkluZGV4ZXMgPSBbLi4uQXJyYXkoY29sdW1uc0NvdW50KS5rZXlzKCldLmZpbHRlcihrZXkgPT4ga2V5ICUgbnVtVmFsdWVzID09PSBpKTtcbiAgICBjb25zdCBpbmZvID0gdmFsdWVUeXBlSW5mb1tpXTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3NJbmRleGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5JbmRleGVzKSB7XG4gICAgICAgIGlmICh2YWx1ZVR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLkFsbFBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICBtb2RpZmllZFZhbHVlc1tyb3ddW2NvbHVtbl0gPSBkaXZpZGVWYWx1ZXModmFsdWVzW3Jvd11bY29sdW1uXSwgaW5mby5zdW0pO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuUm93UGVyY2VudGFnZSkge1xuICAgICAgICAgIG1vZGlmaWVkVmFsdWVzW3Jvd11bY29sdW1uXSA9IGRpdmlkZVZhbHVlcyh2YWx1ZXNbcm93XVtjb2x1bW5dLCBpbmZvLnN1bXNSb3dzW3Jvd10pO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQ29sdW1uUGVyY2VudGFnZSkge1xuICAgICAgICAgIG1vZGlmaWVkVmFsdWVzW3Jvd11bY29sdW1uXSA9IGRpdmlkZVZhbHVlcyh2YWx1ZXNbcm93XVtjb2x1bW5dLCBpbmZvLnN1bXNDb2x1bW5zW2NvbHVtbl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1vZGlmaWVkVmFsdWVzO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZXNUeXBlSW5mbyh2YWx1ZXM6IGFueVtdW10sIHZhbHVlVHlwZXM6IExtclBpdm90VmFsdWVUeXBlW10sIG51bVZhbHVlczogbnVtYmVyKTogVmFsdWVUeXBlSW5mb1tdIHtcbiAgY29uc3QgdmFsdWVUeXBlSW5mbyA9IFtdO1xuICBjb25zdCByb3dzSW5kZXhlcyA9IFsuLi5BcnJheSh2YWx1ZXMubGVuZ3RoKS5rZXlzKCldO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGVzICYmIHZhbHVlVHlwZXNbaV07XG4gICAgY29uc3QgY29sdW1uc0NvdW50ID0gKHZhbHVlc1swXSAmJiB2YWx1ZXNbMF0ubGVuZ3RoKSB8fCAwO1xuICAgIGNvbnN0IGNvbHVtbkluZGV4ZXMgPSBbLi4uQXJyYXkoY29sdW1uc0NvdW50KS5rZXlzKCldLmZpbHRlcihrZXkgPT4ga2V5ICUgbnVtVmFsdWVzID09PSBpKTtcblxuICAgIHZhbHVlVHlwZUluZm9baV0gPSBnZXRWYWx1ZVR5cGVJbmZvKHZhbHVlcywgdmFsdWVUeXBlLCByb3dzSW5kZXhlcywgY29sdW1uSW5kZXhlcyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWVUeXBlSW5mbztcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVUeXBlSW5mbyh2YWx1ZXM6IGFueVtdW10sIHR5cGU6IExtclBpdm90VmFsdWVUeXBlLCByb3dzOiBudW1iZXJbXSwgY29sdW1uczogbnVtYmVyW10pOiBWYWx1ZVR5cGVJbmZvIHtcbiAgY29uc3QgY29udGFpbnNEZWNpbWFsID0gY29udGFpbnNEZWNpbWFsVmFsdWUodmFsdWVzLCByb3dzLCBjb2x1bW5zKTtcbiAgY29uc3QgdmFsdWVUeXBlSW5mbzogVmFsdWVUeXBlSW5mbyA9IHtcbiAgICBkZWZhdWx0Q29uc3RyYWludDogY29udGFpbnNEZWNpbWFsID8gbmV3IE51bWJlckNvbnN0cmFpbnQoe2RlY2ltYWxzOiAyfSkgOiBudWxsLFxuICB9O1xuXG4gIGlmICh0eXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5BbGxQZXJjZW50YWdlKSB7XG4gICAgcmV0dXJuIHsuLi52YWx1ZVR5cGVJbmZvLCBzdW06IGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlcywgcm93cywgY29sdW1ucyl9O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLlJvd1BlcmNlbnRhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWVUeXBlSW5mbyxcbiAgICAgIHN1bXNSb3dzOiByb3dzLnJlZHVjZSgoYXJyLCByb3cpID0+IHtcbiAgICAgICAgYXJyW3Jvd10gPSBnZXROdW1lcmljVmFsdWVzU3VtbWFyeSh2YWx1ZXMsIFtyb3ddLCBjb2x1bW5zKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgIH0sIFtdKSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLkNvbHVtblBlcmNlbnRhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWVUeXBlSW5mbyxcbiAgICAgIHN1bXNDb2x1bW5zOiBjb2x1bW5zLnJlZHVjZSgoYXJyLCBjb2x1bW4pID0+IHtcbiAgICAgICAgYXJyW2NvbHVtbl0gPSBnZXROdW1lcmljVmFsdWVzU3VtbWFyeSh2YWx1ZXMsIHJvd3MsIFtjb2x1bW5dKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgIH0sIFtdKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsuLi52YWx1ZVR5cGVJbmZvfTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNEZWNpbWFsVmFsdWUodmFsdWVzOiBhbnlbXVtdLCByb3dzOiBudW1iZXJbXSwgY29sdW1uczogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIGlmIChpc1ZhbHVlRGVjaW1hbCh2YWx1ZXNbcm93XVtjb2x1bW5dKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRGVjaW1hbCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNOdW1lcmljKHZhbHVlKSkge1xuICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgJSAxICE9PSAwO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHJhbnNmb3JtYXRpb25NYXAoXG4gIGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICBzaG93U3VtczogYm9vbGVhbltdLFxuICBhZGRpdGlvbmFsTnVtOiBudW1iZXIsXG4gIG51bWJlck9mU3VtczogbnVtYmVyXG4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGFycmF5ID0gW107XG4gIGl0ZXJhdGVUaHJvdWdoVHJhbnNmb3JtYXRpb25NYXAoaGVhZGVycywgYWRkaXRpb25hbE51bSwgYXJyYXksIDAsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpO1xuICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIGl0ZXJhdGVUaHJvdWdoVHJhbnNmb3JtYXRpb25NYXAoXG4gIGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICBhZGRpdGlvbmFsTnVtOiBudW1iZXIsXG4gIGFycmF5OiBudW1iZXJbXSxcbiAgbGV2ZWw6IG51bWJlcixcbiAgc2hvd1N1bXM6IGJvb2xlYW5bXSxcbiAgbnVtYmVyT2ZTdW1zOiBudW1iZXJcbikge1xuICBsZXQgYWRkaXRpb25hbCA9IGFkZGl0aW9uYWxOdW07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGhlYWRlciA9IGhlYWRlcnNbaV07XG4gICAgaWYgKGhlYWRlci5jaGlsZHJlbikge1xuICAgICAgaXRlcmF0ZVRocm91Z2hUcmFuc2Zvcm1hdGlvbk1hcChoZWFkZXIuY2hpbGRyZW4sIGFkZGl0aW9uYWwsIGFycmF5LCBsZXZlbCArIDEsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpO1xuICAgICAgYWRkaXRpb25hbCArPSBnZXRIZWFkZXJDaGlsZENvdW50KGhlYWRlciwgbGV2ZWwsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpO1xuICAgIH0gZWxzZSBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoaGVhZGVyLnRhcmdldEluZGV4KSkge1xuICAgICAgYXJyYXlbaGVhZGVyLnRhcmdldEluZGV4XSA9IGkgKyBhZGRpdGlvbmFsO1xuICAgICAgYWRkaXRpb25hbCArPSAoaGVhZGVyLmV4cHJlc3Npb25zIHx8IFtdKS5sZW5ndGg7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCBhbGxSb3dzID0gKGhlYWRlcnMgfHwgW10pLnJlZHVjZSgocm93cywgaGVhZGVyKSA9PiB7XG4gICAgcm93cy5wdXNoKC4uLmdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKSk7XG4gICAgcmV0dXJuIHJvd3M7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIHVuaXF1ZVZhbHVlczxudW1iZXI+KGFsbFJvd3MpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbmRleGVzRm9ySGVhZGVyKHBpdm90RGF0YUhlYWRlcjogTG1yUGl2b3REYXRhSGVhZGVyKTogbnVtYmVyW10ge1xuICBpZiAocGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHBpdm90RGF0YUhlYWRlci5jaGlsZHJlbi5yZWR1Y2UoKHJvd3MsIGhlYWRlcikgPT4ge1xuICAgICAgcm93cy5wdXNoKC4uLmdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKSk7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9LCBbXSk7XG4gIH1cbiAgcmV0dXJuIFtwaXZvdERhdGFIZWFkZXIudGFyZ2V0SW5kZXhdO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJzQ2hpbGRDb3VudChoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSwgc2hvd1N1bXM6IGJvb2xlYW5bXSwgbnVtYmVyT2ZTdW1zID0gMSk6IG51bWJlciB7XG4gIHJldHVybiAoaGVhZGVycyB8fCBbXSkucmVkdWNlKFxuICAgIChzdW0sIGhlYWRlcikgPT4gc3VtICsgZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIDAsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpLFxuICAgIHNob3dTdW1zWzBdID8gbnVtYmVyT2ZTdW1zIDogMFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJDaGlsZENvdW50KFxuICBwaXZvdERhdGFIZWFkZXI6IExtclBpdm90RGF0YUhlYWRlcixcbiAgbGV2ZWw6IG51bWJlcixcbiAgc2hvd1N1bXM6IGJvb2xlYW5bXSxcbiAgbnVtYmVyT2ZTdW1zID0gMSxcbik6IG51bWJlciB7XG4gIGNvbnN0IG51bUV4cHJlc3Npb25zID0gKHBpdm90RGF0YUhlYWRlci5leHByZXNzaW9ucyB8fCBbXSkubGVuZ3RoXG4gIGlmIChwaXZvdERhdGFIZWFkZXIuY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gcGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuLnJlZHVjZShcbiAgICAgIChzdW0sIGhlYWRlcikgPT4gc3VtICsgZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsICsgMSwgc2hvd1N1bXMsIG51bWJlck9mU3VtcyksXG4gICAgICAoc2hvd1N1bXNbbGV2ZWwgKyAxXSA/IG51bWJlck9mU3VtcyA6IDApICsgbnVtRXhwcmVzc2lvbnNcbiAgICApO1xuICB9XG4gIHJldHVybiAxICsgbnVtRXhwcmVzc2lvbnM7XG59XG5cbmZ1bmN0aW9uIGdldERpcmVjdEhlYWRlckNoaWxkQ291bnQoXG4gIHBpdm90RGF0YUhlYWRlcjogTG1yUGl2b3REYXRhSGVhZGVyLFxuICBsZXZlbDogbnVtYmVyLFxuICBzaG93U3VtczogYm9vbGVhbltdLFxuICBudW1iZXJPZlN1bXMgPSAxXG4pOiBudW1iZXIge1xuICBpZiAocGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHBpdm90RGF0YUhlYWRlci5jaGlsZHJlbi5yZWR1Y2UoXG4gICAgICAoc3VtLCBoZWFkZXIpID0+IHN1bSArIGdldEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCArIDEsIHNob3dTdW1zLCBudW1iZXJPZlN1bXMpLFxuICAgICAgMFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0UGl2b3REYXRhKGRhdGE6IExtclBpdm90U3RlbURhdGEsIGNvbnN0cmFpbnREYXRhOiBDb25zdHJhaW50RGF0YSk6IExtclBpdm90U3RlbURhdGEge1xuICBjb25zdCByb3dTb3J0cyA9IChkYXRhLnJvd3NDb25maWcgfHwgW10pLm1hcChjb25maWcgPT4gY29uZmlnLnNvcnQpXG4gIGNvbnN0IGNvbHVtblNvcnRzID0gKGRhdGEuY29sdW1uc0NvbmZpZyB8fCBbXSkubWFwKGNvbmZpZyA9PiBjb25maWcuc29ydClcbiAgcmV0dXJuIHtcbiAgICAuLi5kYXRhLFxuICAgIHJvd0hlYWRlcnM6IHNvcnRQaXZvdFJvd0RhdGFIZWFkZXJzKGRhdGEucm93SGVhZGVycywgcm93U29ydHMsIGRhdGEsIGNvbnN0cmFpbnREYXRhKSxcbiAgICBjb2x1bW5IZWFkZXJzOiBzb3J0UGl2b3RDb2x1bW5EYXRhSGVhZGVycyhkYXRhLmNvbHVtbkhlYWRlcnMsIGNvbHVtblNvcnRzLCBkYXRhLCBjb25zdHJhaW50RGF0YSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNvcnRQaXZvdFJvd0RhdGFIZWFkZXJzKFxuICByb3dIZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgcm93U29ydHM6IExtclBpdm90U29ydFtdLFxuICBwaXZvdERhdGE6IExtclBpdm90U3RlbURhdGEsXG4gIGNvbnN0cmFpbnREYXRhOiBDb25zdHJhaW50RGF0YVxuKTogTG1yUGl2b3REYXRhSGVhZGVyW10ge1xuICByZXR1cm4gc29ydFBpdm90RGF0YUhlYWRlcnNSZWN1cnNpdmUoXG4gICAgcm93SGVhZGVycyxcbiAgICAwLFxuICAgIHJvd1NvcnRzLFxuICAgIHBpdm90RGF0YS5jb2x1bW5IZWFkZXJzLFxuICAgIHBpdm90RGF0YS52YWx1ZXMsXG4gICAgcGl2b3REYXRhLnZhbHVlVGl0bGVzIHx8IFtdLFxuICAgIHRydWUsXG4gICAgY29uc3RyYWludERhdGFcbiAgKTtcbn1cblxuZnVuY3Rpb24gc29ydFBpdm90Q29sdW1uRGF0YUhlYWRlcnMoXG4gIGNvbHVtbkhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICBjb2x1bW5Tb3J0czogTG1yUGl2b3RTb3J0W10sXG4gIHBpdm90RGF0YTogTG1yUGl2b3RTdGVtRGF0YSxcbiAgY29uc3RyYWludERhdGE6IENvbnN0cmFpbnREYXRhXG4pOiBMbXJQaXZvdERhdGFIZWFkZXJbXSB7XG4gIHJldHVybiBzb3J0UGl2b3REYXRhSGVhZGVyc1JlY3Vyc2l2ZShcbiAgICBjb2x1bW5IZWFkZXJzLFxuICAgIDAsXG4gICAgY29sdW1uU29ydHMsXG4gICAgcGl2b3REYXRhLnJvd0hlYWRlcnMsXG4gICAgcGl2b3REYXRhLnZhbHVlcyxcbiAgICBwaXZvdERhdGEudmFsdWVUaXRsZXMgfHwgW10sXG4gICAgZmFsc2UsXG4gICAgY29uc3RyYWludERhdGFcbiAgKTtcbn1cblxuZnVuY3Rpb24gc29ydFBpdm90RGF0YUhlYWRlcnNSZWN1cnNpdmUoXG4gIGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICBpbmRleDogbnVtYmVyLFxuICBzb3J0czogTG1yUGl2b3RTb3J0W10sXG4gIG90aGVyU2lkZUhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICB2YWx1ZXM6IGFueVtdW10sXG4gIHZhbHVlVGl0bGVzOiBzdHJpbmdbXSxcbiAgaXNSb3dzOiBib29sZWFuLFxuICBjb25zdHJhaW50RGF0YTogQ29uc3RyYWludERhdGFcbik6IExtclBpdm90RGF0YUhlYWRlcltdIHtcbiAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzb3J0IHZhbHVlcyBoZWFkZXJzXG4gIGlmICghaXNSb3dzICYmIGlzVmFsdWVzSGVhZGVycyhoZWFkZXJzLCB2YWx1ZVRpdGxlcykpIHtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuICBjb25zdCBzb3J0ID0gc29ydHMgJiYgc29ydHNbaW5kZXhdO1xuICBjb25zdCBjb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludEZvclNvcnQoc29ydCwgaGVhZGVycyk7XG4gIGNvbnN0IHZhbHVlc01hcCA9IGNyZWF0ZUhlYWRlcnNWYWx1ZXNNYXAoaGVhZGVycywgc29ydCwgb3RoZXJTaWRlSGVhZGVycywgdmFsdWVzLCB2YWx1ZVRpdGxlcywgaXNSb3dzKTtcbiAgcmV0dXJuIGhlYWRlcnNcbiAgICAubWFwKGhlYWRlciA9PiAoe1xuICAgICAgLi4uaGVhZGVyLFxuICAgICAgY2hpbGRyZW46XG4gICAgICAgIGhlYWRlci5jaGlsZHJlbiAmJlxuICAgICAgICBzb3J0UGl2b3REYXRhSGVhZGVyc1JlY3Vyc2l2ZShcbiAgICAgICAgICBoZWFkZXIuY2hpbGRyZW4sXG4gICAgICAgICAgaW5kZXggKyAxLFxuICAgICAgICAgIHNvcnRzLFxuICAgICAgICAgIG90aGVyU2lkZUhlYWRlcnMsXG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgIHZhbHVlVGl0bGVzLFxuICAgICAgICAgIGlzUm93cyxcbiAgICAgICAgICBjb25zdHJhaW50RGF0YVxuICAgICAgICApLFxuICAgIH0pKVxuICAgIC5zb3J0KChyMSwgcjIpID0+IHtcbiAgICAgIGNvbnN0IHIxVmFsdWUgPSBjb25zdHJhaW50LmNyZWF0ZURhdGFWYWx1ZSh2YWx1ZXNNYXBbcjEudGl0bGVdLCBjb25zdHJhaW50RGF0YSk7XG4gICAgICBjb25zdCByMlZhbHVlID0gY29uc3RyYWludC5jcmVhdGVEYXRhVmFsdWUodmFsdWVzTWFwW3IyLnRpdGxlXSwgY29uc3RyYWludERhdGEpO1xuICAgICAgY29uc3QgbXVsdGlwbGllciA9ICFzb3J0IHx8IHNvcnQuYXNjID8gMSA6IC0xO1xuICAgICAgcmV0dXJuIHIxVmFsdWUuY29tcGFyZVRvKHIyVmFsdWUpICogbXVsdGlwbGllcjtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uc3RyYWludEZvclNvcnQoc29ydDogTG1yUGl2b3RTb3J0LCBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSk6IENvbnN0cmFpbnQge1xuICBpZiAoKHNvcnQ/Lmxpc3Q/LnZhbHVlcyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgIC8vIHNvcnQgaXMgZG9uZSBieSB2YWx1ZXMgaW4gY29sdW1uc1xuICAgIHJldHVybiBuZXcgTnVtYmVyQ29uc3RyYWludCh7fSk7XG4gIH1cbiAgcmV0dXJuICgoaGVhZGVycyB8fCBbXSlbMF0gJiYgKGhlYWRlcnMgfHwgW10pWzBdLmNvbnN0cmFpbnQpIHx8IG5ldyBVbmtub3duQ29uc3RyYWludCgpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbHVlc0hlYWRlcnMoaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sIHZhbHVlVGl0bGVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlVGl0bGVzLmxlbmd0aCA+IDEgJiZcbiAgICAoaGVhZGVycyB8fCBbXSkuZXZlcnkoXG4gICAgICAoaGVhZGVyLCBpbmRleCkgPT4gaXNOb3ROdWxsT3JVbmRlZmluZWQoaGVhZGVyLnRhcmdldEluZGV4KSAmJiBoZWFkZXIudGl0bGUgPT09IHZhbHVlVGl0bGVzW2luZGV4XVxuICAgIClcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSGVhZGVyc1ZhbHVlc01hcChcbiAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHNvcnQ6IExtclBpdm90U29ydCxcbiAgb3RoZXJTaWRlSGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHZhbHVlczogYW55W11bXSxcbiAgdmFsdWVUaXRsZXM6IHN0cmluZ1tdLFxuICBpc1Jvd3M6IGJvb2xlYW5cbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBzb3J0VGFyZ2V0SW5kZXhlcyA9IHNvcnRWYWx1ZVRhcmdldEluZGV4ZXMoc29ydCwgb3RoZXJTaWRlSGVhZGVycywgdmFsdWVUaXRsZXMpO1xuICBpZiAoIXNvcnRUYXJnZXRJbmRleGVzKSB7XG4gICAgcmV0dXJuIChoZWFkZXJzIHx8IFtdKS5yZWR1Y2UoKHZhbHVlc01hcCwgaGVhZGVyKSA9PiB7XG4gICAgICB2YWx1ZXNNYXBbaGVhZGVyLnRpdGxlXSA9IGhlYWRlci50aXRsZTtcbiAgICAgIHJldHVybiB2YWx1ZXNNYXA7XG4gICAgfSwge30pO1xuICB9XG5cbiAgcmV0dXJuIChoZWFkZXJzIHx8IFtdKS5yZWR1Y2UoKHZhbHVlc01hcCwgaGVhZGVyKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9IGlzUm93cyA/IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKSA6IHNvcnRUYXJnZXRJbmRleGVzO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBpc1Jvd3MgPyBzb3J0VGFyZ2V0SW5kZXhlcyA6IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIoaGVhZGVyKTtcbiAgICB2YWx1ZXNNYXBbaGVhZGVyLnRpdGxlXSA9IGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlcywgcm93cywgY29sdW1ucyk7XG4gICAgcmV0dXJuIHZhbHVlc01hcDtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBnZXROdW1lcmljVmFsdWVzU3VtbWFyeSh2YWx1ZXM6IGFueVtdW10sIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IG51bWJlciB7XG4gIGxldCBzdW0gPSAwO1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSAmJiBpc051bWVyaWModmFsdWUpKSB7XG4gICAgICAgIHN1bSArPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW07XG59XG5cbmZ1bmN0aW9uIHNvcnRWYWx1ZVRhcmdldEluZGV4ZXMoXG4gIHNvcnQ6IExtclBpdm90U29ydCxcbiAgb3RoZXJTaWRlSGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHZhbHVlVGl0bGVzOiBzdHJpbmdbXVxuKTogbnVtYmVyW10gfCBudWxsIHtcbiAgaWYgKHNvcnQgJiYgc29ydC5saXN0KSB7XG4gICAgbGV0IHZhbHVlSW5kZXggPSB2YWx1ZVRpdGxlcy5maW5kSW5kZXgodGl0bGUgPT4gdGl0bGUgPT09IHNvcnQubGlzdC52YWx1ZVRpdGxlKTtcbiAgICBpZiAodmFsdWVJbmRleCA9PT0gLTEpIHtcbiAgICAgIGlmICh2YWx1ZVRpdGxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFsdWVJbmRleCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcGl2b3RIZWFkZXI6IExtclBpdm90RGF0YUhlYWRlciA9IG51bGw7XG4gICAgbGV0IGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzID0gb3RoZXJTaWRlSGVhZGVycztcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvcnQubGlzdC52YWx1ZXMgfHwgW10pIHtcbiAgICAgIGlmICh2YWx1ZS5pc1N1bW1hcnkpIHtcbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzIHx8IFtdKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGZpbHRlckluZGV4ZXNCeU1vZChpbmRleGVzLCB2YWx1ZVRpdGxlcy5sZW5ndGgsIHZhbHVlSW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBwaXZvdEhlYWRlciA9IChjdXJyZW50T3RoZXJTaWRlSGVhZGVycyB8fCBbXSkuZmluZChoZWFkZXIgPT4gaGVhZGVyLnRpdGxlID09PSB2YWx1ZS50aXRsZSk7XG4gICAgICBpZiAoIXBpdm90SGVhZGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50T3RoZXJTaWRlSGVhZGVycyA9IHBpdm90SGVhZGVyLmNoaWxkcmVuIHx8IFtdO1xuICAgIH1cblxuICAgIGlmIChwaXZvdEhlYWRlcikge1xuICAgICAgY29uc3QgdGFyZ2V0SW5kZXhlcyA9IGlzTm90TnVsbE9yVW5kZWZpbmVkKHBpdm90SGVhZGVyLnRhcmdldEluZGV4KVxuICAgICAgICA/IFtwaXZvdEhlYWRlci50YXJnZXRJbmRleF1cbiAgICAgICAgOiBnZXRUYXJnZXRJbmRleGVzRm9ySGVhZGVycyhjdXJyZW50T3RoZXJTaWRlSGVhZGVycyk7XG4gICAgICByZXR1cm4gZmlsdGVySW5kZXhlc0J5TW9kKHRhcmdldEluZGV4ZXMsIHZhbHVlVGl0bGVzLmxlbmd0aCwgdmFsdWVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckluZGV4ZXNCeU1vZChpbmRleGVzOiBudW1iZXJbXSwgbW9kOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiAoaW5kZXhlcyB8fCBbXSkuZmlsdGVyKGluZGV4ID0+IGluZGV4ICUgbW9kID09PSB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGRpdmlkZVZhbHVlcyh2YWx1ZTogYW55LCBkaXZpZGVyOiBhbnkpOiBudW1iZXIge1xuICBpZiAoaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoaXNOdW1lcmljKHZhbHVlKSAmJiBpc051bWVyaWMoZGl2aWRlcikpIHtcbiAgICBpZiAoZGl2aWRlciAhPT0gMCkge1xuICAgICAgcmV0dXJuIHZhbHVlIC8gZGl2aWRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXX0=
997
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3QtdGFibGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbG1yLXBpdm90LXRhYmxlL3NyYy9saWIvdXRpbC9waXZvdC10YWJsZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsT0FBTyxFQUFDLG1CQUFtQixFQUE4QixtQkFBbUIsRUFBZ0Isa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEdBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4TSxPQUFPLEVBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxHQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTVKLE9BQU8sRUFBOEYsaUJBQWlCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNsSixPQUFPLEVBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBZ0JoSCxNQUFNLE9BQU8sbUJBQW1CO0lBQ3ZCLE1BQU0sQ0FBVSxVQUFVLEdBQUcsa0JBQWtCLENBQUM7SUFDaEQsTUFBTSxDQUFVLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztJQUM5QyxNQUFNLENBQVUsY0FBYyxHQUFHLHVCQUF1QixDQUFDO0lBQ3pELE1BQU0sQ0FBVSxjQUFjLEdBQUcsdUJBQXVCLENBQUM7SUFDekQsTUFBTSxDQUFVLG1CQUFtQixHQUFHLDZCQUE2QixDQUFDO0lBQ3BFLE1BQU0sQ0FBVSx1QkFBdUIsR0FBRyxpQ0FBaUMsQ0FBQztJQUM1RSxNQUFNLENBQVUsaUJBQWlCLEdBQUcsMEJBQTBCLENBQUM7SUFDL0QsTUFBTSxDQUFVLHNCQUFzQixHQUFHLGdDQUFnQyxDQUFD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a0IsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztTQUMxRTtLQUNGO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ3ZFLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBVSxFQUFFLE9BQVk7SUFDNUMsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM1QixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzFDLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtZQUNqQixPQUFPLEtBQUssR0FBRyxPQUFPLENBQUM7U0FDeEI7YUFBTTtZQUNMLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBMdW1lZXI6IE1vZGVybiBEYXRhIERlZmluaXRpb24gYW5kIFByb2Nlc3NpbmcgUGxhdGZvcm1cbiAqXG4gKiBDb3B5cmlnaHQgKEMpIHNpbmNlIDIwMTcgTHVtZWVyLmlvLCBzLnIuby4gYW5kL29yIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cbmltcG9ydCB7YWdncmVnYXRlRGF0YVZhbHVlcywgQ29uc3RyYWludCwgQ29uc3RyYWludERhdGEsIERhdGFBZ2dyZWdhdGlvblR5cGUsIERhdGFSZXNvdXJjZSwgaXNWYWx1ZUFnZ3JlZ2F0aW9uLCBOdW1iZXJDb25zdHJhaW50LCBQZXJjZW50YWdlQ29uc3RyYWludCwgVW5rbm93bkNvbnN0cmFpbnQsfSBmcm9tICdAbHVtZWVyL2RhdGEtZmlsdGVycyc7XG5pbXBvcnQge2NyZWF0ZVJhbmdlLCBkZWVwT2JqZWN0Q29weSwgaXNBcnJheSwgaXNOb3ROdWxsT3JVbmRlZmluZWQsIGlzTnVsbE9yVW5kZWZpbmVkLCBpc051bWVyaWMsIHNoYWRlQ29sb3IsIHRvTnVtYmVyLCB1bmlxdWVWYWx1ZXMsfSBmcm9tICdAbHVtZWVyL3V0aWxzJztcblxuaW1wb3J0IHtMbXJQaXZvdERhdGEsIExtclBpdm90RGF0YUhlYWRlciwgTG1yUGl2b3REYXRhSGVhZGVyRXhwcmVzc2lvbiwgTG1yUGl2b3REYXRhSGVhZGVyT3BlcmFuZCwgTG1yUGl2b3REaW1lbnNpb25Db25maWcsIExtclBpdm90U3RlbURhdGF9IGZyb20gJy4vbG1yLXBpdm90LWRhdGEnO1xuaW1wb3J0IHtMbXJQaXZvdFRhYmxlLCBMbXJQaXZvdFRhYmxlQ2VsbH0gZnJvbSAnLi9sbXItcGl2b3QtdGFibGUnO1xuaW1wb3J0IHtMbXJQaXZvdEV4cHJlc3Npb24sIExtclBpdm90SGVhZGVyT3BlcmFuZCwgTG1yUGl2b3RPcGVyYW5kLCBMbXJQaXZvdFNvcnQsIExtclBpdm90VHJhbnNmb3JtLCBMbXJQaXZvdFZhbHVlVHlwZX0gZnJvbSAnLi9sbXItcGl2b3QtY29uZmlnJztcbmltcG9ydCB7Q09MT1JfR1JBWTEwMCwgQ09MT1JfR1JBWTIwMCwgQ09MT1JfR1JBWTMwMCwgQ09MT1JfR1JBWTQwMCwgQ09MT1JfR1JBWTUwMH0gZnJvbSAnLi9sbXItcGl2b3QtY29uc3RhbnRzJztcblxuaW50ZXJmYWNlIEhlYWRlckdyb3VwSW5mbyB7XG4gIGJhY2tncm91bmQ6IHN0cmluZztcbiAgaW5kZXhlczogbnVtYmVyW107XG4gIGV4cHJlc3Npb24/OiBMbXJQaXZvdERhdGFIZWFkZXJFeHByZXNzaW9uO1xuICBsZXZlbDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVmFsdWVUeXBlSW5mbyB7XG4gIHN1bT86IG51bWJlcjtcbiAgc3Vtc1Jvd3M/OiBudW1iZXJbXTtcbiAgc3Vtc0NvbHVtbnM/OiBudW1iZXJbXTtcbiAgZGVmYXVsdENvbnN0cmFpbnQ/OiBDb25zdHJhaW50O1xufVxuXG5leHBvcnQgY2xhc3MgUGl2b3RUYWJsZUNvbnZlcnRlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZW1wdHlDbGFzcyA9ICdwaXZvdC1lbXB0eS1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBkYXRhQ2xhc3MgPSAncGl2b3QtZGF0YS1jZWxsJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBncm91cERhdGFDbGFzcyA9ICdwaXZvdC1kYXRhLWdyb3VwLWNlbGwnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHJvd0hlYWRlckNsYXNzID0gJ3Bpdm90LXJvdy1oZWFkZXItY2VsbCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcm93R3JvdXBIZWFkZXJDbGFzcyA9ICdwaXZvdC1yb3ctZ3JvdXAtaGVhZGVyLWNlbGwnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHJvd0F0dHJpYnV0ZUhlYWRlckNsYXNzID0gJ3Bpdm90LXJvdy1hdHRyaWJ1dGUtaGVhZGVyLWNlbGwnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNvbHVtbkhlYWRlckNsYXNzID0gJ3Bpdm90LWNvbHVtbi1oZWFkZXItY2VsbCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29sdW1uR3JvdXBIZWFkZXJDbGFzcyA9ICdwaXZvdC1jb2x1bW4tZ3JvdXAtaGVhZGVyLWNlbGwnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBDb2xvcnMgPSBbQ09MT1JfR1JBWTEwMCwgQ09MT1JfR1JBWTIwMCwgQ09MT1JfR1JBWTMwMCwgQ09MT1JfR1JBWTQwMCwgQ09MT1JfR1JBWTUwMF07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwZXJjZW50YWdlQ29uc3RyYWludCA9IG5ldyBQZXJjZW50YWdlQ29uc3RyYWludCh7ZGVjaW1hbHM6IDJ9KTtcblxuICBwcml2YXRlIGRhdGE6IExtclBpdm90U3RlbURhdGE7XG4gIHByaXZhdGUgdHJhbnNmb3JtOiBMbXJQaXZvdFRyYW5zZm9ybTtcbiAgcHJpdmF0ZSB2YWx1ZXM6IGFueVtdW107XG4gIHByaXZhdGUgZGF0YVJlc291cmNlczogRGF0YVJlc291cmNlW11bXVtdO1xuICBwcml2YXRlIGNvbnN0cmFpbnREYXRhOiBDb25zdHJhaW50RGF0YTtcbiAgcHJpdmF0ZSByb3dMZXZlbHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByb3dzVHJhbnNmb3JtYXRpb25BcnJheTogbnVtYmVyW107XG4gIHByaXZhdGUgY29sdW1uTGV2ZWxzOiBudW1iZXI7XG4gIHByaXZhdGUgY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXk6IG51bWJlcltdO1xuICBwcml2YXRlIHZhbHVlVHlwZUluZm86IFZhbHVlVHlwZUluZm9bXTtcbiAgcHJpdmF0ZSBub25TdGlja3lSb3dJbmRleDogbnVtYmVyO1xuICBwcml2YXRlIG5vblN0aWNreUNvbHVtbkluZGV4OiBudW1iZXI7XG5cbiAgcHVibGljIGNyZWF0ZVRhYmxlcyhwaXZvdERhdGE6IExtclBpdm90RGF0YSwgdHJhbnNmb3JtOiBMbXJQaXZvdFRyYW5zZm9ybSk6IExtclBpdm90VGFibGVbXSB7XG4gICAgaWYgKCFwaXZvdERhdGEpIHtcbiAgICAgIHJldHVybiBbe2NlbGxzOiBbXX1dO1xuICAgIH1cblxuICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIHRoaXMuY29uc3RyYWludERhdGEgPSBwaXZvdERhdGEuY29uc3RyYWludERhdGE7XG5cbiAgICByZXR1cm4gKHBpdm90RGF0YS5kYXRhIHx8IFtdKS5tYXAoZCA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhQXJlRW1wdHkoZCkpIHtcbiAgICAgICAgcmV0dXJuIHtjZWxsczogW119O1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVEYXRhKGQpO1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRGF0YSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkYXRhQXJlRW1wdHkoZGF0YTogTG1yUGl2b3RTdGVtRGF0YSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoZGF0YS5yb3dIZWFkZXJzIHx8IFtdKS5sZW5ndGggPT09IDAgJiYgKGRhdGEuY29sdW1uSGVhZGVycyB8fCBbXSkubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhKGRhdGE6IExtclBpdm90U3RlbURhdGEpIHtcbiAgICBjb25zdCBudW1iZXJPZlN1bXMgPSBNYXRoLm1heCgxLCAoZGF0YS52YWx1ZVRpdGxlcyB8fCBbXSkubGVuZ3RoKTtcbiAgICB0aGlzLnZhbHVlVHlwZUluZm8gPSBnZXRWYWx1ZXNUeXBlSW5mbyhkYXRhLnZhbHVlcywgZGF0YS52YWx1ZVR5cGVzLCBudW1iZXJPZlN1bXMpO1xuICAgIHRoaXMuZGF0YSA9IHByZXBhcmVQaXZvdERhdGEoZGF0YSwgdGhpcy5jb25zdHJhaW50RGF0YSwgdGhpcy52YWx1ZVR5cGVJbmZvKTtcbiAgICB0aGlzLnZhbHVlcyA9IGRhdGEudmFsdWVzIHx8IFtdO1xuICAgIHRoaXMuZGF0YVJlc291cmNlcyA9IGRhdGEuZGF0YVJlc291cmNlcyB8fCBbXTtcbiAgICB0aGlzLnJvd0xldmVscyA9IChkYXRhLnJvd3NDb25maWcgfHwgW10pLmxlbmd0aDtcbiAgICB0aGlzLmNvbHVtbkxldmVscyA9IChkYXRhLmNvbHVtbnNDb25maWcgfHwgW10pLmxlbmd0aCArIChkYXRhLmhhc0FkZGl0aW9uYWxDb2x1bW5MZXZlbCA/IDEgOiAwKTtcbiAgICBjb25zdCByb3dBbGxTdGlja3kgPSB0aGlzLmRhdGEucm93c0NvbmZpZz8ubGVuZ3RoICYmIHRoaXMuZGF0YS5yb3dzQ29uZmlnLmV2ZXJ5KGNvbmZpZyA9PiAhIWNvbmZpZz8uc3RpY2t5KVxuICAgIHRoaXMubm9uU3RpY2t5Um93SW5kZXggPSBNYXRoLm1heChyb3dBbGxTdGlja3kgPyB0aGlzLnJvd0xldmVscyA6ICh0aGlzLmRhdGEucm93c0NvbmZpZz8uZmluZEluZGV4KGNvbmZpZyA9PiAhY29uZmlnPy5zdGlja3kpIHx8IDApLCAwKTtcbiAgICBjb25zdCBjb2x1bW5BbGxTdGlja3kgPSB0aGlzLmRhdGEuY29sdW1uc0NvbmZpZz8ubGVuZ3RoICYmIHRoaXMuZGF0YS5jb2x1bW5zQ29uZmlnLmV2ZXJ5KGNvbmZpZyA9PiAhIWNvbmZpZz8uc3RpY2t5KVxuICAgIHRoaXMubm9uU3RpY2t5Q29sdW1uSW5kZXggPSBNYXRoLm1heChjb2x1bW5BbGxTdGlja3kgPyB0aGlzLmNvbHVtbkxldmVscyA6ICh0aGlzLmRhdGEuY29sdW1uc0NvbmZpZz8uZmluZEluZGV4KGNvbmZpZyA9PiAhY29uZmlnPy5zdGlja3kpIHx8IDApLCAwKTtcbiAgICBjb25zdCBoYXNWYWx1ZSA9IChkYXRhLnZhbHVlVGl0bGVzIHx8IFtdKS5sZW5ndGggPiAwO1xuICAgIGlmICgodGhpcy5kYXRhLnJvd0hlYWRlcnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkgPSBjcmVhdGVUcmFuc2Zvcm1hdGlvbk1hcChcbiAgICAgICAgdGhpcy5kYXRhLnJvd0hlYWRlcnMsXG4gICAgICAgIHRoaXMucm93U2hvd1N1bXMsXG4gICAgICAgIHRoaXMuY29sdW1uTGV2ZWxzLFxuICAgICAgICAxXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5ID0gaGFzVmFsdWUgPyBbdGhpcy5jb2x1bW5MZXZlbHNdIDogW107XG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLmRhdGEuY29sdW1uSGVhZGVycyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheSA9IGNyZWF0ZVRyYW5zZm9ybWF0aW9uTWFwKFxuICAgICAgICB0aGlzLmRhdGEuY29sdW1uSGVhZGVycyxcbiAgICAgICAgdGhpcy5jb2x1bW5TaG93U3VtcyxcbiAgICAgICAgdGhpcy5yb3dMZXZlbHMsXG4gICAgICAgIG51bWJlck9mU3Vtc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheSA9IGhhc1ZhbHVlID8gW3RoaXMucm93TGV2ZWxzXSA6IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHJvd1Nob3dTdW1zKCk6IGJvb2xlYW5bXSB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGEucm93c0NvbmZpZyB8fCBbXSkubWFwKGNvbmZpZyA9PiBjb25maWcuc2hvd1N1bXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29sdW1uU2hvd1N1bXMoKTogYm9vbGVhbltdIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YS5jb2x1bW5zQ29uZmlnIHx8IFtdKS5tYXAoY29uZmlnID0+IGNvbmZpZy5zaG93U3Vtcyk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybURhdGEoKTogTG1yUGl2b3RUYWJsZSB7XG4gICAgY29uc3QgY2VsbHMgPSB0aGlzLmluaXRDZWxscygpO1xuICAgIGNvbnN0IHJvd0dyb3VwcyA9IHRoaXMuZmlsbENlbGxzQnlSb3dzKGNlbGxzKTtcbiAgICBjb25zdCBjb2x1bW5Hcm91cHMgPSB0aGlzLmZpbGxDZWxsc0J5Q29sdW1ucyhjZWxscyk7XG4gICAgdGhpcy5maWxsQ2VsbHNCeUdyb3VwSW50ZXJzZWN0aW9uKGNlbGxzLCByb3dHcm91cHMsIGNvbHVtbkdyb3Vwcyk7XG4gICAgcmV0dXJuIHtjZWxsc307XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0J5Um93cyhjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdKTogSGVhZGVyR3JvdXBJbmZvW10ge1xuICAgIGNvbnN0IHJvd0dyb3VwcyA9IFtdO1xuICAgIHRoaXMuaXRlcmF0ZUFuZEZpbGxDZWxsc0J5Um93cyhjZWxscywgcm93R3JvdXBzLCB0aGlzLmRhdGEucm93SGVhZGVycywgdGhpcy5jb2x1bW5MZXZlbHMsIHRoaXMucm93U2hvd1N1bXMsIDApO1xuICAgIHJldHVybiByb3dHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGl0ZXJhdGVBbmRGaWxsQ2VsbHNCeVJvd3MoXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICByb3dHcm91cHNJbmZvOiBIZWFkZXJHcm91cEluZm9bXSxcbiAgICBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgc2hvd1N1bXM6IGJvb2xlYW5bXSxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIHBhcmVudEhlYWRlcj86IExtclBpdm90RGF0YUhlYWRlclxuICApIHtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiBoZWFkZXJzKSB7XG4gICAgICBjb25zdCByb3dTcGFuID0gZ2V0RGlyZWN0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsLCBzaG93U3Vtcyk7XG4gICAgICBjZWxsc1tjdXJyZW50SW5kZXhdW2xldmVsXSA9IHtcbiAgICAgICAgdmFsdWU6IHRoaXMuZm9ybWF0Um93SGVhZGVyKGhlYWRlci50aXRsZSwgbGV2ZWwpLFxuICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5yb3dIZWFkZXJDbGFzcyxcbiAgICAgICAgaXNIZWFkZXI6IHRydWUsXG4gICAgICAgIHN0aWNreVN0YXJ0OiB0aGlzLmlzUm93TGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICByb3dTcGFuLFxuICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0aGlzLmdldEhlYWRlckJhY2tncm91bmQoaGVhZGVyLCBsZXZlbCksXG4gICAgICAgIGNvbnN0cmFpbnQ6IGhlYWRlci5jb25zdHJhaW50LFxuICAgICAgICBsYWJlbDogaGVhZGVyLmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgIGNoaWxkSW5kZXhlczogY3JlYXRlUmFuZ2UoY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXggKyAoaGVhZGVyLmNoaWxkcmVuPy5sZW5ndGggfHwgMSkpXG4gICAgICB9O1xuXG4gICAgICBpZiAoaGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0ZUFuZEZpbGxDZWxsc0J5Um93cyhcbiAgICAgICAgICBjZWxscyxcbiAgICAgICAgICByb3dHcm91cHNJbmZvLFxuICAgICAgICAgIGhlYWRlci5jaGlsZHJlbixcbiAgICAgICAgICBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgc2hvd1N1bXMsXG4gICAgICAgICAgbGV2ZWwgKyAxLFxuICAgICAgICAgIGhlYWRlclxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpc05vdE51bGxPclVuZGVmaW5lZChoZWFkZXIudGFyZ2V0SW5kZXgpKSB7XG4gICAgICAgIHRoaXMuZmlsbENlbGxzRm9yUm93KGNlbGxzLCBoZWFkZXIudGFyZ2V0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50SW5kZXggKz0gZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsLCBzaG93U3Vtcyk7XG5cbiAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gaGVhZGVyLmV4cHJlc3Npb25zIHx8IFtdXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25JbmRleCA9IGN1cnJlbnRJbmRleCAtIChleHByZXNzaW9ucy5sZW5ndGggLSBpKVxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5nZXRTdW1tYXJ5QmFja2dyb3VuZChsZXZlbCk7XG4gICAgICAgIGNvbnN0IHtpbmRleGVzfSA9IHRoaXMuZmlsbENlbGxzRm9yRXhwcmVzc2lvblJvdyhjZWxscywgZXhwcmVzc2lvbnNbaV0sIGV4cHJlc3Npb25JbmRleCwgYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy5zcGxpdFJvd0dyb3VwSGVhZGVyKGNlbGxzLCBsZXZlbCwgZXhwcmVzc2lvbkluZGV4LCBiYWNrZ3JvdW5kLCBleHByZXNzaW9uc1tpXS50aXRsZSwgaW5kZXhlcylcbiAgICAgICAgcm93R3JvdXBzSW5mb1tleHByZXNzaW9uSW5kZXhdID0ge2JhY2tncm91bmQsIGluZGV4ZXM6IFtdLCBleHByZXNzaW9uOiBleHByZXNzaW9uc1tpXSwgbGV2ZWx9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93U3Vtc1tsZXZlbF0pIHtcbiAgICAgIGNvbnN0IHsgdGl0bGUsIHN1bW1hcnkgfSA9IHRoaXMuZm9ybWF0U3VtbWFyeUhlYWRlcihwYXJlbnRIZWFkZXIsIGxldmVsKVxuICAgICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMuZ2V0U3VtbWFyeUJhY2tncm91bmQobGV2ZWwpO1xuICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBNYXRoLm1heChsZXZlbCAtIDEsIDApO1xuICAgICAgdGhpcy5zcGxpdFJvd0dyb3VwSGVhZGVyKGNlbGxzLCBjb2x1bW5JbmRleCwgY3VycmVudEluZGV4LCBiYWNrZ3JvdW5kLCBzdW1tYXJ5LCBbXSwgdGl0bGUsIHBhcmVudEhlYWRlcj8uY29uc3RyYWludCwgcGFyZW50SGVhZGVyPy5hdHRyaWJ1dGVOYW1lKVxuXG4gICAgICBjb25zdCByb3dJbmRleGVzID0gZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcnMoaGVhZGVycyk7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZFJvd0luZGV4ZXMgPSB0aGlzLnRyYW5zZm9ybVJvd0luZGV4ZXMocm93SW5kZXhlcyk7XG4gICAgICByb3dHcm91cHNJbmZvW2N1cnJlbnRJbmRleF0gPSB7YmFja2dyb3VuZCwgaW5kZXhlczogdHJhbnNmb3JtZWRSb3dJbmRleGVzLCBsZXZlbH07XG5cbiAgICAgIHRoaXMuZmlsbENlbGxzRm9yR3JvdXBlZFJvdyhjZWxscywgcm93SW5kZXhlcywgY3VycmVudEluZGV4LCBiYWNrZ3JvdW5kKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNwbGl0Um93R3JvdXBIZWFkZXIoY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSwgY29sdW1uSW5kZXg6IG51bWJlciwgY3VycmVudEluZGV4OiBudW1iZXIsIGJhY2tncm91bmQ6IHN0cmluZywgc3VtbWFyeTogc3RyaW5nLCByb3dJbmRleGVzOiBudW1iZXJbXSwgdGl0bGU/OiBzdHJpbmcsIGNvbnN0cmFpbnQ/OiBDb25zdHJhaW50LCBsYWJlbD86IHN0cmluZykge1xuICAgIGxldCBjb2xTcGFuID0gdGhpcy5yb3dMZXZlbHMgLSBjb2x1bW5JbmRleDtcbiAgICBjb25zdCBzdGlja3lTdGFydCA9IHRoaXMuaXNSb3dMZXZlbFN0aWNreShjb2x1bW5JbmRleCk7XG5cbiAgICAvLyBzcGxpdCByb3cgZ3JvdXAgaGVhZGVyIGNlbGwgYmVjYXVzZSBvZiBjb3JyZWN0IHN0aWNreSBzY3JvbGxcbiAgICBpZiAoc3RpY2t5U3RhcnQgJiYgdGhpcy5ub25TdGlja3lSb3dJbmRleCA+IDAgJiYgdGhpcy5ub25TdGlja3lSb3dJbmRleCA8IHRoaXMucm93TGV2ZWxzICYmIGNvbFNwYW4gPiAxKSB7XG4gICAgICBjb25zdCBuZXdDb2xzcGFuID0gdGhpcy5ub25TdGlja3lSb3dJbmRleCAtIGNvbHVtbkluZGV4O1xuXG4gICAgICBjZWxsc1tjdXJyZW50SW5kZXhdW3RoaXMubm9uU3RpY2t5Um93SW5kZXhdID0ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBjb25zdHJhaW50OiB1bmRlZmluZWQsXG4gICAgICAgIGxhYmVsOiB1bmRlZmluZWQsXG4gICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLnJvd0dyb3VwSGVhZGVyQ2xhc3MsXG4gICAgICAgIGlzU3VtbWFyeTogdHJ1ZSxcbiAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgY29sU3BhbjogY29sU3BhbiAtIG5ld0NvbHNwYW4sXG4gICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIHN1bW1hcnk6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbFNwYW4gPSBuZXdDb2xzcGFuO1xuICAgIH1cblxuICAgIGNlbGxzW2N1cnJlbnRJbmRleF1bY29sdW1uSW5kZXhdID0ge1xuICAgICAgdmFsdWU6IHRpdGxlLFxuICAgICAgY29uc3RyYWludCxcbiAgICAgIGxhYmVsLFxuICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIucm93R3JvdXBIZWFkZXJDbGFzcyxcbiAgICAgIGlzU3VtbWFyeTogdHJ1ZSxcbiAgICAgIHN0aWNreVN0YXJ0LFxuICAgICAgcm93U3BhbjogMSxcbiAgICAgIGNvbFNwYW4sXG4gICAgICBiYWNrZ3JvdW5kLFxuICAgICAgc3VtbWFyeSxcbiAgICAgIHJvd0luZGV4ZXMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0U3VtbWFyeUhlYWRlcihoZWFkZXI6IExtclBpdm90RGF0YUhlYWRlciwgbGV2ZWw6IG51bWJlcik6IHt0aXRsZT86IHN0cmluZzsgc3VtbWFyeTogc3RyaW5nfSB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmZvcm1hdFN1bW1hcnlIZWFkZXI/LihoZWFkZXIsIGxldmVsKSB8fCB7XG4gICAgICB0aXRsZTogaGVhZGVyPy50aXRsZSxcbiAgICAgIHN1bW1hcnk6ICcnLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Um93SGVhZGVyKHRpdGxlOiBzdHJpbmcsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybT8uZm9ybWF0Um93SGVhZGVyPy4odGl0bGUsIGxldmVsKSB8fCB0aXRsZVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb2x1bW5IZWFkZXIodGl0bGU6IHN0cmluZywgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtPy5mb3JtYXRDb2x1bW5IZWFkZXI/Lih0aXRsZSwgbGV2ZWwpIHx8IHRpdGxlXG4gIH1cblxuICBwcml2YXRlIGdldEhlYWRlckJhY2tncm91bmQoaGVhZGVyOiB7IGNvbG9yOiBzdHJpbmcgfSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGhlYWRlcj8uY29sb3IpIHtcbiAgICAgIHJldHVybiBzaGFkZUNvbG9yKGhlYWRlci5jb2xvciwgdGhpcy5nZXRMZXZlbE9wYWNpdHkobGV2ZWwpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZXZlbE9wYWNpdHkobGV2ZWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWluKDgwLCA1MCArIGxldmVsICogNSkgLyAxMDA7XG4gIH1cblxuICBwcml2YXRlIGlzUm93TGV2ZWxTdGlja3kobGV2ZWw6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGE/LnJvd3NDb25maWc/LltsZXZlbF0/LnN0aWNreTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDb2x1bW5MZXZlbFN0aWNreShsZXZlbDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWF4TGV2ZWwgPSBNYXRoLm1pbihsZXZlbCwgKHRoaXMuZGF0YT8uY29sdW1uc0NvbmZpZz8ubGVuZ3RoID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSAtIDEpO1xuICAgIHJldHVybiB0aGlzLmRhdGE/LmNvbHVtbnNDb25maWc/LlttYXhMZXZlbF0/LnN0aWNreTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VtbWFyeUJhY2tncm91bmQobGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLm1pbihsZXZlbCwgdGhpcy5ncm91cENvbG9ycy5sZW5ndGggLSAxKTtcbiAgICByZXR1cm4gdGhpcy5ncm91cENvbG9yc1tpbmRleF07XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0ZvclJvdyhjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLCByb3c6IG51bWJlcikge1xuICAgIGNvbnN0IHJvd0luZGV4SW5DZWxscyA9IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXlbcm93XTtcbiAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQocm93SW5kZXhJbkNlbGxzKSkge1xuICAgICAgZm9yIChsZXQgY29sdW1uID0gMDsgY29sdW1uIDwgdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheS5sZW5ndGg7IGNvbHVtbisrKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkluZGV4SW5DZWxscyA9IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbY29sdW1uXTtcbiAgICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS52YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgICAgIGNvbnN0IGRhdGFSZXNvdXJjZXMgPSB0aGlzLmRhdGFSZXNvdXJjZXM/Lltyb3ddPy5bY29sdW1uXSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuYWdncmVnYXRlT3JGb3JtYXRTaW5nbGVWYWx1ZSh2YWx1ZSwgY29sdW1uKTtcbiAgICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IGlzTm90TnVsbE9yVW5kZWZpbmVkKGZvcm1hdHRlZFZhbHVlKSA/IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSkgOiAnJztcbiAgICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogc3RyaW5nVmFsdWUsXG4gICAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5kYXRhQ2xhc3MsXG4gICAgICAgICAgICBpc1ZhbHVlOiB0cnVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFZhbHVlSW5kZXhGb3JDb2x1bW5zKGNvbHVtbnM6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29sdW1uc1swXSAlIHRoaXMuZGF0YS52YWx1ZVRpdGxlcy5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFZhbHVlQnlWYWx1ZVR5cGUodmFsdWU6IGFueSwgdmFsdWVJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSAodGhpcy5kYXRhLnZhbHVlVHlwZXMgfHwgW10pW3ZhbHVlSW5kZXhdO1xuICAgIGlmICghdmFsdWVUeXBlIHx8IHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuRGVmYXVsdCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeUNvbnN0cmFpbnQodmFsdWUsIHZhbHVlSW5kZXgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIFtMbXJQaXZvdFZhbHVlVHlwZS5BbGxQZXJjZW50YWdlLCBMbXJQaXZvdFZhbHVlVHlwZS5Db2x1bW5QZXJjZW50YWdlLCBMbXJQaXZvdFZhbHVlVHlwZS5Sb3dQZXJjZW50YWdlXS5pbmNsdWRlcyh2YWx1ZVR5cGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5UGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeUNvbnN0cmFpbnQodmFsdWUsIHZhbHVlSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRHcm91cGVkVmFsdWVCeVZhbHVlVHlwZSh2YWx1ZTogYW55LCByb3dzOiBudW1iZXJbXSwgY29sdW1uczogbnVtYmVyW10pOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlSW5kZXggPSBjb2x1bW5zWzBdICUgdGhpcy5kYXRhLnZhbHVlVGl0bGVzLmxlbmd0aDtcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLmRhdGEudmFsdWVUeXBlcyAmJiB0aGlzLmRhdGEudmFsdWVUeXBlc1t2YWx1ZUluZGV4XTtcbiAgICBjb25zdCB2YWx1ZVR5cGVJbmZvID0gdGhpcy52YWx1ZVR5cGVJbmZvW3ZhbHVlSW5kZXhdO1xuICAgIGlmICghdmFsdWVUeXBlSW5mbyB8fCAhdmFsdWVUeXBlIHx8IHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuRGVmYXVsdCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeUNvbnN0cmFpbnQodmFsdWUsIHZhbHVlSW5kZXgpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZVR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLkFsbFBlcmNlbnRhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFZhbHVlQnlQZXJjZW50YWdlKGRpdmlkZVZhbHVlcyh2YWx1ZSwgdmFsdWVUeXBlSW5mby5zdW0pKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQ29sdW1uUGVyY2VudGFnZSkge1xuICAgICAgY29uc3QgY29sdW1uc0RpdmlkZXJzID0gY29sdW1ucy5yZWR1Y2UoKGRpdmlkZXJzLCBjb2x1bW4pID0+IHtcbiAgICAgICAgZGl2aWRlcnMucHVzaCh2YWx1ZVR5cGVJbmZvLnN1bXNDb2x1bW5zW2NvbHVtbl0pO1xuICAgICAgICByZXR1cm4gZGl2aWRlcnM7XG4gICAgICB9LCBbXSk7XG4gICAgICBjb25zdCBjb2x1bW5zRGl2aWRlciA9IGFnZ3JlZ2F0ZURhdGFWYWx1ZXMoRGF0YUFnZ3JlZ2F0aW9uVHlwZS5TdW0sIGNvbHVtbnNEaXZpZGVycyk7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5UGVyY2VudGFnZShkaXZpZGVWYWx1ZXModmFsdWUsIGNvbHVtbnNEaXZpZGVyKSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLlJvd1BlcmNlbnRhZ2UpIHtcbiAgICAgIGNvbnN0IHJvd3NEaXZpZGVycyA9IHJvd3MucmVkdWNlKChkaXZpZGVycywgcm93KSA9PiB7XG4gICAgICAgIGRpdmlkZXJzLnB1c2godmFsdWVUeXBlSW5mby5zdW1zUm93c1tyb3ddKTtcbiAgICAgICAgcmV0dXJuIGRpdmlkZXJzO1xuICAgICAgfSwgW10pO1xuICAgICAgY29uc3Qgcm93c0RpdmlkZXIgPSBhZ2dyZWdhdGVEYXRhVmFsdWVzKERhdGFBZ2dyZWdhdGlvblR5cGUuU3VtLCByb3dzRGl2aWRlcnMpO1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0VmFsdWVCeVBlcmNlbnRhZ2UoZGl2aWRlVmFsdWVzKHZhbHVlLCByb3dzRGl2aWRlcikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZvcm1hdFZhbHVlQnlDb25zdHJhaW50KHZhbHVlLCB2YWx1ZUluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VmFsdWVCeVBlcmNlbnRhZ2UodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGVyY2VudGFnZUNvbnN0cmFpbnQuY3JlYXRlRGF0YVZhbHVlKHZhbHVlKS5mb3JtYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VmFsdWVCeUNvbnN0cmFpbnQodmFsdWU6IGFueSwgdmFsdWVJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBjb25zdHJhaW50ID0gdGhpcy5kYXRhLnZhbHVlc0NvbnN0cmFpbnRzPy5bdmFsdWVJbmRleF0gfHwgdGhpcy52YWx1ZVR5cGVJbmZvW3ZhbHVlSW5kZXhdPy5kZWZhdWx0Q29uc3RyYWludDtcbiAgICBpZiAoY29uc3RyYWludCkge1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbnQuY3JlYXRlRGF0YVZhbHVlKHZhbHVlLCB0aGlzLmNvbnN0cmFpbnREYXRhKS5wcmV2aWV3KCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsbENlbGxzRm9yR3JvdXBlZFJvdyhcbiAgICBjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLFxuICAgIHJvd3M6IG51bWJlcltdLFxuICAgIHJvd0luZGV4SW5DZWxsczogbnVtYmVyLFxuICAgIGJhY2tncm91bmQ6IHN0cmluZ1xuICApIHtcbiAgICBmb3IgKGxldCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB0aGlzLmNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5Lmxlbmd0aDsgY29sdW1uKyspIHtcbiAgICAgIGNvbnN0IGNvbHVtbkluZGV4SW5DZWxscyA9IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbY29sdW1uXTtcbiAgICAgIGlmIChpc05vdE51bGxPclVuZGVmaW5lZChjb2x1bW5JbmRleEluQ2VsbHMpKSB7XG4gICAgICAgIGNvbnN0IHt2YWx1ZXMsIGRhdGFSZXNvdXJjZXN9ID0gdGhpcy5nZXRHcm91cGVkVmFsdWVzRm9yUm93c0FuZENvbHMocm93cywgW2NvbHVtbl0pO1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuYWdncmVnYXRlQW5kRm9ybWF0RGF0YVZhbHVlcyh2YWx1ZXMsIHJvd3MsIFtjb2x1bW5dKTtcbiAgICAgICAgY2VsbHNbcm93SW5kZXhJbkNlbGxzXVtjb2x1bW5JbmRleEluQ2VsbHNdID0ge1xuICAgICAgICAgIHZhbHVlOiBTdHJpbmcoZm9ybWF0dGVkVmFsdWUpLFxuICAgICAgICAgIGRhdGFSZXNvdXJjZXMsXG4gICAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLmdyb3VwRGF0YUNsYXNzLFxuICAgICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgICAgaXNWYWx1ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0ZvckV4cHJlc3Npb25Sb3coXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICBleHByZXNzaW9uOiBMbXJQaXZvdERhdGFIZWFkZXJFeHByZXNzaW9uLFxuICAgIHJvd0luZGV4SW5DZWxsczogbnVtYmVyLFxuICAgIGJhY2tncm91bmQ6IHN0cmluZ1xuICApOntpbmRleGVzOiBudW1iZXJbXX0ge1xuICAgIGxldCByb3dJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyBjb2x1bW4rKykge1xuICAgICAgY29uc3QgY29sdW1uSW5kZXhJbkNlbGxzID0gdGhpcy5jb2x1bW5zVHJhbnNmb3JtYXRpb25BcnJheVtjb2x1bW5dO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlLCBkYXRhUmVzb3VyY2VzLCBpbmRleGVzfSA9IHRoaXMuZXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIFtjb2x1bW5dKTtcbiAgICAgICAgcm93SW5kZXhlcyA9IGluZGV4ZXNcbiAgICAgICAgY29uc3QgdmFsdWVJbmRleCA9IGNvbHVtbiAlIHRoaXMuZGF0YS52YWx1ZVRpdGxlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZUJ5Q29uc3RyYWludCh2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgICAgIGNlbGxzW3Jvd0luZGV4SW5DZWxsc11bY29sdW1uSW5kZXhJbkNlbGxzXSA9IHtcbiAgICAgICAgICB2YWx1ZTogU3RyaW5nKGZvcm1hdHRlZFZhbHVlKSxcbiAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5ncm91cERhdGFDbGFzcyxcbiAgICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICAgIGlzVmFsdWU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7aW5kZXhlczogdW5pcXVlVmFsdWVzKFsuLi5yb3dJbmRleGVzLCByb3dJbmRleEluQ2VsbHNdKX1cbiAgfVxuXG4gIHByaXZhdGUgZXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb246IExtclBpdm90RGF0YUhlYWRlckV4cHJlc3Npb24sIGNvbHVtbnM6IG51bWJlcltdKToge3ZhbHVlOiBudW1iZXI7IGRhdGFSZXNvdXJjZXM6IERhdGFSZXNvdXJjZVtdOyBpbmRleGVzOiBudW1iZXJbXSAgfSB7XG4gICAgcmV0dXJuIChleHByZXNzaW9uLm9wZXJhbmRzIHx8IFtdKS5yZWR1Y2UoKHJlc3VsdCwgb3BlcmFuZCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHt2YWx1ZSwgZGF0YVJlc291cmNlcywgaW5kZXhlcyB9ID0gdGhpcy5ldmFsdWF0ZU9wZXJhbmQob3BlcmFuZCwgY29sdW1ucylcbiAgICAgIHJlc3VsdC5kYXRhUmVzb3VyY2VzLnB1c2goLi4uZGF0YVJlc291cmNlcylcbiAgICAgIHJlc3VsdC5pbmRleGVzLnB1c2goLi4uaW5kZXhlcylcbiAgICAgIHN3aXRjaCAoZXhwcmVzc2lvbi5vcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSAnYWRkJzpcbiAgICAgICAgICByZXN1bHQudmFsdWUgKz0gdmFsdWVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3VidHJhY3QnOlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IChpbmRleCA9PT0gMCA/IHZhbHVlIDogcmVzdWx0LnZhbHVlIC0gdmFsdWUpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ211bHRpcGx5JzpcbiAgICAgICAgICByZXN1bHQudmFsdWUgPSBpbmRleCA9PT0gMCA/IHZhbHVlIDogcmVzdWx0LnZhbHVlICogdmFsdWVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGl2aWRlJzpcbiAgICAgICAgICByZXN1bHQudmFsdWUgPSBpbmRleCA9PT0gMCA/IHZhbHVlIDogdmFsdWUgPyByZXN1bHQudmFsdWUgLyB2YWx1ZSA6IHJlc3VsdC52YWx1ZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSAsIHt2YWx1ZTogMCwgZGF0YVJlc291cmNlczogW10sIGluZGV4ZXM6IFtdfSlcbiAgfVxuXG4gIHByaXZhdGUgZXZhbHVhdGVPcGVyYW5kKG9wZXJhbmQ6IExtclBpdm90RGF0YUhlYWRlck9wZXJhbmQsIGNvbHVtbnM6IG51bWJlcltdKToge3ZhbHVlOiBudW1iZXI7IGRhdGFSZXNvdXJjZXM6IERhdGFSZXNvdXJjZVtdOyBpbmRleGVzOiBudW1iZXJbXSB9IHtcbiAgICBzd2l0Y2ggKG9wZXJhbmQudHlwZSkge1xuICAgICAgY2FzZSAnZXhwcmVzc2lvbic6IHJldHVybiB0aGlzLmV2YWx1YXRlRXhwcmVzc2lvbihvcGVyYW5kLCBjb2x1bW5zKVxuICAgICAgY2FzZSAndmFsdWUnOiByZXR1cm4ge3ZhbHVlOiBvcGVyYW5kLnZhbHVlLCBkYXRhUmVzb3VyY2VzOiBbXSwgaW5kZXhlczogW119XG4gICAgICBjYXNlICdoZWFkZXInOiB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBnZXRUYXJnZXRJbmRleGVzRm9ySGVhZGVycyhvcGVyYW5kLmhlYWRlcnMpO1xuICAgICAgICBjb25zdCB7dmFsdWVzLCBkYXRhUmVzb3VyY2VzfSA9IHRoaXMuZ2V0R3JvdXBlZFZhbHVlc0ZvclJvd3NBbmRDb2xzKHJvd3MsIGNvbHVtbnMpO1xuICAgICAgICBjb25zdCB7dmFsdWV9ID0gdGhpcy5hZ2dyZWdhdGVEYXRhVmFsdWVzKHZhbHVlcywgY29sdW1ucyk7XG4gICAgICAgIHJldHVybiB7dmFsdWUsIGRhdGFSZXNvdXJjZXMsIGluZGV4ZXM6IHRoaXMudHJhbnNmb3JtUm93SW5kZXhlcyhyb3dzKX1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybVJvd0luZGV4ZXMocm93czogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHJvd3NcbiAgICAgIC5tYXAodiA9PiB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5W3ZdKVxuICAgICAgLmZpbHRlcih2ID0+IGlzTm90TnVsbE9yVW5kZWZpbmVkKHYpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JvdXBlZFZhbHVlc0ZvclJvd3NBbmRDb2xzKFxuICAgIHJvd3M6IG51bWJlcltdLFxuICAgIGNvbHVtbnM6IG51bWJlcltdXG4gICk6IHsgdmFsdWVzOiBhbnlbXTsgZGF0YVJlc291cmNlczogRGF0YVJlc291cmNlW10gfSB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgY29uc3QgZGF0YVJlc291cmNlcyA9IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3Qgcm93Q29sdW1uVmFsdWUgPSB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl07XG4gICAgICAgIGlmIChpc0FycmF5KHJvd0NvbHVtblZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKC4uLnJvd0NvbHVtblZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaChyb3dDb2x1bW5WYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVJlc291cmNlcy5wdXNoKC4uLih0aGlzLmRhdGFSZXNvdXJjZXM/Lltyb3ddPy5bY29sdW1uXSB8fCBbXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3ZhbHVlcywgZGF0YVJlc291cmNlc307XG4gIH1cblxuICBwcml2YXRlIGZpbGxDZWxsc0J5Q29sdW1ucyhjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdKTogSGVhZGVyR3JvdXBJbmZvW10ge1xuICAgIGNvbnN0IGNvbHVtbkdyb3VwcyA9IFtdO1xuICAgIHRoaXMuaXRlcmF0ZUFuZEZpbGxDZWxsc0J5Q29sdW1ucyhcbiAgICAgIGNlbGxzLFxuICAgICAgY29sdW1uR3JvdXBzLFxuICAgICAgdGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMsXG4gICAgICB0aGlzLnJvd0xldmVscyxcbiAgICAgIHRoaXMuY29sdW1uU2hvd1N1bXMsXG4gICAgICAwXG4gICAgKTtcbiAgICByZXR1cm4gY29sdW1uR3JvdXBzO1xuICB9XG5cbiAgcHJpdmF0ZSBpdGVyYXRlQW5kRmlsbENlbGxzQnlDb2x1bW5zKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgY29sdW1uR3JvdXBzSW5mbzogSGVhZGVyR3JvdXBJbmZvW10sXG4gICAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIHNob3dTdW1zOiBib29sZWFuW10sXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgICBwYXJlbnRIZWFkZXI/OiBMbXJQaXZvdERhdGFIZWFkZXJcbiAgKSB7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgY29uc3QgbnVtYmVyT2ZTdW1zID0gTWF0aC5tYXgoMSwgdGhpcy5kYXRhLnZhbHVlVGl0bGVzLmxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBoZWFkZXIgb2YgaGVhZGVycykge1xuICAgICAgY29uc3QgY29sU3BhbiA9IGdldERpcmVjdEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gICAgICBjZWxsc1tsZXZlbF1bY3VycmVudEluZGV4XSA9IHtcbiAgICAgICAgdmFsdWU6IHRoaXMuZm9ybWF0Q29sdW1uSGVhZGVyKGhlYWRlci50aXRsZSwgbGV2ZWwpLFxuICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5jb2x1bW5IZWFkZXJDbGFzcyxcbiAgICAgICAgaXNIZWFkZXI6IHRydWUsXG4gICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgIGNvbFNwYW4sXG4gICAgICAgIHN0aWNreVRvcDogdGhpcy5pc0NvbHVtbkxldmVsU3RpY2t5KGxldmVsKSxcbiAgICAgICAgYmFja2dyb3VuZDogdGhpcy5nZXRIZWFkZXJCYWNrZ3JvdW5kKGhlYWRlciwgbGV2ZWwpLFxuICAgICAgICBjb25zdHJhaW50OiBoZWFkZXIuY29uc3RyYWludCxcbiAgICAgICAgbGFiZWw6IGhlYWRlci5hdHRyaWJ1dGVOYW1lLFxuICAgICAgfTtcblxuICAgICAgaWYgKGhlYWRlci5jaGlsZHJlbikge1xuICAgICAgICB0aGlzLml0ZXJhdGVBbmRGaWxsQ2VsbHNCeUNvbHVtbnMoXG4gICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgY29sdW1uR3JvdXBzSW5mbyxcbiAgICAgICAgICBoZWFkZXIuY2hpbGRyZW4sXG4gICAgICAgICAgY3VycmVudEluZGV4LFxuICAgICAgICAgIHNob3dTdW1zLFxuICAgICAgICAgIGxldmVsICsgMSxcbiAgICAgICAgICBoZWFkZXJcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQoaGVhZGVyLnRhcmdldEluZGV4KSkge1xuICAgICAgICB0aGlzLmZpbGxDZWxsc0ZvckNvbHVtbihjZWxscywgaGVhZGVyLnRhcmdldEluZGV4KTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEluZGV4ICs9IGdldEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dTdW1zW2xldmVsXSkge1xuICAgICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMuZ2V0U3VtbWFyeUJhY2tncm91bmQobGV2ZWwpO1xuICAgICAgY29uc3QgeyB0aXRsZSwgc3VtbWFyeSB9ID0gdGhpcy5mb3JtYXRTdW1tYXJ5SGVhZGVyKHBhcmVudEhlYWRlciwgbGV2ZWwpXG4gICAgICBjb25zdCBudW1iZXJPZlZhbHVlcyA9IHRoaXMuZGF0YS52YWx1ZVRpdGxlcy5sZW5ndGg7XG4gICAgICBjb25zdCByb3dJbmRleCA9IE1hdGgubWF4KGxldmVsIC0gMSwgMCk7XG4gICAgICBjb25zdCBzaG91bGRBZGRWYWx1ZUhlYWRlcnMgPSBudW1iZXJPZlZhbHVlcyA+IDE7XG5cbiAgICAgIGNlbGxzW3Jvd0luZGV4XVtjdXJyZW50SW5kZXhdID0ge1xuICAgICAgICB2YWx1ZTogdGl0bGUsXG4gICAgICAgIGNvbnN0cmFpbnQ6IHBhcmVudEhlYWRlcj8uY29uc3RyYWludCxcbiAgICAgICAgbGFiZWw6IHBhcmVudEhlYWRlcj8uYXR0cmlidXRlTmFtZSxcbiAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuY29sdW1uR3JvdXBIZWFkZXJDbGFzcyxcbiAgICAgICAgaXNTdW1tYXJ5OiB0cnVlLFxuICAgICAgICBzdGlja3lUb3A6IHRoaXMuaXNDb2x1bW5MZXZlbFN0aWNreShsZXZlbCksXG4gICAgICAgIHJvd1NwYW46IHRoaXMuY29sdW1uTGV2ZWxzIC0gcm93SW5kZXggLSAoc2hvdWxkQWRkVmFsdWVIZWFkZXJzID8gMSA6IDApLFxuICAgICAgICBjb2xTcGFuOiBudW1iZXJPZlN1bXMsXG4gICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIHN1bW1hcnksXG4gICAgICB9O1xuXG4gICAgICBpZiAobnVtYmVyT2ZWYWx1ZXMgPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZWYWx1ZXM7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4SW5DZWxscyA9IGN1cnJlbnRJbmRleCArIGk7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZFZhbHVlSGVhZGVycykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUaXRsZSA9IHRoaXMuZGF0YS52YWx1ZVRpdGxlc1tpXTtcbiAgICAgICAgICAgIGNlbGxzW3RoaXMuY29sdW1uTGV2ZWxzIC0gMV1bY29sdW1uSW5kZXhJbkNlbGxzXSA9IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlVGl0bGUsXG4gICAgICAgICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLmNvbHVtbkdyb3VwSGVhZGVyQ2xhc3MsXG4gICAgICAgICAgICAgIGlzU3VtbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3kobGV2ZWwpLFxuICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5zSW5kZXhlcyA9IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1uc0luZGV4ZXMgPSBjb2x1bW5zSW5kZXhlcy5maWx0ZXIoaW5kZXggPT4gaW5kZXggJSBudW1iZXJPZlZhbHVlcyA9PT0gaSk7XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2x1bW5JbmRleGVzID0gdmFsdWVDb2x1bW5zSW5kZXhlc1xuICAgICAgICAgICAgLm1hcCh2ID0+IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXlbdl0pXG4gICAgICAgICAgICAuZmlsdGVyKHYgPT4gaXNOb3ROdWxsT3JVbmRlZmluZWQodikpO1xuICAgICAgICAgIGNvbHVtbkdyb3Vwc0luZm9bY29sdW1uSW5kZXhJbkNlbGxzXSA9IHtiYWNrZ3JvdW5kLCBpbmRleGVzOiB0cmFuc2Zvcm1lZENvbHVtbkluZGV4ZXMsIGxldmVsfTtcblxuICAgICAgICAgIHRoaXMuZmlsbENlbGxzRm9yR3JvdXBlZENvbHVtbihjZWxscywgdmFsdWVDb2x1bW5zSW5kZXhlcywgY29sdW1uSW5kZXhJbkNlbGxzLCBiYWNrZ3JvdW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sdW1uR3JvdXBzSW5mb1tjdXJyZW50SW5kZXhdID0ge2JhY2tncm91bmQsIGluZGV4ZXM6IFtdLCBsZXZlbH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JHcm91cGVkQ29sdW1uKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgY29sdW1uczogbnVtYmVyW10sXG4gICAgY29sdW1uSW5kZXhJbkNlbGxzOiBudW1iZXIsXG4gICAgYmFja2dyb3VuZDogc3RyaW5nXG4gICkge1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyByb3crKykge1xuICAgICAgY29uc3Qgcm93SW5kZXhJbkNlbGxzID0gdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheVtyb3ddO1xuICAgICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKHJvd0luZGV4SW5DZWxscykpIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlcywgZGF0YVJlc291cmNlc30gPSB0aGlzLmdldEdyb3VwZWRWYWx1ZXNGb3JSb3dzQW5kQ29scyhbcm93XSwgY29sdW1ucyk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5hZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHZhbHVlcywgW3Jvd10sIGNvbHVtbnMpO1xuICAgICAgICBjZWxsc1tyb3dJbmRleEluQ2VsbHNdW2NvbHVtbkluZGV4SW5DZWxsc10gPSB7XG4gICAgICAgICAgdmFsdWU6IFN0cmluZyhmb3JtYXR0ZWRWYWx1ZSksXG4gICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZ3JvdXBEYXRhQ2xhc3MsXG4gICAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgICAgICBpc1ZhbHVlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWdncmVnYXRlQW5kRm9ybWF0RGF0YVZhbHVlcyh2YWx1ZXM6IGFueVtdLCByb3dzOiBudW1iZXJbXSwgY29sdW1uczogbnVtYmVyW10pOiBhbnkge1xuICAgIGNvbnN0IHt2YWx1ZSwgYWdncmVnYXRpb259ID0gdGhpcy5hZ2dyZWdhdGVEYXRhVmFsdWVzKHZhbHVlcywgY29sdW1ucyk7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0aW9uID09PSBEYXRhQWdncmVnYXRpb25UeXBlLkpvaW4gPyB2YWx1ZSA6IHRoaXMuZm9ybWF0R3JvdXBlZFZhbHVlQnlWYWx1ZVR5cGUodmFsdWUsIHJvd3MsIGNvbHVtbnMpXG4gIH1cblxuICBwcml2YXRlIGFnZ3JlZ2F0ZURhdGFWYWx1ZXModmFsdWVzOiBhbnlbXSwgY29sdW1uczogbnVtYmVyW10pOiB7dmFsdWU6IGFueTsgYWdncmVnYXRpb246IERhdGFBZ2dyZWdhdGlvblR5cGV9IHtcbiAgICBjb25zdCBhZ2dyZWdhdGlvbiA9IHRoaXMuYWdncmVnYXRpb25CeUNvbHVtbnMoY29sdW1ucyk7XG4gICAgaWYgKGFnZ3JlZ2F0aW9uID09PSBEYXRhQWdncmVnYXRpb25UeXBlLkpvaW4pIHtcbiAgICAgIGNvbnN0IHZhbHVlSW5kZXggPSB0aGlzLmdldFZhbHVlSW5kZXhGb3JDb2x1bW5zKGNvbHVtbnMpO1xuICAgICAgY29uc3QgY29uc3RyYWludCA9IHRoaXMuZGF0YS52YWx1ZXNDb25zdHJhaW50cz8uW3ZhbHVlSW5kZXhdIHx8IHRoaXMudmFsdWVUeXBlSW5mb1t2YWx1ZUluZGV4XT8uZGVmYXVsdENvbnN0cmFpbnQ7XG4gICAgICByZXR1cm4ge3ZhbHVlOiBhZ2dyZWdhdGVEYXRhVmFsdWVzKGFnZ3JlZ2F0aW9uLCB2YWx1ZXMsIGNvbnN0cmFpbnQsIGZhbHNlLCB0aGlzLmNvbnN0cmFpbnREYXRhKSwgYWdncmVnYXRpb259O1xuICAgIH1cbiAgICByZXR1cm4ge3ZhbHVlOiBhZ2dyZWdhdGVEYXRhVmFsdWVzKGFnZ3JlZ2F0aW9uLCB2YWx1ZXMpLCBhZ2dyZWdhdGlvbn07XG4gIH1cblxuICBwcml2YXRlIGFnZ3JlZ2F0aW9uQnlDb2x1bW5zKGNvbHVtbnM6IG51bWJlcltdKTogRGF0YUFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IGNvbHVtbnNbMF0gJSB0aGlzLmRhdGEudmFsdWVUaXRsZXMubGVuZ3RoO1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uID0gdGhpcy5kYXRhLnZhbHVlQWdncmVnYXRpb25zPy5bdmFsdWVJbmRleF07XG4gICAgcmV0dXJuIGlzVmFsdWVBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbikgPyBhZ2dyZWdhdGlvbiA6IERhdGFBZ2dyZWdhdGlvblR5cGUuU3VtO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWxsQ2VsbHNGb3JDb2x1bW4oY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSwgY29sdW1uOiBudW1iZXIpIHtcbiAgICBjb25zdCBjb2x1bW5JbmRleEluQ2VsbHMgPSB0aGlzLmNvbHVtbnNUcmFuc2Zvcm1hdGlvbkFycmF5W2NvbHVtbl07XG4gICAgaWYgKGlzTm90TnVsbE9yVW5kZWZpbmVkKGNvbHVtbkluZGV4SW5DZWxscykpIHtcbiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRoaXMucm93c1RyYW5zZm9ybWF0aW9uQXJyYXkubGVuZ3RoOyByb3crKykge1xuICAgICAgICBjb25zdCByb3dJbmRleEluQ2VsbHMgPSB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5W3Jvd107XG4gICAgICAgIGlmIChpc05vdE51bGxPclVuZGVmaW5lZChyb3dJbmRleEluQ2VsbHMpKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGEudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgICAgICAgICBjb25zdCBkYXRhUmVzb3VyY2VzID0gdGhpcy5kYXRhUmVzb3VyY2VzPy5bcm93XT8uW2NvbHVtbl0gfHwgW107XG4gICAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmFnZ3JlZ2F0ZU9yRm9ybWF0U2luZ2xlVmFsdWUodmFsdWUsIGNvbHVtbik7XG4gICAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBpc05vdE51bGxPclVuZGVmaW5lZChmb3JtYXR0ZWRWYWx1ZSkgPyBTdHJpbmcoZm9ybWF0dGVkVmFsdWUpIDogJyc7XG4gICAgICAgICAgY2VsbHNbcm93SW5kZXhJbkNlbGxzXVtjb2x1bW5JbmRleEluQ2VsbHNdID0ge1xuICAgICAgICAgICAgdmFsdWU6IHN0cmluZ1ZhbHVlLFxuICAgICAgICAgICAgZGF0YVJlc291cmNlcyxcbiAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZGF0YUNsYXNzLFxuICAgICAgICAgICAgaXNWYWx1ZTogdHJ1ZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZ2dyZWdhdGVPckZvcm1hdFNpbmdsZVZhbHVlKHZhbHVlOiBhbnksIGNvbHVtbjogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBhZ2dyZWdhdGlvbiA9IHRoaXMuYWdncmVnYXRpb25CeUNvbHVtbnMoW2NvbHVtbl0pO1xuICAgIGNvbnN0IHZhbHVlSW5kZXggPSB0aGlzLmdldFZhbHVlSW5kZXhGb3JDb2x1bW5zKFtjb2x1bW5dKTtcbiAgICBpZiAoYWdncmVnYXRpb24gPT09IERhdGFBZ2dyZWdhdGlvblR5cGUuSm9pbikge1xuICAgICAgY29uc3QgY29uc3RyYWludCA9IHRoaXMuZGF0YS52YWx1ZXNDb25zdHJhaW50cz8uW3ZhbHVlSW5kZXhdIHx8IHRoaXMudmFsdWVUeXBlSW5mb1t2YWx1ZUluZGV4XT8uZGVmYXVsdENvbnN0cmFpbnQ7XG4gICAgICByZXR1cm4gYWdncmVnYXRlRGF0YVZhbHVlcyhhZ2dyZWdhdGlvbiwgW3ZhbHVlXSwgY29uc3RyYWludCwgZmFsc2UsIHRoaXMuY29uc3RyYWludERhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3JtYXRWYWx1ZUJ5VmFsdWVUeXBlKHZhbHVlLCB2YWx1ZUluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsbENlbGxzQnlHcm91cEludGVyc2VjdGlvbihcbiAgICBjZWxsczogTG1yUGl2b3RUYWJsZUNlbGxbXVtdLFxuICAgIHJvd0dyb3Vwc0luZm86IEhlYWRlckdyb3VwSW5mb1tdLFxuICAgIGNvbHVtbkdyb3Vwc0luZm86IEhlYWRlckdyb3VwSW5mb1tdXG4gICkge1xuICAgIGNvbnN0IHJvd3NDb3VudCA9IGNlbGxzLmxlbmd0aDtcbiAgICBjb25zdCBjb2x1bW5zQ291bnQgPSBjZWxsc1swXT8ubGVuZ3RoIHx8IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0dyb3Vwc0luZm8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvd0dyb3VwSW5mbyA9IHJvd0dyb3Vwc0luZm9baV07XG4gICAgICBpZiAocm93R3JvdXBJbmZvKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uR3JvdXBzSW5mby5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmIChjb2x1bW5Hcm91cHNJbmZvW2pdKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gY29sdW1uR3JvdXBzSW5mb1tqXS5pbmRleGVzXG4gICAgICAgICAgICBsZXQgZm9ybWF0dGVkVmFsdWU6IHN0cmluZztcbiAgICAgICAgICAgIGxldCBkYXRhUmVzb3VyY2VzOiBEYXRhUmVzb3VyY2VbXTtcbiAgICAgICAgICAgIGlmIChyb3dHcm91cEluZm8uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmV2YWx1YXRlRXhwcmVzc2lvbihyb3dHcm91cEluZm8uZXhwcmVzc2lvbiwgY29sdW1ucyk7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlSW5kZXggPSBjb2x1bW5zWzBdICUgdGhpcy5kYXRhLnZhbHVlVGl0bGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlQnlDb25zdHJhaW50KHJlc3VsdC52YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgICAgICAgICAgIGRhdGFSZXNvdXJjZXMgPSByZXN1bHQuZGF0YVJlc291cmNlc1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gaXQncyBlbm91Z2ggdG8gZmlsbCBncm91cCB2YWx1ZXMgb25seSBmcm9tIHJvdyBzaWRlXG4gICAgICAgICAgICAgIGNvbnN0IHtyb3dzSW5kZXhlcywgY29sdW1uc0luZGV4ZXN9ID0gdGhpcy5nZXRWYWx1ZXNJbmRleGVzRnJvbUNlbGxzSW5kZXhlcyhcbiAgICAgICAgICAgICAgICByb3dHcm91cEluZm8uaW5kZXhlcyxcbiAgICAgICAgICAgICAgICBjb2x1bW5zXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0R3JvdXBlZFZhbHVlc0ZvclJvd3NBbmRDb2xzKHJvd3NJbmRleGVzLCBjb2x1bW5zSW5kZXhlcyk7XG4gICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlID0gdGhpcy5hZ2dyZWdhdGVBbmRGb3JtYXREYXRhVmFsdWVzKHJlc3VsdC52YWx1ZXMsIHJvd3NJbmRleGVzLCBjb2x1bW5zSW5kZXhlcyk7XG4gICAgICAgICAgICAgIGRhdGFSZXNvdXJjZXMgPSByZXN1bHQuZGF0YVJlc291cmNlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2VsbHNbaV1bal0gPSB7XG4gICAgICAgICAgICAgIHZhbHVlOiBTdHJpbmcoZm9ybWF0dGVkVmFsdWUpLFxuICAgICAgICAgICAgICBkYXRhUmVzb3VyY2VzLFxuICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5ncm91cERhdGFDbGFzcyxcbiAgICAgICAgICAgICAgaXNWYWx1ZTogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWxsUm93V2l0aENvbG9yKGNlbGxzLCBpLCByb3dHcm91cEluZm8sIGNvbHVtbnNDb3VudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2x1bW5Hcm91cHNJbmZvLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoY29sdW1uR3JvdXBzSW5mb1tqXSkge1xuICAgICAgICB0aGlzLmZpbGxDb2x1bW5XaXRoQ29sb3IoY2VsbHMsIGosIGNvbHVtbkdyb3Vwc0luZm9bal0sIHJvd0dyb3Vwc0luZm8sIHJvd3NDb3VudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWYWx1ZXNJbmRleGVzRnJvbUNlbGxzSW5kZXhlcyhcbiAgICByb3dzOiBudW1iZXJbXSxcbiAgICBjb2x1bW5zOiBudW1iZXJbXVxuICApOiB7IHJvd3NJbmRleGVzOiBudW1iZXJbXTsgY29sdW1uc0luZGV4ZXM6IG51bWJlcltdIH0ge1xuICAgIGNvbnN0IHJvd3NJbmRleGVzID0gcm93c1xuICAgICAgLm1hcChyb3cgPT4gdGhpcy5yb3dzVHJhbnNmb3JtYXRpb25BcnJheS5maW5kSW5kZXgodFJvdyA9PiB0Um93ID09PSByb3cpKVxuICAgICAgLmZpbHRlcihpbmRleCA9PiBpbmRleCA+PSAwKTtcbiAgICBjb25zdCBjb2x1bW5zSW5kZXhlcyA9IGNvbHVtbnNcbiAgICAgIC5tYXAoY29sdW1uID0+IHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkuZmluZEluZGV4KHRDb2x1bW4gPT4gdENvbHVtbiA9PT0gY29sdW1uKSlcbiAgICAgIC5maWx0ZXIoaW5kZXggPT4gaW5kZXggPj0gMCk7XG4gICAgcmV0dXJuIHtyb3dzSW5kZXhlcywgY29sdW1uc0luZGV4ZXN9O1xuICB9XG5cbiAgcHJpdmF0ZSBmaWxsUm93V2l0aENvbG9yKFxuICAgIGNlbGxzOiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10sXG4gICAgcm93OiBudW1iZXIsXG4gICAgcm93R3JvdXBJbmZvOiBIZWFkZXJHcm91cEluZm8sXG4gICAgY29sdW1uc0NvdW50OiBudW1iZXJcbiAgKSB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMucm93TGV2ZWxzOyBpIDwgY29sdW1uc0NvdW50OyBpKyspIHtcbiAgICAgIGNlbGxzW3Jvd11baV0gJiYgKGNlbGxzW3Jvd11baV0uYmFja2dyb3VuZCA9IHJvd0dyb3VwSW5mby5iYWNrZ3JvdW5kKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbGxDb2x1bW5XaXRoQ29sb3IoXG4gICAgY2VsbHM6IExtclBpdm90VGFibGVDZWxsW11bXSxcbiAgICBjb2x1bW46IG51bWJlcixcbiAgICBjb2x1bW5Hcm91cEluZm86IEhlYWRlckdyb3VwSW5mbyxcbiAgICByb3dHcm91cHNJbmZvOiBIZWFkZXJHcm91cEluZm9bXSxcbiAgICByb3dDb3VudDogbnVtYmVyXG4gICkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmNvbHVtbkxldmVsczsgaSA8IHJvd0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHJvd0dyb3VwSW5mbyA9IHJvd0dyb3Vwc0luZm9baV07XG4gICAgICBpZiAoIXJvd0dyb3VwSW5mbyB8fCByb3dHcm91cEluZm8ubGV2ZWwgPiBjb2x1bW5Hcm91cEluZm8ubGV2ZWwpIHtcbiAgICAgICAgY2VsbHNbaV1bY29sdW1uXSAmJiAoY2VsbHNbaV1bY29sdW1uXS5iYWNrZ3JvdW5kID0gY29sdW1uR3JvdXBJbmZvLmJhY2tncm91bmQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdENlbGxzKCk6IExtclBpdm90VGFibGVDZWxsW11bXSB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93c0NvdW50KCkgKyB0aGlzLmNvbHVtbkxldmVscztcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRDb2x1bW5zQ291bnQoKSArIHRoaXMucm93TGV2ZWxzO1xuXG4gICAgY29uc3QgbWF0cml4OiBMbXJQaXZvdFRhYmxlQ2VsbFtdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgbWF0cml4W2ldID0gW107XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbnM7IGorKykge1xuICAgICAgICBpZiAoaSA+PSB0aGlzLmNvbHVtbkxldmVscyAmJiBqID49IHRoaXMucm93TGV2ZWxzKSB7XG4gICAgICAgICAgY29uc3QgaXNEYXRhQ2xhc3MgPSB0aGlzLnJvd3NUcmFuc2Zvcm1hdGlvbkFycmF5LmluY2x1ZGVzKGkpICYmIHRoaXMuY29sdW1uc1RyYW5zZm9ybWF0aW9uQXJyYXkuaW5jbHVkZXMoaik7XG4gICAgICAgICAgbWF0cml4W2ldW2pdID0ge1xuICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgZGF0YVJlc291cmNlczogW10sXG4gICAgICAgICAgICBjc3NDbGFzczogaXNEYXRhQ2xhc3MgPyBQaXZvdFRhYmxlQ29udmVydGVyLmRhdGFDbGFzcyA6IFBpdm90VGFibGVDb252ZXJ0ZXIuZ3JvdXBEYXRhQ2xhc3MsXG4gICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgICAgIGlzVmFsdWU6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXRyaXhbaV1bal0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dMZXZlbHMgPiAwICYmIHRoaXMuY29sdW1uTGV2ZWxzID4gMCkge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnJvd0xldmVsczsgaisrKSB7XG4gICAgICAgIGNvbnN0IHJvd0hlYWRlckF0dHJpYnV0ZSA9IHRoaXMuZGF0YS5yb3dIZWFkZXJBdHRyaWJ1dGVzW2pdO1xuICAgICAgICBpZiAocm93SGVhZGVyQXR0cmlidXRlKSB7XG4gICAgICAgICAgY29uc3QgdGl0bGVDb2xTcGFuID0gdGhpcy5ub25TdGlja3lDb2x1bW5JbmRleCB8fCB0aGlzLmNvbHVtbkxldmVsc1xuICAgICAgICAgIG1hdHJpeFswXVtqXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiByb3dIZWFkZXJBdHRyaWJ1dGUudGl0bGUsXG4gICAgICAgICAgICBjc3NDbGFzczogUGl2b3RUYWJsZUNvbnZlcnRlci5yb3dBdHRyaWJ1dGVIZWFkZXJDbGFzcyxcbiAgICAgICAgICAgIGlzQXR0cmlidXRlSGVhZGVyOiB0cnVlLFxuICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgIGNvbFNwYW46IHRpdGxlQ29sU3BhbixcbiAgICAgICAgICAgIHN0aWNreVRvcDogdGhpcy5pc0NvbHVtbkxldmVsU3RpY2t5KDApLFxuICAgICAgICAgICAgc3RpY2t5U3RhcnQ6IHRoaXMuaXNSb3dMZXZlbFN0aWNreShqKSxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJvd0hlYWRlckF0dHJpYnV0ZS5jb2xvcixcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKHRoaXMuY29sdW1uTGV2ZWxzIC0gdGl0bGVDb2xTcGFuID4gMCkge1xuICAgICAgICAgICAgbWF0cml4W3RoaXMubm9uU3RpY2t5Q29sdW1uSW5kZXhdW2pdID0ge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICAgIGNzc0NsYXNzOiBQaXZvdFRhYmxlQ29udmVydGVyLnJvd0F0dHJpYnV0ZUhlYWRlckNsYXNzLFxuICAgICAgICAgICAgICBpc0F0dHJpYnV0ZUhlYWRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgICAgY29sU3BhbjogdGhpcy5jb2x1bW5MZXZlbHMgLSB0aXRsZUNvbFNwYW4sXG4gICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJvd0hlYWRlckF0dHJpYnV0ZS5jb2xvcixcbiAgICAgICAgICAgICAgc3RpY2t5U3RhcnQ6IHRoaXMuaXNSb3dMZXZlbFN0aWNreShqKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbkxldmVsczsgaSsrKSB7XG4gICAgICAgICAgICBtYXRyaXhbaV1bal0gPSB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgY3NzQ2xhc3M6IFBpdm90VGFibGVDb252ZXJ0ZXIuZW1wdHlDbGFzcyxcbiAgICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgICAgICAgc3RpY2t5U3RhcnQ6IHRoaXMuaXNSb3dMZXZlbFN0aWNreShqKSxcbiAgICAgICAgICAgICAgc3RpY2t5VG9wOiB0aGlzLmlzQ29sdW1uTGV2ZWxTdGlja3koaSksXG4gICAgICAgICAgICAgIGlzSGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0cml4O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSb3dzQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5kYXRhLnJvd0hlYWRlcnMubGVuZ3RoID09PSAwICYmICh0aGlzLmRhdGEudmFsdWVUaXRsZXMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0SGVhZGVyc0NoaWxkQ291bnQodGhpcy5kYXRhLnJvd0hlYWRlcnMsIHRoaXMucm93U2hvd1N1bXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5zQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5kYXRhLmNvbHVtbkhlYWRlcnMubGVuZ3RoID09PSAwICYmICh0aGlzLmRhdGEudmFsdWVUaXRsZXMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBudW1iZXJPZlN1bXMgPSBNYXRoLm1heCgxLCAodGhpcy5kYXRhLnZhbHVlVGl0bGVzIHx8IFtdKS5sZW5ndGgpO1xuICAgIHJldHVybiBnZXRIZWFkZXJzQ2hpbGRDb3VudCh0aGlzLmRhdGEuY29sdW1uSGVhZGVycywgdGhpcy5jb2x1bW5TaG93U3VtcywgbnVtYmVyT2ZTdW1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlUGl2b3REYXRhKFxuICBkYXRhOiBMbXJQaXZvdFN0ZW1EYXRhLFxuICBjb25zdHJhaW50RGF0YTogQ29uc3RyYWludERhdGEsXG4gIHZhbHVlVHlwZUluZm86IFZhbHVlVHlwZUluZm9bXVxuKTogTG1yUGl2b3RTdGVtRGF0YSB7XG4gIGNvbnN0IG51bWJlck9mU3VtcyA9IE1hdGgubWF4KDEsIChkYXRhLnZhbHVlVGl0bGVzIHx8IFtdKS5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZXMgPSBjb21wdXRlVmFsdWVzQnlWYWx1ZVR5cGUoZGF0YS52YWx1ZXMsIGRhdGEudmFsdWVUeXBlcywgbnVtYmVyT2ZTdW1zLCB2YWx1ZVR5cGVJbmZvKTtcbiAgY29uc3Qgc29ydGVkID0gc29ydFBpdm90RGF0YSh7Li4uZGF0YSwgdmFsdWVzfSwgY29uc3RyYWludERhdGEpO1xuICByZXR1cm4gZmlsbEV4cHJlc3Npb25zVG9EYXRhKHNvcnRlZClcbn1cblxuZnVuY3Rpb24gZmlsbEV4cHJlc3Npb25zVG9EYXRhKGRhdGE6IExtclBpdm90U3RlbURhdGEpOiBMbXJQaXZvdFN0ZW1EYXRhIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5kYXRhLFxuICAgIHJvd0hlYWRlcnM6IGZpbGxFeHByZXNzaW9uc1RvSGVhZGVycyhkYXRhLnJvd0hlYWRlcnMsIGRhdGEucm93c0NvbmZpZywgMCksXG4gICAgY29sdW1uSGVhZGVyczogZmlsbEV4cHJlc3Npb25zVG9IZWFkZXJzKGRhdGEuY29sdW1uSGVhZGVycywgZGF0YS5jb2x1bW5zQ29uZmlnLCAwKSxcbiAgfVxufVxuXG5mdW5jdGlvbiBmaWxsRXhwcmVzc2lvbnNUb0hlYWRlcnMoaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sIGNvbmZpZ3M6IExtclBpdm90RGltZW5zaW9uQ29uZmlnW10sIGluZGV4OiBudW1iZXIpOiBMbXJQaXZvdERhdGFIZWFkZXJbXSB7XG4gIGNvbnN0IGV4cHJlc3Npb25zID0gY29uZmlncz8uW2luZGV4XT8uZXhwcmVzc2lvbnMgfHwgW11cbiAgY29uc3QgaGVhZGVyc0NvcHkgPSBbLi4uKGhlYWRlcnMgfHwgW10pXVxuICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgZXhwcmVzc2lvbnMpIHtcbiAgICBjb25zdCBkYXRhSGVhZGVyRXhwcmVzc2lvbiA9IGV4dGVuZFBpdm90RXhwcmVzc2lvbihleHByZXNzaW9uLCBoZWFkZXJzKVxuICAgIGlmIChkYXRhSGVhZGVyRXhwcmVzc2lvbi5sYXN0SGVhZGVySW5kZXggPj0gMCkge1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZGF0YUhlYWRlckV4cHJlc3Npb24ubGFzdEhlYWRlckluZGV4XG4gICAgICBjb25zdCBuZXdIZWFkZXI6IExtclBpdm90RGF0YUhlYWRlciA9IHsuLi5oZWFkZXJzQ29weVtsYXN0SGVhZGVySW5kZXhdLCBleHByZXNzaW9uczogWy4uLihoZWFkZXJzQ29weVtsYXN0SGVhZGVySW5kZXhdLmV4cHJlc3Npb25zIHx8IFtdKSwgZGF0YUhlYWRlckV4cHJlc3Npb25dfVxuICAgICAgaGVhZGVyc0NvcHkuc3BsaWNlKGxhc3RIZWFkZXJJbmRleCwgMSwgbmV3SGVhZGVyKVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWdzPy5baW5kZXggKyAxXSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVyc0NvcHkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhlYWRlcnNDb3B5LnNwbGljZShpLCAxLCB7Li4uaGVhZGVyc0NvcHlbaV0sIGNoaWxkcmVuOiBmaWxsRXhwcmVzc2lvbnNUb0hlYWRlcnMoaGVhZGVyc0NvcHlbaV0uY2hpbGRyZW4sIGNvbmZpZ3MsIGluZGV4ICsgMSl9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoZWFkZXJzQ29weVxufVxuXG5mdW5jdGlvbiBleHRlbmRQaXZvdEV4cHJlc3Npb24oZXhwcmVzc2lvbjogTG1yUGl2b3RFeHByZXNzaW9uLCBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSk6IExtclBpdm90RGF0YUhlYWRlckV4cHJlc3Npb24ge1xuICBjb25zdCBkYXRhSGVhZGVyT3BlcmFuZHM6IExtclBpdm90RGF0YUhlYWRlck9wZXJhbmRbXSA9IFtdO1xuICBsZXQgbGFzdEhlYWRlckluZGV4OiBudW1iZXIgPSAtMVxuXG4gIGZ1bmN0aW9uIHRyYXZlcnNlKG9wZXJhbmRzOiBMbXJQaXZvdE9wZXJhbmRbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBvcGVyYW5kcyl7XG4gICAgICBpZiAob3BlcmFuZC50eXBlID09PSAnaGVhZGVyJykge1xuICAgICAgICBjb25zdCBpbmRleGVzID0gZ2V0T3BlcmFuZEluZGV4ZXNJbkhlYWRlcnMob3BlcmFuZCwgaGVhZGVycylcbiAgICAgICAgbGFzdEhlYWRlckluZGV4ID0gTWF0aC5tYXgobGFzdEhlYWRlckluZGV4LCAuLi5pbmRleGVzKVxuICAgICAgICBjb25zdCBvcGVyYW5kSGVhZGVycyA9IGluZGV4ZXMubWFwKGluZGV4ID0+IGhlYWRlcnNbaW5kZXhdKVxuICAgICAgICBkYXRhSGVhZGVyT3BlcmFuZHMucHVzaCh7Li4ub3BlcmFuZCwgaGVhZGVyczogb3BlcmFuZEhlYWRlcnN9KTtcbiAgICAgIH0gZWxzZSBpZiAob3BlcmFuZC50eXBlID09PSAnZXhwcmVzc2lvbicpIHtcbiAgICAgICAgdHJhdmVyc2Uob3BlcmFuZC5vcGVyYW5kcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhSGVhZGVyT3BlcmFuZHMucHVzaChvcGVyYW5kKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyYXZlcnNlKGV4cHJlc3Npb24ub3BlcmFuZHMpO1xuXG4gIHJldHVybiB7Li4uZXhwcmVzc2lvbiwgbGFzdEhlYWRlckluZGV4LCBvcGVyYW5kczogZGF0YUhlYWRlck9wZXJhbmRzfTtcbn1cblxuZnVuY3Rpb24gZ2V0T3BlcmFuZEluZGV4ZXNJbkhlYWRlcnMob3BlcmFuZDogTG1yUGl2b3RIZWFkZXJPcGVyYW5kLCBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSk6IG51bWJlcltdIHtcbiAgcmV0dXJuIChoZWFkZXJzIHx8IFtdKS5yZWR1Y2U8bnVtYmVyW10+KChpbmRleGVzLCBoZWFkZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG9wZXJhbmRDb250YWluc0hlYWRlcihvcGVyYW5kLCBoZWFkZXIpKSB7XG4gICAgICBpbmRleGVzLnB1c2goaW5kZXgpXG4gICAgfVxuICAgIHJldHVybiBpbmRleGVzXG4gIH0sIFtdKVxufVxuXG5mdW5jdGlvbiBvcGVyYW5kQ29udGFpbnNIZWFkZXIob3BlcmFuZDogTG1yUGl2b3RIZWFkZXJPcGVyYW5kLCBoZWFkZXI6IExtclBpdm90RGF0YUhlYWRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaGVhZGVyLnRpdGxlLm1hdGNoKG5ldyBSZWdFeHAob3BlcmFuZC52YWx1ZSkpPy5sZW5ndGggPiAwXG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVWYWx1ZXNCeVZhbHVlVHlwZShcbiAgdmFsdWVzOiBhbnlbXVtdLFxuICB2YWx1ZVR5cGVzOiBMbXJQaXZvdFZhbHVlVHlwZVtdLFxuICBudW1WYWx1ZXM6IG51bWJlcixcbiAgdmFsdWVUeXBlSW5mbzogVmFsdWVUeXBlSW5mb1tdXG4pOiBhbnlbXVtdIHtcbiAgY29uc3Qgcm93c0luZGV4ZXMgPSBbLi4uQXJyYXkodmFsdWVzLmxlbmd0aCkua2V5cygpXTtcbiAgY29uc3QgbW9kaWZpZWRWYWx1ZXMgPSBkZWVwT2JqZWN0Q29weSh2YWx1ZXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGVzICYmIHZhbHVlVHlwZXNbaV07XG4gICAgaWYgKCF2YWx1ZVR5cGUgfHwgdmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5EZWZhdWx0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5zQ291bnQgPSAodmFsdWVzWzBdICYmIHZhbHVlc1swXS5sZW5ndGgpIHx8IDA7XG4gICAgY29uc3QgY29sdW1uSW5kZXhlcyA9IFsuLi5BcnJheShjb2x1bW5zQ291bnQpLmtleXMoKV0uZmlsdGVyKGtleSA9PiBrZXkgJSBudW1WYWx1ZXMgPT09IGkpO1xuICAgIGNvbnN0IGluZm8gPSB2YWx1ZVR5cGVJbmZvW2ldO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93c0luZGV4ZXMpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbkluZGV4ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlVHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQWxsUGVyY2VudGFnZSkge1xuICAgICAgICAgIG1vZGlmaWVkVmFsdWVzW3Jvd11bY29sdW1uXSA9IGRpdmlkZVZhbHVlcyh2YWx1ZXNbcm93XVtjb2x1bW5dLCBpbmZvLnN1bSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5Sb3dQZXJjZW50YWdlKSB7XG4gICAgICAgICAgbW9kaWZpZWRWYWx1ZXNbcm93XVtjb2x1bW5dID0gZGl2aWRlVmFsdWVzKHZhbHVlc1tyb3ddW2NvbHVtbl0sIGluZm8uc3Vtc1Jvd3Nbcm93XSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSBMbXJQaXZvdFZhbHVlVHlwZS5Db2x1bW5QZXJjZW50YWdlKSB7XG4gICAgICAgICAgbW9kaWZpZWRWYWx1ZXNbcm93XVtjb2x1bW5dID0gZGl2aWRlVmFsdWVzKHZhbHVlc1tyb3ddW2NvbHVtbl0sIGluZm8uc3Vtc0NvbHVtbnNbY29sdW1uXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kaWZpZWRWYWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlc1R5cGVJbmZvKHZhbHVlczogYW55W11bXSwgdmFsdWVUeXBlczogTG1yUGl2b3RWYWx1ZVR5cGVbXSwgbnVtVmFsdWVzOiBudW1iZXIpOiBWYWx1ZVR5cGVJbmZvW10ge1xuICBjb25zdCB2YWx1ZVR5cGVJbmZvID0gW107XG4gIGNvbnN0IHJvd3NJbmRleGVzID0gWy4uLkFycmF5KHZhbHVlcy5sZW5ndGgpLmtleXMoKV07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykge1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHZhbHVlVHlwZXMgJiYgdmFsdWVUeXBlc1tpXTtcbiAgICBjb25zdCBjb2x1bW5zQ291bnQgPSAodmFsdWVzWzBdICYmIHZhbHVlc1swXS5sZW5ndGgpIHx8IDA7XG4gICAgY29uc3QgY29sdW1uSW5kZXhlcyA9IFsuLi5BcnJheShjb2x1bW5zQ291bnQpLmtleXMoKV0uZmlsdGVyKGtleSA9PiBrZXkgJSBudW1WYWx1ZXMgPT09IGkpO1xuXG4gICAgdmFsdWVUeXBlSW5mb1tpXSA9IGdldFZhbHVlVHlwZUluZm8odmFsdWVzLCB2YWx1ZVR5cGUsIHJvd3NJbmRleGVzLCBjb2x1bW5JbmRleGVzKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVR5cGVJbmZvO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZVR5cGVJbmZvKHZhbHVlczogYW55W11bXSwgdHlwZTogTG1yUGl2b3RWYWx1ZVR5cGUsIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IFZhbHVlVHlwZUluZm8ge1xuICBjb25zdCBjb250YWluc0RlY2ltYWwgPSBjb250YWluc0RlY2ltYWxWYWx1ZSh2YWx1ZXMsIHJvd3MsIGNvbHVtbnMpO1xuICBjb25zdCB2YWx1ZVR5cGVJbmZvOiBWYWx1ZVR5cGVJbmZvID0ge1xuICAgIGRlZmF1bHRDb25zdHJhaW50OiBjb250YWluc0RlY2ltYWwgPyBuZXcgTnVtYmVyQ29uc3RyYWludCh7ZGVjaW1hbHM6IDJ9KSA6IG51bGwsXG4gIH07XG5cbiAgaWYgKHR5cGUgPT09IExtclBpdm90VmFsdWVUeXBlLkFsbFBlcmNlbnRhZ2UpIHtcbiAgICByZXR1cm4gey4uLnZhbHVlVHlwZUluZm8sIHN1bTogZ2V0TnVtZXJpY1ZhbHVlc1N1bW1hcnkodmFsdWVzLCByb3dzLCBjb2x1bW5zKX07XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuUm93UGVyY2VudGFnZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZVR5cGVJbmZvLFxuICAgICAgc3Vtc1Jvd3M6IHJvd3MucmVkdWNlKChhcnIsIHJvdykgPT4ge1xuICAgICAgICBhcnJbcm93XSA9IGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlcywgW3Jvd10sIGNvbHVtbnMpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgfSwgW10pLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTG1yUGl2b3RWYWx1ZVR5cGUuQ29sdW1uUGVyY2VudGFnZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZVR5cGVJbmZvLFxuICAgICAgc3Vtc0NvbHVtbnM6IGNvbHVtbnMucmVkdWNlKChhcnIsIGNvbHVtbikgPT4ge1xuICAgICAgICBhcnJbY29sdW1uXSA9IGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlcywgcm93cywgW2NvbHVtbl0pO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgfSwgW10pLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gey4uLnZhbHVlVHlwZUluZm99O1xufVxuXG5mdW5jdGlvbiBjb250YWluc0RlY2ltYWxWYWx1ZSh2YWx1ZXM6IGFueVtdW10sIHJvd3M6IG51bWJlcltdLCBjb2x1bW5zOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgaWYgKGlzVmFsdWVEZWNpbWFsKHZhbHVlc1tyb3ddW2NvbHVtbl0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVEZWNpbWFsKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc051bWVyaWModmFsdWUpKSB7XG4gICAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlKSAlIDEgIT09IDA7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1hdGlvbk1hcChcbiAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHNob3dTdW1zOiBib29sZWFuW10sXG4gIGFkZGl0aW9uYWxOdW06IG51bWJlcixcbiAgbnVtYmVyT2ZTdW1zOiBudW1iZXJcbik6IG51bWJlcltdIHtcbiAgY29uc3QgYXJyYXkgPSBbXTtcbiAgaXRlcmF0ZVRocm91Z2hUcmFuc2Zvcm1hdGlvbk1hcChoZWFkZXJzLCBhZGRpdGlvbmFsTnVtLCBhcnJheSwgMCwgc2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gaXRlcmF0ZVRocm91Z2hUcmFuc2Zvcm1hdGlvbk1hcChcbiAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIGFkZGl0aW9uYWxOdW06IG51bWJlcixcbiAgYXJyYXk6IG51bWJlcltdLFxuICBsZXZlbDogbnVtYmVyLFxuICBzaG93U3VtczogYm9vbGVhbltdLFxuICBudW1iZXJPZlN1bXM6IG51bWJlclxuKSB7XG4gIGxldCBhZGRpdGlvbmFsID0gYWRkaXRpb25hbE51bTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICBpZiAoaGVhZGVyLmNoaWxkcmVuKSB7XG4gICAgICBpdGVyYXRlVGhyb3VnaFRyYW5zZm9ybWF0aW9uTWFwKGhlYWRlci5jaGlsZHJlbiwgYWRkaXRpb25hbCwgYXJyYXksIGxldmVsICsgMSwgc2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gICAgICBhZGRpdGlvbmFsICs9IGdldEhlYWRlckNoaWxkQ291bnQoaGVhZGVyLCBsZXZlbCwgc2hvd1N1bXMsIG51bWJlck9mU3Vtcyk7XG4gICAgfSBlbHNlIGlmIChpc05vdE51bGxPclVuZGVmaW5lZChoZWFkZXIudGFyZ2V0SW5kZXgpKSB7XG4gICAgICBhcnJheVtoZWFkZXIudGFyZ2V0SW5kZXhdID0gaSArIGFkZGl0aW9uYWw7XG4gICAgICBhZGRpdGlvbmFsICs9IChoZWFkZXIuZXhwcmVzc2lvbnMgfHwgW10pLmxlbmd0aDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcnMoaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGFsbFJvd3MgPSAoaGVhZGVycyB8fCBbXSkucmVkdWNlKChyb3dzLCBoZWFkZXIpID0+IHtcbiAgICByb3dzLnB1c2goLi4uZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcihoZWFkZXIpKTtcbiAgICByZXR1cm4gcm93cztcbiAgfSwgW10pO1xuICByZXR1cm4gdW5pcXVlVmFsdWVzPG51bWJlcj4oYWxsUm93cyk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXIocGl2b3REYXRhSGVhZGVyOiBMbXJQaXZvdERhdGFIZWFkZXIpOiBudW1iZXJbXSB7XG4gIGlmIChwaXZvdERhdGFIZWFkZXIuY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gcGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuLnJlZHVjZSgocm93cywgaGVhZGVyKSA9PiB7XG4gICAgICByb3dzLnB1c2goLi4uZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcihoZWFkZXIpKTtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH0sIFtdKTtcbiAgfVxuICByZXR1cm4gW3Bpdm90RGF0YUhlYWRlci50YXJnZXRJbmRleF07XG59XG5cbmZ1bmN0aW9uIGdldEhlYWRlcnNDaGlsZENvdW50KGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLCBzaG93U3VtczogYm9vbGVhbltdLCBudW1iZXJPZlN1bXMgPSAxKTogbnVtYmVyIHtcbiAgcmV0dXJuIChoZWFkZXJzIHx8IFtdKS5yZWR1Y2UoXG4gICAgKHN1bSwgaGVhZGVyKSA9PiBzdW0gKyBnZXRIZWFkZXJDaGlsZENvdW50KGhlYWRlciwgMCwgc2hvd1N1bXMsIG51bWJlck9mU3VtcyksXG4gICAgc2hvd1N1bXNbMF0gPyBudW1iZXJPZlN1bXMgOiAwXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEhlYWRlckNoaWxkQ291bnQoXG4gIHBpdm90RGF0YUhlYWRlcjogTG1yUGl2b3REYXRhSGVhZGVyLFxuICBsZXZlbDogbnVtYmVyLFxuICBzaG93U3VtczogYm9vbGVhbltdLFxuICBudW1iZXJPZlN1bXMgPSAxLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgbnVtRXhwcmVzc2lvbnMgPSAocGl2b3REYXRhSGVhZGVyLmV4cHJlc3Npb25zIHx8IFtdKS5sZW5ndGhcbiAgaWYgKHBpdm90RGF0YUhlYWRlci5jaGlsZHJlbikge1xuICAgIHJldHVybiBwaXZvdERhdGFIZWFkZXIuY2hpbGRyZW4ucmVkdWNlKFxuICAgICAgKHN1bSwgaGVhZGVyKSA9PiBzdW0gKyBnZXRIZWFkZXJDaGlsZENvdW50KGhlYWRlciwgbGV2ZWwgKyAxLCBzaG93U3VtcywgbnVtYmVyT2ZTdW1zKSxcbiAgICAgIChzaG93U3Vtc1tsZXZlbCArIDFdID8gbnVtYmVyT2ZTdW1zIDogMCkgKyBudW1FeHByZXNzaW9uc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIDEgKyBudW1FeHByZXNzaW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0RGlyZWN0SGVhZGVyQ2hpbGRDb3VudChcbiAgcGl2b3REYXRhSGVhZGVyOiBMbXJQaXZvdERhdGFIZWFkZXIsXG4gIGxldmVsOiBudW1iZXIsXG4gIHNob3dTdW1zOiBib29sZWFuW10sXG4gIG51bWJlck9mU3VtcyA9IDFcbik6IG51bWJlciB7XG4gIGlmIChwaXZvdERhdGFIZWFkZXIuY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gcGl2b3REYXRhSGVhZGVyLmNoaWxkcmVuLnJlZHVjZShcbiAgICAgIChzdW0sIGhlYWRlcikgPT4gc3VtICsgZ2V0SGVhZGVyQ2hpbGRDb3VudChoZWFkZXIsIGxldmVsICsgMSwgc2hvd1N1bXMsIG51bWJlck9mU3VtcyksXG4gICAgICAwXG4gICAgKTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRQaXZvdERhdGEoZGF0YTogTG1yUGl2b3RTdGVtRGF0YSwgY29uc3RyYWludERhdGE6IENvbnN0cmFpbnREYXRhKTogTG1yUGl2b3RTdGVtRGF0YSB7XG4gIGNvbnN0IHJvd1NvcnRzID0gKGRhdGEucm93c0NvbmZpZyB8fCBbXSkubWFwKGNvbmZpZyA9PiBjb25maWcuc29ydClcbiAgY29uc3QgY29sdW1uU29ydHMgPSAoZGF0YS5jb2x1bW5zQ29uZmlnIHx8IFtdKS5tYXAoY29uZmlnID0+IGNvbmZpZy5zb3J0KVxuICByZXR1cm4ge1xuICAgIC4uLmRhdGEsXG4gICAgcm93SGVhZGVyczogc29ydFBpdm90Um93RGF0YUhlYWRlcnMoZGF0YS5yb3dIZWFkZXJzLCByb3dTb3J0cywgZGF0YSwgY29uc3RyYWludERhdGEpLFxuICAgIGNvbHVtbkhlYWRlcnM6IHNvcnRQaXZvdENvbHVtbkRhdGFIZWFkZXJzKGRhdGEuY29sdW1uSGVhZGVycywgY29sdW1uU29ydHMsIGRhdGEsIGNvbnN0cmFpbnREYXRhKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc29ydFBpdm90Um93RGF0YUhlYWRlcnMoXG4gIHJvd0hlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdLFxuICByb3dTb3J0czogTG1yUGl2b3RTb3J0W10sXG4gIHBpdm90RGF0YTogTG1yUGl2b3RTdGVtRGF0YSxcbiAgY29uc3RyYWludERhdGE6IENvbnN0cmFpbnREYXRhXG4pOiBMbXJQaXZvdERhdGFIZWFkZXJbXSB7XG4gIHJldHVybiBzb3J0UGl2b3REYXRhSGVhZGVyc1JlY3Vyc2l2ZShcbiAgICByb3dIZWFkZXJzLFxuICAgIDAsXG4gICAgcm93U29ydHMsXG4gICAgcGl2b3REYXRhLmNvbHVtbkhlYWRlcnMsXG4gICAgcGl2b3REYXRhLnZhbHVlcyxcbiAgICBwaXZvdERhdGEudmFsdWVUaXRsZXMgfHwgW10sXG4gICAgdHJ1ZSxcbiAgICBjb25zdHJhaW50RGF0YVxuICApO1xufVxuXG5mdW5jdGlvbiBzb3J0UGl2b3RDb2x1bW5EYXRhSGVhZGVycyhcbiAgY29sdW1uSGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIGNvbHVtblNvcnRzOiBMbXJQaXZvdFNvcnRbXSxcbiAgcGl2b3REYXRhOiBMbXJQaXZvdFN0ZW1EYXRhLFxuICBjb25zdHJhaW50RGF0YTogQ29uc3RyYWludERhdGFcbik6IExtclBpdm90RGF0YUhlYWRlcltdIHtcbiAgcmV0dXJuIHNvcnRQaXZvdERhdGFIZWFkZXJzUmVjdXJzaXZlKFxuICAgIGNvbHVtbkhlYWRlcnMsXG4gICAgMCxcbiAgICBjb2x1bW5Tb3J0cyxcbiAgICBwaXZvdERhdGEucm93SGVhZGVycyxcbiAgICBwaXZvdERhdGEudmFsdWVzLFxuICAgIHBpdm90RGF0YS52YWx1ZVRpdGxlcyB8fCBbXSxcbiAgICBmYWxzZSxcbiAgICBjb25zdHJhaW50RGF0YVxuICApO1xufVxuXG5mdW5jdGlvbiBzb3J0UGl2b3REYXRhSGVhZGVyc1JlY3Vyc2l2ZShcbiAgaGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIGluZGV4OiBudW1iZXIsXG4gIHNvcnRzOiBMbXJQaXZvdFNvcnRbXSxcbiAgb3RoZXJTaWRlSGVhZGVyczogTG1yUGl2b3REYXRhSGVhZGVyW10sXG4gIHZhbHVlczogYW55W11bXSxcbiAgdmFsdWVUaXRsZXM6IHN0cmluZ1tdLFxuICBpc1Jvd3M6IGJvb2xlYW4sXG4gIGNvbnN0cmFpbnREYXRhOiBDb25zdHJhaW50RGF0YVxuKTogTG1yUGl2b3REYXRhSGVhZGVyW10ge1xuICAvLyB3ZSBkb24ndCB3YW50IHRvIHNvcnQgdmFsdWVzIGhlYWRlcnNcbiAgaWYgKCFpc1Jvd3MgJiYgaXNWYWx1ZXNIZWFkZXJzKGhlYWRlcnMsIHZhbHVlVGl0bGVzKSkge1xuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG4gIGNvbnN0IHNvcnQgPSBzb3J0cyAmJiBzb3J0c1tpbmRleF07XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50Rm9yU29ydChzb3J0LCBoZWFkZXJzKTtcbiAgY29uc3QgdmFsdWVzTWFwID0gY3JlYXRlSGVhZGVyc1ZhbHVlc01hcChoZWFkZXJzLCBzb3J0LCBvdGhlclNpZGVIZWFkZXJzLCB2YWx1ZXMsIHZhbHVlVGl0bGVzLCBpc1Jvd3MpO1xuICByZXR1cm4gaGVhZGVyc1xuICAgIC5tYXAoaGVhZGVyID0+ICh7XG4gICAgICAuLi5oZWFkZXIsXG4gICAgICBjaGlsZHJlbjpcbiAgICAgICAgaGVhZGVyLmNoaWxkcmVuICYmXG4gICAgICAgIHNvcnRQaXZvdERhdGFIZWFkZXJzUmVjdXJzaXZlKFxuICAgICAgICAgIGhlYWRlci5jaGlsZHJlbixcbiAgICAgICAgICBpbmRleCArIDEsXG4gICAgICAgICAgc29ydHMsXG4gICAgICAgICAgb3RoZXJTaWRlSGVhZGVycyxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgdmFsdWVUaXRsZXMsXG4gICAgICAgICAgaXNSb3dzLFxuICAgICAgICAgIGNvbnN0cmFpbnREYXRhXG4gICAgICAgICksXG4gICAgfSkpXG4gICAgLnNvcnQoKHIxLCByMikgPT4ge1xuICAgICAgY29uc3QgcjFWYWx1ZSA9IGNvbnN0cmFpbnQuY3JlYXRlRGF0YVZhbHVlKHZhbHVlc01hcFtyMS50aXRsZV0sIGNvbnN0cmFpbnREYXRhKTtcbiAgICAgIGNvbnN0IHIyVmFsdWUgPSBjb25zdHJhaW50LmNyZWF0ZURhdGFWYWx1ZSh2YWx1ZXNNYXBbcjIudGl0bGVdLCBjb25zdHJhaW50RGF0YSk7XG4gICAgICBjb25zdCBtdWx0aXBsaWVyID0gIXNvcnQgfHwgc29ydC5hc2MgPyAxIDogLTE7XG4gICAgICByZXR1cm4gcjFWYWx1ZS5jb21wYXJlVG8ocjJWYWx1ZSkgKiBtdWx0aXBsaWVyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25zdHJhaW50Rm9yU29ydChzb3J0OiBMbXJQaXZvdFNvcnQsIGhlYWRlcnM6IExtclBpdm90RGF0YUhlYWRlcltdKTogQ29uc3RyYWludCB7XG4gIGlmICgoc29ydD8ubGlzdD8udmFsdWVzIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gc29ydCBpcyBkb25lIGJ5IHZhbHVlcyBpbiBjb2x1bW5zXG4gICAgcmV0dXJuIG5ldyBOdW1iZXJDb25zdHJhaW50KHt9KTtcbiAgfVxuICByZXR1cm4gKChoZWFkZXJzIHx8IFtdKVswXSAmJiAoaGVhZGVycyB8fCBbXSlbMF0uY29uc3RyYWludCkgfHwgbmV3IFVua25vd25Db25zdHJhaW50KCk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVzSGVhZGVycyhoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSwgdmFsdWVUaXRsZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWVUaXRsZXMubGVuZ3RoID4gMSAmJlxuICAgIChoZWFkZXJzIHx8IFtdKS5ldmVyeShcbiAgICAgIChoZWFkZXIsIGluZGV4KSA9PiBpc05vdE51bGxPclVuZGVmaW5lZChoZWFkZXIudGFyZ2V0SW5kZXgpICYmIGhlYWRlci50aXRsZSA9PT0gdmFsdWVUaXRsZXNbaW5kZXhdXG4gICAgKVxuICApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIZWFkZXJzVmFsdWVzTWFwKFxuICBoZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgc29ydDogTG1yUGl2b3RTb3J0LFxuICBvdGhlclNpZGVIZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgdmFsdWVzOiBhbnlbXVtdLFxuICB2YWx1ZVRpdGxlczogc3RyaW5nW10sXG4gIGlzUm93czogYm9vbGVhblxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IHNvcnRUYXJnZXRJbmRleGVzID0gc29ydFZhbHVlVGFyZ2V0SW5kZXhlcyhzb3J0LCBvdGhlclNpZGVIZWFkZXJzLCB2YWx1ZVRpdGxlcyk7XG4gIGlmICghc29ydFRhcmdldEluZGV4ZXMpIHtcbiAgICByZXR1cm4gKGhlYWRlcnMgfHwgW10pLnJlZHVjZSgodmFsdWVzTWFwLCBoZWFkZXIpID0+IHtcbiAgICAgIHZhbHVlc01hcFtoZWFkZXIudGl0bGVdID0gaGVhZGVyLnRpdGxlO1xuICAgICAgcmV0dXJuIHZhbHVlc01hcDtcbiAgICB9LCB7fSk7XG4gIH1cblxuICByZXR1cm4gKGhlYWRlcnMgfHwgW10pLnJlZHVjZSgodmFsdWVzTWFwLCBoZWFkZXIpID0+IHtcbiAgICBjb25zdCByb3dzID0gaXNSb3dzID8gZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcihoZWFkZXIpIDogc29ydFRhcmdldEluZGV4ZXM7XG4gICAgY29uc3QgY29sdW1ucyA9IGlzUm93cyA/IHNvcnRUYXJnZXRJbmRleGVzIDogZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcihoZWFkZXIpO1xuICAgIHZhbHVlc01hcFtoZWFkZXIudGl0bGVdID0gZ2V0TnVtZXJpY1ZhbHVlc1N1bW1hcnkodmFsdWVzLCByb3dzLCBjb2x1bW5zKTtcbiAgICByZXR1cm4gdmFsdWVzTWFwO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGdldE51bWVyaWNWYWx1ZXNTdW1tYXJ5KHZhbHVlczogYW55W11bXSwgcm93czogbnVtYmVyW10sIGNvbHVtbnM6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tyb3ddW2NvbHVtbl07XG4gICAgICBpZiAoaXNOb3ROdWxsT3JVbmRlZmluZWQodmFsdWUpICYmIGlzTnVtZXJpYyh2YWx1ZSkpIHtcbiAgICAgICAgc3VtICs9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1bTtcbn1cblxuZnVuY3Rpb24gc29ydFZhbHVlVGFyZ2V0SW5kZXhlcyhcbiAgc29ydDogTG1yUGl2b3RTb3J0LFxuICBvdGhlclNpZGVIZWFkZXJzOiBMbXJQaXZvdERhdGFIZWFkZXJbXSxcbiAgdmFsdWVUaXRsZXM6IHN0cmluZ1tdXG4pOiBudW1iZXJbXSB8IG51bGwge1xuICBpZiAoc29ydCAmJiBzb3J0Lmxpc3QpIHtcbiAgICBsZXQgdmFsdWVJbmRleCA9IHZhbHVlVGl0bGVzLmZpbmRJbmRleCh0aXRsZSA9PiB0aXRsZSA9PT0gc29ydC5saXN0LnZhbHVlVGl0bGUpO1xuICAgIGlmICh2YWx1ZUluZGV4ID09PSAtMSkge1xuICAgICAgaWYgKHZhbHVlVGl0bGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB2YWx1ZUluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwaXZvdEhlYWRlcjogTG1yUGl2b3REYXRhSGVhZGVyID0gbnVsbDtcbiAgICBsZXQgY3VycmVudE90aGVyU2lkZUhlYWRlcnMgPSBvdGhlclNpZGVIZWFkZXJzO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc29ydC5saXN0LnZhbHVlcyB8fCBbXSkge1xuICAgICAgaWYgKHZhbHVlLmlzU3VtbWFyeSkge1xuICAgICAgICBjb25zdCBpbmRleGVzID0gZ2V0VGFyZ2V0SW5kZXhlc0ZvckhlYWRlcnMoY3VycmVudE90aGVyU2lkZUhlYWRlcnMgfHwgW10pIHx8IFtdO1xuICAgICAgICByZXR1cm4gZmlsdGVySW5kZXhlc0J5TW9kKGluZGV4ZXMsIHZhbHVlVGl0bGVzLmxlbmd0aCwgdmFsdWVJbmRleCk7XG4gICAgICB9XG5cbiAgICAgIHBpdm90SGVhZGVyID0gKGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzIHx8IFtdKS5maW5kKGhlYWRlciA9PiBoZWFkZXIudGl0bGUgPT09IHZhbHVlLnRpdGxlKTtcbiAgICAgIGlmICghcGl2b3RIZWFkZXIpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzID0gcGl2b3RIZWFkZXIuY2hpbGRyZW4gfHwgW107XG4gICAgfVxuXG4gICAgaWYgKHBpdm90SGVhZGVyKSB7XG4gICAgICBjb25zdCB0YXJnZXRJbmRleGVzID0gaXNOb3ROdWxsT3JVbmRlZmluZWQocGl2b3RIZWFkZXIudGFyZ2V0SW5kZXgpXG4gICAgICAgID8gW3Bpdm90SGVhZGVyLnRhcmdldEluZGV4XVxuICAgICAgICA6IGdldFRhcmdldEluZGV4ZXNGb3JIZWFkZXJzKGN1cnJlbnRPdGhlclNpZGVIZWFkZXJzKTtcbiAgICAgIHJldHVybiBmaWx0ZXJJbmRleGVzQnlNb2QodGFyZ2V0SW5kZXhlcywgdmFsdWVUaXRsZXMubGVuZ3RoLCB2YWx1ZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmlsdGVySW5kZXhlc0J5TW9kKGluZGV4ZXM6IG51bWJlcltdLCBtb2Q6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIChpbmRleGVzIHx8IFtdKS5maWx0ZXIoaW5kZXggPT4gaW5kZXggJSBtb2QgPT09IHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZGl2aWRlVmFsdWVzKHZhbHVlOiBhbnksIGRpdmlkZXI6IGFueSk6IG51bWJlciB7XG4gIGlmIChpc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChpc051bWVyaWModmFsdWUpICYmIGlzTnVtZXJpYyhkaXZpZGVyKSkge1xuICAgIGlmIChkaXZpZGVyICE9PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWUgLyBkaXZpZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJdfQ==