footprintjs 10.0.1 → 10.2.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 (368) hide show
  1. package/AGENTS.md +2 -1
  2. package/CLAUDE.md +61 -7
  3. package/README.md +136 -312
  4. package/dist/esm/index.d.ts +62 -2
  5. package/dist/esm/index.js +13 -6
  6. package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
  7. package/dist/esm/lib/attempt/anySignal.js +39 -0
  8. package/dist/esm/lib/attempt/call.d.ts +88 -0
  9. package/dist/esm/lib/attempt/call.js +129 -0
  10. package/dist/esm/lib/attempt/category.d.ts +37 -0
  11. package/dist/esm/lib/attempt/category.js +131 -0
  12. package/dist/esm/lib/attempt/correlation.d.ts +95 -0
  13. package/dist/esm/lib/attempt/correlation.js +178 -0
  14. package/dist/esm/lib/attempt/deadline.d.ts +44 -0
  15. package/dist/esm/lib/attempt/deadline.js +101 -0
  16. package/dist/esm/lib/attempt/decision.d.ts +52 -0
  17. package/dist/esm/lib/attempt/decision.js +134 -0
  18. package/dist/esm/lib/attempt/effect.d.ts +76 -0
  19. package/dist/esm/lib/attempt/effect.js +160 -0
  20. package/dist/esm/lib/attempt/errors.d.ts +41 -0
  21. package/dist/esm/lib/attempt/errors.js +44 -0
  22. package/dist/esm/lib/attempt/index.d.ts +18 -0
  23. package/dist/esm/lib/attempt/index.js +15 -0
  24. package/dist/esm/lib/attempt/name.d.ts +21 -0
  25. package/dist/esm/lib/attempt/name.js +43 -0
  26. package/dist/esm/lib/attempt/observed.d.ts +66 -0
  27. package/dist/esm/lib/attempt/observed.js +171 -0
  28. package/dist/esm/lib/attempt/policy.d.ts +45 -0
  29. package/dist/esm/lib/attempt/policy.js +83 -0
  30. package/dist/esm/lib/attempt/record.d.ts +11 -0
  31. package/dist/esm/lib/attempt/record.js +24 -0
  32. package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
  33. package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
  34. package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
  35. package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
  36. package/dist/esm/lib/attempt/runner.d.ts +157 -0
  37. package/dist/esm/lib/attempt/runner.js +523 -0
  38. package/dist/esm/lib/attempt/standalone.d.ts +47 -0
  39. package/dist/esm/lib/attempt/standalone.js +126 -0
  40. package/dist/esm/lib/attempt/types.d.ts +453 -0
  41. package/dist/esm/lib/attempt/types.js +16 -0
  42. package/dist/esm/lib/budget/index.d.ts +9 -0
  43. package/dist/esm/lib/budget/index.js +9 -0
  44. package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
  45. package/dist/esm/lib/budget/timeBudget.js +666 -0
  46. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
  47. package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
  48. package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
  49. package/dist/esm/lib/builder/retryLoop.js +283 -0
  50. package/dist/esm/lib/builder/types.d.ts +35 -1
  51. package/dist/esm/lib/builder/types.js +1 -1
  52. package/dist/esm/lib/decide/decide.js +2 -2
  53. package/dist/esm/lib/decide/index.d.ts +1 -1
  54. package/dist/esm/lib/decide/index.js +2 -2
  55. package/dist/esm/lib/decide/types.d.ts +3 -0
  56. package/dist/esm/lib/decide/types.js +1 -8
  57. package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
  58. package/dist/esm/lib/engine/graph/StageNode.js +1 -1
  59. package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
  60. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  61. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  62. package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
  63. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  64. package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
  65. package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
  66. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
  67. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  68. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  69. package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
  70. package/dist/esm/lib/engine/handlers/stageError.js +23 -1
  71. package/dist/esm/lib/engine/index.d.ts +2 -2
  72. package/dist/esm/lib/engine/index.js +1 -1
  73. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  74. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
  75. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  76. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  77. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  78. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
  79. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  80. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  81. package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  82. package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
  83. package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
  84. package/dist/esm/lib/engine/narrative/index.js +1 -1
  85. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  86. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  87. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  88. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  89. package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
  90. package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
  91. package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
  92. package/dist/esm/lib/engine/narrative/types.js +1 -1
  93. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  94. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
  95. package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
  96. package/dist/esm/lib/engine/traversalContext.js +6 -3
  97. package/dist/esm/lib/engine/types.d.ts +52 -57
  98. package/dist/esm/lib/engine/types.js +1 -1
  99. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  100. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  101. package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
  102. package/dist/esm/lib/filter/evaluator.js +135 -0
  103. package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
  104. package/dist/esm/lib/ids/idempotencyKey.js +24 -0
  105. package/dist/esm/lib/memory/StageContext.d.ts +123 -3
  106. package/dist/esm/lib/memory/StageContext.js +245 -4
  107. package/dist/esm/lib/memory/attention.d.ts +26 -0
  108. package/dist/esm/lib/memory/attention.js +171 -0
  109. package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
  110. package/dist/esm/lib/memory/borrowedMutation.js +14 -1
  111. package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
  112. package/dist/esm/lib/memory/frameTypes.js +3 -1
  113. package/dist/esm/lib/memory/redaction.d.ts +12 -0
  114. package/dist/esm/lib/memory/redaction.js +54 -5
  115. package/dist/esm/lib/pause/record.js +10 -1
  116. package/dist/esm/lib/pause/types.d.ts +19 -0
  117. package/dist/esm/lib/pause/types.js +17 -1
  118. package/dist/esm/lib/reactive/createTypedScope.js +3 -1
  119. package/dist/esm/lib/reactive/types.d.ts +36 -4
  120. package/dist/esm/lib/reactive/types.js +3 -1
  121. package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
  122. package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
  123. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
  124. package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
  125. package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
  126. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  127. package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
  128. package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
  129. package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
  130. package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
  131. package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
  132. package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
  133. package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
  134. package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
  135. package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
  136. package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
  137. package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  138. package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
  139. package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
  140. package/dist/esm/lib/recorder/attemptOTel.js +107 -0
  141. package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
  142. package/dist/esm/lib/recorder/attemptSeries.js +103 -0
  143. package/dist/esm/lib/recorder/hooks.d.ts +9 -0
  144. package/dist/esm/lib/recorder/hooks.js +4 -1
  145. package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
  146. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
  147. package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
  148. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
  149. package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
  150. package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
  151. package/dist/esm/lib/runner/RunnableChart.js +5 -1
  152. package/dist/esm/lib/runner/attach.d.ts +2 -1
  153. package/dist/esm/lib/runner/attach.js +8 -2
  154. package/dist/esm/lib/runner/checkpoint.js +3 -1
  155. package/dist/esm/lib/runner/deadline.d.ts +42 -0
  156. package/dist/esm/lib/runner/deadline.js +90 -0
  157. package/dist/esm/lib/runner/index.d.ts +3 -1
  158. package/dist/esm/lib/runner/index.js +2 -1
  159. package/dist/esm/lib/runner/options.d.ts +17 -0
  160. package/dist/esm/lib/runner/options.js +3 -1
  161. package/dist/esm/lib/runner/recordSink.d.ts +128 -0
  162. package/dist/esm/lib/runner/recordSink.js +296 -0
  163. package/dist/esm/lib/runner/resume.d.ts +3 -0
  164. package/dist/esm/lib/runner/resume.js +22 -2
  165. package/dist/esm/lib/runner/snapshot.d.ts +2 -2
  166. package/dist/esm/lib/runner/snapshot.js +6 -2
  167. package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
  168. package/dist/esm/lib/scope/ScopeFacade.js +304 -7
  169. package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  170. package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
  171. package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  172. package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
  173. package/dist/esm/lib/scope/runtime.d.ts +3 -0
  174. package/dist/esm/lib/scope/runtime.js +1 -1
  175. package/dist/esm/lib/scope/types.d.ts +6 -0
  176. package/dist/esm/lib/scope/types.js +1 -1
  177. package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
  178. package/dist/esm/lib/sinks/fileSink.js +387 -0
  179. package/dist/esm/recorders.d.ts +8 -2
  180. package/dist/esm/recorders.js +7 -1
  181. package/dist/esm/sinks.d.ts +23 -0
  182. package/dist/esm/sinks.js +23 -0
  183. package/dist/esm/trace.d.ts +2 -2
  184. package/dist/esm/trace.js +1 -1
  185. package/dist/index.js +77 -60
  186. package/dist/lib/attempt/anySignal.js +43 -0
  187. package/dist/lib/attempt/call.js +134 -0
  188. package/dist/lib/attempt/category.js +136 -0
  189. package/dist/lib/attempt/correlation.js +186 -0
  190. package/dist/lib/attempt/deadline.js +112 -0
  191. package/dist/lib/attempt/decision.js +139 -0
  192. package/dist/lib/attempt/effect.js +174 -0
  193. package/dist/lib/attempt/errors.js +49 -0
  194. package/dist/lib/attempt/index.js +26 -0
  195. package/dist/lib/attempt/name.js +48 -0
  196. package/dist/lib/attempt/observed.js +177 -0
  197. package/dist/lib/attempt/policy.js +92 -0
  198. package/dist/lib/attempt/record.js +29 -0
  199. package/dist/lib/attempt/retryLoopContext.js +31 -0
  200. package/dist/lib/attempt/retryLoopTypes.js +3 -0
  201. package/dist/lib/attempt/runner.js +530 -0
  202. package/dist/lib/attempt/standalone.js +130 -0
  203. package/dist/lib/attempt/types.js +17 -0
  204. package/dist/lib/budget/index.js +17 -0
  205. package/dist/lib/budget/timeBudget.js +674 -0
  206. package/dist/lib/builder/FlowChartBuilder.js +199 -9
  207. package/dist/lib/builder/retryLoop.js +287 -0
  208. package/dist/lib/builder/types.js +1 -1
  209. package/dist/lib/decide/decide.js +2 -2
  210. package/dist/lib/decide/index.js +2 -2
  211. package/dist/lib/decide/types.js +1 -8
  212. package/dist/lib/engine/graph/StageNode.js +1 -1
  213. package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
  214. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  215. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  216. package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
  217. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  218. package/dist/lib/engine/handlers/StageRunner.js +36 -9
  219. package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
  220. package/dist/lib/engine/handlers/commitStage.js +24 -5
  221. package/dist/lib/engine/handlers/stageError.js +26 -2
  222. package/dist/lib/engine/index.js +1 -1
  223. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
  224. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  225. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
  226. package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  227. package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
  228. package/dist/lib/engine/narrative/index.js +1 -1
  229. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  230. package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  231. package/dist/lib/engine/narrative/recorders/index.js +1 -1
  232. package/dist/lib/engine/narrative/types.js +1 -1
  233. package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
  234. package/dist/lib/engine/traversalContext.js +6 -3
  235. package/dist/lib/engine/types.js +1 -1
  236. package/dist/lib/errors/terminalFailure.js +64 -0
  237. package/dist/lib/filter/evaluator.js +139 -0
  238. package/dist/lib/ids/idempotencyKey.js +28 -0
  239. package/dist/lib/memory/StageContext.js +246 -5
  240. package/dist/lib/memory/attention.js +175 -0
  241. package/dist/lib/memory/borrowedMutation.js +16 -2
  242. package/dist/lib/memory/frameTypes.js +3 -1
  243. package/dist/lib/memory/redaction.js +54 -5
  244. package/dist/lib/pause/record.js +10 -1
  245. package/dist/lib/pause/types.js +17 -1
  246. package/dist/lib/reactive/createTypedScope.js +3 -1
  247. package/dist/lib/reactive/types.js +3 -1
  248. package/dist/lib/recorder/AttemptRecorder.js +417 -0
  249. package/dist/lib/recorder/ControlDepRecorder.js +50 -2
  250. package/dist/lib/recorder/EmitRecorder.js +1 -1
  251. package/dist/lib/recorder/InOutRecorder.js +75 -6
  252. package/dist/lib/recorder/QualityRecorder.js +87 -29
  253. package/dist/lib/recorder/TopologyRecorder.js +76 -2
  254. package/dist/lib/recorder/attemptMetricRows.js +209 -0
  255. package/dist/lib/recorder/attemptMetrics.js +174 -0
  256. package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
  257. package/dist/lib/recorder/attemptOTel.js +111 -0
  258. package/dist/lib/recorder/attemptSeries.js +113 -0
  259. package/dist/lib/recorder/hooks.js +4 -1
  260. package/dist/lib/runner/DeferredObserverTier.js +13 -1
  261. package/dist/lib/runner/ExecutionRuntime.js +57 -5
  262. package/dist/lib/runner/FlowChartExecutor.js +330 -101
  263. package/dist/lib/runner/RunnableChart.js +5 -1
  264. package/dist/lib/runner/attach.js +8 -2
  265. package/dist/lib/runner/checkpoint.js +3 -1
  266. package/dist/lib/runner/deadline.js +94 -0
  267. package/dist/lib/runner/index.js +4 -2
  268. package/dist/lib/runner/options.js +3 -1
  269. package/dist/lib/runner/recordSink.js +302 -0
  270. package/dist/lib/runner/resume.js +22 -2
  271. package/dist/lib/runner/snapshot.js +6 -2
  272. package/dist/lib/scope/ScopeFacade.js +303 -6
  273. package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
  274. package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
  275. package/dist/lib/scope/runtime.js +1 -1
  276. package/dist/lib/scope/types.js +1 -1
  277. package/dist/lib/sinks/fileSink.js +392 -0
  278. package/dist/recorders.js +10 -2
  279. package/dist/sinks.js +32 -0
  280. package/dist/trace.js +1 -1
  281. package/dist/types/index.d.ts +62 -2
  282. package/dist/types/lib/attempt/anySignal.d.ts +19 -0
  283. package/dist/types/lib/attempt/call.d.ts +88 -0
  284. package/dist/types/lib/attempt/category.d.ts +37 -0
  285. package/dist/types/lib/attempt/correlation.d.ts +95 -0
  286. package/dist/types/lib/attempt/deadline.d.ts +44 -0
  287. package/dist/types/lib/attempt/decision.d.ts +52 -0
  288. package/dist/types/lib/attempt/effect.d.ts +76 -0
  289. package/dist/types/lib/attempt/errors.d.ts +41 -0
  290. package/dist/types/lib/attempt/index.d.ts +18 -0
  291. package/dist/types/lib/attempt/name.d.ts +21 -0
  292. package/dist/types/lib/attempt/observed.d.ts +66 -0
  293. package/dist/types/lib/attempt/policy.d.ts +45 -0
  294. package/dist/types/lib/attempt/record.d.ts +11 -0
  295. package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
  296. package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
  297. package/dist/types/lib/attempt/runner.d.ts +157 -0
  298. package/dist/types/lib/attempt/standalone.d.ts +47 -0
  299. package/dist/types/lib/attempt/types.d.ts +453 -0
  300. package/dist/types/lib/budget/index.d.ts +9 -0
  301. package/dist/types/lib/budget/timeBudget.d.ts +136 -0
  302. package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
  303. package/dist/types/lib/builder/retryLoop.d.ts +56 -0
  304. package/dist/types/lib/builder/types.d.ts +35 -1
  305. package/dist/types/lib/decide/index.d.ts +1 -1
  306. package/dist/types/lib/decide/types.d.ts +3 -0
  307. package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
  308. package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
  309. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  310. package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
  311. package/dist/types/lib/engine/index.d.ts +2 -2
  312. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  313. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  314. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  315. package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  316. package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  317. package/dist/types/lib/engine/narrative/index.d.ts +2 -2
  318. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  319. package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  320. package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
  321. package/dist/types/lib/engine/narrative/types.d.ts +74 -5
  322. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  323. package/dist/types/lib/engine/traversalContext.d.ts +7 -2
  324. package/dist/types/lib/engine/types.d.ts +52 -57
  325. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  326. package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
  327. package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
  328. package/dist/types/lib/memory/StageContext.d.ts +123 -3
  329. package/dist/types/lib/memory/attention.d.ts +26 -0
  330. package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
  331. package/dist/types/lib/memory/frameTypes.d.ts +38 -0
  332. package/dist/types/lib/memory/redaction.d.ts +12 -0
  333. package/dist/types/lib/pause/types.d.ts +19 -0
  334. package/dist/types/lib/reactive/types.d.ts +36 -4
  335. package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
  336. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
  337. package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
  338. package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
  339. package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
  340. package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
  341. package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
  342. package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
  343. package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  344. package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
  345. package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
  346. package/dist/types/lib/recorder/hooks.d.ts +9 -0
  347. package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
  348. package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
  349. package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
  350. package/dist/types/lib/runner/attach.d.ts +2 -1
  351. package/dist/types/lib/runner/deadline.d.ts +42 -0
  352. package/dist/types/lib/runner/index.d.ts +3 -1
  353. package/dist/types/lib/runner/options.d.ts +17 -0
  354. package/dist/types/lib/runner/recordSink.d.ts +128 -0
  355. package/dist/types/lib/runner/resume.d.ts +3 -0
  356. package/dist/types/lib/runner/snapshot.d.ts +2 -2
  357. package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
  358. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  359. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  360. package/dist/types/lib/scope/runtime.d.ts +3 -0
  361. package/dist/types/lib/scope/types.d.ts +6 -0
  362. package/dist/types/lib/sinks/fileSink.d.ts +135 -0
  363. package/dist/types/recorders.d.ts +8 -2
  364. package/dist/types/sinks.d.ts +23 -0
  365. package/dist/types/trace.d.ts +2 -2
  366. package/package.json +20 -6
  367. package/dist/esm/lib/decide/evaluator.js +0 -130
  368. package/dist/lib/decide/evaluator.js +0 -134
@@ -17,6 +17,13 @@
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.ScopeFacade = void 0;
19
19
  const foottrace_1 = require("foottrace");
20
+ const call_js_1 = require("../attempt/call.js");
21
+ const effect_js_1 = require("../attempt/effect.js");
22
+ const name_js_1 = require("../attempt/name.js");
23
+ const observed_js_1 = require("../attempt/observed.js");
24
+ const policy_js_1 = require("../attempt/policy.js");
25
+ const retryLoopContext_js_1 = require("../attempt/retryLoopContext.js");
26
+ const runner_js_1 = require("../attempt/runner.js");
20
27
  const circular_js_1 = require("../capture/circular.js");
21
28
  const spawn_js_1 = require("../detach/spawn.js");
22
29
  const devMode_js_1 = require("../devMode.js");
