igniteui-angular 14.1.0-alpha.1 → 14.1.0-alpha.2

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.
@@ -1,4 +1,4 @@
1
- import { Directive, Optional, Input, NgModule, Host, Inject } from '@angular/core';
1
+ import { Directive, Optional, Input, NgModule, Host, Inject, Output, EventEmitter } from '@angular/core';
2
2
  import { FilteringExpressionsTree } from '../data-operations/filtering-expressions-tree';
3
3
  import { IgxColumnComponent } from './columns/column.component';
4
4
  import { IgxColumnGroupComponent } from './columns/column-group.component';
@@ -6,6 +6,10 @@ import { GridColumnDataType } from '../data-operations/data-util';
6
6
  import { IgxBooleanFilteringOperand, IgxNumberFilteringOperand, IgxDateFilteringOperand, IgxStringFilteringOperand, IgxDateTimeFilteringOperand } from '../data-operations/filtering-condition';
7
7
  import { IgxGridComponent } from './grid/grid.component';
8
8
  import { IGX_GRID_BASE } from './common/grid.interface';
9
+ import { IgxPivotGridComponent } from './pivot-grid/pivot-grid.component';
10
+ import { PivotUtil } from './pivot-grid/pivot-util';
11
+ import { IgxPivotDateDimension } from './pivot-grid/pivot-grid-dimensions';
12
+ import { cloneArray, cloneValue } from '../core/utils';
9
13
  import * as i0 from "@angular/core";
10
14
  export class IgxGridStateDirective {
11
15
  /**
@@ -29,7 +33,8 @@ export class IgxGridStateDirective {
29
33
  rowPinning: true,
30
34
  expansion: true,
31
35
  moving: true,
32
- rowIslands: true
36
+ rowIslands: true,
37
+ pivotConfiguration: true
33
38
  };
34
39
  this.FEATURES = {
35
40
  sorting: {
@@ -230,7 +235,7 @@ export class IgxGridStateDirective {
230
235
  },
231
236
  rowPinning: {
232
237
  getFeatureState: (context) => {
233
- const pinned = context.currGrid.pinnedRows.map(x => x.key);
238
+ const pinned = context.currGrid.pinnedRows?.map(x => x.key);
234
239
  return { rowPinning: pinned };
235
240
  },
236
241
  restoreFeatureState: (context, state) => {
@@ -303,8 +308,44 @@ export class IgxGridStateDirective {
303
308
  }
304
309
  return grid.gridAPI.getParentRowId(childGrid);
305
310
  }
311
+ },
312
+ pivotConfiguration: {
313
+ getFeatureState(context) {
314
+ const config = context.currGrid.pivotConfiguration;
315
+ if (!config || !(context.currGrid instanceof IgxPivotGridComponent)) {
316
+ return { pivotConfiguration: undefined };
317
+ }
318
+ const configCopy = cloneValue(config);
319
+ configCopy.rows = cloneArray(config.rows, true);
320
+ configCopy.columns = cloneArray(config.columns, true);
321
+ configCopy.filters = cloneArray(config.filters, true);
322
+ const dims = [...(configCopy.rows || []), ...(configCopy.columns || []), ...(configCopy.filters || [])];
323
+ const dateDimensions = dims.filter(x => context.isDateDimension(x));
324
+ dateDimensions?.forEach(dim => {
325
+ // do not serialize the grid resource strings. This would pollute the object with unnecessary data.
326
+ dim.resourceStrings = {};
327
+ });
328
+ return { pivotConfiguration: configCopy };
329
+ },
330
+ restoreFeatureState(context, state) {
331
+ const config = state;
332
+ if (!config || !(context.currGrid instanceof IgxPivotGridComponent)) {
333
+ return;
334
+ }
335
+ context.restoreValues(config, context.currGrid);
336
+ context.restoreDimensions(config, context.currGrid);
337
+ context.currGrid.pivotConfiguration = config;
338
+ },
306
339
  }
307
340
  };
341
+ /**
342
+ * Event emitted when set state is called with a string.
343
+ * Returns the parsed state object so that it can be further modified before applying to the grid.
344
+ * ```typescript
345
+ * this.state.stateParsed.subscribe(parsedState => parsedState.sorting.forEach(x => x.strategy = NoopSortingStrategy.instance()});
346
+ * ```
347
+ */
348
+ this.stateParsed = new EventEmitter();
308
349
  }
309
350
  /**
310
351
  * An object with options determining if a certain feature state should be saved.
@@ -367,6 +408,7 @@ export class IgxGridStateDirective {
367
408
  setState(state, features) {
368
409
  if (typeof state === 'string') {
369
410
  state = JSON.parse(state);
411
+ this.stateParsed.emit(state);
370
412
  }
371
413
  this.state = state;
372
414
  this.currGrid = this.grid;
@@ -426,6 +468,65 @@ export class IgxGridStateDirective {
426
468
  this.featureKeys.push(keys);
427
469
  }
428
470
  }
471
+ /**
472
+ * This method restores complex objects in the pivot dimensions
473
+ * Like the IgxPivotDateDimension and filters.
474
+ */
475
+ restoreDimensions(config, grid) {
476
+ const collections = [config.rows, config.columns, config.filters];
477
+ for (const collection of collections) {
478
+ for (let index = 0; index < collection?.length; index++) {
479
+ const dim = collection[index];
480
+ if (this.isDateDimension(dim)) {
481
+ this.restoreDateDimension(dim);
482
+ }
483
+ // restore complex filters
484
+ if (dim.filter) {
485
+ dim.filter = this.createExpressionsTreeFromObject(dim.filter);
486
+ }
487
+ }
488
+ }
489
+ }
490
+ /**
491
+ * This method restores the IgxPivotDateDimension with its default functions and resource strings.
492
+ */
493
+ restoreDateDimension(dim) {
494
+ const dateDim = new IgxPivotDateDimension(dim.inBaseDimension, dim.inOptions);
495
+ // restore functions and resource strings
496
+ dim.resourceStrings = dateDim.resourceStrings;
497
+ dim.memberFunction = dateDim.memberFunction;
498
+ let currDim = dim;
499
+ let originDim = dateDim;
500
+ while (currDim.childLevel) {
501
+ currDim = currDim.childLevel;
502
+ originDim = originDim.childLevel;
503
+ currDim.memberFunction = originDim.memberFunction;
504
+ }
505
+ }
506
+ /**
507
+ * Returns if this is a IgxPivotDateDimension.
508
+ */
509
+ isDateDimension(dim) {
510
+ return dim.inBaseDimension;
511
+ }
512
+ /**
513
+ * This method restores complex objects in the pivot values.
514
+ * Like the default aggregator methods.
515
+ */
516
+ restoreValues(config, grid) {
517
+ // restore aggregator func if it matches the default aggregators key and label
518
+ const values = config.values;
519
+ for (const value of values) {
520
+ const aggregateList = value.aggregateList;
521
+ const aggregators = PivotUtil.getAggregatorsForValue(value, grid);
522
+ value.aggregate.aggregator = aggregators.find(x => x.key === value.aggregate.key && x.label === value.aggregate.label)?.aggregator;
523
+ if (aggregateList) {
524
+ for (const ag of aggregateList) {
525
+ ag.aggregator = aggregators.find(x => x.key === ag.key && x.label === ag.label)?.aggregator;
526
+ }
527
+ }
528
+ }
529
+ }
429
530
  /**
430
531
  * This method builds a FilteringExpressionsTree from a provided object.
431
532
  */
@@ -443,7 +544,10 @@ export class IgxGridStateDirective {
443
544
  else {
444
545
  const expr = item;
445
546
  let dataType;
446
- if (this.currGrid.columns.length > 0) {
547
+ if (this.currGrid instanceof IgxPivotGridComponent) {
548
+ dataType = this.currGrid.allDimensions.find(x => x.memberName === expr.fieldName).dataType;
549
+ }
550
+ else if (this.currGrid.columns.length > 0) {
447
551
  dataType = this.currGrid.columns.find(c => c.field === expr.fieldName).dataType;
448
552
  }
449
553
  else if (this.state.columns) {
@@ -508,7 +612,7 @@ export class IgxGridStateDirective {
508
612
  }
509
613
  }
510
614
  IgxGridStateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: IgxGridStateDirective, deps: [{ token: IGX_GRID_BASE, host: true, optional: true }, { token: i0.ComponentFactoryResolver }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
511
- IgxGridStateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.1.1", type: IgxGridStateDirective, selector: "[igxGridState]", inputs: { options: ["igxGridState", "options"] }, ngImport: i0 });
615
+ IgxGridStateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.1.1", type: IgxGridStateDirective, selector: "[igxGridState]", inputs: { options: ["igxGridState", "options"] }, outputs: { stateParsed: "stateParsed" }, ngImport: i0 });
512
616
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: IgxGridStateDirective, decorators: [{
513
617
  type: Directive,
514
618
  args: [{
@@ -521,7 +625,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImpor
521
625
  }, {
522
626
  type: Inject,
523
627
  args: [IGX_GRID_BASE]
524
- }] }, { type: i0.ComponentFactoryResolver }, { type: i0.ViewContainerRef }]; }, propDecorators: { options: [{
628
+ }] }, { type: i0.ComponentFactoryResolver }, { type: i0.ViewContainerRef }]; }, propDecorators: { stateParsed: [{
629
+ type: Output
630
+ }], options: [{
525
631
  type: Input,
526
632
  args: ['igxGridState']
527
633
  }] } });
@@ -540,4 +646,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImpor
540
646
  exports: [IgxGridStateDirective]
541
647
  }]
542
648
  }] });
