footprintjs 9.35.0 → 9.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/CLAUDE.md +4 -4
  2. package/dist/advanced.js +2 -2
  3. package/dist/esm/advanced.d.ts +2 -2
  4. package/dist/esm/advanced.js +2 -2
  5. package/dist/esm/index.d.ts +2 -2
  6. package/dist/esm/index.js +1 -1
  7. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +5 -34
  8. package/dist/esm/lib/builder/FlowChartBuilder.js +236 -375
  9. package/dist/esm/lib/engine/graph/prefixNodeTree.d.ts +26 -0
  10. package/dist/esm/lib/engine/graph/prefixNodeTree.js +40 -0
  11. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
  12. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.js +3 -3
  13. package/dist/esm/lib/engine/handlers/ResumeEntry.js +11 -2
  14. package/dist/esm/lib/engine/handlers/StageRunner.js +17 -3
  15. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +3 -32
  16. package/dist/esm/lib/engine/index.d.ts +1 -1
  17. package/dist/esm/lib/engine/index.js +1 -1
  18. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  19. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
  20. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
  21. package/dist/esm/lib/engine/narrative/types.d.ts +26 -10
  22. package/dist/esm/lib/engine/narrative/types.js +1 -1
  23. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
  24. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +68 -86
  25. package/dist/esm/lib/engine/traversalContext.d.ts +65 -0
  26. package/dist/esm/lib/engine/traversalContext.js +83 -0
  27. package/dist/esm/lib/engine/types.d.ts +1 -3
  28. package/dist/esm/lib/engine/types.js +1 -1
  29. package/dist/esm/lib/engine/walkSubflowSpec.js +3 -2
  30. package/dist/esm/lib/ids/branchSegment.js +119 -0
  31. package/dist/esm/lib/ids/runtimeStageId.d.ts +191 -0
  32. package/dist/esm/lib/ids/runtimeStageId.js +225 -0
  33. package/dist/esm/lib/memory/StageContext.d.ts +1 -17
  34. package/dist/esm/lib/memory/StageContext.js +2 -37
  35. package/dist/esm/lib/memory/commitLogUtils.js +1 -1
  36. package/dist/esm/lib/memory/logModel.js +1 -1
  37. package/dist/esm/lib/memory/runPolicy.d.ts +2 -3
  38. package/dist/esm/lib/memory/runPolicy.js +3 -4
  39. package/dist/esm/lib/memory/verbs.d.ts +2 -1
  40. package/dist/esm/lib/memory/verbs.js +1 -1
  41. package/dist/esm/lib/pause/index.d.ts +1 -1
  42. package/dist/esm/lib/pause/index.js +1 -1
  43. package/dist/esm/lib/pause/types.d.ts +48 -1
  44. package/dist/esm/lib/pause/types.js +52 -3
  45. package/dist/esm/lib/recorder/CombinedRecorder.d.ts +2 -33
  46. package/dist/esm/lib/recorder/CombinedRecorder.js +10 -62
  47. package/dist/esm/lib/recorder/CompositeRecorder.d.ts +15 -26
  48. package/dist/esm/lib/recorder/CompositeRecorder.js +33 -97
  49. package/dist/esm/lib/recorder/EmitRecorder.d.ts +2 -7
  50. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  51. package/dist/esm/lib/recorder/InOutRecorder.js +3 -2
  52. package/dist/esm/lib/recorder/hooks.d.ts +249 -0
  53. package/dist/esm/lib/recorder/hooks.js +132 -0
  54. package/dist/esm/lib/recorder/snapshot.d.ts +19 -0
  55. package/dist/esm/lib/recorder/snapshot.js +26 -0
  56. package/dist/esm/lib/runner/DeferredObserverTier.js +15 -25
  57. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +1 -18
  58. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -37
  59. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -8
  60. package/dist/esm/lib/runner/FlowChartExecutor.js +59 -32
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +6 -5
  62. package/dist/esm/lib/scope/ScopeFacade.d.ts +6 -1
  63. package/dist/esm/lib/scope/ScopeFacade.js +36 -61
  64. package/dist/esm/lib/scope/types.d.ts +3 -9
  65. package/dist/esm/lib/scope/types.js +1 -1
  66. package/dist/esm/lib/time-travel/chain.js +2 -2
  67. package/dist/esm/lib/time-travel/commitStops.js +4 -4
  68. package/dist/esm/lib/time-travel/index.d.ts +1 -1
  69. package/dist/esm/lib/time-travel/index.js +2 -2
  70. package/dist/esm/lib/time-travel/timeTravel.js +8 -9
  71. package/dist/esm/lib/time-travel/types.d.ts +1 -1
  72. package/dist/esm/lib/time-travel/types.js +2 -2
  73. package/dist/esm/trace.d.ts +3 -3
  74. package/dist/esm/trace.js +3 -3
  75. package/dist/index.js +1 -1
  76. package/dist/lib/builder/FlowChartBuilder.js +236 -375
  77. package/dist/lib/engine/graph/prefixNodeTree.js +44 -0
  78. package/dist/lib/engine/handlers/ParallelForEachHandler.js +3 -3
  79. package/dist/lib/engine/handlers/ResumeEntry.js +10 -1
  80. package/dist/lib/engine/handlers/StageRunner.js +17 -3
  81. package/dist/lib/engine/handlers/SubflowExecutor.js +3 -32
  82. package/dist/lib/engine/index.js +1 -1
  83. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
  84. package/dist/lib/engine/narrative/types.js +1 -1
  85. package/dist/lib/engine/traversal/FlowchartTraverser.js +68 -86
  86. package/dist/lib/engine/traversalContext.js +89 -0
  87. package/dist/lib/engine/types.js +1 -1
  88. package/dist/lib/engine/walkSubflowSpec.js +3 -2
  89. package/dist/lib/ids/branchSegment.js +127 -0
  90. package/dist/lib/ids/runtimeStageId.js +242 -0
  91. package/dist/lib/memory/StageContext.js +1 -36
  92. package/dist/lib/memory/commitLogUtils.js +1 -1
  93. package/dist/lib/memory/logModel.js +1 -1
  94. package/dist/lib/memory/runPolicy.js +3 -4
  95. package/dist/lib/memory/verbs.js +1 -1
  96. package/dist/lib/pause/index.js +1 -1
  97. package/dist/lib/pause/types.js +54 -4
  98. package/dist/lib/recorder/CombinedRecorder.js +11 -63
  99. package/dist/lib/recorder/CompositeRecorder.js +33 -97
  100. package/dist/lib/recorder/EmitRecorder.js +1 -1
  101. package/dist/lib/recorder/InOutRecorder.js +3 -2
  102. package/dist/lib/recorder/hooks.js +140 -0
  103. package/dist/lib/recorder/snapshot.js +30 -0
  104. package/dist/lib/runner/DeferredObserverTier.js +16 -26
  105. package/dist/lib/runner/ExecutionRuntime.js +1 -36
  106. package/dist/lib/runner/FlowChartExecutor.js +58 -31
  107. package/dist/lib/runner/getSubtreeSnapshot.js +6 -5
  108. package/dist/lib/scope/ScopeFacade.js +36 -61
  109. package/dist/lib/scope/types.js +1 -1
  110. package/dist/lib/time-travel/chain.js +2 -2
  111. package/dist/lib/time-travel/commitStops.js +4 -4
  112. package/dist/lib/time-travel/index.js +2 -2
  113. package/dist/lib/time-travel/timeTravel.js +8 -9
  114. package/dist/lib/time-travel/types.js +2 -2
  115. package/dist/trace.js +3 -3
  116. package/dist/types/advanced.d.ts +2 -2
  117. package/dist/types/index.d.ts +2 -2
  118. package/dist/types/lib/builder/FlowChartBuilder.d.ts +5 -34
  119. package/dist/types/lib/engine/graph/prefixNodeTree.d.ts +26 -0
  120. package/dist/types/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
  121. package/dist/types/lib/engine/index.d.ts +1 -1
  122. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  123. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
  124. package/dist/types/lib/engine/narrative/types.d.ts +26 -10
  125. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
  126. package/dist/types/lib/engine/traversalContext.d.ts +65 -0
  127. package/dist/types/lib/engine/types.d.ts +1 -3
  128. package/dist/types/lib/ids/runtimeStageId.d.ts +191 -0
  129. package/dist/types/lib/memory/StageContext.d.ts +1 -17
  130. package/dist/types/lib/memory/runPolicy.d.ts +2 -3
  131. package/dist/types/lib/memory/verbs.d.ts +2 -1
  132. package/dist/types/lib/pause/index.d.ts +1 -1
  133. package/dist/types/lib/pause/types.d.ts +48 -1
  134. package/dist/types/lib/recorder/CombinedRecorder.d.ts +2 -33
  135. package/dist/types/lib/recorder/CompositeRecorder.d.ts +15 -26
  136. package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -7
  137. package/dist/types/lib/recorder/hooks.d.ts +249 -0
  138. package/dist/types/lib/recorder/snapshot.d.ts +19 -0
  139. package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -18
  140. package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -8
  141. package/dist/types/lib/scope/ScopeFacade.d.ts +6 -1
  142. package/dist/types/lib/scope/types.d.ts +3 -9
  143. package/dist/types/lib/time-travel/index.d.ts +1 -1
  144. package/dist/types/lib/time-travel/types.d.ts +1 -1
  145. package/dist/types/trace.d.ts +3 -3
  146. package/package.json +1 -1
  147. package/dist/esm/lib/engine/branchSegment.js +0 -119
  148. package/dist/esm/lib/engine/runtimeStageId.d.ts +0 -103
  149. package/dist/esm/lib/engine/runtimeStageId.js +0 -119
  150. package/dist/esm/lib/recorder/invokeHook.d.ts +0 -8
  151. package/dist/esm/lib/recorder/invokeHook.js +0 -9
  152. package/dist/lib/engine/branchSegment.js +0 -127
  153. package/dist/lib/engine/runtimeStageId.js +0 -126
  154. package/dist/lib/recorder/invokeHook.js +0 -13
  155. package/dist/types/lib/engine/runtimeStageId.d.ts +0 -103
  156. package/dist/types/lib/recorder/invokeHook.d.ts +0 -8
  157. /package/dist/esm/lib/{engine → ids}/branchSegment.d.ts +0 -0
  158. /package/dist/types/lib/{engine → ids}/branchSegment.d.ts +0 -0
@@ -22,8 +22,10 @@
22
22
  * Break semantics: If a stage calls breakFn(), commit and STOP.
23
23
  * Patch model: Stage writes into local patch; commitPatch() after return or throw.
24
24
  */
25
+ import { buildRuntimeStageId, joinPath, refuseReservedId } from '../../ids/runtimeStageId.js';
25
26
  import { isPauseSignal } from '../../pause/types.js';
26
27
  import { extractErrorInfo } from '../errors/errorInfo.js';
28
+ import { prefixNodeTree } from '../graph/prefixNodeTree.js';
27
29
  import { isStageNodeReturn } from '../graph/StageNode.js';
28
30
  import { ChildrenExecutor } from '../handlers/ChildrenExecutor.js';
29
31
  import { ContinuationResolver } from '../handlers/ContinuationResolver.js';
@@ -38,7 +40,7 @@ import { SubflowExecutor } from '../handlers/SubflowExecutor.js';
38
40
  import { FlowRecorderDispatcher } from '../narrative/FlowRecorderDispatcher.js';
39
41
  import { NarrativeFlowRecorder } from '../narrative/NarrativeFlowRecorder.js';
40
42
  import { NullControlFlowNarrativeGenerator } from '../narrative/NullControlFlowNarrativeGenerator.js';
41
- import { buildRuntimeStageId } from '../runtimeStageId.js';
43
+ import { rootTraversalContext, traversalContextFor } from '../traversalContext.js';
42
44
  /**
43
45
  * Trampoline brand — marks a continuation hop returned by `executeNodeStep`
44
46
  * to the driver loop in `executeNode`. Module-private symbol so a stage's own
@@ -164,15 +166,6 @@ export class FlowchartTraverser {
164
166
  * recursive composition.
165
167
  */
166
168
  _executeDepth = 0;
167
- /**
168
- * Memoized parent-chain depth per StageContext. The context tree deepens
169
- * by one per executed stage along a chain, so the naive parent-walk in
170
- * `computeContextDepth` is O(chain length) per stage — O(n²) per run once
171
- * the trampoline allows chains of tens of thousands of stages. Contexts
172
- * are visited parent-before-child, so the memo makes each lookup O(1)
173
- * amortized. WeakMap — dies with the traverser.
174
- */
175
- contextDepthCache = new WeakMap();
176
169
  /**
177
170
  * Shared mutable execution counter — monotonic, incremented per stage execution.
178
171
  * Shared with child traversers (subflows) so indices are globally unique within a run.
@@ -395,13 +388,7 @@ export class FlowchartTraverser {
395
388
  // root-stage defaults (stageId='__root__', runtimeStageId='__root__#0',
396
389
  // depth 0) so the runId is reliably available on run events without
397
390
  // forcing recorders to handle `traversalContext === undefined`.
398
- const rootContext = {
399
- runId: this.runId,
400
- stageId: '__root__',
401
- runtimeStageId: '__root__#0',
402
- stageName: '__root__',
403
- depth: 0,
404
- };
391
+ const rootContext = rootTraversalContext(this.runId);
405
392
  if (isTopLevel) {
406
393
  // `readOnlyContext` is the engine's view of `run({input})` — passed
407
394
  // through from `FlowChartExecutor.run()` as the validated input.
@@ -655,6 +642,44 @@ export class FlowchartTraverser {
655
642
  }
656
643
  }
657
644
  }
645
+ /**
646
+ * R5 for ids a stage ADOPTS at run time (a returned StageNode's `next` chain,
647
+ * `children` and subflow ids): the same refusal the builder's doors apply —
648
+ * `ids/runtimeStageId.ts · refuseReservedId` — so "no user id carries a
649
+ * grammar delimiter" stays true by construction. Loop-ref stubs (they name an
650
+ * existing node) and the chart's own nodes (admitted at build; a prefixed id
651
+ * carries `/` on purpose) are not new ids and are skipped. A subflow
652
+ * definition's own tree is a built chart and is not walked.
653
+ */
654
+ admitDynamicIds(output) {
655
+ if (!output || typeof output !== 'object' || !isStageNodeReturn(output))
656
+ return;
657
+ const root = output;
658
+ const refuse = (refusal) => {
659
+ if (refusal !== undefined)
660
+ throw new Error(`[footprint] dynamic StageNode: ${refusal}`);
661
+ };
662
+ if (root.subflowId)
663
+ refuse(refuseReservedId('dynamic subflow id', root.subflowId, 'segment'));
664
+ const seen = new Set();
665
+ const stack = [root.next, ...(root.children ?? [])];
666
+ while (stack.length > 0) {
667
+ const n = stack.pop();
668
+ if (!n || seen.has(n) || n.isLoopRef)
669
+ continue;
670
+ seen.add(n);
671
+ const refusal = refuseReservedId('dynamic stage id', n.id, 'stage') ??
672
+ (n.subflowId ? refuseReservedId('dynamic subflow id', n.subflowId, 'segment') : undefined);
673
+ if (refusal !== undefined) {
674
+ // Only a SUSPECT id pays for the chart lookup: a chart node (and the
675
+ // chart below it) was admitted at build.
676
+ if (this.nodeResolver.findNodeById(n.id) === n)
677
+ continue;
678
+ refuse(refusal);
679
+ }
680
+ stack.push(n.next, ...(n.children ?? []));
681
+ }
682
+ }
658
683
  /** `retryOn` gate. A throwing predicate counts as "do not retry" — a broken
659
684
  * predicate must never turn a failing stage into an endless retry loop. */
660
685
  shouldRetry(policy, error) {
@@ -782,18 +807,17 @@ export class FlowchartTraverser {
782
807
  this._visitCounts.set(contextStageId, visitCount);
783
808
  const loopIteration = visitCount > 1 ? visitCount - 1 : undefined;
784
809
  // Build traversal context for recorder events — created once per stage, shared by all events
785
- const traversalContext = {
810
+ const traversalContext = traversalContextFor({
786
811
  runId: this.runId,
787
812
  stageId: contextStageId,
788
813
  runtimeStageId: context.runtimeStageId,
789
814
  stageName: node.name,
790
815
  parentStageId: context.parent?.stageId,
791
- ...(parentRuntimeStageId && { parentRuntimeStageId }),
792
- ...(loopIteration !== undefined && { loopIteration }),
816
+ parentRuntimeStageId,
817
+ loopIteration,
793
818
  subflowId: context.subflowId ?? this.parentSubflowId,
794
819
  subflowPath: branchPath || undefined,
795
- depth: this.computeContextDepth(context),
796
- };
820
+ });
797
821
  // ─── Phase 0a: LAZY RESOLVE — deferred subflow resolution ───
798
822
  // Guard uses the per-traverser resolvedLazySubflows set (not the shared node) so
799
823
  // concurrent traversers do not race on node.subflowResolver or clear it for each other.
@@ -804,7 +828,7 @@ export class FlowchartTraverser {
804
828
  this.subflows[node.subflowId] = { root: prefixedRoot };
805
829
  // Merge stageMap entries
806
830
  for (const [key, fn] of resolved.stageMap) {
807
- const prefixedKey = `${node.subflowId}/${key}`;
831
+ const prefixedKey = joinPath(node.subflowId, key);
808
832
  if (!this.stageMap.has(prefixedKey)) {
809
833
  this.stageMap.set(prefixedKey, fn);
810
834
  }
@@ -812,9 +836,13 @@ export class FlowchartTraverser {
812
836
  // Merge nested subflows
813
837
  if (resolved.subflows) {
814
838
  for (const [key, def] of Object.entries(resolved.subflows)) {
815
- const prefixedKey = `${node.subflowId}/${key}`;
839
+ const prefixedKey = joinPath(node.subflowId, key);
816
840
  if (!this.subflows[prefixedKey]) {
817
- this.subflows[prefixedKey] = def;
841
+ // Prefixed like the builder's `_mergeSubflows` (9.37.0 fix): the
842
+ // nested root's ids live under the lazy mount's path too.
843
+ this.subflows[prefixedKey] = {
844
+ root: prefixNodeTree(def.root, node.subflowId),
845
+ };
818
846
  }
819
847
  }
820
848
  }
@@ -989,6 +1017,10 @@ export class FlowchartTraverser {
989
1017
  if (stageFunc) {
990
1018
  try {
991
1019
  stageOutput = await this.executeStage(node, stageFunc, context, breakFn, traversalContext);
1020
+ // R5 at the run-time door: a returned StageNode adopts ids the builder
1021
+ // never saw. Refused here, inside the try, so it takes the stage's
1022
+ // error path (commit, onError, rethrow).
1023
+ this.admitDynamicIds(stageOutput);
992
1024
  }
993
1025
  catch (error) {
994
1026
  // PauseSignal is expected control flow, not an error — fire narrative, commit, re-throw.
@@ -1167,37 +1199,6 @@ export class FlowchartTraverser {
1167
1199
  pipelineStructure: childStructure,
1168
1200
  });
1169
1201
  }
1170
- /**
1171
- * Parent-chain length of a StageContext — same value the pre-trampoline
1172
- * walk produced, memoized. The context tree deepens by one per executed
1173
- * stage along a chain, so the naive walk is O(chain length) per stage —
1174
- * O(n²) per run once chains reach trampoline scale. Contexts are visited
1175
- * parent-before-child, so the cached parent makes this O(1) amortized.
1176
- */
1177
- computeContextDepth(context) {
1178
- const cached = this.contextDepthCache.get(context);
1179
- if (cached !== undefined)
1180
- return cached;
1181
- // Walk up to the nearest cached ancestor (or the root), then fill the
1182
- // cache back down — iterative, so a cold deep chain can't overflow.
1183
- const uncached = [];
1184
- let depth = -1; // depth of the node ABOVE the first uncached entry
1185
- let current = context;
1186
- while (current) {
1187
- const hit = this.contextDepthCache.get(current);
1188
- if (hit !== undefined) {
1189
- depth = hit;
1190
- break;
1191
- }
1192
- uncached.push(current);
1193
- current = current.parent;
1194
- }
1195
- for (let i = uncached.length - 1; i >= 0; i--) {
1196
- depth++;
1197
- this.contextDepthCache.set(uncached[i], depth);
1198
- }
1199
- return depth;
1200
- }
1201
1202
  /**
1202
1203
  * Register a generated `parallelForEach` branch as a subflow — OVERWRITING
1203
1204
  * any registration from a previous visit.
@@ -1217,45 +1218,26 @@ export class FlowchartTraverser {
1217
1218
  this.subflows[subflowId] = { root };
1218
1219
  // Stage functions land under the branch's prefix, matching the prefixed ids.
1219
1220
  for (const [key, fn] of chart.stageMap) {
1220
- this.stageMap.set(`${subflowId}/${key}`, fn);
1221
+ this.stageMap.set(joinPath(subflowId, key), fn);
1221
1222
  }
1222
1223
  // Nested subflows inside the branch chart, same prefixing.
1223
1224
  if (chart.subflows) {
1224
1225
  for (const [key, def] of Object.entries(chart.subflows)) {
1225
- this.subflows[`${subflowId}/${key}`] = def;
1226
+ // Prefixed like the builder's `_mergeSubflows` (9.37.0 fix): without it
1227
+ // every branch ran its nested subflow's stages under ONE id.
1228
+ this.subflows[joinPath(subflowId, key)] = {
1229
+ root: prefixNodeTree(def.root, subflowId),
1230
+ };
1226
1231
  }
1227
1232
  }
1228
1233
  }
1229
1234
  /**
1230
- * Prefix a node tree with a subflow path segment.
1231
- *
1232
- * ── BYTE-TWIN CONTRACT ──────────────────────────────────────────────────
1233
- * This function and `FlowChartBuilder._prefixNodeTree` are byte-twins by
1234
- * contract: the builder prefixes at MOUNT time, this one at RUN time (lazy
1235
- * subflows, and the generated branches of `addParallelForEach`), and a chart
1236
- * must come out identical either way. `test/lib/engine/branch-segment-prefixer-equivalence.test.ts`
1237
- * pins that — any edit here must be mirrored there, and vice versa.
1238
- *
1239
- * Generated branch segments (`<stageId>~<index>`, see `engine/branchSegment.ts`)
1240
- * ride this exact path with no special case: the segment is just a prefix, so
1241
- * a branch's inner ids become `<segment>/<id>` and its stages address as
1242
- * `<segment>/<id>#<n>` — the shipped grammar, which is why every trace query
1243
- * reads branch commits unmodified. Design: docs/design/execution-control.md.
1235
+ * Prefix a node tree with a subflow path segment at RUN time (lazy subflows,
1236
+ * the generated branches of `addParallelForEach`) — the one prefixer,
1237
+ * `engine/graph/prefixNodeTree.ts`, which the builder calls at mount time.
1244
1238
  */
1245
1239
  prefixNodeTree(node, prefix) {
1246
- if (!node)
1247
- return node;
1248
- const clone = { ...node };
1249
- clone.name = `${prefix}/${node.name}`;
1250
- clone.id = `${prefix}/${clone.id}`;
1251
- if (clone.subflowId)
1252
- clone.subflowId = `${prefix}/${clone.subflowId}`;
1253
- if (clone.next)
1254
- clone.next = this.prefixNodeTree(clone.next, prefix);
1255
- if (clone.children) {
1256
- clone.children = clone.children.map((c) => this.prefixNodeTree(c, prefix));
1257
- }
1258
- return clone;
1240
+ return prefixNodeTree(node, prefix);
1259
1241
  }
1260
1242
  autoRegisterSubflowDef(subflowId, subflowDef, mountNodeId) {
1261
1243
  // this.subflows is always initialized in the constructor; the null guard below is unreachable.
@@ -1294,4 +1276,4 @@ export class FlowchartTraverser {
1294
1276
  }
1295
1277
  }
1296
1278
  }
1297
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFHSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxpQ0FBaUMsRUFB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QVcsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUM7WUFDdkYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUN6QyxTQUFTLEVBQ1QsV0FBVyxFQUNYLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUM1QixVQUFVLENBQUMsa0JBQWtCLENBQzlCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKAlCBQcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBvZiBTdGFnZU5vZGUgZ3JhcGguXG4gKlxuICogVW5pZmllZCB0cmF2ZXJzYWwgYWxnb3JpdGhtIGZvciBhbGwgbm9kZSBzaGFwZXMuIGBleGVjdXRlTm9kZWAgaXMgYVxuICogVFJBTVBPTElORSBkcml2ZXI6IGl0IHJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluXG4gKiBhIGZsYXQgbG9vcCwgZm9sbG93aW5nIHRhaWwgY29udGludWF0aW9ucyAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlcyxcbiAqIGR5bmFtaWMgbmV4dCwgZmxhdCBkZWNpZGVyIGRpc3BhdGNoKSBpdGVyYXRpdmVseSDigJQgc28gY2hhaW4gbGVuZ3RoIGFuZFxuICogbG9vcCBpdGVyYXRpb25zIG5ldmVyIGdyb3cgdGhlIGNhbGwgc3RhY2suIE9ubHkgdHJ1ZSB0cmVlIG5lc3RpbmcgKGZvcmtcbiAqIGNoaWxkcmVuLCB3aXRoLWNvbnRpbnVhdGlvbiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLCBzdWJmbG93IG1vdW50cylcbiAqIHJlY3Vyc2VzLlxuICpcbiAqIEZvciBlYWNoIG5vZGUsIGV4ZWN1dGVOb2RlU3RlcCBmb2xsb3dzIDcgcGhhc2VzOlxuICogICAwLiBDTEFTU0lGWSAg4oCUIHN1YmZsb3cgZGV0ZWN0aW9uLCBlYXJseSBkZWxlZ2F0aW9uXG4gKiAgIDBiLiBQQVJBTExFTC1GT1ItRUFDSCDigJQgZHluYW1pYyBmYW4tb3V0IChicmFuY2hlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGF5bG9hZClcbiAqICAgMS4gVkFMSURBVEUgIOKAlCBub2RlIGludmFyaWFudHMsIHJvbGUgbWFya2Vyc1xuICogICAyLiBFWEVDVVRFICAg4oCUIHJ1biBzdGFnZSBmbiwgY29tbWl0LCBicmVhayBjaGVja1xuICogICAzLiBEWU5BTUlDICAg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uLCBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLCBzdHJ1Y3R1cmUgdXBkYXRlc1xuICogICA0LiBDSElMRFJFTiAg4oCUIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBkaXNwYXRjaFxuICogICA1LiBDT05USU5VRSAg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IHJlc29sdXRpb25cbiAqICAgNi4gTEVBRiAgICAgIOKAlCBubyBjb250aW51YXRpb24sIHJldHVybiBvdXRwdXRcbiAqXG4gKiBCcmVhayBzZW1hbnRpY3M6IElmIGEgc3RhZ2UgY2FsbHMgYnJlYWtGbigpLCBjb21taXQgYW5kIFNUT1AuXG4gKiBQYXRjaCBtb2RlbDogU3RhZ2Ugd3JpdGVzIGludG8gbG9jYWwgcGF0Y2g7IGNvbW1pdFBhdGNoKCkgYWZ0ZXIgcmV0dXJuIG9yIHRocm93LlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBpc1N0YWdlTm9kZVJldHVybiB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBDb250aW51YXRpb25SZXNvbHZlciB9IGZyb20gJy4uL2hhbmRsZXJzL0NvbnRpbnVhdGlvblJlc29sdmVyLmpzJztcbmltcG9ydCB7IERlY2lkZXJIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvRGVjaWRlckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvTm9kZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9QYXJhbGxlbEZvckVhY2hIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVkUGF1c2UgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBxdWV1ZUJlaGluZCwgcmFpc2VRdWV1ZWRQYXVzZSwgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBSdW50aW1lU3RydWN0dXJlTWFuYWdlciB9IGZyb20gJy4uL2hhbmRsZXJzL1J1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlbGVjdG9ySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1NlbGVjdG9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL1N0YWdlUnVubmVyLmpzJztcbmltcG9ydCB7IFN1YmZsb3dFeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4uL2hhbmRsZXJzL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi4vcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlbGVjdG9yLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZXJPcHRpb25zPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIGdyYXBoIHRoaXMgdHJhdmVyc2VyIHdhbGtzIOKAlCBhbmQgdGhlIGdyYXBoIGV2ZXJ5IGlkIHJlc29sdmVzIGFnYWluc3RcbiAgICogKHRoZSBub2RlIG1hcCBiZWhpbmQgZXZlcnkgYGxvb3BUb2AsIHRoZSBERlMgZmFsbGJhY2spLiBgZXhlY3V0ZSgpYFxuICAgKiBzdGFydHMgaGVyZSB1bmxlc3MgYGVudHJ5YCBzYXlzIG90aGVyd2lzZS5cbiAgICovXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogV2hlcmUgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgYSByZXN1bWUncyBvbmUtc2hvdFxuICAgKiByZS1lbnRyeSAoTTIpOiB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3RcbiAgICogc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aCwgZWFjaCB3aXRoIGl0cyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uXG4gICAqIGF0dGFjaGVkLiBWaXNpdGVkIG9uY2UsIGZpcnN0LCBhbmQgbmV2ZXIgcmVnaXN0ZXJlZCBhbnl3aGVyZSBhbiBpZCBjYW5cbiAgICogcmVhY2ggaXQsIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgc3RhZ2UgZmluZHMgdGhlIFJFQUwgc3RhZ2UuXG4gICAqIENvbnN1bWVkIGJ5IHRoZSBmaXJzdCBgZXhlY3V0ZSgpYC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYXQgdGhpcyBsZXZlbCAoYSByZXN1bWUsIDkuMjguMCk6IG9uY2VcbiAgICogYGVudHJ5YCdzIGNoYWluIGVuZHMsIGBleGVjdXRlKClgIHJhaXNlcyB0aGUgZmlyc3QgYWdhaW4gKHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KTsgYSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluIGNhcnJpZXMgdGhlbSBhbGwuIE9ubHlcbiAgICogd2l0aCBgZW50cnlgOyBjb25zdW1lZCBieSB0aGUgZmlyc3QgYGV4ZWN1dGUoKWAuIFNlZSBgUmVzdW1lRW50cnlgLlxuICAgKi9cbiAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcy5qcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoICh0cmVlIG5lc3Rpbmcg4oCUIGJyYW5jaC9mb3JrIGRpc3BhdGNoIGFuZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbiwgTk9UIGxpbmVhciBjaGFpbnMgb3IgbG9vcCBpdGVyYXRpb25zLCB3aGljaCBydW4gZmxhdCkuXG4gICAqIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgcGVyIG5vZGUgKHRoZSBDb250aW51YXRpb25SZXNvbHZlciBndWFyZCkuXG4gICAqIERlZmF1bHRzIHRvIERFRkFVTFRfTUFYX0lURVJBVElPTlMgKDEwMDApLiBQcm9wYWdhdGVkIHRvIHN1YmZsb3dcbiAgICogdHJhdmVyc2Vycy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCBzZXQgdGhpcyB0byB0aGUgc3ViZmxvdydzIElELlxuICAgKiBQcm9wYWdhdGVkIHRvIFRyYXZlcnNhbENvbnRleHQgc28gbmFycmF0aXZlIGVudHJpZXMgY2FycnkgdGhlIGNvcnJlY3Qgc3ViZmxvd0lkLlxuICAgKi9cbiAgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGVcbiAgICogc3ViZmxvdyBNT1VOVCBzdGFnZSBpbiB0aGUgcGFyZW50IHRyYXZlcnNlci4gVXNlZCBhcyB0aGVcbiAgICogYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmYWxsYmFjayBmb3Igc3RhZ2VzIHdob3NlIFN0YWdlQ29udGV4dCBoYXMgbm9cbiAgICogcGFyZW50ICh0aGUgc3ViZmxvdydzIG93biByb290IGNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCBieVxuICAgKiBTdWJmbG93RXhlY3V0b3IpIHNvIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllc1xuICAgKiAoUkZDLTAwMyBEMSkuXG4gICAqL1xuICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGZyb20gcGFyZW50IHRyYXZlcnNlci4gU3ViZmxvd3MgY29udGludWUgdGhlIHBhcmVudCdzIG51bWJlcmluZy4gKi9cbiAgZXhlY3V0aW9uQ291bnRlcj86IHsgdmFsdWU6IG51bWJlciB9O1xuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQtY291bnQgbWFwIChrZXllZCBieSBzdGFnZUlkKSBmcm9tIHRoZSBwYXJlbnQgdHJhdmVyc2VyLlxuICAgKiBEcml2ZXMgYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAuIFNoYXJlZCB3aXRoIHN1YmZsb3dzIHNvIGEgc3RhZ2VcbiAgICogcmUtZW50ZXJlZCBhY3Jvc3MgYSBzdWJmbG93IHJlLW1vdW50IGtlZXBzIGEgY29ycmVjdCwgbW9ub3RvbmljIGl0ZXJhdGlvblxuICAgKiBjb3VudCDigJQgdGhlIHNhbWUgc2luZ2xlLW1hcCBzZW1hbnRpY3MgdGhlIG5hcnJhdGl2ZSByZWNvcmRlciB1c2VzLlxuICAgKi9cbiAgdmlzaXRDb3VudHM/OiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChNMiksIHNoYXJlZCBieSByZWZlcmVuY2Ugd2l0aCBldmVyeVxuICAgKiBuZXN0ZWQgdHJhdmVyc2VyICh0aGUgZXhlY3V0aW9uIGNvdW50ZXIncyBwcmVjZWRlbnQpOiBlYWNoIHN1YmZsb3cgb24gdGhlXG4gICAqIHBhdXNlIHBhdGggdGFrZXMgaXRzIGNhcHR1cmVkIHN0YXRlIGFuZCBpdHMgZW50cnkgcG9pbnQgZXhhY3RseSBvbmNlLCBvblxuICAgKiBpdHMgZmlyc3QgZW50cnkuIFNlZSBgUmVzdW1lRW50cnlgLiBVbmRlZmluZWQgb24gbm9ybWFsIGBydW4oKWAgcGF0aHMuXG4gICAqL1xuICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS4yOC4wIOKAlCBwYXNzIHtAbGluayByZXN1bWV9LiBTdGlsbCBob25vdXJlZCwgdW5kZXIgdGhlXG4gICAqIHNhbWUgb25lLXNob3QgbGF3OiBlYWNoIGNhcHR1cmUgc2VlZHMgb25seSB0aGUgRklSU1QgZW50cnkgaW50byBpdHNcbiAgICogc3ViZmxvdyAoaW4gcGxhY2Ugb2YgdGhlIGlucHV0TWFwcGVyJ3MgdmFsdWVzKTsgbGF0ZXIgZW50cmllcyBhcmVcbiAgICogb3JkaW5hcnkuIElnbm9yZWQgd2hlbiBgcmVzdW1lYCBpcyBzZXQuXG4gICAqL1xuICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKipcbiAgICogUGVyLWBleGVjdXRvci5ydW4oKWAgaWRlbnRpZmllci4gVGhyZWFkZWQgaW50byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0XG4gICAqIHRoaXMgdHJhdmVyc2VyIHByb2R1Y2VzIHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGUgcnVuLlxuICAgKiBTdWJmbG93IHRyYXZlcnNlcnMgaW5oZXJpdCB0aGUgcGFyZW50J3MgcnVuSWQgKHRoZSBzdWJmbG93IGlzIHBhcnQgb2ZcbiAgICogdGhlIHNhbWUgcnVuIGZyb20gdGhlIGNvbnN1bWVyJ3MgUE9WKS4gUmVxdWlyZWQgZmllbGQg4oCUIGV2ZXJ5IGV2ZW50XG4gICAqIG5lZWRzIGl0LiBTZWUgYHJ1bm5lci9ydW5JZC50c2AuXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYXZlcnNlci1sb2NhbCBvdmVybGF5IGVudHJ5IGZvciBhIG5vZGUgd2hvc2Ugc3RhZ2UgZnVuY3Rpb24gcmV0dXJuZWQgYVxuICogU3RhZ2VOb2RlIChkeW5hbWljIGNvbnRpbnVhdGlvbikuIEhvbGRzIHRoZSBkeW5hbWljIHZhbHVlcyB0aGF0IGVhcmxpZXJcbiAqIHZlcnNpb25zIHdyb3RlIERJUkVDVExZIG9udG8gdGhlIHNoYXJlZCBidWlsdC1jaGFydCBub2RlIOKAlCB3aGljaCBsZWFrZWQgdGhlXG4gKiBkeW5hbWljIHNoYXBlIGludG8gZXZlcnkgbGF0ZXIgcnVuIG9mIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFuZCByYWNlZFxuICogY29uY3VycmVudCBleGVjdXRvcnMuIFRoZSBvdmVybGF5IGtlZXBzIHRoZSBidWlsdCBncmFwaCBpbW11dGFibGU6IHBhdGNoZXNcbiAqIGxpdmUgaW4gYSBwZXItdHJhdmVyc2VyIE1hcCBrZXllZCBieSBgbm9kZS5pZGAgYW5kIGRpZSB3aXRoIHRoZSBydW4uXG4gKlxuICogYG5leHRgIGlzIGludGVudGlvbmFsbHkgQUJTRU5UOiBhIGR5bmFtaWMgYG5leHRgIG9ubHkgZXZlciBhcHBsaWVzIHRvIHRoZVxuICogdmlzaXQgdGhhdCBwcm9kdWNlZCBpdCAodGhlIG9sZCBjb2RlIHdyb3RlIGBub2RlLm5leHRgIGFuZCByZXN0b3JlZCBpdFxuICogYmVmb3JlIGFueXRoaW5nIGNvdWxkIG9ic2VydmUgdGhlIHdyaXRlKSwgc28gaXQgc3RheXMgYSBsb2NhbCB2YXJpYWJsZSBpblxuICogYGV4ZWN1dGVOb2RlYCBhbmQgaXMgcm91dGVkIHRocm91Z2ggYENvbnRpbnVhdGlvblJlc29sdmVyYCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljTm9kZVBhdGNoPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogU3ViZmxvdyBtb3VudCBtZXRhZGF0YSBmcm9tIGEgZHluYW1pYy1zdWJmbG93IHJldHVybi4gR3JvdXBlZCBzbyB0aGVcbiAgICogbWVyZ2VkIHZpZXcgcmVwcm9kdWNlcyB0aGUgb2xkIGZpZWxkLXdpc2Ugb3ZlcndyaXRlIGV4YWN0bHkg4oCUIGluY2x1ZGluZ1xuICAgKiBgc3ViZmxvd05hbWVgL2BzdWJmbG93TW91bnRPcHRpb25zYCBiZWNvbWluZyB1bmRlZmluZWQgd2hlbiB0aGUgZHluYW1pY1xuICAgKiByZXR1cm4gb21pdHRlZCB0aGVtLlxuICAgKi9cbiAgc3ViZmxvd01ldGE/OiB7XG4gICAgaXNTdWJmbG93Um9vdDogdHJ1ZTtcbiAgICBzdWJmbG93SWQ6IHN0cmluZztcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBEeW5hbWljIGZvcmsgY2hpbGRyZW4gKHJlcGxhY2VzIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4gZm9yIHRoaXMgcnVuKS4gKi9cbiAgY2hpbGRyZW4/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAvKiogRHluYW1pYyBvdXRwdXQtYmFzZWQgc2VsZWN0b3IgYWNjb21wYW55aW5nIGR5bmFtaWMgY2hpbGRyZW4uICovXG4gIG5leHROb2RlU2VsZWN0b3I/OiBTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBUcmFtcG9saW5lIGJyYW5kIOKAlCBtYXJrcyBhIGNvbnRpbnVhdGlvbiBob3AgcmV0dXJuZWQgYnkgYGV4ZWN1dGVOb2RlU3RlcGBcbiAqIHRvIHRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgLiBNb2R1bGUtcHJpdmF0ZSBzeW1ib2wgc28gYSBzdGFnZSdzIG93blxuICogcmV0dXJuIHZhbHVlICh3aGljaCBjYW4gYmUgYW55IG9iamVjdCkgY2FuIG5ldmVyIGJlIG1pc3Rha2VuIGZvciBhIGhvcC5cbiAqL1xuY29uc3QgQ09OVElOVUVfSE9QOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdmb290cHJpbnRqcy5leGVjdXRlTm9kZS5jb250aW51ZScpO1xuXG4vKipcbiAqIEEgZmxhdCBjb250aW51YXRpb24g4oCUIFwiZXhlY3V0ZSB0aGlzIG5vZGUgbmV4dCwgaW4gdGhpcyBjb250ZXh0XCIg4oCUIHJldHVybmVkXG4gKiBieSBgZXhlY3V0ZU5vZGVTdGVwYCBmb3IgZXZlcnkgVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3BcbiAqIGVkZ2VzLCBkeW5hbWljIG5leHQsIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXJcbiAqIGRpc3BhdGNoKS4gVGhlIGRyaXZlciBsb29wIGluIGBleGVjdXRlTm9kZWAgY29uc3VtZXMgaG9wcyBpdGVyYXRpdmVseTpcbiAqIGBjdXJyZW50ID0gaG9wOyBjb250aW51ZTtgIOKAlCBzbyBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrIG5vciB0aGUgcmV0YWluZWRcbiAqIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBpdGVyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgQ29udGludWF0aW9uSG9wPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByZWFkb25seSBbQ09OVElOVUVfSE9QXTogdHJ1ZTtcbiAgcmVhZG9ubHkgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHJlYWRvbmx5IGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcmVhZG9ubHkgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogUHJlc2VudCB3aGVuIHRoZSBob3AgaXMgYSBkZWNpZGVyJ3MgYnJhbmNoIGRpc3BhdGNoIChkZWNpZGVyIHdpdGhvdXQgaXRzXG4gICAqIG93biBgbmV4dGApLiBUaGUgZHJpdmVyIHJlY29yZHMgaXQgc28gYSBQYXVzZVNpZ25hbCB0aHJvd24gYW55d2hlcmUgaW5cbiAgICogdGhlIGNvbnRpbnVlZCBjaGFpbiBzdGlsbCBnZXRzIHRoZSBkZWNpZGVyIHN0YW1wZWQgYXMgaXRzIGludm9rZXIg4oCUXG4gICAqIGV4YWN0bHkgd2hhdCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0byBkby5cbiAgICovXG4gIHJlYWRvbmx5IGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcDtcbn1cblxuLyoqIFBhdXNlLWludm9rZXIgY29udGV4dCByZWNvcmRlZCBieSB0aGUgZHJpdmVyIGZvciBmbGF0IGRlY2lkZXIgZGlzcGF0Y2hlcy4gKi9cbmludGVyZmFjZSBJbnZva2VyU3RhbXAge1xuICByZWFkb25seSBpbnZva2VyU3RhZ2VJZDogc3RyaW5nO1xuICByZWFkb25seSBjb250aW51YXRpb25TdGFnZUlkPzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW0NPTlRJTlVFX0hPUF0gPT09IHRydWU7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHtAbGluayBSZXRyeVBvbGljeX0ncyBgYmFja29mZk1zYCBmb3IgdGhlIGF0dGVtcHQgdGhhdCBqdXN0IGZhaWxlZFxuICogKDEtYmFzZWQpLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBhIGZpbml0ZSwgcG9zaXRpdmUgbnVtYmVyIOKAlCBhIG1pc3NpbmcgZGlhbCwgYVxuICogbmVnYXRpdmUgdmFsdWUsIGEgYE5hTmAgZnJvbSBhIGNvbnN1bWVyJ3MgYXJpdGhtZXRpYywgb3IgYSB0aHJvd2luZyBmdW5jdGlvblxuICog4oCUIGJlY29tZXMgYDBgLCBpLmUuIHJldHJ5IGltbWVkaWF0ZWx5LiBBIGJhY2tvZmYgZGlhbCBtdXN0IG5ldmVyIGJlIGFibGUgdG9cbiAqIGNyYXNoIGEgcnVuIG9yIHBhcmsgaXQgZm9yZXZlci5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUJhY2tvZmZNcyhiYWNrb2ZmTXM6IG51bWJlciB8ICgoYXR0ZW1wdDogbnVtYmVyKSA9PiBudW1iZXIpIHwgdW5kZWZpbmVkLCBhdHRlbXB0OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoYmFja29mZk1zID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBsZXQgdmFsdWU6IHVua25vd247XG4gIGlmICh0eXBlb2YgYmFja29mZk1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gYmFja29mZk1zKGF0dGVtcHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gYmFja29mZk1zO1xuICB9XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPiAwID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIEF3YWl0IGBtc2AsIGN1dCBzaG9ydCBieSBhbiBhYm9ydC4gUmVzb2x2ZXMgZWl0aGVyIHdheSDigJQgdGhlIGNhbGxlciByZS1jaGVja3NcbiAqIGBzaWduYWwuYWJvcnRlZGAgYW5kIHJldGhyb3dzIHRoZSBvcmlnaW5hbCBzdGFnZSBlcnJvciwgc28gYSBjYW5jZWxsZWQgcnVuXG4gKiBuZXZlciBzaXRzIG91dCBhIGxvbmcgYmFja29mZiBhbmQgbmV2ZXIgbG9zZXMgdGhlIGZhaWx1cmUgdGhhdCBjYXVzZWQgaXQuXG4gKiBUaGUgdGltZXIgYW5kIHRoZSBsaXN0ZW5lciBhcmUgYWx3YXlzIGNsZWFuZWQgdXAuXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZG9uZSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoZG9uZSwgbXMpO1xuICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBkb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKiogV2hlcmUgdGhlIG5leHQgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgb25lLXNob3QgKHNlZSBUcmF2ZXJzZXJPcHRpb25zLmVudHJ5KS4gKi9cbiAgcHJpdmF0ZSBlbnRyeTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIC8qKiBTaWJsaW5ncycgcGF1c2VzIHJhaXNlZCBvbmNlIGBlbnRyeWAncyBjaGFpbiBlbmRzIOKAlCBvbmUtc2hvdCAoc2VlIFRyYXZlcnNlck9wdGlvbnMucGVuZGluZ1BhdXNlcykuICovXG4gIHByaXZhdGUgZW50cnlQZW5kaW5nUGF1c2VzOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5LCBzaGFyZWQgd2l0aCBuZXN0ZWQgdHJhdmVyc2Vycy4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsIHJ1bi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXN1bWU6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIHByaXZhdGUgc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBJTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudFN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIFJGQy0wMDMgRDE6IHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBzdWJmbG93IG1vdW50IHN0YWdlIGluIHRoZSBwYXJlbnRcbiAgICogIHRyYXZlcnNlci4gRmFsbGJhY2sgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmb3Igc3RhZ2VzIHdob3NlIGNvbnRleHQgaGFzXG4gICAqICBubyBwYXJlbnQgKHRoZSBzdWJmbG93IHJvb3QpLiBVbmRlZmluZWQgYXQgdGhlIHRvcCBsZXZlbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogRnJvemVuIHZhbHVlIHBhc3NlZCB2aWEgYHJ1bih7aW5wdXR9KWAuIFN1cmZhY2VkIG9uIGBvblJ1blN0YXJ0YCBhdCB0aGVcbiAgICogIHRvcC1sZXZlbCB0cmF2ZXJzYWwgc28gY29uc3VtZXJzIChlLmcuIGBJbk91dFJlY29yZGVyYCkgY2FuIGJyYWNrZXRcbiAgICogIHRoZSBydW4gd2l0aCB0aGUgc2FtZSBwYXlsb2FkIHNoYXBlIHRoYXQgc3ViZmxvd3MgYWxyZWFkeSBoYXZlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBQZXItYGV4ZWN1dG9yLnJ1bigpYCBpZGVudGlmaWVyLiBTdGFtcGVkIG9udG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC5cbiAgICogIEluaGVyaXRlZCBieSBzdWJmbG93IHRyYXZlcnNlcnMgc28gYWxsIGV2ZW50cyBvZiBvbmUgcnVuIHNoYXJlIG9uZSBydW5JZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW5JZDogc3RyaW5nO1xuXG4gIC8vIEhhbmRsZXIgbW9kdWxlc1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVSZXNvbHZlcjogTm9kZVJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dFeGVjdXRvcjogU3ViZmxvd0V4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VSdW5uZXI6IFN0YWdlUnVubmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGludWF0aW9uUmVzb2x2ZXI6IENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaWRlckhhbmRsZXI6IERlY2lkZXJIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JIYW5kbGVyOiBTZWxlY3RvckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJhbGxlbEZvckVhY2hIYW5kbGVyOiBQYXJhbGxlbEZvckVhY2hIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RydWN0dXJlTWFuYWdlcjogUnVudGltZVN0cnVjdHVyZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmFycmF0aXZlR2VuZXJhdG9yOiBJQ29udHJvbEZsb3dOYXJyYXRpdmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB8IHVuZGVmaW5lZDtcblxuICAvLyBFeGVjdXRpb24gc3RhdGVcbiAgcHJpdmF0ZSBzdWJmbG93UmVzdWx0czogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFBlci10cmF2ZXJzZXIgc2V0IG9mIGxhenkgc3ViZmxvdyBJRHMgdGhhdCBoYXZlIGJlZW4gcmVzb2x2ZWQgYnkgVEhJUyBydW4uXG4gICAqIFVzZWQgaW5zdGVhZCBvZiB3cml0aW5nIGBub2RlLnN1YmZsb3dSZXNvbHZlciA9IHVuZGVmaW5lZGAgYmFjayB0byB0aGUgc2hhcmVkXG4gICAqIFN0YWdlTm9kZSBncmFwaCDigJQgYXZvaWRzIGEgcmFjZSB3aGVyZSBhIGNvbmN1cnJlbnQgdHJhdmVyc2VyIGNsZWFycyB0aGUgc2hhcmVkXG4gICAqIHJlc29sdmVyIGJlZm9yZSBhbm90aGVyIHRyYXZlcnNlciBoYXMgZmluaXNoZWQgdXNpbmcgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkTGF6eVN1YmZsb3dzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFBlci10cmF2ZXJzZXIgb3ZlcmxheSBvZiBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm5zLCBrZXllZCBieSBgbm9kZS5pZGAuXG4gICAqIFBoYXNlIDQgd3JpdGVzIHBhdGNoZXMgSEVSRSBpbnN0ZWFkIG9mIG11dGF0aW5nIHRoZSBzaGFyZWQgYnVpbHQtY2hhcnRcbiAgICogbm9kZSBvYmplY3RzIChzYW1lIGlzb2xhdGlvbiBjb252ZW50aW9uIGFzIGByZXNvbHZlZExhenlTdWJmbG93c2ApLlxuICAgKiBBbGwgZW5naW5lIHJlYWRzIG9mIHRoZSBwYXRjaGVkIGZpZWxkcyBnbyB0aHJvdWdoIHRoZSBgZWZmKmAgYWNjZXNzb3JzXG4gICAqIGJlbG93LiBUaGUgbWFwIGRpZXMgd2l0aCB0aGUgdHJhdmVyc2VyIOKAlCBvbmUgcnVuLCBvbmUgb3ZlcmxheSDigJQgc28gYVxuICAgKiBmcmVzaCBleGVjdXRvciBvdmVyIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFsd2F5cyBzZWVzIHRoZSBvcmlnaW5hbCBncmFwaC5cbiAgICpcbiAgICogS2V5ZWQgYnkgdGhlIG5vZGUgT0JKRUNUIChXZWFrTWFwKSwgbm90IGBub2RlLmlkYDogYSBkeW5hbWljIGNoaWxkIHRoYXRcbiAgICogcmV1c2VzIGEgYnVpbHQgbm9kZSdzIGlkIG11c3QgTk9UIG1ha2UgdGhlIGJ1aWx0IG5vZGUgaW5oZXJpdCB0aGUgcGF0Y2hcbiAgICogKGlkLWtleWVkIGxvb2t1cCBjYXVzZWQgcGhhbnRvbSBkb3VibGUtZXhlY3V0aW9uKS4gYHBhdGNoQ291bnRgIGlzIHRoZVxuICAgKiBmYXN0LXBhdGggY2hlY2sg4oCUIFdlYWtNYXAgaGFzIG5vIGBzaXplYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY1BhdGNoZXMgPSBuZXcgV2Vha01hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+PigpO1xuICBwcml2YXRlIHBhdGNoQ291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiBUUkVFLW5lc3RpbmcgZGVwdGggY291bnRlciBmb3IgZXhlY3V0ZU5vZGUgKHRoZSB0cmFtcG9saW5lIGRyaXZlcikuXG4gICAqIEVhY2ggZHJpdmVyIGludm9jYXRpb24gaW5jcmVtZW50cyB0aGlzOyBkZWNyZW1lbnRzIG9uIGV4aXQgKHRyeS9maW5hbGx5KS5cbiAgICpcbiAgICogTGluZWFyIGBuZXh0YCBjaGFpbnMsIGxvb3AgZWRnZXMsIGFuZCBkeW5hbWljIGNvbnRpbnVhdGlvbnMgYXJlIGZvbGxvd2VkXG4gICAqIElURVJBVElWRUxZIGluc2lkZSBvbmUgZHJpdmVyIGludm9jYXRpb24sIHNvIHRoZXkgbmV2ZXIgZ3JvdyB0aGlzXG4gICAqIGNvdW50ZXIuIE9ubHkgdHJ1ZSB0cmVlIHJlY3Vyc2lvbiBkb2VzOiBmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yXG4gICAqIGJyYW5jaCBkaXNwYXRjaCAod2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBjb250aW51YXRpb24pLCBhbmRcbiAgICogdW5ib3VuZGVkIGR5bmFtaWMgcmVjdXJzaW9uLiBQcmV2ZW50cyBjYWxsLXN0YWNrIG92ZXJmbG93IG9uIHJ1bmF3YXlcbiAgICogcmVjdXJzaXZlIGNvbXBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfZXhlY3V0ZURlcHRoID0gMDtcblxuICAvKipcbiAgICogTWVtb2l6ZWQgcGFyZW50LWNoYWluIGRlcHRoIHBlciBTdGFnZUNvbnRleHQuIFRoZSBjb250ZXh0IHRyZWUgZGVlcGVuc1xuICAgKiBieSBvbmUgcGVyIGV4ZWN1dGVkIHN0YWdlIGFsb25nIGEgY2hhaW4sIHNvIHRoZSBuYWl2ZSBwYXJlbnQtd2FsayBpblxuICAgKiBgY29tcHV0ZUNvbnRleHREZXB0aGAgaXMgTyhjaGFpbiBsZW5ndGgpIHBlciBzdGFnZSDigJQgTyhuwrIpIHBlciBydW4gb25jZVxuICAgKiB0aGUgdHJhbXBvbGluZSBhbGxvd3MgY2hhaW5zIG9mIHRlbnMgb2YgdGhvdXNhbmRzIG9mIHN0YWdlcy4gQ29udGV4dHNcbiAgICogYXJlIHZpc2l0ZWQgcGFyZW50LWJlZm9yZS1jaGlsZCwgc28gdGhlIG1lbW8gbWFrZXMgZWFjaCBsb29rdXAgTygxKVxuICAgKiBhbW9ydGl6ZWQuIFdlYWtNYXAg4oCUIGRpZXMgd2l0aCB0aGUgdHJhdmVyc2VyLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0RGVwdGhDYWNoZSA9IG5ldyBXZWFrTWFwPFN0YWdlQ29udGV4dCwgbnVtYmVyPigpO1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgbXV0YWJsZSBleGVjdXRpb24gY291bnRlciDigJQgbW9ub3RvbmljLCBpbmNyZW1lbnRlZCBwZXIgc3RhZ2UgZXhlY3V0aW9uLlxuICAgKiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gaW5kaWNlcyBhcmUgZ2xvYmFsbHkgdW5pcXVlIHdpdGhpbiBhIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkNvdW50ZXI6IHsgdmFsdWU6IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgcGVyLXJ1biB2aXNpdCBjb3VudHMga2V5ZWQgYnkgc3RhZ2VJZCDigJQgaG93IG1hbnkgdGltZXMgZWFjaCBzdGFnZVxuICAgKiBoYXMgZXhlY3V0ZWQgaW4gdGhpcyBydW4uIFNoYXJlZCB3aXRoIGNoaWxkIHRyYXZlcnNlcnMgKHN1YmZsb3dzKSBzbyBhXG4gICAqIGxvb3BlZC1iYWNrIHN0YWdlJ3MgaXRlcmF0aW9uIGNvdW50IGlzIG1vbm90b25pYyBhY3Jvc3Mgc3ViZmxvdyByZS1tb3VudHMsXG4gICAqIG1hdGNoaW5nIHRoZSBuYXJyYXRpdmUgcmVjb3JkZXIncyBzaW5nbGUtbWFwIHNlbWFudGljcy4gRHJpdmVzXG4gICAqIGBUcmF2ZXJzYWxDb250ZXh0Lmxvb3BJdGVyYXRpb25gLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdmlzaXRDb3VudHM6IE1hcDxzdHJpbmcsIG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFBlci1pbnN0YW5jZSBtYXhpbXVtIGRlcHRoIChzZXQgZnJvbSBUcmF2ZXJzZXJPcHRpb25zLm1heERlcHRoIG9yIHRoZSBjbGFzcyBkZWZhdWx0KS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heERlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBlci1pbnN0YW5jZSBsb29wLWl0ZXJhdGlvbiBsaW1pdCBmb3J3YXJkZWQgdG8gdGhlIENvbnRpbnVhdGlvblJlc29sdmVyXG4gICAqIGFuZCBwcm9wYWdhdGVkIHRvIHN1YmZsb3cgdHJhdmVyc2Vycy4gVW5kZWZpbmVkIOKGkiByZXNvbHZlciBkZWZhdWx0ICgxMDAwKS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbWF4aW11bSBuZXN0ZWQgZXhlY3V0ZU5vZGUgZGVwdGggYmVmb3JlIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICpcbiAgICogKipXaGF0IGNvdW50cyBhcyBkZXB0aCAodHJhbXBvbGluZSBtb2RlbCk6KiogYGV4ZWN1dGVOb2RlYCBpcyBhbiBpdGVyYXRpdmVcbiAgICogZHJpdmVyIOKAlCBsaW5lYXIgYG5leHRgIGhvcHMsIGxvb3AgZWRnZXMgKGBsb29wVG9gL2R5bmFtaWMgbmV4dCksIGFuZFxuICAgKiBkeW5hbWljLXN1YmZsb3cgcmUtZW50cnkgYXJlIGZvbGxvd2VkIGluIGEgZmxhdCBsb29wIGFuZCBjb25zdW1lIE5PIGRlcHRoLlxuICAgKiBEZXB0aCBncm93cyBvbmx5IHdpdGggdHJ1ZSB0cmVlIG5lc3Rpbmc6IG9uZSB0aWNrIHBlciBmb3JrIGNoaWxkLCBvbmUgcGVyXG4gICAqIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoIGRpc3BhdGNoIHRoYXQgbXVzdCByZXR1cm4gdG8gaXRzIGludm9rZXIgKGRlY2lkZXJcbiAgICogd2l0aCBpdHMgb3duIGBuZXh0YCksIG9uZSBwZXIgc3ViZmxvdyBtb3VudCBmcmFtZSBpbiB0aGUgcGFyZW50ICh0aGVcbiAgICogc3ViZmxvdyBib2R5IGl0c2VsZiBydW5zIG9uIGEgRlJFU0ggdHJhdmVyc2VyIHdpdGggaXRzIG93biBidWRnZXQpLlxuICAgKlxuICAgKiA1MDAgdGhlcmVmb3JlIGNvdmVycyBhbnkgcmVhbGlzdGljIGNoYXJ0IOKAlCBpdCBib3VuZHMgcmVjdXJzaXZlXG4gICAqIENPTVBPU0lUSU9OLCBub3QgY2hhaW4gbGVuZ3RoIG9yIGxvb3AgY291bnQuIExvb3BzIGFyZSBib3VuZGVkIGJ5XG4gICAqIGBDb250aW51YXRpb25SZXNvbHZlcmAncyBpbmRlcGVuZGVudCBpdGVyYXRpb24gbGltaXQgKGRlZmF1bHQgMTAwMCxcbiAgICogY29uZmlndXJhYmxlIHZpYSBgUnVuT3B0aW9ucy5tYXhJdGVyYXRpb25zYCksIHdoaWNoIGlzIG5vdyB0aGUgYmluZGluZ1xuICAgKiBjb25zdHJhaW50IGZvciBsb29wLWhlYXZ5IHBpcGVsaW5lcy5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHNhZmUgZm9yIGNvbmN1cnJlbnQgYC5leGVjdXRlKClgIGNhbGxzIG9uIHRoZSBzYW1lIGluc3RhbmNlIOKAlCBjb25jdXJyZW50XG4gICAqIGV4ZWN1dGlvbnMgcmFjZSBvbiBgX2V4ZWN1dGVEZXB0aGAuIFVzZSBhIHNlcGFyYXRlIGBGbG93Y2hhcnRUcmF2ZXJzZXJgIHBlciBjb25jdXJyZW50XG4gICAqIGV4ZWN1dGlvbi4gYEZsb3dDaGFydEV4ZWN1dG9yLnJ1bigpYCBhbHdheXMgY3JlYXRlcyBhIGZyZXNoIHRyYXZlcnNlciBwZXIgY2FsbC5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBNQVhfRVhFQ1VURV9ERVBUSCA9IDUwMDtcblxuICBjb25zdHJ1Y3RvcihvcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4pIHtcbiAgICBjb25zdCBtYXhEZXB0aCA9IG9wdHMubWF4RGVwdGggPz8gRmxvd2NoYXJ0VHJhdmVyc2VyLk1BWF9FWEVDVVRFX0RFUFRIO1xuICAgIGlmIChtYXhEZXB0aCA8IDEpIHRocm93IG5ldyBFcnJvcignRmxvd2NoYXJ0VHJhdmVyc2VyOiBtYXhEZXB0aCBtdXN0IGJlID49IDEnKTtcbiAgICB0aGlzLl9tYXhEZXB0aCA9IG1heERlcHRoO1xuICAgIGlmIChvcHRzLm1heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heEl0ZXJhdGlvbnMgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4SXRlcmF0aW9ucyBtdXN0IGJlID49IDEnKTtcbiAgICB9XG4gICAgdGhpcy5fbWF4SXRlcmF0aW9ucyA9IG9wdHMubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0gb3B0cy5leGVjdXRpb25Db3VudGVyID8/IHsgdmFsdWU6IDAgfTtcbiAgICB0aGlzLl92aXNpdENvdW50cyA9IG9wdHMudmlzaXRDb3VudHMgPz8gbmV3IE1hcCgpO1xuICAgIHRoaXMucm9vdCA9IG9wdHMucm9vdDtcbiAgICB0aGlzLmVudHJ5ID0gb3B0cy5lbnRyeTtcbiAgICB0aGlzLmVudHJ5UGVuZGluZ1BhdXNlcyA9IG9wdHMuZW50cnkgPyBvcHRzLnBlbmRpbmdQYXVzZXMgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZXN1bWUgPVxuICAgICAgb3B0cy5yZXN1bWUgPz9cbiAgICAgIChvcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgPyBSZXN1bWVFbnRyeS5mcm9tQ2FwdHVyZXM8VE91dCwgVFNjb3BlPihvcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUpIDogdW5kZWZpbmVkKTtcbiAgICAvLyBTaGFsbG93LWNvcHkgc3RhZ2VNYXAgYW5kIHN1YmZsb3dzIHNvIHRoYXQgbGF6eS1yZXNvbHV0aW9uIG11dGF0aW9uc1xuICAgIC8vIChwcmVmaXhlZCBlbnRyaWVzIGFkZGVkIGR1cmluZyBleGVjdXRpb24pIHN0YXkgc2NvcGVkIHRvIFRISVMgdHJhdmVyc2VyXG4gICAgLy8gYW5kIGRvIG5vdCBlc2NhcGUgdG8gdGhlIHNoYXJlZCBGbG93Q2hhcnQgb2JqZWN0LiBXaXRob3V0IHRoZSBjb3B5LFxuICAgIC8vIGNvbmN1cnJlbnQgRmxvd0NoYXJ0RXhlY3V0b3IgcnVucyBzaGFyaW5nIHRoZSBzYW1lIEZsb3dDaGFydCB3b3VsZCByYWNlXG4gICAgLy8gb24gdGhlc2UgdHdvIG11dGFibGUgZGljdGlvbmFyaWVzLlxuICAgIHRoaXMuc3RhZ2VNYXAgPSBuZXcgTWFwKG9wdHMuc3RhZ2VNYXApO1xuICAgIHRoaXMuZXhlY3V0aW9uUnVudGltZSA9IG9wdHMuZXhlY3V0aW9uUnVudGltZTtcbiAgICB0aGlzLnN1YmZsb3dzID0gb3B0cy5zdWJmbG93cyA/IHsgLi4ub3B0cy5zdWJmbG93cyB9IDoge307XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlcjtcbiAgICB0aGlzLnNpZ25hbCA9IG9wdHMuc2lnbmFsO1xuICAgIHRoaXMucGFyZW50U3ViZmxvd0lkID0gb3B0cy5wYXJlbnRTdWJmbG93SWQ7XG4gICAgdGhpcy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkID0gb3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMucmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgdGhpcy5ydW5JZCA9IG9wdHMucnVuSWQ7XG5cbiAgICAvLyBTdHJ1Y3R1cmUgbWFuYWdlciAoZGVlcC1jbG9uZXMgYnVpbGQtdGltZSBzdHJ1Y3R1cmUpXG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyID0gbmV3IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmluaXQob3B0cy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgLy8gTmFycmF0aXZlIGdlbmVyYXRvclxuICAgIC8vIFByaW9yaXR5OiBleHBsaWNpdCBuYXJyYXRpdmVHZW5lcmF0b3IgPiBmbG93UmVjb3JkZXJzID4gZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgPiBudWxsLlxuICAgIC8vIFN1YmZsb3cgdHJhdmVyc2VycyByZWNlaXZlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmVHZW5lcmF0b3Igc28gYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZS5cbiAgICBpZiAob3B0cy5uYXJyYXRpdmVHZW5lcmF0b3IpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gb3B0cy5uYXJyYXRpdmVHZW5lcmF0b3I7XG4gICAgfSBlbHNlIGlmIChvcHRzLm5hcnJhdGl2ZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgICAgdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgLy8gSWYgY3VzdG9tIEZsb3dSZWNvcmRlcnMgYXJlIHByb3ZpZGVkLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIGF0dGFjaCBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlclxuICAgICAgaWYgKG9wdHMuZmxvd1JlY29yZGVycyAmJiBvcHRzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZGVyIG9mIG9wdHMuZmxvd1JlY29yZGVycykge1xuICAgICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBkaXNwYXRjaGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG5ldyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgZGVwcyBiYWdcbiAgICBjb25zdCBkZXBzID0gdGhpcy5jcmVhdGVEZXBzKG9wdHMpO1xuXG4gICAgLy8gQnVpbGQgTygxKSBub2RlIElEIG1hcCBmcm9tIHRoZSByb290IGdyYXBoIChhdm9pZHMgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpKS5cbiAgICAvLyBGcm9tIGByb290YCwgbmV2ZXIgZnJvbSBgZW50cnlgOiBhIHJlc3VtZSdzIHN0YW5kLWluIGNhcnJpZXMgdGhlIHBhdXNlZFxuICAgIC8vIHN0YWdlJ3MgaWQsIGFuZCBhIGxvb3AgYmFjayB0byB0aGF0IGlkIG11c3QgZmluZCB0aGUgUkVBTCBzdGFnZS5cbiAgICBjb25zdCBub2RlSWRNYXAgPSB0aGlzLmJ1aWxkTm9kZUlkTWFwKG9wdHMucm9vdCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGhhbmRsZXIgbW9kdWxlcy5cbiAgICAvLyBOb2RlUmVzb2x2ZXIncyBERlMgZmFsbGJhY2sgcmVzb2x2ZXMgbG9vcCB0YXJnZXRzIGFnYWluc3QgdGhlIExJVkVcbiAgICAvLyBydW50aW1lIHNoYXBlLCBzbyBpdCByZWFkcyBjaGlsZHJlbiB0aHJvdWdoIHRoZSBkeW5hbWljLXBhdGNoIG92ZXJsYXlcbiAgICAvLyAoYSBsb29wIGNhbiB0YXJnZXQgYSBub2RlIGFkZGVkIGJ5IGEgZHluYW1pYyBTdGFnZU5vZGUgcmV0dXJuKS5cbiAgICB0aGlzLm5vZGVSZXNvbHZlciA9IG5ldyBOb2RlUmVzb2x2ZXIoZGVwcywgbm9kZUlkTWFwLCAobikgPT4gdGhpcy5lZmZDaGlsZHJlbihuKSk7XG4gICAgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yID0gbmV3IENoaWxkcmVuRXhlY3V0b3IoZGVwcywgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnN0YWdlUnVubmVyID0gbmV3IFN0YWdlUnVubmVyKGRlcHMpO1xuICAgIHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIgPSBuZXcgQ29udGludWF0aW9uUmVzb2x2ZXIoXG4gICAgICBkZXBzLFxuICAgICAgdGhpcy5ub2RlUmVzb2x2ZXIsXG4gICAgICAobm9kZUlkLCBjb3VudCkgPT4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUl0ZXJhdGlvbkNvdW50KG5vZGVJZCwgY291bnQpLFxuICAgICAgdGhpcy5fbWF4SXRlcmF0aW9ucyxcbiAgICApO1xuICAgIHRoaXMuZGVjaWRlckhhbmRsZXIgPSBuZXcgRGVjaWRlckhhbmRsZXIoZGVwcyk7XG4gICAgdGhpcy5zZWxlY3RvckhhbmRsZXIgPSBuZXcgU2VsZWN0b3JIYW5kbGVyKGRlcHMsIHRoaXMuY2hpbGRyZW5FeGVjdXRvcik7XG4gICAgdGhpcy5zdWJmbG93RXhlY3V0b3IgPSBuZXcgU3ViZmxvd0V4ZWN1dG9yKGRlcHMsIHRoaXMuY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnkob3B0cykpO1xuICAgIHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlciA9IG5ldyBQYXJhbGxlbEZvckVhY2hIYW5kbGVyKGRlcHMsIHRoaXMuY2hpbGRyZW5FeGVjdXRvciwge1xuICAgICAgcHJlZml4Tm9kZVRyZWU6IChuLCBwcmVmaXgpID0+IHRoaXMucHJlZml4Tm9kZVRyZWUobiwgcHJlZml4KSxcbiAgICAgIHJlZ2lzdGVyQnJhbmNoU3ViZmxvdzogKHN1YmZsb3dJZCwgcm9vdCwgY2hhcnQpID0+IHRoaXMucmVnaXN0ZXJCcmFuY2hTdWJmbG93KHN1YmZsb3dJZCwgcm9vdCwgY2hhcnQpLFxuICAgICAgYnJhbmNoU2hhcmVkU3RhdGU6IChzdWJmbG93SWQpID0+XG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMuZ2V0KHN1YmZsb3dJZCk/LnRyZWVDb250ZXh0Py5nbG9iYWxDb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgcmVjb3JkQnJhbmNoU3RydWN0dXJlOiAobm9kZUlkLCBicmFuY2hlcykgPT4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNDaGlsZHJlbihub2RlSWQsIGJyYW5jaGVzKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgcHJvZHVjZXMgRmxvd2NoYXJ0VHJhdmVyc2VyIGluc3RhbmNlcyBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gICAqIENhcHR1cmVzIHBhcmVudCBjb25maWcgaW4gY2xvc3VyZSDigJQgU3ViZmxvd0V4ZWN1dG9yIHByb3ZpZGVzIHN1YmZsb3ctc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICAgKiBFYWNoIHN1YmZsb3cgZ2V0cyBhIGZ1bGwgdHJhdmVyc2VyIHdpdGggYWxsIDcgcGhhc2VzIChkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgZXRjLikuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KFxuICAgIHBhcmVudE9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPixcbiAgKTogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCwgVFNjb3BlPiB7XG4gICAgLy8gQ2FwdHVyZSByZWZlcmVuY2VzIHRvIG11dGFibGUgc3RhdGUg4oCUIGZhY3RvcnkgcmVhZHMgdGhlIENVUlJFTlQgc3RhdGUgd2hlbiBjYWxsZWQsXG4gICAgLy8gbm90IHRoZSBzdGF0ZSBhdCBmYWN0b3J5IGNyZWF0aW9uIHRpbWUuIFRoaXMgaXMgY29ycmVjdCBiZWNhdXNlIGxhenkgc3ViZmxvdyByZXNvbHV0aW9uXG4gICAgLy8gbWF5IGFkZCBlbnRyaWVzIHRvIHN0YWdlTWFwL3N1YmZsb3dzIGJlZm9yZSBhIG5lc3RlZCBzdWJmbG93IGlzIGVuY291bnRlcmVkLlxuICAgIGNvbnN0IHBhcmVudFN0YWdlTWFwID0gdGhpcy5zdGFnZU1hcDtcbiAgICBjb25zdCBwYXJlbnRTdWJmbG93cyA9IHRoaXMuc3ViZmxvd3M7XG4gICAgY29uc3QgbmFycmF0aXZlR2VuZXJhdG9yID0gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3I7XG5cbiAgICByZXR1cm4gKHN1YmZsb3dPcHRzKSA9PiB7XG4gICAgICBjb25zdCB0cmF2ZXJzZXIgPSBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgICByb290OiBzdWJmbG93T3B0cy5yb290LFxuICAgICAgICAuLi4oc3ViZmxvd09wdHMuZW50cnkgJiYgeyBlbnRyeTogc3ViZmxvd09wdHMuZW50cnkgfSksIC8vIGEgcmVzdW1lIGhvcCdzIGVudHJ5IHBvaW50XG4gICAgICAgIC4uLihzdWJmbG93T3B0cy5wZW5kaW5nUGF1c2VzICYmIHsgcGVuZGluZ1BhdXNlczogc3ViZmxvd09wdHMucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgc3RhZ2VNYXA6IHBhcmVudFN0YWdlTWFwLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIHNjb3BlRmFjdG9yeTogcGFyZW50T3B0cy5zY29wZUZhY3RvcnksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHN1YmZsb3dPcHRzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogc3ViZmxvd09wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgICBleGVjdXRpb25FbnY6IHBhcmVudE9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBwYXJlbnRPcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICAgIHN0cmVhbUhhbmRsZXJzOiBwYXJlbnRPcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBwYXJlbnRPcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICAgIHN1YmZsb3dzOiBwYXJlbnRTdWJmbG93cywgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBuYXJyYXRpdmVHZW5lcmF0b3IsIC8vIFNoYXJlIHBhcmVudCdzIOKAlCBhbGwgZXZlbnRzIGZsb3cgdG8gb25lIHBsYWNlXG4gICAgICAgIGxvZ2dlcjogcGFyZW50T3B0cy5sb2dnZXIsXG4gICAgICAgIHNpZ25hbDogcGFyZW50T3B0cy5zaWduYWwsXG4gICAgICAgIG1heERlcHRoOiB0aGlzLl9tYXhEZXB0aCxcbiAgICAgICAgLi4uKHRoaXMuX21heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB7IG1heEl0ZXJhdGlvbnM6IHRoaXMuX21heEl0ZXJhdGlvbnMgfSksXG4gICAgICAgIHBhcmVudFN1YmZsb3dJZDogc3ViZmxvd09wdHMuc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgcGFyZW50IGZhbGxiYWNrIGZvclxuICAgICAgICAvLyB0aGUgc3ViZmxvdydzIHJvb3Qgc3RhZ2Ugc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBib3VuZGFyeS5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlciwgLy8gU2hhcmUgY291bnRlciDigJQgc3ViZmxvdyBjb250aW51ZXMgZ2xvYmFsIG51bWJlcmluZ1xuICAgICAgICB2aXNpdENvdW50czogdGhpcy5fdmlzaXRDb3VudHMsIC8vIFNoYXJlIHZpc2l0IGNvdW50cyDigJQgbG9vcEl0ZXJhdGlvbiBzdGF5cyBtb25vdG9uaWMgYWNyb3NzIHN1YmZsb3cgcmUtbW91bnRzXG4gICAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLCAvLyBTdWJmbG93IGluaGVyaXRzIHBhcmVudCdzIHJ1bklkIOKAlCBzYW1lIGxvZ2ljYWwgcnVuXG4gICAgICAgIC8vIFNoYXJlIHRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSBCWSBSRUZFUkVOQ0UsIHNvIGEgaG9wIHRha2VuXG4gICAgICAgIC8vIGF0IGFueSBkZXB0aCBpcyB0YWtlbiBmb3IgdGhlIHdob2xlIHJ1biDigJQgYW5kIG5lc3RlZFxuICAgICAgICAvLyBTdWJmbG93RXhlY3V0b3JzIGNhbiB0YWtlIHRoZSBkZWVwZXIgaG9wcyAoZS5nLiBTZXF1ZW5jZShBZ2VudCguLi4pKVxuICAgICAgICAvLyB3aGVyZSB0aGUgaW5uZXIgQWdlbnQgc3ViZmxvdyBwYXVzZWQpLlxuICAgICAgICAuLi4odGhpcy5yZXN1bWUgJiYgeyByZXN1bWU6IHRoaXMucmVzdW1lIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4ZWN1dGU6ICgpID0+IHRyYXZlcnNlci5leGVjdXRlKCksXG4gICAgICAgIGdldFN1YmZsb3dSZXN1bHRzOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKSxcbiAgICAgICAgZ2V0QnJlYWtTdGF0ZTogKCkgPT4gdHJhdmVyc2VyLmdldEJyZWFrU3RhdGUoKSxcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwcyhvcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4pOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhZ2VNYXA6IHRoaXMuc3RhZ2VNYXAsXG4gICAgICByb290OiB0aGlzLnJvb3QsXG4gICAgICBleGVjdXRpb25SdW50aW1lOiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICBzY29wZUZhY3Rvcnk6IG9wdHMuc2NvcGVGYWN0b3J5LFxuICAgICAgc3ViZmxvd3M6IHRoaXMuc3ViZmxvd3MsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBvcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVyczogb3B0cy5zdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZSA/PyAnZXJyb3InLFxuICAgICAgcmVhZE9ubHlDb250ZXh0OiBvcHRzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgIGV4ZWN1dGlvbkVudjogb3B0cy5leGVjdXRpb25FbnYsXG4gICAgICBuYXJyYXRpdmVHZW5lcmF0b3I6IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLFxuICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAuLi4odGhpcy5yZXN1bWUgJiYgeyByZXN1bWU6IHRoaXMucmVzdW1lIH0pLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSG9sZHMgdGhlIHRvcC1sZXZlbCBicmVhayBmbGFnIGZvciB0aGUgZHVyYXRpb24gb2YgYGV4ZWN1dGUoKWAuIEtlcHQgYXNcbiAgICogYSBmaWVsZCAobm90IGEgbG9jYWwpIHNvIGBnZXRCcmVha1N0YXRlKClgIGNhbiBzdXJmYWNlIHRoZSBmaW5hbCBzdGF0ZVxuICAgKiBmb3IgY2FsbGVycyBsaWtlIGBTdWJmbG93RXhlY3V0b3JgIHRoYXQgaW1wbGVtZW50IGBwcm9wYWdhdGVCcmVha2AuXG4gICAqL1xuICBwcml2YXRlIF90b3BCcmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9ID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICBhc3luYyBleGVjdXRlKGJyYW5jaFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICB0aGlzLl90b3BCcmVha0ZsYWcgPSB7IHNob3VsZEJyZWFrOiBmYWxzZSB9O1xuICAgIC8vIFRoZSBlbnRyeSBpcyBvbmUtc2hvdDogdGhlIGZpcnN0IGV4ZWN1dGUoKSBzdGFydHMgdGhlcmUsIG5ldmVyIGFnYWluIOKAlFxuICAgIC8vIGFuZCBzbyBhcmUgdGhlIHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgYmVoaW5kIGl0LlxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5lbnRyeSA/PyB0aGlzLnJvb3Q7XG4gICAgY29uc3Qgd2FpdGluZyA9IHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzO1xuICAgIHRoaXMuZW50cnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FsayA9ICgpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4gPT5cbiAgICAgIHdhaXRpbmdcbiAgICAgICAgPyB0aGlzLndhbGtUaGVuUmFpc2Uoc3RhcnQsIGNvbnRleHQsIHdhaXRpbmcsIGJyYW5jaFBhdGgpXG4gICAgICAgIDogdGhpcy5leGVjdXRlTm9kZShzdGFydCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcblxuICAgIC8vIEZpcmUgb25SdW5TdGFydCBPTkxZIGF0IHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2FsIOKAlCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAvLyBhbHJlYWR5IHByb2R1Y2Ugb25TdWJmbG93RW50cnkvb25TdWJmbG93RXhpdCBwYWlycywgc28gZW1pdHRpbmcgcnVuXG4gICAgLy8gZXZlbnRzIGZvciB0aGVtIHdvdWxkIGRvdWJsZS1icmFja2V0IHRoZSBib3VuZGFyeSBzdHJlYW0uIFRoZVxuICAgIC8vIHRvcC1sZXZlbCB0cmF2ZXJzZXIgaXMgdGhlIG9uZSB3aXRob3V0IGEgcGFyZW50U3ViZmxvd0lkLlxuICAgIGNvbnN0IGlzVG9wTGV2ZWwgPSB0aGlzLnBhcmVudFN1YmZsb3dJZCA9PT0gdW5kZWZpbmVkO1xuICAgIC8vIFN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciBydW4uZW50cnkgLyBydW4uZXhpdC4gRmllbGRzIHVzZVxuICAgIC8vIHJvb3Qtc3RhZ2UgZGVmYXVsdHMgKHN0YWdlSWQ9J19fcm9vdF9fJywgcnVudGltZVN0YWdlSWQ9J19fcm9vdF9fIzAnLFxuICAgIC8vIGRlcHRoIDApIHNvIHRoZSBydW5JZCBpcyByZWxpYWJseSBhdmFpbGFibGUgb24gcnVuIGV2ZW50cyB3aXRob3V0XG4gICAgLy8gZm9yY2luZyByZWNvcmRlcnMgdG8gaGFuZGxlIGB0cmF2ZXJzYWxDb250ZXh0ID09PSB1bmRlZmluZWRgLlxuICAgIGNvbnN0IHJvb3RDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0ID0ge1xuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBzdGFnZUlkOiAnX19yb290X18nLFxuICAgICAgcnVudGltZVN0YWdlSWQ6ICdfX3Jvb3RfXyMwJyxcbiAgICAgIHN0YWdlTmFtZTogJ19fcm9vdF9fJyxcbiAgICAgIGRlcHRoOiAwLFxuICAgIH07XG4gICAgaWYgKGlzVG9wTGV2ZWwpIHtcbiAgICAgIC8vIGByZWFkT25seUNvbnRleHRgIGlzIHRoZSBlbmdpbmUncyB2aWV3IG9mIGBydW4oe2lucHV0fSlgIOKAlCBwYXNzZWRcbiAgICAgIC8vIHRocm91Z2ggZnJvbSBgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKClgIGFzIHRoZSB2YWxpZGF0ZWQgaW5wdXQuXG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1blN0YXJ0KHRoaXMucmVhZE9ubHlDb250ZXh0LCByb290Q29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gVG9wLWxldmVsIHJ1bnMgY2xvc2UgdGhlaXIgYm91bmRhcnkgU1lNTUVUUklDQUxMWTogZXZlcnkgb25SdW5TdGFydFxuICAgIC8vIGlzIGZvbGxvd2VkIGJ5IGV4YWN0bHkgb25lIG9uUnVuRW5kIChjbGVhbikgb3Igb25SdW5GYWlsZWQgKGVycm9yKS5cbiAgICAvLyBXaXRob3V0IHRoZSBjYXRjaCwgYSB0aHJvd24gcnVuIGZpcmVkIG9uUnVuU3RhcnQgdGhlbiBub3RoaW5nIOKAlCBhXG4gICAgLy8gbW9uaXRvciBjb3VsZG4ndCB0ZWxsIFwic3RpbGwgcnVubmluZ1wiIGZyb20gXCJjcmFzaGVkLlwiIFBhdXNlIGlzIE5PVFxuICAgIC8vIGFuIGVycm9yIChpdCdzIGV4cGVjdGVkIHN1c3BlbnNpb24pLCBzbyBpdCBza2lwcyBvblJ1bkZhaWxlZCBhbmRcbiAgICAvLyByZS10aHJvd3MgdW50b3VjaGVkLiBUaGUgc3RhZ2UtbGV2ZWwgY2F0Y2ggYWxyZWFkeSByZWNvcmRlZCB0aGVcbiAgICAvLyBmYWlsaW5nIHN0YWdlIChvbkVycm9yICsgY29tbWl0KTsgdGhpcyBhZGRzIHRoZSBydW4tbGV2ZWwgdGVybWluYWxcbiAgICAvLyBzaWduYWwuIFRoZSBlcnJvciBzdGlsbCBwcm9wYWdhdGVzIOKAlCB0aGlzIGlzIG9ic2VydmF0aW9uLCBub3RcbiAgICAvLyByZWNvdmVyeS4gU3ViZmxvdyB0cmF2ZXJzZXJzIGRvbid0IGZpcmUgcnVuIGV2ZW50czsgdGhlaXIgZXJyb3JzXG4gICAgLy8gYnViYmxlIHVwIGFuZCBzdXJmYWNlIGhlcmUgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICBpZiAoIWlzVG9wTGV2ZWwpIHtcbiAgICAgIHJldHVybiB3YWxrKCk7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFRyYXZlcnNhbFJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgd2FsaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoIWlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuRmFpbGVkKGV4dHJhY3RFcnJvckluZm8oZXJyb3IpLCByb290Q29udGV4dCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5FbmQocmVzdWx0LCByb290Q29udGV4dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHJlc3VtZSdzIGVudHJ5IGNoYWluIGF0IGEgbGV2ZWwgd2hlcmUgcGFyYWxsZWwgc2libGluZ3MnIHBhdXNlcyB3YWl0XG4gICAqICg5LjI4LjApOiBydW4gdGhlIGNoYWluIOKAlCB0aGUgcmVzdW1lZCBjaGlsZCBvbmx5LCB0aGUgZmFuLW91dCdzIGpvaW4gaXNcbiAgICogTk9UIGF0dGFjaGVkIOKAlCB0aGVuIHJhaXNlIHRoZSBmaXJzdCB3YWl0aW5nIHBhdXNlIGFnYWluLCB0aGUgcmVzdCBiZWhpbmRcbiAgICogaXQuIE5vdGhpbmcgb2YgdGhlIHNpYmxpbmcgcmUtcnVuczsgaXRzIHF1ZXN0aW9uIGNvbWVzIGJhY2sgYXMgaXQgd2FzXG4gICAqIGFza2VkLiBBIHBhdXNlIHJhaXNlZCBmcm9tIGluc2lkZSB0aGUgY2hhaW4gKHRoZSByZXN1bWVkIGNoaWxkIGFza2luZ1xuICAgKiBhZ2FpbikgY2FycmllcyBldmVyeSB3YWl0aW5nIHNpYmxpbmcgaW5zdGVhZCwgc28gbm9uZSBpcyBldmVyIGRyb3BwZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhbGtUaGVuUmFpc2UoXG4gICAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICB3YWl0aW5nOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8VHJhdmVyc2FsUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUoc3RhcnQsIGNvbnRleHQsIHRoaXMuX3RvcEJyZWFrRmxhZywgYnJhbmNoUGF0aCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkgcXVldWVCZWhpbmQoZXJyb3IsIHdhaXRpbmcpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IHsgcGF1c2UsIHN0YWdlTmFtZSB9ID0gd2FpdGluZ1swXTtcbiAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblBhdXNlKHN0YWdlTmFtZSwgcGF1c2UucGF1c2VkU3RhZ2VJZCwgcGF1c2UucGF1c2VEYXRhLCBwYXVzZS5zdWJmbG93UGF0aCk7XG4gICAgdGhyb3cgcmFpc2VRdWV1ZWRQYXVzZSh3YWl0aW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCcmVhayBzdGF0ZSBjYXB0dXJlZCBhdCB0aGUgdG9wLWxldmVsIG9mIHRoZSBtb3N0IHJlY2VudCBgZXhlY3V0ZSgpYC5cbiAgICogYHNob3VsZEJyZWFrYCBpcyB0cnVlIHdoZW4gYSBzdGFnZSBjYWxsZWQgYHNjb3BlLiRicmVhayhyZWFzb24pYDsgdGhlXG4gICAqIG9wdGlvbmFsIGByZWFzb25gIGNhcnJpZXMgdGhlIHN0cmluZyBwYXNzZWQgdG8gYCRicmVha2AuXG4gICAqXG4gICAqIFVzZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgdG8gcHJvcGFnYXRlIGFuIGlubmVyIHN1YmZsb3cncyBicmVhayB1cCB0b1xuICAgKiB0aGUgcGFyZW50IHRyYXZlcnNlciB3aGVuIHRoZSBtb3VudCBzZXRzIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAuXG4gICAqL1xuICBnZXRCcmVha1N0YXRlKCk6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9IHtcbiAgICByZXR1cm4geyAuLi50aGlzLl90b3BCcmVha0ZsYWcgfTtcbiAgfVxuXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmdldFN0cnVjdHVyZSgpO1xuICB9XG5cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KSB7XG4gICAgLy8gU3RhbXAgdGhlIHJ1bidzIGlkIG9udG8gdGhlIHJ1bnRpbWUgc25hcHNob3QgaGVyZSDigJQgdGhlIHRyYXZlcnNlciBpc1xuICAgIC8vIHRoZSBzaW5nbGUgYXV0aG9yaXR5IGZvciBgcnVuSWRgIChpdCBhbHJlYWR5IHN0YW1wcyB0aGUgc2FtZSB2YWx1ZSBvblxuICAgIC8vIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQvZXZlbnQpLCB3aGlsZSB0aGUgcnVudGltZSBpcyBydW4tYWdub3N0aWNcbiAgICAvLyBtZW1vcnkgKGl0cyBnZXRTbmFwc2hvdCByZXR1cm5zIE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnPikuXG4gICAgLy8gRnJlc2ggcGVyIHJ1bigpIEFORCBwZXIgcmVzdW1lKCkg4oCUIHNlZSBydW5uZXIvcnVuSWQudHMuXG4gICAgcmV0dXJuIHsgLi4udGhpcy5leGVjdXRpb25SdW50aW1lLmdldFNuYXBzaG90KG9wdGlvbnMpLCBydW5JZDogdGhpcy5ydW5JZCB9O1xuICB9XG5cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5leGVjdXRpb25SdW50aW1lLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uUnVudGltZS5nZXRQaXBlbGluZXMoKTtcbiAgfVxuXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgfVxuXG4gIGdldFN1YmZsb3dSZXN1bHRzKCk6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJmbG93UmVzdWx0cztcbiAgfVxuXG4gIGdldE5hcnJhdGl2ZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLmdldFNlbnRlbmNlcygpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIEZsb3dSZWNvcmRlckRpc3BhdGNoZXIsIG9yIHVuZGVmaW5lZCBpZiBuYXJyYXRpdmUgaXMgZGlzYWJsZWQuICovXG4gIGdldEZsb3dSZWNvcmRlckRpc3BhdGNoZXIoKTogRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd1JlY29yZGVyRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBDb3JlIFRyYXZlcnNhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgYW4gTygxKSBJROKGkm5vZGUgbWFwIGZyb20gdGhlIHJvb3QgZ3JhcGguXG4gICAqIFVzZWQgYnkgTm9kZVJlc29sdmVyIHRvIGF2b2lkIHJlcGVhdGVkIERGUyBvbiBldmVyeSBsb29wVG8oKSBjYWxsLlxuICAgKiBJdGVyYXRpdmUgd29ya2xpc3QgKG5vIHJlY3Vyc2lvbikgc28gYXJiaXRyYXJpbHkgbG9uZyBjaGFpbnMgaW5kZXggZnVsbHk7XG4gICAqIHRoZSBgbWFwLmhhc2AgZ3VhcmQgaGFuZGxlcyBjeWNsaWMgcmVmcy4gRmlyc3QtdmlzaXRlZCBub2RlIHdpbnMgcGVyIElEIOKAlFxuICAgKiB3b3JrbGlzdCBvcmRlciBtYXRjaGVzIHRoZSBvbGQgcmVjdXJzaXZlIHByZS1vcmRlciAoY2hpbGRyZW4sIHRoZW4gbmV4dCkuXG4gICAqIER5bmFtaWMgc3ViZmxvd3MgYW5kIGxhenktcmVzb2x2ZWQgbm9kZXMgYXJlIGFkZGVkIHRvIHN0YWdlTWFwIGF0IHJ1bnRpbWUgYnV0IG5vdCB0byB0aGlzIG1hcCDigJRcbiAgICogdGhvc2UgdXNlIHRoZSBERlMgZmFsbGJhY2sgaW4gTm9kZVJlc29sdmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5vZGVJZE1hcChyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IE1hcDxzdHJpbmcsIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PigpO1xuICAgIGNvbnN0IHN0YWNrOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdID0gW3Jvb3RdO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgICAgaWYgKG1hcC5oYXMobm9kZS5pZCkpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IHZpc2l0ZWQgKGF2b2lkcyBpbmZpbml0ZSBsb29wcyBvbiBjeWNsaWMgcmVmcylcbiAgICAgIG1hcC5zZXQobm9kZS5pZCwgbm9kZSk7XG4gICAgICAvLyBQdXNoIGluIHJldmVyc2UgdmlzaXQgb3JkZXIgKExJRk8gc3RhY2spOiBuZXh0IGZpcnN0LCB0aGVuIGNoaWxkcmVuXG4gICAgICAvLyByZXZlcnNlZCDigJQgc28gY2hpbGRyZW4gYXJlIHZpc2l0ZWQgYmVmb3JlIG5leHQsIGZpcnN0IGNoaWxkIGZpcnN0LFxuICAgICAgLy8gbWF0Y2hpbmcgdGhlIHJlY3Vyc2l2ZSBwcmUtb3JkZXIgZXhhY3RseS5cbiAgICAgIGlmIChub2RlLm5leHQpIHN0YWNrLnB1c2gobm9kZS5uZXh0KTtcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBzdGFjay5wdXNoKG5vZGUuY2hpbGRyZW5baV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFnZUZuKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIG5vZGUuZm4gPT09ICdmdW5jdGlvbicpIHJldHVybiBub2RlLmZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICAvLyBQcmltYXJ5OiBsb29rIHVwIGJ5IGlkIChzdGFibGUgaWRlbnRpZmllciwga2V5ZWQgYnkgRmxvd0NoYXJ0QnVpbGRlcilcbiAgICBjb25zdCBieUlkID0gdGhpcy5zdGFnZU1hcC5nZXQobm9kZS5pZCk7XG4gICAgaWYgKGJ5SWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGJ5SWQ7XG4gICAgLy8gRmFsbGJhY2s6IGxvb2sgdXAgYnkgbmFtZSAoc3VwcG9ydHMgaGFuZC1jcmFmdGVkIHN0YWdlTWFwcyBpbiB0ZXN0cyBhbmQgYWR2YW5jZWQgdXNlKVxuICAgIHJldHVybiB0aGlzLnN0YWdlTWFwLmdldChub2RlLm5hbWUpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIER5bmFtaWMtcGF0Y2ggb3ZlcmxheSBhY2Nlc3NvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIEV2ZXJ5IGVuZ2luZSByZWFkIG9mIGEgZmllbGQgdGhhdCBQaGFzZSA0IGNhbiBwYXRjaCAoY2hpbGRyZW4sXG4gIC8vIG5leHROb2RlU2VsZWN0b3IsIHN1YmZsb3cgbWV0YSkgZ29lcyB0aHJvdWdoIHRoZXNlLiBGYXN0IHBhdGg6IGNoYXJ0c1xuICAvLyB3aXRoIG5vIGR5bmFtaWMgcmV0dXJucyBuZXZlciBhbGxvY2F0ZSBhbmQgcGF5IG9uZSBgc2l6ZSA9PT0gMGAgY2hlY2suXG5cbiAgcHJpdmF0ZSBnZXRQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucGF0Y2hDb3VudCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE9yQ3JlYXRlUGF0Y2gobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4ge1xuICAgIGxldCBwYXRjaCA9IHRoaXMuZHluYW1pY1BhdGNoZXMuZ2V0KG5vZGUpO1xuICAgIGlmICghcGF0Y2gpIHtcbiAgICAgIHBhdGNoID0ge307XG4gICAgICB0aGlzLmR5bmFtaWNQYXRjaGVzLnNldChub2RlLCBwYXRjaCk7XG4gICAgICB0aGlzLnBhdGNoQ291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIHBhdGNoO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBjaGlsZHJlbjogZHluYW1pYyBwYXRjaCBmaXJzdCwgdGhlbiB0aGUgYnVpbHQgbm9kZSdzIGNoaWxkcmVuLiAqL1xuICBwcml2YXRlIGVmZkNoaWxkcmVuKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/LmNoaWxkcmVuID8/IG5vZGUuY2hpbGRyZW47XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIG91dHB1dC1iYXNlZCBzZWxlY3RvcjogZHluYW1pYyBwYXRjaCBmaXJzdCwgdGhlbiB0aGUgYnVpbHQgbm9kZSdzLiAqL1xuICBwcml2YXRlIGVmZlNlbGVjdG9yKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU2VsZWN0b3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldFBhdGNoKG5vZGUpPy5uZXh0Tm9kZVNlbGVjdG9yID8/IG5vZGUubmV4dE5vZGVTZWxlY3RvcjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgc3ViZmxvdy1yb290IG1hcmtlciAodHJ1ZSB3aGVuIGEgZHluYW1pYyBzdWJmbG93IHdhcyBwYXRjaGVkIG9uKS4gKi9cbiAgcHJpdmF0ZSBlZmZJc1N1YmZsb3dSb290KG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0UGF0Y2gobm9kZSk/LnN1YmZsb3dNZXRhO1xuICAgIHJldHVybiBtZXRhID8gdHJ1ZSA6IG5vZGUuaXNTdWJmbG93Um9vdDtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgc3ViZmxvdyBpZCAocGF0Y2hlZCB2ZXJiYXRpbSBieSBhIGR5bmFtaWMgc3ViZmxvdyByZXR1cm4pLiAqL1xuICBwcml2YXRlIGVmZlN1YmZsb3dJZChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0UGF0Y2gobm9kZSk/LnN1YmZsb3dNZXRhO1xuICAgIHJldHVybiBtZXRhID8gbWV0YS5zdWJmbG93SWQgOiBub2RlLnN1YmZsb3dJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRlcmlhbGl6ZSB0aGUgZWZmZWN0aXZlIHZpZXcgb2YgYSBub2RlIOKAlCBmaWVsZC1pZGVudGljYWwgdG8gd2hhdCB0aGVcbiAgICogcHJlLW92ZXJsYXkgY29kZSBwcm9kdWNlZCBieSBtdXRhdGluZyB0aGUgc2hhcmVkIG5vZGUuIFVzZWQgd2hlcmUgYSBub2RlXG4gICAqIGlzIGhhbmRlZCB0byBhIGhlbHBlciBleGVjdXRvciAoTm9kZVJlc29sdmVyIC8gU3ViZmxvd0V4ZWN1dG9yIC9cbiAgICogQ2hpbGRyZW5FeGVjdXRvcikgc28gaGVscGVycyBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy4gUmV0dXJucyB0aGVcbiAgICogbm9kZSBpdHNlbGYgKG5vIGFsbG9jYXRpb24pIHdoZW4gaXQgY2FycmllcyBubyBwYXRjaC5cbiAgICovXG4gIHByaXZhdGUgZWZmTm9kZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBwYXRjaCA9IHRoaXMuZ2V0UGF0Y2gobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkgcmV0dXJuIG5vZGU7XG4gICAgY29uc3QgbWVyZ2VkOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ubm9kZSB9O1xuICAgIGlmIChwYXRjaC5zdWJmbG93TWV0YSkge1xuICAgICAgbWVyZ2VkLmlzU3ViZmxvd1Jvb3QgPSB0cnVlO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dJZCA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dJZDtcbiAgICAgIG1lcmdlZC5zdWJmbG93TmFtZSA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dOYW1lO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBwYXRjaC5zdWJmbG93TWV0YS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIH1cbiAgICBpZiAocGF0Y2guY2hpbGRyZW4pIG1lcmdlZC5jaGlsZHJlbiA9IHBhdGNoLmNoaWxkcmVuO1xuICAgIGlmIChwYXRjaC5uZXh0Tm9kZVNlbGVjdG9yKSBtZXJnZWQubmV4dE5vZGVTZWxlY3RvciA9IHBhdGNoLm5leHROb2RlU2VsZWN0b3I7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgc2luZ2xlIGZ1bm5lbCBldmVyeSBzdGFnZSBmdW5jdGlvbiBwYXNzZXMgdGhyb3VnaCDigJQgbGluZWFyIHN0YWdlc1xuICAgKiAoUGhhc2UgMyksIGRlY2lkZXIgc3RhZ2VzIGFuZCBzZWxlY3RvciBzdGFnZXMgKHRoZWlyIGhhbmRsZXJzIGFyZSBoYW5kZWRcbiAgICogdGhpcyBtZXRob2QgYXMgYHJ1blN0YWdlYCksIGFuZCBieSBleHRlbnNpb24gZm9yayBjaGlsZHJlbiBhbmRcbiAgICogc3ViZmxvdy1pbnRlcm5hbCBzdGFnZXMsIHdoaWNoIHJlLWVudGVyIFBoYXNlIDMgaW4gdGhlaXIgb3duIHRyYXZlcnNlci5cbiAgICpcbiAgICogV2hpY2ggaXMgZXhhY3RseSB3aHkgdGhlIGRlY2xhcmF0aXZlIHJldHJ5IGxvb3AgbGl2ZXMgSEVSRSBhbmQgbm93aGVyZVxuICAgKiBlbHNlOiBvbmUgaW1wbGVtZW50YXRpb24gZ2l2ZXMgYHJldHJ5YCB0byBldmVyeSBzdGFnZSBraW5kIHRoYXQgaGFzIGFcbiAgICogZnVuY3Rpb24gdG8gcmV0cnkuIChQdXR0aW5nIGl0IGluIGBTdGFnZVJ1bm5lcmAgd291bGQgaGF2ZSBiZWVuIHdyb25nIOKAlFxuICAgKiB0aGUgcnVubmVyIG93bnMgdGhlIHNjb3BlIGFuZCB0aGUgaW50ZXJydXB0IGJvdW5kYXJ5LCBidXQgbm90IHRoZVxuICAgKiBgU3RhZ2VDb250ZXh0YCB3aG9zZSBzdGFnZWQgd3JpdGVzIGEgZmFpbGVkIGF0dGVtcHQgbXVzdCBkaXNjYXJkLilcbiAgICpcbiAgICogV2l0aCBubyBgcmV0cnlgIHBvbGljeSB0aGlzIGlzIGEgc2luZ2xlIGNhbGwsIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZVxuICAgKiBwcmUtOS4xNSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlU3RhZ2UoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRm46ICgpID0+IHZvaWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8VE91dD4ge1xuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGlzIGFzc2lnbmVkIGluIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24sXG4gICAgLy8gZW5zdXJpbmcgc2NvcGUgZXZlbnRzIGFuZCBmbG93IGV2ZW50cyB1c2UgdGhlIHNhbWUgdmFsdWUuIEl0IGRvZXMgTk9UXG4gICAgLy8gY2hhbmdlIGFjcm9zcyBhdHRlbXB0czogYXR0ZW1wdHMgYXJlIGludGVybmFsIHRvIE9ORSBzdGFnZSBleGVjdXRpb24g4oCUXG4gICAgLy8gb25lIHJ1bnRpbWVTdGFnZUlkLCBvbmUgZXhlY3V0aW9uIGluZGV4LCBvbmUgZmluYWwgQ29tbWl0QnVuZGxlLlxuICAgIGNvbnN0IHBvbGljeSA9IG5vZGUucmV0cnk7XG4gICAgY29uc3QgbWF4QXR0ZW1wdHMgPSBwb2xpY3kgPyBNYXRoLmZsb29yKHBvbGljeS5hdHRlbXB0cykgOiAxO1xuICAgIGlmICghcG9saWN5IHx8ICEobWF4QXR0ZW1wdHMgPiAxKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhZ2VSdW5uZXIucnVuKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IGlzRmluYWxBdHRlbXB0ID0gYXR0ZW1wdCA+PSBtYXhBdHRlbXB0cztcbiAgICAgICAgLy8gQSBQYXVzZVNpZ25hbCBpcyBjb250cm9sIGZsb3csIG5vdCBhIGZhaWx1cmUg4oCUIHJldHJ5aW5nIGl0IHdvdWxkXG4gICAgICAgIC8vIHJlLXJ1biBhIHN0YWdlIHRoYXQgYXNrZWQgdG8gU1VTUEVORCAoYW5kIHdvdWxkIGJyZWFrIHJlc3VtZSwgd2hpY2hcbiAgICAgICAgLy8gcmUtZW50ZXJzIHRoaXMgc3RhZ2UgZnJvbSBpdHMgdG9wKS4gQ292ZXJzIGJvdGggcmFpc2Ugc2hhcGVzOlxuICAgICAgICAvLyBgYWRkUGF1c2FibGVGdW5jdGlvbmAgcmV0dXJuaW5nIGRhdGEsIGFuZCBgaW50ZXJydXB0KClgLlxuICAgICAgICBpZiAoaXNGaW5hbEF0dGVtcHQgfHwgaXNQYXVzZVNpZ25hbChlcnJvcikgfHwgIXRoaXMuc2hvdWxkUmV0cnkocG9saWN5LCBlcnJvcikpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIGNhbmNlbGxlZCBydW4gbXVzdCBub3Qgc2l0IHRocm91Z2ggYSBiYWNrb2ZmIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnJvcjtcblxuICAgICAgICAvLyBBdHRlbXB0IGlzb2xhdGlvbjogZHJvcCBldmVyeXRoaW5nIHRoaXMgYXR0ZW1wdCBzdGFnZWQgQkVGT1JFIHRoZVxuICAgICAgICAvLyBuZXh0IG9uZSBzdGFydHMuIE5vdGhpbmcgd2FzIGFwcGxpZWQsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gcm9sbFxuICAgICAgICAvLyBiYWNrIOKAlCBzZWUgU3RhZ2VDb250ZXh0LmRpc2NhcmRTdGFnZWQoKS5cbiAgICAgICAgY29udGV4dC5kaXNjYXJkU3RhZ2VkKCk7XG5cbiAgICAgICAgY29uc3QgZGVsYXlNcyA9IHJlc29sdmVCYWNrb2ZmTXMocG9saWN5LmJhY2tvZmZNcywgYXR0ZW1wdCk7XG4gICAgICAgIC8vIEZpcmVkIEJFRk9SRSB0aGUgd2FpdDogYSBsaXZlIG1vbml0b3IgbGVhcm5zIFwicmV0cnlpbmcgaW4gNTAwbXNcIlxuICAgICAgICAvLyB3aGVuIHRoZSBkZWNpc2lvbiBpcyBtYWRlLCBub3Qgb25jZSBpdCBoYXMgYWxyZWFkeSBlbGFwc2VkLlxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlUmV0cnkoXG4gICAgICAgICAgbm9kZS5uYW1lLFxuICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBtYXhBdHRlbXB0cyxcbiAgICAgICAgICBkZWxheU1zLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkZWxheU1zID4gMCkgYXdhaXQgc2xlZXAoZGVsYXlNcywgdGhpcy5zaWduYWwpO1xuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBgcmV0cnlPbmAgZ2F0ZS4gQSB0aHJvd2luZyBwcmVkaWNhdGUgY291bnRzIGFzIFwiZG8gbm90IHJldHJ5XCIg4oCUIGEgYnJva2VuXG4gICAqICBwcmVkaWNhdGUgbXVzdCBuZXZlciB0dXJuIGEgZmFpbGluZyBzdGFnZSBpbnRvIGFuIGVuZGxlc3MgcmV0cnkgbG9vcC4gKi9cbiAgcHJpdmF0ZSBzaG91bGRSZXRyeShwb2xpY3k6IE5vbk51bGxhYmxlPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+WydyZXRyeSddPiwgZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoIXBvbGljeS5yZXRyeU9uKSByZXR1cm4gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBvbGljeS5yZXRyeU9uKGVycm9yKSA9PT0gdHJ1ZTtcbiAgICB9IGNhdGNoIChwcmVkaWNhdGVFcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybignW2Zvb3RwcmludF0gcmV0cnlPbiBwcmVkaWNhdGUgdGhyZXc7IHRyZWF0aW5nIHRoZSBmYWlsdXJlIGFzIGZpbmFsJywge1xuICAgICAgICBlcnJvcjogcHJlZGljYXRlRXJyb3IsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhbXBvbGluZSBkcml2ZXIg4oCUIHByZS1vcmRlciBERlMgdHJhdmVyc2FsIGVudHJ5IHBvaW50LlxuICAgKlxuICAgKiBSdW5zIGBleGVjdXRlTm9kZVN0ZXBgIChvbmUgbm9kZSwgYWxsIDcgcGhhc2VzKSBpbiBhIGZsYXQgbG9vcDogZXZlcnlcbiAgICogVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3AgZWRnZSwgZHluYW1pYyBuZXh0IC8gZHluYW1pY1xuICAgKiByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXIgZGlzcGF0Y2gpIGNvbWVzIGJhY2sgYXMgYVxuICAgKiBgQ29udGludWF0aW9uSG9wYCBhbmQgaXMgZm9sbG93ZWQgSVRFUkFUSVZFTFkg4oCUIG5laXRoZXIgdGhlIGNhbGwgc3RhY2tcbiAgICogbm9yIHRoZSByZXRhaW5lZCBwcm9taXNlIGNoYWluIGdyb3dzIHdpdGggY2hhaW4gbGVuZ3RoIG9yIGxvb3AgY291bnQuXG4gICAqXG4gICAqIFJlY3Vyc2lvbiByZW1haW5zIE9OTFkgZm9yIHRydWUgdHJlZSBuZXN0aW5nIChlYWNoIGdldHMgYSBuZXN0ZWQgZHJpdmVyXG4gICAqIGNhbGwpOiBmb3JrIGNoaWxkcmVuIChgQ2hpbGRyZW5FeGVjdXRvcmApLCBzZWxlY3RvciBicmFuY2hlcyAocGFyYWxsZWxcbiAgICogZmFuLW91dCksIGRlY2lkZXIgYnJhbmNoIGRpc3BhdGNoIHdoZW4gdGhlIGRlY2lkZXIgaGFzIGl0cyBvd24gYG5leHRgXG4gICAqICh0aGUgYnJhbmNoIG11c3QgY29tcGxldGUgQkVGT1JFIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMpLCBhbmRcbiAgICogc3ViZmxvdyBtb3VudHMgKGZyZXNoIHRyYXZlcnNlcjsgdGhlIG1vdW50IGZyYW1lIHN0YXlzIGluIHRoZSBwYXJlbnQpLlxuICAgKiBgX2V4ZWN1dGVEZXB0aGAgdGhlcmVmb3JlIGNvdW50cyBjaGFydCBDT01QT1NJVElPTiBkZXB0aCBvbmx5LCBndWFyZGVkXG4gICAqIGJ5IGBfbWF4RGVwdGhgIChkZWZhdWx0IGBNQVhfRVhFQ1VURV9ERVBUSGAgPSA1MDApLlxuICAgKlxuICAgKiBQYXVzZVNpZ25hbDogYSBmbGF0IGRlY2lkZXIgZGlzcGF0Y2ggcmVjb3JkcyBhbiBgSW52b2tlclN0YW1wYDsgaWYgdGhlXG4gICAqIGNvbnRpbnVlZCBjaGFpbiBsYXRlciBwYXVzZXMsIHRoZSBkcml2ZXIgc3RhbXBzIHRoZSBzaWduYWwgZHVyaW5nXG4gICAqIHVud2luZCDigJQgc2FtZSBpbnZva2VyIGNvbnRleHQgdGhlIHJlY3Vyc2l2ZSBkaXNwYXRjaCdzIGNhdGNoIHVzZWQgdG9cbiAgICogc3RhbXAsIGlubmVybW9zdCAobW9zdCByZWNlbnQgZGlzcGF0Y2gpIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBJbnZva2VyIHN0YW1wcyBmcm9tIGZsYXQgZGVjaWRlciBkaXNwYXRjaGVzIGluIFRISVMgZHJpdmVyIOKAlCBrZXB0XG4gICAgLy8gbG9jYWwgc28gbmVzdGVkIGRyaXZlcnMgKGZvcmsgY2hpbGRyZW4sIHdpdGgtbmV4dCBkZWNpZGVyIGJyYW5jaGVzKVxuICAgIC8vIGdldCB0aGVpciBvd24gd2luZG93cywgbWF0Y2hpbmcgdGhlIG9sZCBmcmFtZS1vbi1zdGFjayBzdGFtcGluZyBzY29wZS5cbiAgICBsZXQgcGVuZGluZ0ludm9rZXJzOiBJbnZva2VyU3RhbXBbXSB8IHVuZGVmaW5lZDtcbiAgICAvLyDilIDilIDilIAgVHJlZS1kZXB0aCBndWFyZCDilIDilIDilIBcbiAgICAvLyBUaGUgaW5jcmVtZW50IGlzIGluc2lkZSBgdHJ5YCBzbyBgZmluYWxseWAgYWx3YXlzIGRlY3JlbWVudHMg4oCUIG5vXG4gICAgLy8gZnJhZ2lsZSBnYXAgYmV0d2VlbiBjaGVjayBhbmQgdHJ5IGVudHJ5LlxuICAgIHRyeSB7XG4gICAgICBpZiAoKyt0aGlzLl9leGVjdXRlRGVwdGggPiB0aGlzLl9tYXhEZXB0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZsb3djaGFydFRyYXZlcnNlcjogbWF4aW11bSB0cmF2ZXJzYWwgZGVwdGggZXhjZWVkZWQgKCR7dGhpcy5fbWF4RGVwdGh9KS4gYCArXG4gICAgICAgICAgICAnRGVwdGggY291bnRzIE5FU1RFRCBkaXNwYXRjaCAoZm9yayBjaGlsZHJlbiwgZGVjaWRlci9zZWxlY3RvciBicmFuY2hlcywgcmVjdXJzaXZlIGNvbXBvc2l0aW9uKSDigJQgJyArXG4gICAgICAgICAgICAnbGluZWFyIGNoYWlucyBhbmQgbG9vcCBpdGVyYXRpb25zIHJ1biBmbGF0IGFuZCBkbyBub3QgY29uc3VtZSBpdC4gJyArXG4gICAgICAgICAgICBgTGFzdCBzdGFnZTogJyR7bm9kZS5uYW1lfScuIGAgK1xuICAgICAgICAgICAgJ0NoZWNrIGZvciB1bmJvdW5kZWQgcmVjdXJzaXZlIGNoYXJ0IGNvbXBvc2l0aW9uLCBvciByYWlzZSB0aGUgbGltaXQgdmlhIFJ1bk9wdGlvbnMubWF4RGVwdGguJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGN1cnJlbnQ6IENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+ID0geyBbQ09OVElOVUVfSE9QXTogdHJ1ZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCB9O1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlU3RlcChjdXJyZW50Lm5vZGUsIGN1cnJlbnQuY29udGV4dCwgYnJlYWtGbGFnLCBjdXJyZW50LmJyYW5jaFBhdGgpO1xuICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ocmVzdWx0KSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5pbnZva2VyU3RhbXApIChwZW5kaW5nSW52b2tlcnMgPz89IFtdKS5wdXNoKHJlc3VsdC5pbnZva2VyU3RhbXApO1xuICAgICAgICBjdXJyZW50ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBSZXBsYXkgaW52b2tlciBzdGFtcHMgbW9zdC1yZWNlbnQtZmlyc3QuIGBzZXRJbnZva2VyYCBpc1xuICAgICAgLy8gZmlyc3Qtd3JpdGUtd2lucywgc28gdGhlIGlubmVybW9zdCBkaXNwYXRjaCdzIHN0YW1wIGxhbmRzIOKAlCBleGFjdGx5XG4gICAgICAvLyB0aGUgb2xkIGJ1YmJsZS11cCBvcmRlciB0aHJvdWdoIG5lc3RlZCBjYXRjaCBmcmFtZXMuXG4gICAgICBpZiAocGVuZGluZ0ludm9rZXJzICE9PSB1bmRlZmluZWQgJiYgaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHBlbmRpbmdJbnZva2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGVycm9yLnNldEludm9rZXIocGVuZGluZ0ludm9rZXJzW2ldLmludm9rZXJTdGFnZUlkLCBwZW5kaW5nSW52b2tlcnNbaV0uY29udGludWF0aW9uU3RhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9leGVjdXRlRGVwdGgtLTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgYSBmbGF0IGNvbnRpbnVhdGlvbiBob3AgZm9yIHRoZSBkcml2ZXIgbG9vcC4gKi9cbiAgcHJpdmF0ZSBob3AoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBpbnZva2VyU3RhbXA/OiBJbnZva2VyU3RhbXAsXG4gICk6IENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4geyBbQ09OVElOVUVfSE9QXTogdHJ1ZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgLi4uKGludm9rZXJTdGFtcCAmJiB7IGludm9rZXJTdGFtcCB9KSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgT05FIG5vZGUgdGhyb3VnaCBhbGwgNyBwaGFzZXMg4oCUIHRoZSBvbGQgcmVjdXJzaXZlIGBleGVjdXRlTm9kZWBcbiAgICogYm9keTsgb25seSB0aGUgdGFpbCBjYWxscyBiZWNhbWUgYENvbnRpbnVhdGlvbkhvcGAgcmV0dXJucy4gUmV0dXJucyB0aGVcbiAgICogbm9kZSdzIHJlc3VsdCwgb3IgYSBob3AgZm9yIHRoZSBkcml2ZXIgbG9vcCB0byBmb2xsb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVOb2RlU3RlcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBBdHRhY2ggYnVpbGRlciBtZXRhZGF0YSB0byBjb250ZXh0IGZvciBzbmFwc2hvdCBlbnJpY2htZW50LlxuICAgIC8vIFN1YmZsb3cgbWV0YSByZWFkcyBnbyB0aHJvdWdoIHRoZSBkeW5hbWljLXBhdGNoIG92ZXJsYXkg4oCUIGEgbm9kZVxuICAgIC8vIHBhdGNoZWQgYnkgYSBkeW5hbWljLXN1YmZsb3cgcmV0dXJuIHJlLWVudGVycyBleGVjdXRlTm9kZSBhbmQgbXVzdFxuICAgIC8vIGNsYXNzaWZ5IGFzIGEgc3ViZmxvdyB3aXRob3V0IHRoZSBzaGFyZWQgbm9kZSBldmVyIGJlaW5nIG11dGF0ZWQuXG4gICAgaWYgKG5vZGUuZGVzY3JpcHRpb24pIGNvbnRleHQuZGVzY3JpcHRpb24gPSBub2RlLmRlc2NyaXB0aW9uO1xuICAgIGNvbnN0IGVmZlN1YmZsb3dJZCA9IHRoaXMuZWZmU3ViZmxvd0lkKG5vZGUpO1xuICAgIGlmICh0aGlzLmVmZklzU3ViZmxvd1Jvb3Qobm9kZSkgJiYgZWZmU3ViZmxvd0lkKSBjb250ZXh0LnN1YmZsb3dJZCA9IGVmZlN1YmZsb3dJZDtcblxuICAgIC8vIEFzc2lnbiBydW50aW1lU3RhZ2VJZCBCRUZPUkUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbiDigJQgZW5zdXJlcyBzY29wZSBldmVudHNcbiAgICAvLyAoYnVmZmVyZWQgYnkgcnVudGltZVN0YWdlSWQpIGFuZCBmbG93IGV2ZW50cyAoZmx1c2hlZCBieSB0cmF2ZXJzYWxDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKVxuICAgIC8vIHVzZSB0aGUgc2FtZSB2YWx1ZS4gTXVzdCBoYXBwZW4gYmVmb3JlIGV4ZWN1dGVTdGFnZSBBTkQgYmVmb3JlIHRyYXZlcnNhbENvbnRleHQuXG4gICAgY29uc3QgaWR4ID0gdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSsrO1xuICAgIGNvbnRleHQucnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKG5vZGUuaWQsIGlkeCk7XG4gICAgLy8gRGVjbGFyZWQgdGFncyAoOS4yMS4wKSByaWRlIHRoZSBzYW1lIHN0YW1wOiBwZXItbm9kZSBpZGVudGl0eSwgc2V0XG4gICAgLy8gVU5DT05ESVRJT05BTExZIHNvIGEgcmUtdXNlZCBjb250ZXh0IChhIGxvb3AncyBuZXh0LWNvbnRleHQsIGEgcmVzdW1lZFxuICAgIC8vIGxlZykgbmV2ZXIga2VlcHMgYSBwcmV2aW91cyBub2RlJ3MgbmFtZXMuIGBTdGFnZUNvbnRleHQuY29tbWl0YCByZWNvcmRzXG4gICAgLy8gdGhlbSBvbiB0aGUgZmlyc3QgYnVuZGxlIG9mIHRoaXMgZXhlY3V0aW9uIGFuZCByZWxlYXNlcyB0aGVtLlxuICAgIGNvbnRleHQudGFncyA9IG5vZGUudGFncztcblxuICAgIC8vIFJGQy0wMDMgRDE6IHJ1bnRpbWUgcGFyZW50IOKAlCB0aGUgcHJldmlvdXMgZXhlY3V0aW9uIHN0ZXAncyBydW50aW1lU3RhZ2VJZC5cbiAgICAvLyBGYWxscyBiYWNrIHRvIHRoZSBzdWJmbG93IE1PVU5UJ3MgcnVudGltZVN0YWdlSWQgZm9yIHRoZSBzdWJmbG93IHJvb3RcbiAgICAvLyBzdGFnZSAoaXRzIFN0YWdlQ29udGV4dCBpcyBjcmVhdGVkIGZyZXNoIHdpdGggbm8gcGFyZW50KSwgc28gcnVudGltZVxuICAgIC8vIGFuY2VzdG9yIGNoYWlucyBjcm9zcyBzdWJmbG93IGJvdW5kYXJpZXMuIGB8fGAgKG5vdCBgPz9gKSBvbiBwdXJwb3NlOlxuICAgIC8vIGEgcGFyZW50IGNvbnRleHQgdGhhdCBuZXZlciBleGVjdXRlZCBzdGlsbCBjYXJyaWVzIHRoZSBmaWVsZCdzXG4gICAgLy8gaW5pdGlhbCBgJydgLCB3aGljaCBtdXN0IGFsc28gZmFsbCB0aHJvdWdoIHRvIHRoZSBtb3VudCBmYWxsYmFjay5cbiAgICBjb25zdCBwYXJlbnRSdW50aW1lU3RhZ2VJZCA9IGNvbnRleHQucGFyZW50Py5ydW50aW1lU3RhZ2VJZCB8fCB0aGlzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ7XG5cbiAgICAvLyBsb29wSXRlcmF0aW9uIOKAlCBob3cgbWFueSB0aW1lcyBUSElTIHN0YWdlIGhhcyBydW4gYmVmb3JlIGluIHRoaXMgcnVuLlxuICAgIC8vIEtleWVkIGJ5IHRoZSBzYW1lIHN0YWdlSWQgd2Ugc3RhbXAgb24gdGhlIGNvbnRleHQgKGFuZCB0aGUgc2FtZSB2YWx1ZSB0aGVcbiAgICAvLyBuYXJyYXRpdmUgcmVjb3JkZXIgY291bnRzIG9uKSwgcnVuLXNjb3BlZCBhbmQgc2hhcmVkIGFjcm9zcyBzdWJmbG93XG4gICAgLy8gcmUtbW91bnRzIHZpYSBgX3Zpc2l0Q291bnRzYC4gdW5kZWZpbmVkIG9uIHRoZSBmaXJzdCB2aXNpdDsgMSBvbiB0aGVcbiAgICAvLyBmaXJzdCBsb29wLWJhY2ssIDIgb24gdGhlIG5leHQsIOKApiDigJQgaS5lLiB2aXNpdENvdW50IC0gMS4gQ291bnRlZCBmb3JcbiAgICAvLyBFVkVSWSBzdGFnZSBraW5kIChhbnkgbm9kZSBjYW4gYmUgYSBsb29wIHRhcmdldCksIHVubGlrZSB0aGUgbmFycmF0aXZlXG4gICAgLy8gcmVjb3JkZXIgd2hpY2ggb25seSByZW5kZXJzIGl0IGZvciBsaW5lYXIgc3RhZ2VzLlxuICAgIGNvbnN0IGNvbnRleHRTdGFnZUlkID0gbm9kZS5pZCA/PyBjb250ZXh0LnN0YWdlSWQ7XG4gICAgY29uc3QgdmlzaXRDb3VudCA9ICh0aGlzLl92aXNpdENvdW50cy5nZXQoY29udGV4dFN0YWdlSWQpID8/IDApICsgMTtcbiAgICB0aGlzLl92aXNpdENvdW50cy5zZXQoY29udGV4dFN0YWdlSWQsIHZpc2l0Q291bnQpO1xuICAgIGNvbnN0IGxvb3BJdGVyYXRpb24gPSB2aXNpdENvdW50ID4gMSA/IHZpc2l0Q291bnQgLSAxIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gQnVpbGQgdHJhdmVyc2FsIGNvbnRleHQgZm9yIHJlY29yZGVyIGV2ZW50cyDigJQgY3JlYXRlZCBvbmNlIHBlciBzdGFnZSwgc2hhcmVkIGJ5IGFsbCBldmVudHNcbiAgICBjb25zdCB0cmF2ZXJzYWxDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0ID0ge1xuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBzdGFnZUlkOiBjb250ZXh0U3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3RhZ2VOYW1lOiBub2RlLm5hbWUsXG4gICAgICBwYXJlbnRTdGFnZUlkOiBjb250ZXh0LnBhcmVudD8uc3RhZ2VJZCxcbiAgICAgIC4uLihwYXJlbnRSdW50aW1lU3RhZ2VJZCAmJiB7IHBhcmVudFJ1bnRpbWVTdGFnZUlkIH0pLFxuICAgICAgLi4uKGxvb3BJdGVyYXRpb24gIT09IHVuZGVmaW5lZCAmJiB7IGxvb3BJdGVyYXRpb24gfSksXG4gICAgICBzdWJmbG93SWQ6IGNvbnRleHQuc3ViZmxvd0lkID8/IHRoaXMucGFyZW50U3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgICAgZGVwdGg6IHRoaXMuY29tcHV0ZUNvbnRleHREZXB0aChjb250ZXh0KSxcbiAgICB9O1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7bm9kZS5zdWJmbG93SWR9LyR7a2V5fWA7XG4gICAgICAgIGlmICghdGhpcy5zdGFnZU1hcC5oYXMocHJlZml4ZWRLZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQocHJlZml4ZWRLZXksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgICBpZiAocmVzb2x2ZWQuc3ViZmxvd3MpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHJlc29sdmVkLnN1YmZsb3dzKSkge1xuICAgICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7bm9kZS5zdWJmbG93SWR9LyR7a2V5fWA7XG4gICAgICAgICAgaWYgKCF0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdWJmbG93c1twcmVmaXhlZEtleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICBub2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICByZXNvbHZlZC5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFzIHJlc29sdmVkIGZvciBUSElTIHRyYXZlcnNlciDigJQgcGVyLXRyYXZlcnNlciBzZXQgcHJldmVudHMgcmUtZW50cnlcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBTdGFnZU5vZGUgZ3JhcGggKHdoaWNoIHdvdWxkIHJhY2UgY29uY3VycmVudCB0cmF2ZXJzZXJzKS5cbiAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDA6IENMQVNTSUZZIOKAlCBzdWJmbG93IGRldGVjdGlvbiDilIDilIDilIBcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkge1xuICAgICAgLy8gSGFuZCBoZWxwZXJzIHRoZSBFRkZFQ1RJVkUgbm9kZSB2aWV3IChidWlsdCBmaWVsZHMgKyBkeW5hbWljIHBhdGNoKVxuICAgICAgLy8gc28gU3ViZmxvd0V4ZWN1dG9yL05vZGVSZXNvbHZlciBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy5cbiAgICAgIGNvbnN0IG1vdW50Tm9kZSA9IHRoaXMuZWZmTm9kZShub2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLnJlc29sdmVTdWJmbG93UmVmZXJlbmNlKG1vdW50Tm9kZSk7XG5cbiAgICAgIGNvbnN0IHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0aGlzLnN1YmZsb3dFeGVjdXRvci5leGVjdXRlU3ViZmxvdyhcbiAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpc1JlZmVyZW5jZUJhc2VkU3ViZmxvdyA9IHJlc29sdmVkTm9kZSAhPT0gbW91bnROb2RlO1xuICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG1vdW50Tm9kZS5jaGlsZHJlbiAmJiBtb3VudE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG4gICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBCcmVhay1mbGFnIGNoZWNrIEFGVEVSIHN1YmZsb3cgcmV0dXJucyDilIDilIDilIBcbiAgICAgIC8vIElmIHRoZSBzdWJmbG93IHdhcyBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBhbmQgYnJva2VcbiAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgIC8vIFN0b3AgdGhlIG91dGVyIHRyYXZlcnNhbCBoZXJlIOKAlCBkbyBub3QgcnVuIHRoZSBuZXh0IGxpbmVhciBzdGFnZS5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5leHQgJiYgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbikge1xuICAgICAgICAvLyBBIG1vdW50J3MgYG5leHRgIGNhbiBiZSBhIGxvb3AtcmVmIFNUVUIg4oCUIGEgc3ViZmxvdyBtb3VudGVkIGFzIGFcbiAgICAgICAgLy8gZGVjaWRlciBicmFuY2ggd2l0aCBgeyBsb29wVG8gfWAgLyBgLmxvb3BUbygpYC4gUmVzb2x2ZSBpdCBsaWtlXG4gICAgICAgIC8vIFBoYXNlIDYgZG9lcyAoaXRlcmF0aW9uIGNvdW50ZWQsIGBvbkxvb3BgIGZpcmVkKTsgaG9wcGluZyBpbnRvIHRoZVxuICAgICAgICAvLyBiYXJlIHN0dWIgcmFuIHRoZSB0YXJnZXQncyBmdW5jdGlvbiBvbmNlIGFuZCBlbmRlZCB0aGUgcnVuLlxuICAgICAgICBpZiAobm9kZS5uZXh0LmlzTG9vcFJlZikge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZVRhcmdldChcbiAgICAgICAgICAgIG5vZGUubmV4dCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ob3AodGFyZ2V0Lm5vZGUsIHRhcmdldC5jb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYjogUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCwgb25lIGJyYW5jaCBwZXIgaXRlbSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFNpdHMgQkVGT1JFIFBoYXNlIDEgKFZBTElEQVRFKSBvbiBwdXJwb3NlOiB0aGlzIG5vZGUgbGVnaXRpbWF0ZWx5IGhhcyBub1xuICAgIC8vIHN0YWdlIGZ1bmN0aW9uLCBubyBzdGF0aWMgY2hpbGRyZW4sIGFuZCBubyBkZWNpZGVyIOKAlCBpdHMgYnJhbmNoZXMgZG8gbm90XG4gICAgLy8gZXhpc3QgdW50aWwgYGl0ZW1zKClgIHJ1bnMg4oCUIHNvIHRoZSBcIm11c3QgZGVmaW5lIGZuIE9SIGNoaWxkcmVuXCIgY2hlY2tcbiAgICAvLyB3b3VsZCByZWplY3QgYSBwZXJmZWN0bHkgdmFsaWQgY2hhcnQuIFRoZSBoYW5kbGVyIG93bnMgaXRzIG93biBjb21taXRcbiAgICAvLyAodGhlIG9yZGVyZWQgcmVzdWx0cyBhcnJheSksIGxpa2UgdGhlIGRlY2lkZXIgYW5kIHNlbGVjdG9yIHBoYXNlcyBkby5cbiAgICBpZiAobm9kZS5pc0R5bmFtaWNQYXJhbGxlbCAmJiBub2RlLnBhcmFsbGVsRm9yRWFjaCkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlci5ydW4obm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhZ2VGdW5jID0gdGhpcy5nZXRTdGFnZUZuKG5vZGUpO1xuICAgIGNvbnN0IGhhc1N0YWdlRnVuY3Rpb24gPSBCb29sZWFuKHN0YWdlRnVuYyk7XG4gICAgY29uc3QgaXNTY29wZUJhc2VkRGVjaWRlciA9IEJvb2xlYW4obm9kZS5kZWNpZGVyRm4pO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZFNlbGVjdG9yID0gQm9vbGVhbihub2RlLnNlbGVjdG9yRm4pO1xuICAgIGNvbnN0IGlzRGVjaWRlck5vZGUgPSBpc1Njb3BlQmFzZWREZWNpZGVyO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbih0aGlzLmVmZkNoaWxkcmVuKG5vZGUpPy5sZW5ndGgpO1xuICAgIC8vIGBuZXh0YCBpcyBuZXZlciBvdmVybGFpZCDigJQgYSBkeW5hbWljIG5leHQgYXBwbGllcyBvbmx5IHRvIHRoZSB2aXNpdFxuICAgIC8vIHRoYXQgcHJvZHVjZWQgaXQgKGhhbmRsZWQgdmlhIHRoZSBgZHluYW1pY05leHRgIGxvY2FsIGJlbG93KSwgc28gdGhlXG4gICAgLy8gYnVpbHQgY2hhcnQncyBuZXh0IGlzIGFsd2F5cyB0aGUgY29ycmVjdCBjb250aW51YXRpb24gaGVyZS5cbiAgICBjb25zdCBoYXNOZXh0ID0gQm9vbGVhbihub2RlLm5leHQpO1xuICAgIGNvbnN0IG9yaWdpbmFsTmV4dCA9IG5vZGUubmV4dDtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAxOiBWQUxJREFURSDigJQgbm9kZSBpbnZhcmlhbnRzIOKUgOKUgOKUgFxuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbiAmJiAhaXNEZWNpZGVyTm9kZSAmJiAhaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgTm9kZSAnJHtub2RlLm5hbWV9JyBtdXN0IGRlZmluZTogZW1iZWRkZWQgZm4gT1IgYSBzdGFnZU1hcCBlbnRyeSBPUiBoYXZlIGNoaWxkcmVuL2RlY2lkZXJgO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzRGVjaWRlck5vZGUgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnRGVjaWRlciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnU2VsZWN0b3Igbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hcmtlcnMgZm9yIGRlYnVnIHBhbmVsc1xuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbikge1xuICAgICAgaWYgKGlzRGVjaWRlck5vZGUpIGNvbnRleHQuc2V0QXNEZWNpZGVyKCk7XG4gICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbikgY29udGV4dC5zZXRBc0ZvcmsoKTtcbiAgICB9XG5cbiAgICAvLyBCcmVhayBoYW5kbGVyIHdpcmVkIHRvIHRoZSBzY29wZS4gQ2FwdHVyZXMgdGhlIG9wdGlvbmFsIHJlYXNvblxuICAgIC8vIHBhc3NlZCB2aWEgYHNjb3BlLiRicmVhayhyZWFzb24pYCBhbmQgcGFya3MgaXQgb24gdGhlIGJyZWFrRmxhZyBzb1xuICAgIC8vIGRvd25zdHJlYW0gY29kZSAoRmxvd1JlY29yZGVyLm9uQnJlYWssIHN1YmZsb3cgcHJvcGFnYXRpb24pIGNhblxuICAgIC8vIHN1cmZhY2UgaXQuIEEgc2Vjb25kICRicmVhayBjYWxsIGluIHRoZSBzYW1lIHN0YWdlIGtlZXBzIHRoZSBGSVJTVFxuICAgIC8vIHJlYXNvbiDigJQgZmlyc3QtYnJlYWstd2lucyDigJQgbWF0Y2hpbmcgdGhlIFwiZXhlY3V0aW9uIHN0b3BwZWRcIiBzdG9yeS5cbiAgICBjb25zdCBicmVha0ZuID0gKHJlYXNvbj86IHN0cmluZykgPT4ge1xuICAgICAgYnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZTtcbiAgICAgIGlmIChyZWFzb24gIT09IHVuZGVmaW5lZCAmJiBicmVha0ZsYWcucmVhc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWtGbGFnLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJhOiBTRUxFQ1RPUiDigJQgc2NvcGUtYmFzZWQgbXVsdGktY2hvaWNlIOKUgOKUgOKUgFxuICAgIGlmIChpc1Njb3BlQmFzZWRTZWxlY3Rvcikge1xuICAgICAgY29uc3Qgc2VsZWN0b3JSZXN1bHQgPSBhd2FpdCB0aGlzLnNlbGVjdG9ySGFuZGxlci5oYW5kbGVTY29wZUJhc2VkKFxuICAgICAgICBub2RlLFxuICAgICAgICBzdGFnZUZ1bmMhLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0YWdlLmJpbmQodGhpcyksXG4gICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5vZGUubmV4dCEubmFtZSwgbm9kZS5uZXh0IS5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQhLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3RvclJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMmI6IERFQ0lERVIg4oCUIHNjb3BlLWJhc2VkIHNpbmdsZS1jaG9pY2UgY29uZGl0aW9uYWwgYnJhbmNoIOKUgOKUgOKUgFxuICAgIGlmIChpc0RlY2lkZXJOb2RlKSB7XG4gICAgICBjb25zdCBkaXNwYXRjaCA9IGF3YWl0IHRoaXMuZGVjaWRlckhhbmRsZXIucHJlcGFyZURpc3BhdGNoKFxuICAgICAgICBub2RlLFxuICAgICAgICBzdGFnZUZ1bmMhLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0YWdlLmJpbmQodGhpcyksXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICAvLyBObyBkZWNpZGVyLWxldmVsIGNvbnRpbnVhdGlvbiDihpIgdGhlIGJyYW5jaCBkaXNwYXRjaCBpcyBhIHRhaWxcbiAgICAgIC8vIGNhbGwuIEhhbmQgaXQgdG8gdGhlIGRyaXZlciBhcyBhIGZsYXQgaG9wIHNvIGxvb3AtaGVhdnkgZGVjaWRlclxuICAgICAgLy8gY2hhcnRzIChlLmcuIGFnZW50IFJlQWN0IGxvb3BzIHdpdGggYnJhbmNoLXNvdXJjZWQgYGxvb3BUb2ApIHN0YXlcbiAgICAgIC8vIGZsYXQtc3RhY2tlZC4gVGhlIGludm9rZXIgc3RhbXAgcHJlc2VydmVzIFBhdXNlU2lnbmFsIHNlbWFudGljcyDigJRcbiAgICAgIC8vIHRoZSBkZWNpZGVyIGlzIHRoZSBpbnZva2VyIG9mIHdoYXRldmVyIHBhdXNlcyBpbiB0aGUgY2hhaW4uXG4gICAgICBpZiAoIWhhc05leHQgJiYgZGlzcGF0Y2gua2luZCA9PT0gJ2Rpc3BhdGNoJykge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3AoZGlzcGF0Y2guY2hvc2VuLCBkaXNwYXRjaC5icmFuY2hDb250ZXh0LCBicmFuY2hQYXRoLCB7XG4gICAgICAgICAgaW52b2tlclN0YWdlSWQ6IG5vZGUuaWQhLFxuICAgICAgICAgIGNvbnRpbnVhdGlvblN0YWdlSWQ6IG5vZGUubmV4dD8uaWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWNpZGVyIFdJVEggaXRzIG93biBuZXh0OiB0aGUgYnJhbmNoIGNoYWluIG11c3QgY29tcGxldGUgQkVGT1JFXG4gICAgICAvLyB0aGUgZGVjaWRlcidzIGNvbnRpbnVhdGlvbiBydW5zIOKAlCB0cnVlIHRyZWUgbmVzdGluZywga2VwdFxuICAgICAgLy8gcmVjdXJzaXZlIChhIG5lc3RlZCBkcml2ZXIpLiBNaXJyb3JzIGhhbmRsZVNjb3BlQmFzZWQgZXhhY3RseSxcbiAgICAgIC8vIGluY2x1ZGluZyB0aGUgUGF1c2VTaWduYWwgaW52b2tlciBzdGFtcCBvbiBidWJibGUtdXAuXG4gICAgICBsZXQgZGVjaWRlclJlc3VsdDogYW55O1xuICAgICAgaWYgKGRpc3BhdGNoLmtpbmQgPT09ICdicmVhaycpIHtcbiAgICAgICAgZGVjaWRlclJlc3VsdCA9IGRpc3BhdGNoLmJyYW5jaElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWNpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShkaXNwYXRjaC5jaG9zZW4sIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhLCBub2RlLm5leHQ/LmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgYnJhbmNoIGV4ZWN1dGlvbiwgZm9sbG93IGRlY2lkZXIncyBvd24gbmV4dCAoZS5nLiwgbG9vcFRvIHRhcmdldClcbiAgICAgIGlmIChoYXNOZXh0ICYmICFicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuICAgICAgICAvLyBVc2UgdGhlIGlzTG9vcFJlZiBmbGFnIHNldCBieSBsb29wVG8oKSDigJQgZG8gbm90IHJlbHkgb24gc3RhZ2VNYXAgYWJzZW5jZSxcbiAgICAgICAgLy8gc2luY2UgaWQta2V5ZWQgc3RhZ2VNYXBzIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBsb29wIHRhcmdldHMgdG8gYmUgZXhlY3V0ZWQgZGlyZWN0bHkuXG4gICAgICAgIGNvbnN0IGlzTG9vcFJlZiA9XG4gICAgICAgICAgbmV4dE5vZGUuaXNMb29wUmVmID09PSB0cnVlIHx8XG4gICAgICAgICAgKCF0aGlzLmdldFN0YWdlRm4obmV4dE5vZGUpICYmXG4gICAgICAgICAgICAhdGhpcy5lZmZDaGlsZHJlbihuZXh0Tm9kZSk/Lmxlbmd0aCAmJlxuICAgICAgICAgICAgIW5leHROb2RlLmRlY2lkZXJGbiAmJlxuICAgICAgICAgICAgIW5leHROb2RlLnNlbGVjdG9yRm4gJiZcbiAgICAgICAgICAgICF0aGlzLmVmZklzU3ViZmxvd1Jvb3QobmV4dE5vZGUpKTtcblxuICAgICAgICBpZiAoaXNMb29wUmVmKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ob3AodGFyZ2V0Lm5vZGUsIHRhcmdldC5jb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uTmV4dChub2RlLm5hbWUsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3AobmV4dE5vZGUsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVjaWRlclJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgQWJvcnQgY2hlY2sg4oCUIGNvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbiDilIDilIDilIBcbiAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9XG4gICAgICAgIHRoaXMuc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gdGhpcy5zaWduYWwucmVhc29uIDogbmV3IEVycm9yKHRoaXMuc2lnbmFsLnJlYXNvbiA/PyAnQWJvcnRlZCcpO1xuICAgICAgdGhyb3cgcmVhc29uO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAzOiBFWEVDVVRFIOKAlCBydW4gc3RhZ2UgZnVuY3Rpb24g4pSA4pSA4pSAXG4gICAgbGV0IHN0YWdlT3V0cHV0OiBUT3V0IHwgdW5kZWZpbmVkO1xuICAgIGxldCBkeW5hbWljTmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoc3RhZ2VGdW5jKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIGV4cGVjdGVkIGNvbnRyb2wgZmxvdywgbm90IGFuIGVycm9yIOKAlCBmaXJlIG5hcnJhdGl2ZSwgY29tbWl0LCByZS10aHJvdy5cbiAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblBhdXNlKG5vZGUubmFtZSwgbm9kZS5pZCwgZXJyb3IucGF1c2VEYXRhLCBlcnJvci5zdWJmbG93UGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIGVycm9yLnRvU3RyaW5nKCksIGVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yIH0pO1xuICAgICAgICBjb250ZXh0LmFkZEVycm9yKCdzdGFnZUV4ZWN1dGlvbkVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdsaW5lYXInKTtcblxuICAgICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICAvLyBGb3J3YXJkIHRoZSBvcHRpb25hbCByZWFzb24gY2FwdHVyZWQgb24gYnJlYWtGbGFnIOKAlCBzZXQgYnkgdGhlXG4gICAgICAgIC8vIHN0YWdlJ3MgJGJyZWFrKHJlYXNvbikgY2FsbCBPUiBieSBhIHN1YmZsb3cncyBwcm9wYWdhdGVCcmVhay5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQsIGJyZWFrRmxhZy5yZWFzb24pO1xuICAgICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA0OiBEWU5BTUlDIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiDilIDilIDilIBcbiAgICAgIGlmIChzdGFnZU91dHB1dCAmJiB0eXBlb2Ygc3RhZ2VPdXRwdXQgPT09ICdvYmplY3QnICYmIGlzU3RhZ2VOb2RlUmV0dXJuKHN0YWdlT3V0cHV0KSkge1xuICAgICAgICBjb25zdCBkeW5hbWljTm9kZSA9IHN0YWdlT3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgICBjb250ZXh0LmFkZExvZygnaXNEeW5hbWljJywgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdTdGFnZU5vZGVSZXR1cm4nKTtcblxuICAgICAgICAvLyBEeW5hbWljIHN1YmZsb3cgYXV0by1yZWdpc3RyYXRpb24uIFRoZSBzdWJmbG93IG1ldGEgbGFuZHMgaW4gdGhlXG4gICAgICAgIC8vIHRyYXZlcnNlci1sb2NhbCBvdmVybGF5IChOT1Qgb24gdGhlIHNoYXJlZCBub2RlKTsgdGhlIGltbWVkaWF0ZVxuICAgICAgICAvLyBleGVjdXRlTm9kZSByZS1lbnRyeSBzZWVzIGl0IHRocm91Z2ggdGhlIGVmZiogYWNjZXNzb3JzIGFuZFxuICAgICAgICAvLyBjbGFzc2lmaWVzIHRoZSBub2RlIGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICBpZiAoZHluYW1pY05vZGUuaXNTdWJmbG93Um9vdCAmJiBkeW5hbWljTm9kZS5zdWJmbG93RGVmICYmIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCkge1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdkeW5hbWljU3ViZmxvdycpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljU3ViZmxvd0lkJywgZHluYW1pY05vZGUuc3ViZmxvd0lkKTtcblxuICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihkeW5hbWljTm9kZS5zdWJmbG93SWQsIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYsIG5vZGUuaWQpO1xuXG4gICAgICAgICAgdGhpcy5nZXRPckNyZWF0ZVBhdGNoKG5vZGUpLnN1YmZsb3dNZXRhID0ge1xuICAgICAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YmZsb3dJZDogZHluYW1pY05vZGUuc3ViZmxvd0lkLFxuICAgICAgICAgICAgc3ViZmxvd05hbWU6IGR5bmFtaWNOb2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgc3ViZmxvd01vdW50T3B0aW9uczogZHluYW1pY05vZGUuc3ViZmxvd01vdW50T3B0aW9ucyxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmUtZW50ZXIgVEhJUyBub2RlIChzYW1lIGNvbnRleHQpOiB0aGUgb3ZlcmxheSBwYXRjaCBtYWtlcyB0aGVcbiAgICAgICAgICAvLyBuZXh0IHN0ZXAgY2xhc3NpZnkgaXQgYXMgYSBzdWJmbG93IG1vdW50IGluIFBoYXNlIDAuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgY2hpbGRyZW4gZm9yIHN1YmZsb3dEZWZcbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgY2hpbGQuc3ViZmxvd0RlZiAmJiBjaGlsZC5zdWJmbG93SWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGNoaWxkLnN1YmZsb3dJZCwgY2hpbGQuc3ViZmxvd0RlZiwgY2hpbGQuaWQpO1xuICAgICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgICAgICAgY2hpbGQuaWQsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0lkISxcbiAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHluYW1pYyBjaGlsZHJlbiAoZm9yayBwYXR0ZXJuKSDigJQgcGF0Y2hlZCBpbnRvIHRoZSBvdmVybGF5O1xuICAgICAgICAvLyBQaGFzZSA1IGJlbG93IHJlYWRzIHRoZW0gYmFjayB0aHJvdWdoIGVmZkNoaWxkcmVuL2VmZlNlbGVjdG9yLlxuICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4gJiYgZHluYW1pY05vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5jaGlsZHJlbiA9IGR5bmFtaWNOb2RlLmNoaWxkcmVuO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljQ2hpbGRDb3VudCcsIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coXG4gICAgICAgICAgICAnZHluYW1pY0NoaWxkSWRzJyxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZCksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljQ2hpbGRyZW4oXG4gICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBCb29sZWFuKGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3IpLFxuICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5kZWNpZGVyRm4pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5uZXh0Tm9kZVNlbGVjdG9yID0gZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvcjtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdoYXNTZWxlY3RvcicsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgbmV4dCAobGluZWFyIGNvbnRpbnVhdGlvbikg4oCUIHN0YXlzIGEgTE9DQUw6IGl0IGFwcGxpZXNcbiAgICAgICAgLy8gb25seSB0byB0aGlzIHZpc2l0IChQaGFzZSA2IHJvdXRlcyBpdCB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBDb250aW51YXRpb25SZXNvbHZlciksIHNvIHRoZSBzaGFyZWQgbm9kZSdzIG5leHQgaXMgbmV2ZXIgdG91Y2hlZFxuICAgICAgICAvLyBhbmQgYSBsb29wIHJldmlzaXQgbmF0dXJhbGx5IHNlZXMgdGhlIGJ1aWx0IGNvbnRpbnVhdGlvbi5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLm5leHQpIHtcbiAgICAgICAgICBkeW5hbWljTmV4dCA9IGR5bmFtaWNOb2RlLm5leHQ7XG4gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNOZXh0KG5vZGUuaWQsIGR5bmFtaWNOb2RlLm5leHQpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdoYXNEeW5hbWljTmV4dCcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhZ2VPdXRwdXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDU6IENISUxEUkVOIOKAlCBmb3JrIGRpc3BhdGNoIOKUgOKUgOKUgFxuICAgIC8vIFJlLXJlYWQgdGhyb3VnaCB0aGUgb3ZlcmxheTogUGhhc2UgNCBtYXkgaGF2ZSBqdXN0IHBhdGNoZWQgZHluYW1pY1xuICAgIC8vIGNoaWxkcmVuL3NlbGVjdG9yIGZvciBUSElTIHZpc2l0IChvciBhbiBlYXJsaWVyIHZpc2l0IGluIHRoaXMgcnVuKS5cbiAgICBjb25zdCBjaGlsZHJlbkFmdGVyU3RhZ2UgPSB0aGlzLmVmZkNoaWxkcmVuKG5vZGUpO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSA9IEJvb2xlYW4oY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGgpO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSkge1xuICAgICAgY29udGV4dC5hZGRMb2coJ3RvdGFsQ2hpbGRyZW4nLCBjaGlsZHJlbkFmdGVyU3RhZ2U/Lmxlbmd0aCk7XG4gICAgICBjb250ZXh0LmFkZExvZygnb3JkZXJPZkV4ZWN1dGlvbicsICdDaGlsZHJlbkFmdGVyU3RhZ2UnKTtcblxuICAgICAgbGV0IG5vZGVDaGlsZHJlblJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPjtcblxuICAgICAgY29uc3QgZWZmU2VsZWN0b3JGbiA9IHRoaXMuZWZmU2VsZWN0b3Iobm9kZSk7XG4gICAgICBpZiAoZWZmU2VsZWN0b3JGbikge1xuICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVTZWxlY3RlZENoaWxkcmVuKFxuICAgICAgICAgIGVmZlNlbGVjdG9yRm4sXG4gICAgICAgICAgY2hpbGRyZW5BZnRlclN0YWdlISxcbiAgICAgICAgICBzdGFnZU91dHB1dCxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJyYW5jaFBhdGggYXMgc3RyaW5nLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgbm9kZS5mYWlsRmFzdCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoaWxkQ291bnQgPSBjaGlsZHJlbkFmdGVyU3RhZ2U/Lmxlbmd0aCA/PyAwO1xuICAgICAgICBjb25zdCBjaGlsZE5hbWVzID0gY2hpbGRyZW5BZnRlclN0YWdlPy5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdjaGlsZHJlbicsIGBFeGVjdXRpbmcgYWxsICR7Y2hpbGRDb3VudH0gY2hpbGRyZW4gaW4gcGFyYWxsZWw6ICR7Y2hpbGROYW1lc31gLCB7XG4gICAgICAgICAgY291bnQ6IGNoaWxkQ291bnQsXG4gICAgICAgICAgdGFyZ2V0U3RhZ2U6IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBlZmZOb2RlOiBDaGlsZHJlbkV4ZWN1dG9yIHJlYWRzIG5vZGUuY2hpbGRyZW4vbm9kZS5mYWlsRmFzdCBpdHNlbGYuXG4gICAgICAgIG5vZGVDaGlsZHJlblJlc3VsdHMgPSBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZU5vZGVDaGlsZHJlbihcbiAgICAgICAgICB0aGlzLmVmZk5vZGUobm9kZSksXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JrLW9ubHk6IHJldHVybiBidW5kbGVcbiAgICAgIGlmICghaGFzTmV4dCAmJiAhZHluYW1pY05leHQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVDaGlsZHJlblJlc3VsdHMhO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXB0dXJlIGR5bmFtaWMgY2hpbGRyZW4gYXMgc3ludGhldGljIHN1YmZsb3cgcmVzdWx0IGZvciBVSVxuICAgICAgY29uc3QgaXNEeW5hbWljID0gY29udGV4dC5kZWJ1Zz8ubG9nQ29udGV4dD8uaXNEeW5hbWljO1xuICAgICAgaWYgKGlzRHluYW1pYyAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UgJiYgY2hpbGRyZW5BZnRlclN0YWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jYXB0dXJlRHluYW1pY0NoaWxkcmVuUmVzdWx0KG5vZGUsIGNoaWxkcmVuQWZ0ZXJTdGFnZSwgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDY6IENPTlRJTlVFIOKAlCBkeW5hbWljIG5leHQgLyBsaW5lYXIgbmV4dCDilIDilIDilIBcbiAgICBpZiAoZHluYW1pY05leHQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZVRhcmdldChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICByZXR1cm4gdGhpcy5ob3AodGFyZ2V0Lm5vZGUsIHRhcmdldC5jb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuXG4gICAgICAvLyBEZXRlY3QgbG9vcCByZWZlcmVuY2Ugbm9kZXMgY3JlYXRlZCBieSBsb29wVG8oKSDigJQgbWFya2VkIHdpdGggaXNMb29wUmVmIGZsYWcuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIENvbnRpbnVhdGlvblJlc29sdmVyIGZvciBwcm9wZXIgSUQgcmVzb2x1dGlvbiwgaXRlcmF0aW9uXG4gICAgICAvLyB0cmFja2luZywgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0aW9uLiBUaGUgcmVzb2x2ZWQgdGFyZ2V0IGNvbWVzIGJhY2tcbiAgICAgIC8vIGFzIGEgaG9wIOKAlCBsb29wIGVkZ2VzIGNvbnN1bWUgbm8gc3RhY2ssIHNvIHRoZSBpdGVyYXRpb24gbGltaXRcbiAgICAgIC8vIChub3QgY2FsbC1zdGFjayBkZXB0aCkgaXMgd2hhdCBib3VuZHMgYSBsb29wLlxuICAgICAgY29uc3QgaXNMb29wUmVmZXJlbmNlID0gbmV4dE5vZGUuaXNMb29wUmVmO1xuXG4gICAgICBpZiAoaXNMb29wUmVmZXJlbmNlKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZVRhcmdldChuZXh0Tm9kZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcCh0YXJnZXQubm9kZSwgdGFyZ2V0LmNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ25leHQnLCBgTW92aW5nIHRvICR7bmV4dE5vZGUubmFtZX0gc3RhZ2VgLCB7XG4gICAgICAgIHRhcmdldFN0YWdlOiBuZXh0Tm9kZS5uYW1lLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5pZCk7XG4gICAgICByZXR1cm4gdGhpcy5ob3AobmV4dE5vZGUsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA3OiBMRUFGIOKAlCBubyBjb250aW51YXRpb24g4pSA4pSA4pSAXG4gICAgcmV0dXJuIHN0YWdlT3V0cHV0O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFByaXZhdGUgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY2hpbGRyZW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRTdGFnZUlkID0gY29udGV4dC5nZXRTdGFnZUlkKCk7XG5cbiAgICBjb25zdCBjaGlsZFN0cnVjdHVyZTogYW55ID0ge1xuICAgICAgaWQ6IGAke25vZGUuaWR9LWNoaWxkcmVuYCxcbiAgICAgIG5hbWU6ICdEeW5hbWljIENoaWxkcmVuJyxcbiAgICAgIHR5cGU6ICdmb3JrJyxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbi5tYXAoKGMpID0+ICh7XG4gICAgICAgIGlkOiBjLmlkLFxuICAgICAgICBuYW1lOiBjLm5hbWUsXG4gICAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICB9KSksXG4gICAgfTtcblxuICAgIGNvbnN0IGNoaWxkU3RhZ2VzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGlmIChjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkQ3R4IG9mIGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSBjaGlsZEN0eC5nZXRTbmFwc2hvdCgpO1xuICAgICAgICBjaGlsZFN0YWdlc1tzbmFwc2hvdC5uYW1lIHx8IHNuYXBzaG90LmlkXSA9IHtcbiAgICAgICAgICBuYW1lOiBzbmFwc2hvdC5uYW1lLFxuICAgICAgICAgIG91dHB1dDogc25hcHNob3QubG9ncyxcbiAgICAgICAgICBlcnJvcnM6IHNuYXBzaG90LmVycm9ycyxcbiAgICAgICAgICBtZXRyaWNzOiBzbmFwc2hvdC5tZXRyaWNzLFxuICAgICAgICAgIHN0YXR1czogc25hcHNob3QuZXJyb3JzICYmIE9iamVjdC5rZXlzKHNuYXBzaG90LmVycm9ycykubGVuZ3RoID4gMCA/ICdlcnJvcicgOiAnc3VjY2VzcycsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdWJmbG93UmVzdWx0cy5zZXQobm9kZS5pZCwge1xuICAgICAgc3ViZmxvd0lkOiBub2RlLmlkLFxuICAgICAgc3ViZmxvd05hbWU6IG5vZGUubmFtZSxcbiAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgIGdsb2JhbENvbnRleHQ6IHt9LFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBjaGlsZFN0YWdlcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBbXSxcbiAgICAgICAgaW5pdGlhbFN0YXRlOiB7fSxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVTdHJ1Y3R1cmU6IGNoaWxkU3RydWN0dXJlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcmVudC1jaGFpbiBsZW5ndGggb2YgYSBTdGFnZUNvbnRleHQg4oCUIHNhbWUgdmFsdWUgdGhlIHByZS10cmFtcG9saW5lXG4gICAqIHdhbGsgcHJvZHVjZWQsIG1lbW9pemVkLiBUaGUgY29udGV4dCB0cmVlIGRlZXBlbnMgYnkgb25lIHBlciBleGVjdXRlZFxuICAgKiBzdGFnZSBhbG9uZyBhIGNoYWluLCBzbyB0aGUgbmFpdmUgd2FsayBpcyBPKGNoYWluIGxlbmd0aCkgcGVyIHN0YWdlIOKAlFxuICAgKiBPKG7CsikgcGVyIHJ1biBvbmNlIGNoYWlucyByZWFjaCB0cmFtcG9saW5lIHNjYWxlLiBDb250ZXh0cyBhcmUgdmlzaXRlZFxuICAgKiBwYXJlbnQtYmVmb3JlLWNoaWxkLCBzbyB0aGUgY2FjaGVkIHBhcmVudCBtYWtlcyB0aGlzIE8oMSkgYW1vcnRpemVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlQ29udGV4dERlcHRoKGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IG51bWJlciB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5jb250ZXh0RGVwdGhDYWNoZS5nZXQoY29udGV4dCk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgLy8gV2FsayB1cCB0byB0aGUgbmVhcmVzdCBjYWNoZWQgYW5jZXN0b3IgKG9yIHRoZSByb290KSwgdGhlbiBmaWxsIHRoZVxuICAgIC8vIGNhY2hlIGJhY2sgZG93biDigJQgaXRlcmF0aXZlLCBzbyBhIGNvbGQgZGVlcCBjaGFpbiBjYW4ndCBvdmVyZmxvdy5cbiAgICBjb25zdCB1bmNhY2hlZDogU3RhZ2VDb250ZXh0W10gPSBbXTtcbiAgICBsZXQgZGVwdGggPSAtMTsgLy8gZGVwdGggb2YgdGhlIG5vZGUgQUJPVkUgdGhlIGZpcnN0IHVuY2FjaGVkIGVudHJ5XG4gICAgbGV0IGN1cnJlbnQ6IFN0YWdlQ29udGV4dCB8IHVuZGVmaW5lZCA9IGNvbnRleHQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMuY29udGV4dERlcHRoQ2FjaGUuZ2V0KGN1cnJlbnQpO1xuICAgICAgaWYgKGhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlcHRoID0gaGl0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHVuY2FjaGVkLnB1c2goY3VycmVudCk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSB1bmNhY2hlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgZGVwdGgrKztcbiAgICAgIHRoaXMuY29udGV4dERlcHRoQ2FjaGUuc2V0KHVuY2FjaGVkW2ldLCBkZXB0aCk7XG4gICAgfVxuICAgIHJldHVybiBkZXB0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGdlbmVyYXRlZCBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2ggYXMgYSBzdWJmbG93IOKAlCBPVkVSV1JJVElOR1xuICAgKiBhbnkgcmVnaXN0cmF0aW9uIGZyb20gYSBwcmV2aW91cyB2aXNpdC5cbiAgICpcbiAgICogRGVsaWJlcmF0ZSBkaXZlcmdlbmNlIGZyb20gYGF1dG9SZWdpc3RlclN1YmZsb3dEZWZgJ3MgZmlyc3Qtd3JpdGUtd2lucy5cbiAgICogR2VuZXJhdGVkIHNlZ21lbnRzIGFyZSBzdGFibGUgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucyAoYDxzdGFnZUlkPn48aW5kZXg+YFxuICAgKiBpcyBkZXJpdmVkIGZyb20gdGhlIHN0YWdlIGlkIGFuZCB0aGUgYnJhbmNoIGluZGV4LCBuZWl0aGVyIG9mIHdoaWNoXG4gICAqIGNoYW5nZXMpLCBzbyBmaXJzdC13cml0ZS13aW5zIHdvdWxkIG1lYW4gYSBMT09QSU5HIGZhbi1vdXQgc2lsZW50bHlcbiAgICogcmUtZXhlY3V0aW5nIGl0ZXJhdGlvbiAxJ3MgYnJhbmNoIGNoYXJ0cyBmb3JldmVyIOKAlCBldmVuIHdoZW4gdGhlIGJyYW5jaFxuICAgKiBmYWN0b3J5IHJldHVybnMgYSBkaWZmZXJlbnQgY2hhcnQgZWFjaCB0aW1lLiBUaGF0IGlzIHRoZSBcIndvdWxkIG5vdCBjcmFzaCxcbiAgICogd291bGQgc2lsZW50bHkgY29ycnVwdFwiIGZhaWx1cmUgY2xhc3MgdGhpcyB3aG9sZSBkZXNpZ24gaXMgYnVpbHQgdG8gYXZvaWQsXG4gICAqIHNvIGEgcmVnZW5lcmF0ZWQgYnJhbmNoIGFsd2F5cyByZXBsYWNlcyBpdHMgcHJlZGVjZXNzb3IuIFBlci1pdGVyYXRpb25cbiAgICogcmVzdWx0cyBzdGF5IGFkZHJlc3NhYmxlIHZpYSB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgIGtleSwgZXhhY3RseSBhc1xuICAgKiBmb3IgYSBoYW5kLWF1dGhvcmVkIGxvb3Bpbmcgc3ViZmxvdy5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJCcmFuY2hTdWJmbG93KFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoYXJ0OiB7IHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+OyBzdWJmbG93cz86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlIH0+IH0sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc3ViZmxvd3Nbc3ViZmxvd0lkXSA9IHsgcm9vdCB9O1xuXG4gICAgLy8gU3RhZ2UgZnVuY3Rpb25zIGxhbmQgdW5kZXIgdGhlIGJyYW5jaCdzIHByZWZpeCwgbWF0Y2hpbmcgdGhlIHByZWZpeGVkIGlkcy5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBjaGFydC5zdGFnZU1hcCkge1xuICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoYCR7c3ViZmxvd0lkfS8ke2tleX1gLCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgIH1cblxuICAgIC8vIE5lc3RlZCBzdWJmbG93cyBpbnNpZGUgdGhlIGJyYW5jaCBjaGFydCwgc2FtZSBwcmVmaXhpbmcuXG4gICAgaWYgKGNoYXJ0LnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcnQuc3ViZmxvd3MpKSB7XG4gICAgICAgIHRoaXMuc3ViZmxvd3NbYCR7c3ViZmxvd0lkfS8ke2tleX1gXSA9IGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWZpeCBhIG5vZGUgdHJlZSB3aXRoIGEgc3ViZmxvdyBwYXRoIHNlZ21lbnQuXG4gICAqXG4gICAqIOKUgOKUgCBCWVRFLVRXSU4gQ09OVFJBQ1Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFRoaXMgZnVuY3Rpb24gYW5kIGBGbG93Q2hhcnRCdWlsZGVyLl9wcmVmaXhOb2RlVHJlZWAgYXJlIGJ5dGUtdHdpbnMgYnlcbiAgICogY29udHJhY3Q6IHRoZSBidWlsZGVyIHByZWZpeGVzIGF0IE1PVU5UIHRpbWUsIHRoaXMgb25lIGF0IFJVTiB0aW1lIChsYXp5XG4gICAqIHN1YmZsb3dzLCBhbmQgdGhlIGdlbmVyYXRlZCBicmFuY2hlcyBvZiBgYWRkUGFyYWxsZWxGb3JFYWNoYCksIGFuZCBhIGNoYXJ0XG4gICAqIG11c3QgY29tZSBvdXQgaWRlbnRpY2FsIGVpdGhlciB3YXkuIGB0ZXN0L2xpYi9lbmdpbmUvYnJhbmNoLXNlZ21lbnQtcHJlZml4ZXItZXF1aXZhbGVuY2UudGVzdC50c2BcbiAgICogcGlucyB0aGF0IOKAlCBhbnkgZWRpdCBoZXJlIG11c3QgYmUgbWlycm9yZWQgdGhlcmUsIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBHZW5lcmF0ZWQgYnJhbmNoIHNlZ21lbnRzIChgPHN0YWdlSWQ+fjxpbmRleD5gLCBzZWUgYGVuZ2luZS9icmFuY2hTZWdtZW50LnRzYClcbiAgICogcmlkZSB0aGlzIGV4YWN0IHBhdGggd2l0aCBubyBzcGVjaWFsIGNhc2U6IHRoZSBzZWdtZW50IGlzIGp1c3QgYSBwcmVmaXgsIHNvXG4gICAqIGEgYnJhbmNoJ3MgaW5uZXIgaWRzIGJlY29tZSBgPHNlZ21lbnQ+LzxpZD5gIGFuZCBpdHMgc3RhZ2VzIGFkZHJlc3MgYXNcbiAgICogYDxzZWdtZW50Pi88aWQ+IzxuPmAg4oCUIHRoZSBzaGlwcGVkIGdyYW1tYXIsIHdoaWNoIGlzIHdoeSBldmVyeSB0cmFjZSBxdWVyeVxuICAgKiByZWFkcyBicmFuY2ggY29tbWl0cyB1bm1vZGlmaWVkLiBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kLlxuICAgKi9cbiAgcHJpdmF0ZSBwcmVmaXhOb2RlVHJlZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4OiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKCFub2RlKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBjbG9uZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IC4uLm5vZGUgfTtcbiAgICBjbG9uZS5uYW1lID0gYCR7cHJlZml4fS8ke25vZGUubmFtZX1gO1xuICAgIGNsb25lLmlkID0gYCR7cHJlZml4fS8ke2Nsb25lLmlkfWA7XG4gICAgaWYgKGNsb25lLnN1YmZsb3dJZCkgY2xvbmUuc3ViZmxvd0lkID0gYCR7cHJlZml4fS8ke2Nsb25lLnN1YmZsb3dJZH1gO1xuICAgIGlmIChjbG9uZS5uZXh0KSBjbG9uZS5uZXh0ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShjbG9uZS5uZXh0LCBwcmVmaXgpO1xuICAgIGlmIChjbG9uZS5jaGlsZHJlbikge1xuICAgICAgY2xvbmUuY2hpbGRyZW4gPSBjbG9uZS5jaGlsZHJlbi5tYXAoKGMpID0+IHRoaXMucHJlZml4Tm9kZVRyZWUoYywgcHJlZml4KSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93RGVmOiBOb25OdWxsYWJsZTxTdGFnZU5vZGVbJ3N1YmZsb3dEZWYnXT4sXG4gICAgbW91bnROb2RlSWQ/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIHRoaXMuc3ViZmxvd3MgaXMgYWx3YXlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvcjsgdGhlIG51bGwgZ3VhcmQgYmVsb3cgaXMgdW5yZWFjaGFibGUuXG4gICAgY29uc3Qgc3ViZmxvd3NEaWN0ID0gdGhpcy5zdWJmbG93cztcblxuICAgIC8vIEZpcnN0LXdyaXRlLXdpbnNcbiAgICBjb25zdCBpc05ld1JlZ2lzdHJhdGlvbiA9ICFzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXTtcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24gJiYgc3ViZmxvd0RlZi5yb290KSB7XG4gICAgICBzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXSA9IHtcbiAgICAgICAgcm9vdDogc3ViZmxvd0RlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgICAgICAuLi4oc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgPyB7IGJ1aWxkVGltZVN0cnVjdHVyZTogc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXMgKHBhcmVudCBlbnRyaWVzIHByZXNlcnZlZClcbiAgICBpZiAoc3ViZmxvd0RlZi5zdGFnZU1hcCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgQXJyYXkuZnJvbShzdWJmbG93RGVmLnN0YWdlTWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoa2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgaWYgKHN1YmZsb3dEZWYuc3ViZmxvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93RGVmLnN1YmZsb3dzKSkge1xuICAgICAgICBpZiAoIXN1YmZsb3dzRGljdFtrZXldKSB7XG4gICAgICAgICAgc3ViZmxvd3NEaWN0W2tleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vdW50Tm9kZUlkKSB7XG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG1vdW50Tm9kZUlkLFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTm90aWZ5IEZsb3dSZWNvcmRlcnMgb25seSBvbiBmaXJzdCByZWdpc3RyYXRpb24gKG1hdGNoZXMgZmlyc3Qtd3JpdGUtd2lucylcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24pIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUgfHwgc3ViZmxvd0lkO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93UmVnaXN0ZXJlZChcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5kZXNjcmlwdGlvbixcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
1279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFOUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRS9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFakUs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QUM7WUFDdEIsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksU0FBUyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FDekMsU0FBUyxFQUNULFdBQVcsRUFDWCxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFDNUIsVUFBVSxDQUFDLGtCQUFrQixDQUM5QixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3djaGFydFRyYXZlcnNlciDigJQgUHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwgb2YgU3RhZ2VOb2RlIGdyYXBoLlxuICpcbiAqIFVuaWZpZWQgdHJhdmVyc2FsIGFsZ29yaXRobSBmb3IgYWxsIG5vZGUgc2hhcGVzLiBgZXhlY3V0ZU5vZGVgIGlzIGFcbiAqIFRSQU1QT0xJTkUgZHJpdmVyOiBpdCBydW5zIGBleGVjdXRlTm9kZVN0ZXBgIChvbmUgbm9kZSwgYWxsIDcgcGhhc2VzKSBpblxuICogYSBmbGF0IGxvb3AsIGZvbGxvd2luZyB0YWlsIGNvbnRpbnVhdGlvbnMgKGxpbmVhciBgbmV4dGAsIGxvb3AgZWRnZXMsXG4gKiBkeW5hbWljIG5leHQsIGZsYXQgZGVjaWRlciBkaXNwYXRjaCkgaXRlcmF0aXZlbHkg4oCUIHNvIGNoYWluIGxlbmd0aCBhbmRcbiAqIGxvb3AgaXRlcmF0aW9ucyBuZXZlciBncm93IHRoZSBjYWxsIHN0YWNrLiBPbmx5IHRydWUgdHJlZSBuZXN0aW5nIChmb3JrXG4gKiBjaGlsZHJlbiwgd2l0aC1jb250aW51YXRpb24gZGVjaWRlci9zZWxlY3RvciBicmFuY2hlcywgc3ViZmxvdyBtb3VudHMpXG4gKiByZWN1cnNlcy5cbiAqXG4gKiBGb3IgZWFjaCBub2RlLCBleGVjdXRlTm9kZVN0ZXAgZm9sbG93cyA3IHBoYXNlczpcbiAqICAgMC4gQ0xBU1NJRlkgIOKAlCBzdWJmbG93IGRldGVjdGlvbiwgZWFybHkgZGVsZWdhdGlvblxuICogICAwYi4gUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCAoYnJhbmNoZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBheWxvYWQpXG4gKiAgIDEuIFZBTElEQVRFICDigJQgbm9kZSBpbnZhcmlhbnRzLCByb2xlIG1hcmtlcnNcbiAqICAgMi4gRVhFQ1VURSAgIOKAlCBydW4gc3RhZ2UgZm4sIGNvbW1pdCwgYnJlYWsgY2hlY2tcbiAqICAgMy4gRFlOQU1JQyAgIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiwgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvbiwgc3RydWN0dXJlIHVwZGF0ZXNcbiAqICAgNC4gQ0hJTERSRU4gIOKAlCBmb3JrL3NlbGVjdG9yL2RlY2lkZXIgZGlzcGF0Y2hcbiAqICAgNS4gQ09OVElOVUUgIOKAlCBkeW5hbWljIG5leHQgLyBsaW5lYXIgbmV4dCByZXNvbHV0aW9uXG4gKiAgIDYuIExFQUYgICAgICDigJQgbm8gY29udGludWF0aW9uLCByZXR1cm4gb3V0cHV0XG4gKlxuICogQnJlYWsgc2VtYW50aWNzOiBJZiBhIHN0YWdlIGNhbGxzIGJyZWFrRm4oKSwgY29tbWl0IGFuZCBTVE9QLlxuICogUGF0Y2ggbW9kZWw6IFN0YWdlIHdyaXRlcyBpbnRvIGxvY2FsIHBhdGNoOyBjb21taXRQYXRjaCgpIGFmdGVyIHJldHVybiBvciB0aHJvdy5cbiAqL1xuXG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkLCBqb2luUGF0aCwgcmVmdXNlUmVzZXJ2ZWRJZCB9IGZyb20gJy4uLy4uL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uLy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbyB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgcHJlZml4Tm9kZVRyZWUgfSBmcm9tICcuLi9ncmFwaC9wcmVmaXhOb2RlVHJlZS5qcyc7XG5pbXBvcnQgeyBpc1N0YWdlTm9kZVJldHVybiB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBDb250aW51YXRpb25SZXNvbHZlciB9IGZyb20gJy4uL2hhbmRsZXJzL0NvbnRpbnVhdGlvblJlc29sdmVyLmpzJztcbmltcG9ydCB7IERlY2lkZXJIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvRGVjaWRlckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvTm9kZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9QYXJhbGxlbEZvckVhY2hIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVkUGF1c2UgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBxdWV1ZUJlaGluZCwgcmFpc2VRdWV1ZWRQYXVzZSwgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBSdW50aW1lU3RydWN0dXJlTWFuYWdlciB9IGZyb20gJy4uL2hhbmRsZXJzL1J1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlbGVjdG9ySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1NlbGVjdG9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL1N0YWdlUnVubmVyLmpzJztcbmltcG9ydCB7IFN1YmZsb3dFeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4uL2hhbmRsZXJzL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyByb290VHJhdmVyc2FsQ29udGV4dCwgdHJhdmVyc2FsQ29udGV4dEZvciB9IGZyb20gJy4uL3RyYXZlcnNhbENvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlbGVjdG9yLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZXJPcHRpb25zPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIGdyYXBoIHRoaXMgdHJhdmVyc2VyIHdhbGtzIOKAlCBhbmQgdGhlIGdyYXBoIGV2ZXJ5IGlkIHJlc29sdmVzIGFnYWluc3RcbiAgICogKHRoZSBub2RlIG1hcCBiZWhpbmQgZXZlcnkgYGxvb3BUb2AsIHRoZSBERlMgZmFsbGJhY2spLiBgZXhlY3V0ZSgpYFxuICAgKiBzdGFydHMgaGVyZSB1bmxlc3MgYGVudHJ5YCBzYXlzIG90aGVyd2lzZS5cbiAgICovXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogV2hlcmUgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgYSByZXN1bWUncyBvbmUtc2hvdFxuICAgKiByZS1lbnRyeSAoTTIpOiB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3RcbiAgICogc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aCwgZWFjaCB3aXRoIGl0cyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uXG4gICAqIGF0dGFjaGVkLiBWaXNpdGVkIG9uY2UsIGZpcnN0LCBhbmQgbmV2ZXIgcmVnaXN0ZXJlZCBhbnl3aGVyZSBhbiBpZCBjYW5cbiAgICogcmVhY2ggaXQsIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgc3RhZ2UgZmluZHMgdGhlIFJFQUwgc3RhZ2UuXG4gICAqIENvbnN1bWVkIGJ5IHRoZSBmaXJzdCBgZXhlY3V0ZSgpYC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYXQgdGhpcyBsZXZlbCAoYSByZXN1bWUsIDkuMjguMCk6IG9uY2VcbiAgICogYGVudHJ5YCdzIGNoYWluIGVuZHMsIGBleGVjdXRlKClgIHJhaXNlcyB0aGUgZmlyc3QgYWdhaW4gKHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KTsgYSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluIGNhcnJpZXMgdGhlbSBhbGwuIE9ubHlcbiAgICogd2l0aCBgZW50cnlgOyBjb25zdW1lZCBieSB0aGUgZmlyc3QgYGV4ZWN1dGUoKWAuIFNlZSBgUmVzdW1lRW50cnlgLlxuICAgKi9cbiAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcy5qcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoICh0cmVlIG5lc3Rpbmcg4oCUIGJyYW5jaC9mb3JrIGRpc3BhdGNoIGFuZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbiwgTk9UIGxpbmVhciBjaGFpbnMgb3IgbG9vcCBpdGVyYXRpb25zLCB3aGljaCBydW4gZmxhdCkuXG4gICAqIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgcGVyIG5vZGUgKHRoZSBDb250aW51YXRpb25SZXNvbHZlciBndWFyZCkuXG4gICAqIERlZmF1bHRzIHRvIERFRkFVTFRfTUFYX0lURVJBVElPTlMgKDEwMDApLiBQcm9wYWdhdGVkIHRvIHN1YmZsb3dcbiAgICogdHJhdmVyc2Vycy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCBzZXQgdGhpcyB0byB0aGUgc3ViZmxvdydzIElELlxuICAgKiBQcm9wYWdhdGVkIHRvIFRyYXZlcnNhbENvbnRleHQgc28gbmFycmF0aXZlIGVudHJpZXMgY2FycnkgdGhlIGNvcnJlY3Qgc3ViZmxvd0lkLlxuICAgKi9cbiAgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGVcbiAgICogc3ViZmxvdyBNT1VOVCBzdGFnZSBpbiB0aGUgcGFyZW50IHRyYXZlcnNlci4gVXNlZCBhcyB0aGVcbiAgICogYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmYWxsYmFjayBmb3Igc3RhZ2VzIHdob3NlIFN0YWdlQ29udGV4dCBoYXMgbm9cbiAgICogcGFyZW50ICh0aGUgc3ViZmxvdydzIG93biByb290IGNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCBieVxuICAgKiBTdWJmbG93RXhlY3V0b3IpIHNvIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllc1xuICAgKiAoUkZDLTAwMyBEMSkuXG4gICAqL1xuICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGZyb20gcGFyZW50IHRyYXZlcnNlci4gU3ViZmxvd3MgY29udGludWUgdGhlIHBhcmVudCdzIG51bWJlcmluZy4gKi9cbiAgZXhlY3V0aW9uQ291bnRlcj86IHsgdmFsdWU6IG51bWJlciB9O1xuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQtY291bnQgbWFwIChrZXllZCBieSBzdGFnZUlkKSBmcm9tIHRoZSBwYXJlbnQgdHJhdmVyc2VyLlxuICAgKiBEcml2ZXMgYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAuIFNoYXJlZCB3aXRoIHN1YmZsb3dzIHNvIGEgc3RhZ2VcbiAgICogcmUtZW50ZXJlZCBhY3Jvc3MgYSBzdWJmbG93IHJlLW1vdW50IGtlZXBzIGEgY29ycmVjdCwgbW9ub3RvbmljIGl0ZXJhdGlvblxuICAgKiBjb3VudCDigJQgdGhlIHNhbWUgc2luZ2xlLW1hcCBzZW1hbnRpY3MgdGhlIG5hcnJhdGl2ZSByZWNvcmRlciB1c2VzLlxuICAgKi9cbiAgdmlzaXRDb3VudHM/OiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChNMiksIHNoYXJlZCBieSByZWZlcmVuY2Ugd2l0aCBldmVyeVxuICAgKiBuZXN0ZWQgdHJhdmVyc2VyICh0aGUgZXhlY3V0aW9uIGNvdW50ZXIncyBwcmVjZWRlbnQpOiBlYWNoIHN1YmZsb3cgb24gdGhlXG4gICAqIHBhdXNlIHBhdGggdGFrZXMgaXRzIGNhcHR1cmVkIHN0YXRlIGFuZCBpdHMgZW50cnkgcG9pbnQgZXhhY3RseSBvbmNlLCBvblxuICAgKiBpdHMgZmlyc3QgZW50cnkuIFNlZSBgUmVzdW1lRW50cnlgLiBVbmRlZmluZWQgb24gbm9ybWFsIGBydW4oKWAgcGF0aHMuXG4gICAqL1xuICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS4yOC4wIOKAlCBwYXNzIHtAbGluayByZXN1bWV9LiBTdGlsbCBob25vdXJlZCwgdW5kZXIgdGhlXG4gICAqIHNhbWUgb25lLXNob3QgbGF3OiBlYWNoIGNhcHR1cmUgc2VlZHMgb25seSB0aGUgRklSU1QgZW50cnkgaW50byBpdHNcbiAgICogc3ViZmxvdyAoaW4gcGxhY2Ugb2YgdGhlIGlucHV0TWFwcGVyJ3MgdmFsdWVzKTsgbGF0ZXIgZW50cmllcyBhcmVcbiAgICogb3JkaW5hcnkuIElnbm9yZWQgd2hlbiBgcmVzdW1lYCBpcyBzZXQuXG4gICAqL1xuICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKipcbiAgICogUGVyLWBleGVjdXRvci5ydW4oKWAgaWRlbnRpZmllci4gVGhyZWFkZWQgaW50byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0XG4gICAqIHRoaXMgdHJhdmVyc2VyIHByb2R1Y2VzIHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGUgcnVuLlxuICAgKiBTdWJmbG93IHRyYXZlcnNlcnMgaW5oZXJpdCB0aGUgcGFyZW50J3MgcnVuSWQgKHRoZSBzdWJmbG93IGlzIHBhcnQgb2ZcbiAgICogdGhlIHNhbWUgcnVuIGZyb20gdGhlIGNvbnN1bWVyJ3MgUE9WKS4gUmVxdWlyZWQgZmllbGQg4oCUIGV2ZXJ5IGV2ZW50XG4gICAqIG5lZWRzIGl0LiBTZWUgYHJ1bm5lci9ydW5JZC50c2AuXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYXZlcnNlci1sb2NhbCBvdmVybGF5IGVudHJ5IGZvciBhIG5vZGUgd2hvc2Ugc3RhZ2UgZnVuY3Rpb24gcmV0dXJuZWQgYVxuICogU3RhZ2VOb2RlIChkeW5hbWljIGNvbnRpbnVhdGlvbikuIEhvbGRzIHRoZSBkeW5hbWljIHZhbHVlcyB0aGF0IGVhcmxpZXJcbiAqIHZlcnNpb25zIHdyb3RlIERJUkVDVExZIG9udG8gdGhlIHNoYXJlZCBidWlsdC1jaGFydCBub2RlIOKAlCB3aGljaCBsZWFrZWQgdGhlXG4gKiBkeW5hbWljIHNoYXBlIGludG8gZXZlcnkgbGF0ZXIgcnVuIG9mIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFuZCByYWNlZFxuICogY29uY3VycmVudCBleGVjdXRvcnMuIFRoZSBvdmVybGF5IGtlZXBzIHRoZSBidWlsdCBncmFwaCBpbW11dGFibGU6IHBhdGNoZXNcbiAqIGxpdmUgaW4gYSBwZXItdHJhdmVyc2VyIE1hcCBrZXllZCBieSBgbm9kZS5pZGAgYW5kIGRpZSB3aXRoIHRoZSBydW4uXG4gKlxuICogYG5leHRgIGlzIGludGVudGlvbmFsbHkgQUJTRU5UOiBhIGR5bmFtaWMgYG5leHRgIG9ubHkgZXZlciBhcHBsaWVzIHRvIHRoZVxuICogdmlzaXQgdGhhdCBwcm9kdWNlZCBpdCAodGhlIG9sZCBjb2RlIHdyb3RlIGBub2RlLm5leHRgIGFuZCByZXN0b3JlZCBpdFxuICogYmVmb3JlIGFueXRoaW5nIGNvdWxkIG9ic2VydmUgdGhlIHdyaXRlKSwgc28gaXQgc3RheXMgYSBsb2NhbCB2YXJpYWJsZSBpblxuICogYGV4ZWN1dGVOb2RlYCBhbmQgaXMgcm91dGVkIHRocm91Z2ggYENvbnRpbnVhdGlvblJlc29sdmVyYCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljTm9kZVBhdGNoPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogU3ViZmxvdyBtb3VudCBtZXRhZGF0YSBmcm9tIGEgZHluYW1pYy1zdWJmbG93IHJldHVybi4gR3JvdXBlZCBzbyB0aGVcbiAgICogbWVyZ2VkIHZpZXcgcmVwcm9kdWNlcyB0aGUgb2xkIGZpZWxkLXdpc2Ugb3ZlcndyaXRlIGV4YWN0bHkg4oCUIGluY2x1ZGluZ1xuICAgKiBgc3ViZmxvd05hbWVgL2BzdWJmbG93TW91bnRPcHRpb25zYCBiZWNvbWluZyB1bmRlZmluZWQgd2hlbiB0aGUgZHluYW1pY1xuICAgKiByZXR1cm4gb21pdHRlZCB0aGVtLlxuICAgKi9cbiAgc3ViZmxvd01ldGE/OiB7XG4gICAgaXNTdWJmbG93Um9vdDogdHJ1ZTtcbiAgICBzdWJmbG93SWQ6IHN0cmluZztcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBEeW5hbWljIGZvcmsgY2hpbGRyZW4gKHJlcGxhY2VzIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4gZm9yIHRoaXMgcnVuKS4gKi9cbiAgY2hpbGRyZW4/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAvKiogRHluYW1pYyBvdXRwdXQtYmFzZWQgc2VsZWN0b3IgYWNjb21wYW55aW5nIGR5bmFtaWMgY2hpbGRyZW4uICovXG4gIG5leHROb2RlU2VsZWN0b3I/OiBTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBUcmFtcG9saW5lIGJyYW5kIOKAlCBtYXJrcyBhIGNvbnRpbnVhdGlvbiBob3AgcmV0dXJuZWQgYnkgYGV4ZWN1dGVOb2RlU3RlcGBcbiAqIHRvIHRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgLiBNb2R1bGUtcHJpdmF0ZSBzeW1ib2wgc28gYSBzdGFnZSdzIG93blxuICogcmV0dXJuIHZhbHVlICh3aGljaCBjYW4gYmUgYW55IG9iamVjdCkgY2FuIG5ldmVyIGJlIG1pc3Rha2VuIGZvciBhIGhvcC5cbiAqL1xuY29uc3QgQ09OVElOVUVfSE9QOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdmb290cHJpbnRqcy5leGVjdXRlTm9kZS5jb250aW51ZScpO1xuXG4vKipcbiAqIEEgZmxhdCBjb250aW51YXRpb24g4oCUIFwiZXhlY3V0ZSB0aGlzIG5vZGUgbmV4dCwgaW4gdGhpcyBjb250ZXh0XCIg4oCUIHJldHVybmVkXG4gKiBieSBgZXhlY3V0ZU5vZGVTdGVwYCBmb3IgZXZlcnkgVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3BcbiAqIGVkZ2VzLCBkeW5hbWljIG5leHQsIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXJcbiAqIGRpc3BhdGNoKS4gVGhlIGRyaXZlciBsb29wIGluIGBleGVjdXRlTm9kZWAgY29uc3VtZXMgaG9wcyBpdGVyYXRpdmVseTpcbiAqIGBjdXJyZW50ID0gaG9wOyBjb250aW51ZTtgIOKAlCBzbyBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrIG5vciB0aGUgcmV0YWluZWRcbiAqIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBpdGVyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgQ29udGludWF0aW9uSG9wPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByZWFkb25seSBbQ09OVElOVUVfSE9QXTogdHJ1ZTtcbiAgcmVhZG9ubHkgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHJlYWRvbmx5IGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcmVhZG9ubHkgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogUHJlc2VudCB3aGVuIHRoZSBob3AgaXMgYSBkZWNpZGVyJ3MgYnJhbmNoIGRpc3BhdGNoIChkZWNpZGVyIHdpdGhvdXQgaXRzXG4gICAqIG93biBgbmV4dGApLiBUaGUgZHJpdmVyIHJlY29yZHMgaXQgc28gYSBQYXVzZVNpZ25hbCB0aHJvd24gYW55d2hlcmUgaW5cbiAgICogdGhlIGNvbnRpbnVlZCBjaGFpbiBzdGlsbCBnZXRzIHRoZSBkZWNpZGVyIHN0YW1wZWQgYXMgaXRzIGludm9rZXIg4oCUXG4gICAqIGV4YWN0bHkgd2hhdCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0byBkby5cbiAgICovXG4gIHJlYWRvbmx5IGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcDtcbn1cblxuLyoqIFBhdXNlLWludm9rZXIgY29udGV4dCByZWNvcmRlZCBieSB0aGUgZHJpdmVyIGZvciBmbGF0IGRlY2lkZXIgZGlzcGF0Y2hlcy4gKi9cbmludGVyZmFjZSBJbnZva2VyU3RhbXAge1xuICByZWFkb25seSBpbnZva2VyU3RhZ2VJZDogc3RyaW5nO1xuICByZWFkb25seSBjb250aW51YXRpb25TdGFnZUlkPzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW0NPTlRJTlVFX0hPUF0gPT09IHRydWU7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHtAbGluayBSZXRyeVBvbGljeX0ncyBgYmFja29mZk1zYCBmb3IgdGhlIGF0dGVtcHQgdGhhdCBqdXN0IGZhaWxlZFxuICogKDEtYmFzZWQpLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBhIGZpbml0ZSwgcG9zaXRpdmUgbnVtYmVyIOKAlCBhIG1pc3NpbmcgZGlhbCwgYVxuICogbmVnYXRpdmUgdmFsdWUsIGEgYE5hTmAgZnJvbSBhIGNvbnN1bWVyJ3MgYXJpdGhtZXRpYywgb3IgYSB0aHJvd2luZyBmdW5jdGlvblxuICog4oCUIGJlY29tZXMgYDBgLCBpLmUuIHJldHJ5IGltbWVkaWF0ZWx5LiBBIGJhY2tvZmYgZGlhbCBtdXN0IG5ldmVyIGJlIGFibGUgdG9cbiAqIGNyYXNoIGEgcnVuIG9yIHBhcmsgaXQgZm9yZXZlci5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUJhY2tvZmZNcyhiYWNrb2ZmTXM6IG51bWJlciB8ICgoYXR0ZW1wdDogbnVtYmVyKSA9PiBudW1iZXIpIHwgdW5kZWZpbmVkLCBhdHRlbXB0OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoYmFja29mZk1zID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBsZXQgdmFsdWU6IHVua25vd247XG4gIGlmICh0eXBlb2YgYmFja29mZk1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gYmFja29mZk1zKGF0dGVtcHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gYmFja29mZk1zO1xuICB9XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPiAwID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIEF3YWl0IGBtc2AsIGN1dCBzaG9ydCBieSBhbiBhYm9ydC4gUmVzb2x2ZXMgZWl0aGVyIHdheSDigJQgdGhlIGNhbGxlciByZS1jaGVja3NcbiAqIGBzaWduYWwuYWJvcnRlZGAgYW5kIHJldGhyb3dzIHRoZSBvcmlnaW5hbCBzdGFnZSBlcnJvciwgc28gYSBjYW5jZWxsZWQgcnVuXG4gKiBuZXZlciBzaXRzIG91dCBhIGxvbmcgYmFja29mZiBhbmQgbmV2ZXIgbG9zZXMgdGhlIGZhaWx1cmUgdGhhdCBjYXVzZWQgaXQuXG4gKiBUaGUgdGltZXIgYW5kIHRoZSBsaXN0ZW5lciBhcmUgYWx3YXlzIGNsZWFuZWQgdXAuXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZG9uZSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoZG9uZSwgbXMpO1xuICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBkb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKiogV2hlcmUgdGhlIG5leHQgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgb25lLXNob3QgKHNlZSBUcmF2ZXJzZXJPcHRpb25zLmVudHJ5KS4gKi9cbiAgcHJpdmF0ZSBlbnRyeTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIC8qKiBTaWJsaW5ncycgcGF1c2VzIHJhaXNlZCBvbmNlIGBlbnRyeWAncyBjaGFpbiBlbmRzIOKAlCBvbmUtc2hvdCAoc2VlIFRyYXZlcnNlck9wdGlvbnMucGVuZGluZ1BhdXNlcykuICovXG4gIHByaXZhdGUgZW50cnlQZW5kaW5nUGF1c2VzOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5LCBzaGFyZWQgd2l0aCBuZXN0ZWQgdHJhdmVyc2Vycy4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsIHJ1bi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXN1bWU6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIHByaXZhdGUgc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBJTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudFN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIFJGQy0wMDMgRDE6IHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBzdWJmbG93IG1vdW50IHN0YWdlIGluIHRoZSBwYXJlbnRcbiAgICogIHRyYXZlcnNlci4gRmFsbGJhY2sgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmb3Igc3RhZ2VzIHdob3NlIGNvbnRleHQgaGFzXG4gICAqICBubyBwYXJlbnQgKHRoZSBzdWJmbG93IHJvb3QpLiBVbmRlZmluZWQgYXQgdGhlIHRvcCBsZXZlbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogRnJvemVuIHZhbHVlIHBhc3NlZCB2aWEgYHJ1bih7aW5wdXR9KWAuIFN1cmZhY2VkIG9uIGBvblJ1blN0YXJ0YCBhdCB0aGVcbiAgICogIHRvcC1sZXZlbCB0cmF2ZXJzYWwgc28gY29uc3VtZXJzIChlLmcuIGBJbk91dFJlY29yZGVyYCkgY2FuIGJyYWNrZXRcbiAgICogIHRoZSBydW4gd2l0aCB0aGUgc2FtZSBwYXlsb2FkIHNoYXBlIHRoYXQgc3ViZmxvd3MgYWxyZWFkeSBoYXZlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBQZXItYGV4ZWN1dG9yLnJ1bigpYCBpZGVudGlmaWVyLiBTdGFtcGVkIG9udG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC5cbiAgICogIEluaGVyaXRlZCBieSBzdWJmbG93IHRyYXZlcnNlcnMgc28gYWxsIGV2ZW50cyBvZiBvbmUgcnVuIHNoYXJlIG9uZSBydW5JZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW5JZDogc3RyaW5nO1xuXG4gIC8vIEhhbmRsZXIgbW9kdWxlc1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVSZXNvbHZlcjogTm9kZVJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dFeGVjdXRvcjogU3ViZmxvd0V4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VSdW5uZXI6IFN0YWdlUnVubmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGludWF0aW9uUmVzb2x2ZXI6IENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaWRlckhhbmRsZXI6IERlY2lkZXJIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JIYW5kbGVyOiBTZWxlY3RvckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJhbGxlbEZvckVhY2hIYW5kbGVyOiBQYXJhbGxlbEZvckVhY2hIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RydWN0dXJlTWFuYWdlcjogUnVudGltZVN0cnVjdHVyZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmFycmF0aXZlR2VuZXJhdG9yOiBJQ29udHJvbEZsb3dOYXJyYXRpdmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB8IHVuZGVmaW5lZDtcblxuICAvLyBFeGVjdXRpb24gc3RhdGVcbiAgcHJpdmF0ZSBzdWJmbG93UmVzdWx0czogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFBlci10cmF2ZXJzZXIgc2V0IG9mIGxhenkgc3ViZmxvdyBJRHMgdGhhdCBoYXZlIGJlZW4gcmVzb2x2ZWQgYnkgVEhJUyBydW4uXG4gICAqIFVzZWQgaW5zdGVhZCBvZiB3cml0aW5nIGBub2RlLnN1YmZsb3dSZXNvbHZlciA9IHVuZGVmaW5lZGAgYmFjayB0byB0aGUgc2hhcmVkXG4gICAqIFN0YWdlTm9kZSBncmFwaCDigJQgYXZvaWRzIGEgcmFjZSB3aGVyZSBhIGNvbmN1cnJlbnQgdHJhdmVyc2VyIGNsZWFycyB0aGUgc2hhcmVkXG4gICAqIHJlc29sdmVyIGJlZm9yZSBhbm90aGVyIHRyYXZlcnNlciBoYXMgZmluaXNoZWQgdXNpbmcgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkTGF6eVN1YmZsb3dzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFBlci10cmF2ZXJzZXIgb3ZlcmxheSBvZiBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm5zLCBrZXllZCBieSBgbm9kZS5pZGAuXG4gICAqIFBoYXNlIDQgd3JpdGVzIHBhdGNoZXMgSEVSRSBpbnN0ZWFkIG9mIG11dGF0aW5nIHRoZSBzaGFyZWQgYnVpbHQtY2hhcnRcbiAgICogbm9kZSBvYmplY3RzIChzYW1lIGlzb2xhdGlvbiBjb252ZW50aW9uIGFzIGByZXNvbHZlZExhenlTdWJmbG93c2ApLlxuICAgKiBBbGwgZW5naW5lIHJlYWRzIG9mIHRoZSBwYXRjaGVkIGZpZWxkcyBnbyB0aHJvdWdoIHRoZSBgZWZmKmAgYWNjZXNzb3JzXG4gICAqIGJlbG93LiBUaGUgbWFwIGRpZXMgd2l0aCB0aGUgdHJhdmVyc2VyIOKAlCBvbmUgcnVuLCBvbmUgb3ZlcmxheSDigJQgc28gYVxuICAgKiBmcmVzaCBleGVjdXRvciBvdmVyIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFsd2F5cyBzZWVzIHRoZSBvcmlnaW5hbCBncmFwaC5cbiAgICpcbiAgICogS2V5ZWQgYnkgdGhlIG5vZGUgT0JKRUNUIChXZWFrTWFwKSwgbm90IGBub2RlLmlkYDogYSBkeW5hbWljIGNoaWxkIHRoYXRcbiAgICogcmV1c2VzIGEgYnVpbHQgbm9kZSdzIGlkIG11c3QgTk9UIG1ha2UgdGhlIGJ1aWx0IG5vZGUgaW5oZXJpdCB0aGUgcGF0Y2hcbiAgICogKGlkLWtleWVkIGxvb2t1cCBjYXVzZWQgcGhhbnRvbSBkb3VibGUtZXhlY3V0aW9uKS4gYHBhdGNoQ291bnRgIGlzIHRoZVxuICAgKiBmYXN0LXBhdGggY2hlY2sg4oCUIFdlYWtNYXAgaGFzIG5vIGBzaXplYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY1BhdGNoZXMgPSBuZXcgV2Vha01hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+PigpO1xuICBwcml2YXRlIHBhdGNoQ291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiBUUkVFLW5lc3RpbmcgZGVwdGggY291bnRlciBmb3IgZXhlY3V0ZU5vZGUgKHRoZSB0cmFtcG9saW5lIGRyaXZlcikuXG4gICAqIEVhY2ggZHJpdmVyIGludm9jYXRpb24gaW5jcmVtZW50cyB0aGlzOyBkZWNyZW1lbnRzIG9uIGV4aXQgKHRyeS9maW5hbGx5KS5cbiAgICpcbiAgICogTGluZWFyIGBuZXh0YCBjaGFpbnMsIGxvb3AgZWRnZXMsIGFuZCBkeW5hbWljIGNvbnRpbnVhdGlvbnMgYXJlIGZvbGxvd2VkXG4gICAqIElURVJBVElWRUxZIGluc2lkZSBvbmUgZHJpdmVyIGludm9jYXRpb24sIHNvIHRoZXkgbmV2ZXIgZ3JvdyB0aGlzXG4gICAqIGNvdW50ZXIuIE9ubHkgdHJ1ZSB0cmVlIHJlY3Vyc2lvbiBkb2VzOiBmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yXG4gICAqIGJyYW5jaCBkaXNwYXRjaCAod2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBjb250aW51YXRpb24pLCBhbmRcbiAgICogdW5ib3VuZGVkIGR5bmFtaWMgcmVjdXJzaW9uLiBQcmV2ZW50cyBjYWxsLXN0YWNrIG92ZXJmbG93IG9uIHJ1bmF3YXlcbiAgICogcmVjdXJzaXZlIGNvbXBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfZXhlY3V0ZURlcHRoID0gMDtcblxuICAvKipcbiAgICogU2hhcmVkIG11dGFibGUgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIG1vbm90b25pYywgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGluZGljZXMgYXJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gYSBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQgY291bnRzIGtleWVkIGJ5IHN0YWdlSWQg4oCUIGhvdyBtYW55IHRpbWVzIGVhY2ggc3RhZ2VcbiAgICogaGFzIGV4ZWN1dGVkIGluIHRoaXMgcnVuLiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gYVxuICAgKiBsb29wZWQtYmFjayBzdGFnZSdzIGl0ZXJhdGlvbiBjb3VudCBpcyBtb25vdG9uaWMgYWNyb3NzIHN1YmZsb3cgcmUtbW91bnRzLFxuICAgKiBtYXRjaGluZyB0aGUgbmFycmF0aXZlIHJlY29yZGVyJ3Mgc2luZ2xlLW1hcCBzZW1hbnRpY3MuIERyaXZlc1xuICAgKiBgVHJhdmVyc2FsQ29udGV4dC5sb29wSXRlcmF0aW9uYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Zpc2l0Q291bnRzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbWF4aW11bSBkZXB0aCAoc2V0IGZyb20gVHJhdmVyc2VyT3B0aW9ucy5tYXhEZXB0aCBvciB0aGUgY2xhc3MgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhEZXB0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbG9vcC1pdGVyYXRpb24gbGltaXQgZm9yd2FyZGVkIHRvIHRoZSBDb250aW51YXRpb25SZXNvbHZlclxuICAgKiBhbmQgcHJvcGFnYXRlZCB0byBzdWJmbG93IHRyYXZlcnNlcnMuIFVuZGVmaW5lZCDihpIgcmVzb2x2ZXIgZGVmYXVsdCAoMTAwMCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoIGJlZm9yZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqXG4gICAqICoqV2hhdCBjb3VudHMgYXMgZGVwdGggKHRyYW1wb2xpbmUgbW9kZWwpOioqIGBleGVjdXRlTm9kZWAgaXMgYW4gaXRlcmF0aXZlXG4gICAqIGRyaXZlciDigJQgbGluZWFyIGBuZXh0YCBob3BzLCBsb29wIGVkZ2VzIChgbG9vcFRvYC9keW5hbWljIG5leHQpLCBhbmRcbiAgICogZHluYW1pYy1zdWJmbG93IHJlLWVudHJ5IGFyZSBmb2xsb3dlZCBpbiBhIGZsYXQgbG9vcCBhbmQgY29uc3VtZSBOTyBkZXB0aC5cbiAgICogRGVwdGggZ3Jvd3Mgb25seSB3aXRoIHRydWUgdHJlZSBuZXN0aW5nOiBvbmUgdGljayBwZXIgZm9yayBjaGlsZCwgb25lIHBlclxuICAgKiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaCBkaXNwYXRjaCB0aGF0IG11c3QgcmV0dXJuIHRvIGl0cyBpbnZva2VyIChkZWNpZGVyXG4gICAqIHdpdGggaXRzIG93biBgbmV4dGApLCBvbmUgcGVyIHN1YmZsb3cgbW91bnQgZnJhbWUgaW4gdGhlIHBhcmVudCAodGhlXG4gICAqIHN1YmZsb3cgYm9keSBpdHNlbGYgcnVucyBvbiBhIEZSRVNIIHRyYXZlcnNlciB3aXRoIGl0cyBvd24gYnVkZ2V0KS5cbiAgICpcbiAgICogNTAwIHRoZXJlZm9yZSBjb3ZlcnMgYW55IHJlYWxpc3RpYyBjaGFydCDigJQgaXQgYm91bmRzIHJlY3Vyc2l2ZVxuICAgKiBDT01QT1NJVElPTiwgbm90IGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LiBMb29wcyBhcmUgYm91bmRlZCBieVxuICAgKiBgQ29udGludWF0aW9uUmVzb2x2ZXJgJ3MgaW5kZXBlbmRlbnQgaXRlcmF0aW9uIGxpbWl0IChkZWZhdWx0IDEwMDAsXG4gICAqIGNvbmZpZ3VyYWJsZSB2aWEgYFJ1bk9wdGlvbnMubWF4SXRlcmF0aW9uc2ApLCB3aGljaCBpcyBub3cgdGhlIGJpbmRpbmdcbiAgICogY29uc3RyYWludCBmb3IgbG9vcC1oZWF2eSBwaXBlbGluZXMuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCBzYWZlIGZvciBjb25jdXJyZW50IGAuZXhlY3V0ZSgpYCBjYWxscyBvbiB0aGUgc2FtZSBpbnN0YW5jZSDigJQgY29uY3VycmVudFxuICAgKiBleGVjdXRpb25zIHJhY2Ugb24gYF9leGVjdXRlRGVwdGhgLiBVc2UgYSBzZXBhcmF0ZSBgRmxvd2NoYXJ0VHJhdmVyc2VyYCBwZXIgY29uY3VycmVudFxuICAgKiBleGVjdXRpb24uIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgYWx3YXlzIGNyZWF0ZXMgYSBmcmVzaCB0cmF2ZXJzZXIgcGVyIGNhbGwuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0VYRUNVVEVfREVQVEggPSA1MDA7XG5cbiAgY29uc3RydWN0b3Iob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KSB7XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRzLm1heERlcHRoID8/IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSDtcbiAgICBpZiAobWF4RGVwdGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4RGVwdGggbXVzdCBiZSA+PSAxJyk7XG4gICAgdGhpcy5fbWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICBpZiAob3B0cy5tYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0cy5tYXhJdGVyYXRpb25zIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heEl0ZXJhdGlvbnMgbXVzdCBiZSA+PSAxJyk7XG4gICAgfVxuICAgIHRoaXMuX21heEl0ZXJhdGlvbnMgPSBvcHRzLm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IG9wdHMuZXhlY3V0aW9uQ291bnRlciA/PyB7IHZhbHVlOiAwIH07XG4gICAgdGhpcy5fdmlzaXRDb3VudHMgPSBvcHRzLnZpc2l0Q291bnRzID8/IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgdGhpcy5lbnRyeSA9IG9wdHMuZW50cnk7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSBvcHRzLmVudHJ5ID8gb3B0cy5wZW5kaW5nUGF1c2VzIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzdW1lID1cbiAgICAgIG9wdHMucmVzdW1lID8/XG4gICAgICAob3B0cy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lID8gUmVzdW1lRW50cnkuZnJvbUNhcHR1cmVzPFRPdXQsIFRTY29wZT4ob3B0cy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lKSA6IHVuZGVmaW5lZCk7XG4gICAgLy8gU2hhbGxvdy1jb3B5IHN0YWdlTWFwIGFuZCBzdWJmbG93cyBzbyB0aGF0IGxhenktcmVzb2x1dGlvbiBtdXRhdGlvbnNcbiAgICAvLyAocHJlZml4ZWQgZW50cmllcyBhZGRlZCBkdXJpbmcgZXhlY3V0aW9uKSBzdGF5IHNjb3BlZCB0byBUSElTIHRyYXZlcnNlclxuICAgIC8vIGFuZCBkbyBub3QgZXNjYXBlIHRvIHRoZSBzaGFyZWQgRmxvd0NoYXJ0IG9iamVjdC4gV2l0aG91dCB0aGUgY29weSxcbiAgICAvLyBjb25jdXJyZW50IEZsb3dDaGFydEV4ZWN1dG9yIHJ1bnMgc2hhcmluZyB0aGUgc2FtZSBGbG93Q2hhcnQgd291bGQgcmFjZVxuICAgIC8vIG9uIHRoZXNlIHR3byBtdXRhYmxlIGRpY3Rpb25hcmllcy5cbiAgICB0aGlzLnN0YWdlTWFwID0gbmV3IE1hcChvcHRzLnN0YWdlTWFwKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUgPSBvcHRzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgdGhpcy5zdWJmbG93cyA9IG9wdHMuc3ViZmxvd3MgPyB7IC4uLm9wdHMuc3ViZmxvd3MgfSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gb3B0cy5sb2dnZXI7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICB0aGlzLnBhcmVudFN1YmZsb3dJZCA9IG9wdHMucGFyZW50U3ViZmxvd0lkO1xuICAgIHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCA9IG9wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcbiAgICB0aGlzLnJlYWRPbmx5Q29udGV4dCA9IG9wdHMucmVhZE9ubHlDb250ZXh0O1xuICAgIHRoaXMucnVuSWQgPSBvcHRzLnJ1bklkO1xuXG4gICAgLy8gU3RydWN0dXJlIG1hbmFnZXIgKGRlZXAtY2xvbmVzIGJ1aWxkLXRpbWUgc3RydWN0dXJlKVxuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlciA9IG5ldyBSdW50aW1lU3RydWN0dXJlTWFuYWdlcigpO1xuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci5pbml0KG9wdHMuYnVpbGRUaW1lU3RydWN0dXJlKTtcblxuICAgIC8vIE5hcnJhdGl2ZSBnZW5lcmF0b3JcbiAgICAvLyBQcmlvcml0eTogZXhwbGljaXQgbmFycmF0aXZlR2VuZXJhdG9yID4gZmxvd1JlY29yZGVycyA+IGRlZmF1bHQgTmFycmF0aXZlRmxvd1JlY29yZGVyID4gbnVsbC5cbiAgICAvLyBTdWJmbG93IHRyYXZlcnNlcnMgcmVjZWl2ZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlR2VuZXJhdG9yIHNvIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2UuXG4gICAgaWYgKG9wdHMubmFycmF0aXZlR2VuZXJhdG9yKSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG9wdHMubmFycmF0aXZlR2VuZXJhdG9yO1xuICAgIH0gZWxzZSBpZiAob3B0cy5uYXJyYXRpdmVFbmFibGVkKSB7XG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gbmV3IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIoKTtcbiAgICAgIHRoaXMuZmxvd1JlY29yZGVyRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG5cbiAgICAgIC8vIElmIGN1c3RvbSBGbG93UmVjb3JkZXJzIGFyZSBwcm92aWRlZCwgdXNlIHRoZW07IG90aGVyd2lzZSBhdHRhY2ggZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXJcbiAgICAgIGlmIChvcHRzLmZsb3dSZWNvcmRlcnMgJiYgb3B0cy5mbG93UmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCByZWNvcmRlciBvZiBvcHRzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgICAgICBkaXNwYXRjaGVyLmF0dGFjaChyZWNvcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKG5ldyBOYXJyYXRpdmVGbG93UmVjb3JkZXIoKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gZGlzcGF0Y2hlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBuZXcgTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgc2hhcmVkIGRlcHMgYmFnXG4gICAgY29uc3QgZGVwcyA9IHRoaXMuY3JlYXRlRGVwcyhvcHRzKTtcblxuICAgIC8vIEJ1aWxkIE8oMSkgbm9kZSBJRCBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaCAoYXZvaWRzIHJlcGVhdGVkIERGUyBvbiBldmVyeSBsb29wVG8oKSkuXG4gICAgLy8gRnJvbSBgcm9vdGAsIG5ldmVyIGZyb20gYGVudHJ5YDogYSByZXN1bWUncyBzdGFuZC1pbiBjYXJyaWVzIHRoZSBwYXVzZWRcbiAgICAvLyBzdGFnZSdzIGlkLCBhbmQgYSBsb29wIGJhY2sgdG8gdGhhdCBpZCBtdXN0IGZpbmQgdGhlIFJFQUwgc3RhZ2UuXG4gICAgY29uc3Qgbm9kZUlkTWFwID0gdGhpcy5idWlsZE5vZGVJZE1hcChvcHRzLnJvb3QpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBoYW5kbGVyIG1vZHVsZXMuXG4gICAgLy8gTm9kZVJlc29sdmVyJ3MgREZTIGZhbGxiYWNrIHJlc29sdmVzIGxvb3AgdGFyZ2V0cyBhZ2FpbnN0IHRoZSBMSVZFXG4gICAgLy8gcnVudGltZSBzaGFwZSwgc28gaXQgcmVhZHMgY2hpbGRyZW4gdGhyb3VnaCB0aGUgZHluYW1pYy1wYXRjaCBvdmVybGF5XG4gICAgLy8gKGEgbG9vcCBjYW4gdGFyZ2V0IGEgbm9kZSBhZGRlZCBieSBhIGR5bmFtaWMgU3RhZ2VOb2RlIHJldHVybikuXG4gICAgdGhpcy5ub2RlUmVzb2x2ZXIgPSBuZXcgTm9kZVJlc29sdmVyKGRlcHMsIG5vZGVJZE1hcCwgKG4pID0+IHRoaXMuZWZmQ2hpbGRyZW4obikpO1xuICAgIHRoaXMuY2hpbGRyZW5FeGVjdXRvciA9IG5ldyBDaGlsZHJlbkV4ZWN1dG9yKGRlcHMsIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5zdGFnZVJ1bm5lciA9IG5ldyBTdGFnZVJ1bm5lcihkZXBzKTtcbiAgICB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyID0gbmV3IENvbnRpbnVhdGlvblJlc29sdmVyKFxuICAgICAgZGVwcyxcbiAgICAgIHRoaXMubm9kZVJlc29sdmVyLFxuICAgICAgKG5vZGVJZCwgY291bnQpID0+IHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVJdGVyYXRpb25Db3VudChub2RlSWQsIGNvdW50KSxcbiAgICAgIHRoaXMuX21heEl0ZXJhdGlvbnMsXG4gICAgKTtcbiAgICB0aGlzLmRlY2lkZXJIYW5kbGVyID0gbmV3IERlY2lkZXJIYW5kbGVyKGRlcHMpO1xuICAgIHRoaXMuc2VsZWN0b3JIYW5kbGVyID0gbmV3IFNlbGVjdG9ySGFuZGxlcihkZXBzLCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IpO1xuICAgIHRoaXMuc3ViZmxvd0V4ZWN1dG9yID0gbmV3IFN1YmZsb3dFeGVjdXRvcihkZXBzLCB0aGlzLmNyZWF0ZVN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KG9wdHMpKTtcbiAgICB0aGlzLnBhcmFsbGVsRm9yRWFjaEhhbmRsZXIgPSBuZXcgUGFyYWxsZWxGb3JFYWNoSGFuZGxlcihkZXBzLCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IsIHtcbiAgICAgIHByZWZpeE5vZGVUcmVlOiAobiwgcHJlZml4KSA9PiB0aGlzLnByZWZpeE5vZGVUcmVlKG4sIHByZWZpeCksXG4gICAgICByZWdpc3RlckJyYW5jaFN1YmZsb3c6IChzdWJmbG93SWQsIHJvb3QsIGNoYXJ0KSA9PiB0aGlzLnJlZ2lzdGVyQnJhbmNoU3ViZmxvdyhzdWJmbG93SWQsIHJvb3QsIGNoYXJ0KSxcbiAgICAgIGJyYW5jaFNoYXJlZFN0YXRlOiAoc3ViZmxvd0lkKSA9PlxuICAgICAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLmdldChzdWJmbG93SWQpPy50cmVlQ29udGV4dD8uZ2xvYmFsQ29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgIHJlY29yZEJyYW5jaFN0cnVjdHVyZTogKG5vZGVJZCwgYnJhbmNoZXMpID0+IHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljQ2hpbGRyZW4obm9kZUlkLCBicmFuY2hlcyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFjdG9yeSB0aGF0IHByb2R1Y2VzIEZsb3djaGFydFRyYXZlcnNlciBpbnN0YW5jZXMgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICAgKiBDYXB0dXJlcyBwYXJlbnQgY29uZmlnIGluIGNsb3N1cmUg4oCUIFN1YmZsb3dFeGVjdXRvciBwcm92aWRlcyBzdWJmbG93LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAgICogRWFjaCBzdWJmbG93IGdldHMgYSBmdWxsIHRyYXZlcnNlciB3aXRoIGFsbCA3IHBoYXNlcyAoZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGV0Yy4pLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShcbiAgICBwYXJlbnRPcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4sXG4gICk6IFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5PFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIENhcHR1cmUgcmVmZXJlbmNlcyB0byBtdXRhYmxlIHN0YXRlIOKAlCBmYWN0b3J5IHJlYWRzIHRoZSBDVVJSRU5UIHN0YXRlIHdoZW4gY2FsbGVkLFxuICAgIC8vIG5vdCB0aGUgc3RhdGUgYXQgZmFjdG9yeSBjcmVhdGlvbiB0aW1lLiBUaGlzIGlzIGNvcnJlY3QgYmVjYXVzZSBsYXp5IHN1YmZsb3cgcmVzb2x1dGlvblxuICAgIC8vIG1heSBhZGQgZW50cmllcyB0byBzdGFnZU1hcC9zdWJmbG93cyBiZWZvcmUgYSBuZXN0ZWQgc3ViZmxvdyBpcyBlbmNvdW50ZXJlZC5cbiAgICBjb25zdCBwYXJlbnRTdGFnZU1hcCA9IHRoaXMuc3RhZ2VNYXA7XG4gICAgY29uc3QgcGFyZW50U3ViZmxvd3MgPSB0aGlzLnN1YmZsb3dzO1xuICAgIGNvbnN0IG5hcnJhdGl2ZUdlbmVyYXRvciA9IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yO1xuXG4gICAgcmV0dXJuIChzdWJmbG93T3B0cykgPT4ge1xuICAgICAgY29uc3QgdHJhdmVyc2VyID0gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgICAgcm9vdDogc3ViZmxvd09wdHMucm9vdCxcbiAgICAgICAgLi4uKHN1YmZsb3dPcHRzLmVudHJ5ICYmIHsgZW50cnk6IHN1YmZsb3dPcHRzLmVudHJ5IH0pLCAvLyBhIHJlc3VtZSBob3AncyBlbnRyeSBwb2ludFxuICAgICAgICAuLi4oc3ViZmxvd09wdHMucGVuZGluZ1BhdXNlcyAmJiB7IHBlbmRpbmdQYXVzZXM6IHN1YmZsb3dPcHRzLnBlbmRpbmdQYXVzZXMgfSksXG4gICAgICAgIHN0YWdlTWFwOiBwYXJlbnRTdGFnZU1hcCwgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBzY29wZUZhY3Rvcnk6IHBhcmVudE9wdHMuc2NvcGVGYWN0b3J5LFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBzdWJmbG93T3B0cy5leGVjdXRpb25SdW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IHN1YmZsb3dPcHRzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgICAgZXhlY3V0aW9uRW52OiBwYXJlbnRPcHRzLmV4ZWN1dGlvbkVudixcbiAgICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogcGFyZW50T3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgICBzdHJlYW1IYW5kbGVyczogcGFyZW50T3B0cy5zdHJlYW1IYW5kbGVycyxcbiAgICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogcGFyZW50T3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICBzdWJmbG93czogcGFyZW50U3ViZmxvd3MsIC8vIENvbnN0cnVjdG9yIHNoYWxsb3ctY29waWVzIHRoaXNcbiAgICAgICAgbmFycmF0aXZlR2VuZXJhdG9yLCAvLyBTaGFyZSBwYXJlbnQncyDigJQgYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZVxuICAgICAgICBsb2dnZXI6IHBhcmVudE9wdHMubG9nZ2VyLFxuICAgICAgICBzaWduYWw6IHBhcmVudE9wdHMuc2lnbmFsLFxuICAgICAgICBtYXhEZXB0aDogdGhpcy5fbWF4RGVwdGgsXG4gICAgICAgIC4uLih0aGlzLl9tYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgeyBtYXhJdGVyYXRpb25zOiB0aGlzLl9tYXhJdGVyYXRpb25zIH0pLFxuICAgICAgICBwYXJlbnRTdWJmbG93SWQ6IHN1YmZsb3dPcHRzLnN1YmZsb3dJZCxcbiAgICAgICAgLy8gUkZDLTAwMyBEMTogdGhlIG1vdW50IHN0YWdlJ3MgcnVudGltZVN0YWdlSWQg4oCUIHBhcmVudCBmYWxsYmFjayBmb3JcbiAgICAgICAgLy8gdGhlIHN1YmZsb3cncyByb290IHN0YWdlIHNvIGFuY2VzdG9yIGNoYWlucyBjcm9zcyB0aGUgYm91bmRhcnkuXG4gICAgICAgIHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ6IHN1YmZsb3dPcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQsXG4gICAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsIC8vIFNoYXJlIGNvdW50ZXIg4oCUIHN1YmZsb3cgY29udGludWVzIGdsb2JhbCBudW1iZXJpbmdcbiAgICAgICAgdmlzaXRDb3VudHM6IHRoaXMuX3Zpc2l0Q291bnRzLCAvLyBTaGFyZSB2aXNpdCBjb3VudHMg4oCUIGxvb3BJdGVyYXRpb24gc3RheXMgbW9ub3RvbmljIGFjcm9zcyBzdWJmbG93IHJlLW1vdW50c1xuICAgICAgICBydW5JZDogdGhpcy5ydW5JZCwgLy8gU3ViZmxvdyBpbmhlcml0cyBwYXJlbnQncyBydW5JZCDigJQgc2FtZSBsb2dpY2FsIHJ1blxuICAgICAgICAvLyBTaGFyZSB0aGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnkgQlkgUkVGRVJFTkNFLCBzbyBhIGhvcCB0YWtlblxuICAgICAgICAvLyBhdCBhbnkgZGVwdGggaXMgdGFrZW4gZm9yIHRoZSB3aG9sZSBydW4g4oCUIGFuZCBuZXN0ZWRcbiAgICAgICAgLy8gU3ViZmxvd0V4ZWN1dG9ycyBjYW4gdGFrZSB0aGUgZGVlcGVyIGhvcHMgKGUuZy4gU2VxdWVuY2UoQWdlbnQoLi4uKSlcbiAgICAgICAgLy8gd2hlcmUgdGhlIGlubmVyIEFnZW50IHN1YmZsb3cgcGF1c2VkKS5cbiAgICAgICAgLi4uKHRoaXMucmVzdW1lICYmIHsgcmVzdW1lOiB0aGlzLnJlc3VtZSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGVjdXRlOiAoKSA9PiB0cmF2ZXJzZXIuZXhlY3V0ZSgpLFxuICAgICAgICBnZXRTdWJmbG93UmVzdWx0czogKCkgPT4gdHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCksXG4gICAgICAgIGdldEJyZWFrU3RhdGU6ICgpID0+IHRyYXZlcnNlci5nZXRCcmVha1N0YXRlKCksXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlcHMob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KTogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YWdlTWFwOiB0aGlzLnN0YWdlTWFwLFxuICAgICAgcm9vdDogdGhpcy5yb290LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogdGhpcy5leGVjdXRpb25SdW50aW1lLFxuICAgICAgc2NvcGVGYWN0b3J5OiBvcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgIHN1YmZsb3dzOiB0aGlzLnN1YmZsb3dzLFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IG9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBvcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUgPz8gJ2Vycm9yJyxcbiAgICAgIHJlYWRPbmx5Q29udGV4dDogb3B0cy5yZWFkT25seUNvbnRleHQsXG4gICAgICBleGVjdXRpb25FbnY6IG9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgbmFycmF0aXZlR2VuZXJhdG9yOiB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcixcbiAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICBzaWduYWw6IG9wdHMuc2lnbmFsLFxuICAgICAgLi4uKHRoaXMucmVzdW1lICYmIHsgcmVzdW1lOiB0aGlzLnJlc3VtZSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhvbGRzIHRoZSB0b3AtbGV2ZWwgYnJlYWsgZmxhZyBmb3IgdGhlIGR1cmF0aW9uIG9mIGBleGVjdXRlKClgLiBLZXB0IGFzXG4gICAqIGEgZmllbGQgKG5vdCBhIGxvY2FsKSBzbyBgZ2V0QnJlYWtTdGF0ZSgpYCBjYW4gc3VyZmFjZSB0aGUgZmluYWwgc3RhdGVcbiAgICogZm9yIGNhbGxlcnMgbGlrZSBgU3ViZmxvd0V4ZWN1dG9yYCB0aGF0IGltcGxlbWVudCBgcHJvcGFnYXRlQnJlYWtgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdG9wQnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG5cbiAgYXN5bmMgZXhlY3V0ZShicmFuY2hQYXRoPzogc3RyaW5nKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5leGVjdXRpb25SdW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgdGhpcy5fdG9wQnJlYWtGbGFnID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcbiAgICAvLyBUaGUgZW50cnkgaXMgb25lLXNob3Q6IHRoZSBmaXJzdCBleGVjdXRlKCkgc3RhcnRzIHRoZXJlLCBuZXZlciBhZ2FpbiDigJRcbiAgICAvLyBhbmQgc28gYXJlIHRoZSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGJlaGluZCBpdC5cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZW50cnkgPz8gdGhpcy5yb290O1xuICAgIGNvbnN0IHdhaXRpbmcgPSB0aGlzLmVudHJ5UGVuZGluZ1BhdXNlcztcbiAgICB0aGlzLmVudHJ5ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHdhbGsgPSAoKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+ID0+XG4gICAgICB3YWl0aW5nXG4gICAgICAgID8gdGhpcy53YWxrVGhlblJhaXNlKHN0YXJ0LCBjb250ZXh0LCB3YWl0aW5nLCBicmFuY2hQYXRoKVxuICAgICAgICA6IHRoaXMuZXhlY3V0ZU5vZGUoc3RhcnQsIGNvbnRleHQsIHRoaXMuX3RvcEJyZWFrRmxhZywgYnJhbmNoUGF0aCA/PyAnJyk7XG5cbiAgICAvLyBGaXJlIG9uUnVuU3RhcnQgT05MWSBhdCB0aGUgdG9wLWxldmVsIHRyYXZlcnNhbCDigJQgc3ViZmxvdyB0cmF2ZXJzZXJzXG4gICAgLy8gYWxyZWFkeSBwcm9kdWNlIG9uU3ViZmxvd0VudHJ5L29uU3ViZmxvd0V4aXQgcGFpcnMsIHNvIGVtaXR0aW5nIHJ1blxuICAgIC8vIGV2ZW50cyBmb3IgdGhlbSB3b3VsZCBkb3VibGUtYnJhY2tldCB0aGUgYm91bmRhcnkgc3RyZWFtLiBUaGVcbiAgICAvLyB0b3AtbGV2ZWwgdHJhdmVyc2VyIGlzIHRoZSBvbmUgd2l0aG91dCBhIHBhcmVudFN1YmZsb3dJZC5cbiAgICBjb25zdCBpc1RvcExldmVsID0gdGhpcy5wYXJlbnRTdWJmbG93SWQgPT09IHVuZGVmaW5lZDtcbiAgICAvLyBTeW50aGV0aWMgVHJhdmVyc2FsQ29udGV4dCBmb3IgcnVuLmVudHJ5IC8gcnVuLmV4aXQuIEZpZWxkcyB1c2VcbiAgICAvLyByb290LXN0YWdlIGRlZmF1bHRzIChzdGFnZUlkPSdfX3Jvb3RfXycsIHJ1bnRpbWVTdGFnZUlkPSdfX3Jvb3RfXyMwJyxcbiAgICAvLyBkZXB0aCAwKSBzbyB0aGUgcnVuSWQgaXMgcmVsaWFibHkgYXZhaWxhYmxlIG9uIHJ1biBldmVudHMgd2l0aG91dFxuICAgIC8vIGZvcmNpbmcgcmVjb3JkZXJzIHRvIGhhbmRsZSBgdHJhdmVyc2FsQ29udGV4dCA9PT0gdW5kZWZpbmVkYC5cbiAgICBjb25zdCByb290Q29udGV4dCA9IHJvb3RUcmF2ZXJzYWxDb250ZXh0KHRoaXMucnVuSWQpO1xuICAgIGlmIChpc1RvcExldmVsKSB7XG4gICAgICAvLyBgcmVhZE9ubHlDb250ZXh0YCBpcyB0aGUgZW5naW5lJ3MgdmlldyBvZiBgcnVuKHtpbnB1dH0pYCDigJQgcGFzc2VkXG4gICAgICAvLyB0aHJvdWdoIGZyb20gYEZsb3dDaGFydEV4ZWN1dG9yLnJ1bigpYCBhcyB0aGUgdmFsaWRhdGVkIGlucHV0LlxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5TdGFydCh0aGlzLnJlYWRPbmx5Q29udGV4dCwgcm9vdENvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFRvcC1sZXZlbCBydW5zIGNsb3NlIHRoZWlyIGJvdW5kYXJ5IFNZTU1FVFJJQ0FMTFk6IGV2ZXJ5IG9uUnVuU3RhcnRcbiAgICAvLyBpcyBmb2xsb3dlZCBieSBleGFjdGx5IG9uZSBvblJ1bkVuZCAoY2xlYW4pIG9yIG9uUnVuRmFpbGVkIChlcnJvcikuXG4gICAgLy8gV2l0aG91dCB0aGUgY2F0Y2gsIGEgdGhyb3duIHJ1biBmaXJlZCBvblJ1blN0YXJ0IHRoZW4gbm90aGluZyDigJQgYVxuICAgIC8vIG1vbml0b3IgY291bGRuJ3QgdGVsbCBcInN0aWxsIHJ1bm5pbmdcIiBmcm9tIFwiY3Jhc2hlZC5cIiBQYXVzZSBpcyBOT1RcbiAgICAvLyBhbiBlcnJvciAoaXQncyBleHBlY3RlZCBzdXNwZW5zaW9uKSwgc28gaXQgc2tpcHMgb25SdW5GYWlsZWQgYW5kXG4gICAgLy8gcmUtdGhyb3dzIHVudG91Y2hlZC4gVGhlIHN0YWdlLWxldmVsIGNhdGNoIGFscmVhZHkgcmVjb3JkZWQgdGhlXG4gICAgLy8gZmFpbGluZyBzdGFnZSAob25FcnJvciArIGNvbW1pdCk7IHRoaXMgYWRkcyB0aGUgcnVuLWxldmVsIHRlcm1pbmFsXG4gICAgLy8gc2lnbmFsLiBUaGUgZXJyb3Igc3RpbGwgcHJvcGFnYXRlcyDigJQgdGhpcyBpcyBvYnNlcnZhdGlvbiwgbm90XG4gICAgLy8gcmVjb3ZlcnkuIFN1YmZsb3cgdHJhdmVyc2VycyBkb24ndCBmaXJlIHJ1biBldmVudHM7IHRoZWlyIGVycm9yc1xuICAgIC8vIGJ1YmJsZSB1cCBhbmQgc3VyZmFjZSBoZXJlIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAgaWYgKCFpc1RvcExldmVsKSB7XG4gICAgICByZXR1cm4gd2FsaygpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHdhbGsoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkZhaWxlZChleHRyYWN0RXJyb3JJbmZvKGVycm9yKSwgcm9vdENvbnRleHQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuRW5kKHJlc3VsdCwgcm9vdENvbnRleHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSByZXN1bWUncyBlbnRyeSBjaGFpbiBhdCBhIGxldmVsIHdoZXJlIHBhcmFsbGVsIHNpYmxpbmdzJyBwYXVzZXMgd2FpdFxuICAgKiAoOS4yOC4wKTogcnVuIHRoZSBjaGFpbiDigJQgdGhlIHJlc3VtZWQgY2hpbGQgb25seSwgdGhlIGZhbi1vdXQncyBqb2luIGlzXG4gICAqIE5PVCBhdHRhY2hlZCDigJQgdGhlbiByYWlzZSB0aGUgZmlyc3Qgd2FpdGluZyBwYXVzZSBhZ2FpbiwgdGhlIHJlc3QgYmVoaW5kXG4gICAqIGl0LiBOb3RoaW5nIG9mIHRoZSBzaWJsaW5nIHJlLXJ1bnM7IGl0cyBxdWVzdGlvbiBjb21lcyBiYWNrIGFzIGl0IHdhc1xuICAgKiBhc2tlZC4gQSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluICh0aGUgcmVzdW1lZCBjaGlsZCBhc2tpbmdcbiAgICogYWdhaW4pIGNhcnJpZXMgZXZlcnkgd2FpdGluZyBzaWJsaW5nIGluc3RlYWQsIHNvIG5vbmUgaXMgZXZlciBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWxrVGhlblJhaXNlKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgd2FpdGluZzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKHN0YXJ0LCBjb250ZXh0LCB0aGlzLl90b3BCcmVha0ZsYWcsIGJyYW5jaFBhdGggPz8gJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHF1ZXVlQmVoaW5kKGVycm9yLCB3YWl0aW5nKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCB7IHBhdXNlLCBzdGFnZU5hbWUgfSA9IHdhaXRpbmdbMF07XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShzdGFnZU5hbWUsIHBhdXNlLnBhdXNlZFN0YWdlSWQsIHBhdXNlLnBhdXNlRGF0YSwgcGF1c2Uuc3ViZmxvd1BhdGgpO1xuICAgIHRocm93IHJhaXNlUXVldWVkUGF1c2Uod2FpdGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQnJlYWsgc3RhdGUgY2FwdHVyZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiB0aGUgbW9zdCByZWNlbnQgYGV4ZWN1dGUoKWAuXG4gICAqIGBzaG91bGRCcmVha2AgaXMgdHJ1ZSB3aGVuIGEgc3RhZ2UgY2FsbGVkIGBzY29wZS4kYnJlYWsocmVhc29uKWA7IHRoZVxuICAgKiBvcHRpb25hbCBgcmVhc29uYCBjYXJyaWVzIHRoZSBzdHJpbmcgcGFzc2VkIHRvIGAkYnJlYWtgLlxuICAgKlxuICAgKiBVc2VkIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHRvIHByb3BhZ2F0ZSBhbiBpbm5lciBzdWJmbG93J3MgYnJlYWsgdXAgdG9cbiAgICogdGhlIHBhcmVudCB0cmF2ZXJzZXIgd2hlbiB0aGUgbW91bnQgc2V0cyBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLlxuICAgKi9cbiAgZ2V0QnJlYWtTdGF0ZSgpOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fdG9wQnJlYWtGbGFnIH07XG4gIH1cblxuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlTWFuYWdlci5nZXRTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSkge1xuICAgIC8vIFN0YW1wIHRoZSBydW4ncyBpZCBvbnRvIHRoZSBydW50aW1lIHNuYXBzaG90IGhlcmUg4oCUIHRoZSB0cmF2ZXJzZXIgaXNcbiAgICAvLyB0aGUgc2luZ2xlIGF1dGhvcml0eSBmb3IgYHJ1bklkYCAoaXQgYWxyZWFkeSBzdGFtcHMgdGhlIHNhbWUgdmFsdWUgb25cbiAgICAvLyBldmVyeSBUcmF2ZXJzYWxDb250ZXh0L2V2ZW50KSwgd2hpbGUgdGhlIHJ1bnRpbWUgaXMgcnVuLWFnbm9zdGljXG4gICAgLy8gbWVtb3J5IChpdHMgZ2V0U25hcHNob3QgcmV0dXJucyBPbWl0PFJ1bnRpbWVTbmFwc2hvdCwgJ3J1bklkJz4pLlxuICAgIC8vIEZyZXNoIHBlciBydW4oKSBBTkQgcGVyIHJlc3VtZSgpIOKAlCBzZWUgcnVubmVyL3J1bklkLnRzLlxuICAgIHJldHVybiB7IC4uLnRoaXMuZXhlY3V0aW9uUnVudGltZS5nZXRTbmFwc2hvdChvcHRpb25zKSwgcnVuSWQ6IHRoaXMucnVuSWQgfTtcbiAgfVxuXG4gIGdldFJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uUnVudGltZTtcbiAgfVxuXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuZXhlY3V0aW9uUnVudGltZS5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgZ2V0QnJhbmNoSWRzKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0UGlwZWxpbmVzKCk7XG4gIH1cblxuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gIH1cblxuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViZmxvd1Jlc3VsdHM7XG4gIH1cblxuICBnZXROYXJyYXRpdmUoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5nZXRTZW50ZW5jZXMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyLCBvciB1bmRlZmluZWQgaWYgbmFycmF0aXZlIGlzIGRpc2FibGVkLiAqL1xuICBnZXRGbG93UmVjb3JkZXJEaXNwYXRjaGVyKCk6IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsb3dSZWNvcmRlckRpc3BhdGNoZXI7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgQ29yZSBUcmF2ZXJzYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIE8oMSkgSUTihpJub2RlIG1hcCBmcm9tIHRoZSByb290IGdyYXBoLlxuICAgKiBVc2VkIGJ5IE5vZGVSZXNvbHZlciB0byBhdm9pZCByZXBlYXRlZCBERlMgb24gZXZlcnkgbG9vcFRvKCkgY2FsbC5cbiAgICogSXRlcmF0aXZlIHdvcmtsaXN0IChubyByZWN1cnNpb24pIHNvIGFyYml0cmFyaWx5IGxvbmcgY2hhaW5zIGluZGV4IGZ1bGx5O1xuICAgKiB0aGUgYG1hcC5oYXNgIGd1YXJkIGhhbmRsZXMgY3ljbGljIHJlZnMuIEZpcnN0LXZpc2l0ZWQgbm9kZSB3aW5zIHBlciBJRCDigJRcbiAgICogd29ya2xpc3Qgb3JkZXIgbWF0Y2hlcyB0aGUgb2xkIHJlY3Vyc2l2ZSBwcmUtb3JkZXIgKGNoaWxkcmVuLCB0aGVuIG5leHQpLlxuICAgKiBEeW5hbWljIHN1YmZsb3dzIGFuZCBsYXp5LXJlc29sdmVkIG5vZGVzIGFyZSBhZGRlZCB0byBzdGFnZU1hcCBhdCBydW50aW1lIGJ1dCBub3QgdG8gdGhpcyBtYXAg4oCUXG4gICAqIHRob3NlIHVzZSB0aGUgREZTIGZhbGxiYWNrIGluIE5vZGVSZXNvbHZlci5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb2RlSWRNYXAocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBNYXA8c3RyaW5nLCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4oKTtcbiAgICBjb25zdCBzdGFjazogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtyb290XTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGlmIChtYXAuaGFzKG5vZGUuaWQpKSBjb250aW51ZTsgLy8gYWxyZWFkeSB2aXNpdGVkIChhdm9pZHMgaW5maW5pdGUgbG9vcHMgb24gY3ljbGljIHJlZnMpXG4gICAgICBtYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgICAgLy8gUHVzaCBpbiByZXZlcnNlIHZpc2l0IG9yZGVyIChMSUZPIHN0YWNrKTogbmV4dCBmaXJzdCwgdGhlbiBjaGlsZHJlblxuICAgICAgLy8gcmV2ZXJzZWQg4oCUIHNvIGNoaWxkcmVuIGFyZSB2aXNpdGVkIGJlZm9yZSBuZXh0LCBmaXJzdCBjaGlsZCBmaXJzdCxcbiAgICAgIC8vIG1hdGNoaW5nIHRoZSByZWN1cnNpdmUgcHJlLW9yZGVyIGV4YWN0bHkuXG4gICAgICBpZiAobm9kZS5uZXh0KSBzdGFjay5wdXNoKG5vZGUubmV4dCk7XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICBmb3IgKGxldCBpID0gbm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgc3RhY2sucHVzaChub2RlLmNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhZ2VGbihub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBub2RlLmZuID09PSAnZnVuY3Rpb24nKSByZXR1cm4gbm9kZS5mbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT47XG4gICAgLy8gUHJpbWFyeTogbG9vayB1cCBieSBpZCAoc3RhYmxlIGlkZW50aWZpZXIsIGtleWVkIGJ5IEZsb3dDaGFydEJ1aWxkZXIpXG4gICAgY29uc3QgYnlJZCA9IHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUuaWQpO1xuICAgIGlmIChieUlkICE9PSB1bmRlZmluZWQpIHJldHVybiBieUlkO1xuICAgIC8vIEZhbGxiYWNrOiBsb29rIHVwIGJ5IG5hbWUgKHN1cHBvcnRzIGhhbmQtY3JhZnRlZCBzdGFnZU1hcHMgaW4gdGVzdHMgYW5kIGFkdmFuY2VkIHVzZSlcbiAgICByZXR1cm4gdGhpcy5zdGFnZU1hcC5nZXQobm9kZS5uYW1lKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBEeW5hbWljLXBhdGNoIG92ZXJsYXkgYWNjZXNzb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBFdmVyeSBlbmdpbmUgcmVhZCBvZiBhIGZpZWxkIHRoYXQgUGhhc2UgNCBjYW4gcGF0Y2ggKGNoaWxkcmVuLFxuICAvLyBuZXh0Tm9kZVNlbGVjdG9yLCBzdWJmbG93IG1ldGEpIGdvZXMgdGhyb3VnaCB0aGVzZS4gRmFzdCBwYXRoOiBjaGFydHNcbiAgLy8gd2l0aCBubyBkeW5hbWljIHJldHVybnMgbmV2ZXIgYWxsb2NhdGUgYW5kIHBheSBvbmUgYHNpemUgPT09IDBgIGNoZWNrLlxuXG4gIHByaXZhdGUgZ2V0UGF0Y2gobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnBhdGNoQ291bnQgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY1BhdGNoZXMuZ2V0KG5vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZVBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHtcbiAgICBsZXQgcGF0Y2ggPSB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSB7XG4gICAgICBwYXRjaCA9IHt9O1xuICAgICAgdGhpcy5keW5hbWljUGF0Y2hlcy5zZXQobm9kZSwgcGF0Y2gpO1xuICAgICAgdGhpcy5wYXRjaENvdW50Kys7XG4gICAgfVxuICAgIHJldHVybiBwYXRjaDtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgY2hpbGRyZW46IGR5bmFtaWMgcGF0Y2ggZmlyc3QsIHRoZW4gdGhlIGJ1aWx0IG5vZGUncyBjaGlsZHJlbi4gKi9cbiAgcHJpdmF0ZSBlZmZDaGlsZHJlbihub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldFBhdGNoKG5vZGUpPy5jaGlsZHJlbiA/PyBub2RlLmNoaWxkcmVuO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBvdXRwdXQtYmFzZWQgc2VsZWN0b3I6IGR5bmFtaWMgcGF0Y2ggZmlyc3QsIHRoZW4gdGhlIGJ1aWx0IG5vZGUncy4gKi9cbiAgcHJpdmF0ZSBlZmZTZWxlY3Rvcihub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFNlbGVjdG9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8ubmV4dE5vZGVTZWxlY3RvciA/PyBub2RlLm5leHROb2RlU2VsZWN0b3I7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIHN1YmZsb3ctcm9vdCBtYXJrZXIgKHRydWUgd2hlbiBhIGR5bmFtaWMgc3ViZmxvdyB3YXMgcGF0Y2hlZCBvbikuICovXG4gIHByaXZhdGUgZWZmSXNTdWJmbG93Um9vdChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFBhdGNoKG5vZGUpPy5zdWJmbG93TWV0YTtcbiAgICByZXR1cm4gbWV0YSA/IHRydWUgOiBub2RlLmlzU3ViZmxvd1Jvb3Q7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIHN1YmZsb3cgaWQgKHBhdGNoZWQgdmVyYmF0aW0gYnkgYSBkeW5hbWljIHN1YmZsb3cgcmV0dXJuKS4gKi9cbiAgcHJpdmF0ZSBlZmZTdWJmbG93SWQobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFBhdGNoKG5vZGUpPy5zdWJmbG93TWV0YTtcbiAgICByZXR1cm4gbWV0YSA/IG1ldGEuc3ViZmxvd0lkIDogbm9kZS5zdWJmbG93SWQ7XG4gIH1cblxuICAvKipcbiAgICogTWF0ZXJpYWxpemUgdGhlIGVmZmVjdGl2ZSB2aWV3IG9mIGEgbm9kZSDigJQgZmllbGQtaWRlbnRpY2FsIHRvIHdoYXQgdGhlXG4gICAqIHByZS1vdmVybGF5IGNvZGUgcHJvZHVjZWQgYnkgbXV0YXRpbmcgdGhlIHNoYXJlZCBub2RlLiBVc2VkIHdoZXJlIGEgbm9kZVxuICAgKiBpcyBoYW5kZWQgdG8gYSBoZWxwZXIgZXhlY3V0b3IgKE5vZGVSZXNvbHZlciAvIFN1YmZsb3dFeGVjdXRvciAvXG4gICAqIENoaWxkcmVuRXhlY3V0b3IpIHNvIGhlbHBlcnMgbmV2ZXIgcmVhZCBzdGFsZSBidWlsdCBmaWVsZHMuIFJldHVybnMgdGhlXG4gICAqIG5vZGUgaXRzZWxmIChubyBhbGxvY2F0aW9uKSB3aGVuIGl0IGNhcnJpZXMgbm8gcGF0Y2guXG4gICAqL1xuICBwcml2YXRlIGVmZk5vZGUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgcGF0Y2ggPSB0aGlzLmdldFBhdGNoKG5vZGUpO1xuICAgIGlmICghcGF0Y2gpIHJldHVybiBub2RlO1xuICAgIGNvbnN0IG1lcmdlZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IC4uLm5vZGUgfTtcbiAgICBpZiAocGF0Y2guc3ViZmxvd01ldGEpIHtcbiAgICAgIG1lcmdlZC5pc1N1YmZsb3dSb290ID0gdHJ1ZTtcbiAgICAgIG1lcmdlZC5zdWJmbG93SWQgPSBwYXRjaC5zdWJmbG93TWV0YS5zdWJmbG93SWQ7XG4gICAgICBtZXJnZWQuc3ViZmxvd05hbWUgPSBwYXRjaC5zdWJmbG93TWV0YS5zdWJmbG93TmFtZTtcbiAgICAgIG1lcmdlZC5zdWJmbG93TW91bnRPcHRpb25zID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd01vdW50T3B0aW9ucztcbiAgICB9XG4gICAgaWYgKHBhdGNoLmNoaWxkcmVuKSBtZXJnZWQuY2hpbGRyZW4gPSBwYXRjaC5jaGlsZHJlbjtcbiAgICBpZiAocGF0Y2gubmV4dE5vZGVTZWxlY3RvcikgbWVyZ2VkLm5leHROb2RlU2VsZWN0b3IgPSBwYXRjaC5uZXh0Tm9kZVNlbGVjdG9yO1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICAvKipcbiAgICogVEhFIHNpbmdsZSBmdW5uZWwgZXZlcnkgc3RhZ2UgZnVuY3Rpb24gcGFzc2VzIHRocm91Z2gg4oCUIGxpbmVhciBzdGFnZXNcbiAgICogKFBoYXNlIDMpLCBkZWNpZGVyIHN0YWdlcyBhbmQgc2VsZWN0b3Igc3RhZ2VzICh0aGVpciBoYW5kbGVycyBhcmUgaGFuZGVkXG4gICAqIHRoaXMgbWV0aG9kIGFzIGBydW5TdGFnZWApLCBhbmQgYnkgZXh0ZW5zaW9uIGZvcmsgY2hpbGRyZW4gYW5kXG4gICAqIHN1YmZsb3ctaW50ZXJuYWwgc3RhZ2VzLCB3aGljaCByZS1lbnRlciBQaGFzZSAzIGluIHRoZWlyIG93biB0cmF2ZXJzZXIuXG4gICAqXG4gICAqIFdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSBkZWNsYXJhdGl2ZSByZXRyeSBsb29wIGxpdmVzIEhFUkUgYW5kIG5vd2hlcmVcbiAgICogZWxzZTogb25lIGltcGxlbWVudGF0aW9uIGdpdmVzIGByZXRyeWAgdG8gZXZlcnkgc3RhZ2Uga2luZCB0aGF0IGhhcyBhXG4gICAqIGZ1bmN0aW9uIHRvIHJldHJ5LiAoUHV0dGluZyBpdCBpbiBgU3RhZ2VSdW5uZXJgIHdvdWxkIGhhdmUgYmVlbiB3cm9uZyDigJRcbiAgICogdGhlIHJ1bm5lciBvd25zIHRoZSBzY29wZSBhbmQgdGhlIGludGVycnVwdCBib3VuZGFyeSwgYnV0IG5vdCB0aGVcbiAgICogYFN0YWdlQ29udGV4dGAgd2hvc2Ugc3RhZ2VkIHdyaXRlcyBhIGZhaWxlZCBhdHRlbXB0IG11c3QgZGlzY2FyZC4pXG4gICAqXG4gICAqIFdpdGggbm8gYHJldHJ5YCBwb2xpY3kgdGhpcyBpcyBhIHNpbmdsZSBjYWxsLCBieXRlLWlkZW50aWNhbCB0byB0aGVcbiAgICogcHJlLTkuMTUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVN0YWdlKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZuOiAoKSA9PiB2b2lkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPFRPdXQ+IHtcbiAgICAvLyBydW50aW1lU3RhZ2VJZCBpcyBhc3NpZ25lZCBpbiBleGVjdXRlTm9kZSgpIGJlZm9yZSB0cmF2ZXJzYWxDb250ZXh0IGNyZWF0aW9uLFxuICAgIC8vIGVuc3VyaW5nIHNjb3BlIGV2ZW50cyBhbmQgZmxvdyBldmVudHMgdXNlIHRoZSBzYW1lIHZhbHVlLiBJdCBkb2VzIE5PVFxuICAgIC8vIGNoYW5nZSBhY3Jvc3MgYXR0ZW1wdHM6IGF0dGVtcHRzIGFyZSBpbnRlcm5hbCB0byBPTkUgc3RhZ2UgZXhlY3V0aW9uIOKAlFxuICAgIC8vIG9uZSBydW50aW1lU3RhZ2VJZCwgb25lIGV4ZWN1dGlvbiBpbmRleCwgb25lIGZpbmFsIENvbW1pdEJ1bmRsZS5cbiAgICBjb25zdCBwb2xpY3kgPSBub2RlLnJldHJ5O1xuICAgIGNvbnN0IG1heEF0dGVtcHRzID0gcG9saWN5ID8gTWF0aC5mbG9vcihwb2xpY3kuYXR0ZW1wdHMpIDogMTtcbiAgICBpZiAoIXBvbGljeSB8fCAhKG1heEF0dGVtcHRzID4gMSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWdlUnVubmVyLnJ1bihub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4pO1xuICAgIH1cblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyA7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhZ2VSdW5uZXIucnVuKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBjb25zdCBpc0ZpbmFsQXR0ZW1wdCA9IGF0dGVtcHQgPj0gbWF4QXR0ZW1wdHM7XG4gICAgICAgIC8vIEEgUGF1c2VTaWduYWwgaXMgY29udHJvbCBmbG93LCBub3QgYSBmYWlsdXJlIOKAlCByZXRyeWluZyBpdCB3b3VsZFxuICAgICAgICAvLyByZS1ydW4gYSBzdGFnZSB0aGF0IGFza2VkIHRvIFNVU1BFTkQgKGFuZCB3b3VsZCBicmVhayByZXN1bWUsIHdoaWNoXG4gICAgICAgIC8vIHJlLWVudGVycyB0aGlzIHN0YWdlIGZyb20gaXRzIHRvcCkuIENvdmVycyBib3RoIHJhaXNlIHNoYXBlczpcbiAgICAgICAgLy8gYGFkZFBhdXNhYmxlRnVuY3Rpb25gIHJldHVybmluZyBkYXRhLCBhbmQgYGludGVycnVwdCgpYC5cbiAgICAgICAgaWYgKGlzRmluYWxBdHRlbXB0IHx8IGlzUGF1c2VTaWduYWwoZXJyb3IpIHx8ICF0aGlzLnNob3VsZFJldHJ5KHBvbGljeSwgZXJyb3IpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBjYW5jZWxsZWQgcnVuIG11c3Qgbm90IHNpdCB0aHJvdWdoIGEgYmFja29mZiBhbmQgdGhlbiB0cnkgYWdhaW4uXG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgZXJyb3I7XG5cbiAgICAgICAgLy8gQXR0ZW1wdCBpc29sYXRpb246IGRyb3AgZXZlcnl0aGluZyB0aGlzIGF0dGVtcHQgc3RhZ2VkIEJFRk9SRSB0aGVcbiAgICAgICAgLy8gbmV4dCBvbmUgc3RhcnRzLiBOb3RoaW5nIHdhcyBhcHBsaWVkLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHJvbGxcbiAgICAgICAgLy8gYmFjayDigJQgc2VlIFN0YWdlQ29udGV4dC5kaXNjYXJkU3RhZ2VkKCkuXG4gICAgICAgIGNvbnRleHQuZGlzY2FyZFN0YWdlZCgpO1xuXG4gICAgICAgIGNvbnN0IGRlbGF5TXMgPSByZXNvbHZlQmFja29mZk1zKHBvbGljeS5iYWNrb2ZmTXMsIGF0dGVtcHQpO1xuICAgICAgICAvLyBGaXJlZCBCRUZPUkUgdGhlIHdhaXQ6IGEgbGl2ZSBtb25pdG9yIGxlYXJucyBcInJldHJ5aW5nIGluIDUwMG1zXCJcbiAgICAgICAgLy8gd2hlbiB0aGUgZGVjaXNpb24gaXMgbWFkZSwgbm90IG9uY2UgaXQgaGFzIGFscmVhZHkgZWxhcHNlZC5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZVJldHJ5KFxuICAgICAgICAgIG5vZGUubmFtZSxcbiAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgbWF4QXR0ZW1wdHMsXG4gICAgICAgICAgZGVsYXlNcyxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICApO1xuICAgICAgICBpZiAoZGVsYXlNcyA+IDApIGF3YWl0IHNsZWVwKGRlbGF5TXMsIHRoaXMuc2lnbmFsKTtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUjUgZm9yIGlkcyBhIHN0YWdlIEFET1BUUyBhdCBydW4gdGltZSAoYSByZXR1cm5lZCBTdGFnZU5vZGUncyBgbmV4dGAgY2hhaW4sXG4gICAqIGBjaGlsZHJlbmAgYW5kIHN1YmZsb3cgaWRzKTogdGhlIHNhbWUgcmVmdXNhbCB0aGUgYnVpbGRlcidzIGRvb3JzIGFwcGx5IOKAlFxuICAgKiBgaWRzL3J1bnRpbWVTdGFnZUlkLnRzIMK3IHJlZnVzZVJlc2VydmVkSWRgIOKAlCBzbyBcIm5vIHVzZXIgaWQgY2FycmllcyBhXG4gICAqIGdyYW1tYXIgZGVsaW1pdGVyXCIgc3RheXMgdHJ1ZSBieSBjb25zdHJ1Y3Rpb24uIExvb3AtcmVmIHN0dWJzICh0aGV5IG5hbWUgYW5cbiAgICogZXhpc3Rpbmcgbm9kZSkgYW5kIHRoZSBjaGFydCdzIG93biBub2RlcyAoYWRtaXR0ZWQgYXQgYnVpbGQ7IGEgcHJlZml4ZWQgaWRcbiAgICogY2FycmllcyBgL2Agb24gcHVycG9zZSkgYXJlIG5vdCBuZXcgaWRzIGFuZCBhcmUgc2tpcHBlZC4gQSBzdWJmbG93XG4gICAqIGRlZmluaXRpb24ncyBvd24gdHJlZSBpcyBhIGJ1aWx0IGNoYXJ0IGFuZCBpcyBub3Qgd2Fsa2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG1pdER5bmFtaWNJZHMob3V0cHV0OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCFvdXRwdXQgfHwgdHlwZW9mIG91dHB1dCAhPT0gJ29iamVjdCcgfHwgIWlzU3RhZ2VOb2RlUmV0dXJuKG91dHB1dCkpIHJldHVybjtcbiAgICBjb25zdCByb290ID0gb3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgIGNvbnN0IHJlZnVzZSA9IChyZWZ1c2FsOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChyZWZ1c2FsICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgW2Zvb3RwcmludF0gZHluYW1pYyBTdGFnZU5vZGU6ICR7cmVmdXNhbH1gKTtcbiAgICB9O1xuICAgIGlmIChyb290LnN1YmZsb3dJZCkgcmVmdXNlKHJlZnVzZVJlc2VydmVkSWQoJ2R5bmFtaWMgc3ViZmxvdyBpZCcsIHJvb3Quc3ViZmxvd0lkLCAnc2VnbWVudCcpKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4oKTtcbiAgICBjb25zdCBzdGFjazogQXJyYXk8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+ID0gW3Jvb3QubmV4dCwgLi4uKHJvb3QuY2hpbGRyZW4gPz8gW10pXTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbiA9IHN0YWNrLnBvcCgpO1xuICAgICAgaWYgKCFuIHx8IHNlZW4uaGFzKG4pIHx8IG4uaXNMb29wUmVmKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKG4pO1xuICAgICAgY29uc3QgcmVmdXNhbCA9XG4gICAgICAgIHJlZnVzZVJlc2VydmVkSWQoJ2R5bmFtaWMgc3RhZ2UgaWQnLCBuLmlkLCAnc3RhZ2UnKSA/P1xuICAgICAgICAobi5zdWJmbG93SWQgPyByZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN1YmZsb3cgaWQnLCBuLnN1YmZsb3dJZCwgJ3NlZ21lbnQnKSA6IHVuZGVmaW5lZCk7XG4gICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIE9ubHkgYSBTVVNQRUNUIGlkIHBheXMgZm9yIHRoZSBjaGFydCBsb29rdXA6IGEgY2hhcnQgbm9kZSAoYW5kIHRoZVxuICAgICAgICAvLyBjaGFydCBiZWxvdyBpdCkgd2FzIGFkbWl0dGVkIGF0IGJ1aWxkLlxuICAgICAgICBpZiAodGhpcy5ub2RlUmVzb2x2ZXIuZmluZE5vZGVCeUlkKG4uaWQpID09PSBuKSBjb250aW51ZTtcbiAgICAgICAgcmVmdXNlKHJlZnVzYWwpO1xuICAgICAgfVxuICAgICAgc3RhY2sucHVzaChuLm5leHQsIC4uLihuLmNoaWxkcmVuID8/IFtdKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGByZXRyeU9uYCBnYXRlLiBBIHRocm93aW5nIHByZWRpY2F0ZSBjb3VudHMgYXMgXCJkbyBub3QgcmV0cnlcIiDigJQgYSBicm9rZW5cbiAgICogIHByZWRpY2F0ZSBtdXN0IG5ldmVyIHR1cm4gYSBmYWlsaW5nIHN0YWdlIGludG8gYW4gZW5kbGVzcyByZXRyeSBsb29wLiAqL1xuICBwcml2YXRlIHNob3VsZFJldHJ5KHBvbGljeTogTm9uTnVsbGFibGU8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bJ3JldHJ5J10+LCBlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICghcG9saWN5LnJldHJ5T24pIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcG9saWN5LnJldHJ5T24oZXJyb3IpID09PSB0cnVlO1xuICAgIH0gY2F0Y2ggKHByZWRpY2F0ZUVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbZm9vdHByaW50XSByZXRyeU9uIHByZWRpY2F0ZSB0aHJldzsgdHJlYXRpbmcgdGhlIGZhaWx1cmUgYXMgZmluYWwnLCB7XG4gICAgICAgIGVycm9yOiBwcmVkaWNhdGVFcnJvcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFtcG9saW5lIGRyaXZlciDigJQgcHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwgZW50cnkgcG9pbnQuXG4gICAqXG4gICAqIFJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluIGEgZmxhdCBsb29wOiBldmVyeVxuICAgKiBUQUlMIGNvbnRpbnVhdGlvbiAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlLCBkeW5hbWljIG5leHQgLyBkeW5hbWljXG4gICAqIHJlLWVudHJ5LCBuby1jb250aW51YXRpb24gZGVjaWRlciBkaXNwYXRjaCkgY29tZXMgYmFjayBhcyBhXG4gICAqIGBDb250aW51YXRpb25Ib3BgIGFuZCBpcyBmb2xsb3dlZCBJVEVSQVRJVkVMWSDigJQgbmVpdGhlciB0aGUgY2FsbCBzdGFja1xuICAgKiBub3IgdGhlIHJldGFpbmVkIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBjb3VudC5cbiAgICpcbiAgICogUmVjdXJzaW9uIHJlbWFpbnMgT05MWSBmb3IgdHJ1ZSB0cmVlIG5lc3RpbmcgKGVhY2ggZ2V0cyBhIG5lc3RlZCBkcml2ZXJcbiAgICogY2FsbCk6IGZvcmsgY2hpbGRyZW4gKGBDaGlsZHJlbkV4ZWN1dG9yYCksIHNlbGVjdG9yIGJyYW5jaGVzIChwYXJhbGxlbFxuICAgKiBmYW4tb3V0KSwgZGVjaWRlciBicmFuY2ggZGlzcGF0Y2ggd2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBgbmV4dGBcbiAgICogKHRoZSBicmFuY2ggbXVzdCBjb21wbGV0ZSBCRUZPUkUgdGhlIGRlY2lkZXIncyBjb250aW51YXRpb24gcnVucyksIGFuZFxuICAgKiBzdWJmbG93IG1vdW50cyAoZnJlc2ggdHJhdmVyc2VyOyB0aGUgbW91bnQgZnJhbWUgc3RheXMgaW4gdGhlIHBhcmVudCkuXG4gICAqIGBfZXhlY3V0ZURlcHRoYCB0aGVyZWZvcmUgY291bnRzIGNoYXJ0IENPTVBPU0lUSU9OIGRlcHRoIG9ubHksIGd1YXJkZWRcbiAgICogYnkgYF9tYXhEZXB0aGAgKGRlZmF1bHQgYE1BWF9FWEVDVVRFX0RFUFRIYCA9IDUwMCkuXG4gICAqXG4gICAqIFBhdXNlU2lnbmFsOiBhIGZsYXQgZGVjaWRlciBkaXNwYXRjaCByZWNvcmRzIGFuIGBJbnZva2VyU3RhbXBgOyBpZiB0aGVcbiAgICogY29udGludWVkIGNoYWluIGxhdGVyIHBhdXNlcywgdGhlIGRyaXZlciBzdGFtcHMgdGhlIHNpZ25hbCBkdXJpbmdcbiAgICogdW53aW5kIOKAlCBzYW1lIGludm9rZXIgY29udGV4dCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0b1xuICAgKiBzdGFtcCwgaW5uZXJtb3N0IChtb3N0IHJlY2VudCBkaXNwYXRjaCkgZmlyc3QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVOb2RlKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIEludm9rZXIgc3RhbXBzIGZyb20gZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMgaW4gVEhJUyBkcml2ZXIg4oCUIGtlcHRcbiAgICAvLyBsb2NhbCBzbyBuZXN0ZWQgZHJpdmVycyAoZm9yayBjaGlsZHJlbiwgd2l0aC1uZXh0IGRlY2lkZXIgYnJhbmNoZXMpXG4gICAgLy8gZ2V0IHRoZWlyIG93biB3aW5kb3dzLCBtYXRjaGluZyB0aGUgb2xkIGZyYW1lLW9uLXN0YWNrIHN0YW1waW5nIHNjb3BlLlxuICAgIGxldCBwZW5kaW5nSW52b2tlcnM6IEludm9rZXJTdGFtcFtdIHwgdW5kZWZpbmVkO1xuICAgIC8vIOKUgOKUgOKUgCBUcmVlLWRlcHRoIGd1YXJkIOKUgOKUgOKUgFxuICAgIC8vIFRoZSBpbmNyZW1lbnQgaXMgaW5zaWRlIGB0cnlgIHNvIGBmaW5hbGx5YCBhbHdheXMgZGVjcmVtZW50cyDigJQgbm9cbiAgICAvLyBmcmFnaWxlIGdhcCBiZXR3ZWVuIGNoZWNrIGFuZCB0cnkgZW50cnkuXG4gICAgdHJ5IHtcbiAgICAgIGlmICgrK3RoaXMuX2V4ZWN1dGVEZXB0aCA+IHRoaXMuX21heERlcHRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmxvd2NoYXJ0VHJhdmVyc2VyOiBtYXhpbXVtIHRyYXZlcnNhbCBkZXB0aCBleGNlZWRlZCAoJHt0aGlzLl9tYXhEZXB0aH0pLiBgICtcbiAgICAgICAgICAgICdEZXB0aCBjb3VudHMgTkVTVEVEIGRpc3BhdGNoIChmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLCByZWN1cnNpdmUgY29tcG9zaXRpb24pIOKAlCAnICtcbiAgICAgICAgICAgICdsaW5lYXIgY2hhaW5zIGFuZCBsb29wIGl0ZXJhdGlvbnMgcnVuIGZsYXQgYW5kIGRvIG5vdCBjb25zdW1lIGl0LiAnICtcbiAgICAgICAgICAgIGBMYXN0IHN0YWdlOiAnJHtub2RlLm5hbWV9Jy4gYCArXG4gICAgICAgICAgICAnQ2hlY2sgZm9yIHVuYm91bmRlZCByZWN1cnNpdmUgY2hhcnQgY29tcG9zaXRpb24sIG9yIHJhaXNlIHRoZSBsaW1pdCB2aWEgUnVuT3B0aW9ucy5tYXhEZXB0aC4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBsZXQgY3VycmVudDogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4gPSB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoIH07XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGVTdGVwKGN1cnJlbnQubm9kZSwgY3VycmVudC5jb250ZXh0LCBicmVha0ZsYWcsIGN1cnJlbnQuYnJhbmNoUGF0aCk7XG4gICAgICAgIGlmICghaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPihyZXN1bHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0Lmludm9rZXJTdGFtcCkgKHBlbmRpbmdJbnZva2VycyA/Pz0gW10pLnB1c2gocmVzdWx0Lmludm9rZXJTdGFtcCk7XG4gICAgICAgIGN1cnJlbnQgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFJlcGxheSBpbnZva2VyIHN0YW1wcyBtb3N0LXJlY2VudC1maXJzdC4gYHNldEludm9rZXJgIGlzXG4gICAgICAvLyBmaXJzdC13cml0ZS13aW5zLCBzbyB0aGUgaW5uZXJtb3N0IGRpc3BhdGNoJ3Mgc3RhbXAgbGFuZHMg4oCUIGV4YWN0bHlcbiAgICAgIC8vIHRoZSBvbGQgYnViYmxlLXVwIG9yZGVyIHRocm91Z2ggbmVzdGVkIGNhdGNoIGZyYW1lcy5cbiAgICAgIGlmIChwZW5kaW5nSW52b2tlcnMgIT09IHVuZGVmaW5lZCAmJiBpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gcGVuZGluZ0ludm9rZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihwZW5kaW5nSW52b2tlcnNbaV0uaW52b2tlclN0YWdlSWQsIHBlbmRpbmdJbnZva2Vyc1tpXS5jb250aW51YXRpb25TdGFnZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2V4ZWN1dGVEZXB0aC0tO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCBhIGZsYXQgY29udGludWF0aW9uIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wLiAqL1xuICBwcml2YXRlIGhvcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcCxcbiAgKTogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCAuLi4oaW52b2tlclN0YW1wICYmIHsgaW52b2tlclN0YW1wIH0pIH07XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBPTkUgbm9kZSB0aHJvdWdoIGFsbCA3IHBoYXNlcyDigJQgdGhlIG9sZCByZWN1cnNpdmUgYGV4ZWN1dGVOb2RlYFxuICAgKiBib2R5OyBvbmx5IHRoZSB0YWlsIGNhbGxzIGJlY2FtZSBgQ29udGludWF0aW9uSG9wYCByZXR1cm5zLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlJ3MgcmVzdWx0LCBvciBhIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wIHRvIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGVTdGVwKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIEF0dGFjaCBidWlsZGVyIG1ldGFkYXRhIHRvIGNvbnRleHQgZm9yIHNuYXBzaG90IGVucmljaG1lbnQuXG4gICAgLy8gU3ViZmxvdyBtZXRhIHJlYWRzIGdvIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheSDigJQgYSBub2RlXG4gICAgLy8gcGF0Y2hlZCBieSBhIGR5bmFtaWMtc3ViZmxvdyByZXR1cm4gcmUtZW50ZXJzIGV4ZWN1dGVOb2RlIGFuZCBtdXN0XG4gICAgLy8gY2xhc3NpZnkgYXMgYSBzdWJmbG93IHdpdGhvdXQgdGhlIHNoYXJlZCBub2RlIGV2ZXIgYmVpbmcgbXV0YXRlZC5cbiAgICBpZiAobm9kZS5kZXNjcmlwdGlvbikgY29udGV4dC5kZXNjcmlwdGlvbiA9IG5vZGUuZGVzY3JpcHRpb247XG4gICAgY29uc3QgZWZmU3ViZmxvd0lkID0gdGhpcy5lZmZTdWJmbG93SWQobm9kZSk7XG4gICAgaWYgKHRoaXMuZWZmSXNTdWJmbG93Um9vdChub2RlKSAmJiBlZmZTdWJmbG93SWQpIGNvbnRleHQuc3ViZmxvd0lkID0gZWZmU3ViZmxvd0lkO1xuXG4gICAgLy8gQXNzaWduIHJ1bnRpbWVTdGFnZUlkIEJFRk9SRSB0cmF2ZXJzYWxDb250ZXh0IGNyZWF0aW9uIOKAlCBlbnN1cmVzIHNjb3BlIGV2ZW50c1xuICAgIC8vIChidWZmZXJlZCBieSBydW50aW1lU3RhZ2VJZCkgYW5kIGZsb3cgZXZlbnRzIChmbHVzaGVkIGJ5IHRyYXZlcnNhbENvbnRleHQucnVudGltZVN0YWdlSWQpXG4gICAgLy8gdXNlIHRoZSBzYW1lIHZhbHVlLiBNdXN0IGhhcHBlbiBiZWZvcmUgZXhlY3V0ZVN0YWdlIEFORCBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dC5cbiAgICBjb25zdCBpZHggPSB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKys7XG4gICAgY29udGV4dC5ydW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQobm9kZS5pZCwgaWR4KTtcbiAgICAvLyBEZWNsYXJlZCB0YWdzICg5LjIxLjApIHJpZGUgdGhlIHNhbWUgc3RhbXA6IHBlci1ub2RlIGlkZW50aXR5LCBzZXRcbiAgICAvLyBVTkNPTkRJVElPTkFMTFkgc28gYSByZS11c2VkIGNvbnRleHQgKGEgbG9vcCdzIG5leHQtY29udGV4dCwgYSByZXN1bWVkXG4gICAgLy8gbGVnKSBuZXZlciBrZWVwcyBhIHByZXZpb3VzIG5vZGUncyBuYW1lcy4gYFN0YWdlQ29udGV4dC5jb21taXRgIHJlY29yZHNcbiAgICAvLyB0aGVtIG9uIHRoZSBmaXJzdCBidW5kbGUgb2YgdGhpcyBleGVjdXRpb24gYW5kIHJlbGVhc2VzIHRoZW0uXG4gICAgY29udGV4dC50YWdzID0gbm9kZS50YWdzO1xuXG4gICAgLy8gUkZDLTAwMyBEMTogcnVudGltZSBwYXJlbnQg4oCUIHRoZSBwcmV2aW91cyBleGVjdXRpb24gc3RlcCdzIHJ1bnRpbWVTdGFnZUlkLlxuICAgIC8vIEZhbGxzIGJhY2sgdG8gdGhlIHN1YmZsb3cgTU9VTlQncyBydW50aW1lU3RhZ2VJZCBmb3IgdGhlIHN1YmZsb3cgcm9vdFxuICAgIC8vIHN0YWdlIChpdHMgU3RhZ2VDb250ZXh0IGlzIGNyZWF0ZWQgZnJlc2ggd2l0aCBubyBwYXJlbnQpLCBzbyBydW50aW1lXG4gICAgLy8gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllcy4gYHx8YCAobm90IGA/P2ApIG9uIHB1cnBvc2U6XG4gICAgLy8gYSBwYXJlbnQgY29udGV4dCB0aGF0IG5ldmVyIGV4ZWN1dGVkIHN0aWxsIGNhcnJpZXMgdGhlIGZpZWxkJ3NcbiAgICAvLyBpbml0aWFsIGAnJ2AsIHdoaWNoIG11c3QgYWxzbyBmYWxsIHRocm91Z2ggdG8gdGhlIG1vdW50IGZhbGxiYWNrLlxuICAgIGNvbnN0IHBhcmVudFJ1bnRpbWVTdGFnZUlkID0gY29udGV4dC5wYXJlbnQ/LnJ1bnRpbWVTdGFnZUlkIHx8IHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcblxuICAgIC8vIGxvb3BJdGVyYXRpb24g4oCUIGhvdyBtYW55IHRpbWVzIFRISVMgc3RhZ2UgaGFzIHJ1biBiZWZvcmUgaW4gdGhpcyBydW4uXG4gICAgLy8gS2V5ZWQgYnkgdGhlIHNhbWUgc3RhZ2VJZCB3ZSBzdGFtcCBvbiB0aGUgY29udGV4dCAoYW5kIHRoZSBzYW1lIHZhbHVlIHRoZVxuICAgIC8vIG5hcnJhdGl2ZSByZWNvcmRlciBjb3VudHMgb24pLCBydW4tc2NvcGVkIGFuZCBzaGFyZWQgYWNyb3NzIHN1YmZsb3dcbiAgICAvLyByZS1tb3VudHMgdmlhIGBfdmlzaXRDb3VudHNgLiB1bmRlZmluZWQgb24gdGhlIGZpcnN0IHZpc2l0OyAxIG9uIHRoZVxuICAgIC8vIGZpcnN0IGxvb3AtYmFjaywgMiBvbiB0aGUgbmV4dCwg4oCmIOKAlCBpLmUuIHZpc2l0Q291bnQgLSAxLiBDb3VudGVkIGZvclxuICAgIC8vIEVWRVJZIHN0YWdlIGtpbmQgKGFueSBub2RlIGNhbiBiZSBhIGxvb3AgdGFyZ2V0KSwgdW5saWtlIHRoZSBuYXJyYXRpdmVcbiAgICAvLyByZWNvcmRlciB3aGljaCBvbmx5IHJlbmRlcnMgaXQgZm9yIGxpbmVhciBzdGFnZXMuXG4gICAgY29uc3QgY29udGV4dFN0YWdlSWQgPSBub2RlLmlkID8/IGNvbnRleHQuc3RhZ2VJZDtcbiAgICBjb25zdCB2aXNpdENvdW50ID0gKHRoaXMuX3Zpc2l0Q291bnRzLmdldChjb250ZXh0U3RhZ2VJZCkgPz8gMCkgKyAxO1xuICAgIHRoaXMuX3Zpc2l0Q291bnRzLnNldChjb250ZXh0U3RhZ2VJZCwgdmlzaXRDb3VudCk7XG4gICAgY29uc3QgbG9vcEl0ZXJhdGlvbiA9IHZpc2l0Q291bnQgPiAxID8gdmlzaXRDb3VudCAtIDEgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCB0cmF2ZXJzYWwgY29udGV4dCBmb3IgcmVjb3JkZXIgZXZlbnRzIOKAlCBjcmVhdGVkIG9uY2UgcGVyIHN0YWdlLCBzaGFyZWQgYnkgYWxsIGV2ZW50c1xuICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQgPSB0cmF2ZXJzYWxDb250ZXh0Rm9yKHtcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgc3RhZ2VJZDogY29udGV4dFN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogY29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgcGFyZW50U3RhZ2VJZDogY29udGV4dC5wYXJlbnQ/LnN0YWdlSWQsXG4gICAgICBwYXJlbnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICBzdWJmbG93SWQ6IGNvbnRleHQuc3ViZmxvd0lkID8/IHRoaXMucGFyZW50U3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gam9pblBhdGgobm9kZS5zdWJmbG93SWQhLCBrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KHByZWZpeGVkS2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgICAgaWYgKHJlc29sdmVkLnN1YmZsb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKG5vZGUuc3ViZmxvd0lkISwga2V5KTtcbiAgICAgICAgICBpZiAoIXRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldKSB7XG4gICAgICAgICAgICAvLyBQcmVmaXhlZCBsaWtlIHRoZSBidWlsZGVyJ3MgYF9tZXJnZVN1YmZsb3dzYCAoOS4zNy4wIGZpeCk6IHRoZVxuICAgICAgICAgICAgLy8gbmVzdGVkIHJvb3QncyBpZHMgbGl2ZSB1bmRlciB0aGUgbGF6eSBtb3VudCdzIHBhdGggdG9vLlxuICAgICAgICAgICAgdGhpcy5zdWJmbG93c1twcmVmaXhlZEtleV0gPSB7XG4gICAgICAgICAgICAgIHJvb3Q6IHByZWZpeE5vZGVUcmVlKChkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9KS5yb290LCBub2RlLnN1YmZsb3dJZCEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHJ1bnRpbWUgc3RydWN0dXJlIHdpdGggdGhlIG5vdy1yZXNvbHZlZCBzcGVjXG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG5vZGUuaWQsXG4gICAgICAgIG5vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgbm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgcmVzb2x2ZWQuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhcyByZXNvbHZlZCBmb3IgVEhJUyB0cmF2ZXJzZXIg4oCUIHBlci10cmF2ZXJzZXIgc2V0IHByZXZlbnRzIHJlLWVudHJ5XG4gICAgICAvLyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgU3RhZ2VOb2RlIGdyYXBoICh3aGljaCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgdHJhdmVyc2VycykuXG4gICAgICB0aGlzLnJlc29sdmVkTGF6eVN1YmZsb3dzLmFkZChub2RlLnN1YmZsb3dJZCEpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwOiBDTEFTU0lGWSDigJQgc3ViZmxvdyBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuZWZmSXNTdWJmbG93Um9vdChub2RlKSAmJiBlZmZTdWJmbG93SWQpIHtcbiAgICAgIC8vIEhhbmQgaGVscGVycyB0aGUgRUZGRUNUSVZFIG5vZGUgdmlldyAoYnVpbHQgZmllbGRzICsgZHluYW1pYyBwYXRjaClcbiAgICAgIC8vIHNvIFN1YmZsb3dFeGVjdXRvci9Ob2RlUmVzb2x2ZXIgbmV2ZXIgcmVhZCBzdGFsZSBidWlsdCBmaWVsZHMuXG4gICAgICBjb25zdCBtb3VudE5vZGUgPSB0aGlzLmVmZk5vZGUobm9kZSk7XG4gICAgICBjb25zdCByZXNvbHZlZE5vZGUgPSB0aGlzLm5vZGVSZXNvbHZlci5yZXNvbHZlU3ViZmxvd1JlZmVyZW5jZShtb3VudE5vZGUpO1xuXG4gICAgICBjb25zdCBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdGhpcy5zdWJmbG93RXhlY3V0b3IuZXhlY3V0ZVN1YmZsb3coXG4gICAgICAgIHJlc29sdmVkTm9kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgPSByZXNvbHZlZE5vZGUgIT09IG1vdW50Tm9kZTtcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbihtb3VudE5vZGUuY2hpbGRyZW4gJiYgbW91bnROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApO1xuICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbiA9IGlzUmVmZXJlbmNlQmFzZWRTdWJmbG93IHx8IGhhc0NoaWxkcmVuO1xuXG4gICAgICAvLyDilIDilIDilIAgQnJlYWstZmxhZyBjaGVjayBBRlRFUiBzdWJmbG93IHJldHVybnMg4pSA4pSA4pSAXG4gICAgICAvLyBJZiB0aGUgc3ViZmxvdyB3YXMgbW91bnRlZCB3aXRoIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAgYW5kIGJyb2tlXG4gICAgICAvLyBpbnRlcm5hbGx5LCBgU3ViZmxvd0V4ZWN1dG9yYCBoYXMgYWxyZWFkeSBmbGlwcGVkIG91ciBicmVha0ZsYWcuXG4gICAgICAvLyBTdG9wIHRoZSBvdXRlciB0cmF2ZXJzYWwgaGVyZSDigJQgZG8gbm90IHJ1biB0aGUgbmV4dCBsaW5lYXIgc3RhZ2UuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5uZXh0ICYmIHNob3VsZEV4ZWN1dGVDb250aW51YXRpb24pIHtcbiAgICAgICAgLy8gQSBtb3VudCdzIGBuZXh0YCBjYW4gYmUgYSBsb29wLXJlZiBTVFVCIOKAlCBhIHN1YmZsb3cgbW91bnRlZCBhcyBhXG4gICAgICAgIC8vIGRlY2lkZXIgYnJhbmNoIHdpdGggYHsgbG9vcFRvIH1gIC8gYC5sb29wVG8oKWAuIFJlc29sdmUgaXQgbGlrZVxuICAgICAgICAvLyBQaGFzZSA2IGRvZXMgKGl0ZXJhdGlvbiBjb3VudGVkLCBgb25Mb29wYCBmaXJlZCk7IGhvcHBpbmcgaW50byB0aGVcbiAgICAgICAgLy8gYmFyZSBzdHViIHJhbiB0aGUgdGFyZ2V0J3MgZnVuY3Rpb24gb25jZSBhbmQgZW5kZWQgdGhlIHJ1bi5cbiAgICAgICAgaWYgKG5vZGUubmV4dC5pc0xvb3BSZWYpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICBub2RlLm5leHQsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMGI6IFBBUkFMTEVMLUZPUi1FQUNIIOKAlCBkeW5hbWljIGZhbi1vdXQsIG9uZSBicmFuY2ggcGVyIGl0ZW0g4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBTaXRzIEJFRk9SRSBQaGFzZSAxIChWQUxJREFURSkgb24gcHVycG9zZTogdGhpcyBub2RlIGxlZ2l0aW1hdGVseSBoYXMgbm9cbiAgICAvLyBzdGFnZSBmdW5jdGlvbiwgbm8gc3RhdGljIGNoaWxkcmVuLCBhbmQgbm8gZGVjaWRlciDigJQgaXRzIGJyYW5jaGVzIGRvIG5vdFxuICAgIC8vIGV4aXN0IHVudGlsIGBpdGVtcygpYCBydW5zIOKAlCBzbyB0aGUgXCJtdXN0IGRlZmluZSBmbiBPUiBjaGlsZHJlblwiIGNoZWNrXG4gICAgLy8gd291bGQgcmVqZWN0IGEgcGVyZmVjdGx5IHZhbGlkIGNoYXJ0LiBUaGUgaGFuZGxlciBvd25zIGl0cyBvd24gY29tbWl0XG4gICAgLy8gKHRoZSBvcmRlcmVkIHJlc3VsdHMgYXJyYXkpLCBsaWtlIHRoZSBkZWNpZGVyIGFuZCBzZWxlY3RvciBwaGFzZXMgZG8uXG4gICAgaWYgKG5vZGUuaXNEeW5hbWljUGFyYWxsZWwgJiYgbm9kZS5wYXJhbGxlbEZvckVhY2gpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnBhcmFsbGVsRm9yRWFjaEhhbmRsZXIucnVuKG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgICBpZiAobm9kZS5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5vZGUubmV4dC5uYW1lLCBub2RlLm5leHQuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0LCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWdlRnVuYyA9IHRoaXMuZ2V0U3RhZ2VGbihub2RlKTtcbiAgICBjb25zdCBoYXNTdGFnZUZ1bmN0aW9uID0gQm9vbGVhbihzdGFnZUZ1bmMpO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZERlY2lkZXIgPSBCb29sZWFuKG5vZGUuZGVjaWRlckZuKTtcbiAgICBjb25zdCBpc1Njb3BlQmFzZWRTZWxlY3RvciA9IEJvb2xlYW4obm9kZS5zZWxlY3RvckZuKTtcbiAgICBjb25zdCBpc0RlY2lkZXJOb2RlID0gaXNTY29wZUJhc2VkRGVjaWRlcjtcbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IEJvb2xlYW4odGhpcy5lZmZDaGlsZHJlbihub2RlKT8ubGVuZ3RoKTtcbiAgICAvLyBgbmV4dGAgaXMgbmV2ZXIgb3ZlcmxhaWQg4oCUIGEgZHluYW1pYyBuZXh0IGFwcGxpZXMgb25seSB0byB0aGUgdmlzaXRcbiAgICAvLyB0aGF0IHByb2R1Y2VkIGl0IChoYW5kbGVkIHZpYSB0aGUgYGR5bmFtaWNOZXh0YCBsb2NhbCBiZWxvdyksIHNvIHRoZVxuICAgIC8vIGJ1aWx0IGNoYXJ0J3MgbmV4dCBpcyBhbHdheXMgdGhlIGNvcnJlY3QgY29udGludWF0aW9uIGhlcmUuXG4gICAgY29uc3QgaGFzTmV4dCA9IEJvb2xlYW4obm9kZS5uZXh0KTtcbiAgICBjb25zdCBvcmlnaW5hbE5leHQgPSBub2RlLm5leHQ7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMTogVkFMSURBVEUg4oCUIG5vZGUgaW52YXJpYW50cyDilIDilIDilIBcbiAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24gJiYgIWlzRGVjaWRlck5vZGUgJiYgIWlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYE5vZGUgJyR7bm9kZS5uYW1lfScgbXVzdCBkZWZpbmU6IGVtYmVkZGVkIGZuIE9SIGEgc3RhZ2VNYXAgZW50cnkgT1IgaGF2ZSBjaGlsZHJlbi9kZWNpZGVyYDtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIGlmIChpc0RlY2lkZXJOb2RlICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ0RlY2lkZXIgbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ1NlbGVjdG9yIG5vZGUgbmVlZHMgdG8gaGF2ZSBjaGlsZHJlbiB0byBleGVjdXRlJztcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLy8gUm9sZSBtYXJrZXJzIGZvciBkZWJ1ZyBwYW5lbHNcbiAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24pIHtcbiAgICAgIGlmIChpc0RlY2lkZXJOb2RlKSBjb250ZXh0LnNldEFzRGVjaWRlcigpO1xuICAgICAgZWxzZSBpZiAoaGFzQ2hpbGRyZW4pIGNvbnRleHQuc2V0QXNGb3JrKCk7XG4gICAgfVxuXG4gICAgLy8gQnJlYWsgaGFuZGxlciB3aXJlZCB0byB0aGUgc2NvcGUuIENhcHR1cmVzIHRoZSBvcHRpb25hbCByZWFzb25cbiAgICAvLyBwYXNzZWQgdmlhIGBzY29wZS4kYnJlYWsocmVhc29uKWAgYW5kIHBhcmtzIGl0IG9uIHRoZSBicmVha0ZsYWcgc29cbiAgICAvLyBkb3duc3RyZWFtIGNvZGUgKEZsb3dSZWNvcmRlci5vbkJyZWFrLCBzdWJmbG93IHByb3BhZ2F0aW9uKSBjYW5cbiAgICAvLyBzdXJmYWNlIGl0LiBBIHNlY29uZCAkYnJlYWsgY2FsbCBpbiB0aGUgc2FtZSBzdGFnZSBrZWVwcyB0aGUgRklSU1RcbiAgICAvLyByZWFzb24g4oCUIGZpcnN0LWJyZWFrLXdpbnMg4oCUIG1hdGNoaW5nIHRoZSBcImV4ZWN1dGlvbiBzdG9wcGVkXCIgc3RvcnkuXG4gICAgY29uc3QgYnJlYWtGbiA9IChyZWFzb24/OiBzdHJpbmcpID0+IHtcbiAgICAgIGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQgJiYgYnJlYWtGbGFnLnJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrRmxhZy5yZWFzb24gPSByZWFzb247XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAyYTogU0VMRUNUT1Ig4oCUIHNjb3BlLWJhc2VkIG11bHRpLWNob2ljZSDilIDilIDilIBcbiAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yUmVzdWx0ID0gYXdhaXQgdGhpcy5zZWxlY3RvckhhbmRsZXIuaGFuZGxlU2NvcGVCYXNlZChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcyksXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQhLm5hbWUsIG5vZGUubmV4dCEuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0ISwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJiOiBERUNJREVSIOKAlCBzY29wZS1iYXNlZCBzaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaCDilIDilIDilIBcbiAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSBhd2FpdCB0aGlzLmRlY2lkZXJIYW5kbGVyLnByZXBhcmVEaXNwYXRjaChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gTm8gZGVjaWRlci1sZXZlbCBjb250aW51YXRpb24g4oaSIHRoZSBicmFuY2ggZGlzcGF0Y2ggaXMgYSB0YWlsXG4gICAgICAvLyBjYWxsLiBIYW5kIGl0IHRvIHRoZSBkcml2ZXIgYXMgYSBmbGF0IGhvcCBzbyBsb29wLWhlYXZ5IGRlY2lkZXJcbiAgICAgIC8vIGNoYXJ0cyAoZS5nLiBhZ2VudCBSZUFjdCBsb29wcyB3aXRoIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBzdGF5XG4gICAgICAvLyBmbGF0LXN0YWNrZWQuIFRoZSBpbnZva2VyIHN0YW1wIHByZXNlcnZlcyBQYXVzZVNpZ25hbCBzZW1hbnRpY3Mg4oCUXG4gICAgICAvLyB0aGUgZGVjaWRlciBpcyB0aGUgaW52b2tlciBvZiB3aGF0ZXZlciBwYXVzZXMgaW4gdGhlIGNoYWluLlxuICAgICAgaWYgKCFoYXNOZXh0ICYmIGRpc3BhdGNoLmtpbmQgPT09ICdkaXNwYXRjaCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKGRpc3BhdGNoLmNob3NlbiwgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCwgYnJhbmNoUGF0aCwge1xuICAgICAgICAgIGludm9rZXJTdGFnZUlkOiBub2RlLmlkISxcbiAgICAgICAgICBjb250aW51YXRpb25TdGFnZUlkOiBub2RlLm5leHQ/LmlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVjaWRlciBXSVRIIGl0cyBvd24gbmV4dDogdGhlIGJyYW5jaCBjaGFpbiBtdXN0IGNvbXBsZXRlIEJFRk9SRVxuICAgICAgLy8gdGhlIGRlY2lkZXIncyBjb250aW51YXRpb24gcnVucyDigJQgdHJ1ZSB0cmVlIG5lc3RpbmcsIGtlcHRcbiAgICAgIC8vIHJlY3Vyc2l2ZSAoYSBuZXN0ZWQgZHJpdmVyKS4gTWlycm9ycyBoYW5kbGVTY29wZUJhc2VkIGV4YWN0bHksXG4gICAgICAvLyBpbmNsdWRpbmcgdGhlIFBhdXNlU2lnbmFsIGludm9rZXIgc3RhbXAgb24gYnViYmxlLXVwLlxuICAgICAgbGV0IGRlY2lkZXJSZXN1bHQ6IGFueTtcbiAgICAgIGlmIChkaXNwYXRjaC5raW5kID09PSAnYnJlYWsnKSB7XG4gICAgICAgIGRlY2lkZXJSZXN1bHQgPSBkaXNwYXRjaC5icmFuY2hJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVjaWRlclJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUoZGlzcGF0Y2guY2hvc2VuLCBkaXNwYXRjaC5icmFuY2hDb250ZXh0LCBicmVha0ZsYWcsIGJyYW5jaFBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISwgbm9kZS5uZXh0Py5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGJyYW5jaCBleGVjdXRpb24sIGZvbGxvdyBkZWNpZGVyJ3Mgb3duIG5leHQgKGUuZy4sIGxvb3BUbyB0YXJnZXQpXG4gICAgICBpZiAoaGFzTmV4dCAmJiAhYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGNvbnN0IG5leHROb2RlID0gb3JpZ2luYWxOZXh0ITtcbiAgICAgICAgLy8gVXNlIHRoZSBpc0xvb3BSZWYgZmxhZyBzZXQgYnkgbG9vcFRvKCkg4oCUIGRvIG5vdCByZWx5IG9uIHN0YWdlTWFwIGFic2VuY2UsXG4gICAgICAgIC8vIHNpbmNlIGlkLWtleWVkIHN0YWdlTWFwcyB3b3VsZCBvdGhlcndpc2UgY2F1c2UgbG9vcCB0YXJnZXRzIHRvIGJlIGV4ZWN1dGVkIGRpcmVjdGx5LlxuICAgICAgICBjb25zdCBpc0xvb3BSZWYgPVxuICAgICAgICAgIG5leHROb2RlLmlzTG9vcFJlZiA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICghdGhpcy5nZXRTdGFnZUZuKG5leHROb2RlKSAmJlxuICAgICAgICAgICAgIXRoaXMuZWZmQ2hpbGRyZW4obmV4dE5vZGUpPy5sZW5ndGggJiZcbiAgICAgICAgICAgICFuZXh0Tm9kZS5kZWNpZGVyRm4gJiZcbiAgICAgICAgICAgICFuZXh0Tm9kZS5zZWxlY3RvckZuICYmXG4gICAgICAgICAgICAhdGhpcy5lZmZJc1N1YmZsb3dSb290KG5leHROb2RlKSk7XG5cbiAgICAgICAgaWYgKGlzTG9vcFJlZikge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZVRhcmdldChuZXh0Tm9kZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgIGxldCBzdGFnZU91dHB1dDogVE91dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZHluYW1pY05leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHN0YWdlRnVuYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RhZ2VPdXRwdXQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdGFnZShub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICAvLyBSNSBhdCB0aGUgcnVuLXRpbWUgZG9vcjogYSByZXR1cm5lZCBTdGFnZU5vZGUgYWRvcHRzIGlkcyB0aGUgYnVpbGRlclxuICAgICAgICAvLyBuZXZlciBzYXcuIFJlZnVzZWQgaGVyZSwgaW5zaWRlIHRoZSB0cnksIHNvIGl0IHRha2VzIHRoZSBzdGFnZSdzXG4gICAgICAgIC8vIGVycm9yIHBhdGggKGNvbW1pdCwgb25FcnJvciwgcmV0aHJvdykuXG4gICAgICAgIHRoaXMuYWRtaXREeW5hbWljSWRzKHN0YWdlT3V0cHV0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gUGF1c2VTaWduYWwgaXMgZXhwZWN0ZWQgY29udHJvbCBmbG93LCBub3QgYW4gZXJyb3Ig4oCUIGZpcmUgbmFycmF0aXZlLCBjb21taXQsIHJlLXRocm93LlxuICAgICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUGF1c2Uobm9kZS5uYW1lLCBub2RlLmlkLCBlcnJvci5wYXVzZURhdGEsIGVycm9yLnN1YmZsb3dQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgZXJyb3IudG9TdHJpbmcoKSwgZXJyb3IsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3IgfSk7XG4gICAgICAgIGNvbnRleHQuYWRkRXJyb3IoJ3N0YWdlRXhlY3V0aW9uRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ2xpbmVhcicpO1xuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIC8vIEZvcndhcmQgdGhlIG9wdGlvbmFsIHJlYXNvbiBjYXB0dXJlZCBvbiBicmVha0ZsYWcg4oCUIHNldCBieSB0aGVcbiAgICAgICAgLy8gc3RhZ2UncyAkYnJlYWsocmVhc29uKSBjYWxsIE9SIGJ5IGEgc3ViZmxvdydzIHByb3BhZ2F0ZUJyZWFrLlxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCwgYnJlYWtGbGFnLnJlYXNvbik7XG4gICAgICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDQ6IERZTkFNSUMg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uIOKUgOKUgOKUgFxuICAgICAgaWYgKHN0YWdlT3V0cHV0ICYmIHR5cGVvZiBzdGFnZU91dHB1dCA9PT0gJ29iamVjdCcgJiYgaXNTdGFnZU5vZGVSZXR1cm4oc3RhZ2VPdXRwdXQpKSB7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNOb2RlID0gc3RhZ2VPdXRwdXQgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICAgIGNvbnRleHQuYWRkTG9nKCdpc0R5bmFtaWMnLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNQYXR0ZXJuJywgJ1N0YWdlTm9kZVJldHVybicpO1xuXG4gICAgICAgIC8vIER5bmFtaWMgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvbi4gVGhlIHN1YmZsb3cgbWV0YSBsYW5kcyBpbiB0aGVcbiAgICAgICAgLy8gdHJhdmVyc2VyLWxvY2FsIG92ZXJsYXkgKE5PVCBvbiB0aGUgc2hhcmVkIG5vZGUpOyB0aGUgaW1tZWRpYXRlXG4gICAgICAgIC8vIGV4ZWN1dGVOb2RlIHJlLWVudHJ5IHNlZXMgaXQgdGhyb3VnaCB0aGUgZWZmKiBhY2Nlc3NvcnMgYW5kXG4gICAgICAgIC8vIGNsYXNzaWZpZXMgdGhlIG5vZGUgYXMgYSBzdWJmbG93IG1vdW50IGluIFBoYXNlIDAuXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5pc1N1YmZsb3dSb290ICYmIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYgJiYgZHluYW1pY05vZGUuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNQYXR0ZXJuJywgJ2R5bmFtaWNTdWJmbG93Jyk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNTdWJmbG93SWQnLCBkeW5hbWljTm9kZS5zdWJmbG93SWQpO1xuXG4gICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGR5bmFtaWNOb2RlLnN1YmZsb3dJZCwgZHluYW1pY05vZGUuc3ViZmxvd0RlZiwgbm9kZS5pZCk7XG5cbiAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuc3ViZmxvd01ldGEgPSB7XG4gICAgICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICAgICAgc3ViZmxvd0lkOiBkeW5hbWljTm9kZS5zdWJmbG93SWQsXG4gICAgICAgICAgICBzdWJmbG93TmFtZTogZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICBzdWJmbG93TW91bnRPcHRpb25zOiBkeW5hbWljTm9kZS5zdWJmbG93TW91bnRPcHRpb25zLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZS1lbnRlciBUSElTIG5vZGUgKHNhbWUgY29udGV4dCk6IHRoZSBvdmVybGF5IHBhdGNoIG1ha2VzIHRoZVxuICAgICAgICAgIC8vIG5leHQgc3RlcCBjbGFzc2lmeSBpdCBhcyBhIHN1YmZsb3cgbW91bnQgaW4gUGhhc2UgMC5cbiAgICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBjaGlsZHJlbiBmb3Igc3ViZmxvd0RlZlxuICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGR5bmFtaWNOb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQuaXNTdWJmbG93Um9vdCAmJiBjaGlsZC5zdWJmbG93RGVmICYmIGNoaWxkLnN1YmZsb3dJZCkge1xuICAgICAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoY2hpbGQuc3ViZmxvd0lkLCBjaGlsZC5zdWJmbG93RGVmLCBjaGlsZC5pZCk7XG4gICAgICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgICAgICBjaGlsZC5pZCxcbiAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93SWQhLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIGNoaWxkcmVuIChmb3JrIHBhdHRlcm4pIOKAlCBwYXRjaGVkIGludG8gdGhlIG92ZXJsYXk7XG4gICAgICAgIC8vIFBoYXNlIDUgYmVsb3cgcmVhZHMgdGhlbSBiYWNrIHRocm91Z2ggZWZmQ2hpbGRyZW4vZWZmU2VsZWN0b3IuXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbiAmJiBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5nZXRPckNyZWF0ZVBhdGNoKG5vZGUpLmNoaWxkcmVuID0gZHluYW1pY05vZGUuY2hpbGRyZW47XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNDaGlsZENvdW50JywgZHluYW1pY05vZGUuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZyhcbiAgICAgICAgICAgICdkeW5hbWljQ2hpbGRJZHMnLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuY2hpbGRyZW4ubWFwKChjKSA9PiBjLmlkKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNDaGlsZHJlbihcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvciksXG4gICAgICAgICAgICBCb29sZWFuKGR5bmFtaWNOb2RlLmRlY2lkZXJGbiksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5nZXRPckNyZWF0ZVBhdGNoKG5vZGUpLm5leHROb2RlU2VsZWN0b3IgPSBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICAgICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc1NlbGVjdG9yJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHluYW1pYyBuZXh0IChsaW5lYXIgY29udGludWF0aW9uKSDigJQgc3RheXMgYSBMT0NBTDogaXQgYXBwbGllc1xuICAgICAgICAvLyBvbmx5IHRvIHRoaXMgdmlzaXQgKFBoYXNlIDYgcm91dGVzIGl0IHRocm91Z2ggdGhlXG4gICAgICAgIC8vIENvbnRpbnVhdGlvblJlc29sdmVyKSwgc28gdGhlIHNoYXJlZCBub2RlJ3MgbmV4dCBpcyBuZXZlciB0b3VjaGVkXG4gICAgICAgIC8vIGFuZCBhIGxvb3AgcmV2aXNpdCBuYXR1cmFsbHkgc2VlcyB0aGUgYnVpbHQgY29udGludWF0aW9uLlxuICAgICAgICBpZiAoZHluYW1pY05vZGUubmV4dCkge1xuICAgICAgICAgIGR5bmFtaWNOZXh0ID0gZHluYW1pY05vZGUubmV4dDtcbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY05leHQobm9kZS5pZCwgZHluYW1pY05vZGUubmV4dCk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc0R5bmFtaWNOZXh0JywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFnZU91dHB1dCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNTogQ0hJTERSRU4g4oCUIGZvcmsgZGlzcGF0Y2gg4pSA4pSA4pSAXG4gICAgLy8gUmUtcmVhZCB0aHJvdWdoIHRoZSBvdmVybGF5OiBQaGFzZSA0IG1heSBoYXZlIGp1c3QgcGF0Y2hlZCBkeW5hbWljXG4gICAgLy8gY2hpbGRyZW4vc2VsZWN0b3IgZm9yIFRISVMgdmlzaXQgKG9yIGFuIGVhcmxpZXIgdmlzaXQgaW4gdGhpcyBydW4pLlxuICAgIGNvbnN0IGNoaWxkcmVuQWZ0ZXJTdGFnZSA9IHRoaXMuZWZmQ2hpbGRyZW4obm9kZSk7XG4gICAgY29uc3QgaGFzQ2hpbGRyZW5BZnRlclN0YWdlID0gQm9vbGVhbihjaGlsZHJlbkFmdGVyU3RhZ2U/Lmxlbmd0aCk7XG5cbiAgICBpZiAoaGFzQ2hpbGRyZW5BZnRlclN0YWdlKSB7XG4gICAgICBjb250ZXh0LmFkZExvZygndG90YWxDaGlsZHJlbicsIGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdvcmRlck9mRXhlY3V0aW9uJywgJ0NoaWxkcmVuQWZ0ZXJTdGFnZScpO1xuXG4gICAgICBsZXQgbm9kZUNoaWxkcmVuUmVzdWx0czogUmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+O1xuXG4gICAgICBjb25zdCBlZmZTZWxlY3RvckZuID0gdGhpcy5lZmZTZWxlY3Rvcihub2RlKTtcbiAgICAgIGlmIChlZmZTZWxlY3RvckZuKSB7XG4gICAgICAgIG5vZGVDaGlsZHJlblJlc3VsdHMgPSBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZVNlbGVjdGVkQ2hpbGRyZW4oXG4gICAgICAgICAgZWZmU2VsZWN0b3JGbixcbiAgICAgICAgICBjaGlsZHJlbkFmdGVyU3RhZ2UhLFxuICAgICAgICAgIHN0YWdlT3V0cHV0LFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgYnJhbmNoUGF0aCBhcyBzdHJpbmcsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICBub2RlLmZhaWxGYXN0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hpbGRDb3VudCA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoID8/IDA7XG4gICAgICAgIGNvbnN0IGNoaWxkTmFtZXMgPSBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKS5qb2luKCcsICcpO1xuICAgICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ2NoaWxkcmVuJywgYEV4ZWN1dGluZyBhbGwgJHtjaGlsZENvdW50fSBjaGlsZHJlbiBpbiBwYXJhbGxlbDogJHtjaGlsZE5hbWVzfWAsIHtcbiAgICAgICAgICBjb3VudDogY2hpbGRDb3VudCxcbiAgICAgICAgICB0YXJnZXRTdGFnZTogY2hpbGRyZW5BZnRlclN0YWdlPy5tYXAoKGMpID0+IGMubmFtZSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGVmZk5vZGU6IENoaWxkcmVuRXhlY3V0b3IgcmVhZHMgbm9kZS5jaGlsZHJlbi9ub2RlLmZhaWxGYXN0IGl0c2VsZi5cbiAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlTm9kZUNoaWxkcmVuKFxuICAgICAgICAgIHRoaXMuZWZmTm9kZShub2RlKSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvcmstb25seTogcmV0dXJuIGJ1bmRsZVxuICAgICAgaWYgKCFoYXNOZXh0ICYmICFkeW5hbWljTmV4dCkge1xuICAgICAgICByZXR1cm4gbm9kZUNoaWxkcmVuUmVzdWx0cyE7XG4gICAgICB9XG5cbiAgICAgIC8vIENhcHR1cmUgZHluYW1pYyBjaGlsZHJlbiBhcyBzeW50aGV0aWMgc3ViZmxvdyByZXN1bHQgZm9yIFVJXG4gICAgICBjb25zdCBpc0R5bmFtaWMgPSBjb250ZXh0LmRlYnVnPy5sb2dDb250ZXh0Py5pc0R5bmFtaWM7XG4gICAgICBpZiAoaXNEeW5hbWljICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZSAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZSwgY2hpbGRyZW5BZnRlclN0YWdlLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNjogQ09OVElOVUUg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IOKUgOKUgOKUgFxuICAgIGlmIChkeW5hbWljTmV4dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KGR5bmFtaWNOZXh0LCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgIHJldHVybiB0aGlzLmhvcCh0YXJnZXQubm9kZSwgdGFyZ2V0LmNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgIH1cblxuICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICBjb25zdCBuZXh0Tm9kZSA9IG9yaWdpbmFsTmV4dCE7XG5cbiAgICAgIC8vIERldGVjdCBsb29wIHJlZmVyZW5jZSBub2RlcyBjcmVhdGVkIGJ5IGxvb3BUbygpIOKAlCBtYXJrZWQgd2l0aCBpc0xvb3BSZWYgZmxhZy5cbiAgICAgIC8vIFJvdXRlIHRocm91Z2ggQ29udGludWF0aW9uUmVzb2x2ZXIgZm9yIHByb3BlciBJRCByZXNvbHV0aW9uLCBpdGVyYXRpb25cbiAgICAgIC8vIHRyYWNraW5nLCBhbmQgbmFycmF0aXZlIGdlbmVyYXRpb24uIFRoZSByZXNvbHZlZCB0YXJnZXQgY29tZXMgYmFja1xuICAgICAgLy8gYXMgYSBob3Ag4oCUIGxvb3AgZWRnZXMgY29uc3VtZSBubyBzdGFjaywgc28gdGhlIGl0ZXJhdGlvbiBsaW1pdFxuICAgICAgLy8gKG5vdCBjYWxsLXN0YWNrIGRlcHRoKSBpcyB3aGF0IGJvdW5kcyBhIGxvb3AuXG4gICAgICBjb25zdCBpc0xvb3BSZWZlcmVuY2UgPSBuZXh0Tm9kZS5pc0xvb3BSZWY7XG5cbiAgICAgIGlmIChpc0xvb3BSZWZlcmVuY2UpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uTmV4dChub2RlLm5hbWUsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbmV4dCcsIGBNb3ZpbmcgdG8gJHtuZXh0Tm9kZS5uYW1lfSBzdGFnZWAsIHtcbiAgICAgICAgdGFyZ2V0U3RhZ2U6IG5leHROb2RlLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgIHJldHVybiB0aGlzLmhvcChuZXh0Tm9kZSwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDc6IExFQUYg4oCUIG5vIGNvbnRpbnVhdGlvbiDilIDilIDilIBcbiAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHJpdmF0ZSBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjaGlsZHJlbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSxcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudFN0YWdlSWQgPSBjb250ZXh0LmdldFN0YWdlSWQoKTtcblxuICAgIGNvbnN0IGNoaWxkU3RydWN0dXJlOiBhbnkgPSB7XG4gICAgICBpZDogYCR7bm9kZS5pZH0tY2hpbGRyZW5gLFxuICAgICAgbmFtZTogJ0R5bmFtaWMgQ2hpbGRyZW4nLFxuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLm1hcCgoYykgPT4gKHtcbiAgICAgICAgaWQ6IGMuaWQsXG4gICAgICAgIG5hbWU6IGMubmFtZSxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2hpbGRTdGFnZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgaWYgKGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGRDdHggb2YgY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGNoaWxkQ3R4LmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNoaWxkU3RhZ2VzW3NuYXBzaG90Lm5hbWUgfHwgc25hcHNob3QuaWRdID0ge1xuICAgICAgICAgIG5hbWU6IHNuYXBzaG90Lm5hbWUsXG4gICAgICAgICAgb3V0cHV0OiBzbmFwc2hvdC5sb2dzLFxuICAgICAgICAgIGVycm9yczogc25hcHNob3QuZXJyb3JzLFxuICAgICAgICAgIG1ldHJpY3M6IHNuYXBzaG90Lm1ldHJpY3MsXG4gICAgICAgICAgc3RhdHVzOiBzbmFwc2hvdC5lcnJvcnMgJiYgT2JqZWN0LmtleXMoc25hcHNob3QuZXJyb3JzKS5sZW5ndGggPiAwID8gJ2Vycm9yJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLnNldChub2RlLmlkLCB7XG4gICAgICBzdWJmbG93SWQ6IG5vZGUuaWQsXG4gICAgICBzdWJmbG93TmFtZTogbm9kZS5uYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDoge30sXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IGNoaWxkU3RhZ2VzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IFtdLFxuICAgICAgICBpbml0aWFsU3RhdGU6IHt9LFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQsXG4gICAgICBwaXBlbGluZVN0cnVjdHVyZTogY2hpbGRTdHJ1Y3R1cmUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBnZW5lcmF0ZWQgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoIGFzIGEgc3ViZmxvdyDigJQgT1ZFUldSSVRJTkdcbiAgICogYW55IHJlZ2lzdHJhdGlvbiBmcm9tIGEgcHJldmlvdXMgdmlzaXQuXG4gICAqXG4gICAqIERlbGliZXJhdGUgZGl2ZXJnZW5jZSBmcm9tIGBhdXRvUmVnaXN0ZXJTdWJmbG93RGVmYCdzIGZpcnN0LXdyaXRlLXdpbnMuXG4gICAqIEdlbmVyYXRlZCBzZWdtZW50cyBhcmUgc3RhYmxlIGFjcm9zcyBsb29wIGl0ZXJhdGlvbnMgKGA8c3RhZ2VJZD5+PGluZGV4PmBcbiAgICogaXMgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZCBhbmQgdGhlIGJyYW5jaCBpbmRleCwgbmVpdGhlciBvZiB3aGljaFxuICAgKiBjaGFuZ2VzKSwgc28gZmlyc3Qtd3JpdGUtd2lucyB3b3VsZCBtZWFuIGEgTE9PUElORyBmYW4tb3V0IHNpbGVudGx5XG4gICAqIHJlLWV4ZWN1dGluZyBpdGVyYXRpb24gMSdzIGJyYW5jaCBjaGFydHMgZm9yZXZlciDigJQgZXZlbiB3aGVuIHRoZSBicmFuY2hcbiAgICogZmFjdG9yeSByZXR1cm5zIGEgZGlmZmVyZW50IGNoYXJ0IGVhY2ggdGltZS4gVGhhdCBpcyB0aGUgXCJ3b3VsZCBub3QgY3Jhc2gsXG4gICAqIHdvdWxkIHNpbGVudGx5IGNvcnJ1cHRcIiBmYWlsdXJlIGNsYXNzIHRoaXMgd2hvbGUgZGVzaWduIGlzIGJ1aWx0IHRvIGF2b2lkLFxuICAgKiBzbyBhIHJlZ2VuZXJhdGVkIGJyYW5jaCBhbHdheXMgcmVwbGFjZXMgaXRzIHByZWRlY2Vzc29yLiBQZXItaXRlcmF0aW9uXG4gICAqIHJlc3VsdHMgc3RheSBhZGRyZXNzYWJsZSB2aWEgdGhlIG1vdW50J3MgYHJ1bnRpbWVTdGFnZUlkYCBrZXksIGV4YWN0bHkgYXNcbiAgICogZm9yIGEgaGFuZC1hdXRob3JlZCBsb29waW5nIHN1YmZsb3cuXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyQnJhbmNoU3ViZmxvdyhcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjaGFydDogeyBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+Pjsgc3ViZmxvd3M/OiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZSB9PiB9LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnN1YmZsb3dzW3N1YmZsb3dJZF0gPSB7IHJvb3QgfTtcblxuICAgIC8vIFN0YWdlIGZ1bmN0aW9ucyBsYW5kIHVuZGVyIHRoZSBicmFuY2gncyBwcmVmaXgsIG1hdGNoaW5nIHRoZSBwcmVmaXhlZCBpZHMuXG4gICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgY2hhcnQuc3RhZ2VNYXApIHtcbiAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KGpvaW5QYXRoKHN1YmZsb3dJZCwga2V5KSwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcbiAgICB9XG5cbiAgICAvLyBOZXN0ZWQgc3ViZmxvd3MgaW5zaWRlIHRoZSBicmFuY2ggY2hhcnQsIHNhbWUgcHJlZml4aW5nLlxuICAgIGlmIChjaGFydC5zdWJmbG93cykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGNoYXJ0LnN1YmZsb3dzKSkge1xuICAgICAgICAvLyBQcmVmaXhlZCBsaWtlIHRoZSBidWlsZGVyJ3MgYF9tZXJnZVN1YmZsb3dzYCAoOS4zNy4wIGZpeCk6IHdpdGhvdXQgaXRcbiAgICAgICAgLy8gZXZlcnkgYnJhbmNoIHJhbiBpdHMgbmVzdGVkIHN1YmZsb3cncyBzdGFnZXMgdW5kZXIgT05FIGlkLlxuICAgICAgICB0aGlzLnN1YmZsb3dzW2pvaW5QYXRoKHN1YmZsb3dJZCwga2V5KV0gPSB7XG4gICAgICAgICAgcm9vdDogcHJlZml4Tm9kZVRyZWUoKGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0pLnJvb3QsIHN1YmZsb3dJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWZpeCBhIG5vZGUgdHJlZSB3aXRoIGEgc3ViZmxvdyBwYXRoIHNlZ21lbnQgYXQgUlVOIHRpbWUgKGxhenkgc3ViZmxvd3MsXG4gICAqIHRoZSBnZW5lcmF0ZWQgYnJhbmNoZXMgb2YgYGFkZFBhcmFsbGVsRm9yRWFjaGApIOKAlCB0aGUgb25lIHByZWZpeGVyLFxuICAgKiBgZW5naW5lL2dyYXBoL3ByZWZpeE5vZGVUcmVlLnRzYCwgd2hpY2ggdGhlIGJ1aWxkZXIgY2FsbHMgYXQgbW91bnQgdGltZS5cbiAgICovXG4gIHByaXZhdGUgcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiBwcmVmaXhOb2RlVHJlZShub2RlLCBwcmVmaXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvUmVnaXN0ZXJTdWJmbG93RGVmKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dEZWY6IE5vbk51bGxhYmxlPFN0YWdlTm9kZVsnc3ViZmxvd0RlZiddPixcbiAgICBtb3VudE5vZGVJZD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gdGhpcy5zdWJmbG93cyBpcyBhbHdheXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yOyB0aGUgbnVsbCBndWFyZCBiZWxvdyBpcyB1bnJlYWNoYWJsZS5cbiAgICBjb25zdCBzdWJmbG93c0RpY3QgPSB0aGlzLnN1YmZsb3dzO1xuXG4gICAgLy8gRmlyc3Qtd3JpdGUtd2luc1xuICAgIGNvbnN0IGlzTmV3UmVnaXN0cmF0aW9uID0gIXN1YmZsb3dzRGljdFtzdWJmbG93SWRdO1xuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbiAmJiBzdWJmbG93RGVmLnJvb3QpIHtcbiAgICAgIHN1YmZsb3dzRGljdFtzdWJmbG93SWRdID0ge1xuICAgICAgICByb290OiBzdWJmbG93RGVmLnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgICAgIC4uLihzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSA/IHsgYnVpbGRUaW1lU3RydWN0dXJlOiBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSB9IDoge30pLFxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugc3RhZ2VNYXAgZW50cmllcyAocGFyZW50IGVudHJpZXMgcHJlc2VydmVkKVxuICAgIGlmIChzdWJmbG93RGVmLnN0YWdlTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBBcnJheS5mcm9tKHN1YmZsb3dEZWYuc3RhZ2VNYXAuZW50cmllcygpKSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICB0aGlzLnN0YWdlTWFwLnNldChrZXksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZXJnZSBuZXN0ZWQgc3ViZmxvd3NcbiAgICBpZiAoc3ViZmxvd0RlZi5zdWJmbG93cykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmZsb3dEZWYuc3ViZmxvd3MpKSB7XG4gICAgICAgIGlmICghc3ViZmxvd3NEaWN0W2tleV0pIHtcbiAgICAgICAgICBzdWJmbG93c0RpY3Rba2V5XSA9IGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW91bnROb2RlSWQpIHtcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbW91bnROb2RlSWQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUsXG4gICAgICAgIHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOb3RpZnkgRmxvd1JlY29yZGVycyBvbmx5IG9uIGZpcnN0IHJlZ2lzdHJhdGlvbiAobWF0Y2hlcyBmaXJzdC13cml0ZS13aW5zKVxuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbikge1xuICAgICAgY29uc3Qgc3ViZmxvd05hbWUgPSBzdWJmbG93RGVmLnJvb3Q/LnN1YmZsb3dOYW1lIHx8IHN1YmZsb3dEZWYucm9vdD8ubmFtZSB8fCBzdWJmbG93SWQ7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dSZWdpc3RlcmVkKFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgICBzdWJmbG93RGVmLnJvb3Q/LmRlc2NyaXB0aW9uLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=