@@ -72,6 +79,28 @@ class ScopeFacade {
72
79
  * tree and this stays unset; see {@link rule}.
73
80
  */
74
81
  _localRule;
82
+ /**
83
+ * The run's correlation (10.1), installed by the executor's composed scope factory
84
+ * (`RunObservers · composeScopeFactory`) — stamped LAST on every scope and emit event this facade fires,
85
+ * only when present, so a run without one fires byte-identical events.
86
+ */
87
+ _correlation;
88
+ /**
89
+ * The attempt this facade was built for (P1b) — the runner's, read off the
90
+ * context at construction. A facade is ONE attempt's handle: once that
91
+ * attempt ends without an answer (its cap, the deadline, a cancellation, a
92
+ * throw), the function behind it may still be running, and anything it
93
+ * touches through this facade is refused ({@link refuseIfAttemptEnded}) —
94
+ * a write or an emit is also recorded on the stage. Absent for a stage the
95
+ * runner does not run: nothing is fenced, as before.
96
+ */
97
+ _attempt;
98
+ /** The run's signal, for `$attempt()` of a stage the runner does not run. */
99
+ _runSignal;
100
+ /** `$call`s with `of > 1` in flight through this facade — a keyless touching call inside one is refused (P3). */
101
+ _retryingCalls = 0;
102
+ /** This attempt's observed reports, grouped into series (P2) — made on the first report. */
103
+ _observedBook;
75
104
  constructor(context, stageName, readOnlyValues, executionEnv) {
76
105
  this._stageContext = context;
77
106
  this._stageName = stageName;
@@ -80,6 +109,8 @@ class ScopeFacade {
80
109
  this._executionEnv = Object.freeze({ ...executionEnv });
81
110
  this._hasArgs = Object.keys(this._frozenArgs).length > 0;
82
111
  this._hasEnv = Object.keys(this._executionEnv).length > 0;
112
+ this._attempt = context.attempt;
113
+ this._runSignal = context.runSignal;
83
114
  // The context must carry the rule BEFORE the first write, since the
84
115
  // context's write funnel is what marks a per-call redacted key on it.
85
116
  // Under an executor the context already has the run's rule (installed on
@@ -136,6 +167,14 @@ class ScopeFacade {
136
167
  useRedactionPolicy(policy) {
137
168
  this.rule.setPolicy(policy);
138
169
  }
170
+ /**
171
+ * Install the run's correlation — every scope and emit event this facade fires carries it; `undefined` clears
172
+ * it. Engine-only (the composed scope factory calls it once per stage), like `useRedactionPolicy`.
173
+ * @internal
174
+ */
175
+ useCorrelation(correlation) {
176
+ this._correlation = correlation;
177
+ }
139
178
  /** @internal */
140
179
  getRedactionPolicy() {
141
180
  return this.rule.getPolicy();
@@ -220,11 +259,240 @@ class ScopeFacade {
220
259
  * stage the handle came from; the engine's error path attributes the throw
221
260
  * to the stage that made the write.
222
261
  */
223
- assertLive(key) {
262
+ assertLive(key, channel = 'state') {
263
+ this.refuseIfAttemptEnded(key, channel);
224
264
  if (this._committed) {
225
265
  throw new Error((0, borrowedMutation_js_1.deadFrameMessage)(this._stageName, this._stageContext.runtimeStageId, key));
226
266
  }
227
267
  }
268
+ /**
269
+ * The attempt fence (P1b): this facade's attempt has ended, so whatever the
270
+ * abandoned function does now must not reach the stage — not its buffer, its
271
+ * reads, its untracked sources or a recorder. Refused; a write or an emit is
272
+ * recorded on the stage first (`StageSnapshot.lateWrites`, the name only),
273
+ * a read (`channel` undefined) is not.
274
+ */
275
+ refuseIfAttemptEnded(key, channel) {
276
+ const attempt = this._attempt;
277
+ if (attempt === undefined || !this._stageContext.hasAttemptEnded(attempt.attempt))
278
+ return;
279
+ if (channel !== undefined)
280
+ this._stageContext.recordLateWrite({ attempt: attempt.attempt, key, channel });
281
+ throw new Error((0, borrowedMutation_js_1.lateAttemptMessage)(this._stageName, attempt.series, attempt.attempt, key));
282
+ }
283
+ /**
284
+ * The attempt this stage function runs in — `scope.$attempt()` (design
285
+ * §3.1). Its `signal` aborts when the attempt must stop (its cap, the run's
286
+ * deadline, a cancellation): pass it to `fetch` and SDK calls. Its
287
+ * `timeLeftMs()` reads the run's deadline — time is an input the record
288
+ * cannot replay, so with a deadline the read marks the stage's commit
289
+ * `untrackedSources: ['env']`, as `getEnv()` does.
290
+ *
291
+ * A stage the attempt runner does not run (no retry policy, no `timeoutMs`,
292
+ * no deadline) is attempt 1 of 1, with the run's signal and `Infinity` left.
293
+ *
294
+ * ```typescript
295
+ * const t = scope.$attempt();
296
+ * const res = await fetch(url, { signal: t.signal });
297
+ * if (t.timeLeftMs() < 1_000) scope.summary = 'partial';
298
+ * ```
299
+ */
300
+ getAttempt() {
301
+ const attempt = this._attempt;
302
+ const observed = (report) => this.recordObserved(report);
303
+ if (attempt === undefined) {
304
+ return Object.freeze({
305
+ series: this._stageContext.runtimeStageId,
306
+ attempt: 1,
307
+ of: 1,
308
+ signal: this._runSignal ?? NEVER_ABORTED,
309
+ timeLeftMs: () => Infinity,
310
+ observed,
311
+ });
312
+ }
313
+ this.refuseIfAttemptEnded('$attempt');
314
+ const context = this._stageContext;
315
+ return Object.freeze({
316
+ ...attempt,
317
+ timeLeftMs: () => {
318
+ // Read through a handle held past its attempt, it must not mark a LATER attempt's commit.
319
+ this.refuseIfAttemptEnded('$attempt');
320
+ if (attempt.deadline !== undefined)
321
+ context.markUntrackedSource('env');
322
+ return attempt.timeLeftMs();
323
+ },
324
+ observed,
325
+ });
326
+ }
327
+ /**
328
+ * A call to an outside system, made inside this stage — `scope.$call(target, fn, policy?)` (design §3.6, P2).
329
+ * `fn` runs on the attempt runner under `policy` (none = ONE attempt, still recorded: a single call is evidence
330
+ * too), and every attempt is an `AttemptRecord` of kind `'call'` on this stage's execution-tree node and on
331
+ * `onAttempt` — its timing, outcome, failure category and the retry-or-stop decision, its error served under the
332
+ * run's redaction rule.
333
+ *
334
+ * The call lives within this stage attempt: it is capped by the time the attempt has left (its cap, the run's
335
+ * deadline) and `fn`'s `signal` aborts when the attempt does; once the attempt is over nothing of the call lands
336
+ * and no further attempt of it starts (`attempt/call.ts`). `target` is a NAME from code — never a value.
337
+ *
338
+ * ```typescript
339
+ * const quote = await scope.$call('stripe.quotes.create', (t) => stripe.quotes.create(body, { signal: t.signal }),
340
+ * { attempts: 3, timeoutMs: 10_000, backoffMs: (n) => 500 * n });
341
+ * ```
342
+ *
343
+ * A call that CHANGES an outside system declares it (P3): `options.touches` names the system and
344
+ * `options.idempotencyKey` the key every attempt is made under (`t.idempotencyKey`) — a value from the stage's
345
+ * input or state, never from model output. A touching call that may retry without a key is refused here,
346
+ * before anything is sent; each record says what its attempt did (`effect`), and a call that ends without an answer after any attempt left the
347
+ * effect unknown rejects with `UnknownEffectError` — reconcile by the key, do not retry blindly.
348
+ */
349
+ call(target, fn, policy, options) {
350
+ const name = (0, name_js_1.admitAttemptName)('$call', 'target', target);
351
+ const where = `$call('${name}')`;
352
+ if (typeof fn !== 'function')
353
+ throw new TypeError(`${where}: fn must be a function`);
354
+ const admitted = (0, policy_js_1.admitCallPolicy)(where, policy);
355
+ const touches = (0, effect_js_1.callTouches)(where, options, admitted);
356
+ // A keyless touching call is sent once only if the stage attempt that makes it never runs again (P3): a stage
357
+ // that may retry would re-send it without a key — refused here, before anything is sent.
358
+ // So is one inside an enclosing `$call` that may retry (its function runs once per outer attempt).
359
+ if (touches !== undefined && touches.idempotencyKey === undefined) {
360
+ const enclosing = (this._attempt?.of ?? 1) > 1 ? 'a stage' : this._retryingCalls > 0 ? 'a $call' : undefined;
361
+ if (enclosing !== undefined) {
362
+ throw new TypeError(`${where}: touches "${touches.system}" with no idempotencyKey, inside ${enclosing} that may retry — a ` +
363
+ 'retry would send it again without a key. Give the call a key.');
364
+ }
365
+ this._stageContext.markKeylessEffect();
366
+ }
367
+ // From an ended attempt or a committed frame: refused (and recorded by name) before anything reaches outside.
368
+ this.refuseLateCall(`call:${name}`);
369
+ const context = this._stageContext;
370
+ const stageAttempt = this._attempt?.attempt ?? 1;
371
+ const signal = this._attempt?.signal ?? this._runSignal;
372
+ const deadline = (0, runner_js_1.attemptEndsAt)(this._attempt);
373
+ const ended = context.callsEndedSignal(stageAttempt);
374
+ // While a call that may retry is in flight, a keyless touching call made inside it is refused (above).
375
+ const retrying = (0, policy_js_1.attemptCeiling)(admitted.attempts) > 1;
376
+ if (retrying)
377
+ this._retryingCalls += 1;
378
+ let result;
379
+ try {
380
+ result = this.startCall(name, fn, admitted, touches, stageAttempt, signal, deadline, ended);
381
+ }
382
+ catch (error) {
383
+ if (retrying)
384
+ this._retryingCalls -= 1;
385
+ throw error;
386
+ }
387
+ if (!retrying)
388
+ return result;
389
+ const release = () => {
390
+ this._retryingCalls -= 1;
391
+ };
392
+ result.then(release, release);
393
+ return result;
394
+ }
395
+ /** `runCall` with this stage attempt as its host (`call`). */
396
+ startCall(name, fn, admitted, touches, stageAttempt, signal, deadline, ended) {
397
+ const context = this._stageContext;
398
+ const loop = (0, retryLoopContext_js_1.takeRetryLoopCall)(this);
399
+ return (0, call_js_1.runCall)(name, fn, admitted, {
400
+ openSeries: () => (0, call_js_1.callSeries)(context.runtimeStageId, stageAttempt, context.nextCallOrdinal(stageAttempt)),
401
+ ...(signal !== undefined && { signal }),
402
+ ...(deadline !== undefined && { deadline }),
403
+ ended,
404
+ ...(touches !== undefined && { effect: this.callEffect(touches) }),
405
+ // The frame's own commit state (every attempt's facade reads the same), never a facade flag.
406
+ admits: (cut) => !context.committed && (cut || !(ended.aborted || this.attemptHasEnded())),
407
+ serve: (error) => this.rule.servedError(error),
408
+ report: (record, structuredError) => {
409
+ const served = loop ? Object.freeze({ ...record, retryLoop: loop.identity }) : record;
410
+ context.reportCallAttempt(served, structuredError);
411
+ loop?.record(served);
412
+ },
413
+ refused: () => context.recordLateWrite({ attempt: stageAttempt, key: `call:${name}`, channel: 'attempt' }),
414
+ observe: (report, at) => this.recordObserved(report, at.ended),
415
+ });
416
+ }
417
+ /** @internal The explicit retry helper owns this state; the normal write path still owns retention/commit. */
418
+ writeRetryLoopState(key, state) {
419
+ const kept = this.serveRetryLoopKey(state.idempotencyKey);
420
+ if (kept !== state.idempotencyKey)
421
+ this.rule.inheritFields(key, ['idempotencyKey']);
422
+ this.setValue(key, state);
423
+ }
424
+ /** @internal Exactly the existing P3 key-retention law; operational state keeps the real key. */
425
+ serveRetryLoopKey(key) {
426
+ return this.rule.retainIdempotencyKey(key, {
427
+ input: this._readOnlyValues,
428
+ selectedReads: this._stageContext.selectedReads + (this._stageContext.effectKeyTainted ? 1 : 0),
429
+ });
430
+ }
431
+ /** @internal Loop state is durable data: never persist the thrown value, stack, cause or payload. */
432
+ serveRetryLoopError(error) {
433
+ const served = this.rule.servedError(error);
434
+ return {
435
+ message: served.message,
436
+ ...(served.name !== undefined ? { name: served.name } : {}),
437
+ ...(served.code !== undefined ? { code: served.code } : {}),
438
+ };
439
+ }
440
+ /** A touching call's target, its key served for the records (`RedactionRule · retainIdempotencyKey`: by name and by its sources). */
441
+ callEffect(touches) {
442
+ const key = touches.idempotencyKey;
443
+ if (key === undefined)
444
+ return touches;
445
+ // A key the stage built after reading a selected value — or from an input holding one — is served whole.
446
+ const recordedKey = this.rule.retainIdempotencyKey(key, {
447
+ input: this._readOnlyValues,
448
+ // The stage's own key may be made of a selected value: a key passed on from it is served the same way.
449
+ selectedReads: this._stageContext.selectedReads + (this._stageContext.effectKeyTainted ? 1 : 0),
450
+ });
451
+ return { ...touches, recordedKey };
452
+ }
453
+ /**
454
+ * A `$call` from an ended attempt, or from a frame that has committed: recorded by name (`lateWrites`, channel
455
+ * `'attempt'`) and refused — before anything reaches outside. The P1b fence first, so its message and record are
456
+ * the same.
457
+ */
458
+ refuseLateCall(key) {
459
+ this.refuseIfAttemptEnded(key, 'attempt');
460
+ if (!this._stageContext.committed && !this._committed)
461
+ return;
462
+ this._stageContext.recordLateWrite({ attempt: this._attempt?.attempt ?? 1, key, channel: 'attempt' });
463
+ throw new Error((0, borrowedMutation_js_1.deadFrameMessage)(this._stageName, this._stageContext.runtimeStageId, key));
464
+ }
465
+ /**
466
+ * An outside attempt an adapter reported — `AttemptContext.observed` on this stage's attempt or on one of its
467
+ * calls' (P2). Read and validated first (a malformed report is the adapter's bug: a `TypeError`, and it never
468
+ * reaches the record). A report that comes after its attempt ended — the call attempt it was made through, this
469
+ * stage attempt, or the frame's commit — is recorded by name (`lateWrites`, channel `'attempt'`) and DROPPED,
470
+ * never thrown: adapters report from an SDK's own callbacks, which may fire after the stage moved on, and an
471
+ * observed attempt never changes control flow — in either direction. Its series opens at this stage attempt's call
472
+ * level: an SDK's call is a call the stage attempt made, so a report made through a `$call` is that call's sibling.
473
+ */
474
+ recordObserved(report, callAttemptEnded = false) {
475
+ const read = (0, observed_js_1.readObservedReport)(report);
476
+ const key = `observed:${read.target}`;
477
+ const context = this._stageContext;
478
+ const stageAttempt = this._attempt?.attempt ?? 1;
479
+ if (callAttemptEnded || this.attemptHasEnded() || context.committed || this._committed) {
480
+ context.recordLateWrite({ attempt: stageAttempt, key, channel: 'attempt' });
481
+ return;
482
+ }
483
+ const book = (this._observedBook ??= new observed_js_1.ObservedSeriesBook(() => (0, call_js_1.callSeries)(context.runtimeStageId, stageAttempt, context.nextCallOrdinal(stageAttempt))));
484
+ const { record, structuredError } = (0, observed_js_1.observedRecord)(read, {
485
+ series: book.seriesFor(read),
486
+ now: Date.now,
487
+ serve: (error) => this.rule.servedError(error),
488
+ });
489
+ context.reportCallAttempt(record, structuredError);
490
+ }
491
+ /** This facade's attempt has ended — the P1b fence is closed. */
492
+ attemptHasEnded() {
493
+ const attempt = this._attempt;
494
+ return attempt !== undefined && this._stageContext.hasAttemptEnded(attempt.attempt);
495
+ }
228
496
  /** Called by StageContext.commit() observer. Converts tracked writes to CommitEvent format.
229
497
  * Errors are caught to prevent recorder issues from aborting the traversal. */
230
498
  _onCommitFired(mutations) {
@@ -255,22 +523,27 @@ class ScopeFacade {
255
523
  // attached `EmitRecorder` sees them in real time — closing the
256
524
  // long-standing gap where `$debug`/`$metric` went to unobserved bags.
257
525
  addDebugInfo(key, value) {
526
+ this.refuseIfAttemptEnded(`log.debug.${key}`, 'emit');
258
527
  const kept = this._stageContext.addDiagnostic('logs', key, value);
259
528
  this.emitEvent(`log.debug.${key}`, { key, value: kept, level: 'debug' });
260
529
  }
261
530
  addDebugMessage(value) {
531
+ this.refuseIfAttemptEnded('log.debug.messages', 'emit');
262
532
  const kept = this._stageContext.addDiagnostic('logs', 'messages', [value]);
263
533
  this.emitEvent('log.debug.messages', { value: Array.isArray(kept) ? kept[0] : kept, level: 'debug' });
264
534
  }
265
535
  addErrorInfo(key, value) {
536
+ this.refuseIfAttemptEnded(`log.error.${key}`, 'emit');
266
537
  const kept = this._stageContext.addDiagnostic('errors', key, value);
267
538
  this.emitEvent(`log.error.${key}`, { key, value: kept, level: 'error' });
268
539
  }
269
540
  addMetric(metricName, value) {
541
+ this.refuseIfAttemptEnded(`metric.${metricName}`, 'emit');
270
542
  const kept = this._stageContext.addDiagnostic('metrics', metricName, value);
271
543
  this.emitEvent(`metric.${metricName}`, { name: metricName, value: kept });
272
544
  }
273
545
  addEval(metricName, value) {
546
+ this.refuseIfAttemptEnded(`eval.${metricName}`, 'emit');
274
547
  const kept = this._stageContext.addDiagnostic('evals', metricName, value);
275
548
  this.emitEvent(`eval.${metricName}`, { name: metricName, value: kept });
276
549
  }
@@ -294,6 +567,9 @@ class ScopeFacade {
294
567
  * the method routes here via `createTypedScope`.
295
568
  */
296
569
  emitEvent(name, payload) {
570
+ // An ended attempt emits nothing — refused (and recorded) before the fast path, so the record does not depend
571
+ // on whether a recorder happened to be attached.
572
+ this.refuseIfAttemptEnded(name, 'emit');
297
573
  // Fast-path: zero work when no recorders are attached.
298
574
  if (this._recorders.length === 0)
299
575
  return;
@@ -318,7 +594,7 @@ class ScopeFacade {
318
594
  // Dispatch with error isolation — the same `fire` loop and the same failure routing as
319
595
  // every other scope event: a throwing recorder's error reaches onError on the recorders;
320
596
  // the emit loop continues unaffected.
321
- (0, hooks_js_1.fire)(this._recorders, 'onEmit', event, this._routeFailure);
597
+ (0, hooks_js_1.fire)(this._recorders, 'onEmit', this._correlated(event), this._routeFailure);
322
598
  }
323
599
  // ── Detach — fire-and-forget child flowchart execution ─────────────────
324
600
  //
@@ -328,10 +604,12 @@ class ScopeFacade {
328
604
  // and `scope.$detachAndForget(...)`.
329
605
  /** See `ScopeMethods.$detachAndJoinLater`. */
330
606
  detachAndJoinLater(driver, child, input) {
607
+ this.refuseIfAttemptEnded(detachKey(child), 'detach');
331
608
  return (0, spawn_js_1.detachAndJoinLater)(driver, child, input, this._stageContext.runtimeStageId);
332
609
  }
333
610
  /** See `ScopeMethods.$detachAndForget`. */
334
611
  detachAndForget(driver, child, input) {
612
+ this.refuseIfAttemptEnded(detachKey(child), 'detach');
335
613
  (0, spawn_js_1.detachAndForget)(driver, child, input, this._stageContext.runtimeStageId);
336
614
  }
337
615
  /**
@@ -361,6 +639,7 @@ class ScopeFacade {
361
639
  // ── Non-Tracking State Inspection (for TypedScope proxy internals) ──────
362
640
  /** Returns all state keys without firing onRead. Used by TypedScope ownKeys/has traps. */
363
641
  getStateKeys() {
642
+ this.refuseIfAttemptEnded('*');
364
643
  const snapshot = this._stageContext.getValue([], undefined);
365
644
  if (!snapshot || typeof snapshot !== 'object')
366
645
  return [];
@@ -370,6 +649,7 @@ class ScopeFacade {
370
649
  * Contract: returns false for keys never set OR keys set to undefined.
371
650
  * This matches deleteValue() semantics (sets to undefined = deleted). */
372
651
  hasKey(key) {
652
+ this.refuseIfAttemptEnded(key);
373
653
  return this._stageContext.getValue([], key) !== undefined;
374
654
  }
375
655
  /** Read state without firing onRead. Used by array proxy getCurrent() to avoid
@@ -387,6 +667,7 @@ class ScopeFacade {
387
667
  * array-proxy pattern above) are not flagged: their edge is captured. A
388
668
  * whole-state silent read (no key) is always flagged. */
389
669
  getValueSilent(key) {
670
+ this.refuseIfAttemptEnded(key ?? '*');
390
671
  if (key === undefined || !this._trackedReadKeys.has(key)) {
391
672
  this._stageContext.markUntrackedSource('silent');
392
673
  }
@@ -428,6 +709,7 @@ class ScopeFacade {
428
709
  * a literal top-level `'user.ssn'` produce the same event key (same for the writes below).
429
710
  */
430
711
  getValueAt(path, key) {
712
+ this.refuseIfAttemptEnded(key === undefined ? path.join('.') || '*' : [...path, key].join('.'));
431
713
  const value = this._stageContext.getValue(path, key);
432
714
  // RFC-003 D2: remember tracked keys so later SILENT reads of the same
433
715
  // key count as shadowed (edge already captured) instead of untracked.
@@ -578,6 +860,7 @@ class ScopeFacade {
578
860
  * here. An empty-args read carries no information and is not flagged.
579
861
  */
580
862
  getArgs() {
863
+ this.refuseIfAttemptEnded('$args');
581
864
  if (this._hasArgs)
582
865
  this._stageContext.markUntrackedSource('args');
583
866
  return this._frozenArgs;
@@ -586,8 +869,10 @@ class ScopeFacade {
586
869
  * Returns the execution environment — read-only infrastructure values
587
870
  * that propagate through nested executors (like `process.env` for flowcharts).
588
871
  *
589
- * Contains: signal (abort), timeoutMs, traceId.
590
- * Frozen at construction time. Inherited by subflows automatically.
872
+ * Contains: signal (abort — the run's one effective signal), timeoutMs, traceId, operationId, traceparent,
873
+ * deadline (epoch ms) — the run's env as admitted (`attempt/correlation.ts · admitRunEnv`: one own-field
874
+ * snapshot; `traceparent` is the canonical header the run's correlation carries, never the received bytes), then
875
+ * armed (`runner/deadline.ts · armRun`). Frozen at construction time. Inherited by subflows automatically.
591
876
  *
592
877
  * ```typescript
593
878
  * const { signal, traceId } = scope.getEnv();
@@ -598,6 +883,7 @@ class ScopeFacade {
598
883
  * `untrackedSources: ['env']` — see {@link getArgs}.
599
884
  */
600
885
  getEnv() {
886
+ this.refuseIfAttemptEnded('$env');
601
887
  if (this._hasEnv)
602
888
  this._stageContext.markUntrackedSource('env');
603
889
  return this._executionEnv;
@@ -610,7 +896,11 @@ class ScopeFacade {
610
896
  _invokeHook(hook, event) {
611
897
  // The one per-recorder loop (`recorder/hooks.ts · fire`) — the SAME invoke primitive the
612
898
  // deferred tier uses at delivery time, so the inline and deferred paths cannot drift.
613
- (0, hooks_js_1.fire)(this._recorders, hook, event, this._routeFailure);
899
+ (0, hooks_js_1.fire)(this._recorders, hook, this._correlated(event), this._routeFailure);
900
+ }
901
+ /** The event as fired: unchanged without a correlation, else with the run's correlation as its last key. */
902
+ _correlated(event) {
903
+ return this._correlation === undefined ? event : { ...event, correlation: this._correlation };
614
904
  }
615
905
  /**
616
906
  * The scope channel's isolation: a recorder's throw becomes an `onError` on every recorder
@@ -628,4 +918,11 @@ class ScopeFacade {
628
918
  };
629
919
  }
630
920
  exports.ScopeFacade = ScopeFacade;
631
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgseUNBQThDO0FBRTlDLHdEQUE4RDtBQUM5RCxpREFHNEI7QUFDNUIsOENBQTBDO0FBRTFDLHVFQUFpRTtBQUNqRSx5REFBOEQ7QUFHOUQsbURBQWtFO0FBQ2xFLG9FQUFvRjtBQUNwRiw2Q0FBb0Q7QUFHcEQsTUFBYSxXQUFXO0lBQ2YsTUFBTSxDQUFVLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFNUQ7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBVSxtQkFBbUIsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV6RSxhQUFhLENBQWU7SUFDNUIsVUFBVSxDQUFTO0lBQ1YsZUFBZSxDQUFXO0lBRTdDLCtFQUErRTtJQUM5RCxXQUFXLENBQTBCO0lBRXRELHlFQUF5RTtJQUN4RCxhQUFhLENBQXlCO0lBRXZEO29FQUNnRTtJQUMvQyxRQUFRLENBQVU7SUFFbkMsK0RBQStEO0lBQzlDLE9BQU8sQ0FBVTtJQUVsQzs7Ozs7O09BTUc7SUFDYyxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTlDLFVBQVUsR0FBb0IsRUFBRSxDQUFDO0lBRXpDOzs7Ozs7Ozs7O09BVUc7SUFDSyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRTNCOzs7O09BSUc7SUFDSyxVQUFVLENBQWlCO0lBRW5DLFlBQVksT0FBcUIsRUFBRSxTQUFpQixFQUFFLGNBQXdCLEVBQUUsWUFBMkI7UUFDekcsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENB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QUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFRCw0RUFBNEU7SUFFcEUsV0FBVyxDQUEwQixJQUFPLEVBQUUsS0FBcUI7UUFDekUseUZBQXlGO1FBQ3pGLHNGQUFzRjtRQUN0RixJQUFBLGVBQUksRUFBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDYyxhQUFhLEdBQWdCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN2RSxJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsT0FBTztRQUMvQixJQUFJLENBQUMsV0FBVyxDQUNkLFNBQVMsRUFDVCxJQUFBLCtCQUFvQixFQUNsQjtZQUNFLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO1lBQ25DLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWM7WUFDakQsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztTQUNyQyxFQUNELEtBQUssRUFDTCxJQUFJLENBQ0wsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDOztBQWhyQkosa0NBaXJCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2NvcGVGYWNhZGUg4oCUIEJhc2UgY2xhc3MgdGhhdCBsaWJyYXJ5IGNvbnN1bWVycyBleHRlbmQgdG8gY3JlYXRlIGN1c3RvbSBzY29wZSBjbGFzc2VzXG4gKlxuICogV3JhcHMgU3RhZ2VDb250ZXh0IChmcm9tIG1lbW9yeS8pIHRvIHByb3ZpZGUgYSBjb25zdW1lci1mcmllbmRseSBBUEkgZm9yXG4gKiBzdGF0ZSBhY2Nlc3MsIGRlYnVnIGxvZ2dpbmcsIG1ldHJpY3MsIGFuZCByZWNvcmRlciBob29rcy5cbiAqXG4gKiBDb25zdW1lcnMgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gYWRkIGRvbWFpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15U2NvcGUgZXh0ZW5kcyBTY29wZUZhY2FkZSB7XG4gKiAgIGdldCB1c2VyTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRWYWx1ZSgnbmFtZScpIGFzIHN0cmluZzsgfVxuICogICBzZXQgdXNlck5hbWUodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldFZhbHVlKCduYW1lJywgdmFsdWUpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBzdWJmbG93U2VnbWVudHNPZiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGhhc0NpcmN1bGFyUmVmZXJlbmNlIH0gZnJvbSAnLi4vY2FwdHVyZS9jaXJjdWxhci5qcyc7XG5pbXBvcnQge1xuICBkZXRhY2hBbmRGb3JnZXQgYXMgZGV0YWNoQW5kRm9yZ2V0U3Bhd24sXG4gIGRldGFjaEFuZEpvaW5MYXRlciBhcyBkZXRhY2hBbmRKb2luTGF0ZXJTcGF3bixcbn0gZnJvbSAnLi4vZGV0YWNoL3NwYXduLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVhZEZyYW1lTWVzc2FnZSB9IGZyb20gJy4uL21lbW9yeS9ib3Jyb3dlZE11dGF0aW9uLmpzJztcbmltcG9ydCB7IENMRUFSLCBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgSG9va0ZhaWx1cmUsIEhvb2tQYXlsb2FkLCBTY29wZUhvb2tOYW1lIH0gZnJvbSAnLi4vcmVjb3JkZXIvaG9va3MuanMnO1xuaW1wb3J0IHsgZmlyZSwgcmVjb3JkZXJGYWlsdXJlRXZlbnQgfSBmcm9tICcuLi9yZWNvcmRlci9ob29rcy5qcyc7XG5pbXBvcnQgeyBhc3NlcnROb3RSZWFkb25seSwgY3JlYXRlRnJvemVuQXJncyB9IGZyb20gJy4vcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB7IHJlZ2lzdGVyU2NvcGVSdW50aW1lIH0gZnJvbSAnLi9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0RXZlbnQsIFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTY29wZUZhY2FkZSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQlJBTkQgPSBTeW1ib2wuZm9yKCdTY29wZUZhY2FkZUB2MScpO1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgc2VudGluZWwgcmV0dXJuZWQgYnkgYF9nZXRTdWJmbG93UGF0aCgpYCBmb3Igcm9vdC1sZXZlbCBzdGFnZXNcbiAgICogKG5vIHN1YmZsb3cgbmVzdGluZykuIEF2b2lkcyBwZXItY2FsbCBhbGxvY2F0aW9uIG9mIGEgZnJlc2hcbiAgICogYE9iamVjdC5mcmVlemUoW10pYCBvbiBldmVyeSBgZW1pdEV2ZW50YCBpbiB0aGUgY29tbW9uIG5vLXN1YmZsb3cgY2FzZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IF9FTVBUWV9TVUJGTE9XX1BBVEg6IHJlYWRvbmx5IHN0cmluZ1tdID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbiAgcHJvdGVjdGVkIF9zdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHJvdGVjdGVkIF9zdGFnZU5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yZWFkT25seVZhbHVlcz86IHVua25vd247XG5cbiAgLyoqIENhY2hlZCBkZWVwbHktZnJvemVuIGNvcHkgb2YgcmVhZE9ubHlWYWx1ZXMgZm9yIGdldEFyZ3MoKS4gQ3JlYXRlZCBvbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9mcm96ZW5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKiogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHksIGluaGVyaXRlZCBmcm9tIHBhcmVudCBleGVjdXRvci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhlY3V0aW9uRW52OiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIC8qKiBSRkMtMDAzIEQyOiB0cnVlIHdoZW4gYGdldEFyZ3MoKWAgY2FuIHJldHVybiBhY3R1YWwgZGF0YSDigJQgYW4gZW1wdHlcbiAgICogIGB7fWAgcmVhZCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uLCBzbyBpdCBpcyBuZXZlciBmbGFnZ2VkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9oYXNBcmdzOiBib29sZWFuO1xuXG4gIC8qKiBSRkMtMDAzIEQyOiB0cnVlIHdoZW4gYGdldEVudigpYCBjYW4gcmV0dXJuIGFjdHVhbCBkYXRhLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9oYXNFbnY6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IGtleXMgdGhpcyBzdGFnZSBoYXMgVFJBQ0tFRC1yZWFkICh2aWEgYGdldFZhbHVlKGtleSlgKS5cbiAgICogQSBzaWxlbnQgcmVhZCBvZiBhIGtleSBpbiB0aGlzIHNldCBpcyBTSEFET1dFRCDigJQgaXRzIHJlYWTihpJ3cml0ZSBlZGdlIGlzXG4gICAqIGFscmVhZHkgY2FwdHVyZWQsIHNvIGl0IGlzIG5vdCBmbGFnZ2VkIGFzIGFuIHVudHJhY2tlZCBzb3VyY2UuIFRoaXMgaXNcbiAgICogd2hhdCBrZWVwcyBUeXBlZFNjb3BlIGFycmF5LXByb3h5IGludGVybmFscyAod2hpY2ggYWx3YXlzIGZvbGxvdyBhXG4gICAqIHRyYWNrZWQgcHJvcGVydHkgcmVhZCkgYW5kIGAkYmF0Y2hBcnJheWAgaG9uZXN0LWJ1dC1xdWlldC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RyYWNrZWRSZWFkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgX3JlY29yZGVyczogU2NvcGVSZWNvcmRlcltdID0gW107XG5cbiAgLyoqXG4gICAqIFNldCBieSB0aGUgY29tbWl0IG9ic2VydmVyOiB0aGlzIHN0YWdlJ3MgZnJhbWUgaGFzIGZsdXNoZWQuIEEgZmFjYWRlIGlzXG4gICAqIE9ORSBzdGFnZSBleGVjdXRpb24ncyBoYW5kbGUg4oCUIHRoZSBlbmdpbmUgYnVpbGRzIGEgZnJlc2ggb25lIHBlciBzdGFnZSDigJRcbiAgICogYW5kIGV2ZXJ5IHByb3h5IHRoZSB0eXBlZCBzY29wZSBoYW5kcyBvdXQgaXMgYm91bmQgdG8gaXQuIEEgd3JpdGUgYXJyaXZpbmdcbiAgICogYWZ0ZXIgdGhlIGNvbW1pdCBjb21lcyBmcm9tIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgKGEgY2xvc3VyZSwgYVxuICAgKiBtb2R1bGUtbGV2ZWwgYGxldGApIGFuZCB3b3VsZCBsYW5kIGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzOiBub1xuICAgKiB0cmFjZSByb3csIHN0YXRlIHVuY2hhbmdlZC4gU28gaXQgaXMgcmVmdXNlZCAoe0BsaW5rIGFzc2VydExpdmV9KSBpbnN0ZWFkXG4gICAqIG9mIGxvc3QuIFNlYWxpbmcgaGVyZSBhbmQgbm90IG9uIGBTdGFnZUNvbnRleHRgIGlzIGRlbGliZXJhdGU6IHRoZSBmcmFtZVxuICAgKiBzdGF5cyByZS11c2FibGUgYWZ0ZXIgY29tbWl0IGJ5IGRlc2lnbiAoIzEzYiDigJQgdGhlIGVuZ2luZSdzIGRvdWJsZS1jb21taXRcbiAgICogcGF0aHMgYW5kIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGJyYW5jaCBwYXJlbnQgbmVlZCBpdCkuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQSBydWxlIG9mIHRoaXMgZmFjYWRlJ3Mgb3duIOKAlCBPTkxZIHdoZW4gaXRzIGNvbnRleHQgY2FycmllcyBub25lIChiYXJlXG4gICAqIGNvbnRleHRzIGluIHVuaXQgdGVzdHMpLiBVbmRlciBhbiBleGVjdXRvciB0aGUgcnVsZSBsaXZlcyBvbiB0aGUgY29udGV4dFxuICAgKiB0cmVlIGFuZCB0aGlzIHN0YXlzIHVuc2V0OyBzZWUge0BsaW5rIHJ1bGV9LlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9jYWxSdWxlPzogUmVkYWN0aW9uUnVsZTtcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seVZhbHVlcz86IHVua25vd24sIGV4ZWN1dGlvbkVudj86IEV4ZWN1dGlvbkVudikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5fc3RhZ2VOYW1lID0gc3RhZ2VOYW1lO1xuICAgIHRoaXMuX3JlYWRPbmx5VmFsdWVzID0gcmVhZE9ubHlWYWx1ZXM7XG4gICAgdGhpcy5fZnJvemVuQXJncyA9IGNyZWF0ZUZyb3plbkFyZ3MocmVhZE9ubHlWYWx1ZXMpO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkVudiA9IE9iamVjdC5mcmVlemUoeyAuLi5leGVjdXRpb25FbnYgfSk7XG4gICAgdGhpcy5faGFzQXJncyA9IE9iamVjdC5rZXlzKHRoaXMuX2Zyb3plbkFyZ3MpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5faGFzRW52ID0gT2JqZWN0LmtleXModGhpcy5fZXhlY3V0aW9uRW52KS5sZW5ndGggPiAwO1xuICAgIC8vIFRoZSBjb250ZXh0IG11c3QgY2FycnkgdGhlIHJ1bGUgQkVGT1JFIHRoZSBmaXJzdCB3cml0ZSwgc2luY2UgdGhlXG4gICAgLy8gY29udGV4dCdzIHdyaXRlIGZ1bm5lbCBpcyB3aGF0IG1hcmtzIGEgcGVyLWNhbGwgcmVkYWN0ZWQga2V5IG9uIGl0LlxuICAgIC8vIFVuZGVyIGFuIGV4ZWN1dG9yIHRoZSBjb250ZXh0IGFscmVhZHkgaGFzIHRoZSBydW4ncyBydWxlIChpbnN0YWxsZWQgb25cbiAgICAvLyB0aGUgcm9vdCwgaW5oZXJpdGVkIGRvd24pIGFuZCB0aGlzIHJlLWluc3RhbGxzIHRoZSBzYW1lIG9iamVjdDsgb24gYVxuICAgIC8vIGJhcmUgY29udGV4dCBpdCBpbnN0YWxscyBhIGZyZXNoIG9uZS5cbiAgICB0aGlzLl9zdGFnZUNvbnRleHQudXNlUmVkYWN0aW9uUnVsZSh0aGlzLnJ1bGUpO1xuXG4gICAgLy8gUmVnaXN0ZXIgYXMgY29tbWl0IG9ic2VydmVyIHNvIFNjb3BlUmVjb3JkZXIub25Db21taXQgZmlyZXMgd2hlbiBTdGFnZUNvbnRleHQuY29tbWl0KCkgaXMgY2FsbGVkXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnNldENvbW1pdE9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgIHRoaXMuX29uQ29tbWl0RmlyZWQobXV0YXRpb25zKTtcbiAgICB9KTtcbiAgICByZWdpc3RlclNjb3BlUnVudGltZSh0aGlzLCB7IHRhcmdldDogdGhpcywgaGFuZGxlc0Fzc2lnbm1lbnRzOiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0aW9uIHJ1bGUgdGhpcyBmYWNhZGUgZGVjaWRlcyB3aXRoIOKAlCB0aGUgU0FNRSBvYmplY3QgaXRzXG4gICAqIGBTdGFnZUNvbnRleHRgIHJldGFpbnMgd2l0aCAoYG1lbW9yeS9yZWRhY3Rpb24udHNgLCB0aGUgb25lIG93bmVyKS4gVW5kZXJcbiAgICogYW4gZXhlY3V0b3IgdGhlIHJ1bGUgaXMgaW5zdGFsbGVkIG9uIHRoZSBydW50aW1lIHJvb3QgYW5kIGluaGVyaXRlZCBieVxuICAgKiBldmVyeSBjb250ZXh0LCBzbyB0aGUgZmFjYWRlIHNpbXBseSByZWFkcyBpdC4gT24gYSBiYXJlIGNvbnRleHQgKHVuaXRcbiAgICogdGVzdHMsIGhhbmQtYnVpbHQgc2NvcGVzKSB0aGUgZmFjYWRlIGNyZWF0ZXMgb25lIGFuZCBpbnN0YWxscyBpdCBvbiB0aGVcbiAgICogY29udGV4dCwgc28gdGhlIGNvbnRleHQncyByZXRlbnRpb24gYW5kIHRoZSBmYWNhZGUncyByZWNvcmRlciB2aWV3c1xuICAgKiBzdGlsbCBzaGFyZSBhIHNpbmdsZSB2ZXJkaWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgcnVsZSgpOiBSZWRhY3Rpb25SdWxlIHtcbiAgICBjb25zdCBzaGFyZWQgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIGlmIChzaGFyZWQpIHJldHVybiBzaGFyZWQ7XG4gICAgaWYgKCF0aGlzLl9sb2NhbFJ1bGUpIHtcbiAgICAgIHRoaXMuX2xvY2FsUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKCk7XG4gICAgICB0aGlzLl9zdGFnZUNvbnRleHQudXNlUmVkYWN0aW9uUnVsZSh0aGlzLl9sb2NhbFJ1bGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9jYWxSdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIGEgcmVkYWN0ZWQta2V5cyBzZXQgYWNyb3NzIG11bHRpcGxlIFNjb3BlRmFjYWRlIGluc3RhbmNlcy5cbiAgICogQ2FsbCB0aGlzIHRvIG1ha2UgcmVkYWN0aW9uIHBlcnNpc3QgYWNyb3NzIHN0YWdlcyBpbiB0aGUgc2FtZSBwaXBlbGluZS5cbiAgICogKFVuZGVyIGFuIGV4ZWN1dG9yIHRoZSBydW4ncyBydWxlIGFscmVhZHkgc2hhcmVzIG9uZSBzZXQ7IHRoaXMgY2FsbCBpc1xuICAgKiB0aGVuIGEgbm8tb3AuKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRTZXQ6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5ydWxlLnVzZU1hcmtlZEtleXMoc2hhcmVkU2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlZGFjdGVkLWtleXMgc2V0IChmb3Igc2hhcmluZyB3aXRoIG90aGVyIHNjb3BlcykuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UmVkYWN0ZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLm1hcmtlZEtleXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kuIFRoZSBwb2xpY3kgaXMgYWRkaXRpdmUg4oCUXG4gICAqIGl0IHdvcmtzIGFsb25nc2lkZSBtYW51YWwgYHNldFZhbHVlKC4uLiwgdHJ1ZSlgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucnVsZS5zZXRQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UmVkYWN0aW9uUG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5nZXRQb2xpY3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eS5cbiAgICogTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcyDigJQgb25seSBrZXkgbmFtZXMsIGZpZWxkIG5hbWVzLCBhbmQgcGF0dGVybnMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLnJlcG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5fcmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlcklkKTtcbiAgfVxuXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9yZWNvcmRlcnNdO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZVN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VTdGFydCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZUVuZChkdXJhdGlvbj86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VFbmQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlQYXVzZShwYXVzZURhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25QYXVzZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgcGF1c2VEYXRhLFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5UmVzdW1lKGhhc0lucHV0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25SZXN1bWUnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5Q29tbWl0KG11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25Db21taXQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG11dGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZ1c2UgYSB3cml0ZSBmcm9tIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgKDkuMjIuMCkuIFRocm93cyB3aXRoIHRoZVxuICAgKiBzdGFnZSB0aGUgaGFuZGxlIGNhbWUgZnJvbTsgdGhlIGVuZ2luZSdzIGVycm9yIHBhdGggYXR0cmlidXRlcyB0aGUgdGhyb3dcbiAgICogdG8gdGhlIHN0YWdlIHRoYXQgbWFkZSB0aGUgd3JpdGUuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydExpdmUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29tbWl0dGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGVhZEZyYW1lTWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCwga2V5KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbGxlZCBieSBTdGFnZUNvbnRleHQuY29tbWl0KCkgb2JzZXJ2ZXIuIENvbnZlcnRzIHRyYWNrZWQgd3JpdGVzIHRvIENvbW1pdEV2ZW50IGZvcm1hdC5cbiAgICogIEVycm9ycyBhcmUgY2F1Z2h0IHRvIHByZXZlbnQgcmVjb3JkZXIgaXNzdWVzIGZyb20gYWJvcnRpbmcgdGhlIHRyYXZlcnNhbC4gKi9cbiAgcHJpdmF0ZSBfb25Db21taXRGaXJlZChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGBfc3RhZ2VXcml0ZXNgIGFscmVhZHkgaG9sZHMgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBjb250ZXh0IHJldGFpbnNcbiAgICAgIC8vIHVuZGVyIHRoZSBzYW1lIHJ1bGUpOyBhcHBseWluZyB0aGUgdmVyZGljdCBhZ2FpbiBoZXJlIGlzIGlkZW1wb3RlbnRcbiAgICAgIC8vIGFuZCBrZWVwcyBhIGtleSBtYXJrZWQgQUZURVIgaXRzIHdyaXRlIHNjcnViYmVkIGF0IGNvbW1pdCB0aW1lLlxuICAgICAgY29uc3QgY29tbWl0TXV0YXRpb25zOiBDb21taXRFdmVudFsnbXV0YXRpb25zJ10gPSBPYmplY3QuZW50cmllcyhtdXRhdGlvbnMpLm1hcCgoW2tleSwgZW50cnldKSA9PiAoe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB0aGlzLnJ1bGUucmV0YWluKFtrZXldLCBlbnRyeS52YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogZW50cnkub3BlcmF0aW9uLFxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLm5vdGlmeUNvbW1pdChjb21taXRNdXRhdGlvbnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdyDigJQgcmVjb3JkZXIgZXJyb3JzIG11c3Qgbm90IGFib3J0IHRoZSB0cmF2ZXJzYWwuXG4gICAgICAvLyBJbmRpdmlkdWFsIHJlY29yZGVyIGVycm9ycyBhcmUgYWxyZWFkeSBpc29sYXRlZCBieSBfaW52b2tlSG9vay5cbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRGVidWcgLyBEaWFnbm9zdGljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gVGhlc2UgbGVnYWN5IG1ldGhvZHMgc3RpbGwgd3JpdGUgdG8gdGhlIGBTdGFnZUNvbnRleHRgIGRpYWdub3N0aWNcbiAgLy8gc2lkZSBiYWdzIChsb2dDb250ZXh0IC8gZXJyb3JDb250ZXh0IC8gbWV0cmljQ29udGV4dCAvIGV2YWxDb250ZXh0KSBmb3JcbiAgLy8gc25hcHNob3QgaW5jbHVzaW9uLiBUaGV5IEFMU08gZmlyZSB0aHJvdWdoIHRoZSBFbWl0IGNoYW5uZWwgc28gYW55XG4gIC8vIGF0dGFjaGVkIGBFbWl0UmVjb3JkZXJgIHNlZXMgdGhlbSBpbiByZWFsIHRpbWUg4oCUIGNsb3NpbmcgdGhlXG4gIC8vIGxvbmctc3RhbmRpbmcgZ2FwIHdoZXJlIGAkZGVidWdgL2AkbWV0cmljYCB3ZW50IHRvIHVub2JzZXJ2ZWQgYmFncy5cblxuICBhZGREZWJ1Z0luZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdsb2dzJywga2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYGxvZy5kZWJ1Zy4ke2tleX1gLCB7IGtleSwgdmFsdWU6IGtlcHQsIGxldmVsOiAnZGVidWcnIH0pO1xuICB9XG5cbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdsb2dzJywgJ21lc3NhZ2VzJywgW3ZhbHVlXSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ2xvZy5kZWJ1Zy5tZXNzYWdlcycsIHsgdmFsdWU6IEFycmF5LmlzQXJyYXkoa2VwdCkgPyBrZXB0WzBdIDoga2VwdCwgbGV2ZWw6ICdkZWJ1ZycgfSk7XG4gIH1cblxuICBhZGRFcnJvckluZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdlcnJvcnMnLCBrZXksIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbG9nLmVycm9yLiR7a2V5fWAsIHsga2V5LCB2YWx1ZToga2VwdCwgbGV2ZWw6ICdlcnJvcicgfSk7XG4gIH1cblxuICBhZGRNZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnbWV0cmljcycsIG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbWV0cmljLiR7bWV0cmljTmFtZX1gLCB7IG5hbWU6IG1ldHJpY05hbWUsIHZhbHVlOiBrZXB0IH0pO1xuICB9XG5cbiAgYWRkRXZhbChtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdldmFscycsIG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgZXZhbC4ke21ldHJpY05hbWV9YCwgeyBuYW1lOiBtZXRyaWNOYW1lLCB2YWx1ZToga2VwdCB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFbWl0IOKAlCBQaGFzZSAzIHByaW1hcnkgcHJpbWl0aXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGaXJlIGEgc3RydWN0dXJlZCBldmVudCB0byBldmVyeSBhdHRhY2hlZCByZWNvcmRlciBpbXBsZW1lbnRpbmdcbiAgICogYG9uRW1pdGAuIFN5bmNocm9ub3VzLCBpbi1vcmRlciwgcGFzcy10aHJvdWdoIOKAlCBubyBidWZmZXJpbmcuXG4gICAqXG4gICAqIC0gKipGYXN0LXBhdGgqKjogemVybyBhbGxvY2F0aW9uICsgemVybyBjb3N0IHdoZW4gbm8gcmVjb3JkZXJzIGFyZVxuICAgKiAgIGF0dGFjaGVkIChlYXJseSByZXR1cm4gb24gZW1wdHkgbGlzdCkuXG4gICAqIC0gKipFbnJpY2htZW50Kio6IGxpYnJhcnkgYXV0by1hZGRzIGBzdGFnZU5hbWVgLCBgcnVudGltZVN0YWdlSWRgLFxuICAgKiAgIGBzdWJmbG93UGF0aGAsIGBwaXBlbGluZUlkYCwgYHRpbWVzdGFtcGAgdG8gdGhlIGV2ZW50LlxuICAgKiAtICoqUmVkYWN0aW9uKio6IGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCByZWdleGVzIGFyZSBtYXRjaGVkXG4gICAqICAgYWdhaW5zdCBgbmFtZWAg4oCUIG1hdGNoZWQgZXZlbnRzIGhhdmUgdGhlaXIgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqICAgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoLlxuICAgKiAtICoqRXJyb3IgaXNvbGF0aW9uKio6IGEgdGhyb3dpbmcgYG9uRW1pdGAgZG9lcyBub3QgcHJvcGFnYXRlIOKAlCBpdCBpc1xuICAgKiAgIGNhdWdodCBhbmQgcm91dGVkIHRvIGBvbkVycm9yYCBvbiByZW1haW5pbmcgcmVjb3JkZXJzLCBtYXRjaGluZyB0aGVcbiAgICogICBwYXR0ZXJuIHVzZWQgYnkgb3RoZXIgc2NvcGUgZXZlbnRzLlxuICAgKlxuICAgKiBDb25zdW1lcnMgY2FsbCB0aGlzIHZpYSB0aGUgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBzY29wZSBtZXRob2Q7XG4gICAqIHRoZSBtZXRob2Qgcm91dGVzIGhlcmUgdmlhIGBjcmVhdGVUeXBlZFNjb3BlYC5cbiAgICovXG4gIGVtaXRFdmVudChuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBGYXN0LXBhdGg6IHplcm8gd29yayB3aGVuIG5vIHJlY29yZGVycyBhcmUgYXR0YWNoZWQuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFJlZGFjdGlvbjogaWYgdGhlIGV2ZW50IG5hbWUgbWF0Y2hlcyBhbnkgZW1pdFBhdHRlcm4sIHJlcGxhY2UgcGF5bG9hZFxuICAgIC8vIHdpdGggJ1tSRURBQ1RFRF0nIEJFRk9SRSBjb25zdHJ1Y3RpbmcgdGhlIGV2ZW50IChubyBsZWFrIHRocm91Z2hcbiAgICAvLyBjb3B5LW9uLXdyaXRlLCBubyB3YXkgZm9yIHJlY29yZGVycyB0byBzZWUgdGhlIHJhdyB2YWx1ZSkuXG4gICAgY29uc3QgZmluYWxQYXlsb2FkID0gdGhpcy5ydWxlLnJldGFpbkVtaXQobmFtZSwgcGF5bG9hZCk7XG4gICAgY29uc3Qgc291cmNlUG9zaXRpb24gPSB0aGlzLl9zdGFnZUNvbnRleHQuY2FwdHVyZUVtaXRQb3NpdGlvbigpO1xuXG4gICAgLy8gQnVpbGQgdGhlIGVucmljaGVkIGV2ZW50IG9uY2U7IHBhc3MgdGhlIHNhbWUgcmVmZXJlbmNlIHRvIGFsbFxuICAgIC8vIHJlY29yZGVycyB1bmRlciB0aGVpciByZWFkLW9ubHkgY29udHJhY3QuIFNvdXJjZSBjb29yZGluYXRlcyBhcmVcbiAgICAvLyBjYXB0dXJlZCBiZWZvcmUgYW55IGlubGluZSBob29rIG9yIGRlZmVycmVkIHRhcCBvYnNlcnZlcyB0aGUgZXZlbnQuXG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBuYW1lLFxuICAgICAgcGF5bG9hZDogZmluYWxQYXlsb2FkLFxuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd1BhdGg6IHRoaXMuX2dldFN1YmZsb3dQYXRoKCksXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAuLi4oc291cmNlUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IHt9IDogeyBzb3VyY2VQb3NpdGlvbiB9KSxcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgLy8gRGlzcGF0Y2ggd2l0aCBlcnJvciBpc29sYXRpb24g4oCUIHRoZSBzYW1lIGBmaXJlYCBsb29wIGFuZCB0aGUgc2FtZSBmYWlsdXJlIHJvdXRpbmcgYXNcbiAgICAvLyBldmVyeSBvdGhlciBzY29wZSBldmVudDogYSB0aHJvd2luZyByZWNvcmRlcidzIGVycm9yIHJlYWNoZXMgb25FcnJvciBvbiB0aGUgcmVjb3JkZXJzO1xuICAgIC8vIHRoZSBlbWl0IGxvb3AgY29udGludWVzIHVuYWZmZWN0ZWQuXG4gICAgZmlyZSh0aGlzLl9yZWNvcmRlcnMsICdvbkVtaXQnLCBldmVudCwgdGhpcy5fcm91dGVGYWlsdXJlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXRhY2gg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnQgZXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBEZWxlZ2F0ZXMgdG8gdGhlIHNoYXJlZCBgZGV0YWNoL3NwYXduYCBoZWxwZXIsIHdoaWNoIG1pbnRzIGEgcmVmSWRcbiAgLy8gZnJvbSB0aGlzIHN0YWdlJ3MgYHJ1bnRpbWVTdGFnZUlkYCBhbmQgY2FsbHMgYGRyaXZlci5zY2hlZHVsZSgpYC5cbiAgLy8gUm91dGVkIHRocm91Z2ggYGNyZWF0ZVR5cGVkU2NvcGVgIGFzIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgXG4gIC8vIGFuZCBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYC5cblxuICAvKiogU2VlIGBTY29wZU1ldGhvZHMuJGRldGFjaEFuZEpvaW5MYXRlcmAuICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSB7XG4gICAgcmV0dXJuIGRldGFjaEFuZEpvaW5MYXRlclNwYXduKGRyaXZlciwgY2hpbGQsIGlucHV0LCB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFNlZSBgU2NvcGVNZXRob2RzLiRkZXRhY2hBbmRGb3JnZXRgLiAqL1xuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZCB7XG4gICAgZGV0YWNoQW5kRm9yZ2V0U3Bhd24oZHJpdmVyLCBjaGlsZCwgaW5wdXQsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN1YmZsb3dQYXRoIChvdXRlciDihpIgaW5uZXIpIGZvciBldmVudCBlbnJpY2htZW50LlxuICAgKlxuICAgKiBQYXJzZXMgZnJvbSBgcnVudGltZVN0YWdlSWRgIHdoaWNoIGhhcyB0aGUgZm9ybWF0XG4gICAqIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIChzZWUgYGxpYi9pZHMvcnVudGltZVN0YWdlSWQudHNgKS5cbiAgICogU3ViZmxvdyBpc29sYXRpb24gcHJldmVudHMgd2Fsa2luZyB0aGUgcGFyZW50LWNoYWluIGFjcm9zcyBib3VuZGFyaWVzLFxuICAgKiBzbyB0aGUgcnVudGltZVN0YWdlSWQg4oCUIGdsb2JhbGx5IHVuaXF1ZSwgaW5jbHVkZXMgZnVsbCBwYXRoIOKAlCBpcyB0aGVcbiAgICogY2Fub25pY2FsIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHN1YmZsb3cgaGllcmFyY2h5IGF0IGVtaXQgdGltZS5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqICAgJ3NlZWQjMCcgICAgICAgICAgICAgICAgIOKGkiBbXSAgICAgICAgICAgICAgICAgICAgKHJvb3QpXG4gICAqICAgJ3NmLWlubmVyL2lubmVyIzUnICAgICAgIOKGkiBbJ3NmLWlubmVyJ11cbiAgICogICAnc2YtYS9zZi1iL3N0YWdlIzMnICAgICAg4oaSIFsnc2YtYScsICdzZi1iJ10gICAgICAobmVzdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0U3ViZmxvd1BhdGgoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIGNvbnN0IHJ0aWQgPSB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKCFydGlkKSByZXR1cm4gU2NvcGVGYWNhZGUuX0VNUFRZX1NVQkZMT1dfUEFUSDtcbiAgICAvLyBUaGUgZ3JhbW1hcidzIG9uZSBvd25lciByZWFkcyB0aGUgcGF0aCBwb3J0aW9uIChgaWRzL3J1bnRpbWVTdGFnZUlkLnRzYCkuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBzdWJmbG93U2VnbWVudHNPZihydGlkKTtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gU2NvcGVGYWNhZGUuX0VNUFRZX1NVQkZMT1dfUEFUSDtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShzZWdtZW50cyk7XG4gIH1cblxuICAvLyDilIDilIAgTm9uLVRyYWNraW5nIFN0YXRlIEluc3BlY3Rpb24gKGZvciBUeXBlZFNjb3BlIHByb3h5IGludGVybmFscykg4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJldHVybnMgYWxsIHN0YXRlIGtleXMgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IFR5cGVkU2NvcGUgb3duS2V5cy9oYXMgdHJhcHMuICovXG4gIGdldFN0YXRlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIGhhcyB0cmFwLlxuICAgKiAgQ29udHJhY3Q6IHJldHVybnMgZmFsc2UgZm9yIGtleXMgbmV2ZXIgc2V0IE9SIGtleXMgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICogIFRoaXMgbWF0Y2hlcyBkZWxldGVWYWx1ZSgpIHNlbWFudGljcyAoc2V0cyB0byB1bmRlZmluZWQgPSBkZWxldGVkKS4gKi9cbiAgaGFzS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZShbXSwga2V5KSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKSB0byBhdm9pZFxuICAgKiAgcGhhbnRvbSByZWFkcyBvbiBpbnRlcm5hbCBhcnJheSBvcGVyYXRpb25zICgubGVuZ3RoLCAuaGFzLCBpdGVyYXRpb24sIGV0Yy4pLlxuICAgKiAgVGhlIGluaXRpYWwgcHJvcGVydHkgYWNjZXNzIGZpcmVzIG9uZSB0cmFja2VkIG9uUmVhZCB2aWEgZ2V0VmFsdWUoKTsgc3Vic2VxdWVudFxuICAgKiAgaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyB1c2UgdGhpcyBtZXRob2QgdG8gc3RheSBzaWxlbnQuXG4gICAqICBOT1RFOiBMaWtlIGdldFZhbHVlKCksIHJldHVybnMgdGhlIHJhdyB2YWx1ZSB0byB0aGUgY2FsbGVyLiBSZWRhY3Rpb24gYXBwbGllc1xuICAgKiAgb25seSB0byByZWNvcmRlciBkaXNwYXRjaCDigJQgaXQgZG9lcyBub3QgZmlsdGVyIHRoZSByZXR1cm5lZCB2YWx1ZS4gVGhpcyBtYXRjaGVzXG4gICAqICB0aGUgZXhpc3RpbmcgZ2V0VmFsdWUoKSBjb250cmFjdCB3aGVyZSB1c2VyIGNvZGUgYWx3YXlzIHJlY2VpdmVzIHJhdyBkYXRhLlxuICAgKlxuICAgKiAgUkZDLTAwMyBEMjogYSBzaWxlbnQgcmVhZCBvZiBhIGtleSB0aGlzIHN0YWdlIG5ldmVyIFRSQUNLRUQtcmVhZCBtYXJrc1xuICAgKiAgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGggYHVudHJhY2tlZFNvdXJjZXM6IFsnc2lsZW50J11gIOKAlCBhIGNhdXNhbCBzbGljZVxuICAgKiAgYnVpbHQgZnJvbSBvblJlYWQgZXZlbnRzIHdvdWxkIG1pc3MgdGhpcyBkZXBlbmRlbmN5LCBhbmQgY29uc3VtZXJzIG11c3RcbiAgICogIGJlIHRvbGQuIFNpbGVudCByZWFkcyBzaGFkb3dlZCBieSBhIHRyYWNrZWQgcmVhZCBvZiB0aGUgc2FtZSBrZXkgKHRoZVxuICAgKiAgYXJyYXktcHJveHkgcGF0dGVybiBhYm92ZSkgYXJlIG5vdCBmbGFnZ2VkOiB0aGVpciBlZGdlIGlzIGNhcHR1cmVkLiBBXG4gICAqICB3aG9sZS1zdGF0ZSBzaWxlbnQgcmVhZCAobm8ga2V5KSBpcyBhbHdheXMgZmxhZ2dlZC4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQoa2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl90cmFja2VkUmVhZEtleXMuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdzaWxlbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZCBvZiBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqICoqUmVhZCB2YWx1ZXMgYXJlIEJPUlJPV0VEIOKAlCBkbyBub3QgbXV0YXRlIHRoZW0uKiogU2luY2UgdGhlIGxhenkgYnVmZmVyXG4gICAqICgjMTMpLCByZWFkcyBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgcmV0dXJuIHJlZmVyZW5jZXMgSU5UT1xuICAgKiBDT01NSVRURUQgU0hBUkVEIFNUQVRFLCBhbmQgcmVhZHMgYWZ0ZXIgYSB3cml0ZSByZXR1cm4gcmVmZXJlbmNlcyBpbnRvXG4gICAqIHRoZSBzdGFnZSdzIHByaXZhdGUgdHJhbnNhY3Rpb24tYnVmZmVyIHdvcmtpbmcgY29weSAodGhlIGVhZ2VyIGVuZ2luZVxuICAgKiByZXR1cm5lZCByZWZlcmVuY2VzIGludG8gdGhhdCB3b3JraW5nIGNvcHkgZm9yIEFMTCByZWFkcykuIE11dGF0aW5nIGFcbiAgICogcmV0dXJuZWQgdmFsdWUgaW4gcGxhY2Ugd291bGQgY29ycnVwdCBzdGF0ZSB3aXRob3V0IGEgY29tbWl0IHJlY29yZCDigJRcbiAgICogd3JpdGUgY2hhbmdlcyBiYWNrIHZpYSBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAgaW5zdGVhZC4gVHlwZWRTY29wZVxuICAgKiBjb25zdW1lcnMgYXJlIHNhZmUgYXV0b21hdGljYWxseTogdGhlIHByb3h5IHJvdXRlcyBldmVyeSBtdXRhdGlvblxuICAgKiB0aHJvdWdoIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYC9jb3B5LW9uLXdyaXRlIGFycmF5IG9wcy5cbiAgICpcbiAgICogVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIGRldi1tb2RlIGZyZWV6ZSBndWFyZCBoZXJlOiBkZWVwLWZyZWV6aW5nIGFcbiAgICogYnVmZmVyLXNlcnZlZCByZWFkIHdvdWxkIGZyZWV6ZSB0aGUgc3RhZ2UncyBvd24gd29ya2luZyBjb3B5IGFuZCBtYWtlIGFcbiAgICogbGVnaXRpbWF0ZSByZWFkLXRoZW4tZGVlcC13cml0ZSB0aHJvdywgYW5kIGZyZWV6aW5nIGEgY29tbWl0dGVkLXN0YXRlXG4gICAqIHJlYWQgbXV0YXRlcyBhbiBvYmplY3Qgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgY29uc3VtZXIgb2YgdGhlIGxpdmVcbiAgICogc3RhdGUuIFNlZSBgc3JjL2xpYi9tZW1vcnkvUkVBRE1FLm1kYCAoXCJSZWFkIHZhbHVlcyBhcmUgYm9ycm93ZWRcIikuXG4gICAqXG4gICAqIFJlY29yZGVyIG5vdGU6IHRoZSBgb25SZWFkYCBldmVudCBiZWxvdyBwYXNzZXMgdGhlIFNBTUUgbGl2ZSByZWZlcmVuY2VcbiAgICogKG5vIGNsb25lKSB1bmxlc3MgZmllbGQtbGV2ZWwgcmVkYWN0aW9uIHNjcnVicyBhIGNvcHkg4oCUIHJlY29yZGVycyBtdXN0XG4gICAqIHRyZWF0IGV2ZW50IHZhbHVlcyBhcyByZWFkLW9ubHkgdG9vLlxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVBdChbXSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoLWF3YXJlIGFkYXB0ZXIgYWNjZXNzLiBTZWdtZW50cyBzdGF5IHNlcGFyYXRlIGZyb20gbGl0ZXJhbCBkb3R0ZWQga2V5cyBpbiBTVEFURTtcbiAgICogdGhlIHJlY29yZGVyIGV2ZW50J3MgYGtleWAgaXMgb25seSBhIGRvdC1qb2luZWQgZGlzcGxheSBsYWJlbCwgc28gYFsndXNlcicsJ3NzbiddYCBhbmRcbiAgICogYSBsaXRlcmFsIHRvcC1sZXZlbCBgJ3VzZXIuc3NuJ2AgcHJvZHVjZSB0aGUgc2FtZSBldmVudCBrZXkgKHNhbWUgZm9yIHRoZSB3cml0ZXMgYmVsb3cpLlxuICAgKi9cbiAgZ2V0VmFsdWVBdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUocGF0aCwga2V5KTtcblxuICAgIC8vIFJGQy0wMDMgRDI6IHJlbWVtYmVyIHRyYWNrZWQga2V5cyBzbyBsYXRlciBTSUxFTlQgcmVhZHMgb2YgdGhlIHNhbWVcbiAgICAvLyBrZXkgY291bnQgYXMgc2hhZG93ZWQgKGVkZ2UgYWxyZWFkeSBjYXB0dXJlZCkgaW5zdGVhZCBvZiB1bnRyYWNrZWQuXG4gICAgLy8gT25seSBhIHdob2xlIHRvcC1sZXZlbCB2YWx1ZSBzaGFkb3dzIGEgbGF0ZXIgc2lsZW50IHJlYWQgb2YgdGhhdCB2YWx1ZS5cbiAgICAvLyBSZWFkaW5nIG9uZSBuZXN0ZWQgZmllbGQgbXVzdCBub3QgY2xhaW0gdG8gaGF2ZSBvYnNlcnZlZCBpdHMgc2libGluZ3MuXG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwICYmIGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLl90cmFja2VkUmVhZEtleXMuYWRkKGtleSk7XG4gICAgZWxzZSBpZiAocGF0aC5sZW5ndGggPT09IDEgJiYga2V5ID09PSB1bmRlZmluZWQpIHRoaXMuX3RyYWNrZWRSZWFkS2V5cy5hZGQocGF0aFswXSEpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBIHdob2xlLXN0YXRlIHJlYWQgKG5vIGtleSkgaXMgc2VydmVkIHdpdGggZXZlcnkgcmVkYWN0ZWQga2V5IGluc2lkZVxuICAgICAgLy8gaXQgc2NydWJiZWQ7IGEga2V5ZWQgcmVhZCBpcyBzZXJ2ZWQgdW5kZXIgdGhlIGtleSdzIHZlcmRpY3QuXG4gICAgICBjb25zdCB3aG9sZVN0YXRlID0gcGF0aC5sZW5ndGggPT09IDAgJiYga2V5ID09PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gd2hvbGVTdGF0ZSA/IENMRUFSIDoga2V5ID09PSB1bmRlZmluZWQgPyB0aGlzLnJ1bGUudmVyZGljdChwYXRoKSA6IHRoaXMucnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KTtcbiAgICAgIGNvbnN0IHJlY29yZGVyVmFsdWUgPSB3aG9sZVN0YXRlID8gdGhpcy5ydWxlLnJldGFpblJlY29yZCh2YWx1ZSkgOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICAgIGNvbnN0IGV2ZW50S2V5ID0gcGF0aC5sZW5ndGggPT09IDAgPyBrZXkgOiAoa2V5ID09PSB1bmRlZmluZWQgPyBwYXRoIDogWy4uLnBhdGgsIGtleV0pLmpvaW4oJy4nKTtcblxuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25SZWFkJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWVBdChbXSwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSB3cml0ZXMgc2hhcmUgcmVjb3JkaW5nLCByZWRhY3Rpb24gYW5kIGxpZmV0aW1lIHBvbGljeSB3aXRoIGZsYXQgd3JpdGVzLiAqL1xuICBzZXRWYWx1ZUF0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBwYXRoLmxlbmd0aCA9PT0gMCA/IGtleSA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKTtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywgcGF0aFswXSA/PyBrZXksICd3cml0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShldmVudEtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogd2FybiBpZiB0aGUgdmFsdWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAgICAvLyBDaGVjayBBRlRFUiBhc3NlcnROb3RSZWFkb25seSDigJQgZG9uJ3Qgd2FybiBmb3Igd3JpdGVzIHRoYXQgd2lsbCBiZSBibG9ja2VkLlxuICAgIC8vIENpcmN1bGFyIHZhbHVlcyB3b3JrICh0ZXJtaW5hbCBwcm94eSBoYW5kbGVzIHRoZW0pIGJ1dCBjYW4gcHJvZHVjZVxuICAgIC8vIHN1cnByaXNpbmcgYmVoYXZpb3IgaW4gbmFycmF0aXZlLCBKU09OIHNlcmlhbGl6YXRpb24sIGFuZCBzbmFwc2hvdHMuXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gc2V0VmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ1dyaXRlcyBwYXN0IHRoZSBjeWNsZSBkZXB0aCB3aWxsIHVzZSB0ZXJtaW5hbCBwcm94eSB0cmFja2luZy4gJyArXG4gICAgICAgICAgICAnQ29uc2lkZXIgZmxhdHRlbmluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY29udGV4dCBpcyB0aGUgT05FIGZ1bm5lbDogaXQgZGVjaWRlcyB0aGUgdmVyZGljdCAoZXhwbGljaXQgZmxhZyxcbiAgICAvLyBwb2xpY3kga2V5L3BhdHRlcm4sIHBlci1ydW4gbWFyaywgb3IgZmllbGQtbGV2ZWwgc2NydWIpLCBzdGFnZXMgdGhlXG4gICAgLy8gd3JpdGUgd2l0aCB0aGUgcGF0aHMgdGhlIGxvZyB3aWxsIHNjcnViLCBhbmQgaGFuZHMgdGhlIHZlcmRpY3QgYmFjayBzb1xuICAgIC8vIHJlY29yZGVycyBzZWUgdGhlIHNhbWUgZGVjaXNpb24gdGhlIHJldGFpbmVkIHJlY29yZCBob2xkcy5cbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsIGRlc2NyaXB0aW9uKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgdmFsdWU6IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246ICdzZXQnLFxuICAgICAgICByZWRhY3RlZDogdmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVWYWx1ZUF0KFtdLCBrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSBtZXJnZXMgdXNlIHRoZSBzYW1lIHdyaXRlIGZ1bm5lbCBhcyByZXBsYWNlbWVudHMuICovXG4gIHVwZGF0ZVZhbHVlQXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBldmVudEtleSA9IHBhdGgubGVuZ3RoID09PSAwID8ga2V5IDogWy4uLnBhdGgsIGtleV0uam9pbignLicpO1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBwYXRoWzBdID8/IGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGV2ZW50S2V5KTtcblxuICAgIC8vIERldi1tb2RlOiBzYW1lIGNpcmN1bGFyIGNoZWNrIGFzIHNldFZhbHVlIChtZXJnZSB0YXJnZXRzIGNhbiBiZSBjaXJjdWxhciB0b28pXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gdXBkYXRlVmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMuX3N0YWdlQ29udGV4dC51cGRhdGVPYmplY3QocGF0aCwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgIHJlZGFjdGVkOiB2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ2RlbGV0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuXG4gICAgLy8gRGVsZXRpbmcgYSBrZXkgY2xlYXJzIGl0cyBwZXItY2FsbCByZWRhY3Rpb24gbWFyayAodGhlIGNvbnRleHQnc1xuICAgIC8vIGZ1bm5lbCBkb2VzIHRoYXQpOyBhIHBvbGljeSB2ZXJkaWN0IG9uIHRoZSBrZXkgc3Vydml2ZXMuXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBkZXNjcmlwdGlvbiA/PyBgZGVsZXRlZCAke2tleX1gLCAnZGVsZXRlJyk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnNldEdsb2JhbD8uKGtleSwgdmFsdWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRPYmplY3RJblJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRSb290Py4oa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZC1vbmx5ICsgbWlzYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVhZG9ubHkgaW5wdXQgdmFsdWVzIHBhc3NlZCB0byB0aGlzIHBpcGVsaW5lLCBjYXN0IHRvIGBUYC5cbiAgICogT3JkaW5hcnkgbXV0YWJsZSByZWNvcmRzL2FycmF5cyBhcmUgY29waWVkIGFuZCBmcm96ZW4sIG5vdCBmcm96ZW4gaW4gcGxhY2UuXG4gICAqIE9wYXF1ZSBjYXBhYmlsaXRpZXMgYW5kIGV4cGxpY2l0bHkgZnJvemVuIHdyYXBwZXJzIHJlbWFpbiBib3Jyb3dlZC9saXZlO1xuICAgKiBzZWUgYHByb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC50cyDCtyBjcmVhdGVGcm96ZW5BcmdzYCBmb3IgdGhlIG93bmVyc2hpcCBydWxlLlxuICAgKiBDYWNoZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgZm9yIHplcm8tYWxsb2NhdGlvbiByZXBlYXRlZCBhY2Nlc3MuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBhcHBsaWNhbnROYW1lLCBpbmNvbWUgfSA9IHNjb3BlLmdldEFyZ3M8eyBhcHBsaWNhbnROYW1lOiBzdHJpbmc7IGluY29tZTogbnVtYmVyIH0+KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBhcmdzIGFyZSB1bnRyYWNrZWQgQlkgREVTSUdOLCBzbyBjYWxsaW5nIHRoaXMgKHdpdGggYWN0dWFsXG4gICAqIGlucHV0IHByZXNlbnQpIG1hcmtzIHRoZSBzdGFnZSdzIGNvbW1pdCB3aXRoIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2FyZ3MnXWBcbiAgICog4oCUIHRlbGxpbmcgY2F1c2FsLXNsaWNlIGNvbnN1bWVycyB0aGUgYmFja3dhcmQgc2xpY2UgbWF5IGJlIGluY29tcGxldGVcbiAgICogaGVyZS4gQW4gZW1wdHktYXJncyByZWFkIGNhcnJpZXMgbm8gaW5mb3JtYXRpb24gYW5kIGlzIG5vdCBmbGFnZ2VkLlxuICAgKi9cbiAgZ2V0QXJnczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk6IFQge1xuICAgIGlmICh0aGlzLl9oYXNBcmdzKSB0aGlzLl9zdGFnZUNvbnRleHQubWFya1VudHJhY2tlZFNvdXJjZSgnYXJncycpO1xuICAgIHJldHVybiB0aGlzLl9mcm96ZW5BcmdzIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHkgaW5mcmFzdHJ1Y3R1cmUgdmFsdWVzXG4gICAqIHRoYXQgcHJvcGFnYXRlIHRocm91Z2ggbmVzdGVkIGV4ZWN1dG9ycyAobGlrZSBgcHJvY2Vzcy5lbnZgIGZvciBmbG93Y2hhcnRzKS5cbiAgICpcbiAgICogQ29udGFpbnM6IHNpZ25hbCAoYWJvcnQpLCB0aW1lb3V0TXMsIHRyYWNlSWQuXG4gICAqIEZyb3plbiBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gSW5oZXJpdGVkIGJ5IHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBzaWduYWwsIHRyYWNlSWQgfSA9IHNjb3BlLmdldEVudigpO1xuICAgKiBgYGBcbiAgICpcbiAgICogUkZDLTAwMyBEMjogZW52IGlzIHVudHJhY2tlZCBCWSBERVNJR04sIHNvIGNhbGxpbmcgdGhpcyAod2l0aCBhXG4gICAqIG5vbi1lbXB0eSBlbnZpcm9ubWVudCkgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGhcbiAgICogYHVudHJhY2tlZFNvdXJjZXM6IFsnZW52J11gIOKAlCBzZWUge0BsaW5rIGdldEFyZ3N9LlxuICAgKi9cbiAgZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj4ge1xuICAgIGlmICh0aGlzLl9oYXNFbnYpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdlbnYnKTtcbiAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uRW52O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRQaXBlbGluZUlkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBfaW52b2tlSG9vazxLIGV4dGVuZHMgU2NvcGVIb29rTmFtZT4oaG9vazogSywgZXZlbnQ6IEhvb2tQYXlsb2FkPEs+KTogdm9pZCB7XG4gICAgLy8gVGhlIG9uZSBwZXItcmVjb3JkZXIgbG9vcCAoYHJlY29yZGVyL2hvb2tzLnRzIMK3IGZpcmVgKSDigJQgdGhlIFNBTUUgaW52b2tlIHByaW1pdGl2ZSB0aGVcbiAgICAvLyBkZWZlcnJlZCB0aWVyIHVzZXMgYXQgZGVsaXZlcnkgdGltZSwgc28gdGhlIGlubGluZSBhbmQgZGVmZXJyZWQgcGF0aHMgY2Fubm90IGRyaWZ0LlxuICAgIGZpcmUodGhpcy5fcmVjb3JkZXJzLCBob29rLCBldmVudCwgdGhpcy5fcm91dGVGYWlsdXJlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2NvcGUgY2hhbm5lbCdzIGlzb2xhdGlvbjogYSByZWNvcmRlcidzIHRocm93IGJlY29tZXMgYW4gYG9uRXJyb3JgIG9uIGV2ZXJ5IHJlY29yZGVyXG4gICAqIChzdGFtcGVkIHdpdGggdGhpcyBzdGFnZSksIGFuZCBhIHRocm93IGZyb20gYG9uRXJyb3JgIGl0c2VsZiBpcyBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVGYWlsdXJlOiBIb29rRmFpbHVyZSA9IChlcnJvciwgX3JlY29yZGVyLCBob29rKSA9PiB7XG4gICAgaWYgKGhvb2sgPT09ICdvbkVycm9yJykgcmV0dXJuO1xuICAgIHRoaXMuX2ludm9rZUhvb2soXG4gICAgICAnb25FcnJvcicsXG4gICAgICByZWNvcmRlckZhaWx1cmVFdmVudChcbiAgICAgICAge1xuICAgICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgaG9vayxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcbn1cbiJdfQ==
921
+ /** The signal of a stage outside the runner in a run with no signal: one that never aborts, shared. */
922
+ const NEVER_ABORTED = new AbortController().signal;
923
+ /** The name a late detach is recorded under: the child chart's root id — a name, never its input. */
924
+ function detachKey(child) {
925
+ const id = child?.root?.id;
926
+ return typeof id === 'string' ? `detach:${id}` : 'detach';
927
+ }
928
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgseUNBQThDO0FBRTlDLGdEQUF5RDtBQUN6RCxvREFBbUQ7QUFDbkQsZ0RBQXNEO0FBQ3RELHdEQUFnRztBQUNoRyxvREFBdUU7QUFDdkUsd0VBQW1FO0FBQ25FLG9EQUFxRDtBQVdyRCx3REFBOEQ7QUFDOUQsaURBRzRCO0FBRTVCLDhDQUEwQztBQUUxQyx1RUFBcUY7QUFDckYseURBQThEO0FBRzlELG1EQUFrRTtBQUNsRSxvRUFBb0Y7QUFDcEYsNkNBQW9EO0FBR3BELE1BQWEsV0FBVztJQUNmLE1BQU0sQ0FBVSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTVEOzs7O09BSUc7SUFDSyxNQUFNLENBQVUsbUJBQW1CLEdBQXNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFekUsYUFBYSxDQUFlO0lBQzVCLFVBQVUsQ0FBUztJQUNWLGVBQWUsQ0FBVztJQUU3QywrRUFBK0U7SUFDOUQsV0FBVyxDQUEwQjtJQUV0RCx5RUFBeUU7SUFDeEQsYUFBYSxDQUF5QjtJQUV2RDtvRUFDZ0U7SUFDL0MsUUFBUSxDQUFVO0lBRW5DLCtEQUErRDtJQUM5QyxPQUFPLENBQVU7SUFFbEM7Ozs7OztPQU1HO0lBQ2MsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU5QyxVQUFVLEdBQW9CLEVBQUUsQ0FBQztJQUV6Qzs7Ozs7Ozs7OztPQVVHO0lBQ0ssVUFBVSxHQUFHLEtBQUssQ0FBQztJQUUzQjs7OztPQUlHO0lBQ0ssVUFBVSxDQUFpQjtJQUVuQzs7OztPQUlHO0lBQ0ssWUFBWSxDQUFrQjtJQUV0Qzs7Ozs7Ozs7T0FRRztJQUNjLFFBQVEsQ0FBa0I7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QUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTY29wZUZhY2FkZSDigJQgQmFzZSBjbGFzcyB0aGF0IGxpYnJhcnkgY29uc3VtZXJzIGV4dGVuZCB0byBjcmVhdGUgY3VzdG9tIHNjb3BlIGNsYXNzZXNcbiAqXG4gKiBXcmFwcyBTdGFnZUNvbnRleHQgKGZyb20gbWVtb3J5LykgdG8gcHJvdmlkZSBhIGNvbnN1bWVyLWZyaWVuZGx5IEFQSSBmb3JcbiAqIHN0YXRlIGFjY2VzcywgZGVidWcgbG9nZ2luZywgbWV0cmljcywgYW5kIHJlY29yZGVyIGhvb2tzLlxuICpcbiAqIENvbnN1bWVycyBleHRlbmQgdGhpcyBjbGFzcyB0byBhZGQgZG9tYWluLXNwZWNpZmljIHByb3BlcnRpZXM6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgTXlTY29wZSBleHRlbmRzIFNjb3BlRmFjYWRlIHtcbiAqICAgZ2V0IHVzZXJOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFZhbHVlKCduYW1lJykgYXMgc3RyaW5nOyB9XG4gKiAgIHNldCB1c2VyTmFtZSh2YWx1ZTogc3RyaW5nKSB7IHRoaXMuc2V0VmFsdWUoJ25hbWUnLCB2YWx1ZSk7IH1cbiAqIH1cbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IHN1YmZsb3dTZWdtZW50c09mIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgY2FsbFNlcmllcywgcnVuQ2FsbCB9IGZyb20gJy4uL2F0dGVtcHQvY2FsbC5qcyc7XG5pbXBvcnQgeyBjYWxsVG91Y2hlcyB9IGZyb20gJy4uL2F0dGVtcHQvZWZmZWN0LmpzJztcbmltcG9ydCB7IGFkbWl0QXR0ZW1wdE5hbWUgfSBmcm9tICcuLi9hdHRlbXB0L25hbWUuanMnO1xuaW1wb3J0IHsgb2JzZXJ2ZWRSZWNvcmQsIE9ic2VydmVkU2VyaWVzQm9vaywgcmVhZE9ic2VydmVkUmVwb3J0IH0gZnJvbSAnLi4vYXR0ZW1wdC9vYnNlcnZlZC5qcyc7XG5pbXBvcnQgeyBhZG1pdENhbGxQb2xpY3ksIGF0dGVtcHRDZWlsaW5nIH0gZnJvbSAnLi4vYXR0ZW1wdC9wb2xpY3kuanMnO1xuaW1wb3J0IHsgdGFrZVJldHJ5TG9vcENhbGwgfSBmcm9tICcuLi9hdHRlbXB0L3JldHJ5TG9vcENvbnRleHQuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdEVuZHNBdCB9IGZyb20gJy4uL2F0dGVtcHQvcnVubmVyLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRFcnJvcixcbiAgQ2FsbE9wdGlvbnMsXG4gIExhdGVXcml0ZSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBSZXRyeVBvbGljeSxcbiAgUnVuQ29ycmVsYXRpb24sXG59IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IGhhc0NpcmN1bGFyUmVmZXJlbmNlIH0gZnJvbSAnLi4vY2FwdHVyZS9jaXJjdWxhci5qcyc7XG5pbXBvcnQge1xuICBkZXRhY2hBbmRGb3JnZXQgYXMgZGV0YWNoQW5kRm9yZ2V0U3Bhd24sXG4gIGRldGFjaEFuZEpvaW5MYXRlciBhcyBkZXRhY2hBbmRKb2luTGF0ZXJTcGF3bixcbn0gZnJvbSAnLi4vZGV0YWNoL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgRGV0YWNoRHJpdmVyLCBEZXRhY2hIYW5kbGUgfSBmcm9tICcuLi9kZXRhY2gvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWFkRnJhbWVNZXNzYWdlLCBsYXRlQXR0ZW1wdE1lc3NhZ2UgfSBmcm9tICcuLi9tZW1vcnkvYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyBDTEVBUiwgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IEhvb2tGYWlsdXJlLCBIb29rUGF5bG9hZCwgU2NvcGVIb29rTmFtZSB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB7IGZpcmUsIHJlY29yZGVyRmFpbHVyZUV2ZW50IH0gZnJvbSAnLi4vcmVjb3JkZXIvaG9va3MuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90UmVhZG9ubHksIGNyZWF0ZUZyb3plbkFyZ3MgfSBmcm9tICcuL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC5qcyc7XG5pbXBvcnQgeyByZWdpc3RlclNjb3BlUnVudGltZSB9IGZyb20gJy4vcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEV2ZW50LCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2NvcGVGYWNhZGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJSQU5EID0gU3ltYm9sLmZvcignU2NvcGVGYWNhZGVAdjEnKTtcblxuICAvKipcbiAgICogU2hhcmVkIHNlbnRpbmVsIHJldHVybmVkIGJ5IGBfZ2V0U3ViZmxvd1BhdGgoKWAgZm9yIHJvb3QtbGV2ZWwgc3RhZ2VzXG4gICAqIChubyBzdWJmbG93IG5lc3RpbmcpLiBBdm9pZHMgcGVyLWNhbGwgYWxsb2NhdGlvbiBvZiBhIGZyZXNoXG4gICAqIGBPYmplY3QuZnJlZXplKFtdKWAgb24gZXZlcnkgYGVtaXRFdmVudGAgaW4gdGhlIGNvbW1vbiBuby1zdWJmbG93IGNhc2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfRU1QVFlfU1VCRkxPV19QQVRIOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC5mcmVlemUoW10pO1xuXG4gIHByb3RlY3RlZCBfc3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHByb3RlY3RlZCBfc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfcmVhZE9ubHlWYWx1ZXM/OiB1bmtub3duO1xuXG4gIC8qKiBDYWNoZWQgZGVlcGx5LWZyb3plbiBjb3B5IG9mIHJlYWRPbmx5VmFsdWVzIGZvciBnZXRBcmdzKCkuIENyZWF0ZWQgb25jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJvemVuQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5LCBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgZXhlY3V0b3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkVudjogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRBcmdzKClgIGNhbiByZXR1cm4gYWN0dWFsIGRhdGEg4oCUIGFuIGVtcHR5XG4gICAqICBge31gIHJlYWQgY2FycmllcyBubyBpbmZvcm1hdGlvbiwgc28gaXQgaXMgbmV2ZXIgZmxhZ2dlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzQXJnczogYm9vbGVhbjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRFbnYoKWAgY2FuIHJldHVybiBhY3R1YWwgZGF0YS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzRW52OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiBrZXlzIHRoaXMgc3RhZ2UgaGFzIFRSQUNLRUQtcmVhZCAodmlhIGBnZXRWYWx1ZShrZXkpYCkuXG4gICAqIEEgc2lsZW50IHJlYWQgb2YgYSBrZXkgaW4gdGhpcyBzZXQgaXMgU0hBRE9XRUQg4oCUIGl0cyByZWFk4oaSd3JpdGUgZWRnZSBpc1xuICAgKiBhbHJlYWR5IGNhcHR1cmVkLCBzbyBpdCBpcyBub3QgZmxhZ2dlZCBhcyBhbiB1bnRyYWNrZWQgc291cmNlLiBUaGlzIGlzXG4gICAqIHdoYXQga2VlcHMgVHlwZWRTY29wZSBhcnJheS1wcm94eSBpbnRlcm5hbHMgKHdoaWNoIGFsd2F5cyBmb2xsb3cgYVxuICAgKiB0cmFja2VkIHByb3BlcnR5IHJlYWQpIGFuZCBgJGJhdGNoQXJyYXlgIGhvbmVzdC1idXQtcXVpZXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90cmFja2VkUmVhZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIF9yZWNvcmRlcnM6IFNjb3BlUmVjb3JkZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTZXQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlcjogdGhpcyBzdGFnZSdzIGZyYW1lIGhhcyBmbHVzaGVkLiBBIGZhY2FkZSBpc1xuICAgKiBPTkUgc3RhZ2UgZXhlY3V0aW9uJ3MgaGFuZGxlIOKAlCB0aGUgZW5naW5lIGJ1aWxkcyBhIGZyZXNoIG9uZSBwZXIgc3RhZ2Ug4oCUXG4gICAqIGFuZCBldmVyeSBwcm94eSB0aGUgdHlwZWQgc2NvcGUgaGFuZHMgb3V0IGlzIGJvdW5kIHRvIGl0LiBBIHdyaXRlIGFycml2aW5nXG4gICAqIGFmdGVyIHRoZSBjb21taXQgY29tZXMgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIChhIGNsb3N1cmUsIGFcbiAgICogbW9kdWxlLWxldmVsIGBsZXRgKSBhbmQgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0czogbm9cbiAgICogdHJhY2Ugcm93LCBzdGF0ZSB1bmNoYW5nZWQuIFNvIGl0IGlzIHJlZnVzZWQgKHtAbGluayBhc3NlcnRMaXZlfSkgaW5zdGVhZFxuICAgKiBvZiBsb3N0LiBTZWFsaW5nIGhlcmUgYW5kIG5vdCBvbiBgU3RhZ2VDb250ZXh0YCBpcyBkZWxpYmVyYXRlOiB0aGUgZnJhbWVcbiAgICogc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCBieSBkZXNpZ24gKCMxM2Ig4oCUIHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IG5lZWQgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgcnVsZSBvZiB0aGlzIGZhY2FkZSdzIG93biDigJQgT05MWSB3aGVuIGl0cyBjb250ZXh0IGNhcnJpZXMgbm9uZSAoYmFyZVxuICAgKiBjb250ZXh0cyBpbiB1bml0IHRlc3RzKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgbGl2ZXMgb24gdGhlIGNvbnRleHRcbiAgICogdHJlZSBhbmQgdGhpcyBzdGF5cyB1bnNldDsgc2VlIHtAbGluayBydWxlfS5cbiAgICovXG4gIHByaXZhdGUgX2xvY2FsUnVsZT86IFJlZGFjdGlvblJ1bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiAoMTAuMSksIGluc3RhbGxlZCBieSB0aGUgZXhlY3V0b3IncyBjb21wb3NlZCBzY29wZSBmYWN0b3J5XG4gICAqIChgUnVuT2JzZXJ2ZXJzIMK3IGNvbXBvc2VTY29wZUZhY3RvcnlgKSDigJQgc3RhbXBlZCBMQVNUIG9uIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50IHRoaXMgZmFjYWRlIGZpcmVzLFxuICAgKiBvbmx5IHdoZW4gcHJlc2VudCwgc28gYSBydW4gd2l0aG91dCBvbmUgZmlyZXMgYnl0ZS1pZGVudGljYWwgZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHQgdGhpcyBmYWNhZGUgd2FzIGJ1aWx0IGZvciAoUDFiKSDigJQgdGhlIHJ1bm5lcidzLCByZWFkIG9mZiB0aGVcbiAgICogY29udGV4dCBhdCBjb25zdHJ1Y3Rpb24uIEEgZmFjYWRlIGlzIE9ORSBhdHRlbXB0J3MgaGFuZGxlOiBvbmNlIHRoYXRcbiAgICogYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIChpdHMgY2FwLCB0aGUgZGVhZGxpbmUsIGEgY2FuY2VsbGF0aW9uLCBhXG4gICAqIHRocm93KSwgdGhlIGZ1bmN0aW9uIGJlaGluZCBpdCBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIGFueXRoaW5nIGl0XG4gICAqIHRvdWNoZXMgdGhyb3VnaCB0aGlzIGZhY2FkZSBpcyByZWZ1c2VkICh7QGxpbmsgcmVmdXNlSWZBdHRlbXB0RW5kZWR9KSDigJRcbiAgICogYSB3cml0ZSBvciBhbiBlbWl0IGlzIGFsc28gcmVjb3JkZWQgb24gdGhlIHN0YWdlLiBBYnNlbnQgZm9yIGEgc3RhZ2UgdGhlXG4gICAqIHJ1bm5lciBkb2VzIG5vdCBydW46IG5vdGhpbmcgaXMgZmVuY2VkLCBhcyBiZWZvcmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdHRlbXB0PzogQXR0ZW1wdENvbnRleHQ7XG5cbiAgLyoqIFRoZSBydW4ncyBzaWduYWwsIGZvciBgJGF0dGVtcHQoKWAgb2YgYSBzdGFnZSB0aGUgcnVubmVyIGRvZXMgbm90IHJ1bi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcnVuU2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqIGAkY2FsbGBzIHdpdGggYG9mID4gMWAgaW4gZmxpZ2h0IHRocm91Z2ggdGhpcyBmYWNhZGUg4oCUIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIGluc2lkZSBvbmUgaXMgcmVmdXNlZCAoUDMpLiAqL1xuICBwcml2YXRlIF9yZXRyeWluZ0NhbGxzID0gMDtcblxuICAvKiogVGhpcyBhdHRlbXB0J3Mgb2JzZXJ2ZWQgcmVwb3J0cywgZ3JvdXBlZCBpbnRvIHNlcmllcyAoUDIpIOKAlCBtYWRlIG9uIHRoZSBmaXJzdCByZXBvcnQuICovXG4gIHByaXZhdGUgX29ic2VydmVkQm9vaz86IE9ic2VydmVkU2VyaWVzQm9vaztcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seVZhbHVlcz86IHVua25vd24sIGV4ZWN1dGlvbkVudj86IEV4ZWN1dGlvbkVudikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5fc3RhZ2VOYW1lID0gc3RhZ2VOYW1lO1xuICAgIHRoaXMuX3JlYWRPbmx5VmFsdWVzID0gcmVhZE9ubHlWYWx1ZXM7XG4gICAgdGhpcy5fZnJvemVuQXJncyA9IGNyZWF0ZUZyb3plbkFyZ3MocmVhZE9ubHlWYWx1ZXMpO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkVudiA9IE9iamVjdC5mcmVlemUoeyAuLi5leGVjdXRpb25FbnYgfSk7XG4gICAgdGhpcy5faGFzQXJncyA9IE9iamVjdC5rZXlzKHRoaXMuX2Zyb3plbkFyZ3MpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5faGFzRW52ID0gT2JqZWN0LmtleXModGhpcy5fZXhlY3V0aW9uRW52KS5sZW5ndGggPiAwO1xuICAgIHRoaXMuX2F0dGVtcHQgPSBjb250ZXh0LmF0dGVtcHQ7XG4gICAgdGhpcy5fcnVuU2lnbmFsID0gY29udGV4dC5ydW5TaWduYWw7XG4gICAgLy8gVGhlIGNvbnRleHQgbXVzdCBjYXJyeSB0aGUgcnVsZSBCRUZPUkUgdGhlIGZpcnN0IHdyaXRlLCBzaW5jZSB0aGVcbiAgICAvLyBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGlzIHdoYXQgbWFya3MgYSBwZXItY2FsbCByZWRhY3RlZCBrZXkgb24gaXQuXG4gICAgLy8gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIGNvbnRleHQgYWxyZWFkeSBoYXMgdGhlIHJ1bidzIHJ1bGUgKGluc3RhbGxlZCBvblxuICAgIC8vIHRoZSByb290LCBpbmhlcml0ZWQgZG93bikgYW5kIHRoaXMgcmUtaW5zdGFsbHMgdGhlIHNhbWUgb2JqZWN0OyBvbiBhXG4gICAgLy8gYmFyZSBjb250ZXh0IGl0IGluc3RhbGxzIGEgZnJlc2ggb25lLlxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHRoaXMucnVsZSk7XG5cbiAgICAvLyBSZWdpc3RlciBhcyBjb21taXQgb2JzZXJ2ZXIgc28gU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBmaXJlcyB3aGVuIFN0YWdlQ29udGV4dC5jb21taXQoKSBpcyBjYWxsZWRcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Q29tbWl0T2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgdGhpcy5fb25Db21taXRGaXJlZChtdXRhdGlvbnMpO1xuICAgIH0pO1xuICAgIHJlZ2lzdGVyU2NvcGVSdW50aW1lKHRoaXMsIHsgdGFyZ2V0OiB0aGlzLCBoYW5kbGVzQXNzaWdubWVudHM6IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3Rpb24gcnVsZSB0aGlzIGZhY2FkZSBkZWNpZGVzIHdpdGgg4oCUIHRoZSBTQU1FIG9iamVjdCBpdHNcbiAgICogYFN0YWdlQ29udGV4dGAgcmV0YWlucyB3aXRoIChgbWVtb3J5L3JlZGFjdGlvbi50c2AsIHRoZSBvbmUgb3duZXIpLiBVbmRlclxuICAgKiBhbiBleGVjdXRvciB0aGUgcnVsZSBpcyBpbnN0YWxsZWQgb24gdGhlIHJ1bnRpbWUgcm9vdCBhbmQgaW5oZXJpdGVkIGJ5XG4gICAqIGV2ZXJ5IGNvbnRleHQsIHNvIHRoZSBmYWNhZGUgc2ltcGx5IHJlYWRzIGl0LiBPbiBhIGJhcmUgY29udGV4dCAodW5pdFxuICAgKiB0ZXN0cywgaGFuZC1idWlsdCBzY29wZXMpIHRoZSBmYWNhZGUgY3JlYXRlcyBvbmUgYW5kIGluc3RhbGxzIGl0IG9uIHRoZVxuICAgKiBjb250ZXh0LCBzbyB0aGUgY29udGV4dCdzIHJldGVudGlvbiBhbmQgdGhlIGZhY2FkZSdzIHJlY29yZGVyIHZpZXdzXG4gICAqIHN0aWxsIHNoYXJlIGEgc2luZ2xlIHZlcmRpY3QuXG4gICAqL1xuICBwcml2YXRlIGdldCBydWxlKCk6IFJlZGFjdGlvblJ1bGUge1xuICAgIGNvbnN0IHNoYXJlZCA9IHRoaXMuX3N0YWdlQ29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gICAgaWYgKHNoYXJlZCkgcmV0dXJuIHNoYXJlZDtcbiAgICBpZiAoIXRoaXMuX2xvY2FsUnVsZSkge1xuICAgICAgdGhpcy5fbG9jYWxSdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUoKTtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHRoaXMuX2xvY2FsUnVsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2NhbFJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSByZWRhY3RlZC1rZXlzIHNldCBhY3Jvc3MgbXVsdGlwbGUgU2NvcGVGYWNhZGUgaW5zdGFuY2VzLlxuICAgKiBDYWxsIHRoaXMgdG8gbWFrZSByZWRhY3Rpb24gcGVyc2lzdCBhY3Jvc3Mgc3RhZ2VzIGluIHRoZSBzYW1lIHBpcGVsaW5lLlxuICAgKiAoVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bidzIHJ1bGUgYWxyZWFkeSBzaGFyZXMgb25lIHNldDsgdGhpcyBjYWxsIGlzXG4gICAqIHRoZW4gYSBuby1vcC4pXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzKHNoYXJlZFNldDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGUudXNlTWFya2VkS2V5cyhzaGFyZWRTZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVkYWN0ZWQta2V5cyBzZXQgKGZvciBzaGFyaW5nIHdpdGggb3RoZXIgc2NvcGVzKS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRSZWRhY3RlZEtleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnJ1bGUubWFya2VkS2V5cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeS4gVGhlIHBvbGljeSBpcyBhZGRpdGl2ZSDigJRcbiAgICogaXQgd29ya3MgYWxvbmdzaWRlIG1hbnVhbCBgc2V0VmFsdWUoLi4uLCB0cnVlKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5ydWxlLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIHJ1bidzIGNvcnJlbGF0aW9uIOKAlCBldmVyeSBzY29wZSBhbmQgZW1pdCBldmVudCB0aGlzIGZhY2FkZSBmaXJlcyBjYXJyaWVzIGl0OyBgdW5kZWZpbmVkYCBjbGVhcnNcbiAgICogaXQuIEVuZ2luZS1vbmx5ICh0aGUgY29tcG9zZWQgc2NvcGUgZmFjdG9yeSBjYWxscyBpdCBvbmNlIHBlciBzdGFnZSksIGxpa2UgYHVzZVJlZGFjdGlvblBvbGljeWAuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlQ29ycmVsYXRpb24oY29ycmVsYXRpb246IFJ1bkNvcnJlbGF0aW9uIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fY29ycmVsYXRpb24gPSBjb3JyZWxhdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UmVkYWN0aW9uUG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5nZXRQb2xpY3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eS5cbiAgICogTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcyDigJQgb25seSBrZXkgbmFtZXMsIGZpZWxkIG5hbWVzLCBhbmQgcGF0dGVybnMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLnJlcG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5fcmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlcklkKTtcbiAgfVxuXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9yZWNvcmRlcnNdO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZVN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VTdGFydCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZUVuZChkdXJhdGlvbj86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VFbmQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlQYXVzZShwYXVzZURhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25QYXVzZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgcGF1c2VEYXRhLFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5UmVzdW1lKGhhc0lucHV0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25SZXN1bWUnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5Q29tbWl0KG11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25Db21taXQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG11dGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZ1c2UgYSB3cml0ZSBmcm9tIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgKDkuMjIuMCkuIFRocm93cyB3aXRoIHRoZVxuICAgKiBzdGFnZSB0aGUgaGFuZGxlIGNhbWUgZnJvbTsgdGhlIGVuZ2luZSdzIGVycm9yIHBhdGggYXR0cmlidXRlcyB0aGUgdGhyb3dcbiAgICogdG8gdGhlIHN0YWdlIHRoYXQgbWFkZSB0aGUgd3JpdGUuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydExpdmUoa2V5OiBzdHJpbmcsIGNoYW5uZWw6IExhdGVXcml0ZVsnY2hhbm5lbCddID0gJ3N0YXRlJyk6IHZvaWQge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5LCBjaGFubmVsKTtcbiAgICBpZiAodGhpcy5fY29tbWl0dGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGVhZEZyYW1lTWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCwga2V5KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IGZlbmNlIChQMWIpOiB0aGlzIGZhY2FkZSdzIGF0dGVtcHQgaGFzIGVuZGVkLCBzbyB3aGF0ZXZlciB0aGVcbiAgICogYWJhbmRvbmVkIGZ1bmN0aW9uIGRvZXMgbm93IG11c3Qgbm90IHJlYWNoIHRoZSBzdGFnZSDigJQgbm90IGl0cyBidWZmZXIsIGl0c1xuICAgKiByZWFkcywgaXRzIHVudHJhY2tlZCBzb3VyY2VzIG9yIGEgcmVjb3JkZXIuIFJlZnVzZWQ7IGEgd3JpdGUgb3IgYW4gZW1pdCBpc1xuICAgKiByZWNvcmRlZCBvbiB0aGUgc3RhZ2UgZmlyc3QgKGBTdGFnZVNuYXBzaG90LmxhdGVXcml0ZXNgLCB0aGUgbmFtZSBvbmx5KSxcbiAgICogYSByZWFkIChgY2hhbm5lbGAgdW5kZWZpbmVkKSBpcyBub3QuXG4gICAqL1xuICBwcml2YXRlIHJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleTogc3RyaW5nLCBjaGFubmVsPzogTGF0ZVdyaXRlWydjaGFubmVsJ10pOiB2b2lkIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICBpZiAoYXR0ZW1wdCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl9zdGFnZUNvbnRleHQuaGFzQXR0ZW1wdEVuZGVkKGF0dGVtcHQuYXR0ZW1wdCkpIHJldHVybjtcbiAgICBpZiAoY2hhbm5lbCAhPT0gdW5kZWZpbmVkKSB0aGlzLl9zdGFnZUNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogYXR0ZW1wdC5hdHRlbXB0LCBrZXksIGNoYW5uZWwgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGxhdGVBdHRlbXB0TWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIGF0dGVtcHQuc2VyaWVzLCBhdHRlbXB0LmF0dGVtcHQsIGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IHRoaXMgc3RhZ2UgZnVuY3Rpb24gcnVucyBpbiDigJQgYHNjb3BlLiRhdHRlbXB0KClgIChkZXNpZ25cbiAgICogwqczLjEpLiBJdHMgYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGF0dGVtcHQgbXVzdCBzdG9wIChpdHMgY2FwLCB0aGUgcnVuJ3NcbiAgICogZGVhZGxpbmUsIGEgY2FuY2VsbGF0aW9uKTogcGFzcyBpdCB0byBgZmV0Y2hgIGFuZCBTREsgY2FsbHMuIEl0c1xuICAgKiBgdGltZUxlZnRNcygpYCByZWFkcyB0aGUgcnVuJ3MgZGVhZGxpbmUg4oCUIHRpbWUgaXMgYW4gaW5wdXQgdGhlIHJlY29yZFxuICAgKiBjYW5ub3QgcmVwbGF5LCBzbyB3aXRoIGEgZGVhZGxpbmUgdGhlIHJlYWQgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0XG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2VudiddYCwgYXMgYGdldEVudigpYCBkb2VzLlxuICAgKlxuICAgKiBBIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4gKG5vIHJldHJ5IHBvbGljeSwgbm8gYHRpbWVvdXRNc2AsXG4gICAqIG5vIGRlYWRsaW5lKSBpcyBhdHRlbXB0IDEgb2YgMSwgd2l0aCB0aGUgcnVuJ3Mgc2lnbmFsIGFuZCBgSW5maW5pdHlgIGxlZnQuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdCA9IHNjb3BlLiRhdHRlbXB0KCk7XG4gICAqIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IHQuc2lnbmFsIH0pO1xuICAgKiBpZiAodC50aW1lTGVmdE1zKCkgPCAxXzAwMCkgc2NvcGUuc3VtbWFyeSA9ICdwYXJ0aWFsJztcbiAgICogYGBgXG4gICAqL1xuICBnZXRBdHRlbXB0KCk6IEF0dGVtcHRDb250ZXh0IHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICBjb25zdCBvYnNlcnZlZCA9IChyZXBvcnQ6IE9ic2VydmVkQXR0ZW1wdCkgPT4gdGhpcy5yZWNvcmRPYnNlcnZlZChyZXBvcnQpO1xuICAgIGlmIChhdHRlbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2VyaWVzOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgIG9mOiAxLFxuICAgICAgICBzaWduYWw6IHRoaXMuX3J1blNpZ25hbCA/PyBORVZFUl9BQk9SVEVELFxuICAgICAgICB0aW1lTGVmdE1zOiAoKSA9PiBJbmZpbml0eSxcbiAgICAgICAgb2JzZXJ2ZWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnJGF0dGVtcHQnKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fc3RhZ2VDb250ZXh0O1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIC4uLmF0dGVtcHQsXG4gICAgICB0aW1lTGVmdE1zOiAoKSA9PiB7XG4gICAgICAgIC8vIFJlYWQgdGhyb3VnaCBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIGF0dGVtcHQsIGl0IG11c3Qgbm90IG1hcmsgYSBMQVRFUiBhdHRlbXB0J3MgY29tbWl0LlxuICAgICAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCckYXR0ZW1wdCcpO1xuICAgICAgICBpZiAoYXR0ZW1wdC5kZWFkbGluZSAhPT0gdW5kZWZpbmVkKSBjb250ZXh0Lm1hcmtVbnRyYWNrZWRTb3VyY2UoJ2VudicpO1xuICAgICAgICByZXR1cm4gYXR0ZW1wdC50aW1lTGVmdE1zKCk7XG4gICAgICB9LFxuICAgICAgb2JzZXJ2ZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsIHRvIGFuIG91dHNpZGUgc3lzdGVtLCBtYWRlIGluc2lkZSB0aGlzIHN0YWdlIOKAlCBgc2NvcGUuJGNhbGwodGFyZ2V0LCBmbiwgcG9saWN5PylgIChkZXNpZ24gwqczLjYsIFAyKS5cbiAgICogYGZuYCBydW5zIG9uIHRoZSBhdHRlbXB0IHJ1bm5lciB1bmRlciBgcG9saWN5YCAobm9uZSA9IE9ORSBhdHRlbXB0LCBzdGlsbCByZWNvcmRlZDogYSBzaW5nbGUgY2FsbCBpcyBldmlkZW5jZVxuICAgKiB0b28pLCBhbmQgZXZlcnkgYXR0ZW1wdCBpcyBhbiBgQXR0ZW1wdFJlY29yZGAgb2Yga2luZCBgJ2NhbGwnYCBvbiB0aGlzIHN0YWdlJ3MgZXhlY3V0aW9uLXRyZWUgbm9kZSBhbmQgb25cbiAgICogYG9uQXR0ZW1wdGAg4oCUIGl0cyB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnkgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uLCBpdHMgZXJyb3Igc2VydmVkIHVuZGVyIHRoZVxuICAgKiBydW4ncyByZWRhY3Rpb24gcnVsZS5cbiAgICpcbiAgICogVGhlIGNhbGwgbGl2ZXMgd2l0aGluIHRoaXMgc3RhZ2UgYXR0ZW1wdDogaXQgaXMgY2FwcGVkIGJ5IHRoZSB0aW1lIHRoZSBhdHRlbXB0IGhhcyBsZWZ0IChpdHMgY2FwLCB0aGUgcnVuJ3NcbiAgICogZGVhZGxpbmUpIGFuZCBgZm5gJ3MgYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGF0dGVtcHQgZG9lczsgb25jZSB0aGUgYXR0ZW1wdCBpcyBvdmVyIG5vdGhpbmcgb2YgdGhlIGNhbGwgbGFuZHNcbiAgICogYW5kIG5vIGZ1cnRoZXIgYXR0ZW1wdCBvZiBpdCBzdGFydHMgKGBhdHRlbXB0L2NhbGwudHNgKS4gYHRhcmdldGAgaXMgYSBOQU1FIGZyb20gY29kZSDigJQgbmV2ZXIgYSB2YWx1ZS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBxdW90ZSA9IGF3YWl0IHNjb3BlLiRjYWxsKCdzdHJpcGUucXVvdGVzLmNyZWF0ZScsICh0KSA9PiBzdHJpcGUucXVvdGVzLmNyZWF0ZShib2R5LCB7IHNpZ25hbDogdC5zaWduYWwgfSksXG4gICAqICAgeyBhdHRlbXB0czogMywgdGltZW91dE1zOiAxMF8wMDAsIGJhY2tvZmZNczogKG4pID0+IDUwMCAqIG4gfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBBIGNhbGwgdGhhdCBDSEFOR0VTIGFuIG91dHNpZGUgc3lzdGVtIGRlY2xhcmVzIGl0IChQMyk6IGBvcHRpb25zLnRvdWNoZXNgIG5hbWVzIHRoZSBzeXN0ZW0gYW5kXG4gICAqIGBvcHRpb25zLmlkZW1wb3RlbmN5S2V5YCB0aGUga2V5IGV2ZXJ5IGF0dGVtcHQgaXMgbWFkZSB1bmRlciAoYHQuaWRlbXBvdGVuY3lLZXlgKSDigJQgYSB2YWx1ZSBmcm9tIHRoZSBzdGFnZSdzXG4gICAqIGlucHV0IG9yIHN0YXRlLCBuZXZlciBmcm9tIG1vZGVsIG91dHB1dC4gQSB0b3VjaGluZyBjYWxsIHRoYXQgbWF5IHJldHJ5IHdpdGhvdXQgYSBrZXkgaXMgcmVmdXNlZCBoZXJlLFxuICAgKiBiZWZvcmUgYW55dGhpbmcgaXMgc2VudDsgZWFjaCByZWNvcmQgc2F5cyB3aGF0IGl0cyBhdHRlbXB0IGRpZCAoYGVmZmVjdGApLCBhbmQgYSBjYWxsIHRoYXQgZW5kcyB3aXRob3V0IGFuIGFuc3dlciBhZnRlciBhbnkgYXR0ZW1wdCBsZWZ0IHRoZVxuICAgKiBlZmZlY3QgdW5rbm93biByZWplY3RzIHdpdGggYFVua25vd25FZmZlY3RFcnJvcmAg4oCUIHJlY29uY2lsZSBieSB0aGUga2V5LCBkbyBub3QgcmV0cnkgYmxpbmRseS5cbiAgICovXG4gIGNhbGw8VD4oXG4gICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgZm46IChhdHRlbXB0OiBBdHRlbXB0Q29udGV4dCkgPT4gUHJvbWlzZTxUPiB8IFQsXG4gICAgcG9saWN5PzogUmV0cnlQb2xpY3ksXG4gICAgb3B0aW9ucz86IENhbGxPcHRpb25zLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBuYW1lID0gYWRtaXRBdHRlbXB0TmFtZSgnJGNhbGwnLCAndGFyZ2V0JywgdGFyZ2V0KTtcbiAgICBjb25zdCB3aGVyZSA9IGAkY2FsbCgnJHtuYW1lfScpYDtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3doZXJlfTogZm4gbXVzdCBiZSBhIGZ1bmN0aW9uYCk7XG4gICAgY29uc3QgYWRtaXR0ZWQgPSBhZG1pdENhbGxQb2xpY3kod2hlcmUsIHBvbGljeSk7XG4gICAgY29uc3QgdG91Y2hlcyA9IGNhbGxUb3VjaGVzKHdoZXJlLCBvcHRpb25zLCBhZG1pdHRlZCk7XG4gICAgLy8gQSBrZXlsZXNzIHRvdWNoaW5nIGNhbGwgaXMgc2VudCBvbmNlIG9ubHkgaWYgdGhlIHN0YWdlIGF0dGVtcHQgdGhhdCBtYWtlcyBpdCBuZXZlciBydW5zIGFnYWluIChQMyk6IGEgc3RhZ2VcbiAgICAvLyB0aGF0IG1heSByZXRyeSB3b3VsZCByZS1zZW5kIGl0IHdpdGhvdXQgYSBrZXkg4oCUIHJlZnVzZWQgaGVyZSwgYmVmb3JlIGFueXRoaW5nIGlzIHNlbnQuXG4gICAgLy8gU28gaXMgb25lIGluc2lkZSBhbiBlbmNsb3NpbmcgYCRjYWxsYCB0aGF0IG1heSByZXRyeSAoaXRzIGZ1bmN0aW9uIHJ1bnMgb25jZSBwZXIgb3V0ZXIgYXR0ZW1wdCkuXG4gICAgaWYgKHRvdWNoZXMgIT09IHVuZGVmaW5lZCAmJiB0b3VjaGVzLmlkZW1wb3RlbmN5S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVuY2xvc2luZyA9ICh0aGlzLl9hdHRlbXB0Py5vZiA/PyAxKSA+IDEgPyAnYSBzdGFnZScgOiB0aGlzLl9yZXRyeWluZ0NhbGxzID4gMCA/ICdhICRjYWxsJyA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbmNsb3NpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAke3doZXJlfTogdG91Y2hlcyBcIiR7dG91Y2hlcy5zeXN0ZW19XCIgd2l0aCBubyBpZGVtcG90ZW5jeUtleSwgaW5zaWRlICR7ZW5jbG9zaW5nfSB0aGF0IG1heSByZXRyeSDigJQgYSBgICtcbiAgICAgICAgICAgICdyZXRyeSB3b3VsZCBzZW5kIGl0IGFnYWluIHdpdGhvdXQgYSBrZXkuIEdpdmUgdGhlIGNhbGwgYSBrZXkuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrS2V5bGVzc0VmZmVjdCgpO1xuICAgIH1cbiAgICAvLyBGcm9tIGFuIGVuZGVkIGF0dGVtcHQgb3IgYSBjb21taXR0ZWQgZnJhbWU6IHJlZnVzZWQgKGFuZCByZWNvcmRlZCBieSBuYW1lKSBiZWZvcmUgYW55dGhpbmcgcmVhY2hlcyBvdXRzaWRlLlxuICAgIHRoaXMucmVmdXNlTGF0ZUNhbGwoYGNhbGw6JHtuYW1lfWApO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9zdGFnZUNvbnRleHQ7XG4gICAgY29uc3Qgc3RhZ2VBdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdD8uYXR0ZW1wdCA/PyAxO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX2F0dGVtcHQ/LnNpZ25hbCA/PyB0aGlzLl9ydW5TaWduYWw7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBhdHRlbXB0RW5kc0F0KHRoaXMuX2F0dGVtcHQpO1xuICAgIGNvbnN0IGVuZGVkID0gY29udGV4dC5jYWxsc0VuZGVkU2lnbmFsKHN0YWdlQXR0ZW1wdCk7XG4gICAgLy8gV2hpbGUgYSBjYWxsIHRoYXQgbWF5IHJldHJ5IGlzIGluIGZsaWdodCwgYSBrZXlsZXNzIHRvdWNoaW5nIGNhbGwgbWFkZSBpbnNpZGUgaXQgaXMgcmVmdXNlZCAoYWJvdmUpLlxuICAgIGNvbnN0IHJldHJ5aW5nID0gYXR0ZW1wdENlaWxpbmcoYWRtaXR0ZWQuYXR0ZW1wdHMpID4gMTtcbiAgICBpZiAocmV0cnlpbmcpIHRoaXMuX3JldHJ5aW5nQ2FsbHMgKz0gMTtcbiAgICBsZXQgcmVzdWx0OiBQcm9taXNlPFQ+O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnN0YXJ0Q2FsbChuYW1lLCBmbiwgYWRtaXR0ZWQsIHRvdWNoZXMsIHN0YWdlQXR0ZW1wdCwgc2lnbmFsLCBkZWFkbGluZSwgZW5kZWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAocmV0cnlpbmcpIHRoaXMuX3JldHJ5aW5nQ2FsbHMgLT0gMTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAoIXJldHJ5aW5nKSByZXR1cm4gcmVzdWx0O1xuICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9yZXRyeWluZ0NhbGxzIC09IDE7XG4gICAgfTtcbiAgICByZXN1bHQudGhlbihyZWxlYXNlLCByZWxlYXNlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIGBydW5DYWxsYCB3aXRoIHRoaXMgc3RhZ2UgYXR0ZW1wdCBhcyBpdHMgaG9zdCAoYGNhbGxgKS4gKi9cbiAgcHJpdmF0ZSBzdGFydENhbGw8VD4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiAoYXR0ZW1wdDogQXR0ZW1wdENvbnRleHQpID0+IFByb21pc2U8VD4gfCBULFxuICAgIGFkbWl0dGVkOiBSZXRyeVBvbGljeSxcbiAgICB0b3VjaGVzOiB7IHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nOyByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxuICAgIHN0YWdlQXR0ZW1wdDogbnVtYmVyLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gICAgZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBlbmRlZDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9zdGFnZUNvbnRleHQ7XG4gICAgY29uc3QgbG9vcCA9IHRha2VSZXRyeUxvb3BDYWxsKHRoaXMpO1xuICAgIHJldHVybiBydW5DYWxsKG5hbWUsIGZuLCBhZG1pdHRlZCwge1xuICAgICAgb3BlblNlcmllczogKCkgPT4gY2FsbFNlcmllcyhjb250ZXh0LnJ1bnRpbWVTdGFnZUlkLCBzdGFnZUF0dGVtcHQsIGNvbnRleHQubmV4dENhbGxPcmRpbmFsKHN0YWdlQXR0ZW1wdCkpLFxuICAgICAgLi4uKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmIHsgc2lnbmFsIH0pLFxuICAgICAgLi4uKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZSB9KSxcbiAgICAgIGVuZGVkLFxuICAgICAgLi4uKHRvdWNoZXMgIT09IHVuZGVmaW5lZCAmJiB7IGVmZmVjdDogdGhpcy5jYWxsRWZmZWN0KHRvdWNoZXMpIH0pLFxuICAgICAgLy8gVGhlIGZyYW1lJ3Mgb3duIGNvbW1pdCBzdGF0ZSAoZXZlcnkgYXR0ZW1wdCdzIGZhY2FkZSByZWFkcyB0aGUgc2FtZSksIG5ldmVyIGEgZmFjYWRlIGZsYWcuXG4gICAgICBhZG1pdHM6IChjdXQpID0+ICFjb250ZXh0LmNvbW1pdHRlZCAmJiAoY3V0IHx8ICEoZW5kZWQuYWJvcnRlZCB8fCB0aGlzLmF0dGVtcHRIYXNFbmRlZCgpKSksXG4gICAgICBzZXJ2ZTogKGVycm9yKSA9PiB0aGlzLnJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpLFxuICAgICAgcmVwb3J0OiAocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gbG9vcCA/IE9iamVjdC5mcmVlemUoeyAuLi5yZWNvcmQsIHJldHJ5TG9vcDogbG9vcC5pZGVudGl0eSB9KSA6IHJlY29yZDtcbiAgICAgICAgY29udGV4dC5yZXBvcnRDYWxsQXR0ZW1wdChzZXJ2ZWQsIHN0cnVjdHVyZWRFcnJvcik7XG4gICAgICAgIGxvb3A/LnJlY29yZChzZXJ2ZWQpO1xuICAgICAgfSxcbiAgICAgIHJlZnVzZWQ6ICgpID0+IGNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogc3RhZ2VBdHRlbXB0LCBrZXk6IGBjYWxsOiR7bmFtZX1gLCBjaGFubmVsOiAnYXR0ZW1wdCcgfSksXG4gICAgICBvYnNlcnZlOiAocmVwb3J0LCBhdCkgPT4gdGhpcy5yZWNvcmRPYnNlcnZlZChyZXBvcnQsIGF0LmVuZGVkKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgVGhlIGV4cGxpY2l0IHJldHJ5IGhlbHBlciBvd25zIHRoaXMgc3RhdGU7IHRoZSBub3JtYWwgd3JpdGUgcGF0aCBzdGlsbCBvd25zIHJldGVudGlvbi9jb21taXQuICovXG4gIHdyaXRlUmV0cnlMb29wU3RhdGUoa2V5OiBzdHJpbmcsIHN0YXRlOiB7IHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnNlcnZlUmV0cnlMb29wS2V5KHN0YXRlLmlkZW1wb3RlbmN5S2V5KTtcbiAgICBpZiAoa2VwdCAhPT0gc3RhdGUuaWRlbXBvdGVuY3lLZXkpIHRoaXMucnVsZS5pbmhlcml0RmllbGRzKGtleSwgWydpZGVtcG90ZW5jeUtleSddKTtcbiAgICB0aGlzLnNldFZhbHVlKGtleSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBFeGFjdGx5IHRoZSBleGlzdGluZyBQMyBrZXktcmV0ZW50aW9uIGxhdzsgb3BlcmF0aW9uYWwgc3RhdGUga2VlcHMgdGhlIHJlYWwga2V5LiAqL1xuICBzZXJ2ZVJldHJ5TG9vcEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5yZXRhaW5JZGVtcG90ZW5jeUtleShrZXksIHtcbiAgICAgIGlucHV0OiB0aGlzLl9yZWFkT25seVZhbHVlcyxcbiAgICAgIHNlbGVjdGVkUmVhZHM6IHRoaXMuX3N0YWdlQ29udGV4dC5zZWxlY3RlZFJlYWRzICsgKHRoaXMuX3N0YWdlQ29udGV4dC5lZmZlY3RLZXlUYWludGVkID8gMSA6IDApLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBMb29wIHN0YXRlIGlzIGR1cmFibGUgZGF0YTogbmV2ZXIgcGVyc2lzdCB0aGUgdGhyb3duIHZhbHVlLCBzdGFjaywgY2F1c2Ugb3IgcGF5bG9hZC4gKi9cbiAgc2VydmVSZXRyeUxvb3BFcnJvcihlcnJvcjogdW5rbm93bik6IEF0dGVtcHRFcnJvciB7XG4gICAgY29uc3Qgc2VydmVkID0gdGhpcy5ydWxlLnNlcnZlZEVycm9yKGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogc2VydmVkLm1lc3NhZ2UsXG4gICAgICAuLi4oc2VydmVkLm5hbWUgIT09IHVuZGVmaW5lZCA/IHsgbmFtZTogc2VydmVkLm5hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihzZXJ2ZWQuY29kZSAhPT0gdW5kZWZpbmVkID8geyBjb2RlOiBzZXJ2ZWQuY29kZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogQSB0b3VjaGluZyBjYWxsJ3MgdGFyZ2V0LCBpdHMga2V5IHNlcnZlZCBmb3IgdGhlIHJlY29yZHMgKGBSZWRhY3Rpb25SdWxlIMK3IHJldGFpbklkZW1wb3RlbmN5S2V5YDogYnkgbmFtZSBhbmQgYnkgaXRzIHNvdXJjZXMpLiAqL1xuICBwcml2YXRlIGNhbGxFZmZlY3QodG91Y2hlczogeyByZWFkb25seSBzeXN0ZW06IHN0cmluZzsgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmcgfSk6IHtcbiAgICByZWFkb25seSBzeXN0ZW06IHN0cmluZztcbiAgICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgICByZWFkb25seSByZWNvcmRlZEtleT86IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3Qga2V5ID0gdG91Y2hlcy5pZGVtcG90ZW5jeUtleTtcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHJldHVybiB0b3VjaGVzO1xuICAgIC8vIEEga2V5IHRoZSBzdGFnZSBidWlsdCBhZnRlciByZWFkaW5nIGEgc2VsZWN0ZWQgdmFsdWUg4oCUIG9yIGZyb20gYW4gaW5wdXQgaG9sZGluZyBvbmUg4oCUIGlzIHNlcnZlZCB3aG9sZS5cbiAgICBjb25zdCByZWNvcmRlZEtleSA9IHRoaXMucnVsZS5yZXRhaW5JZGVtcG90ZW5jeUtleShrZXksIHtcbiAgICAgIGlucHV0OiB0aGlzLl9yZWFkT25seVZhbHVlcyxcbiAgICAgIC8vIFRoZSBzdGFnZSdzIG93biBrZXkgbWF5IGJlIG1hZGUgb2YgYSBzZWxlY3RlZCB2YWx1ZTogYSBrZXkgcGFzc2VkIG9uIGZyb20gaXQgaXMgc2VydmVkIHRoZSBzYW1lIHdheS5cbiAgICAgIHNlbGVjdGVkUmVhZHM6IHRoaXMuX3N0YWdlQ29udGV4dC5zZWxlY3RlZFJlYWRzICsgKHRoaXMuX3N0YWdlQ29udGV4dC5lZmZlY3RLZXlUYWludGVkID8gMSA6IDApLFxuICAgIH0pO1xuICAgIHJldHVybiB7IC4uLnRvdWNoZXMsIHJlY29yZGVkS2V5IH07XG4gIH1cblxuICAvKipcbiAgICogQSBgJGNhbGxgIGZyb20gYW4gZW5kZWQgYXR0ZW1wdCwgb3IgZnJvbSBhIGZyYW1lIHRoYXQgaGFzIGNvbW1pdHRlZDogcmVjb3JkZWQgYnkgbmFtZSAoYGxhdGVXcml0ZXNgLCBjaGFubmVsXG4gICAqIGAnYXR0ZW1wdCdgKSBhbmQgcmVmdXNlZCDigJQgYmVmb3JlIGFueXRoaW5nIHJlYWNoZXMgb3V0c2lkZS4gVGhlIFAxYiBmZW5jZSBmaXJzdCwgc28gaXRzIG1lc3NhZ2UgYW5kIHJlY29yZCBhcmVcbiAgICogdGhlIHNhbWUuXG4gICAqL1xuICBwcml2YXRlIHJlZnVzZUxhdGVDYWxsKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXksICdhdHRlbXB0Jyk7XG4gICAgaWYgKCF0aGlzLl9zdGFnZUNvbnRleHQuY29tbWl0dGVkICYmICF0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogdGhpcy5fYXR0ZW1wdD8uYXR0ZW1wdCA/PyAxLCBrZXksIGNoYW5uZWw6ICdhdHRlbXB0JyB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZGVhZEZyYW1lTWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCwga2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gb3V0c2lkZSBhdHRlbXB0IGFuIGFkYXB0ZXIgcmVwb3J0ZWQg4oCUIGBBdHRlbXB0Q29udGV4dC5vYnNlcnZlZGAgb24gdGhpcyBzdGFnZSdzIGF0dGVtcHQgb3Igb24gb25lIG9mIGl0c1xuICAgKiBjYWxscycgKFAyKS4gUmVhZCBhbmQgdmFsaWRhdGVkIGZpcnN0IChhIG1hbGZvcm1lZCByZXBvcnQgaXMgdGhlIGFkYXB0ZXIncyBidWc6IGEgYFR5cGVFcnJvcmAsIGFuZCBpdCBuZXZlclxuICAgKiByZWFjaGVzIHRoZSByZWNvcmQpLiBBIHJlcG9ydCB0aGF0IGNvbWVzIGFmdGVyIGl0cyBhdHRlbXB0IGVuZGVkIOKAlCB0aGUgY2FsbCBhdHRlbXB0IGl0IHdhcyBtYWRlIHRocm91Z2gsIHRoaXNcbiAgICogc3RhZ2UgYXR0ZW1wdCwgb3IgdGhlIGZyYW1lJ3MgY29tbWl0IOKAlCBpcyByZWNvcmRlZCBieSBuYW1lIChgbGF0ZVdyaXRlc2AsIGNoYW5uZWwgYCdhdHRlbXB0J2ApIGFuZCBEUk9QUEVELFxuICAgKiBuZXZlciB0aHJvd246IGFkYXB0ZXJzIHJlcG9ydCBmcm9tIGFuIFNESydzIG93biBjYWxsYmFja3MsIHdoaWNoIG1heSBmaXJlIGFmdGVyIHRoZSBzdGFnZSBtb3ZlZCBvbiwgYW5kIGFuXG4gICAqIG9ic2VydmVkIGF0dGVtcHQgbmV2ZXIgY2hhbmdlcyBjb250cm9sIGZsb3cg4oCUIGluIGVpdGhlciBkaXJlY3Rpb24uIEl0cyBzZXJpZXMgb3BlbnMgYXQgdGhpcyBzdGFnZSBhdHRlbXB0J3MgY2FsbFxuICAgKiBsZXZlbDogYW4gU0RLJ3MgY2FsbCBpcyBhIGNhbGwgdGhlIHN0YWdlIGF0dGVtcHQgbWFkZSwgc28gYSByZXBvcnQgbWFkZSB0aHJvdWdoIGEgYCRjYWxsYCBpcyB0aGF0IGNhbGwncyBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRPYnNlcnZlZChyZXBvcnQ6IE9ic2VydmVkQXR0ZW1wdCwgY2FsbEF0dGVtcHRFbmRlZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVhZCA9IHJlYWRPYnNlcnZlZFJlcG9ydChyZXBvcnQpO1xuICAgIGNvbnN0IGtleSA9IGBvYnNlcnZlZDoke3JlYWQudGFyZ2V0fWA7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3N0YWdlQ29udGV4dDtcbiAgICBjb25zdCBzdGFnZUF0dGVtcHQgPSB0aGlzLl9hdHRlbXB0Py5hdHRlbXB0ID8/IDE7XG4gICAgaWYgKGNhbGxBdHRlbXB0RW5kZWQgfHwgdGhpcy5hdHRlbXB0SGFzRW5kZWQoKSB8fCBjb250ZXh0LmNvbW1pdHRlZCB8fCB0aGlzLl9jb21taXR0ZWQpIHtcbiAgICAgIGNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogc3RhZ2VBdHRlbXB0LCBrZXksIGNoYW5uZWw6ICdhdHRlbXB0JyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYm9vayA9ICh0aGlzLl9vYnNlcnZlZEJvb2sgPz89IG5ldyBPYnNlcnZlZFNlcmllc0Jvb2soKCkgPT5cbiAgICAgIGNhbGxTZXJpZXMoY29udGV4dC5ydW50aW1lU3RhZ2VJZCwgc3RhZ2VBdHRlbXB0LCBjb250ZXh0Lm5leHRDYWxsT3JkaW5hbChzdGFnZUF0dGVtcHQpKSxcbiAgICApKTtcbiAgICBjb25zdCB7IHJlY29yZCwgc3RydWN0dXJlZEVycm9yIH0gPSBvYnNlcnZlZFJlY29yZChyZWFkLCB7XG4gICAgICBzZXJpZXM6IGJvb2suc2VyaWVzRm9yKHJlYWQpLFxuICAgICAgbm93OiBEYXRlLm5vdyxcbiAgICAgIHNlcnZlOiAoZXJyb3IpID0+IHRoaXMucnVsZS5zZXJ2ZWRFcnJvcihlcnJvciksXG4gICAgfSk7XG4gICAgY29udGV4dC5yZXBvcnRDYWxsQXR0ZW1wdChyZWNvcmQsIHN0cnVjdHVyZWRFcnJvcik7XG4gIH1cblxuICAvKiogVGhpcyBmYWNhZGUncyBhdHRlbXB0IGhhcyBlbmRlZCDigJQgdGhlIFAxYiBmZW5jZSBpcyBjbG9zZWQuICovXG4gIHByaXZhdGUgYXR0ZW1wdEhhc0VuZGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGF0dGVtcHQgPSB0aGlzLl9hdHRlbXB0O1xuICAgIHJldHVybiBhdHRlbXB0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fc3RhZ2VDb250ZXh0Lmhhc0F0dGVtcHRFbmRlZChhdHRlbXB0LmF0dGVtcHQpO1xuICB9XG5cbiAgLyoqIENhbGxlZCBieSBTdGFnZUNvbnRleHQuY29tbWl0KCkgb2JzZXJ2ZXIuIENvbnZlcnRzIHRyYWNrZWQgd3JpdGVzIHRvIENvbW1pdEV2ZW50IGZvcm1hdC5cbiAgICogIEVycm9ycyBhcmUgY2F1Z2h0IHRvIHByZXZlbnQgcmVjb3JkZXIgaXNzdWVzIGZyb20gYWJvcnRpbmcgdGhlIHRyYXZlcnNhbC4gKi9cbiAgcHJpdmF0ZSBfb25Db21taXRGaXJlZChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGBfc3RhZ2VXcml0ZXNgIGFscmVhZHkgaG9sZHMgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBjb250ZXh0IHJldGFpbnNcbiAgICAgIC8vIHVuZGVyIHRoZSBzYW1lIHJ1bGUpOyBhcHBseWluZyB0aGUgdmVyZGljdCBhZ2FpbiBoZXJlIGlzIGlkZW1wb3RlbnRcbiAgICAgIC8vIGFuZCBrZWVwcyBhIGtleSBtYXJrZWQgQUZURVIgaXRzIHdyaXRlIHNjcnViYmVkIGF0IGNvbW1pdCB0aW1lLlxuICAgICAgY29uc3QgY29tbWl0TXV0YXRpb25zOiBDb21taXRFdmVudFsnbXV0YXRpb25zJ10gPSBPYmplY3QuZW50cmllcyhtdXRhdGlvbnMpLm1hcCgoW2tleSwgZW50cnldKSA9PiAoe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB0aGlzLnJ1bGUucmV0YWluKFtrZXldLCBlbnRyeS52YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogZW50cnkub3BlcmF0aW9uLFxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLm5vdGlmeUNvbW1pdChjb21taXRNdXRhdGlvbnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdyDigJQgcmVjb3JkZXIgZXJyb3JzIG11c3Qgbm90IGFib3J0IHRoZSB0cmF2ZXJzYWwuXG4gICAgICAvLyBJbmRpdmlkdWFsIHJlY29yZGVyIGVycm9ycyBhcmUgYWxyZWFkeSBpc29sYXRlZCBieSBfaW52b2tlSG9vay5cbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRGVidWcgLyBEaWFnbm9zdGljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gVGhlc2UgbGVnYWN5IG1ldGhvZHMgc3RpbGwgd3JpdGUgdG8gdGhlIGBTdGFnZUNvbnRleHRgIGRpYWdub3N0aWNcbiAgLy8gc2lkZSBiYWdzIChsb2dDb250ZXh0IC8gZXJyb3JDb250ZXh0IC8gbWV0cmljQ29udGV4dCAvIGV2YWxDb250ZXh0KSBmb3JcbiAgLy8gc25hcHNob3QgaW5jbHVzaW9uLiBUaGV5IEFMU08gZmlyZSB0aHJvdWdoIHRoZSBFbWl0IGNoYW5uZWwgc28gYW55XG4gIC8vIGF0dGFjaGVkIGBFbWl0UmVjb3JkZXJgIHNlZXMgdGhlbSBpbiByZWFsIHRpbWUg4oCUIGNsb3NpbmcgdGhlXG4gIC8vIGxvbmctc3RhbmRpbmcgZ2FwIHdoZXJlIGAkZGVidWdgL2AkbWV0cmljYCB3ZW50IHRvIHVub2JzZXJ2ZWQgYmFncy5cblxuICBhZGREZWJ1Z0luZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgbG9nLmRlYnVnLiR7a2V5fWAsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdsb2dzJywga2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYGxvZy5kZWJ1Zy4ke2tleX1gLCB7IGtleSwgdmFsdWU6IGtlcHQsIGxldmVsOiAnZGVidWcnIH0pO1xuICB9XG5cbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnbG9nLmRlYnVnLm1lc3NhZ2VzJywgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2xvZ3MnLCAnbWVzc2FnZXMnLCBbdmFsdWVdKTtcbiAgICB0aGlzLmVtaXRFdmVudCgnbG9nLmRlYnVnLm1lc3NhZ2VzJywgeyB2YWx1ZTogQXJyYXkuaXNBcnJheShrZXB0KSA/IGtlcHRbMF0gOiBrZXB0LCBsZXZlbDogJ2RlYnVnJyB9KTtcbiAgfVxuXG4gIGFkZEVycm9ySW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGBsb2cuZXJyb3IuJHtrZXl9YCwgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2Vycm9ycycsIGtleSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBsb2cuZXJyb3IuJHtrZXl9YCwgeyBrZXksIHZhbHVlOiBrZXB0LCBsZXZlbDogJ2Vycm9yJyB9KTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgbWV0cmljLiR7bWV0cmljTmFtZX1gLCAnZW1pdCcpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnbWV0cmljcycsIG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbWV0cmljLiR7bWV0cmljTmFtZX1gLCB7IG5hbWU6IG1ldHJpY05hbWUsIHZhbHVlOiBrZXB0IH0pO1xuICB9XG5cbiAgYWRkRXZhbChtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgZXZhbC4ke21ldHJpY05hbWV9YCwgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2V2YWxzJywgbWV0cmljTmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBldmFsLiR7bWV0cmljTmFtZX1gLCB7IG5hbWU6IG1ldHJpY05hbWUsIHZhbHVlOiBrZXB0IH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIEVtaXQg4oCUIFBoYXNlIDMgcHJpbWFyeSBwcmltaXRpdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEZpcmUgYSBzdHJ1Y3R1cmVkIGV2ZW50IHRvIGV2ZXJ5IGF0dGFjaGVkIHJlY29yZGVyIGltcGxlbWVudGluZ1xuICAgKiBgb25FbWl0YC4gU3luY2hyb25vdXMsIGluLW9yZGVyLCBwYXNzLXRocm91Z2gg4oCUIG5vIGJ1ZmZlcmluZy5cbiAgICpcbiAgICogLSAqKkZhc3QtcGF0aCoqOiB6ZXJvIGFsbG9jYXRpb24gKyB6ZXJvIGNvc3Qgd2hlbiBubyByZWNvcmRlcnMgYXJlXG4gICAqICAgYXR0YWNoZWQgKGVhcmx5IHJldHVybiBvbiBlbXB0eSBsaXN0KS5cbiAgICogLSAqKkVucmljaG1lbnQqKjogbGlicmFyeSBhdXRvLWFkZHMgYHN0YWdlTmFtZWAsIGBydW50aW1lU3RhZ2VJZGAsXG4gICAqICAgYHN1YmZsb3dQYXRoYCwgYHBpcGVsaW5lSWRgLCBgdGltZXN0YW1wYCB0byB0aGUgZXZlbnQuXG4gICAqIC0gKipSZWRhY3Rpb24qKjogYFJlZGFjdGlvblBvbGljeS5lbWl0UGF0dGVybnNgIHJlZ2V4ZXMgYXJlIG1hdGNoZWRcbiAgICogICBhZ2FpbnN0IGBuYW1lYCDigJQgbWF0Y2hlZCBldmVudHMgaGF2ZSB0aGVpciBwYXlsb2FkIHJlcGxhY2VkIHdpdGhcbiAgICogICBgJ1tSRURBQ1RFRF0nYCBiZWZvcmUgZGlzcGF0Y2guXG4gICAqIC0gKipFcnJvciBpc29sYXRpb24qKjogYSB0aHJvd2luZyBgb25FbWl0YCBkb2VzIG5vdCBwcm9wYWdhdGUg4oCUIGl0IGlzXG4gICAqICAgY2F1Z2h0IGFuZCByb3V0ZWQgdG8gYG9uRXJyb3JgIG9uIHJlbWFpbmluZyByZWNvcmRlcnMsIG1hdGNoaW5nIHRoZVxuICAgKiAgIHBhdHRlcm4gdXNlZCBieSBvdGhlciBzY29wZSBldmVudHMuXG4gICAqXG4gICAqIENvbnN1bWVycyBjYWxsIHRoaXMgdmlhIHRoZSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIHNjb3BlIG1ldGhvZDtcbiAgICogdGhlIG1ldGhvZCByb3V0ZXMgaGVyZSB2aWEgYGNyZWF0ZVR5cGVkU2NvcGVgLlxuICAgKi9cbiAgZW1pdEV2ZW50KG5hbWU6IHN0cmluZywgcGF5bG9hZDogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIEFuIGVuZGVkIGF0dGVtcHQgZW1pdHMgbm90aGluZyDigJQgcmVmdXNlZCAoYW5kIHJlY29yZGVkKSBiZWZvcmUgdGhlIGZhc3QgcGF0aCwgc28gdGhlIHJlY29yZCBkb2VzIG5vdCBkZXBlbmRcbiAgICAvLyBvbiB3aGV0aGVyIGEgcmVjb3JkZXIgaGFwcGVuZWQgdG8gYmUgYXR0YWNoZWQuXG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChuYW1lLCAnZW1pdCcpO1xuICAgIC8vIEZhc3QtcGF0aDogemVybyB3b3JrIHdoZW4gbm8gcmVjb3JkZXJzIGFyZSBhdHRhY2hlZC5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gUmVkYWN0aW9uOiBpZiB0aGUgZXZlbnQgbmFtZSBtYXRjaGVzIGFueSBlbWl0UGF0dGVybiwgcmVwbGFjZSBwYXlsb2FkXG4gICAgLy8gd2l0aCAnW1JFREFDVEVEXScgQkVGT1JFIGNvbnN0cnVjdGluZyB0aGUgZXZlbnQgKG5vIGxlYWsgdGhyb3VnaFxuICAgIC8vIGNvcHktb24td3JpdGUsIG5vIHdheSBmb3IgcmVjb3JkZXJzIHRvIHNlZSB0aGUgcmF3IHZhbHVlKS5cbiAgICBjb25zdCBmaW5hbFBheWxvYWQgPSB0aGlzLnJ1bGUucmV0YWluRW1pdChuYW1lLCBwYXlsb2FkKTtcbiAgICBjb25zdCBzb3VyY2VQb3NpdGlvbiA9IHRoaXMuX3N0YWdlQ29udGV4dC5jYXB0dXJlRW1pdFBvc2l0aW9uKCk7XG5cbiAgICAvLyBCdWlsZCB0aGUgZW5yaWNoZWQgZXZlbnQgb25jZTsgcGFzcyB0aGUgc2FtZSByZWZlcmVuY2UgdG8gYWxsXG4gICAgLy8gcmVjb3JkZXJzIHVuZGVyIHRoZWlyIHJlYWQtb25seSBjb250cmFjdC4gU291cmNlIGNvb3JkaW5hdGVzIGFyZVxuICAgIC8vIGNhcHR1cmVkIGJlZm9yZSBhbnkgaW5saW5lIGhvb2sgb3IgZGVmZXJyZWQgdGFwIG9ic2VydmVzIHRoZSBldmVudC5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBwYXlsb2FkOiBmaW5hbFBheWxvYWQsXG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogdGhpcy5fZ2V0U3ViZmxvd1BhdGgoKSxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIC4uLihzb3VyY2VQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHNvdXJjZVBvc2l0aW9uIH0pLFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICAvLyBEaXNwYXRjaCB3aXRoIGVycm9yIGlzb2xhdGlvbiDigJQgdGhlIHNhbWUgYGZpcmVgIGxvb3AgYW5kIHRoZSBzYW1lIGZhaWx1cmUgcm91dGluZyBhc1xuICAgIC8vIGV2ZXJ5IG90aGVyIHNjb3BlIGV2ZW50OiBhIHRocm93aW5nIHJlY29yZGVyJ3MgZXJyb3IgcmVhY2hlcyBvbkVycm9yIG9uIHRoZSByZWNvcmRlcnM7XG4gICAgLy8gdGhlIGVtaXQgbG9vcCBjb250aW51ZXMgdW5hZmZlY3RlZC5cbiAgICBmaXJlKHRoaXMuX3JlY29yZGVycywgJ29uRW1pdCcsIHRoaXMuX2NvcnJlbGF0ZWQoZXZlbnQpLCB0aGlzLl9yb3V0ZUZhaWx1cmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERldGFjaCDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIERlbGVnYXRlcyB0byB0aGUgc2hhcmVkIGBkZXRhY2gvc3Bhd25gIGhlbHBlciwgd2hpY2ggbWludHMgYSByZWZJZFxuICAvLyBmcm9tIHRoaXMgc3RhZ2UncyBgcnVudGltZVN0YWdlSWRgIGFuZCBjYWxscyBgZHJpdmVyLnNjaGVkdWxlKClgLlxuICAvLyBSb3V0ZWQgdGhyb3VnaCBgY3JlYXRlVHlwZWRTY29wZWAgYXMgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAgLy8gYW5kIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgLlxuXG4gIC8qKiBTZWUgYFNjb3BlTWV0aG9kcy4kZGV0YWNoQW5kSm9pbkxhdGVyYC4gKi9cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlcjogRGV0YWNoRHJpdmVyLCBjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dD86IHVua25vd24pOiBEZXRhY2hIYW5kbGUge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoZGV0YWNoS2V5KGNoaWxkKSwgJ2RldGFjaCcpO1xuICAgIHJldHVybiBkZXRhY2hBbmRKb2luTGF0ZXJTcGF3bihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBTZWUgYFNjb3BlTWV0aG9kcy4kZGV0YWNoQW5kRm9yZ2V0YC4gKi9cbiAgZGV0YWNoQW5kRm9yZ2V0KGRyaXZlcjogRGV0YWNoRHJpdmVyLCBjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dD86IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGRldGFjaEtleShjaGlsZCksICdkZXRhY2gnKTtcbiAgICBkZXRhY2hBbmRGb3JnZXRTcGF3bihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgc3ViZmxvd1BhdGggKG91dGVyIOKGkiBpbm5lcikgZm9yIGV2ZW50IGVucmljaG1lbnQuXG4gICAqXG4gICAqIFBhcnNlcyBmcm9tIGBydW50aW1lU3RhZ2VJZGAgd2hpY2ggaGFzIHRoZSBmb3JtYXRcbiAgICogYFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleGAgKHNlZSBgbGliL2lkcy9ydW50aW1lU3RhZ2VJZC50c2ApLlxuICAgKiBTdWJmbG93IGlzb2xhdGlvbiBwcmV2ZW50cyB3YWxraW5nIHRoZSBwYXJlbnQtY2hhaW4gYWNyb3NzIGJvdW5kYXJpZXMsXG4gICAqIHNvIHRoZSBydW50aW1lU3RhZ2VJZCDigJQgZ2xvYmFsbHkgdW5pcXVlLCBpbmNsdWRlcyBmdWxsIHBhdGgg4oCUIGlzIHRoZVxuICAgKiBjYW5vbmljYWwgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc3ViZmxvdyBoaWVyYXJjaHkgYXQgZW1pdCB0aW1lLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICAnc2VlZCMwJyAgICAgICAgICAgICAgICAg4oaSIFtdICAgICAgICAgICAgICAgICAgICAocm9vdClcbiAgICogICAnc2YtaW5uZXIvaW5uZXIjNScgICAgICAg4oaSIFsnc2YtaW5uZXInXVxuICAgKiAgICdzZi1hL3NmLWIvc3RhZ2UjMycgICAgICDihpIgWydzZi1hJywgJ3NmLWInXSAgICAgIChuZXN0ZWQpXG4gICAqL1xuICBwcml2YXRlIF9nZXRTdWJmbG93UGF0aCgpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgY29uc3QgcnRpZCA9IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAoIXJ0aWQpIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIC8vIFRoZSBncmFtbWFyJ3Mgb25lIG93bmVyIHJlYWRzIHRoZSBwYXRoIHBvcnRpb24gKGBpZHMvcnVudGltZVN0YWdlSWQudHNgKS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHN1YmZsb3dTZWdtZW50c09mKHJ0aWQpO1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHNlZ21lbnRzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBOb24tVHJhY2tpbmcgU3RhdGUgSW5zcGVjdGlvbiAoZm9yIFR5cGVkU2NvcGUgcHJveHkgaW50ZXJuYWxzKSDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmV0dXJucyBhbGwgc3RhdGUga2V5cyB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgVHlwZWRTY29wZSBvd25LZXlzL2hhcyB0cmFwcy4gKi9cbiAgZ2V0U3RhdGVLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCcqJyk7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIGhhcyB0cmFwLlxuICAgKiAgQ29udHJhY3Q6IHJldHVybnMgZmFsc2UgZm9yIGtleXMgbmV2ZXIgc2V0IE9SIGtleXMgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICogIFRoaXMgbWF0Y2hlcyBkZWxldGVWYWx1ZSgpIHNlbWFudGljcyAoc2V0cyB0byB1bmRlZmluZWQgPSBkZWxldGVkKS4gKi9cbiAgaGFzS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBhcnJheSBwcm94eSBnZXRDdXJyZW50KCkgdG8gYXZvaWRcbiAgICogIHBoYW50b20gcmVhZHMgb24gaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyAoLmxlbmd0aCwgLmhhcywgaXRlcmF0aW9uLCBldGMuKS5cbiAgICogIFRoZSBpbml0aWFsIHByb3BlcnR5IGFjY2VzcyBmaXJlcyBvbmUgdHJhY2tlZCBvblJlYWQgdmlhIGdldFZhbHVlKCk7IHN1YnNlcXVlbnRcbiAgICogIGludGVybmFsIGFycmF5IG9wZXJhdGlvbnMgdXNlIHRoaXMgbWV0aG9kIHRvIHN0YXkgc2lsZW50LlxuICAgKiAgTk9URTogTGlrZSBnZXRWYWx1ZSgpLCByZXR1cm5zIHRoZSByYXcgdmFsdWUgdG8gdGhlIGNhbGxlci4gUmVkYWN0aW9uIGFwcGxpZXNcbiAgICogIG9ubHkgdG8gcmVjb3JkZXIgZGlzcGF0Y2gg4oCUIGl0IGRvZXMgbm90IGZpbHRlciB0aGUgcmV0dXJuZWQgdmFsdWUuIFRoaXMgbWF0Y2hlc1xuICAgKiAgdGhlIGV4aXN0aW5nIGdldFZhbHVlKCkgY29udHJhY3Qgd2hlcmUgdXNlciBjb2RlIGFsd2F5cyByZWNlaXZlcyByYXcgZGF0YS5cbiAgICpcbiAgICogIFJGQy0wMDMgRDI6IGEgc2lsZW50IHJlYWQgb2YgYSBrZXkgdGhpcyBzdGFnZSBuZXZlciBUUkFDS0VELXJlYWQgbWFya3NcbiAgICogIHRoZSBzdGFnZSdzIGNvbW1pdCB3aXRoIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ3NpbGVudCddYCDigJQgYSBjYXVzYWwgc2xpY2VcbiAgICogIGJ1aWx0IGZyb20gb25SZWFkIGV2ZW50cyB3b3VsZCBtaXNzIHRoaXMgZGVwZW5kZW5jeSwgYW5kIGNvbnN1bWVycyBtdXN0XG4gICAqICBiZSB0b2xkLiBTaWxlbnQgcmVhZHMgc2hhZG93ZWQgYnkgYSB0cmFja2VkIHJlYWQgb2YgdGhlIHNhbWUga2V5ICh0aGVcbiAgICogIGFycmF5LXByb3h5IHBhdHRlcm4gYWJvdmUpIGFyZSBub3QgZmxhZ2dlZDogdGhlaXIgZWRnZSBpcyBjYXB0dXJlZC4gQVxuICAgKiAgd2hvbGUtc3RhdGUgc2lsZW50IHJlYWQgKG5vIGtleSkgaXMgYWx3YXlzIGZsYWdnZWQuICovXG4gIGdldFZhbHVlU2lsZW50KGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5ID8/ICcqJyk7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl90cmFja2VkUmVhZEtleXMuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdzaWxlbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZCBvZiBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqICoqUmVhZCB2YWx1ZXMgYXJlIEJPUlJPV0VEIOKAlCBkbyBub3QgbXV0YXRlIHRoZW0uKiogU2luY2UgdGhlIGxhenkgYnVmZmVyXG4gICAqICgjMTMpLCByZWFkcyBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgcmV0dXJuIHJlZmVyZW5jZXMgSU5UT1xuICAgKiBDT01NSVRURUQgU0hBUkVEIFNUQVRFLCBhbmQgcmVhZHMgYWZ0ZXIgYSB3cml0ZSByZXR1cm4gcmVmZXJlbmNlcyBpbnRvXG4gICAqIHRoZSBzdGFnZSdzIHByaXZhdGUgdHJhbnNhY3Rpb24tYnVmZmVyIHdvcmtpbmcgY29weSAodGhlIGVhZ2VyIGVuZ2luZVxuICAgKiByZXR1cm5lZCByZWZlcmVuY2VzIGludG8gdGhhdCB3b3JraW5nIGNvcHkgZm9yIEFMTCByZWFkcykuIE11dGF0aW5nIGFcbiAgICogcmV0dXJuZWQgdmFsdWUgaW4gcGxhY2Ugd291bGQgY29ycnVwdCBzdGF0ZSB3aXRob3V0IGEgY29tbWl0IHJlY29yZCDigJRcbiAgICogd3JpdGUgY2hhbmdlcyBiYWNrIHZpYSBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAgaW5zdGVhZC4gVHlwZWRTY29wZVxuICAgKiBjb25zdW1lcnMgYXJlIHNhZmUgYXV0b21hdGljYWxseTogdGhlIHByb3h5IHJvdXRlcyBldmVyeSBtdXRhdGlvblxuICAgKiB0aHJvdWdoIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYC9jb3B5LW9uLXdyaXRlIGFycmF5IG9wcy5cbiAgICpcbiAgICogVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIGRldi1tb2RlIGZyZWV6ZSBndWFyZCBoZXJlOiBkZWVwLWZyZWV6aW5nIGFcbiAgICogYnVmZmVyLXNlcnZlZCByZWFkIHdvdWxkIGZyZWV6ZSB0aGUgc3RhZ2UncyBvd24gd29ya2luZyBjb3B5IGFuZCBtYWtlIGFcbiAgICogbGVnaXRpbWF0ZSByZWFkLXRoZW4tZGVlcC13cml0ZSB0aHJvdywgYW5kIGZyZWV6aW5nIGEgY29tbWl0dGVkLXN0YXRlXG4gICAqIHJlYWQgbXV0YXRlcyBhbiBvYmplY3Qgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgY29uc3VtZXIgb2YgdGhlIGxpdmVcbiAgICogc3RhdGUuIFNlZSBgc3JjL2xpYi9tZW1vcnkvUkVBRE1FLm1kYCAoXCJSZWFkIHZhbHVlcyBhcmUgYm9ycm93ZWRcIikuXG4gICAqXG4gICAqIFJlY29yZGVyIG5vdGU6IHRoZSBgb25SZWFkYCBldmVudCBiZWxvdyBwYXNzZXMgdGhlIFNBTUUgbGl2ZSByZWZlcmVuY2VcbiAgICogKG5vIGNsb25lKSB1bmxlc3MgZmllbGQtbGV2ZWwgcmVkYWN0aW9uIHNjcnVicyBhIGNvcHkg4oCUIHJlY29yZGVycyBtdXN0XG4gICAqIHRyZWF0IGV2ZW50IHZhbHVlcyBhcyByZWFkLW9ubHkgdG9vLlxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVBdChbXSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoLWF3YXJlIGFkYXB0ZXIgYWNjZXNzLiBTZWdtZW50cyBzdGF5IHNlcGFyYXRlIGZyb20gbGl0ZXJhbCBkb3R0ZWQga2V5cyBpbiBTVEFURTtcbiAgICogdGhlIHJlY29yZGVyIGV2ZW50J3MgYGtleWAgaXMgb25seSBhIGRvdC1qb2luZWQgZGlzcGxheSBsYWJlbCwgc28gYFsndXNlcicsJ3NzbiddYCBhbmRcbiAgICogYSBsaXRlcmFsIHRvcC1sZXZlbCBgJ3VzZXIuc3NuJ2AgcHJvZHVjZSB0aGUgc2FtZSBldmVudCBrZXkgKHNhbWUgZm9yIHRoZSB3cml0ZXMgYmVsb3cpLlxuICAgKi9cbiAgZ2V0VmFsdWVBdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXkgPT09IHVuZGVmaW5lZCA/IHBhdGguam9pbignLicpIHx8ICcqJyA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUocGF0aCwga2V5KTtcblxuICAgIC8vIFJGQy0wMDMgRDI6IHJlbWVtYmVyIHRyYWNrZWQga2V5cyBzbyBsYXRlciBTSUxFTlQgcmVhZHMgb2YgdGhlIHNhbWVcbiAgICAvLyBrZXkgY291bnQgYXMgc2hhZG93ZWQgKGVkZ2UgYWxyZWFkeSBjYXB0dXJlZCkgaW5zdGVhZCBvZiB1bnRyYWNrZWQuXG4gICAgLy8gT25seSBhIHdob2xlIHRvcC1sZXZlbCB2YWx1ZSBzaGFkb3dzIGEgbGF0ZXIgc2lsZW50IHJlYWQgb2YgdGhhdCB2YWx1ZS5cbiAgICAvLyBSZWFkaW5nIG9uZSBuZXN0ZWQgZmllbGQgbXVzdCBub3QgY2xhaW0gdG8gaGF2ZSBvYnNlcnZlZCBpdHMgc2libGluZ3MuXG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwICYmIGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLl90cmFja2VkUmVhZEtleXMuYWRkKGtleSk7XG4gICAgZWxzZSBpZiAocGF0aC5sZW5ndGggPT09IDEgJiYga2V5ID09PSB1bmRlZmluZWQpIHRoaXMuX3RyYWNrZWRSZWFkS2V5cy5hZGQocGF0aFswXSEpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBIHdob2xlLXN0YXRlIHJlYWQgKG5vIGtleSkgaXMgc2VydmVkIHdpdGggZXZlcnkgcmVkYWN0ZWQga2V5IGluc2lkZVxuICAgICAgLy8gaXQgc2NydWJiZWQ7IGEga2V5ZWQgcmVhZCBpcyBzZXJ2ZWQgdW5kZXIgdGhlIGtleSdzIHZlcmRpY3QuXG4gICAgICBjb25zdCB3aG9sZVN0YXRlID0gcGF0aC5sZW5ndGggPT09IDAgJiYga2V5ID09PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gd2hvbGVTdGF0ZSA/IENMRUFSIDoga2V5ID09PSB1bmRlZmluZWQgPyB0aGlzLnJ1bGUudmVyZGljdChwYXRoKSA6IHRoaXMucnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KTtcbiAgICAgIGNvbnN0IHJlY29yZGVyVmFsdWUgPSB3aG9sZVN0YXRlID8gdGhpcy5ydWxlLnJldGFpblJlY29yZCh2YWx1ZSkgOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICAgIGNvbnN0IGV2ZW50S2V5ID0gcGF0aC5sZW5ndGggPT09IDAgPyBrZXkgOiAoa2V5ID09PSB1bmRlZmluZWQgPyBwYXRoIDogWy4uLnBhdGgsIGtleV0pLmpvaW4oJy4nKTtcblxuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25SZWFkJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWVBdChbXSwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSB3cml0ZXMgc2hhcmUgcmVjb3JkaW5nLCByZWRhY3Rpb24gYW5kIGxpZmV0aW1lIHBvbGljeSB3aXRoIGZsYXQgd3JpdGVzLiAqL1xuICBzZXRWYWx1ZUF0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBwYXRoLmxlbmd0aCA9PT0gMCA/IGtleSA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKTtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywgcGF0aFswXSA/PyBrZXksICd3cml0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShldmVudEtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogd2FybiBpZiB0aGUgdmFsdWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAgICAvLyBDaGVjayBBRlRFUiBhc3NlcnROb3RSZWFkb25seSDigJQgZG9uJ3Qgd2FybiBmb3Igd3JpdGVzIHRoYXQgd2lsbCBiZSBibG9ja2VkLlxuICAgIC8vIENpcmN1bGFyIHZhbHVlcyB3b3JrICh0ZXJtaW5hbCBwcm94eSBoYW5kbGVzIHRoZW0pIGJ1dCBjYW4gcHJvZHVjZVxuICAgIC8vIHN1cnByaXNpbmcgYmVoYXZpb3IgaW4gbmFycmF0aXZlLCBKU09OIHNlcmlhbGl6YXRpb24sIGFuZCBzbmFwc2hvdHMuXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gc2V0VmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ1dyaXRlcyBwYXN0IHRoZSBjeWNsZSBkZXB0aCB3aWxsIHVzZSB0ZXJtaW5hbCBwcm94eSB0cmFja2luZy4gJyArXG4gICAgICAgICAgICAnQ29uc2lkZXIgZmxhdHRlbmluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY29udGV4dCBpcyB0aGUgT05FIGZ1bm5lbDogaXQgZGVjaWRlcyB0aGUgdmVyZGljdCAoZXhwbGljaXQgZmxhZyxcbiAgICAvLyBwb2xpY3kga2V5L3BhdHRlcm4sIHBlci1ydW4gbWFyaywgb3IgZmllbGQtbGV2ZWwgc2NydWIpLCBzdGFnZXMgdGhlXG4gICAgLy8gd3JpdGUgd2l0aCB0aGUgcGF0aHMgdGhlIGxvZyB3aWxsIHNjcnViLCBhbmQgaGFuZHMgdGhlIHZlcmRpY3QgYmFjayBzb1xuICAgIC8vIHJlY29yZGVycyBzZWUgdGhlIHNhbWUgZGVjaXNpb24gdGhlIHJldGFpbmVkIHJlY29yZCBob2xkcy5cbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsIGRlc2NyaXB0aW9uKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgdmFsdWU6IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246ICdzZXQnLFxuICAgICAgICByZWRhY3RlZDogdmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVWYWx1ZUF0KFtdLCBrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSBtZXJnZXMgdXNlIHRoZSBzYW1lIHdyaXRlIGZ1bm5lbCBhcyByZXBsYWNlbWVudHMuICovXG4gIHVwZGF0ZVZhbHVlQXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBldmVudEtleSA9IHBhdGgubGVuZ3RoID09PSAwID8ga2V5IDogWy4uLnBhdGgsIGtleV0uam9pbignLicpO1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBwYXRoWzBdID8/IGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGV2ZW50S2V5KTtcblxuICAgIC8vIERldi1tb2RlOiBzYW1lIGNpcmN1bGFyIGNoZWNrIGFzIHNldFZhbHVlIChtZXJnZSB0YXJnZXRzIGNhbiBiZSBjaXJjdWxhciB0b28pXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gdXBkYXRlVmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMuX3N0YWdlQ29udGV4dC51cGRhdGVPYmplY3QocGF0aCwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgIHJlZGFjdGVkOiB2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ2RlbGV0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuXG4gICAgLy8gRGVsZXRpbmcgYSBrZXkgY2xlYXJzIGl0cyBwZXItY2FsbCByZWRhY3Rpb24gbWFyayAodGhlIGNvbnRleHQnc1xuICAgIC8vIGZ1bm5lbCBkb2VzIHRoYXQpOyBhIHBvbGljeSB2ZXJkaWN0IG9uIHRoZSBrZXkgc3Vydml2ZXMuXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBkZXNjcmlwdGlvbiA/PyBgZGVsZXRlZCAke2tleX1gLCAnZGVsZXRlJyk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnNldEdsb2JhbD8uKGtleSwgdmFsdWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRPYmplY3RJblJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRSb290Py4oa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZC1vbmx5ICsgbWlzYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVhZG9ubHkgaW5wdXQgdmFsdWVzIHBhc3NlZCB0byB0aGlzIHBpcGVsaW5lLCBjYXN0IHRvIGBUYC5cbiAgICogT3JkaW5hcnkgbXV0YWJsZSByZWNvcmRzL2FycmF5cyBhcmUgY29waWVkIGFuZCBmcm96ZW4sIG5vdCBmcm96ZW4gaW4gcGxhY2UuXG4gICAqIE9wYXF1ZSBjYXBhYmlsaXRpZXMgYW5kIGV4cGxpY2l0bHkgZnJvemVuIHdyYXBwZXJzIHJlbWFpbiBib3Jyb3dlZC9saXZlO1xuICAgKiBzZWUgYHByb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC50cyDCtyBjcmVhdGVGcm96ZW5BcmdzYCBmb3IgdGhlIG93bmVyc2hpcCBydWxlLlxuICAgKiBDYWNoZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgZm9yIHplcm8tYWxsb2NhdGlvbiByZXBlYXRlZCBhY2Nlc3MuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBhcHBsaWNhbnROYW1lLCBpbmNvbWUgfSA9IHNjb3BlLmdldEFyZ3M8eyBhcHBsaWNhbnROYW1lOiBzdHJpbmc7IGluY29tZTogbnVtYmVyIH0+KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBhcmdzIGFyZSB1bnRyYWNrZWQgQlkgREVTSUdOLCBzbyBjYWxsaW5nIHRoaXMgKHdpdGggYWN0dWFsXG4gICAqIGlucHV0IHByZXNlbnQpIG1hcmtzIHRoZSBzdGFnZSdzIGNvbW1pdCB3aXRoIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2FyZ3MnXWBcbiAgICog4oCUIHRlbGxpbmcgY2F1c2FsLXNsaWNlIGNvbnN1bWVycyB0aGUgYmFja3dhcmQgc2xpY2UgbWF5IGJlIGluY29tcGxldGVcbiAgICogaGVyZS4gQW4gZW1wdHktYXJncyByZWFkIGNhcnJpZXMgbm8gaW5mb3JtYXRpb24gYW5kIGlzIG5vdCBmbGFnZ2VkLlxuICAgKi9cbiAgZ2V0QXJnczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk6IFQge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJyRhcmdzJyk7XG4gICAgaWYgKHRoaXMuX2hhc0FyZ3MpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdhcmdzJyk7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb3plbkFyZ3MgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSBpbmZyYXN0cnVjdHVyZSB2YWx1ZXNcbiAgICogdGhhdCBwcm9wYWdhdGUgdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzIChsaWtlIGBwcm9jZXNzLmVudmAgZm9yIGZsb3djaGFydHMpLlxuICAgKlxuICAgKiBDb250YWluczogc2lnbmFsIChhYm9ydCDigJQgdGhlIHJ1bidzIG9uZSBlZmZlY3RpdmUgc2lnbmFsKSwgdGltZW91dE1zLCB0cmFjZUlkLCBvcGVyYXRpb25JZCwgdHJhY2VwYXJlbnQsXG4gICAqIGRlYWRsaW5lIChlcG9jaCBtcykg4oCUIHRoZSBydW4ncyBlbnYgYXMgYWRtaXR0ZWQgKGBhdHRlbXB0L2NvcnJlbGF0aW9uLnRzIMK3IGFkbWl0UnVuRW52YDogb25lIG93bi1maWVsZFxuICAgKiBzbmFwc2hvdDsgYHRyYWNlcGFyZW50YCBpcyB0aGUgY2Fub25pY2FsIGhlYWRlciB0aGUgcnVuJ3MgY29ycmVsYXRpb24gY2FycmllcywgbmV2ZXIgdGhlIHJlY2VpdmVkIGJ5dGVzKSwgdGhlblxuICAgKiBhcm1lZCAoYHJ1bm5lci9kZWFkbGluZS50cyDCtyBhcm1SdW5gKS4gRnJvemVuIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBJbmhlcml0ZWQgYnkgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IHNpZ25hbCwgdHJhY2VJZCB9ID0gc2NvcGUuZ2V0RW52KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBlbnYgaXMgdW50cmFja2VkIEJZIERFU0lHTiwgc28gY2FsbGluZyB0aGlzICh3aXRoIGFcbiAgICogbm9uLWVtcHR5IGVudmlyb25tZW50KSBtYXJrcyB0aGUgc3RhZ2UncyBjb21taXQgd2l0aFxuICAgKiBgdW50cmFja2VkU291cmNlczogWydlbnYnXWAg4oCUIHNlZSB7QGxpbmsgZ2V0QXJnc30uXG4gICAqL1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PiB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnJGVudicpO1xuICAgIGlmICh0aGlzLl9oYXNFbnYpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdlbnYnKTtcbiAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uRW52O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRQaXBlbGluZUlkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBfaW52b2tlSG9vazxLIGV4dGVuZHMgU2NvcGVIb29rTmFtZT4oaG9vazogSywgZXZlbnQ6IEhvb2tQYXlsb2FkPEs+KTogdm9pZCB7XG4gICAgLy8gVGhlIG9uZSBwZXItcmVjb3JkZXIgbG9vcCAoYHJlY29yZGVyL2hvb2tzLnRzIMK3IGZpcmVgKSDigJQgdGhlIFNBTUUgaW52b2tlIHByaW1pdGl2ZSB0aGVcbiAgICAvLyBkZWZlcnJlZCB0aWVyIHVzZXMgYXQgZGVsaXZlcnkgdGltZSwgc28gdGhlIGlubGluZSBhbmQgZGVmZXJyZWQgcGF0aHMgY2Fubm90IGRyaWZ0LlxuICAgIGZpcmUodGhpcy5fcmVjb3JkZXJzLCBob29rLCB0aGlzLl9jb3JyZWxhdGVkKGV2ZW50IGFzIG9iamVjdCkgYXMgSG9va1BheWxvYWQ8Sz4sIHRoaXMuX3JvdXRlRmFpbHVyZSk7XG4gIH1cblxuICAvKiogVGhlIGV2ZW50IGFzIGZpcmVkOiB1bmNoYW5nZWQgd2l0aG91dCBhIGNvcnJlbGF0aW9uLCBlbHNlIHdpdGggdGhlIHJ1bidzIGNvcnJlbGF0aW9uIGFzIGl0cyBsYXN0IGtleS4gKi9cbiAgcHJpdmF0ZSBfY29ycmVsYXRlZDxFIGV4dGVuZHMgb2JqZWN0PihldmVudDogRSk6IEUge1xuICAgIHJldHVybiB0aGlzLl9jb3JyZWxhdGlvbiA9PT0gdW5kZWZpbmVkID8gZXZlbnQgOiB7IC4uLmV2ZW50LCBjb3JyZWxhdGlvbjogdGhpcy5fY29ycmVsYXRpb24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2NvcGUgY2hhbm5lbCdzIGlzb2xhdGlvbjogYSByZWNvcmRlcidzIHRocm93IGJlY29tZXMgYW4gYG9uRXJyb3JgIG9uIGV2ZXJ5IHJlY29yZGVyXG4gICAqIChzdGFtcGVkIHdpdGggdGhpcyBzdGFnZSksIGFuZCBhIHRocm93IGZyb20gYG9uRXJyb3JgIGl0c2VsZiBpcyBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVGYWlsdXJlOiBIb29rRmFpbHVyZSA9IChlcnJvciwgX3JlY29yZGVyLCBob29rKSA9PiB7XG4gICAgaWYgKGhvb2sgPT09ICdvbkVycm9yJykgcmV0dXJuO1xuICAgIHRoaXMuX2ludm9rZUhvb2soXG4gICAgICAnb25FcnJvcicsXG4gICAgICByZWNvcmRlckZhaWx1cmVFdmVudChcbiAgICAgICAge1xuICAgICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgaG9vayxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcbn1cblxuLyoqIFRoZSBzaWduYWwgb2YgYSBzdGFnZSBvdXRzaWRlIHRoZSBydW5uZXIgaW4gYSBydW4gd2l0aCBubyBzaWduYWw6IG9uZSB0aGF0IG5ldmVyIGFib3J0cywgc2hhcmVkLiAqL1xuY29uc3QgTkVWRVJfQUJPUlRFRDogQWJvcnRTaWduYWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkuc2lnbmFsO1xuXG4vKiogVGhlIG5hbWUgYSBsYXRlIGRldGFjaCBpcyByZWNvcmRlZCB1bmRlcjogdGhlIGNoaWxkIGNoYXJ0J3Mgcm9vdCBpZCDigJQgYSBuYW1lLCBuZXZlciBpdHMgaW5wdXQuICovXG5mdW5jdGlvbiBkZXRhY2hLZXkoY2hpbGQ6IEZsb3dDaGFydCk6IHN0cmluZyB7XG4gIGNvbnN0IGlkID0gKGNoaWxkIGFzIHsgcm9vdD86IHsgaWQ/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJvb3Q/LmlkO1xuICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyA/IGBkZXRhY2g6JHtpZH1gIDogJ2RldGFjaCc7XG59XG4iXX0=