543
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL3N0YXRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBOEMsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ILE9BQU8sRUFBRSx3QkFBd0IsRUFBNkIsTUFBTSwrQ0FBK0MsQ0FBQztBQUVwSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUczRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQ0gsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQzlFLHlCQUF5QixFQUF1QiwyQkFBMkIsRUFDOUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUdoRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQU16RCxPQUFPLEVBQVksYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBK0VsRSxNQUFNLE9BQU8scUJBQXFCO0lBOFQ5Qjs7T0FFRztJQUNILFlBQ3NELElBQWMsRUFDeEQsUUFBa0MsRUFDbEMsT0FBeUI7UUFGaUIsU0FBSSxHQUFKLElBQUksQ0FBVTtRQUN4RCxhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQWpVN0IsZ0JBQVcsR0FBbUIsRUFBRSxDQUFDO1FBR2pDLGFBQVEsR0FBc0I7WUFDbEMsT0FBTyxFQUFFLElBQUk7WUFDYixTQUFTLEVBQUUsSUFBSTtZQUNmLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsT0FB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Z0JBQWdCO2lCQUM3Qjs7MEJBbVVRLElBQUk7OzBCQUFJLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsYUFBYTtrSEFqQmxDLE9BQU87c0JBRGpCLEtBQUs7dUJBQUMsY0FBYzs7QUFtTnpCOztHQUVHO0FBS0gsTUFBTSxPQUFPLGtCQUFrQjs7K0dBQWxCLGtCQUFrQjtnSEFBbEIsa0JBQWtCLGlCQTFnQmxCLHFCQUFxQixhQUFyQixxQkFBcUI7Z0hBMGdCckIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBSjlCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ3JDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO2lCQUNuQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgT3B0aW9uYWwsIElucHV0LCBOZ01vZHVsZSwgSG9zdCwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBWaWV3Q29udGFpbmVyUmVmLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29sdW1uR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJR3JvdXBpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2dyb3VwaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElQYWdpbmdTdGF0ZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9wYWdpbmctc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHtcbiAgICBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZCwgSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZCwgSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCwgSUZpbHRlcmluZ09wZXJhdGlvbiwgSWd4RGF0ZVRpbWVGaWx0ZXJpbmdPcGVyYW5kXG59IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IElHcm91cEJ5RXhwYW5kU3RhdGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1leHBhbmQtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcm91cGluZ1N0YXRlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2dyb3VwYnktc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneEdyaWRDb21wb25lbnQgfSBmcm9tICcuL2dyaWQvZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQvaGllcmFyY2hpY2FsLWdyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IElQaW5uaW5nQ29uZmlnIH0gZnJvbSAnLi9ncmlkLmNvbW1vbic7XG5pbXBvcnQgeyBkZWxheSwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEdyaWRTZWxlY3Rpb25SYW5nZSB9IGZyb20gJy4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IElTb3J0aW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IEdyaWRUeXBlLCBJR1hfR1JJRF9CQVNFIH0gZnJvbSAnLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkU3RhdGUge1xuICAgIGNvbHVtbnM/OiBJQ29sdW1uU3RhdGVbXTtcbiAgICBmaWx0ZXJpbmc/OiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIGFkdmFuY2VkRmlsdGVyaW5nPzogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICBwYWdpbmc/OiBJUGFnaW5nU3RhdGU7XG4gICAgbW92aW5nPzogYm9vbGVhbjtcbiAgICBzb3J0aW5nPzogSVNvcnRpbmdFeHByZXNzaW9uW107XG4gICAgZ3JvdXBCeT86IElHcm91cGluZ1N0YXRlO1xuICAgIGNlbGxTZWxlY3Rpb24/OiBHcmlkU2VsZWN0aW9uUmFuZ2VbXTtcbiAgICByb3dTZWxlY3Rpb24/OiBhbnlbXTtcbiAgICBjb2x1bW5TZWxlY3Rpb24/OiBzdHJpbmdbXTtcbiAgICByb3dQaW5uaW5nPzogYW55W107XG4gICAgcGlubmluZ0NvbmZpZz86IElQaW5uaW5nQ29uZmlnO1xuICAgIGV4cGFuc2lvbj86IGFueVtdO1xuICAgIHJvd0lzbGFuZHM/OiBJR3JpZFN0YXRlQ29sbGVjdGlvbltdO1xuICAgIGlkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkU3RhdGVDb2xsZWN0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHBhcmVudFJvd0lEOiBhbnk7XG4gICAgc3RhdGU6IElHcmlkU3RhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZU9wdGlvbnMge1xuICAgIGNvbHVtbnM/OiBib29sZWFuO1xuICAgIGZpbHRlcmluZz86IGJvb2xlYW47XG4gICAgYWR2YW5jZWRGaWx0ZXJpbmc/OiBib29sZWFuO1xuICAgIHNvcnRpbmc/OiBib29sZWFuO1xuICAgIGdyb3VwQnk/OiBib29sZWFuO1xuICAgIHBhZ2luZz86IGJvb2xlYW47XG4gICAgY2VsbFNlbGVjdGlvbj86IGJvb2xlYW47XG4gICAgcm93U2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgICBjb2x1bW5TZWxlY3Rpb24/OiBib29sZWFuO1xuICAgIHJvd1Bpbm5pbmc/OiBib29sZWFuO1xuICAgIHBpbm5pbmdDb25maWc/OiBib29sZWFuO1xuICAgIGV4cGFuc2lvbj86IGJvb2xlYW47XG4gICAgcm93SXNsYW5kcz86IGJvb2xlYW47XG4gICAgbW92aW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29sdW1uU3RhdGUge1xuICAgIHBpbm5lZDogYm9vbGVhbjtcbiAgICBzb3J0YWJsZTogYm9vbGVhbjtcbiAgICBmaWx0ZXJhYmxlOiBib29sZWFuO1xuICAgIGVkaXRhYmxlOiBib29sZWFuO1xuICAgIHNvcnRpbmdJZ25vcmVDYXNlOiBib29sZWFuO1xuICAgIGZpbHRlcmluZ0lnbm9yZUNhc2U6IGJvb2xlYW47XG4gICAgaGVhZGVyQ2xhc3Nlczogc3RyaW5nO1xuICAgIGhlYWRlckdyb3VwQ2xhc3Nlczogc3RyaW5nO1xuICAgIG1heFdpZHRoOiBzdHJpbmc7XG4gICAgZ3JvdXBhYmxlOiBib29sZWFuO1xuICAgIG1vdmFibGU6IGJvb2xlYW47XG4gICAgaGlkZGVuOiBib29sZWFuO1xuICAgIGRhdGFUeXBlOiBHcmlkQ29sdW1uRGF0YVR5cGU7XG4gICAgaGFzU3VtbWFyeTogYm9vbGVhbjtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIHdpZHRoOiBhbnk7XG4gICAgaGVhZGVyOiBzdHJpbmc7XG4gICAgcmVzaXphYmxlOiBib29sZWFuO1xuICAgIHNlYXJjaGFibGU6IGJvb2xlYW47XG4gICAgY29sdW1uR3JvdXA6IGJvb2xlYW47XG4gICAgcGFyZW50OiBhbnk7XG4gICAgZGlzYWJsZUhpZGluZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgR3JpZEZlYXR1cmVzID0ga2V5b2YgSUdyaWRTdGF0ZU9wdGlvbnM7XG5cbmludGVyZmFjZSBGZWF0dXJlIHtcbiAgICBnZXRGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpID0+IElHcmlkU3RhdGU7XG4gICAgcmVzdG9yZUZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgc3RhdGU6IElDb2x1bW5TdGF0ZVtdIHwgSVBhZ2luZ1N0YXRlIHwgYm9vbGVhbiB8IElTb3J0aW5nRXhwcmVzc2lvbltdIHxcbiAgICAgICAgSUdyb3VwaW5nU3RhdGUgfCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHwgR3JpZFNlbGVjdGlvblJhbmdlW10gfCBJUGlubmluZ0NvbmZpZyB8IGFueVtdKSA9PiB2b2lkO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hHcmlkU3RhdGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUge1xuICAgIHByaXZhdGUgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX29wdGlvbnM6IElHcmlkU3RhdGVPcHRpb25zIHwgJyc7XG5cbiAgICBwcml2YXRlIGZlYXR1cmVLZXlzOiBHcmlkRmVhdHVyZXNbXSA9IFtdO1xuICAgIHByaXZhdGUgc3RhdGU6IElHcmlkU3RhdGU7XG4gICAgcHJpdmF0ZSBjdXJyR3JpZDogR3JpZFR5cGU7XG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSUdyaWRTdGF0ZU9wdGlvbnMgPSB7XG4gICAgICAgIGNvbHVtbnM6IHRydWUsXG4gICAgICAgIGZpbHRlcmluZzogdHJ1ZSxcbiAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmc6IHRydWUsXG4gICAgICAgIHNvcnRpbmc6IHRydWUsXG4gICAgICAgIGdyb3VwQnk6IHRydWUsXG4gICAgICAgIHBhZ2luZzogdHJ1ZSxcbiAgICAgICAgY2VsbFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgcm93U2VsZWN0aW9uOiB0cnVlLFxuICAgICAgICBjb2x1bW5TZWxlY3Rpb246IHRydWUsXG4gICAgICAgIHJvd1Bpbm5pbmc6IHRydWUsXG4gICAgICAgIGV4cGFuc2lvbjogdHJ1ZSxcbiAgICAgICAgbW92aW5nOiB0cnVlLFxuICAgICAgICByb3dJc2xhbmRzOiB0cnVlXG4gICAgfTtcbiAgICBwcml2YXRlIEZFQVRVUkVTID0ge1xuICAgICAgICBzb3J0aW5nOiAge1xuICAgICAgICAgICAgZ2V0RmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGluZ1N0YXRlID0gY29udGV4dC5jdXJyR3JpZC5zb3J0aW5nRXhwcmVzc2lvbnM7XG4gICAgICAgICAgICAgICAgc29ydGluZ1N0YXRlLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzLnN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcy5vd25lcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzb3J0aW5nOiBzb3J0aW5nU3RhdGUgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXN0b3JlRmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCBzdGF0ZTogSVNvcnRpbmdFeHByZXNzaW9uW10pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLnNvcnRpbmdFeHByZXNzaW9ucyA9IHN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXJpbmc6IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmluZ1N0YXRlID0gY29udGV4dC5jdXJyR3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmluZ1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWx0ZXJpbmdTdGF0ZS5vd25lcjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGZpbHRlcmluZ1N0YXRlLmZpbHRlcmluZ09wZXJhbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgKGl0ZW0gYXMgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkub3duZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZmlsdGVyaW5nOiBmaWx0ZXJpbmdTdGF0ZSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJUcmVlID0gY29udGV4dC5jcmVhdGVFeHByZXNzaW9uc1RyZWVGcm9tT2JqZWN0KHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlclRyZWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhZHZhbmNlZEZpbHRlcmluZzoge1xuICAgICAgICAgICAgZ2V0RmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyaW5nU3RhdGUgPSBjb250ZXh0LmN1cnJHcmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgICAgIGxldCBhZHZhbmNlZEZpbHRlcmluZzogYW55O1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJpbmdTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgZmlsdGVyaW5nU3RhdGUub3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIChpdGVtIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpLm93bmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkdmFuY2VkRmlsdGVyaW5nID0gZmlsdGVyaW5nU3RhdGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmcgPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgYWR2YW5jZWRGaWx0ZXJpbmcgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXN0b3JlRmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCBzdGF0ZTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVHJlZSA9IGNvbnRleHQuY3JlYXRlRXhwcmVzc2lvbnNUcmVlRnJvbU9iamVjdChzdGF0ZSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlclRyZWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb2x1bW5zOiB7XG4gICAgICAgICAgICBnZXRGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpOiBJR3JpZFN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkQ29sdW1uczogSUNvbHVtblN0YXRlW10gPSBjb250ZXh0LmN1cnJHcmlkLmNvbHVtbnMubWFwKChjKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBwaW5uZWQ6IGMucGlubmVkLFxuICAgICAgICAgICAgICAgICAgICBzb3J0YWJsZTogYy5zb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyYWJsZTogYy5maWx0ZXJhYmxlLFxuICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogYy5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc29ydGluZ0lnbm9yZUNhc2U6IGMuc29ydGluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZ0lnbm9yZUNhc2U6IGMuZmlsdGVyaW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NlczogYy5oZWFkZXJDbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJHcm91cENsYXNzZXM6IGMuaGVhZGVyR3JvdXBDbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogYy5tYXhXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBhYmxlOiBjLmdyb3VwYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgbW92YWJsZTogYy5tb3ZhYmxlLFxuICAgICAgICAgICAgICAgICAgICBoaWRkZW46IGMuaGlkZGVuLFxuICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogYy5kYXRhVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgaGFzU3VtbWFyeTogYy5oYXNTdW1tYXJ5LFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYy5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcjogYy5oZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlc2l6YWJsZTogYy5yZXNpemFibGUsXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaGFibGU6IGMuc2VhcmNoYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogYy5zZWxlY3RhYmxlLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGMucGFyZW50ID8gYy5wYXJlbnQuaGVhZGVyIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uR3JvdXA6IGMuY29sdW1uR3JvdXAsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVIaWRpbmc6IGMuZGlzYWJsZUhpZGluZ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBncmlkQ29sdW1ucyB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBJQ29sdW1uU3RhdGVbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gY29udGV4dC5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShJZ3hDb2x1bW5Db21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRmFjdG9yeSA9IGNvbnRleHQucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uR3JvdXBDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmZvckVhY2goKGNvbFN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0NvbHVtbkdyb3VwID0gY29sU3RhdGUuY29sdW1uR3JvdXA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb2xTdGF0ZS5jb2x1bW5Hcm91cDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWYxID0gZ3JvdXBGYWN0b3J5LmNyZWF0ZShjb250ZXh0LnZpZXdSZWYuaW5qZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZWYxLmluc3RhbmNlLCBjb2xTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYxLmluc3RhbmNlLmdyaWQgPSBjb250ZXh0LmN1cnJHcmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZjEuaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uR3JvdXA6IElneENvbHVtbkdyb3VwQ29tcG9uZW50ID0gbmV3Q29sdW1ucy5maW5kKGUgPT4gZS5oZWFkZXIgPT09IHJlZjEuaW5zdGFuY2UucGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Hcm91cC5jaGlsZHJlbi5yZXNldChbLi4uY29sdW1uR3JvdXAuY2hpbGRyZW4udG9BcnJheSgpLCByZWYxLmluc3RhbmNlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS5pbnN0YW5jZS5wYXJlbnQgPSBjb2x1bW5Hcm91cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1ucy5wdXNoKHJlZjEuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmID0gZmFjdG9yeS5jcmVhdGUoY29udGV4dC52aWV3UmVmLmluamVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocmVmLmluc3RhbmNlLCBjb2xTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuaW5zdGFuY2UuZ3JpZCA9IGNvbnRleHQuY3VyckdyaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmLmluc3RhbmNlLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkdyb3VwOiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCA9IG5ld0NvbHVtbnMuZmluZChlID0+IGUuaGVhZGVyID09PSByZWYuaW5zdGFuY2UucGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLnBhcmVudCA9IGNvbHVtbkdyb3VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Hcm91cC5jaGlsZHJlbi5yZXNldChbLi4uY29sdW1uR3JvdXAuY2hpbGRyZW4udG9BcnJheSgpLCByZWYuaW5zdGFuY2VdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1ucy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLnVwZGF0ZUNvbHVtbnMobmV3Q29sdW1ucyk7XG4gICAgICAgICAgICAgICAgbmV3Q29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmN1cnJHcmlkIGFzIGFueSkuY29sdW1uSW5pdC5lbWl0KGNvbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdyb3VwQnk6IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBjb250ZXh0LmN1cnJHcmlkIGFzIElneEdyaWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBpbmdFeHByZXNzaW9ucyA9IGdyaWQuZ3JvdXBpbmdFeHByZXNzaW9ucztcbiAgICAgICAgICAgICAgICBncm91cGluZ0V4cHJlc3Npb25zLmZvckVhY2goZXhwciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBleHByLnN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGFuc2lvblN0YXRlID0gZ3JpZC5ncm91cGluZ0V4cGFuc2lvblN0YXRlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3Vwc0V4cGFuZGVkID0gZ3JpZC5ncm91cHNFeHBhbmRlZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGdyb3VwQnk6IHsgZXhwcmVzc2lvbnM6IGdyb3VwaW5nRXhwcmVzc2lvbnMsIGV4cGFuc2lvbjogZXhwYW5zaW9uU3RhdGUsIGRlZmF1bHRFeHBhbmRlZDogZ3JvdXBzRXhwYW5kZWR9ICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBJR3JvdXBpbmdTdGF0ZSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBjb250ZXh0LmN1cnJHcmlkIGFzIElneEdyaWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgZ3JpZC5ncm91cGluZ0V4cHJlc3Npb25zID0gc3RhdGUuZXhwcmVzc2lvbnMgYXMgSUdyb3VwaW5nRXhwcmVzc2lvbltdO1xuICAgICAgICAgICAgICAgIGlmIChncmlkLmdyb3Vwc0V4cGFuZGVkICE9PSBzdGF0ZS5kZWZhdWx0RXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JpZC50b2dnbGVBbGxHcm91cFJvd3MoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBncmlkLmdyb3VwaW5nRXhwYW5zaW9uU3RhdGUgPSBzdGF0ZS5leHBhbnNpb24gYXMgSUdyb3VwQnlFeHBhbmRTdGF0ZVtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICBnZXRGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpOiBJR3JpZFN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdpbmdTdGF0ZSA9IGNvbnRleHQuY3VyckdyaWQucGFnaW5nU3RhdGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFnaW5nOiBwYWdpbmdTdGF0ZSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBJUGFnaW5nU3RhdGUpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuY3VyckdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuY3VyckdyaWQucGFnaW5hdG9yLnBlclBhZ2UgIT09IHN0YXRlLnJlY29yZHNQZXJQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQucGFnaW5hdG9yLnBlclBhZ2UgPSBzdGF0ZS5yZWNvcmRzUGVyUGFnZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZC5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLnBhZ2luYXRvci5wYWdlID0gc3RhdGUuaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vdmluZzoge1xuICAgICAgICAgICAgZ2V0RmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbW92aW5nOiBjb250ZXh0LmN1cnJHcmlkLm1vdmluZyB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZC5tb3ZpbmcgPSBzdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcm93U2VsZWN0aW9uOiB7XG4gICAgICAgICAgICBnZXRGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpOiBJR3JpZFN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBjb250ZXh0LmN1cnJHcmlkLnNlbGVjdGVkUm93cztcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dTZWxlY3Rpb246IHNlbGVjdGlvbiB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQuc2VsZWN0Um93cyhzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNlbGxTZWxlY3Rpb246IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNvbnRleHQuY3VyckdyaWQuZ2V0U2VsZWN0ZWRSYW5nZXMoKS5tYXAocmFuZ2UgPT5cbiAgICAgICAgICAgICAgICAgICAgKHsgcm93U3RhcnQ6IHJhbmdlLnJvd1N0YXJ0LCByb3dFbmQ6IHJhbmdlLnJvd0VuZCwgY29sdW1uU3RhcnQ6IHJhbmdlLmNvbHVtblN0YXJ0LCBjb2x1bW5FbmQ6IHJhbmdlLmNvbHVtbkVuZCB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbFNlbGVjdGlvbjogc2VsZWN0aW9uIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdG9yZUZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgc3RhdGU6IEdyaWRTZWxlY3Rpb25SYW5nZVtdKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdGUuZm9yRWFjaChyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB7IHJvd1N0YXJ0OiByLnJvd1N0YXJ0LCByb3dFbmQ6IHIucm93RW5kLCBjb2x1bW5TdGFydDogci5jb2x1bW5TdGFydCwgY29sdW1uRW5kOiByLmNvbHVtbkVuZH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQuc2VsZWN0UmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb2x1bW5TZWxlY3Rpb246IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNvbnRleHQuY3VyckdyaWQuc2VsZWN0ZWRDb2x1bW5zKCkubWFwKGMgPT4gYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY29sdW1uU2VsZWN0aW9uOiBzZWxlY3Rpb24gfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXN0b3JlRmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCBzdGF0ZTogc3RyaW5nW10pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQuc2VsZWN0Q29sdW1ucyhzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJvd1Bpbm5pbmc6IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZCA9IGNvbnRleHQuY3VyckdyaWQucGlubmVkUm93cy5tYXAoeCA9PiB4LmtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93UGlubmluZzogcGlubmVkIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdG9yZUZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgc3RhdGU6IGFueVtdKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY2xlYXIgY3VycmVudCBzdGF0ZS5cbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLnBpbm5lZFJvd3MuZm9yRWFjaChyb3cgPT4gcm93LnVucGluKCkpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmZvckVhY2gocm93SUQgPT4gY29udGV4dC5jdXJyR3JpZC5waW5Sb3cocm93SUQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcGlubmluZ0NvbmZpZzoge1xuICAgICAgICAgICAgZ2V0RmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSA9PiAoeyBwaW5uaW5nQ29uZmlnOiBjb250ZXh0LmN1cnJHcmlkLnBpbm5pbmcgfSksXG4gICAgICAgICAgICByZXN0b3JlRmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCBzdGF0ZTogSVBpbm5pbmdDb25maWcpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLnBpbm5pbmcgPSBzdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXhwYW5zaW9uOiB7XG4gICAgICAgICAgICBnZXRGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpOiBJR3JpZFN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBhbnNpb25TdGF0ZXMgPSBBcnJheS5mcm9tKGNvbnRleHQuY3VyckdyaWQuZXhwYW5zaW9uU3RhdGVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBleHBhbnNpb246IGV4cGFuc2lvblN0YXRlcyB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZC5leHBhbnNpb25TdGF0ZXMgPSBleHBhbnNpb25TdGF0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJvd0lzbGFuZHM6IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZShjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpOiBJR3JpZFN0YXRlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEdyaWRTdGF0ZXM6IElHcmlkU3RhdGVDb2xsZWN0aW9uW10gPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJc2xhbmRzID0gKGNvbnRleHQuY3VyckdyaWQgYXMgYW55KS5hbGxMYXlvdXRMaXN0O1xuICAgICAgICAgICAgICAgIGlmIChyb3dJc2xhbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0lzbGFuZHMuZm9yRWFjaChyb3dJc2xhbmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRHcmlkcyA9IHJvd0lzbGFuZC5yb3dJc2xhbmRBUEkuZ2V0Q2hpbGRHcmlkcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRHcmlkcy5mb3JFYWNoKGNoR3JpZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Um93SUQgPSB0aGlzLmdldFBhcmVudFJvd0lEKGNoR3JpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZCA9IGNoR3JpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5jdXJyR3JpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEdyaWRTdGF0ZSA9IGNvbnRleHQuYnVpbGRTdGF0ZShjb250ZXh0LmZlYXR1cmVLZXlzKSBhcyBJR3JpZFN0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEdyaWRTdGF0ZXMucHVzaCh7IGlkOiBgJHtyb3dJc2xhbmQuaWR9YCwgcGFyZW50Um93SUQsIHN0YXRlOiBjaGlsZEdyaWRTdGF0ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQgPSBjb250ZXh0LmdyaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SXNsYW5kczogY2hpbGRHcmlkU3RhdGVzIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdG9yZUZlYXR1cmVTdGF0ZShjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJc2xhbmRzID0gKGNvbnRleHQuY3VyckdyaWQgYXMgYW55KS5hbGxMYXlvdXRMaXN0O1xuICAgICAgICAgICAgICAgIGlmIChyb3dJc2xhbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0lzbGFuZHMuZm9yRWFjaChyb3dJc2xhbmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRHcmlkcyA9IHJvd0lzbGFuZC5yb3dJc2xhbmRBUEkuZ2V0Q2hpbGRHcmlkcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRHcmlkcy5mb3JFYWNoKGNoR3JpZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Um93SUQgPSB0aGlzLmdldFBhcmVudFJvd0lEKGNoR3JpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZCA9IGNoR3JpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEdyaWRTdGF0ZSA9IHN0YXRlLmZpbmQoc3QgPT4gc3QuaWQgPT09IHJvd0lzbGFuZC5pZCAmJiBzdC5wYXJlbnRSb3dJRCA9PT0gcGFyZW50Um93SUQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEdyaWRTdGF0ZSAmJiBjb250ZXh0LmN1cnJHcmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVzdG9yZUdyaWRTdGF0ZShjaGlsZEdyaWRTdGF0ZS5zdGF0ZSwgY29udGV4dC5mZWF0dXJlS2V5cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkID0gY29udGV4dC5ncmlkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVHJhdmVyc2VzIHRoZSBoaWVyYXJjaHkgdXAgdG8gdGhlIHJvb3QgZ3JpZCB0byByZXR1cm4gdGhlIElEIG9mIHRoZSBleHBhbmRlZCByb3cuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldFBhcmVudFJvd0lEOiAoZ3JpZDogSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZEdyaWQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGdyaWQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkR3JpZCA9IGdyaWQ7XG4gICAgICAgICAgICAgICAgICAgIGdyaWQgPSBncmlkLnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyaWQuZ3JpZEFQSS5nZXRQYXJlbnRSb3dJZChjaGlsZEdyaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICBBbiBvYmplY3Qgd2l0aCBvcHRpb25zIGRldGVybWluaW5nIGlmIGEgY2VydGFpbiBmZWF0dXJlIHN0YXRlIHNob3VsZCBiZSBzYXZlZC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZ3hHcmlkU3RhdGVdPVwib3B0aW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBvcHRpb25zID0ge3NlbGVjdGlvbjogZmFsc2UsIGFkdmFuY2VkRmlsdGVyaW5nOiBmYWxzZX07XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCdpZ3hHcmlkU3RhdGUnKVxuICAgIHB1YmxpYyBnZXQgb3B0aW9ucygpOiBJR3JpZFN0YXRlT3B0aW9ucyB7XG4gICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBvcHRpb25zKHZhbHVlOiBJR3JpZFN0YXRlT3B0aW9ucykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX29wdGlvbnMsIHZhbHVlKTtcbiAgICAgICAgaWYgKCEodGhpcy5ncmlkIGluc3RhbmNlb2YgSWd4R3JpZENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9vcHRpb25zLmdyb3VwQnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fb3B0aW9ucy5yb3dJc2xhbmRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASG9zdCgpIEBPcHRpb25hbCgpIEBJbmplY3QoSUdYX0dSSURfQkFTRSkgcHVibGljIGdyaWQ6IEdyaWRUeXBlLFxuICAgICAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByaXZhdGUgdmlld1JlZjogVmlld0NvbnRhaW5lclJlZikgeyB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGF0ZSBvZiBhIGZlYXR1cmUgb3Igc3RhdGVzIG9mIGFsbCBncmlkIGZlYXR1cmVzLCB1bmxlc3MgYSBjZXJ0YWluIGZlYXR1cmUgaXMgZGlzYWJsZWQgdGhyb3VnaCB0aGUgYG9wdGlvbnNgIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGBzZXJpYWxpemVgIGRldGVybWluZXMgd2hldGhlciB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgc2VyaWFsaXplZCB0byBKU09OIHN0cmluZy4gRGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgICAqIEBwYXJhbSBgZmVhdHVyZWAgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgZGV0ZXJtaW5pbmcgdGhlIGZlYXR1cmVzIHRvIGJlIGFkZGVkIGluIHRoZSBzdGF0ZS4gSWYgc2tpcHBlZCwgYWxsIGZlYXR1cmVzIGFyZSBhZGRlZC5cbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzZXJpYWxpemVkIHRvIEpTT04gc3RyaW5nIElHcmlkU3RhdGUgb2JqZWN0LCBvciB0aGUgbm9uLXNlcmlhbGl6ZWQgSUdyaWRTdGF0ZSBvYmplY3QuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWd4R3JpZFN0YXRlXT1cIm9wdGlvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHN0YXRlO1xuICAgICAqIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTsgLy8gcmV0dXJucyBzdHJpbmdcbiAgICAgKiBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlKGZhbHNlKSAvLyByZXR1cm5zIGBJR3JpZFN0YXRlYCBvYmplY3RcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U3RhdGUoc2VyaWFsaXplID0gdHJ1ZSwgZmVhdHVyZXM/OiBHcmlkRmVhdHVyZXMgfCBHcmlkRmVhdHVyZXNbXSk6IElHcmlkU3RhdGUgfCBzdHJpbmcgIHtcbiAgICAgICAgbGV0IHN0YXRlOiBJR3JpZFN0YXRlIHwgc3RyaW5nO1xuICAgICAgICB0aGlzLmN1cnJHcmlkID0gdGhpcy5ncmlkO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgPSB0aGlzLmJ1aWxkU3RhdGUoZmVhdHVyZXMpIGFzIElHcmlkU3RhdGU7XG4gICAgICAgIGlmIChzZXJpYWxpemUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUsIHRoaXMuc3RyaW5naWZ5Q2FsbGJhY2spIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgZ3JpZCBmZWF0dXJlcycgc3RhdGUgYmFzZWQgb24gdGhlIElHcmlkU3RhdGUgb2JqZWN0IHBhc3NlZCBhcyBhbiBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBJR3JpZFN0YXRlIG9iamVjdCB0byByZXN0b3JlIHN0YXRlIGZyb20uXG4gICAgICogQHJldHVybnNcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZ3hHcmlkU3RhdGVdPVwib3B0aW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgc3RhdGU7XG4gICAgICogdGhpcy5zdGF0ZS5zZXRTdGF0ZShncmlkU3RhdGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogSUdyaWRTdGF0ZSB8IHN0cmluZywgZmVhdHVyZXM/OiBHcmlkRmVhdHVyZXMgfCBHcmlkRmVhdHVyZXNbXSkge1xuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3RhdGUgPSBKU09OLnBhcnNlKHN0YXRlKSBhcyBJR3JpZFN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5jdXJyR3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgdGhpcy5yZXN0b3JlR3JpZFN0YXRlKHN0YXRlLCBmZWF0dXJlcyk7XG4gICAgICAgIHRoaXMuZ3JpZC5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAvLyBUT0RPXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGFuIElHcmlkU3RhdGUgb2JqZWN0LlxuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGRTdGF0ZShrZXlzPzogR3JpZEZlYXR1cmVzIHwgR3JpZEZlYXR1cmVzW10pOiBJR3JpZFN0YXRlIHtcbiAgICAgICAgdGhpcy5hcHBseUZlYXR1cmVzKGtleXMpO1xuICAgICAgICBsZXQgZ3JpZFN0YXRlID0ge30gYXMgSUdyaWRTdGF0ZTtcbiAgICAgICAgdGhpcy5mZWF0dXJlS2V5cy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1tmXSkge1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZ3JpZCBpbnN0YW5jZW9mIElneEdyaWRDb21wb25lbnQpICYmIGYgPT09ICdncm91cEJ5Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLmdldEZlYXR1cmUoZik7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZVN0YXRlOiBJR3JpZFN0YXRlID0gZmVhdHVyZS5nZXRGZWF0dXJlU3RhdGUodGhpcyk7XG4gICAgICAgICAgICAgICAgZ3JpZFN0YXRlID0gT2JqZWN0LmFzc2lnbihncmlkU3RhdGUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZ3JpZFN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRob2QgdGhhdCBjYWxscyBjb3JyZXNwb25kaW5nIG1ldGhvZHMgdG8gcmVzdG9yZSBmZWF0dXJlcyBmcm9tIHRoZSBwYXNzZWQgSUdyaWRTdGF0ZSBvYmplY3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXN0b3JlR3JpZFN0YXRlKHN0YXRlOiBJR3JpZFN0YXRlLCBmZWF0dXJlcz86IEdyaWRGZWF0dXJlcyB8IEdyaWRGZWF0dXJlc1tdKSB7XG4gICAgICAgIHRoaXMuYXBwbHlGZWF0dXJlcyhmZWF0dXJlcyk7XG4gICAgICAgIHRoaXMucmVzdG9yZUZlYXR1cmVzKHN0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc3RvcmVGZWF0dXJlcyhzdGF0ZTogSUdyaWRTdGF0ZSkge1xuICAgICAgICB0aGlzLmZlYXR1cmVLZXlzLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zW2ZdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZVN0YXRlID0gc3RhdGVbZl07XG4gICAgICAgICAgICAgICAgaWYgKGYgPT09ICdtb3ZpbmcnIHx8IGZlYXR1cmVTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5nZXRGZWF0dXJlKGYpO1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLnJlc3RvcmVGZWF0dXJlU3RhdGUodGhpcywgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGFsbCBncmlkIGZlYXR1cmVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwbHlGZWF0dXJlcyhrZXlzPzogR3JpZEZlYXR1cmVzIHwgR3JpZEZlYXR1cmVzW10pIHtcbiAgICAgICAgdGhpcy5mZWF0dXJlS2V5cyA9IFtdO1xuICAgICAgICBpZiAoIWtleXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVLZXlzLnB1c2goa2V5IGFzIEdyaWRGZWF0dXJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAgdGhpcy5mZWF0dXJlS2V5cyA9IFsuLi5rZXlzIGFzIEdyaWRGZWF0dXJlc1tdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZUtleXMucHVzaChrZXlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGJ1aWxkcyBhIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSBmcm9tIGEgcHJvdmlkZWQgb2JqZWN0LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRXhwcmVzc2lvbnNUcmVlRnJvbU9iamVjdChleHByVHJlZU9iamVjdDogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgaWYgKCFleHByVHJlZU9iamVjdCB8fCAhZXhwclRyZWVPYmplY3QuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShleHByVHJlZU9iamVjdC5vcGVyYXRvciwgZXhwclRyZWVPYmplY3QuZmllbGROYW1lKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXhwclRyZWVPYmplY3QuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0ZW0gaXMgYW4gZXhwcmVzc2lvbnMgdHJlZSBvciBhIHNpbmdsZSBleHByZXNzaW9uLlxuICAgICAgICAgICAgaWYgKChpdGVtIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJUcmVlID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uc1RyZWVGcm9tT2JqZWN0KChpdGVtIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpO1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHN1YlRyZWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByID0gaXRlbSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGU6IHN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyR3JpZC5jb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUgPSB0aGlzLmN1cnJHcmlkLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IGV4cHIuZmllbGROYW1lKS5kYXRhVHlwZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IHRoaXMuc3RhdGUuY29sdW1ucy5maW5kKGMgPT4gYy5maWVsZCA9PT0gZXhwci5maWVsZE5hbWUpLmRhdGFUeXBlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB3aGVuIEVTRiwgdmFsdWVzIGFyZSBzdG9yZWQgaW4gU2V0LlxuICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRob3NlIHZhbHVlcyBhcmUgY29udmVydGVkIHRvIGFuIGFycmF5IGJlZm9yZSByZXR1cm5pbmcgc3RyaW5nIGluIHRoZSBzdHJpbmdpZnlDYWxsYmFja1xuICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhvc2UgYmFjayB0byBTZXRcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHByLnNlYXJjaFZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwci5zZWFyY2hWYWwgPSBuZXcgU2V0KGV4cHIuc2VhcmNoVmFsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleHByLnNlYXJjaFZhbCA9IGV4cHIuc2VhcmNoVmFsICYmIChkYXRhVHlwZSA9PT0gJ2RhdGUnIHx8IGRhdGFUeXBlID09PSAnZGF0ZVRpbWUnKSA/IG5ldyBEYXRlKERhdGUucGFyc2UoZXhwci5zZWFyY2hWYWwpKSA6IGV4cHIuc2VhcmNoVmFsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSB0aGlzLmdlbmVyYXRlRmlsdGVyaW5nQ29uZGl0aW9uKGRhdGFUeXBlLCBleHByLmNvbmRpdGlvbi5uYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJHcmlkLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IGV4cHIuZmllbGROYW1lKS5maWx0ZXJzLmNvbmRpdGlvbihleHByLmNvbmRpdGlvbi5uYW1lKTtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwci5jb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGV4cHIpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmluZyBsb2dpYyBmdW5jdGlvbiBmb3IgYSBnaXZlbiBkYXRhVHlwZSBhbmQgY29uZGl0aW9uIChjb250YWlucywgZ3JlYXRlclRoYW4sIGV0Yy4pXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUZpbHRlcmluZ0NvbmRpdGlvbihkYXRhVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBJRmlsdGVyaW5nT3BlcmF0aW9uIHtcbiAgICAgICAgbGV0IGZpbHRlcnM7XG4gICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgZmlsdGVycyA9IElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgZmlsdGVycyA9IElneE51bWJlckZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkRhdGU6XG4gICAgICAgICAgICAgICAgZmlsdGVycyA9IElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgICAgICAgICBmaWx0ZXJzID0gSWd4RGF0ZVRpbWVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcnMuY29uZGl0aW9uKG5hbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RyaW5naWZ5Q2FsbGJhY2soa2V5OiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdzZWFyY2hWYWwnICYmIHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmVhdHVyZShrZXk6IHN0cmluZyk6IEZlYXR1cmUge1xuICAgICAgICBjb25zdCBmZWF0dXJlOiBGZWF0dXJlID0gdGhpcy5GRUFUVVJFU1trZXldO1xuICAgICAgICByZXR1cm4gZmVhdHVyZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW0lneEdyaWRTdGF0ZURpcmVjdGl2ZV0sXG4gICAgZXhwb3J0czogW0lneEdyaWRTdGF0ZURpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZFN0YXRlTW9kdWxlIHsgfVxuIl19
649
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL3N0YXRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBOEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckosT0FBTyxFQUFFLHdCQUF3QixFQUE2QixNQUFNLCtDQUErQyxDQUFDO0FBRXBILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFDSCwwQkFBMEIsRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFDOUUseUJBQXlCLEVBQXVCLDJCQUEyQixFQUM5RSxNQUFNLHdDQUF3QyxDQUFDO0FBR2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTXpELE9BQU8sRUFBWSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBaUZ2RCxNQUFNLE9BQU8scUJBQXFCO0lBdVc5Qjs7T0FFRztJQUNILFlBQ3NELElBQWMsRUFDeEQsUUFBa0MsRUFDbEMs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QTdCdEMsV0FBVztzQkFEakIsTUFBTTtnQkFhSSxPQUFPO3NCQURqQixLQUFLO3VCQUFDLGNBQWM7O0FBc1J6Qjs7R0FFRztBQUtILE1BQU0sT0FBTyxrQkFBa0I7OytHQUFsQixrQkFBa0I7Z0hBQWxCLGtCQUFrQixpQkF0bkJsQixxQkFBcUIsYUFBckIscUJBQXFCO2dIQXNuQnJCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUo5QixRQUFRO21CQUFDO29CQUNOLFlBQVksRUFBRSxDQUFDLHFCQUFxQixDQUFDO29CQUNyQyxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDbkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIE9wdGlvbmFsLCBJbnB1dCwgTmdNb2R1bGUsIEhvc3QsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgVmlld0NvbnRhaW5lclJlZiwgSW5qZWN0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElHcm91cGluZ0V4cHJlc3Npb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVBhZ2luZ1N0YXRlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3BhZ2luZy1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZENvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQge1xuICAgIElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLCBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZCxcbiAgICBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLCBJRmlsdGVyaW5nT3BlcmF0aW9uLCBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmRcbn0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgSUdyb3VwQnlFeHBhbmRTdGF0ZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9ncm91cGJ5LWV4cGFuZC1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwaW5nU3RhdGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4R3JpZENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC9ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtZ3JpZC9oaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSVBpbm5pbmdDb25maWcgfSBmcm9tICcuL2dyaWQuY29tbW9uJztcbmltcG9ydCB7IGRlbGF5LCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgR3JpZFNlbGVjdGlvblJhbmdlIH0gZnJvbSAnLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgSVNvcnRpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgR3JpZFR5cGUsIElHWF9HUklEX0JBU0UgfSBmcm9tICcuL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hQaXZvdEdyaWRDb21wb25lbnQgfSBmcm9tICcuL3Bpdm90LWdyaWQvcGl2b3QtZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSVBpdm90Q29uZmlndXJhdGlvbiwgSVBpdm90RGltZW5zaW9uIH0gZnJvbSAnLi9waXZvdC1ncmlkL3Bpdm90LWdyaWQuaW50ZXJmYWNlJ1xuaW1wb3J0IHsgUGl2b3RVdGlsIH0gZnJvbSAnLi9waXZvdC1ncmlkL3Bpdm90LXV0aWwnO1xuaW1wb3J0IHsgSWd4UGl2b3REYXRlRGltZW5zaW9uIH0gZnJvbSAnLi9waXZvdC1ncmlkL3Bpdm90LWdyaWQtZGltZW5zaW9ucyc7XG5pbXBvcnQgeyBjbG9uZUFycmF5LCBjbG9uZVZhbHVlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XG4gICAgY29sdW1ucz86IElDb2x1bW5TdGF0ZVtdO1xuICAgIGZpbHRlcmluZz86IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgYWR2YW5jZWRGaWx0ZXJpbmc/OiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIHBhZ2luZz86IElQYWdpbmdTdGF0ZTtcbiAgICBtb3Zpbmc/OiBib29sZWFuO1xuICAgIHNvcnRpbmc/OiBJU29ydGluZ0V4cHJlc3Npb25bXTtcbiAgICBncm91cEJ5PzogSUdyb3VwaW5nU3RhdGU7XG4gICAgY2VsbFNlbGVjdGlvbj86IEdyaWRTZWxlY3Rpb25SYW5nZVtdO1xuICAgIHJvd1NlbGVjdGlvbj86IGFueVtdO1xuICAgIGNvbHVtblNlbGVjdGlvbj86IHN0cmluZ1tdO1xuICAgIHJvd1Bpbm5pbmc/OiBhbnlbXTtcbiAgICBwaW5uaW5nQ29uZmlnPzogSVBpbm5pbmdDb25maWc7XG4gICAgZXhwYW5zaW9uPzogYW55W107XG4gICAgcm93SXNsYW5kcz86IElHcmlkU3RhdGVDb2xsZWN0aW9uW107XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgcGl2b3RDb25maWd1cmF0aW9uPzogSVBpdm90Q29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFN0YXRlQ29sbGVjdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwYXJlbnRSb3dJRDogYW55O1xuICAgIHN0YXRlOiBJR3JpZFN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkU3RhdGVPcHRpb25zIHtcbiAgICBjb2x1bW5zPzogYm9vbGVhbjtcbiAgICBmaWx0ZXJpbmc/OiBib29sZWFuO1xuICAgIGFkdmFuY2VkRmlsdGVyaW5nPzogYm9vbGVhbjtcbiAgICBzb3J0aW5nPzogYm9vbGVhbjtcbiAgICBncm91cEJ5PzogYm9vbGVhbjtcbiAgICBwYWdpbmc/OiBib29sZWFuO1xuICAgIGNlbGxTZWxlY3Rpb24/OiBib29sZWFuO1xuICAgIHJvd1NlbGVjdGlvbj86IGJvb2xlYW47XG4gICAgY29sdW1uU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgICByb3dQaW5uaW5nPzogYm9vbGVhbjtcbiAgICBwaW5uaW5nQ29uZmlnPzogYm9vbGVhbjtcbiAgICBleHBhbnNpb24/OiBib29sZWFuO1xuICAgIHJvd0lzbGFuZHM/OiBib29sZWFuO1xuICAgIG1vdmluZz86IGJvb2xlYW47XG4gICAgcGl2b3RDb25maWd1cmF0aW9uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29sdW1uU3RhdGUge1xuICAgIHBpbm5lZDogYm9vbGVhbjtcbiAgICBzb3J0YWJsZTogYm9vbGVhbjtcbiAgICBmaWx0ZXJhYmxlOiBib29sZWFuO1xuICAgIGVkaXRhYmxlOiBib29sZWFuO1xuICAgIHNvcnRpbmdJZ25vcmVDYXNlOiBib29sZWFuO1xuICAgIGZpbHRlcmluZ0lnbm9yZUNhc2U6IGJvb2xlYW47XG4gICAgaGVhZGVyQ2xhc3Nlczogc3RyaW5nO1xuICAgIGhlYWRlckdyb3VwQ2xhc3Nlczogc3RyaW5nO1xuICAgIG1heFdpZHRoOiBzdHJpbmc7XG4gICAgZ3JvdXBhYmxlOiBib29sZWFuO1xuICAgIG1vdmFibGU6IGJvb2xlYW47XG4gICAgaGlkZGVuOiBib29sZWFuO1xuICAgIGRhdGFUeXBlOiBHcmlkQ29sdW1uRGF0YVR5cGU7XG4gICAgaGFzU3VtbWFyeTogYm9vbGVhbjtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIHdpZHRoOiBhbnk7XG4gICAgaGVhZGVyOiBzdHJpbmc7XG4gICAgcmVzaXphYmxlOiBib29sZWFuO1xuICAgIHNlYXJjaGFibGU6IGJvb2xlYW47XG4gICAgY29sdW1uR3JvdXA6IGJvb2xlYW47XG4gICAgcGFyZW50OiBhbnk7XG4gICAgZGlzYWJsZUhpZGluZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgR3JpZEZlYXR1cmVzID0ga2V5b2YgSUdyaWRTdGF0ZU9wdGlvbnM7XG5cbmludGVyZmFjZSBGZWF0dXJlIHtcbiAgICBnZXRGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpID0+IElHcmlkU3RhdGU7XG4gICAgcmVzdG9yZUZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgc3RhdGU6IElDb2x1bW5TdGF0ZVtdIHwgSVBhZ2luZ1N0YXRlIHwgYm9vbGVhbiB8IElTb3J0aW5nRXhwcmVzc2lvbltdIHxcbiAgICAgICAgSUdyb3VwaW5nU3RhdGUgfCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHwgR3JpZFNlbGVjdGlvblJhbmdlW10gfCBJUGlubmluZ0NvbmZpZyB8IElQaXZvdENvbmZpZ3VyYXRpb24gfCBhbnlbXSkgPT4gdm9pZDtcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4R3JpZFN0YXRlXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZFN0YXRlRGlyZWN0aXZlIHtcbiAgICBwcml2YXRlIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9vcHRpb25zOiBJR3JpZFN0YXRlT3B0aW9ucyB8ICcnO1xuXG4gICAgcHJpdmF0ZSBmZWF0dXJlS2V5czogR3JpZEZlYXR1cmVzW10gPSBbXTtcbiAgICBwcml2YXRlIHN0YXRlOiBJR3JpZFN0YXRlO1xuICAgIHByaXZhdGUgY3VyckdyaWQ6IEdyaWRUeXBlO1xuICAgIHByaXZhdGUgX29wdGlvbnM6IElHcmlkU3RhdGVPcHRpb25zID0ge1xuICAgICAgICBjb2x1bW5zOiB0cnVlLFxuICAgICAgICBmaWx0ZXJpbmc6IHRydWUsXG4gICAgICAgIGFkdmFuY2VkRmlsdGVyaW5nOiB0cnVlLFxuICAgICAgICBzb3J0aW5nOiB0cnVlLFxuICAgICAgICBncm91cEJ5OiB0cnVlLFxuICAgICAgICBwYWdpbmc6IHRydWUsXG4gICAgICAgIGNlbGxTZWxlY3Rpb246IHRydWUsXG4gICAgICAgIHJvd1NlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgY29sdW1uU2VsZWN0aW9uOiB0cnVlLFxuICAgICAgICByb3dQaW5uaW5nOiB0cnVlLFxuICAgICAgICBleHBhbnNpb246IHRydWUsXG4gICAgICAgIG1vdmluZzogdHJ1ZSxcbiAgICAgICAgcm93SXNsYW5kczogdHJ1ZSxcbiAgICAgICAgcGl2b3RDb25maWd1cmF0aW9uOiB0cnVlXG4gICAgfTtcbiAgICBwcml2YXRlIEZFQVRVUkVTID0ge1xuICAgICAgICBzb3J0aW5nOiAge1xuICAgICAgICAgICAgZ2V0RmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGluZ1N0YXRlID0gY29udGV4dC5jdXJyR3JpZC5zb3J0aW5nRXhwcmVzc2lvbnM7XG4gICAgICAgICAgICAgICAgc29ydGluZ1N0YXRlLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzLnN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcy5vd25lcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzb3J0aW5nOiBzb3J0aW5nU3RhdGUgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXN0b3JlRmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCBzdGF0ZTogSVNvcnRpbmdFeHByZXNzaW9uW10pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLnNvcnRpbmdFeHByZXNzaW9ucyA9IHN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXJpbmc6IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmluZ1N0YXRlID0gY29udGV4dC5jdXJyR3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmluZ1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWx0ZXJpbmdTdGF0ZS5vd25lcjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGZpbHRlcmluZ1N0YXRlLmZpbHRlcmluZ09wZXJhbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgKGl0ZW0gYXMgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkub3duZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZmlsdGVyaW5nOiBmaWx0ZXJpbmdTdGF0ZSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJUcmVlID0gY29udGV4dC5jcmVhdGVFeHByZXNzaW9uc1RyZWVGcm9tT2JqZWN0KHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlclRyZWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhZHZhbmNlZEZpbHRlcmluZzoge1xuICAgICAgICAgICAgZ2V0RmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyaW5nU3RhdGUgPSBjb250ZXh0LmN1cnJHcmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgICAgIGxldCBhZHZhbmNlZEZpbHRlcmluZzogYW55O1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJpbmdTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgZmlsdGVyaW5nU3RhdGUub3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIChpdGVtIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpLm93bmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkdmFuY2VkRmlsdGVyaW5nID0gZmlsdGVyaW5nU3RhdGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmcgPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgYWR2YW5jZWRGaWx0ZXJpbmcgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXN0b3JlRmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCBzdGF0ZTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVHJlZSA9IGNvbnRleHQuY3JlYXRlRXhwcmVzc2lvbnNUcmVlRnJvbU9iamVjdChzdGF0ZSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlclRyZWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb2x1bW5zOiB7XG4gICAgICAgICAgICBnZXRGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpOiBJR3JpZFN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkQ29sdW1uczogSUNvbHVtblN0YXRlW10gPSBjb250ZXh0LmN1cnJHcmlkLmNvbHVtbnMubWFwKChjKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBwaW5uZWQ6IGMucGlubmVkLFxuICAgICAgICAgICAgICAgICAgICBzb3J0YWJsZTogYy5zb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyYWJsZTogYy5maWx0ZXJhYmxlLFxuICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogYy5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc29ydGluZ0lnbm9yZUNhc2U6IGMuc29ydGluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZ0lnbm9yZUNhc2U6IGMuZmlsdGVyaW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NlczogYy5oZWFkZXJDbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJHcm91cENsYXNzZXM6IGMuaGVhZGVyR3JvdXBDbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogYy5tYXhXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBhYmxlOiBjLmdyb3VwYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgbW92YWJsZTogYy5tb3ZhYmxlLFxuICAgICAgICAgICAgICAgICAgICBoaWRkZW46IGMuaGlkZGVuLFxuICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogYy5kYXRhVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgaGFzU3VtbWFyeTogYy5oYXNTdW1tYXJ5LFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYy5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcjogYy5oZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlc2l6YWJsZTogYy5yZXNpemFibGUsXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaGFibGU6IGMuc2VhcmNoYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogYy5zZWxlY3RhYmxlLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGMucGFyZW50ID8gYy5wYXJlbnQuaGVhZGVyIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uR3JvdXA6IGMuY29sdW1uR3JvdXAsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVIaWRpbmc6IGMuZGlzYWJsZUhpZGluZ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBncmlkQ29sdW1ucyB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBJQ29sdW1uU3RhdGVbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gY29udGV4dC5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShJZ3hDb2x1bW5Db21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRmFjdG9yeSA9IGNvbnRleHQucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uR3JvdXBDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmZvckVhY2goKGNvbFN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0NvbHVtbkdyb3VwID0gY29sU3RhdGUuY29sdW1uR3JvdXA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb2xTdGF0ZS5jb2x1bW5Hcm91cDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWYxID0gZ3JvdXBGYWN0b3J5LmNyZWF0ZShjb250ZXh0LnZpZXdSZWYuaW5qZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZWYxLmluc3RhbmNlLCBjb2xTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYxLmluc3RhbmNlLmdyaWQgPSBjb250ZXh0LmN1cnJHcmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZjEuaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uR3JvdXA6IElneENvbHVtbkdyb3VwQ29tcG9uZW50ID0gbmV3Q29sdW1ucy5maW5kKGUgPT4gZS5oZWFkZXIgPT09IHJlZjEuaW5zdGFuY2UucGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Hcm91cC5jaGlsZHJlbi5yZXNldChbLi4uY29sdW1uR3JvdXAuY2hpbGRyZW4udG9BcnJheSgpLCByZWYxLmluc3RhbmNlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS5pbnN0YW5jZS5wYXJlbnQgPSBjb2x1bW5Hcm91cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1ucy5wdXNoKHJlZjEuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmID0gZmFjdG9yeS5jcmVhdGUoY29udGV4dC52aWV3UmVmLmluamVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocmVmLmluc3RhbmNlLCBjb2xTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuaW5zdGFuY2UuZ3JpZCA9IGNvbnRleHQuY3VyckdyaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmLmluc3RhbmNlLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkdyb3VwOiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCA9IG5ld0NvbHVtbnMuZmluZChlID0+IGUuaGVhZGVyID09PSByZWYuaW5zdGFuY2UucGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLnBhcmVudCA9IGNvbHVtbkdyb3VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Hcm91cC5jaGlsZHJlbi5yZXNldChbLi4uY29sdW1uR3JvdXAuY2hpbGRyZW4udG9BcnJheSgpLCByZWYuaW5zdGFuY2VdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1ucy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLnVwZGF0ZUNvbHVtbnMobmV3Q29sdW1ucyk7XG4gICAgICAgICAgICAgICAgbmV3Q29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmN1cnJHcmlkIGFzIGFueSkuY29sdW1uSW5pdC5lbWl0KGNvbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdyb3VwQnk6IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBjb250ZXh0LmN1cnJHcmlkIGFzIElneEdyaWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBpbmdFeHByZXNzaW9ucyA9IGdyaWQuZ3JvdXBpbmdFeHByZXNzaW9ucztcbiAgICAgICAgICAgICAgICBncm91cGluZ0V4cHJlc3Npb25zLmZvckVhY2goZXhwciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBleHByLnN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGFuc2lvblN0YXRlID0gZ3JpZC5ncm91cGluZ0V4cGFuc2lvblN0YXRlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3Vwc0V4cGFuZGVkID0gZ3JpZC5ncm91cHNFeHBhbmRlZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGdyb3VwQnk6IHsgZXhwcmVzc2lvbnM6IGdyb3VwaW5nRXhwcmVzc2lvbnMsIGV4cGFuc2lvbjogZXhwYW5zaW9uU3RhdGUsIGRlZmF1bHRFeHBhbmRlZDogZ3JvdXBzRXhwYW5kZWR9ICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBJR3JvdXBpbmdTdGF0ZSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBjb250ZXh0LmN1cnJHcmlkIGFzIElneEdyaWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgZ3JpZC5ncm91cGluZ0V4cHJlc3Npb25zID0gc3RhdGUuZXhwcmVzc2lvbnMgYXMgSUdyb3VwaW5nRXhwcmVzc2lvbltdO1xuICAgICAgICAgICAgICAgIGlmIChncmlkLmdyb3Vwc0V4cGFuZGVkICE9PSBzdGF0ZS5kZWZhdWx0RXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JpZC50b2dnbGVBbGxHcm91cFJvd3MoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBncmlkLmdyb3VwaW5nRXhwYW5zaW9uU3RhdGUgPSBzdGF0ZS5leHBhbnNpb24gYXMgSUdyb3VwQnlFeHBhbmRTdGF0ZVtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICBnZXRGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpOiBJR3JpZFN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdpbmdTdGF0ZSA9IGNvbnRleHQuY3VyckdyaWQucGFnaW5nU3RhdGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFnaW5nOiBwYWdpbmdTdGF0ZSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBJUGFnaW5nU3RhdGUpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuY3VyckdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuY3VyckdyaWQucGFnaW5hdG9yLnBlclBhZ2UgIT09IHN0YXRlLnJlY29yZHNQZXJQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQucGFnaW5hdG9yLnBlclBhZ2UgPSBzdGF0ZS5yZWNvcmRzUGVyUGFnZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZC5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLnBhZ2luYXRvci5wYWdlID0gc3RhdGUuaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vdmluZzoge1xuICAgICAgICAgICAgZ2V0RmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbW92aW5nOiBjb250ZXh0LmN1cnJHcmlkLm1vdmluZyB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZC5tb3ZpbmcgPSBzdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcm93U2VsZWN0aW9uOiB7XG4gICAgICAgICAgICBnZXRGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUpOiBJR3JpZFN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBjb250ZXh0LmN1cnJHcmlkLnNlbGVjdGVkUm93cztcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dTZWxlY3Rpb246IHNlbGVjdGlvbiB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQuc2VsZWN0Um93cyhzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNlbGxTZWxlY3Rpb246IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNvbnRleHQuY3VyckdyaWQuZ2V0U2VsZWN0ZWRSYW5nZXMoKS5tYXAocmFuZ2UgPT5cbiAgICAgICAgICAgICAgICAgICAgKHsgcm93U3RhcnQ6IHJhbmdlLnJvd1N0YXJ0LCByb3dFbmQ6IHJhbmdlLnJvd0VuZCwgY29sdW1uU3RhcnQ6IHJhbmdlLmNvbHVtblN0YXJ0LCBjb2x1bW5FbmQ6IHJhbmdlLmNvbHVtbkVuZCB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbFNlbGVjdGlvbjogc2VsZWN0aW9uIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdG9yZUZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgc3RhdGU6IEdyaWRTZWxlY3Rpb25SYW5nZVtdKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdGUuZm9yRWFjaChyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB7IHJvd1N0YXJ0OiByLnJvd1N0YXJ0LCByb3dFbmQ6IHIucm93RW5kLCBjb2x1bW5TdGFydDogci5jb2x1bW5TdGFydCwgY29sdW1uRW5kOiByLmNvbHVtbkVuZH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQuc2VsZWN0UmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb2x1bW5TZWxlY3Rpb246IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNvbnRleHQuY3VyckdyaWQuc2VsZWN0ZWRDb2x1bW5zKCkubWFwKGMgPT4gYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY29sdW1uU2VsZWN0aW9uOiBzZWxlY3Rpb24gfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXN0b3JlRmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCBzdGF0ZTogc3RyaW5nW10pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQuc2VsZWN0Q29sdW1ucyhzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJvd1Bpbm5pbmc6IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZCA9IGNvbnRleHQuY3VyckdyaWQucGlubmVkUm93cz8ubWFwKHggPT4geC5rZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd1Bpbm5pbmc6IHBpbm5lZCB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGU6IChjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNsZWFyIGN1cnJlbnQgc3RhdGUuXG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZC5waW5uZWRSb3dzLmZvckVhY2gocm93ID0+IHJvdy51bnBpbigpKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5mb3JFYWNoKHJvd0lEID0+IGNvbnRleHQuY3VyckdyaWQucGluUm93KHJvd0lEKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHBpbm5pbmdDb25maWc6IHtcbiAgICAgICAgICAgIGdldEZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSk6IElHcmlkU3RhdGUgPT4gKHsgcGlubmluZ0NvbmZpZzogY29udGV4dC5jdXJyR3JpZC5waW5uaW5nIH0pLFxuICAgICAgICAgICAgcmVzdG9yZUZlYXR1cmVTdGF0ZTogKGNvbnRleHQ6IElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgc3RhdGU6IElQaW5uaW5nQ29uZmlnKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZC5waW5uaW5nID0gc3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGV4cGFuc2lvbjoge1xuICAgICAgICAgICAgZ2V0RmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwYW5zaW9uU3RhdGVzID0gQXJyYXkuZnJvbShjb250ZXh0LmN1cnJHcmlkLmV4cGFuc2lvblN0YXRlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXhwYW5zaW9uOiBleHBhbnNpb25TdGF0ZXMgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXN0b3JlRmVhdHVyZVN0YXRlOiAoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCBzdGF0ZTogYW55W10pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4oc3RhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQuZXhwYW5zaW9uU3RhdGVzID0gZXhwYW5zaW9uU3RhdGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByb3dJc2xhbmRzOiB7XG4gICAgICAgICAgICBnZXRGZWF0dXJlU3RhdGUoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRHcmlkU3RhdGVzOiBJR3JpZFN0YXRlQ29sbGVjdGlvbltdID0gW107XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SXNsYW5kcyA9IChjb250ZXh0LmN1cnJHcmlkIGFzIGFueSkuYWxsTGF5b3V0TGlzdDtcbiAgICAgICAgICAgICAgICBpZiAocm93SXNsYW5kcykge1xuICAgICAgICAgICAgICAgICAgICByb3dJc2xhbmRzLmZvckVhY2gocm93SXNsYW5kID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkR3JpZHMgPSByb3dJc2xhbmQucm93SXNsYW5kQVBJLmdldENoaWxkR3JpZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkR3JpZHMuZm9yRWFjaChjaEdyaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJvd0lEID0gdGhpcy5nZXRQYXJlbnRSb3dJRChjaEdyaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQgPSBjaEdyaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuY3VyckdyaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRHcmlkU3RhdGUgPSBjb250ZXh0LmJ1aWxkU3RhdGUoY29udGV4dC5mZWF0dXJlS2V5cykgYXMgSUdyaWRTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRHcmlkU3RhdGVzLnB1c2goeyBpZDogYCR7cm93SXNsYW5kLmlkfWAsIHBhcmVudFJvd0lELCBzdGF0ZTogY2hpbGRHcmlkU3RhdGUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJHcmlkID0gY29udGV4dC5ncmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0lzbGFuZHM6IGNoaWxkR3JpZFN0YXRlcyB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RvcmVGZWF0dXJlU3RhdGUoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCBzdGF0ZTogYW55KTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SXNsYW5kcyA9IChjb250ZXh0LmN1cnJHcmlkIGFzIGFueSkuYWxsTGF5b3V0TGlzdDtcbiAgICAgICAgICAgICAgICBpZiAocm93SXNsYW5kcykge1xuICAgICAgICAgICAgICAgICAgICByb3dJc2xhbmRzLmZvckVhY2gocm93SXNsYW5kID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkR3JpZHMgPSByb3dJc2xhbmQucm93SXNsYW5kQVBJLmdldENoaWxkR3JpZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkR3JpZHMuZm9yRWFjaChjaEdyaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJvd0lEID0gdGhpcy5nZXRQYXJlbnRSb3dJRChjaEdyaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VyckdyaWQgPSBjaEdyaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRHcmlkU3RhdGUgPSBzdGF0ZS5maW5kKHN0ID0+IHN0LmlkID09PSByb3dJc2xhbmQuaWQgJiYgc3QucGFyZW50Um93SUQgPT09IHBhcmVudFJvd0lEKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRHcmlkU3RhdGUgJiYgY29udGV4dC5jdXJyR3JpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlc3RvcmVHcmlkU3RhdGUoY2hpbGRHcmlkU3RhdGUuc3RhdGUsIGNvbnRleHQuZmVhdHVyZUtleXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyR3JpZCA9IGNvbnRleHQuZ3JpZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRyYXZlcnNlcyB0aGUgaGllcmFyY2h5IHVwIHRvIHRoZSByb290IGdyaWQgdG8gcmV0dXJuIHRoZSBJRCBvZiB0aGUgZXhwYW5kZWQgcm93LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXRQYXJlbnRSb3dJRDogKGdyaWQ6IElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRHcmlkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChncmlkLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZEdyaWQgPSBncmlkO1xuICAgICAgICAgICAgICAgICAgICBncmlkID0gZ3JpZC5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBncmlkLmdyaWRBUEkuZ2V0UGFyZW50Um93SWQoY2hpbGRHcmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcGl2b3RDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICBnZXRGZWF0dXJlU3RhdGUoY29udGV4dDogSWd4R3JpZFN0YXRlRGlyZWN0aXZlKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gKGNvbnRleHQuY3VyckdyaWQgYXMgSWd4UGl2b3RHcmlkQ29tcG9uZW50KS5waXZvdENvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcgfHwgIShjb250ZXh0LmN1cnJHcmlkIGluc3RhbmNlb2YgSWd4UGl2b3RHcmlkQ29tcG9uZW50KSkgeyBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGl2b3RDb25maWd1cmF0aW9uOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnQ29weSA9IGNsb25lVmFsdWUoY29uZmlnKTtcbiAgICAgICAgICAgICAgICBjb25maWdDb3B5LnJvd3MgPSBjbG9uZUFycmF5KGNvbmZpZy5yb3dzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25maWdDb3B5LmNvbHVtbnMgPSBjbG9uZUFycmF5KGNvbmZpZy5jb2x1bW5zLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25maWdDb3B5LmZpbHRlcnMgPSBjbG9uZUFycmF5KGNvbmZpZy5maWx0ZXJzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaW1zID0gIFsuLi4oY29uZmlnQ29weS5yb3dzIHx8IFtdKSwgLi4uKGNvbmZpZ0NvcHkuY29sdW1ucyB8fCBbXSksIC4uLihjb25maWdDb3B5LmZpbHRlcnMgfHwgW10pXTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlRGltZW5zaW9ucyA9IGRpbXMuZmlsdGVyKHggPT4gY29udGV4dC5pc0RhdGVEaW1lbnNpb24oeCkpO1xuICAgICAgICAgICAgICAgIGRhdGVEaW1lbnNpb25zPy5mb3JFYWNoKGRpbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzZXJpYWxpemUgdGhlIGdyaWQgcmVzb3VyY2Ugc3RyaW5ncy4gVGhpcyB3b3VsZCBwb2xsdXRlIHRoZSBvYmplY3Qgd2l0aCB1bm5lY2Vzc2FyeSBkYXRhLlxuICAgICAgICAgICAgICAgICAgICAoZGltIGFzIElneFBpdm90RGF0ZURpbWVuc2lvbikucmVzb3VyY2VTdHJpbmdzID0ge307XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGl2b3RDb25maWd1cmF0aW9uOiBjb25maWdDb3B5IH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdG9yZUZlYXR1cmVTdGF0ZShjb250ZXh0OiBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWc6IElQaXZvdENvbmZpZ3VyYXRpb24gPSBzdGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZyB8fCAhKGNvbnRleHQuY3VyckdyaWQgaW5zdGFuY2VvZiBJZ3hQaXZvdEdyaWRDb21wb25lbnQpKSB7IFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRleHQucmVzdG9yZVZhbHVlcyhjb25maWcsIGNvbnRleHQuY3VyckdyaWQgYXMgSWd4UGl2b3RHcmlkQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnJlc3RvcmVEaW1lbnNpb25zKGNvbmZpZywgY29udGV4dC5jdXJyR3JpZCBhcyBJZ3hQaXZvdEdyaWRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIChjb250ZXh0LmN1cnJHcmlkIGFzIElneFBpdm90R3JpZENvbXBvbmVudCkucGl2b3RDb25maWd1cmF0aW9uID0gY29uZmlnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFxuXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIEV2ZW50IGVtaXR0ZWQgd2hlbiBzZXQgc3RhdGUgaXMgY2FsbGVkIHdpdGggYSBzdHJpbmcuXG4gICAgICogUmV0dXJucyB0aGUgcGFyc2VkIHN0YXRlIG9iamVjdCBzbyB0aGF0IGl0IGNhbiBiZSBmdXJ0aGVyIG1vZGlmaWVkIGJlZm9yZSBhcHBseWluZyB0byB0aGUgZ3JpZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zdGF0ZS5zdGF0ZVBhcnNlZC5zdWJzY3JpYmUocGFyc2VkU3RhdGUgPT4gcGFyc2VkU3RhdGUuc29ydGluZy5mb3JFYWNoKHggPT4geC5zdHJhdGVneSA9IE5vb3BTb3J0aW5nU3RyYXRlZ3kuaW5zdGFuY2UoKX0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzdGF0ZVBhcnNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRTdGF0ZT4oKTtcblxuICAgIC8qKlxuICAgICAqICBBbiBvYmplY3Qgd2l0aCBvcHRpb25zIGRldGVybWluaW5nIGlmIGEgY2VydGFpbiBmZWF0dXJlIHN0YXRlIHNob3VsZCBiZSBzYXZlZC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZ3hHcmlkU3RhdGVdPVwib3B0aW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBvcHRpb25zID0ge3NlbGVjdGlvbjogZmFsc2UsIGFkdmFuY2VkRmlsdGVyaW5nOiBmYWxzZX07XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCdpZ3hHcmlkU3RhdGUnKVxuICAgIHB1YmxpYyBnZXQgb3B0aW9ucygpOiBJR3JpZFN0YXRlT3B0aW9ucyB7XG4gICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBvcHRpb25zKHZhbHVlOiBJR3JpZFN0YXRlT3B0aW9ucykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX29wdGlvbnMsIHZhbHVlKTtcbiAgICAgICAgaWYgKCEodGhpcy5ncmlkIGluc3RhbmNlb2YgSWd4R3JpZENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9vcHRpb25zLmdyb3VwQnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fb3B0aW9ucy5yb3dJc2xhbmRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASG9zdCgpIEBPcHRpb25hbCgpIEBJbmplY3QoSUdYX0dSSURfQkFTRSkgcHVibGljIGdyaWQ6IEdyaWRUeXBlLFxuICAgICAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByaXZhdGUgdmlld1JlZjogVmlld0NvbnRhaW5lclJlZikgeyB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGF0ZSBvZiBhIGZlYXR1cmUgb3Igc3RhdGVzIG9mIGFsbCBncmlkIGZlYXR1cmVzLCB1bmxlc3MgYSBjZXJ0YWluIGZlYXR1cmUgaXMgZGlzYWJsZWQgdGhyb3VnaCB0aGUgYG9wdGlvbnNgIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGBzZXJpYWxpemVgIGRldGVybWluZXMgd2hldGhlciB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgc2VyaWFsaXplZCB0byBKU09OIHN0cmluZy4gRGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgICAqIEBwYXJhbSBgZmVhdHVyZWAgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgZGV0ZXJtaW5pbmcgdGhlIGZlYXR1cmVzIHRvIGJlIGFkZGVkIGluIHRoZSBzdGF0ZS4gSWYgc2tpcHBlZCwgYWxsIGZlYXR1cmVzIGFyZSBhZGRlZC5cbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzZXJpYWxpemVkIHRvIEpTT04gc3RyaW5nIElHcmlkU3RhdGUgb2JqZWN0LCBvciB0aGUgbm9uLXNlcmlhbGl6ZWQgSUdyaWRTdGF0ZSBvYmplY3QuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWd4R3JpZFN0YXRlXT1cIm9wdGlvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHN0YXRlO1xuICAgICAqIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTsgLy8gcmV0dXJucyBzdHJpbmdcbiAgICAgKiBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlKGZhbHNlKSAvLyByZXR1cm5zIGBJR3JpZFN0YXRlYCBvYmplY3RcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U3RhdGUoc2VyaWFsaXplID0gdHJ1ZSwgZmVhdHVyZXM/OiBHcmlkRmVhdHVyZXMgfCBHcmlkRmVhdHVyZXNbXSk6IElHcmlkU3RhdGUgfCBzdHJpbmcgIHtcbiAgICAgICAgbGV0IHN0YXRlOiBJR3JpZFN0YXRlIHwgc3RyaW5nO1xuICAgICAgICB0aGlzLmN1cnJHcmlkID0gdGhpcy5ncmlkO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgPSB0aGlzLmJ1aWxkU3RhdGUoZmVhdHVyZXMpIGFzIElHcmlkU3RhdGU7XG4gICAgICAgIGlmIChzZXJpYWxpemUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUsIHRoaXMuc3RyaW5naWZ5Q2FsbGJhY2spIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgZ3JpZCBmZWF0dXJlcycgc3RhdGUgYmFzZWQgb24gdGhlIElHcmlkU3RhdGUgb2JqZWN0IHBhc3NlZCBhcyBhbiBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBJR3JpZFN0YXRlIG9iamVjdCB0byByZXN0b3JlIHN0YXRlIGZyb20uXG4gICAgICogQHJldHVybnNcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZ3hHcmlkU3RhdGVdPVwib3B0aW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoSWd4R3JpZFN0YXRlRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgc3RhdGU7XG4gICAgICogdGhpcy5zdGF0ZS5zZXRTdGF0ZShncmlkU3RhdGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogSUdyaWRTdGF0ZSB8IHN0cmluZywgZmVhdHVyZXM/OiBHcmlkRmVhdHVyZXMgfCBHcmlkRmVhdHVyZXNbXSkge1xuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3RhdGUgPSBKU09OLnBhcnNlKHN0YXRlKSBhcyBJR3JpZFN0YXRlO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVBhcnNlZC5lbWl0KHN0YXRlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5jdXJyR3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgdGhpcy5yZXN0b3JlR3JpZFN0YXRlKHN0YXRlLCBmZWF0dXJlcyk7XG4gICAgICAgIHRoaXMuZ3JpZC5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAvLyBUT0RPXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGFuIElHcmlkU3RhdGUgb2JqZWN0LlxuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGRTdGF0ZShrZXlzPzogR3JpZEZlYXR1cmVzIHwgR3JpZEZlYXR1cmVzW10pOiBJR3JpZFN0YXRlIHtcbiAgICAgICAgdGhpcy5hcHBseUZlYXR1cmVzKGtleXMpO1xuICAgICAgICBsZXQgZ3JpZFN0YXRlID0ge30gYXMgSUdyaWRTdGF0ZTtcbiAgICAgICAgdGhpcy5mZWF0dXJlS2V5cy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1tmXSkge1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZ3JpZCBpbnN0YW5jZW9mIElneEdyaWRDb21wb25lbnQpICYmIGYgPT09ICdncm91cEJ5Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLmdldEZlYXR1cmUoZik7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZVN0YXRlOiBJR3JpZFN0YXRlID0gZmVhdHVyZS5nZXRGZWF0dXJlU3RhdGUodGhpcyk7XG4gICAgICAgICAgICAgICAgZ3JpZFN0YXRlID0gT2JqZWN0LmFzc2lnbihncmlkU3RhdGUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZ3JpZFN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRob2QgdGhhdCBjYWxscyBjb3JyZXNwb25kaW5nIG1ldGhvZHMgdG8gcmVzdG9yZSBmZWF0dXJlcyBmcm9tIHRoZSBwYXNzZWQgSUdyaWRTdGF0ZSBvYmplY3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXN0b3JlR3JpZFN0YXRlKHN0YXRlOiBJR3JpZFN0YXRlLCBmZWF0dXJlcz86IEdyaWRGZWF0dXJlcyB8IEdyaWRGZWF0dXJlc1tdKSB7XG4gICAgICAgIHRoaXMuYXBwbHlGZWF0dXJlcyhmZWF0dXJlcyk7XG4gICAgICAgIHRoaXMucmVzdG9yZUZlYXR1cmVzKHN0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc3RvcmVGZWF0dXJlcyhzdGF0ZTogSUdyaWRTdGF0ZSkge1xuICAgICAgICB0aGlzLmZlYXR1cmVLZXlzLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zW2ZdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZVN0YXRlID0gc3RhdGVbZl07XG4gICAgICAgICAgICAgICAgaWYgKGYgPT09ICdtb3ZpbmcnIHx8IGZlYXR1cmVTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5nZXRGZWF0dXJlKGYpO1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLnJlc3RvcmVGZWF0dXJlU3RhdGUodGhpcywgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGFsbCBncmlkIGZlYXR1cmVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwbHlGZWF0dXJlcyhrZXlzPzogR3JpZEZlYXR1cmVzIHwgR3JpZEZlYXR1cmVzW10pIHtcbiAgICAgICAgdGhpcy5mZWF0dXJlS2V5cyA9IFtdO1xuICAgICAgICBpZiAoIWtleXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVLZXlzLnB1c2goa2V5IGFzIEdyaWRGZWF0dXJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAgdGhpcy5mZWF0dXJlS2V5cyA9IFsuLi5rZXlzIGFzIEdyaWRGZWF0dXJlc1tdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZUtleXMucHVzaChrZXlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJlc3RvcmVzIGNvbXBsZXggb2JqZWN0cyBpbiB0aGUgcGl2b3QgZGltZW5zaW9uc1xuICAgICAqIExpa2UgdGhlIElneFBpdm90RGF0ZURpbWVuc2lvbiBhbmQgZmlsdGVycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc3RvcmVEaW1lbnNpb25zKGNvbmZpZzogSVBpdm90Q29uZmlndXJhdGlvbiwgZ3JpZDogSWd4UGl2b3RHcmlkQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gW2NvbmZpZy5yb3dzLCBjb25maWcuY29sdW1ucywgY29uZmlnLmZpbHRlcnNdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb24gb2YgY29sbGVjdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb2xsZWN0aW9uPy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaW0gPSBjb2xsZWN0aW9uW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0RhdGVEaW1lbnNpb24oZGltKSkge1xuICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZURhdGVEaW1lbnNpb24oZGltIGFzIElneFBpdm90RGF0ZURpbWVuc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgY29tcGxleCBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgaWYgKGRpbS5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGltLmZpbHRlciA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvbnNUcmVlRnJvbU9iamVjdChkaW0uZmlsdGVyIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXN0b3JlcyB0aGUgSWd4UGl2b3REYXRlRGltZW5zaW9uIHdpdGggaXRzIGRlZmF1bHQgZnVuY3Rpb25zIGFuZCByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzdG9yZURhdGVEaW1lbnNpb24oZGltOiBJZ3hQaXZvdERhdGVEaW1lbnNpb24pIHtcbiAgICAgICAgY29uc3QgZGF0ZURpbSA9IG5ldyBJZ3hQaXZvdERhdGVEaW1lbnNpb24oKGRpbSBhcyBhbnkpLmluQmFzZURpbWVuc2lvbiwgKGRpbSBhcyBhbnkpLmluT3B0aW9ucyk7XG4gICAgICAgIC8vIHJlc3RvcmUgZnVuY3Rpb25zIGFuZCByZXNvdXJjZSBzdHJpbmdzXG4gICAgICAgIGRpbS5yZXNvdXJjZVN0cmluZ3MgPSBkYXRlRGltLnJlc291cmNlU3RyaW5ncztcbiAgICAgICAgZGltLm1lbWJlckZ1bmN0aW9uID0gZGF0ZURpbS5tZW1iZXJGdW5jdGlvbjtcbiAgICAgICAgbGV0IGN1cnJEaW06IElQaXZvdERpbWVuc2lvbiA9IGRpbTtcbiAgICAgICAgbGV0IG9yaWdpbkRpbTogSVBpdm90RGltZW5zaW9uID0gZGF0ZURpbTtcbiAgICAgICAgd2hpbGUgKGN1cnJEaW0uY2hpbGRMZXZlbCkge1xuICAgICAgICAgICAgY3VyckRpbSA9IGN1cnJEaW0uY2hpbGRMZXZlbDtcbiAgICAgICAgICAgIG9yaWdpbkRpbSA9IG9yaWdpbkRpbS5jaGlsZExldmVsO1xuICAgICAgICAgICAgY3VyckRpbS5tZW1iZXJGdW5jdGlvbiA9IG9yaWdpbkRpbS5tZW1iZXJGdW5jdGlvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhpcyBpcyBhIElneFBpdm90RGF0ZURpbWVuc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzRGF0ZURpbWVuc2lvbihkaW06IElQaXZvdERpbWVuc2lvbikge1xuICAgICAgICByZXR1cm4gKGRpbSBhcyBhbnkpLmluQmFzZURpbWVuc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXN0b3JlcyBjb21wbGV4IG9iamVjdHMgaW4gdGhlIHBpdm90IHZhbHVlcy5cbiAgICAgKiBMaWtlIHRoZSBkZWZhdWx0IGFnZ3JlZ2F0b3IgbWV0aG9kcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc3RvcmVWYWx1ZXMoY29uZmlnOiBJUGl2b3RDb25maWd1cmF0aW9uLCBncmlkOiBJZ3hQaXZvdEdyaWRDb21wb25lbnQpIHtcbiAgICAgICAgLy8gcmVzdG9yZSBhZ2dyZWdhdG9yIGZ1bmMgaWYgaXQgbWF0Y2hlcyB0aGUgZGVmYXVsdCBhZ2dyZWdhdG9ycyBrZXkgYW5kIGxhYmVsXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNvbmZpZy52YWx1ZXM7XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCBhZ2dyZWdhdGVMaXN0ID0gdmFsdWUuYWdncmVnYXRlTGlzdDtcbiAgICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0b3JzID0gUGl2b3RVdGlsLmdldEFnZ3JlZ2F0b3JzRm9yVmFsdWUodmFsdWUsIGdyaWQpO1xuICAgICAgICAgICAgdmFsdWUuYWdncmVnYXRlLmFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9ycy5maW5kKHggPT4geC5rZXkgPT09IHZhbHVlLmFnZ3JlZ2F0ZS5rZXkgJiYgeC5sYWJlbCA9PT0gdmFsdWUuYWdncmVnYXRlLmxhYmVsKT8uYWdncmVnYXRvcjtcbiAgICAgICAgICAgIGlmIChhZ2dyZWdhdGVMaXN0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhZyBvZiBhZ2dyZWdhdGVMaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFnLmFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9ycy5maW5kKHggPT4geC5rZXkgPT09IGFnLmtleSAmJiB4LmxhYmVsID09PSBhZy5sYWJlbCk/LmFnZ3JlZ2F0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYnVpbGRzIGEgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIGZyb20gYSBwcm92aWRlZCBvYmplY3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVFeHByZXNzaW9uc1RyZWVGcm9tT2JqZWN0KGV4cHJUcmVlT2JqZWN0OiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUge1xuICAgICAgICBpZiAoIWV4cHJUcmVlT2JqZWN0IHx8ICFleHByVHJlZU9iamVjdC5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHByZXNzaW9uc1RyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGV4cHJUcmVlT2JqZWN0Lm9wZXJhdG9yLCBleHByVHJlZU9iamVjdC5maWVsZE5hbWUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHByVHJlZU9iamVjdC5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSBpcyBhbiBleHByZXNzaW9ucyB0cmVlIG9yIGEgc2luZ2xlIGV4cHJlc3Npb24uXG4gICAgICAgICAgICBpZiAoKGl0ZW0gYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25zVHJlZUZyb21PYmplY3QoKGl0ZW0gYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSk7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goc3ViVHJlZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cHIgPSBpdGVtIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJHcmlkIGluc3RhbmNlb2YgSWd4UGl2b3RHcmlkQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gdGhpcy5jdXJyR3JpZC5hbGxEaW1lbnNpb25zLmZpbmQoeCA9PiB4Lm1lbWJlck5hbWUgPT09IGV4cHIuZmllbGROYW1lKS5kYXRhVHlwZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VyckdyaWQuY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gdGhpcy5jdXJyR3JpZC5jb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkID09PSBleHByLmZpZWxkTmFtZSkuZGF0YVR5cGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUgPSB0aGlzLnN0YXRlLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IGV4cHIuZmllbGROYW1lKS5kYXRhVHlwZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2hlbiBFU0YsIHZhbHVlcyBhcmUgc3RvcmVkIGluIFNldC5cbiAgICAgICAgICAgICAgICAvLyBGaXJzdCB0aG9zZSB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSBiZWZvcmUgcmV0dXJuaW5nIHN0cmluZyBpbiB0aGUgc3RyaW5naWZ5Q2FsbGJhY2tcbiAgICAgICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBjb252ZXJ0IHRob3NlIGJhY2sgdG8gU2V0XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwci5zZWFyY2hWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cHIuc2VhcmNoVmFsID0gbmV3IFNldChleHByLnNlYXJjaFZhbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwci5zZWFyY2hWYWwgPSBleHByLnNlYXJjaFZhbCAmJiAoZGF0YVR5cGUgPT09ICdkYXRlJyB8fCBkYXRhVHlwZSA9PT0gJ2RhdGVUaW1lJykgPyBuZXcgRGF0ZShEYXRlLnBhcnNlKGV4cHIuc2VhcmNoVmFsKSkgOiBleHByLnNlYXJjaFZhbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uID0gdGhpcy5nZW5lcmF0ZUZpbHRlcmluZ0NvbmRpdGlvbihkYXRhVHlwZSwgZXhwci5jb25kaXRpb24ubmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyR3JpZC5jb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkID09PSBleHByLmZpZWxkTmFtZSkuZmlsdGVycy5jb25kaXRpb24oZXhwci5jb25kaXRpb24ubmFtZSk7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cHIuY29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChleHByKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25zVHJlZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJpbmcgbG9naWMgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZGF0YVR5cGUgYW5kIGNvbmRpdGlvbiAoY29udGFpbnMsIGdyZWF0ZXJUaGFuLCBldGMuKVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGVGaWx0ZXJpbmdDb25kaXRpb24oZGF0YVR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogSUZpbHRlcmluZ09wZXJhdGlvbiB7XG4gICAgICAgIGxldCBmaWx0ZXJzO1xuICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlOlxuICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgICAgICAgICAgZmlsdGVycyA9IElneERhdGVUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBmaWx0ZXJzID0gSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJzLmNvbmRpdGlvbihuYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0cmluZ2lmeUNhbGxiYWNrKGtleTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnc2VhcmNoVmFsJyAmJiB2YWwgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZlYXR1cmUoa2V5OiBzdHJpbmcpOiBGZWF0dXJlIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZTogRmVhdHVyZSA9IHRoaXMuRkVBVFVSRVNba2V5XTtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtJZ3hHcmlkU3RhdGVEaXJlY3RpdmVdLFxuICAgIGV4cG9ydHM6IFtJZ3hHcmlkU3RhdGVEaXJlY3RpdmVdXG59KVxuZXhwb3J0IGNsYXNzIElneEdyaWRTdGF0ZU1vZHVsZSB7IH1cbiJdfQ==