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
@@ -18,7 +18,7 @@ import { summarizeValue } from '../../capture/summarize.js';
18
18
  import { isFlowEvent } from '../../recorder/CombinedRecorder.js';
19
19
  import { SequenceStore } from '../../recorder/SequenceStore.js';
20
20
  import { resolveText } from './formatting/resolveText.js';
21
- import { breakSentence, decisionSentence, errorSentence, forkSentence, loopSentence, nextStageSentence, pauseSentence, resumeSentence, validationDetails, validationSentence, } from './formatting/sentences.js';
21
+ import { attemptSentence, breakSentence, decisionSentence, errorSentence, forkSentence, isAttemptTold, loopSentence, nextStageSentence, pauseSentence, resumeSentence, validationDetails, validationSentence, } from './formatting/sentences.js';
22
22
  // ── ScopeRecorder ───────────────────────────────────────────────────────────────
23
23
  /**
24
24
  * Implements `CombinedRecorder` — the library's first-class abstraction for
@@ -330,32 +330,30 @@ export class CombinedNarrativeRecorder {
330
330
  });
331
331
  }
332
332
  /**
333
- * A failed attempt that was retried. BUFFERED, not pushed: this is the only
334
- * flow event that fires DURING a stage, so pushing it straight to the store
335
- * would place the line before its own stage header. Buffered alongside the
336
- * reads and writes, it flushes in true execution order:
333
+ * One attempt of a retried stage (10.1). BUFFERED, not pushed: attempt
334
+ * events fire DURING a stage, so pushing one straight to the store would
335
+ * place the line before its own stage header. Buffered alongside the reads
336
+ * and writes, it flushes in true execution order:
337
337
  *
338
- * Step 3: Fetch user
339
- * ↳ read userId = "u1"
340
- * ↳ [Retry]: attempt 1 of 3 failed … retrying
341
- * ↳ read userId = "u1"
342
- * ↳ wrote user = { … }
338
+ * Stage 3: Fetch user
339
+ * Step 1: Read userId = "u1"
340
+ * Attempt 1 of 3 at Fetch user failed in 12ms (…), retrying in 100ms.
341
+ * Step 3: Read userId = "u1"
342
+ * Step 4: Write user = { … }
343
+ * Attempt 2 of 3 at Fetch user succeeded in 9ms.
344
+ *
345
+ * This line replaces the 9.15 `[Retry]` line: it already says "retrying",
346
+ * so `onStageRetry` is not narrated (two lines for one fact).
343
347
  */
344
- onStageRetry(event) {
348
+ onAttempt(event) {
345
349
  const runtimeStageId = event.traversalContext?.runtimeStageId;
346
- if (!runtimeStageId)
350
+ if (!runtimeStageId || !isAttemptTold(event.record))
347
351
  return;
348
352
  this.bufferOp(runtimeStageId, {
349
- type: 'retry',
353
+ type: 'attempt',
350
354
  key: event.stageName,
351
355
  rawValue: undefined,
352
- retry: {
353
- stageName: event.stageName,
354
- attempt: event.attempt,
355
- maxAttempts: event.maxAttempts,
356
- delayMs: event.delayMs,
357
- message: event.message,
358
- },
356
+ attempt: { stageName: event.stageName, record: event.record },
359
357
  });
360
358
  }
361
359
  onPause(event) {
@@ -421,6 +419,50 @@ export class CombinedNarrativeRecorder {
421
419
  runtimeStageId: event.traversalContext?.runtimeStageId,
422
420
  subflowId: event.traversalContext?.subflowId,
423
421
  });
422
+ this.flushAttempts(event.traversalContext, event.stageName);
423
+ }
424
+ /**
425
+ * A failed stage has no header (its `[Error]` line stands for it) and its
426
+ * buffered reads and writes are not narrated — the narrative's law since
427
+ * before retry existed, kept. Its ATTEMPT lines are the exception (10.1):
428
+ * the stop reason is the point, so they follow the error line, in order,
429
+ * as its depth-1 sub-items. A stage with no retry policy buffers no attempt
430
+ * lines, so its failure narrates exactly as before.
431
+ */
432
+ flushAttempts(traversalContext, stageName) {
433
+ const runtimeStageId = traversalContext?.runtimeStageId;
434
+ if (runtimeStageId === undefined)
435
+ return;
436
+ const ops = this.pendingOps.get(runtimeStageId);
437
+ if (!ops?.some((op) => op.type === 'attempt'))
438
+ return;
439
+ for (const op of ops) {
440
+ if (op.type === 'attempt' && op.attempt) {
441
+ this.pushAttempt(op.attempt, op.stepNumber, {
442
+ subflowId: traversalContext?.subflowId,
443
+ stageId: traversalContext?.stageId,
444
+ stageName,
445
+ runtimeStageId,
446
+ });
447
+ }
448
+ }
449
+ this.pendingOps.set(runtimeStageId, ops.filter((op) => op.type !== 'attempt'));
450
+ }
451
+ /** One attempt line — the consumer's `renderAttempt` first; `null` drops it, `undefined` falls back. */
452
+ pushAttempt(ctx, stepNumber, at) {
453
+ const text = resolveText(this.renderer?.renderAttempt?.(ctx), () => attemptSentence(ctx.stageName, ctx.record));
454
+ if (text === null)
455
+ return;
456
+ this.store.push({
457
+ type: 'attempt',
458
+ text,
459
+ depth: 1,
460
+ stageName: at.stageName,
461
+ stageId: at.stageId,
462
+ runtimeStageId: at.runtimeStageId,
463
+ stepNumber,
464
+ subflowId: at.subflowId,
465
+ });
424
466
  }
425
467
  // ── Emit channel (Phase 3) ────────────────────────────────────────────
426
468
  /**
@@ -601,26 +643,16 @@ export class CombinedNarrativeRecorder {
601
643
  });
602
644
  continue;
603
645
  }
604
- // ── Retried attempts take their own render path ────────────────────
646
+ // ── Attempts take their own render path ────────────────────────────
605
647
  //
606
648
  // Same buffering rationale as emit above: the entry belongs INSIDE its
607
- // stage, in the position where the failure actually happened.
608
- if (op.type === 'retry' && op.retry) {
609
- const retryText = this.renderer?.renderRetry?.(op.retry) ?? this.defaultRenderRetry(op.retry);
610
- this.store.push({
611
- type: 'retry',
612
- text: retryText,
613
- depth: 1,
614
- stageName,
615
- stageId,
616
- runtimeStageId,
617
- stepNumber: op.stepNumber,
618
- subflowId,
619
- });
649
+ // stage, in the position where the attempt actually ended.
650
+ if (op.type === 'attempt' && op.attempt) {
651
+ this.pushAttempt(op.attempt, op.stepNumber, { subflowId, stageId, stageName, runtimeStageId });
620
652
  continue;
621
653
  }
622
654
  // At this point op.type is narrowed to 'read' | 'write' (the emit and
623
- // retry branches above use `continue`). TypeScript can't follow that
655
+ // attempt branches above use `continue`). TypeScript can't follow that
624
656
  // narrowing through the continue, so we assert at render time.
625
657
  const opType = op.type;
626
658
  const valueSummary = this.formatValue(op.rawValue, this.maxValueLength);
@@ -756,10 +788,6 @@ export class CombinedNarrativeRecorder {
756
788
  defaultRenderBreak(ctx) {
757
789
  return breakSentence(ctx);
758
790
  }
759
- defaultRenderRetry(ctx) {
760
- const wait = ctx.delayMs > 0 ? ` Waited ${ctx.delayMs}ms before the next attempt.` : '';
761
- return `[Retry]: attempt ${ctx.attempt} of ${ctx.maxAttempts} at ${ctx.stageName} failed (${ctx.message}).${wait}`;
762
- }
763
791
  defaultRenderError(ctx) {
764
792
  let text = errorSentence(ctx);
765
793
  if (ctx.validationIssues)
@@ -767,4 +795,4 @@ export class CombinedNarrativeRecorder {
767
795
  return `[Error]: ${text}`;
768
796
  }
769
797
  }
770
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsWUFBWSxFQUNaLFlBQVksRUFDWixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsa0JBQWtCLEdBQ25CLE1BQU0sMkJBQTJCLENBQUM7QUFnRW5DLG1GQUFtRjtBQUVuRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sT0FBTyx5QkFBeUI7SUFDNUIsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDbkIsRUFBRSxDQUFTO0lBQ3BCLDZFQUE2RTtJQUM1RCxLQUFLLEdBQUcsSUFBSSxhQUFhLEVBQTBCLENBQUM7SUFFckU7Ozs7O09BS0c7SUFDSyxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFDckQsc0RBQXNEO0lBQzlDLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUNsRCwyRkFBMkY7SUFDbkYsWUFBWSxDQUFxQjtJQUN6Qyx5REFBeUQ7SUFDakQsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQ3JELDRFQUE0RTtJQUNwRSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBa0Is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QU8sWUFBWSxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIOKAlCBJbmxpbmUgbmFycmF0aXZlIGJ1aWxkZXIgdGhhdCBtZXJnZXMgZmxvdyArIGRhdGEgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBDb21wb3NlcyBhIFNlcXVlbmNlU3RvcmU8Q29tYmluZWROYXJyYXRpdmVFbnRyeT4gZm9yIGR1YWwtaW5kZXhlZCBzdG9yYWdlIChvcmRlcmVkIHNlcXVlbmNlXG4gKiArIE8oMSkgcGVyLXN0ZXAgbG9va3VwIGJ5IHJ1bnRpbWVTdGFnZUlkKSDigJQgQ29udmVudGlvbiAxLCBvbmUgcHVycG9zZSBwZXIgcmVjb3JkZXIuXG4gKiBJbXBsZW1lbnRzIGBDb21iaW5lZFJlY29yZGVyYCDigJQgdGhlIGxpYnJhcnkncyBmaXJzdC1jbGFzcyBhYnN0cmFjdGlvbiBmb3Igb2JzZXJ2ZXJzIHRoYXQgc3BhblxuICogYm90aCBkYXRhLWZsb3cgYW5kIGNvbnRyb2wtZmxvdyBzdHJlYW1zLlxuICpcbiAqIEV2ZW50IG9yZGVyaW5nIGd1YXJhbnRlZXMgdGhpcyB3b3JrczpcbiAqICAgMS4gU2NvcGUgZXZlbnRzIChvblJlYWQsIG9uV3JpdGUpIGZpcmUgRFVSSU5HIHN0YWdlIGV4ZWN1dGlvblxuICogICAyLiBGbG93IGV2ZW50cyAob25TdGFnZUV4ZWN1dGVkLCBvbkRlY2lzaW9uKSBmaXJlIEFGVEVSIHN0YWdlIGV4ZWN1dGlvblxuICogICAzLiBCb3RoIGNhcnJ5IHRoZSBzYW1lIGBzdGFnZU5hbWVgIOKAlCBubyBtYXRjaGluZyBhbWJpZ3VpdHlcbiAqXG4gKiBTbyB3ZSBidWZmZXIgc2NvcGUgb3BzIHBlci1zdGFnZSwgdGhlbiB3aGVuIHRoZSBmbG93IGV2ZW50IGFycml2ZXMsXG4gKiBlbWl0IHRoZSBzdGFnZSBlbnRyeSArIGZsdXNoIHRoZSBidWZmZXJlZCBvcHMgaW4gb25lIHBhc3MuXG4gKi9cblxuaW1wb3J0IHsgc3VtbWFyaXplVmFsdWUgfSBmcm9tICcuLi8uLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuLi8uLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRmxvd0V2ZW50IH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRFdmVudCB9IGZyb20gJy4uLy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBTZXF1ZW5jZVN0b3JlIH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvU2VxdWVuY2VTdG9yZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRXZlbnQsIFBhdXNlRXZlbnQsIFJlYWRFdmVudCwgUmVzdW1lRXZlbnQsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi8uLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlVGV4dCB9IGZyb20gJy4vZm9ybWF0dGluZy9yZXNvbHZlVGV4dC5qcyc7XG5pbXBvcnQge1xuICBicmVha1NlbnRlbmNlLFxuICBkZWNpc2lvblNlbnRlbmNlLFxuICBlcnJvclNlbnRlbmNlLFxuICBmb3JrU2VudGVuY2UsXG4gIGxvb3BTZW50ZW5jZSxcbiAgbmV4dFN0YWdlU2VudGVuY2UsXG4gIHBhdXNlU2VudGVuY2UsXG4gIHJlc3VtZVNlbnRlbmNlLFxuICB2YWxpZGF0aW9uRGV0YWlscyxcbiAgdmFsaWRhdGlvblNlbnRlbmNlLFxufSBmcm9tICcuL2Zvcm1hdHRpbmcvc2VudGVuY2VzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQnJlYWtSZW5kZXJDb250ZXh0LFxuICBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5LFxuICBEZWNpc2lvblJlbmRlckNvbnRleHQsXG4gIEVtaXRSZW5kZXJDb250ZXh0LFxuICBFcnJvclJlbmRlckNvbnRleHQsXG4gIEZvcmtSZW5kZXJDb250ZXh0LFxuICBMb29wUmVuZGVyQ29udGV4dCxcbiAgTmFycmF0aXZlRm9ybWF0dGVyLFxuICBPcFJlbmRlckNvbnRleHQsXG4gIFJldHJ5UmVuZGVyQ29udGV4dCxcbiAgU2VsZWN0ZWRSZW5kZXJDb250ZXh0LFxuICBTdGFnZVJlbmRlckNvbnRleHQsXG4gIFN1YmZsb3dSZW5kZXJDb250ZXh0LFxufSBmcm9tICcuL25hcnJhdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRmxvd0JyZWFrRXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1BhdXNlRXZlbnQsXG4gIEZsb3dSZXN1bWVFdmVudCxcbiAgRmxvd1NlbGVjdGVkRXZlbnQsXG4gIEZsb3dTdGFnZUV2ZW50LFxuICBGbG93U3RhZ2VSZXRyeUV2ZW50LFxuICBGbG93U3ViZmxvd0V2ZW50LFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgQnVmZmVyZWRPcCB7XG4gIHR5cGU6ICdyZWFkJyB8ICd3cml0ZScgfCAnZW1pdCcgfCAncmV0cnknO1xuICAvKiogRm9yIHJlYWQvd3JpdGU6IHNjb3BlIGtleS4gRm9yIGVtaXQ6IHRoZSBldmVudCBuYW1lLiBGb3IgcmV0cnk6IHRoZSBzdGFnZSBuYW1lLiAqL1xuICBrZXk6IHN0cmluZztcbiAgcmF3VmFsdWU6IHVua25vd247XG4gIG9wZXJhdGlvbj86ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJztcbiAgc3RlcE51bWJlcjogbnVtYmVyO1xuICAvKiogT25seSBzZXQgZm9yIHR5cGU9J2VtaXQnIOKAlCBjYXJyaWVzIHRoZSBmdWxsIEVtaXRFdmVudCBmb3IgcmVuZGVyaW5nLiAqL1xuICBlbWl0RXZlbnQ/OiBFbWl0RXZlbnQ7XG4gIC8qKlxuICAgKiBPbmx5IHNldCBmb3IgdHlwZT0ncmV0cnknIOKAlCB0aGUgcmV0cnkgZmFjdHMsIGJ1ZmZlcmVkIHJhdGhlciB0aGFuIHB1c2hlZFxuICAgKiBzdHJhaWdodCB0byB0aGUgc3RvcmUgc28gdGhlIGxpbmUgbGFuZHMgSU4gT1JERVIgYmV0d2VlbiB0aGUgZmFpbGVkXG4gICAqIGF0dGVtcHQncyBvcHMgYW5kIHRoZSBuZXh0IGF0dGVtcHQncyBvcHMuIChSZXRyeSBldmVudHMgYXJyaXZlIG9uIHRoZSBmbG93XG4gICAqIGNoYW5uZWwgRFVSSU5HIHRoZSBzdGFnZSwgdW5saWtlIGV2ZXJ5IG90aGVyIGZsb3cgZXZlbnQsIHdoaWNoIGFycml2ZXNcbiAgICogYWZ0ZXIgaXQg4oCUIHB1c2hpbmcgZGlyZWN0bHkgd291bGQgcGxhY2UgdGhlIGxpbmUgYmVmb3JlIGl0cyBvd24gc3RhZ2VcbiAgICogaGVhZGVyLilcbiAgICovXG4gIHJldHJ5PzogUmV0cnlSZW5kZXJDb250ZXh0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zIHtcbiAgaW5jbHVkZVN0ZXBOdW1iZXJzPzogYm9vbGVhbjtcbiAgaW5jbHVkZVZhbHVlcz86IGJvb2xlYW47XG4gIG1heFZhbHVlTGVuZ3RoPzogbnVtYmVyO1xuICAvKiogQ3VzdG9tIHZhbHVlIGZvcm1hdHRlci4gQ2FsbGVkIGF0IHJlbmRlciB0aW1lIChmbHVzaE9wcyksIG5vdCBjYXB0dXJlIHRpbWUuXG4gICAqICBSZWNlaXZlcyB0aGUgcmF3IHZhbHVlIGFuZCBtYXhWYWx1ZUxlbmd0aC4gRGVmYXVsdHMgdG8gc3VtbWFyaXplVmFsdWUoKS4gKi9cbiAgZm9ybWF0VmFsdWU/OiAodmFsdWU6IHVua25vd24sIG1heExlbjogbnVtYmVyKSA9PiBzdHJpbmc7XG4gIC8qKiBQbHVnZ2FibGUgcmVuZGVyZXIgZm9yIGN1c3RvbWl6aW5nIG5hcnJhdGl2ZSBvdXRwdXQuIFVuaW1wbGVtZW50ZWQgbWV0aG9kc1xuICAgKiAgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IEVuZ2xpc2ggcmVuZGVyZXIuIFNlZSBOYXJyYXRpdmVGb3JtYXR0ZXIgZG9jcy4gKi9cbiAgcmVuZGVyZXI/OiBOYXJyYXRpdmVGb3JtYXR0ZXI7XG59XG5cbi8vIOKUgOKUgCBTY29wZVJlY29yZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEltcGxlbWVudHMgYENvbWJpbmVkUmVjb3JkZXJgIOKAlCB0aGUgbGlicmFyeSdzIGZpcnN0LWNsYXNzIGFic3RyYWN0aW9uIGZvclxuICogb2JzZXJ2ZXJzIHRoYXQgc3BhbiBib3RoIGRhdGEtZmxvdyAoYFNjb3BlUmVjb3JkZXJgKSBhbmQgY29udHJvbC1mbG93XG4gKiAoYEZsb3dSZWNvcmRlcmApIHN0cmVhbXMuIE9uZSBgaWRgLCByb3V0ZWQgdG8gYm90aCBjaGFubmVscyB2aWFcbiAqIGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKC4uLilgIChvciBlcXVpdmFsZW50bHkgdmlhXG4gKiBgZXhlY3V0b3IuZW5hYmxlTmFycmF0aXZlKC4uLilgIHdoaWNoIGF1dG8tY3JlYXRlcyBhbiBpbnN0YW5jZSkuXG4gKlxuICogRm9yIHNoYXJlZC1tZXRob2QtbmFtZSBldmVudHMgKGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgKSB0aGVcbiAqIGhhbmRsZXIgYWNjZXB0cyB0aGUgdW5pb24gcGF5bG9hZCB0eXBlOyB3ZSBkaXNjcmltaW5hdGUgdmlhIGBpc0Zsb3dFdmVudGAuXG4gKiBTY29wZSB2YXJpYW50cyBvZiB0aGVzZSBldmVudHMgYXJlIGRlbGliZXJhdGVseSBpZ25vcmVkIGhlcmUg4oCUIHRoZVxuICogbmFycmF0aXZlIG9ubHkgc3VyZmFjZXMgY29udHJvbC1mbG93IGxpZmVjeWNsZSBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGltcGxlbWVudHMgQ29tYmluZWRSZWNvcmRlciB7XG4gIHByaXZhdGUgc3RhdGljIF9jb3VudGVyID0gMDtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqIER1YWwtaW5kZXhlZCBvcmRlcmVkIHN0b3JhZ2UgKENvbnZlbnRpb24gMSDigJQgY29tcG9zZWQsIG5vdCBpbmhlcml0ZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gbmV3IFNlcXVlbmNlU3RvcmU8Q29tYmluZWROYXJyYXRpdmVFbnRyeT4oKTtcblxuICAvKipcbiAgICogUGVuZGluZyBzY29wZSBvcHMga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuIEZsdXNoZWQgaW4gb25TdGFnZUV4ZWN1dGVkL29uRGVjaXNpb24uXG4gICAqXG4gICAqIEtleWluZyBieSBydW50aW1lU3RhZ2VJZCAobm90IHN0YWdlTmFtZSkgZW5zdXJlcyBjb3JyZWN0bmVzcyB3aGVuIHBhcmFsbGVsIGZvcmtcbiAgICogYnJhbmNoZXMgY29udGFpbiBzdGFnZXMgd2l0aCB0aGUgc2FtZSBuYW1lIOKAlCBlYWNoIGV4ZWN1dGlvbiBzdGVwIGhhcyBhIHVuaXF1ZSBJRC5cbiAgICovXG4gIHByaXZhdGUgcGVuZGluZ09wcyA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXJlZE9wW10+KCk7XG4gIC8qKiBQZXItc3ViZmxvdyBzdGFnZSBjb3VudGVycy4gS2V5ICcnID0gcm9vdCBmbG93LiAqL1xuICBwcml2YXRlIHN0YWdlQ291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogVGhlIHN0YWdlIGBvblJlc3VtZWAganVzdCBuYXJyYXRlZCDigJQgaXRzIGhlYWRlciBtdXN0IG5vdCBhbm5vdW5jZSB0aGUgYXJyaXZhbCBhZ2Fpbi4gKi9cbiAgcHJpdmF0ZSByZXN1bWVkU3RhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFBlci1zdWJmbG93IGZpcnN0LXN0YWdlIGZsYWdzLiBLZXkgJycgPSByb290IGZsb3cuICovXG4gIHByaXZhdGUgZmlyc3RTdGFnZUZsYWdzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gIC8qKiBWaXNpdCBjb3VudCBwZXIgc3RhZ2VJZCDigJQgZGV0ZWN0cyBsb29wIGl0ZXJhdGlvbnMgKGNvdW50ID4gMSA9IGxvb3ApLiAqL1xuICBwcml2YXRlIHN0YWdlVmlzaXRDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHByaXZhdGUgaW5jbHVkZVN0ZXBOdW1iZXJzOiBib29sZWFuO1xuICBwcml2YXRlIGluY2x1ZGVWYWx1ZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgbWF4VmFsdWVMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZTogKHZhbHVlOiB1bmtub3duLCBtYXhMZW46IG51bWJlcikgPT4gc3RyaW5nO1xuICBwcml2YXRlIHJlbmRlcmVyPzogTmFycmF0aXZlRm9ybWF0dGVyO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyAmIHsgaWQ/OiBzdHJpbmcgfSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCA/PyBgY29tYmluZWQtbmFycmF0aXZlLSR7KytDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLl9jb3VudGVyfWA7XG4gICAgdGhpcy5pbmNsdWRlU3RlcE51bWJlcnMgPSBvcHRpb25zPy5pbmNsdWRlU3RlcE51bWJlcnMgPz8gdHJ1ZTtcbiAgICB0aGlzLmluY2x1ZGVWYWx1ZXMgPSBvcHRpb25zPy5pbmNsdWRlVmFsdWVzID8/IHRydWU7XG4gICAgdGhpcy5tYXhWYWx1ZUxlbmd0aCA9IG9wdGlvbnM/Lm1heFZhbHVlTGVuZ3RoID8/IDgwO1xuICAgIHRoaXMuZm9ybWF0VmFsdWUgPSBvcHRpb25zPy5mb3JtYXRWYWx1ZSA/PyBzdW1tYXJpemVWYWx1ZTtcbiAgICB0aGlzLnJlbmRlcmVyID0gb3B0aW9ucz8ucmVuZGVyZXI7XG4gIH1cblxuICAvLyDilIDilIAgU2NvcGUgY2hhbm5lbCAoZmlyZXMgZmlyc3QsIGR1cmluZyBzdGFnZSBleGVjdXRpb24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uUmVhZChldmVudDogUmVhZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFldmVudC5rZXkpIHJldHVybjtcbiAgICB0aGlzLmJ1ZmZlck9wKGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICB0eXBlOiAncmVhZCcsXG4gICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgIHJhd1ZhbHVlOiBldmVudC52YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uV3JpdGUoZXZlbnQ6IFdyaXRlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlck9wKGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICB0eXBlOiAnd3JpdGUnLFxuICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICByYXdWYWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICBvcGVyYXRpb246IGV2ZW50Lm9wZXJhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93IGNoYW5uZWwgKGZpcmVzIGFmdGVyIHN0YWdlIGV4ZWN1dGlvbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25TdGFnZUV4ZWN1dGVkKGV2ZW50OiBGbG93U3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIC8vIE5vbi1saW5lYXIga2luZHMgZ2V0IHRoZWlyIG5hcnJhdGl2ZSBlbnRyaWVzIChhbmQgb3BzIGZsdXNoKVxuICAgIC8vIGZyb20gYG9uRGVjaXNpb25gIC8gYG9uRm9ya2AgLyBgb25TZWxlY3RlZGAgLyBgb25TdWJmbG93RW50cnlgLlxuICAgIC8vIFNraXAgdGhlbSBoZXJlIHNvIGVhY2ggc3RhZ2UgaGFzIGV4YWN0bHkgb25lIG5hcnJhdGl2ZSBlbnRyeS5cbiAgICBpZiAoZXZlbnQuc3RhZ2VUeXBlICE9PSAnbGluZWFyJykgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQ7XG4gICAgY29uc3QgcnVudGltZVN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzZktleSA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCA/PyAnJztcbiAgICBjb25zdCBzdGFnZU51bSA9IHRoaXMuaW5jcmVtZW50U3RhZ2VDb3VudGVyKHNmS2V5KTtcbiAgICBjb25zdCBpc0ZpcnN0ID0gdGhpcy5jb25zdW1lRmlyc3RTdGFnZUZsYWcoc2ZLZXkpO1xuXG4gICAgLy8gVHJhY2sgdmlzaXQgY291bnQgcGVyIHN0YWdlSWQgdG8gZGV0ZWN0IGxvb3AgaXRlcmF0aW9uc1xuICAgIGNvbnN0IHZpc2l0S2V5ID0gc3RhZ2VJZCA/PyBldmVudC5zdGFnZU5hbWU7XG4gICAgY29uc3QgdmlzaXRDb3VudCA9ICh0aGlzLnN0YWdlVmlzaXRDb3VudHMuZ2V0KHZpc2l0S2V5KSA/PyAwKSArIDE7XG4gICAgdGhpcy5zdGFnZVZpc2l0Q291bnRzLnNldCh2aXNpdEtleSwgdmlzaXRDb3VudCk7XG5cbiAgICBjb25zdCBjdHg6IFN0YWdlUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VOdW1iZXI6IHN0YWdlTnVtLFxuICAgICAgaXNGaXJzdCxcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICAgIGxvb3BJdGVyYXRpb246IHZpc2l0Q291bnQgPiAxID8gdmlzaXRDb3VudCAtIDEgOiB1bmRlZmluZWQsXG4gICAgICAuLi4odGhpcy5jb25zdW1lUmVzdW1lZChldmVudC5zdGFnZU5hbWUpICYmIHsgcmVzdW1lZDogdHJ1ZSB9KSxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTdGFnZT8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU3RhZ2UoY3R4KTtcblxuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogc2ZJZCxcbiAgICB9KTtcbiAgICB0aGlzLmZsdXNoT3BzKHJ1bnRpbWVTdGFnZUlkLCBzZklkLCBzdGFnZUlkLCBldmVudC5zdGFnZU5hbWUpO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZDtcbiAgICBjb25zdCBydW50aW1lU3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuXG4gICAgLy8gRW1pdCB0aGUgZGVjaWRlciBzdGFnZSBlbnRyeS5cbiAgICAvLyBQcm9wb3NhbCAjMDAzIGFsc28gZmlyZXMgYG9uU3RhZ2VFeGVjdXRlZChzdGFnZVR5cGU6ICdkZWNpZGVyJylgXG4gICAgLy8gQUZURVIgdGhpcyBldmVudCwgYnV0IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgZ2F0ZXMgdGhhdFxuICAgIC8vIGhhbmRsZXIgdG8gTElORUFSLW9ubHkgc28gdGhpcyBzdGF5cyB0aGUgc2luZ2xlIGVtaXNzaW9uIHNpdGVcbiAgICAvLyBmb3IgdGhlIGRlY2lkZXIncyBzdGFnZSBlbnRyeSArIG9wcyBmbHVzaC4gS2VlcHMgbmFycmF0aXZlXG4gICAgLy8gb3V0cHV0IGJ5dGUtc3RhYmxlIGFjcm9zcyB0aGUgdjYgdHJhbnNpdGlvbi5cbiAgICBjb25zdCBzZktleSA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCA/PyAnJztcbiAgICBjb25zdCBzdGFnZU51bSA9IHRoaXMuaW5jcmVtZW50U3RhZ2VDb3VudGVyKHNmS2V5KTtcbiAgICBjb25zdCBpc0ZpcnN0ID0gdGhpcy5jb25zdW1lRmlyc3RTdGFnZUZsYWcoc2ZLZXkpO1xuXG4gICAgY29uc3Qgc3RhZ2VDdHg6IFN0YWdlUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuZGVjaWRlcixcbiAgICAgIHN0YWdlTnVtYmVyOiBzdGFnZU51bSxcbiAgICAgIGlzRmlyc3QsXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICAuLi4odGhpcy5jb25zdW1lUmVzdW1lZChldmVudC5kZWNpZGVyKSAmJiB7IHJlc3VtZWQ6IHRydWUgfSksXG4gICAgfTtcbiAgICBjb25zdCBzdGFnZVRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTdGFnZT8uKHN0YWdlQ3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTdGFnZShzdGFnZUN0eCk7XG5cbiAgICB0aGlzLnN0b3JlLnB1c2goe1xuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIHRleHQ6IHN0YWdlVGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgICAgc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5mbHVzaE9wcyhydW50aW1lU3RhZ2VJZCwgZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLCBzdGFnZUlkLCBldmVudC5kZWNpZGVyKTtcblxuICAgIC8vIEVtaXQgdGhlIGNvbmRpdGlvbiBlbnRyeSBhcyBhIG5lc3RlZCBzdWItaXRlbSAoZGVwdGggMSkgb2YgdGhlIHN0YWdlIGFib3ZlLlxuICAgIGNvbnN0IGRlY2lzaW9uQ3R4OiBEZWNpc2lvblJlbmRlckNvbnRleHQgPSB7XG4gICAgICBkZWNpZGVyOiBldmVudC5kZWNpZGVyLFxuICAgICAgY2hvc2VuOiBldmVudC5jaG9zZW4sXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICByYXRpb25hbGU6IGV2ZW50LnJhdGlvbmFsZSxcbiAgICAgIGV2aWRlbmNlOiBldmVudC5ldmlkZW5jZSxcbiAgICB9O1xuICAgIGNvbnN0IGNvbmRpdGlvblRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJEZWNpc2lvbj8uKGRlY2lzaW9uQ3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJEZWNpc2lvbihkZWNpc2lvbkN0eCk7XG4gICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdjb25kaXRpb24nLFxuICAgICAgdGV4dDogY29uZGl0aW9uVGV4dCxcbiAgICAgIGRlcHRoOiAxLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgICAgc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgLy8gTm8tb3AuIG9uU3RhZ2VFeGVjdXRlZCBhbHJlYWR5IGhhcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXh0IHN0YWdlLlxuICB9XG5cbiAgb25Gb3JrKGV2ZW50OiBGbG93Rm9ya0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4OiBGb3JrUmVuZGVyQ29udGV4dCA9IHsgY2hpbGRyZW46IGV2ZW50LmNoaWxkcmVuIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckZvcms/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckZvcmsoY3R4KTtcbiAgICB0aGlzLnN0b3JlLnB1c2goe1xuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25TZWxlY3RlZChldmVudDogRmxvd1NlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IFNlbGVjdGVkUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHNlbGVjdGVkOiBldmVudC5zZWxlY3RlZCxcbiAgICAgIHRvdGFsOiBldmVudC50b3RhbCxcbiAgICAgIGV2aWRlbmNlOiBldmVudC5ldmlkZW5jZSxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTZWxlY3RlZD8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU2VsZWN0ZWQoY3R4KTtcbiAgICB0aGlzLnN0b3JlLnB1c2goe1xuICAgICAgdHlwZTogJ3NlbGVjdG9yJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2ZLZXkgPSBldmVudC5zdWJmbG93SWQgPz8gJyc7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXJzLmRlbGV0ZShzZktleSk7XG4gICAgdGhpcy5maXJzdFN0YWdlRmxhZ3MuZGVsZXRlKHNmS2V5KTtcblxuICAgIGNvbnN0IGN0eDogU3ViZmxvd1JlbmRlckNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgZGlyZWN0aW9uOiAnZW50cnknLFxuICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgICAgbWFwcGVkSW5wdXQ6IGV2ZW50Lm1hcHBlZElucHV0LFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclN1YmZsb3c/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlclN1YmZsb3coY3R4KTtcbiAgICBjb25zdCByaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdzdWJmbG93JyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHNpZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiByaWQsXG4gICAgICBzdWJmbG93SWQ6IHNmSWQsXG4gICAgICBkaXJlY3Rpb246ICdlbnRyeScsXG4gICAgfSk7XG4gICAgLy8gRW1pdCBwZXIta2V5IHN0ZXAgZW50cmllcyBmb3IgbWFwcGVkIGlucHV0cy5cbiAgICAvL1xuICAgIC8vIFJvdXRlIEVBQ0gga2V5IHRocm91Z2ggdGhlIGNvbnN1bWVyJ3MgYHJlbmRlcmVyLnJlbmRlck9wYCBob29rIGJlZm9yZVxuICAgIC8vIGZhbGxpbmcgYmFjayB0byB0aGUgaGFyZGNvZGVkIGBJbnB1dDogJHtrZXl9ID0gJHt2YWx1ZVN1bW1hcnl9YFxuICAgIC8vIHRlbXBsYXRlLiBXaXRob3V0IHRoaXMgcm91dGluZywgYSBjb25zdW1lciB0aGF0IHByb3ZpZGVkIGFcbiAgICAvLyBkb21haW4tYXdhcmUgYHJlbmRlcmVyLnJlbmRlck9wYCAodG8gcmVuZGVyIGUuZy4gYHBhcnNlZFJlc3BvbnNlYFxuICAgIC8vIG9iamVjdHMgc2VtYW50aWNhbGx5KSB3b3VsZCBzZWUgYmVhdXRpZnVsIG91dHB1dCBmb3Igc2NvcGUgd3JpdGVzXG4gICAgLy8gYnV0IGdldCB0aGUgZ2VuZXJpYyBrZXktbGlzdCBmYWxsYmFjayBmb3Igc3ViZmxvdyBpbnB1dHMg4oCUIHRoZVxuICAgIC8vIGxpYnJhcnkncyBcImNvbWJpbmVkIG5hcnJhdGl2ZVwiIHByb21pc2UgKG9uZSByZW5kZXJlciBjb250cm9scyB0aGVcbiAgICAvLyB3aG9sZSBuYXJyYXRpdmUpIHdvdWxkIHNpbGVudGx5IGJyZWFrLiBXZSBob25vdXIgaXQgaGVyZS5cbiAgICAvL1xuICAgIC8vIFRoZSBPcFJlbmRlckNvbnRleHQgaXMgYnVpbHQgd2l0aCBgdHlwZTogJ3dyaXRlJ2AgYmVjYXVzZSBzZW1hbnRpY2FsbHlcbiAgICAvLyB0aGUgc3ViZmxvdydzIGluaXRpYWwgc2NvcGUgSVMgYmVpbmcgd3JpdHRlbiB2aWEgdGhlIHBhcmVudCdzXG4gICAgLy8gaW5wdXRNYXBwZXIuIGBvcGVyYXRpb246ICdzZXQnYCBsaWtld2lzZSDigJQgdGhpcyBpcyB0aGUgc3ViZmxvdydzXG4gICAgLy8gZmlyc3Qgc2lnaHQgb2YgdGhlIGtleS5cbiAgICAvL1xuICAgIC8vIFZhbHVlcyBzaG93biB3aGVuIGluY2x1ZGVWYWx1ZXM9dHJ1ZS4gYGV2ZW50Lm1hcHBlZElucHV0YCBpcyBhbHJlYWR5XG4gICAgLy8gdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIHNlZWQg4oCUIGBTdWJmbG93RXhlY3V0b3JgIHNjcnVicyBpdCB1bmRlciB0aGVcbiAgICAvLyBydW4ncyByZWRhY3Rpb24gcnVsZSBiZWZvcmUgcmFpc2luZyB0aGUgZXZlbnQgKDkuMTkuMCksIHNvIGEgcmVkYWN0ZWRcbiAgICAvLyBrZXkgYXJyaXZlcyBhcyAnW1JFREFDVEVEXScgYW5kIGEgZmllbGQtbGV2ZWwga2V5IGFzIGEgc2NydWJiZWQgY2xvbmUuXG4gICAgaWYgKGV2ZW50Lm1hcHBlZElucHV0ICYmIE9iamVjdC5rZXlzKGV2ZW50Lm1hcHBlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgc3RlcE51bWJlciA9IDA7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhldmVudC5tYXBwZWRJbnB1dCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWVTdW1tYXJ5ID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSwgdGhpcy5tYXhWYWx1ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IG9wQ3R4OiBPcFJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgICAgdHlwZTogJ3dyaXRlJyxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgcmF3VmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHZhbHVlU3VtbWFyeSxcbiAgICAgICAgICBvcGVyYXRpb246ICdzZXQnLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6ICsrc3RlcE51bWJlcixcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0ZXh0ID0gcmVzb2x2ZVRleHQodGhpcy5yZW5kZXJlcj8ucmVuZGVyT3A/LihvcEN0eCksICgpID0+XG4gICAgICAgICAgdGhpcy5pbmNsdWRlVmFsdWVzID8gYElucHV0OiAke2tleX0gPSAke3ZhbHVlU3VtbWFyeX1gIDogYElucHV0OiAke2tleX1gLFxuICAgICAgICApO1xuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnc3RlcCcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICBzdGFnZU5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICAgICAgc3RhZ2VJZDogc2lkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiByaWQsXG4gICAgICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICByYXdWYWx1ZTogdmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCByaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgLy8gTk9URTogb3V0cHV0IHN0YXRlIGlzIE5PVCBlbWl0dGVkIGFzIHN0ZXAgZW50cmllcyDigJQgdGhlIHN1YmZsb3cncyBvd25cbiAgICAvLyBzdGFnZXMgYWxyZWFkeSBuYXJyYXRlZCBlYWNoIHdyaXRlLCBzbyB0aGUgZXhpdCBoZWFkZXIgaXMgc3VmZmljaWVudDtcbiAgICAvLyBkcmlsbCBpbnRvIHRoZSBzdWJmbG93IGZvciBkZXRhaWxzLiBTaW5jZSA5LjIwLjAgYG91dHB1dFN0YXRlYCBpcyB0aGVcbiAgICAvLyBzdWJmbG93J3MgU0VSVkVEIHN0YXRlIChpdHMgcmVkYWN0ZWQgbWlycm9yIHVuZGVyIGEgcG9saWN5KSwgc28gYVxuICAgIC8vIHJlbmRlcmVyIHRoYXQgZG9lcyBzaG93IGl0IHNob3dzIHdoYXQgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYFxuICAgIC8vIHNlcnZlcywgbmV2ZXIgdGhlIHJhdyBoZWFwLlxuICAgIGNvbnN0IGN0eDogU3ViZmxvd1JlbmRlckNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgZGlyZWN0aW9uOiAnZXhpdCcsXG4gICAgICBvdXRwdXRTdGF0ZTogZXZlbnQub3V0cHV0U3RhdGUsXG4gICAgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyU3ViZmxvdz8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU3ViZmxvdyhjdHgpO1xuICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICB0eXBlOiAnc3ViZmxvdycsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBzdGFnZUlkOiBzaWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogcmlkLFxuICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgICAgZGlyZWN0aW9uOiAnZXhpdCcsXG4gICAgfSk7XG4gIH1cblxuICBvbkxvb3AoZXZlbnQ6IEZsb3dMb29wRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IExvb3BSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICBpdGVyYXRpb246IGV2ZW50Lml0ZXJhdGlvbixcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJMb29wPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJMb29wKGN0eCk7XG4gICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdsb29wJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQnJlYWsoZXZlbnQ6IEZsb3dCcmVha0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4OiBCcmVha1JlbmRlckNvbnRleHQgPSB7IHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckJyZWFrPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJCcmVhayhjdHgpO1xuICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICB0eXBlOiAnYnJlYWsnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYWlsZWQgYXR0ZW1wdCB0aGF0IHdhcyByZXRyaWVkLiBCVUZGRVJFRCwgbm90IHB1c2hlZDogdGhpcyBpcyB0aGUgb25seVxuICAgKiBmbG93IGV2ZW50IHRoYXQgZmlyZXMgRFVSSU5HIGEgc3RhZ2UsIHNvIHB1c2hpbmcgaXQgc3RyYWlnaHQgdG8gdGhlIHN0b3JlXG4gICAqIHdvdWxkIHBsYWNlIHRoZSBsaW5lIGJlZm9yZSBpdHMgb3duIHN0YWdlIGhlYWRlci4gQnVmZmVyZWQgYWxvbmdzaWRlIHRoZVxuICAgKiByZWFkcyBhbmQgd3JpdGVzLCBpdCBmbHVzaGVzIGluIHRydWUgZXhlY3V0aW9uIG9yZGVyOlxuICAgKlxuICAgKiAgICAgU3RlcCAzOiBGZXRjaCB1c2VyXG4gICAqICAgICAgIOKGsyByZWFkIHVzZXJJZCA9IFwidTFcIlxuICAgKiAgICAgICDihrMgW1JldHJ5XTogYXR0ZW1wdCAxIG9mIDMgZmFpbGVkIOKApiByZXRyeWluZ1xuICAgKiAgICAgICDihrMgcmVhZCB1c2VySWQgPSBcInUxXCJcbiAgICogICAgICAg4oazIHdyb3RlIHVzZXIgPSB7IOKApiB9XG4gICAqL1xuICBvblN0YWdlUmV0cnkoZXZlbnQ6IEZsb3dTdGFnZVJldHJ5RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBydW50aW1lU3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGlmICghcnVudGltZVN0YWdlSWQpIHJldHVybjtcbiAgICB0aGlzLmJ1ZmZlck9wKHJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICB0eXBlOiAncmV0cnknLFxuICAgICAga2V5OiBldmVudC5zdGFnZU5hbWUsXG4gICAgICByYXdWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgcmV0cnk6IHtcbiAgICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICAgIGF0dGVtcHQ6IGV2ZW50LmF0dGVtcHQsXG4gICAgICAgIG1heEF0dGVtcHRzOiBldmVudC5tYXhBdHRlbXB0cyxcbiAgICAgICAgZGVsYXlNczogZXZlbnQuZGVsYXlNcyxcbiAgICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBvblBhdXNlKGV2ZW50OiBQYXVzZUV2ZW50IHwgRmxvd1BhdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBCb3RoIGNoYW5uZWxzIGZpcmUgb25QYXVzZSB3aXRoIGRpZmZlcmVudCBwYXlsb2FkIHNoYXBlcy4gTmFycmF0aXZlIG9ubHlcbiAgICAvLyBzdXJmYWNlcyB0aGUgY29udHJvbC1mbG93IHZhcmlhbnQgKHdoaWNoIGhhcyBzdGFnZU5hbWUvc3RhZ2VJZCkuIERhdGFcbiAgICAvLyBjaGFubmVsJ3MgUGF1c2VFdmVudCBpcyBpZ25vcmVkIHRvIGF2b2lkIGR1cGxpY2F0ZSBlbnRyaWVzLlxuICAgIGlmICghaXNGbG93RXZlbnQoZXZlbnQpKSByZXR1cm47XG4gICAgaWYgKCFldmVudC5zdGFnZU5hbWUgfHwgIWV2ZW50LnN0YWdlSWQpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gcGF1c2VTZW50ZW5jZShldmVudCk7XG4gICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdwYXVzZScsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQgPz8gZXZlbnQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25SZXN1bWUoZXZlbnQ6IFJlc3VtZUV2ZW50IHwgRmxvd1Jlc3VtZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gU2FtZSBpc0Zsb3dFdmVudCBkaXNjcmltaW5hbnQgYXMgb25QYXVzZSDigJQgaWdub3JlIHNjb3BlIFJlc3VtZUV2ZW50LlxuICAgIGlmICghaXNGbG93RXZlbnQoZXZlbnQpKSByZXR1cm47XG4gICAgaWYgKCFldmVudC5zdGFnZU5hbWUgfHwgIWV2ZW50LnN0YWdlSWQpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gcmVzdW1lU2VudGVuY2UoZXZlbnQpO1xuICAgIHRoaXMucmVzdW1lZFN0YWdlID0gZXZlbnQuc3RhZ2VOYW1lO1xuICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICB0eXBlOiAncmVzdW1lJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCA/PyBldmVudC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvbkVycm9yKGV2ZW50OiBFcnJvckV2ZW50IHwgRmxvd0Vycm9yRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBOYXJyYXRpdmUgb25seSBzdXJmYWNlcyB0aGUgY29udHJvbC1mbG93IHZhcmlhbnQgb2YgZXJyb3JzIChoYXNcbiAgICAvLyBzdGFnZU5hbWUgKyBtZXNzYWdlKS4gU2NvcGUtbGV2ZWwgRXJyb3JFdmVudCBpcyBjYXB0dXJlZCBlbHNld2hlcmUuXG4gICAgaWYgKCFpc0Zsb3dFdmVudChldmVudCkpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGV2ZW50Lm1lc3NhZ2UgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBsZXQgdmFsaWRhdGlvbklzc3Vlczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChldmVudC5zdHJ1Y3R1cmVkRXJyb3I/Lmlzc3Vlcz8ubGVuZ3RoKSB7XG4gICAgICB2YWxpZGF0aW9uSXNzdWVzID0gdmFsaWRhdGlvbkRldGFpbHMoZXZlbnQuc3RydWN0dXJlZEVycm9yLmlzc3Vlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3R4OiBFcnJvclJlbmRlckNvbnRleHQgPSB7XG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIG1lc3NhZ2U6IGV2ZW50Lm1lc3NhZ2UsXG4gICAgICB2YWxpZGF0aW9uSXNzdWVzLFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckVycm9yPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJFcnJvcihjdHgpO1xuICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgRW1pdCBjaGFubmVsIChQaGFzZSAzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVjZWl2ZSBhIGNvbnN1bWVyLWVtaXR0ZWQgZXZlbnQgZnJvbSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgLlxuICAgKlxuICAgKiBCdWZmZXJlZCBhbG9uZ3NpZGUgYG9uUmVhZGAvYG9uV3JpdGVgIHBlci1zdGFnZSBzbyB0aGF0IHRoZSBmaW5hbFxuICAgKiBuYXJyYXRpdmUgcHJlc2VydmVzIG9yZGVyaW5nOlxuICAgKlxuICAgKiAgIDEuIHN0YWdlIGhlYWRlciAoZW1pdHRlZCBieSBgb25TdGFnZUV4ZWN1dGVkYCAvIGBvbkRlY2lzaW9uYClcbiAgICogICAyLiBidWZmZXJlZCBvcHMgZm9yIHRoYXQgc3RhZ2Ug4oCUIGluIGNhbGwgb3JkZXIg4oCUIGZsdXNoZWQgcmlnaHQgYWZ0ZXJcbiAgICpcbiAgICogV2l0aG91dCBidWZmZXJpbmcsIGVtaXQgZXZlbnRzIHdvdWxkIGZpcmUgQkVGT1JFIHRoZSBzdGFnZSBoZWFkZXJcbiAgICogKHdoaWNoIG9ubHkgbGFuZHMgYXQgYG9uU3RhZ2VFeGVjdXRlZGApLCBwcm9kdWNpbmcgb3V0LW9mLW9yZGVyXG4gICAqIG5hcnJhdGl2ZSBlbnRyaWVzLiBGbHVzaCBoYXBwZW5zIGluIGBmbHVzaE9wc2Agd2hpY2ggcm91dGVzIGBlbWl0YC1cbiAgICogdHlwZWQgYnVmZmVyZWQgb3BzIHRocm91Z2ggYHJlbmRlckVtaXRgIGluc3RlYWQgb2YgYHJlbmRlck9wYC5cbiAgICovXG4gIG9uRW1pdChldmVudDogRW1pdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5ydW50aW1lU3RhZ2VJZCwge1xuICAgICAgdHlwZTogJ2VtaXQnLFxuICAgICAga2V5OiBldmVudC5uYW1lLFxuICAgICAgcmF3VmFsdWU6IGV2ZW50LnBheWxvYWQsXG4gICAgICBlbWl0RXZlbnQ6IGV2ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRW1pdChjdHg6IEVtaXRSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFtlbWl0XSAke2N0eC5uYW1lfTogJHtjdHgucGF5bG9hZFN1bW1hcnl9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBPdXRwdXQgKG5hcnJhdGl2ZS1zcGVjaWZpYykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgZW50cmllcyBncm91cGVkIGJ5IHN1YmZsb3dJZCBmb3Igc3RydWN0dXJlZCBhY2Nlc3MuXG4gICAqIFJvb3QtbGV2ZWwgZW50cmllcyBoYXZlIHN1YmZsb3dJZCA9IHVuZGVmaW5lZC5cbiAgICovXG4gIGdldEVudHJpZXNCeVN1YmZsb3coKTogUmVjb3JkPHN0cmluZywgQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10+ID0geyAnJzogW10gfTtcbiAgICB0aGlzLnN0b3JlLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBlbnRyeS5zdWJmbG93SWQgPz8gJyc7XG4gICAgICBpZiAoIXJlc3VsdFtrZXldKSByZXN1bHRba2V5XSA9IFtdO1xuICAgICAgcmVzdWx0W2tleV0ucHVzaChlbnRyeSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTZXF1ZW5jZSBxdWVyeSBBUEkgKGRlbGVnYXRlcyB0byB0aGUgY29tcG9zZWQgc3RvcmUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBBbGwgbmFycmF0aXZlIGVudHJpZXMgaW4gZXhlY3V0aW9uIG9yZGVyLiAqL1xuICBnZXRFbnRyaWVzKCk6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0QWxsKCk7XG4gIH1cblxuICAvKiogVG90YWwgbnVtYmVyIG9mIG5hcnJhdGl2ZSBlbnRyaWVzLiAqL1xuICBnZXQgZW50cnlDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gIH1cblxuICAvKiogTygxKSBsb29rdXA6IGFsbCBuYXJyYXRpdmUgZW50cmllcyBmb3Igb25lIGV4ZWN1dGlvbiBzdGVwLiAqL1xuICBnZXRFbnRyaWVzRm9yU3RlcChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRCeUtleShydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIGRpc3RpbmN0IGV4ZWN1dGlvbiBzdGVwcyB0aGF0IHByb2R1Y2VkIGVudHJpZXMuICovXG4gIGdldCBzdGVwQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5rZXlDb3VudDtcbiAgfVxuXG4gIC8qKiBQcmUtYnVpbHQgcGVyLXN0ZXAgcmFuZ2UgaW5kZXgg4oCUIE8oMSkgbG9va3VwcyBmb3IgdGltZS10cmF2ZWwgc2NydWJiaW5nLiAqL1xuICBnZXRFbnRyeVJhbmdlcygpOiBSZWFkb25seU1hcDxzdHJpbmcsIHsgcmVhZG9ubHkgZmlyc3RJZHg6IG51bWJlcjsgcmVhZG9ubHkgZW5kSWR4OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEVudHJ5UmFuZ2VzKCk7XG4gIH1cblxuICAvKiogUmVkdWNlIEFMTCBlbnRyaWVzIHRvIGEgc2luZ2xlIHZhbHVlLiAqL1xuICBhZ2dyZWdhdGU8Uj4oZm46IChhY2M6IFIsIGVudHJ5OiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5KSA9PiBSLCBpbml0aWFsOiBSKTogUiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuYWdncmVnYXRlKGZuLCBpbml0aWFsKTtcbiAgfVxuXG4gIC8qKiBSZWR1Y2UgZW50cmllcywgb3B0aW9uYWxseSBmaWx0ZXJlZCB0byBhIHNldCBvZiB2aXNpYmxlIHJ1bnRpbWVTdGFnZUlkcy4gKi9cbiAgYWNjdW11bGF0ZTxSPihmbjogKGFjYzogUiwgZW50cnk6IENvbWJpbmVkTmFycmF0aXZlRW50cnkpID0+IFIsIGluaXRpYWw6IFIsIGtleXM/OiBSZWFkb25seVNldDxzdHJpbmc+KTogUiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuYWNjdW11bGF0ZShmbiwgaW5pdGlhbCwga2V5cyk7XG4gIH1cblxuICAvKiogUHJvZ3Jlc3NpdmUgcmV2ZWFsOiBlbnRyaWVzIHdob3NlIHJ1bnRpbWVTdGFnZUlkIGlzIGluIHRoZSB2aXNpYmxlIHNldC4gKi9cbiAgZ2V0RW50cmllc1VwVG8odmlzaWJsZUlkczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RW50cmllc1VwVG8odmlzaWJsZUlkcyk7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3QgYnVuZGxlIGZvciBpbmNsdXNpb24gaW4gYGV4ZWN1dG9yLmdldFNuYXBzaG90KCkucmVjb3JkZXJzYCDigJRcbiAgICogdGhlIG5hcnJhdGl2ZSByaWRlcyB0aGUgc25hcHNob3QsIHNvIGEgY29uc3VtZXIgaG9sZGluZyBvbmx5IHRoZSBmcm96ZW5cbiAgICogc25hcHNob3QgKGEgdHJhY2Ugdmlld2VyLCBhbiBleHBvcnRlZCBydW4sIGEgVUkgcGFuZWwgdGhhdCBuZXZlciBzZWVzIHRoZVxuICAgKiBleGVjdXRvcikgY2FuIHJlYWQgdGhlIHJ1bidzIHN0b3J5IHdpdGhvdXQgY2FsbGluZyBiYWNrIGludG8gdGhlIGVuZ2luZS5cbiAgICpcbiAgICogYHJhd1ZhbHVlYCBpcyBkZWxpYmVyYXRlbHkgRFJPUFBFRCBmcm9tIHRoZSBzbmFwc2hvdCBlbnRyaWVzLiBJdCBpcyBhXG4gICAqIGxpdmUgcmVmZXJlbmNlIHRvIHNjb3BlL2VtaXQgcGF5bG9hZHMgYnkgY29udHJhY3QgKHNlZVxuICAgKiBgQ29tYmluZWROYXJyYXRpdmVFbnRyeS5yYXdWYWx1ZWApLCBzbyBrZWVwaW5nIGl0IHdvdWxkIGJvdGggYWxpYXMgZW5naW5lXG4gICAqIG1lbW9yeSBpbnRvIGFuIGFydGlmYWN0IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgZGV0YWNoZWQgQU5EIG1ha2UgdGhlXG4gICAqIHNuYXBzaG90IGZhaWwgYHN0cnVjdHVyZWRDbG9uZWAvYEpTT04uc3RyaW5naWZ5YCB3aGVuZXZlciBhIHBheWxvYWQgaXNcbiAgICogbm90IHNlcmlhbGl6YWJsZS4gVGhlIHJlbmRlcmVkIGB0ZXh0YCBhbHJlYWR5IGNhcnJpZXMgdGhlIHZhbHVlIHN1bW1hcnlcbiAgICogKGBpbmNsdWRlVmFsdWVzYCwgZGVmYXVsdCBvbikgYW5kIGBrZXlgIGNhcnJpZXMgdGhlIHNjb3BlIGtleSwgc28gbm90aGluZ1xuICAgKiBhIHNuYXBzaG90IGNvbnN1bWVyIGNhbiBhY3Qgb24gaXMgbG9zdC4gSW4tcHJvY2VzcyBjb25zdW1lcnMgdGhhdCBuZWVkXG4gICAqIHRoZSBsaXZlIHZhbHVlIGtlZXAgdXNpbmcgYGdldEVudHJpZXMoKWAuXG4gICAqL1xuICB0b1NuYXBzaG90KCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnTmFycmF0aXZlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVHJhbnNsYXRvciAoU2VxdWVuY2VTdG9yZSkg4oCUIHBsYWluLUVuZ2xpc2ggdHJhY2UgbWVyZ2VkIGZyb20gZmxvdyArIGRhdGEgZXZlbnRzJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldEVudHJpZXMoKS5tYXAoKHsgcmF3VmFsdWU6IF9yYXdWYWx1ZSwgLi4uZW50cnkgfSkgPT4gZW50cnkpLFxuICAgIH07XG4gIH1cblxuICAvKiogQ2xlYXJzIGFsbCBzdGF0ZS4gQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGVhY2ggcnVuLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nT3BzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5maXJzdFN0YWdlRmxhZ3MuY2xlYXIoKTtcbiAgICB0aGlzLnN0YWdlVmlzaXRDb3VudHMuY2xlYXIoKTtcbiAgICB0aGlzLnJlc3VtZWRTdGFnZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBpbmNyZW1lbnRTdGFnZUNvdW50ZXIoc3ViZmxvd0tleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zdGFnZUNvdW50ZXJzLmdldChzdWJmbG93S2V5KSA/PyAwO1xuICAgIGNvbnN0IG5leHQgPSBjdXJyZW50ICsgMTtcbiAgICB0aGlzLnN0YWdlQ291bnRlcnMuc2V0KHN1YmZsb3dLZXksIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgLyoqIFRoZSBmaXJzdCBzdGFnZSBoZWFkZXIgYWZ0ZXIgYSByZXN1bWUgYmVsb25ncyB0byB0aGUgcmVzdW1lZCBzdGFnZTsgdG9sZCBvbmNlLCB0aGVuIGNsZWFyZWQuICovXG4gIHByaXZhdGUgY29uc3VtZVJlc3VtZWQoc3RhZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZXN1bWVkID0gdGhpcy5yZXN1bWVkU3RhZ2UgPT09IHN0YWdlTmFtZTtcbiAgICB0aGlzLnJlc3VtZWRTdGFnZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdW1lZDtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZUZpcnN0U3RhZ2VGbGFnKHN1YmZsb3dLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5maXJzdFN0YWdlRmxhZ3MuaGFzKHN1YmZsb3dLZXkpKSB7XG4gICAgICB0aGlzLmZpcnN0U3RhZ2VGbGFncy5zZXQoc3ViZmxvd0tleSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVmZmVyT3AocnVudGltZVN0YWdlSWQ6IHN0cmluZywgb3A6IE9taXQ8QnVmZmVyZWRPcCwgJ3N0ZXBOdW1iZXInPik6IHZvaWQge1xuICAgIGxldCBvcHMgPSB0aGlzLnBlbmRpbmdPcHMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICBpZiAoIW9wcykge1xuICAgICAgb3BzID0gW107XG4gICAgICB0aGlzLnBlbmRpbmdPcHMuc2V0KHJ1bnRpbWVTdGFnZUlkLCBvcHMpO1xuICAgIH1cbiAgICBvcHMucHVzaCh7IC4uLm9wLCBzdGVwTnVtYmVyOiBvcHMubGVuZ3RoICsgMSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hPcHMocnVudGltZVN0YWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3ViZmxvd0lkPzogc3RyaW5nLCBzdGFnZUlkPzogc3RyaW5nLCBzdGFnZU5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocnVudGltZVN0YWdlSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IG9wcyA9IHRoaXMucGVuZGluZ09wcy5nZXQocnVudGltZVN0YWdlSWQpO1xuICAgIGlmICghb3BzIHx8IG9wcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgICAvLyDilIDilIAgRW1pdCBldmVudHMgdGFrZSBhIGRpZmZlcmVudCByZW5kZXIgcGF0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIC8vXG4gICAgICAvLyBFbWl0IGV2ZW50cyBhcmUgYnVmZmVyZWQgYWxvbmdzaWRlIHJlYWRzL3dyaXRlcyAoc28gdGhleSBhcHBlYXJcbiAgICAgIC8vIHVuZGVyIHRoZWlyIG93bmluZyBzdGFnZSdzIGhlYWRlciBpbiBuYXJyYXRpdmUgb3JkZXIsIG5vdCBpbmxpbmVcbiAgICAgIC8vIGF0IGNhbGwgdGltZSkuIEF0IGZsdXNoLCB0aGV5IHJvdXRlIHRocm91Z2ggYHJlbmRlckVtaXRgIGluc3RlYWRcbiAgICAgIC8vIG9mIGByZW5kZXJPcGAg4oCUIGNvbnN1bWVycyB3YW50aW5nIGN1c3RvbSBlbWl0IHJlbmRlcmluZyBpbXBsZW1lbnRcbiAgICAgIC8vIHRoZSBkZWRpY2F0ZWQgaG9vay4gVW5oYW5kbGVkIC8gbWlzc2luZyByZW5kZXJlciBmYWxscyBiYWNrIHRvXG4gICAgICAvLyB0aGUgc2FtZSBjb21wYWN0IGBbZW1pdF0gbmFtZTogcGF5bG9hZFN1bW1hcnlgIGRlZmF1bHQgdXNlZCBieVxuICAgICAgLy8gdGhlIHByZS1idWZmZXJpbmcgb25FbWl0IHBhdGguXG4gICAgICBpZiAob3AudHlwZSA9PT0gJ2VtaXQnICYmIG9wLmVtaXRFdmVudCkge1xuICAgICAgICBjb25zdCBlID0gb3AuZW1pdEV2ZW50O1xuICAgICAgICBjb25zdCBwYXlsb2FkU3VtbWFyeSA9IHRoaXMuZm9ybWF0VmFsdWUoZS5wYXlsb2FkLCB0aGlzLm1heFZhbHVlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZW1pdEN0eDogRW1pdFJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgICAgbmFtZTogZS5uYW1lLFxuICAgICAgICAgIHBheWxvYWQ6IGUucGF5bG9hZCxcbiAgICAgICAgICBzdGFnZU5hbWU6IGUuc3RhZ2VOYW1lLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHN1YmZsb3dQYXRoOiBlLnN1YmZsb3dQYXRoLFxuICAgICAgICAgIHBpcGVsaW5lSWQ6IGUucGlwZWxpbmVJZCxcbiAgICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgICAgIHBheWxvYWRTdW1tYXJ5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlbWl0VGV4dCA9IHJlc29sdmVUZXh0KHRoaXMucmVuZGVyZXI/LnJlbmRlckVtaXQ/LihlbWl0Q3R4KSwgKCkgPT4gdGhpcy5kZWZhdWx0UmVuZGVyRW1pdChlbWl0Q3R4KSk7XG4gICAgICAgIGlmIChlbWl0VGV4dCA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2VtaXQnLFxuICAgICAgICAgIHRleHQ6IGVtaXRUZXh0LFxuICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgIHN0YWdlTmFtZSxcbiAgICAgICAgICBzdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBSZXRyaWVkIGF0dGVtcHRzIHRha2UgdGhlaXIgb3duIHJlbmRlciBwYXRoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgLy9cbiAgICAgIC8vIFNhbWUgYnVmZmVyaW5nIHJhdGlvbmFsZSBhcyBlbWl0IGFib3ZlOiB0aGUgZW50cnkgYmVsb25ncyBJTlNJREUgaXRzXG4gICAgICAvLyBzdGFnZSwgaW4gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBmYWlsdXJlIGFjdHVhbGx5IGhhcHBlbmVkLlxuICAgICAgaWYgKG9wLnR5cGUgPT09ICdyZXRyeScgJiYgb3AucmV0cnkpIHtcbiAgICAgICAgY29uc3QgcmV0cnlUZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyUmV0cnk/LihvcC5yZXRyeSkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyUmV0cnkob3AucmV0cnkpO1xuICAgICAgICB0aGlzLnN0b3JlLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdyZXRyeScsXG4gICAgICAgICAgdGV4dDogcmV0cnlUZXh0LFxuICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgIHN0YWdlTmFtZSxcbiAgICAgICAgICBzdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQgb3AudHlwZSBpcyBuYXJyb3dlZCB0byAncmVhZCcgfCAnd3JpdGUnICh0aGUgZW1pdCBhbmRcbiAgICAgIC8vIHJldHJ5IGJyYW5jaGVzIGFib3ZlIHVzZSBgY29udGludWVgKS4gVHlwZVNjcmlwdCBjYW4ndCBmb2xsb3cgdGhhdFxuICAgICAgLy8gbmFycm93aW5nIHRocm91Z2ggdGhlIGNvbnRpbnVlLCBzbyB3ZSBhc3NlcnQgYXQgcmVuZGVyIHRpbWUuXG4gICAgICBjb25zdCBvcFR5cGUgPSBvcC50eXBlIGFzICdyZWFkJyB8ICd3cml0ZSc7XG4gICAgICBjb25zdCB2YWx1ZVN1bW1hcnkgPSB0aGlzLmZvcm1hdFZhbHVlKG9wLnJhd1ZhbHVlLCB0aGlzLm1heFZhbHVlTGVuZ3RoKTtcbiAgICAgIGNvbnN0IG9wQ3R4OiBPcFJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgIHR5cGU6IG9wVHlwZSxcbiAgICAgICAga2V5OiBvcC5rZXksXG4gICAgICAgIHJhd1ZhbHVlOiBvcC5yYXdWYWx1ZSxcbiAgICAgICAgdmFsdWVTdW1tYXJ5LFxuICAgICAgICBvcGVyYXRpb246IG9wLm9wZXJhdGlvbixcbiAgICAgICAgc3RlcE51bWJlcjogb3Auc3RlcE51bWJlcixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHRleHQgPSByZXNvbHZlVGV4dCh0aGlzLnJlbmRlcmVyPy5yZW5kZXJPcD8uKG9wQ3R4KSwgKCkgPT4gdGhpcy5kZWZhdWx0UmVuZGVyT3Aob3BDdHgpKTtcbiAgICAgIGlmICh0ZXh0ID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgICAgdHlwZTogJ3N0ZXAnLFxuICAgICAgICB0ZXh0LFxuICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RlcE51bWJlcjogb3Auc3RlcE51bWJlcixcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBrZXk6IG9wLmtleSxcbiAgICAgICAgcmF3VmFsdWU6IG9wLnJhd1ZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nT3BzLmRlbGV0ZShydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvLyDilIDilIAgRGVmYXVsdCByZW5kZXJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyU3RhZ2UoY3R4OiBTdGFnZVJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGxldCBpbm5lcjogc3RyaW5nO1xuICAgIGlmIChjdHgucmVzdW1lZCkge1xuICAgICAgaW5uZXIgPSAnSXQgY29udGludWVkIGZyb20gdGhlIHBhdXNlLic7XG4gICAgfSBlbHNlIGlmIChjdHguaXNGaXJzdCkge1xuICAgICAgaW5uZXIgPSBjdHguZGVzY3JpcHRpb24gPyBgVGhlIHByb2Nlc3MgYmVnYW46ICR7Y3R4LmRlc2NyaXB0aW9ufS5gIDogYFRoZSBwcm9jZXNzIGJlZ2FuIHdpdGggJHtjdHguc3RhZ2VOYW1lfS5gO1xuICAgIH0gZWxzZSBpZiAoY3R4Lmxvb3BJdGVyYXRpb24gJiYgY3R4Lmxvb3BJdGVyYXRpb24gPiAwKSB7XG4gICAgICBpbm5lciA9IGN0eC5kZXNjcmlwdGlvblxuICAgICAgICA/IGBMb29wZWQgYmFjazogJHtjdHguZGVzY3JpcHRpb259IChwYXNzICR7Y3R4Lmxvb3BJdGVyYXRpb259KS5gXG4gICAgICAgIDogYExvb3BlZCBiYWNrIHRvICR7Y3R4LnN0YWdlTmFtZX0gKHBhc3MgJHtjdHgubG9vcEl0ZXJhdGlvbn0pLmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlubmVyID0gbmV4dFN0YWdlU2VudGVuY2UoY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIGBTdGFnZSAke2N0eC5zdGFnZU51bWJlcn06ICR7aW5uZXJ9YDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlck9wKGN0eDogT3BSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGVwUHJlZml4ID0gdGhpcy5pbmNsdWRlU3RlcE51bWJlcnMgPyBgU3RlcCAke2N0eC5zdGVwTnVtYmVyfTogYCA6ICcnO1xuICAgIGlmIChjdHgudHlwZSA9PT0gJ3JlYWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmNsdWRlVmFsdWVzICYmIGN0eC52YWx1ZVN1bW1hcnlcbiAgICAgICAgPyBgJHtzdGVwUHJlZml4fVJlYWQgJHtjdHgua2V5fSA9ICR7Y3R4LnZhbHVlU3VtbWFyeX1gXG4gICAgICAgIDogYCR7c3RlcFByZWZpeH1SZWFkICR7Y3R4LmtleX1gO1xuICAgIH1cbiAgICBpZiAoY3R4Lm9wZXJhdGlvbiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIHJldHVybiBgJHtzdGVwUHJlZml4fURlbGV0ZSAke2N0eC5rZXl9YDtcbiAgICB9XG4gICAgaWYgKGN0eC5vcGVyYXRpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmNsdWRlVmFsdWVzXG4gICAgICAgID8gYCR7c3RlcFByZWZpeH1VcGRhdGUgJHtjdHgua2V5fSA9ICR7Y3R4LnZhbHVlU3VtbWFyeX1gXG4gICAgICAgIDogYCR7c3RlcFByZWZpeH1VcGRhdGUgJHtjdHgua2V5fWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluY2x1ZGVWYWx1ZXMgPyBgJHtzdGVwUHJlZml4fVdyaXRlICR7Y3R4LmtleX0gPSAke2N0eC52YWx1ZVN1bW1hcnl9YCA6IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtjdHgua2V5fWA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJEZWNpc2lvbihjdHg6IERlY2lzaW9uUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3QgYnJhbmNoTmFtZSA9IGN0eC5jaG9zZW47XG4gICAgbGV0IGNvbmRpdGlvblRleHQ6IHN0cmluZztcbiAgICBpZiAoY3R4LmV2aWRlbmNlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgZXZpZGVuY2UgPSBjdHguZXZpZGVuY2UgYXMgYW55O1xuICAgICAgY29uc3QgbWF0Y2hlZFJ1bGUgPSBldmlkZW5jZS5ydWxlcz8uZmluZCgocjogYW55KSA9PiByLm1hdGNoZWQpO1xuICAgICAgaWYgKG1hdGNoZWRSdWxlKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gbWF0Y2hlZFJ1bGUubGFiZWwgPyBgIFwiJHttYXRjaGVkUnVsZS5sYWJlbH1cImAgOiAnJztcbiAgICAgICAgaWYgKG1hdGNoZWRSdWxlLnR5cGUgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBtYXRjaGVkUnVsZS5jb25kaXRpb25zLm1hcChcbiAgICAgICAgICAgIChjOiBhbnkpID0+XG4gICAgICAgICAgICAgIGAke2Mua2V5fSAke2MuYWN0dWFsU3VtbWFyeX0gJHtjLm9wfSAke0pTT04uc3RyaW5naWZ5KGMudGhyZXNob2xkKX0gJHtjLnJlc3VsdCA/ICdcXHUyNzEzJyA6ICdcXHUyNzE3J31gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCBldmFsdWF0ZWQgUnVsZSAke21hdGNoZWRSdWxlLnJ1bGVJbmRleH0ke2xhYmVsfTogJHtwYXJ0cy5qb2luKFxuICAgICAgICAgICAgJywgJyxcbiAgICAgICAgICApfSwgYW5kIGNob3NlICR7YnJhbmNoTmFtZX0uYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IG1hdGNoZWRSdWxlLmlucHV0cy5tYXAoKGk6IGFueSkgPT4gYCR7aS5rZXl9PSR7aS52YWx1ZVN1bW1hcnl9YCk7XG4gICAgICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCBleGFtaW5lZCR7bGFiZWx9OiAke3BhcnRzLmpvaW4oJywgJyl9LCBhbmQgY2hvc2UgJHticmFuY2hOYW1lfS5gO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvcmVkQ291bnQgPSBldmlkZW5jZS5ydWxlcz8uZmlsdGVyKChyOiBhbnkpID0+IHIubWF0Y2hFcnJvciAhPT0gdW5kZWZpbmVkKS5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgZXJyb3JOb3RlID0gZXJyb3JlZENvdW50ID4gMCA/IGAgKCR7ZXJyb3JlZENvdW50fSBydWxlJHtlcnJvcmVkQ291bnQgPiAxID8gJ3MnIDogJyd9IHRocmV3IGVycm9ycylgIDogJyc7XG4gICAgICAgIC8vIFRoZSBkZWZhdWx0IGJyYW5jaCBpcyBjaG9zZW4gYnkgbm8gcnVsZSwgc28gbm8gcnVsZSBsYWJlbCBjYW4gZXhwbGFpblxuICAgICAgICAvLyBpdC4gV2hlbiBkZWNpZGUoKSB3YXMgZ2l2ZW4gdGhlIG9iamVjdCBmb3JtIG9mIGl0cyBkZWZhdWx0LCBldmlkZW5jZVxuICAgICAgICAvLyBjYXJyaWVzIHRoYXQgbWVhbmluZyDigJQgcHJpbnQgaXQsIGV4YWN0bHkgYXMgYSBtYXRjaGVkIHJ1bGUncyBsYWJlbCBpc1xuICAgICAgICAvLyBwcmludGVkLiBBYnNlbnQsIHRoZSBzZW50ZW5jZSBpcyB1bmNoYW5nZWQgZnJvbSBiZWZvcmUgdGhpcyBmaWVsZC5cbiAgICAgICAgY29uc3QgZGVmYXVsdExhYmVsID0gZXZpZGVuY2UuZGVmYXVsdExhYmVsID8gYCBcIiR7ZXZpZGVuY2UuZGVmYXVsdExhYmVsfVwiYCA6ICcnO1xuICAgICAgICBjb25kaXRpb25UZXh0ID0gYE5vIHJ1bGVzIG1hdGNoZWQke2Vycm9yTm90ZX0sIGZlbGwgYmFjayB0byBkZWZhdWx0JHtkZWZhdWx0TGFiZWx9OiAke2JyYW5jaE5hbWV9LmA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvblRleHQgPSBkZWNpc2lvblNlbnRlbmNlKGN0eCk7XG4gICAgfVxuICAgIHJldHVybiBgW0NvbmRpdGlvbl06ICR7Y29uZGl0aW9uVGV4dH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRm9yayhjdHg6IEZvcmtSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFtQYXJhbGxlbF06ICR7Zm9ya1NlbnRlbmNlKGN0eCl9YDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlclNlbGVjdGVkKGN0eDogU2VsZWN0ZWRSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBpZiAoY3R4LmV2aWRlbmNlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgZXZpZGVuY2UgPSBjdHguZXZpZGVuY2UgYXMgYW55O1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IGV2aWRlbmNlLnJ1bGVzPy5maWx0ZXIoKHI6IGFueSkgPT4gci5tYXRjaGVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IHBhcnRzID0gbWF0Y2hlZC5tYXAoKHI6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHIubGFiZWwgPyBgIFwiJHtyLmxhYmVsfVwiYCA6ICcnO1xuICAgICAgICBpZiAoci50eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgICAgIGNvbnN0IGNvbmRzID0gci5jb25kaXRpb25zXG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAoYzogYW55KSA9PlxuICAgICAgICAgICAgICAgIGAke2Mua2V5fSAke2MuYWN0dWFsU3VtbWFyeX0gJHtjLm9wfSAke0pTT04uc3RyaW5naWZ5KGMudGhyZXNob2xkKX0gJHtjLnJlc3VsdCA/ICdcXHUyNzEzJyA6ICdcXHUyNzE3J31gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgICAgcmV0dXJuIGAke3IuYnJhbmNofSR7bGFiZWx9ICgke2NvbmRzfSlgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHIuaW5wdXRzLm1hcCgoaTogYW55KSA9PiBgJHtpLmtleX09JHtpLnZhbHVlU3VtbWFyeX1gKS5qb2luKCcsICcpO1xuICAgICAgICByZXR1cm4gYCR7ci5icmFuY2h9JHtsYWJlbH0gKCR7aW5wdXRzfSlgO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYFtTZWxlY3RlZF06ICR7Y3R4LnNlbGVjdGVkLmxlbmd0aH0gb2YgJHtjdHgudG90YWx9IHBhdGhzIHNlbGVjdGVkOiAke3BhcnRzLmpvaW4oJzsgJyl9LmA7XG4gICAgfVxuICAgIGNvbnN0IG5hbWVzID0gY3R4LnNlbGVjdGVkLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIGBbU2VsZWN0ZWRdOiAke2N0eC5zZWxlY3RlZC5sZW5ndGh9IG9mICR7Y3R4LnRvdGFsfSBwYXRocyBzZWxlY3RlZCBmb3IgZXhlY3V0aW9uOiAke25hbWVzfS5gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyU3ViZmxvdyhjdHg6IFN1YmZsb3dSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gJ2V4aXQnKSB7XG4gICAgICByZXR1cm4gYEV4aXRpbmcgdGhlICR7Y3R4Lm5hbWV9IHN1YmZsb3cuYDtcbiAgICB9XG4gICAgcmV0dXJuIGN0eC5kZXNjcmlwdGlvbiA/IGBFbnRlcmluZyAke2N0eC5uYW1lfTogJHtjdHguZGVzY3JpcHRpb259LmAgOiBgRW50ZXJpbmcgdGhlICR7Y3R4Lm5hbWV9IHN1YmZsb3cuYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckxvb3AoY3R4OiBMb29wUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvb3BTZW50ZW5jZShjdHgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyQnJlYWsoY3R4OiBCcmVha1JlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIHJldHVybiBicmVha1NlbnRlbmNlKGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJSZXRyeShjdHg6IFJldHJ5UmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3Qgd2FpdCA9IGN0eC5kZWxheU1zID4gMCA/IGAgV2FpdGVkICR7Y3R4LmRlbGF5TXN9bXMgYmVmb3JlIHRoZSBuZXh0IGF0dGVtcHQuYCA6ICcnO1xuICAgIHJldHVybiBgW1JldHJ5XTogYXR0ZW1wdCAke2N0eC5hdHRlbXB0fSBvZiAke2N0eC5tYXhBdHRlbXB0c30gYXQgJHtjdHguc3RhZ2VOYW1lfSBmYWlsZWQgKCR7Y3R4Lm1lc3NhZ2V9KS4ke3dhaXR9YDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckVycm9yKGN0eDogRXJyb3JSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBsZXQgdGV4dCA9IGVycm9yU2VudGVuY2UoY3R4KTtcbiAgICBpZiAoY3R4LnZhbGlkYXRpb25Jc3N1ZXMpIHRleHQgKz0gdmFsaWRhdGlvblNlbnRlbmNlKGN0eC52YWxpZGF0aW9uSXNzdWVzKTtcbiAgICByZXR1cm4gYFtFcnJvcl06ICR7dGV4dH1gO1xuICB9XG59XG4iXX0=
798
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLFlBQVksRUFDWixhQUFhLEVBQ2IsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixrQkFBa0IsR0FDbkIsTUFBTSwyQkFBMkIsQ0FBQztBQWdFbkMsbUZBQW1GO0FBRW5GOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxPQUFPLHlCQUF5QjtJQUM1QixNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNuQixFQUFFLENBQVM7SUFDcEIsNkVBQTZFO0lBQzVELEtBQUssR0FBRyxJQUFJLGFBQWEsRUFBMEIsQ0FBQztJQUVyRTs7Ozs7T0FLRztJQUNLLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNyRCxzREFBc0Q7SUFDOUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ2xELDJGQUEyRjtJQUNuRixZQUFZLENBQXFCO0lBQ3pDLHlEQUF5RDtJQUNqRCxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDckQsNEVBQTRFO0lBQ3BFLGdCQUFnQixH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ciDigJQgSW5saW5lIG5hcnJhdGl2ZSBidWlsZGVyIHRoYXQgbWVyZ2VzIGZsb3cgKyBkYXRhIGR1cmluZyB0cmF2ZXJzYWwuXG4gKlxuICogQ29tcG9zZXMgYSBTZXF1ZW5jZVN0b3JlPENvbWJpbmVkTmFycmF0aXZlRW50cnk+IGZvciBkdWFsLWluZGV4ZWQgc3RvcmFnZSAob3JkZXJlZCBzZXF1ZW5jZVxuICogKyBPKDEpIHBlci1zdGVwIGxvb2t1cCBieSBydW50aW1lU3RhZ2VJZCkg4oCUIENvbnZlbnRpb24gMSwgb25lIHB1cnBvc2UgcGVyIHJlY29yZGVyLlxuICogSW1wbGVtZW50cyBgQ29tYmluZWRSZWNvcmRlcmAg4oCUIHRoZSBsaWJyYXJ5J3MgZmlyc3QtY2xhc3MgYWJzdHJhY3Rpb24gZm9yIG9ic2VydmVycyB0aGF0IHNwYW5cbiAqIGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cgc3RyZWFtcy5cbiAqXG4gKiBFdmVudCBvcmRlcmluZyBndWFyYW50ZWVzIHRoaXMgd29ya3M6XG4gKiAgIDEuIFNjb3BlIGV2ZW50cyAob25SZWFkLCBvbldyaXRlKSBmaXJlIERVUklORyBzdGFnZSBleGVjdXRpb25cbiAqICAgMi4gRmxvdyBldmVudHMgKG9uU3RhZ2VFeGVjdXRlZCwgb25EZWNpc2lvbikgZmlyZSBBRlRFUiBzdGFnZSBleGVjdXRpb25cbiAqICAgMy4gQm90aCBjYXJyeSB0aGUgc2FtZSBgc3RhZ2VOYW1lYCDigJQgbm8gbWF0Y2hpbmcgYW1iaWd1aXR5XG4gKlxuICogU28gd2UgYnVmZmVyIHNjb3BlIG9wcyBwZXItc3RhZ2UsIHRoZW4gd2hlbiB0aGUgZmxvdyBldmVudCBhcnJpdmVzLFxuICogZW1pdCB0aGUgc3RhZ2UgZW50cnkgKyBmbHVzaCB0aGUgYnVmZmVyZWQgb3BzIGluIG9uZSBwYXNzLlxuICovXG5cbmltcG9ydCB7IHN1bW1hcml6ZVZhbHVlIH0gZnJvbSAnLi4vLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBpc0Zsb3dFdmVudCB9IGZyb20gJy4uLy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0RXZlbnQgfSBmcm9tICcuLi8uLi9yZWNvcmRlci9FbWl0UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgU2VxdWVuY2VTdG9yZSB9IGZyb20gJy4uLy4uL3JlY29yZGVyL1NlcXVlbmNlU3RvcmUuanMnO1xuaW1wb3J0IHR5cGUgeyBFcnJvckV2ZW50LCBQYXVzZUV2ZW50LCBSZWFkRXZlbnQsIFJlc3VtZUV2ZW50LCBXcml0ZUV2ZW50IH0gZnJvbSAnLi4vLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRleHQgfSBmcm9tICcuL2Zvcm1hdHRpbmcvcmVzb2x2ZVRleHQuanMnO1xuaW1wb3J0IHtcbiAgYXR0ZW1wdFNlbnRlbmNlLFxuICBicmVha1NlbnRlbmNlLFxuICBkZWNpc2lvblNlbnRlbmNlLFxuICBlcnJvclNlbnRlbmNlLFxuICBmb3JrU2VudGVuY2UsXG4gIGlzQXR0ZW1wdFRvbGQsXG4gIGxvb3BTZW50ZW5jZSxcbiAgbmV4dFN0YWdlU2VudGVuY2UsXG4gIHBhdXNlU2VudGVuY2UsXG4gIHJlc3VtZVNlbnRlbmNlLFxuICB2YWxpZGF0aW9uRGV0YWlscyxcbiAgdmFsaWRhdGlvblNlbnRlbmNlLFxufSBmcm9tICcuL2Zvcm1hdHRpbmcvc2VudGVuY2VzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdFJlbmRlckNvbnRleHQsXG4gIEJyZWFrUmVuZGVyQ29udGV4dCxcbiAgQ29tYmluZWROYXJyYXRpdmVFbnRyeSxcbiAgRGVjaXNpb25SZW5kZXJDb250ZXh0LFxuICBFbWl0UmVuZGVyQ29udGV4dCxcbiAgRXJyb3JSZW5kZXJDb250ZXh0LFxuICBGb3JrUmVuZGVyQ29udGV4dCxcbiAgTG9vcFJlbmRlckNvbnRleHQsXG4gIE5hcnJhdGl2ZUZvcm1hdHRlcixcbiAgT3BSZW5kZXJDb250ZXh0LFxuICBTZWxlY3RlZFJlbmRlckNvbnRleHQsXG4gIFN0YWdlUmVuZGVyQ29udGV4dCxcbiAgU3ViZmxvd1JlbmRlckNvbnRleHQsXG59IGZyb20gJy4vbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGbG93QXR0ZW1wdEV2ZW50LFxuICBGbG93QnJlYWtFdmVudCxcbiAgRmxvd0RlY2lzaW9uRXZlbnQsXG4gIEZsb3dFcnJvckV2ZW50LFxuICBGbG93Rm9ya0V2ZW50LFxuICBGbG93TG9vcEV2ZW50LFxuICBGbG93UGF1c2VFdmVudCxcbiAgRmxvd1Jlc3VtZUV2ZW50LFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG4gIEZsb3dTdWJmbG93RXZlbnQsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmludGVyZmFjZSBCdWZmZXJlZE9wIHtcbiAgdHlwZTogJ3JlYWQnIHwgJ3dyaXRlJyB8ICdlbWl0JyB8ICdhdHRlbXB0JztcbiAgLyoqIEZvciByZWFkL3dyaXRlOiBzY29wZSBrZXkuIEZvciBlbWl0OiB0aGUgZXZlbnQgbmFtZS4gRm9yIGF0dGVtcHQ6IHRoZSBzdGFnZSBuYW1lLiAqL1xuICBrZXk6IHN0cmluZztcbiAgcmF3VmFsdWU6IHVua25vd247XG4gIG9wZXJhdGlvbj86ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJztcbiAgc3RlcE51bWJlcjogbnVtYmVyO1xuICAvKiogT25seSBzZXQgZm9yIHR5cGU9J2VtaXQnIOKAlCBjYXJyaWVzIHRoZSBmdWxsIEVtaXRFdmVudCBmb3IgcmVuZGVyaW5nLiAqL1xuICBlbWl0RXZlbnQ/OiBFbWl0RXZlbnQ7XG4gIC8qKlxuICAgKiBPbmx5IHNldCBmb3IgdHlwZT0nYXR0ZW1wdCcg4oCUIHRoZSBhdHRlbXB0J3MgZmFjdHMsIGJ1ZmZlcmVkIHJhdGhlciB0aGFuXG4gICAqIHB1c2hlZCBzdHJhaWdodCB0byB0aGUgc3RvcmUgc28gdGhlIGxpbmUgbGFuZHMgSU4gT1JERVIgYmV0d2VlbiB0aGF0XG4gICAqIGF0dGVtcHQncyBvcHMgYW5kIHRoZSBuZXh0IGF0dGVtcHQncyBvcHMuIChBdHRlbXB0IGV2ZW50cyBhcnJpdmUgb24gdGhlXG4gICAqIGZsb3cgY2hhbm5lbCBEVVJJTkcgdGhlIHN0YWdlLCB1bmxpa2UgZXZlcnkgb3RoZXIgZmxvdyBldmVudCwgd2hpY2hcbiAgICogYXJyaXZlcyBhZnRlciBpdCDigJQgcHVzaGluZyBkaXJlY3RseSB3b3VsZCBwbGFjZSB0aGUgbGluZSBiZWZvcmUgaXRzIG93blxuICAgKiBzdGFnZSBoZWFkZXIuKVxuICAgKi9cbiAgYXR0ZW1wdD86IEF0dGVtcHRSZW5kZXJDb250ZXh0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zIHtcbiAgaW5jbHVkZVN0ZXBOdW1iZXJzPzogYm9vbGVhbjtcbiAgaW5jbHVkZVZhbHVlcz86IGJvb2xlYW47XG4gIG1heFZhbHVlTGVuZ3RoPzogbnVtYmVyO1xuICAvKiogQ3VzdG9tIHZhbHVlIGZvcm1hdHRlci4gQ2FsbGVkIGF0IHJlbmRlciB0aW1lIChmbHVzaE9wcyksIG5vdCBjYXB0dXJlIHRpbWUuXG4gICAqICBSZWNlaXZlcyB0aGUgcmF3IHZhbHVlIGFuZCBtYXhWYWx1ZUxlbmd0aC4gRGVmYXVsdHMgdG8gc3VtbWFyaXplVmFsdWUoKS4gKi9cbiAgZm9ybWF0VmFsdWU/OiAodmFsdWU6IHVua25vd24sIG1heExlbjogbnVtYmVyKSA9PiBzdHJpbmc7XG4gIC8qKiBQbHVnZ2FibGUgcmVuZGVyZXIgZm9yIGN1c3RvbWl6aW5nIG5hcnJhdGl2ZSBvdXRwdXQuIFVuaW1wbGVtZW50ZWQgbWV0aG9kc1xuICAgKiAgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IEVuZ2xpc2ggcmVuZGVyZXIuIFNlZSBOYXJyYXRpdmVGb3JtYXR0ZXIgZG9jcy4gKi9cbiAgcmVuZGVyZXI/OiBOYXJyYXRpdmVGb3JtYXR0ZXI7XG59XG5cbi8vIOKUgOKUgCBTY29wZVJlY29yZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEltcGxlbWVudHMgYENvbWJpbmVkUmVjb3JkZXJgIOKAlCB0aGUgbGlicmFyeSdzIGZpcnN0LWNsYXNzIGFic3RyYWN0aW9uIGZvclxuICogb2JzZXJ2ZXJzIHRoYXQgc3BhbiBib3RoIGRhdGEtZmxvdyAoYFNjb3BlUmVjb3JkZXJgKSBhbmQgY29udHJvbC1mbG93XG4gKiAoYEZsb3dSZWNvcmRlcmApIHN0cmVhbXMuIE9uZSBgaWRgLCByb3V0ZWQgdG8gYm90aCBjaGFubmVscyB2aWFcbiAqIGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKC4uLilgIChvciBlcXVpdmFsZW50bHkgdmlhXG4gKiBgZXhlY3V0b3IuZW5hYmxlTmFycmF0aXZlKC4uLilgIHdoaWNoIGF1dG8tY3JlYXRlcyBhbiBpbnN0YW5jZSkuXG4gKlxuICogRm9yIHNoYXJlZC1tZXRob2QtbmFtZSBldmVudHMgKGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgKSB0aGVcbiAqIGhhbmRsZXIgYWNjZXB0cyB0aGUgdW5pb24gcGF5bG9hZCB0eXBlOyB3ZSBkaXNjcmltaW5hdGUgdmlhIGBpc0Zsb3dFdmVudGAuXG4gKiBTY29wZSB2YXJpYW50cyBvZiB0aGVzZSBldmVudHMgYXJlIGRlbGliZXJhdGVseSBpZ25vcmVkIGhlcmUg4oCUIHRoZVxuICogbmFycmF0aXZlIG9ubHkgc3VyZmFjZXMgY29udHJvbC1mbG93IGxpZmVjeWNsZSBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGltcGxlbWVudHMgQ29tYmluZWRSZWNvcmRlciB7XG4gIHByaXZhdGUgc3RhdGljIF9jb3VudGVyID0gMDtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqIER1YWwtaW5kZXhlZCBvcmRlcmVkIHN0b3JhZ2UgKENvbnZlbnRpb24gMSDigJQgY29tcG9zZWQsIG5vdCBpbmhlcml0ZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gbmV3IFNlcXVlbmNlU3RvcmU8Q29tYmluZWROYXJyYXRpdmVFbnRyeT4oKTtcblxuICAvKipcbiAgICogUGVuZGluZyBzY29wZSBvcHMga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuIEZsdXNoZWQgaW4gb25TdGFnZUV4ZWN1dGVkL29uRGVjaXNpb24uXG4gICAqXG4gICAqIEtleWluZyBieSBydW50aW1lU3RhZ2VJZCAobm90IHN0YWdlTmFtZSkgZW5zdXJlcyBjb3JyZWN0bmVzcyB3aGVuIHBhcmFsbGVsIGZvcmtcbiAgICogYnJhbmNoZXMgY29udGFpbiBzdGFnZXMgd2l0aCB0aGUgc2FtZSBuYW1lIOKAlCBlYWNoIGV4ZWN1dGlvbiBzdGVwIGhhcyBhIHVuaXF1ZSBJRC5cbiAgICovXG4gIHByaXZhdGUgcGVuZGluZ09wcyA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXJlZE9wW10+KCk7XG4gIC8qKiBQZXItc3ViZmxvdyBzdGFnZSBjb3VudGVycy4gS2V5ICcnID0gcm9vdCBmbG93LiAqL1xuICBwcml2YXRlIHN0YWdlQ291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogVGhlIHN0YWdlIGBvblJlc3VtZWAganVzdCBuYXJyYXRlZCDigJQgaXRzIGhlYWRlciBtdXN0IG5vdCBhbm5vdW5jZSB0aGUgYXJyaXZhbCBhZ2Fpbi4gKi9cbiAgcHJpdmF0ZSByZXN1bWVkU3RhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFBlci1zdWJmbG93IGZpcnN0LXN0YWdlIGZsYWdzLiBLZXkgJycgPSByb290IGZsb3cuICovXG4gIHByaXZhdGUgZmlyc3RTdGFnZUZsYWdzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gIC8qKiBWaXNpdCBjb3VudCBwZXIgc3RhZ2VJZCDigJQgZGV0ZWN0cyBsb29wIGl0ZXJhdGlvbnMgKGNvdW50ID4gMSA9IGxvb3ApLiAqL1xuICBwcml2YXRlIHN0YWdlVmlzaXRDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHByaXZhdGUgaW5jbHVkZVN0ZXBOdW1iZXJzOiBib29sZWFuO1xuICBwcml2YXRlIGluY2x1ZGVWYWx1ZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgbWF4VmFsdWVMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZTogKHZhbHVlOiB1bmtub3duLCBtYXhMZW46IG51bWJlcikgPT4gc3RyaW5nO1xuICBwcml2YXRlIHJlbmRlcmVyPzogTmFycmF0aXZlRm9ybWF0dGVyO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyAmIHsgaWQ/OiBzdHJpbmcgfSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCA/PyBgY29tYmluZWQtbmFycmF0aXZlLSR7KytDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLl9jb3VudGVyfWA7XG4gICAgdGhpcy5pbmNsdWRlU3RlcE51bWJlcnMgPSBvcHRpb25zPy5pbmNsdWRlU3RlcE51bWJlcnMgPz8gdHJ1ZTtcbiAgICB0aGlzLmluY2x1ZGVWYWx1ZXMgPSBvcHRpb25zPy5pbmNsdWRlVmFsdWVzID8/IHRydWU7XG4gICAgdGhpcy5tYXhWYWx1ZUxlbmd0aCA9IG9wdGlvbnM/Lm1heFZhbHVlTGVuZ3RoID8/IDgwO1xuICAgIHRoaXMuZm9ybWF0VmFsdWUgPSBvcHRpb25zPy5mb3JtYXRWYWx1ZSA/PyBzdW1tYXJpemVWYWx1ZTtcbiAgICB0aGlzLnJlbmRlcmVyID0gb3B0aW9ucz8ucmVuZGVyZXI7XG4gIH1cblxuICAvLyDilIDilIAgU2NvcGUgY2hhbm5lbCAoZmlyZXMgZmlyc3QsIGR1cmluZyBzdGFnZSBleGVjdXRpb24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uUmVhZChldmVudDogUmVhZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFldmVudC5rZXkpIHJldHVybjtcbiAgICB0aGlzLmJ1ZmZlck9wKGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICB0eXBlOiAncmVhZCcsXG4gICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgIHJhd1ZhbHVlOiBldmVudC52YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uV3JpdGUoZXZlbnQ6IFdyaXRlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlck9wKGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICB0eXBlOiAnd3JpdGUnLFxuICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICByYXdWYWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICBvcGVyYXRpb246IGV2ZW50Lm9wZXJhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93IGNoYW5uZWwgKGZpcmVzIGFmdGVyIHN0YWdlIGV4ZWN1dGlvbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25TdGFnZUV4ZWN1dGVkKGV2ZW50OiBGbG93U3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIC8vIE5vbi1saW5lYXIga2luZHMgZ2V0IHRoZWlyIG5hcnJhdGl2ZSBlbnRyaWVzIChhbmQgb3BzIGZsdXNoKVxuICAgIC8vIGZyb20gYG9uRGVjaXNpb25gIC8gYG9uRm9ya2AgLyBgb25TZWxlY3RlZGAgLyBgb25TdWJmbG93RW50cnlgLlxuICAgIC8vIFNraXAgdGhlbSBoZXJlIHNvIGVhY2ggc3RhZ2UgaGFzIGV4YWN0bHkgb25lIG5hcnJhdGl2ZSBlbnRyeS5cbiAgICBpZiAoZXZlbnQuc3RhZ2VUeXBlICE9PSAnbGluZWFyJykgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQ7XG4gICAgY29uc3QgcnVudGltZVN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzZktleSA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCA/PyAnJztcbiAgICBjb25zdCBzdGFnZU51bSA9IHRoaXMuaW5jcmVtZW50U3RhZ2VDb3VudGVyKHNmS2V5KTtcbiAgICBjb25zdCBpc0ZpcnN0ID0gdGhpcy5jb25zdW1lRmlyc3RTdGFnZUZsYWcoc2ZLZXkpO1xuXG4gICAgLy8gVHJhY2sgdmlzaXQgY291bnQgcGVyIHN0YWdlSWQgdG8gZGV0ZWN0IGxvb3AgaXRlcmF0aW9uc1xuICAgIGNvbnN0IHZpc2l0S2V5ID0gc3RhZ2VJZCA/PyBldmVudC5zdGFnZU5hbWU7XG4gICAgY29uc3QgdmlzaXRDb3VudCA9ICh0aGlzLnN0YWdlVmlzaXRDb3VudHMuZ2V0KHZpc2l0S2V5KSA/PyAwKSArIDE7XG4gICAgdGhpcy5zdGFnZVZpc2l0Q291bnRzLnNldCh2aXNpdEtleSwgdmlzaXRDb3VudCk7XG5cbiAgICBjb25zdCBjdHg6IFN0YWdlUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VOdW1iZXI6IHN0YWdlTnVtLFxuICAgICAgaXNGaXJzdCxcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICAgIGxvb3BJdGVyYXRpb246IHZpc2l0Q291bnQgPiAxID8gdmlzaXRDb3VudCAtIDEgOiB1bmRlZmluZWQsXG4gICAgICAuLi4odGhpcy5jb25zdW1lUmVzdW1lZChldmVudC5zdGFnZU5hbWUpICYmIHsgcmVzdW1lZDogdHJ1ZSB9KSxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTdGFnZT8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU3RhZ2UoY3R4KTtcblxuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogc2ZJZCxcbiAgICB9KTtcbiAgICB0aGlzLmZsdXNoT3BzKHJ1bnRpbWVTdGFnZUlkLCBzZklkLCBzdGFnZUlkLCBldmVudC5zdGFnZU5hbWUpO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZDtcbiAgICBjb25zdCBydW50aW1lU3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuXG4gICAgLy8gRW1pdCB0aGUgZGVjaWRlciBzdGFnZSBlbnRyeS5cbiAgICAvLyBQcm9wb3NhbCAjMDAzIGFsc28gZmlyZXMgYG9uU3RhZ2VFeGVjdXRlZChzdGFnZVR5cGU6ICdkZWNpZGVyJylgXG4gICAgLy8gQUZURVIgdGhpcyBldmVudCwgYnV0IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgZ2F0ZXMgdGhhdFxuICAgIC8vIGhhbmRsZXIgdG8gTElORUFSLW9ubHkgc28gdGhpcyBzdGF5cyB0aGUgc2luZ2xlIGVtaXNzaW9uIHNpdGVcbiAgICAvLyBmb3IgdGhlIGRlY2lkZXIncyBzdGFnZSBlbnRyeSArIG9wcyBmbHVzaC4gS2VlcHMgbmFycmF0aXZlXG4gICAgLy8gb3V0cHV0IGJ5dGUtc3RhYmxlIGFjcm9zcyB0aGUgdjYgdHJhbnNpdGlvbi5cbiAgICBjb25zdCBzZktleSA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCA/PyAnJztcbiAgICBjb25zdCBzdGFnZU51bSA9IHRoaXMuaW5jcmVtZW50U3RhZ2VDb3VudGVyKHNmS2V5KTtcbiAgICBjb25zdCBpc0ZpcnN0ID0gdGhpcy5jb25zdW1lRmlyc3RTdGFnZUZsYWcoc2ZLZXkpO1xuXG4gICAgY29uc3Qgc3RhZ2VDdHg6IFN0YWdlUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuZGVjaWRlcixcbiAgICAgIHN0YWdlTnVtYmVyOiBzdGFnZU51bSxcbiAgICAgIGlzRmlyc3QsXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICAuLi4odGhpcy5jb25zdW1lUmVzdW1lZChldmVudC5kZWNpZGVyKSAmJiB7IHJlc3VtZWQ6IHRydWUgfSksXG4gICAgfTtcbiAgICBjb25zdCBzdGFnZVRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTdGFnZT8uKHN0YWdlQ3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTdGFnZShzdGFnZUN0eCk7XG5cbiAgICB0aGlzLnN0b3JlLnB1c2goe1xuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIHRleHQ6IHN0YWdlVGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgICAgc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5mbHVzaE9wcyhydW50aW1lU3RhZ2VJZCwgZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLCBzdGFnZUlkLCBldmVudC5kZWNpZGVyKTtcblxuICAgIC8vIEVtaXQgdGhlIGNvbmRpdGlvbiBlbnRyeSBhcyBhIG5lc3RlZCBzdWItaXRlbSAoZGVwdGggMSkgb2YgdGhlIHN0YWdlIGFib3ZlLlxuICAgIGNvbnN0IGRlY2lzaW9uQ3R4OiBEZWNpc2lvblJlbmRlckNvbnRleHQgPSB7XG4gICAgICBkZWNpZGVyOiBldmVudC5kZWNpZGVyLFxuICAgICAgY2hvc2VuOiBldmVudC5jaG9zZW4sXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICByYXRpb25hbGU6IGV2ZW50LnJhdGlvbmFsZSxcbiAgICAgIGV2aWRlbmNlOiBldmVudC5ldmlkZW5jZSxcbiAgICB9O1xuICAgIGNvbnN0IGNvbmRpdGlvblRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJEZWNpc2lvbj8uKGRlY2lzaW9uQ3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJEZWNpc2lvbihkZWNpc2lvbkN0eCk7XG4gICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdjb25kaXRpb24nLFxuICAgICAgdGV4dDogY29uZGl0aW9uVGV4dCxcbiAgICAgIGRlcHRoOiAxLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgICAgc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgLy8gTm8tb3AuIG9uU3RhZ2VFeGVjdXRlZCBhbHJlYWR5IGhhcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXh0IHN0YWdlLlxuICB9XG5cbiAgb25Gb3JrKGV2ZW50OiBGbG93Rm9ya0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4OiBGb3JrUmVuZGVyQ29udGV4dCA9IHsgY2hpbGRyZW46IGV2ZW50LmNoaWxkcmVuIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckZvcms/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckZvcmsoY3R4KTtcbiAgICB0aGlzLnN0b3JlLnB1c2goe1xuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25TZWxlY3RlZChldmVudDogRmxvd1NlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IFNlbGVjdGVkUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHNlbGVjdGVkOiBldmVudC5zZWxlY3RlZCxcbiAgICAgIHRvdGFsOiBldmVudC50b3RhbCxcbiAgICAgIGV2aWRlbmNlOiBldmVudC5ldmlkZW5jZSxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTZWxlY3RlZD8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU2VsZWN0ZWQoY3R4KTtcbiAgICB0aGlzLnN0b3JlLnB1c2goe1xuICAgICAgdHlwZTogJ3NlbGVjdG9yJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2ZLZXkgPSBldmVudC5zdWJmbG93SWQgPz8gJyc7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXJzLmRlbGV0ZShzZktleSk7XG4gICAgdGhpcy5maXJzdFN0YWdlRmxhZ3MuZGVsZXRlKHNmS2V5KTtcblxuICAgIGNvbnN0IGN0eDogU3ViZmxvd1JlbmRlckNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgZGlyZWN0aW9uOiAnZW50cnknLFxuICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgICAgbWFwcGVkSW5wdXQ6IGV2ZW50Lm1hcHBlZElucHV0LFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclN1YmZsb3c/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlclN1YmZsb3coY3R4KTtcbiAgICBjb25zdCByaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdzdWJmbG93JyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHNpZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiByaWQsXG4gICAgICBzdWJmbG93SWQ6IHNmSWQsXG4gICAgICBkaXJlY3Rpb246ICdlbnRyeScsXG4gICAgfSk7XG4gICAgLy8gRW1pdCBwZXIta2V5IHN0ZXAgZW50cmllcyBmb3IgbWFwcGVkIGlucHV0cy5cbiAgICAvL1xuICAgIC8vIFJvdXRlIEVBQ0gga2V5IHRocm91Z2ggdGhlIGNvbnN1bWVyJ3MgYHJlbmRlcmVyLnJlbmRlck9wYCBob29rIGJlZm9yZVxuICAgIC8vIGZhbGxpbmcgYmFjayB0byB0aGUgaGFyZGNvZGVkIGBJbnB1dDogJHtrZXl9ID0gJHt2YWx1ZVN1bW1hcnl9YFxuICAgIC8vIHRlbXBsYXRlLiBXaXRob3V0IHRoaXMgcm91dGluZywgYSBjb25zdW1lciB0aGF0IHByb3ZpZGVkIGFcbiAgICAvLyBkb21haW4tYXdhcmUgYHJlbmRlcmVyLnJlbmRlck9wYCAodG8gcmVuZGVyIGUuZy4gYHBhcnNlZFJlc3BvbnNlYFxuICAgIC8vIG9iamVjdHMgc2VtYW50aWNhbGx5KSB3b3VsZCBzZWUgYmVhdXRpZnVsIG91dHB1dCBmb3Igc2NvcGUgd3JpdGVzXG4gICAgLy8gYnV0IGdldCB0aGUgZ2VuZXJpYyBrZXktbGlzdCBmYWxsYmFjayBmb3Igc3ViZmxvdyBpbnB1dHMg4oCUIHRoZVxuICAgIC8vIGxpYnJhcnkncyBcImNvbWJpbmVkIG5hcnJhdGl2ZVwiIHByb21pc2UgKG9uZSByZW5kZXJlciBjb250cm9scyB0aGVcbiAgICAvLyB3aG9sZSBuYXJyYXRpdmUpIHdvdWxkIHNpbGVudGx5IGJyZWFrLiBXZSBob25vdXIgaXQgaGVyZS5cbiAgICAvL1xuICAgIC8vIFRoZSBPcFJlbmRlckNvbnRleHQgaXMgYnVpbHQgd2l0aCBgdHlwZTogJ3dyaXRlJ2AgYmVjYXVzZSBzZW1hbnRpY2FsbHlcbiAgICAvLyB0aGUgc3ViZmxvdydzIGluaXRpYWwgc2NvcGUgSVMgYmVpbmcgd3JpdHRlbiB2aWEgdGhlIHBhcmVudCdzXG4gICAgLy8gaW5wdXRNYXBwZXIuIGBvcGVyYXRpb246ICdzZXQnYCBsaWtld2lzZSDigJQgdGhpcyBpcyB0aGUgc3ViZmxvdydzXG4gICAgLy8gZmlyc3Qgc2lnaHQgb2YgdGhlIGtleS5cbiAgICAvL1xuICAgIC8vIFZhbHVlcyBzaG93biB3aGVuIGluY2x1ZGVWYWx1ZXM9dHJ1ZS4gYGV2ZW50Lm1hcHBlZElucHV0YCBpcyBhbHJlYWR5XG4gICAgLy8gdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIHNlZWQg4oCUIGBTdWJmbG93RXhlY3V0b3JgIHNjcnVicyBpdCB1bmRlciB0aGVcbiAgICAvLyBydW4ncyByZWRhY3Rpb24gcnVsZSBiZWZvcmUgcmFpc2luZyB0aGUgZXZlbnQgKDkuMTkuMCksIHNvIGEgcmVkYWN0ZWRcbiAgICAvLyBrZXkgYXJyaXZlcyBhcyAnW1JFREFDVEVEXScgYW5kIGEgZmllbGQtbGV2ZWwga2V5IGFzIGEgc2NydWJiZWQgY2xvbmUuXG4gICAgaWYgKGV2ZW50Lm1hcHBlZElucHV0ICYmIE9iamVjdC5rZXlzKGV2ZW50Lm1hcHBlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgc3RlcE51bWJlciA9IDA7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhldmVudC5tYXBwZWRJbnB1dCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWVTdW1tYXJ5ID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSwgdGhpcy5tYXhWYWx1ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IG9wQ3R4OiBPcFJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgICAgdHlwZTogJ3dyaXRlJyxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgcmF3VmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHZhbHVlU3VtbWFyeSxcbiAgICAgICAgICBvcGVyYXRpb246ICdzZXQnLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6ICsrc3RlcE51bWJlcixcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0ZXh0ID0gcmVzb2x2ZVRleHQodGhpcy5yZW5kZXJlcj8ucmVuZGVyT3A/LihvcEN0eCksICgpID0+XG4gICAgICAgICAgdGhpcy5pbmNsdWRlVmFsdWVzID8gYElucHV0OiAke2tleX0gPSAke3ZhbHVlU3VtbWFyeX1gIDogYElucHV0OiAke2tleX1gLFxuICAgICAgICApO1xuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnc3RlcCcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICBzdGFnZU5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICAgICAgc3RhZ2VJZDogc2lkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiByaWQsXG4gICAgICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICByYXdWYWx1ZTogdmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCByaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgLy8gTk9URTogb3V0cHV0IHN0YXRlIGlzIE5PVCBlbWl0dGVkIGFzIHN0ZXAgZW50cmllcyDigJQgdGhlIHN1YmZsb3cncyBvd25cbiAgICAvLyBzdGFnZXMgYWxyZWFkeSBuYXJyYXRlZCBlYWNoIHdyaXRlLCBzbyB0aGUgZXhpdCBoZWFkZXIgaXMgc3VmZmljaWVudDtcbiAgICAvLyBkcmlsbCBpbnRvIHRoZSBzdWJmbG93IGZvciBkZXRhaWxzLiBTaW5jZSA5LjIwLjAgYG91dHB1dFN0YXRlYCBpcyB0aGVcbiAgICAvLyBzdWJmbG93J3MgU0VSVkVEIHN0YXRlIChpdHMgcmVkYWN0ZWQgbWlycm9yIHVuZGVyIGEgcG9saWN5KSwgc28gYVxuICAgIC8vIHJlbmRlcmVyIHRoYXQgZG9lcyBzaG93IGl0IHNob3dzIHdoYXQgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYFxuICAgIC8vIHNlcnZlcywgbmV2ZXIgdGhlIHJhdyBoZWFwLlxuICAgIGNvbnN0IGN0eDogU3ViZmxvd1JlbmRlckNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgZGlyZWN0aW9uOiAnZXhpdCcsXG4gICAgICBvdXRwdXRTdGF0ZTogZXZlbnQub3V0cHV0U3RhdGUsXG4gICAgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyU3ViZmxvdz8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU3ViZmxvdyhjdHgpO1xuICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICB0eXBlOiAnc3ViZmxvdycsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBzdGFnZUlkOiBzaWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogcmlkLFxuICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgICAgZGlyZWN0aW9uOiAnZXhpdCcsXG4gICAgfSk7XG4gIH1cblxuICBvbkxvb3AoZXZlbnQ6IEZsb3dMb29wRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IExvb3BSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICBpdGVyYXRpb246IGV2ZW50Lml0ZXJhdGlvbixcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJMb29wPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJMb29wKGN0eCk7XG4gICAgdGhpcy5zdG9yZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdsb29wJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQnJlYWsoZXZlbnQ6IEZsb3dCcmVha0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4OiBCcmVha1JlbmRlckNvbnRleHQgPSB7IHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckJyZWFrPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJCcmVhayhjdHgpO1xuICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICB0eXBlOiAnYnJlYWsnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT25lIGF0dGVtcHQgb2YgYSByZXRyaWVkIHN0YWdlICgxMC4xKS4gQlVGRkVSRUQsIG5vdCBwdXNoZWQ6IGF0dGVtcHRcbiAgICogZXZlbnRzIGZpcmUgRFVSSU5HIGEgc3RhZ2UsIHNvIHB1c2hpbmcgb25lIHN0cmFpZ2h0IHRvIHRoZSBzdG9yZSB3b3VsZFxuICAgKiBwbGFjZSB0aGUgbGluZSBiZWZvcmUgaXRzIG93biBzdGFnZSBoZWFkZXIuIEJ1ZmZlcmVkIGFsb25nc2lkZSB0aGUgcmVhZHNcbiAgICogYW5kIHdyaXRlcywgaXQgZmx1c2hlcyBpbiB0cnVlIGV4ZWN1dGlvbiBvcmRlcjpcbiAgICpcbiAgICogICAgIFN0YWdlIDM6IEZldGNoIHVzZXJcbiAgICogICAgICAgU3RlcCAxOiBSZWFkIHVzZXJJZCA9IFwidTFcIlxuICAgKiAgICAgICBBdHRlbXB0IDEgb2YgMyBhdCBGZXRjaCB1c2VyIGZhaWxlZCBpbiAxMm1zICjigKYpLCByZXRyeWluZyBpbiAxMDBtcy5cbiAgICogICAgICAgU3RlcCAzOiBSZWFkIHVzZXJJZCA9IFwidTFcIlxuICAgKiAgICAgICBTdGVwIDQ6IFdyaXRlIHVzZXIgPSB7IOKApiB9XG4gICAqICAgICAgIEF0dGVtcHQgMiBvZiAzIGF0IEZldGNoIHVzZXIgc3VjY2VlZGVkIGluIDltcy5cbiAgICpcbiAgICogVGhpcyBsaW5lIHJlcGxhY2VzIHRoZSA5LjE1IGBbUmV0cnldYCBsaW5lOiBpdCBhbHJlYWR5IHNheXMgXCJyZXRyeWluZ1wiLFxuICAgKiBzbyBgb25TdGFnZVJldHJ5YCBpcyBub3QgbmFycmF0ZWQgKHR3byBsaW5lcyBmb3Igb25lIGZhY3QpLlxuICAgKi9cbiAgb25BdHRlbXB0KGV2ZW50OiBGbG93QXR0ZW1wdEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcnVudGltZVN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAoIXJ1bnRpbWVTdGFnZUlkIHx8ICFpc0F0dGVtcHRUb2xkKGV2ZW50LnJlY29yZCkpIHJldHVybjtcbiAgICB0aGlzLmJ1ZmZlck9wKHJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICB0eXBlOiAnYXR0ZW1wdCcsXG4gICAgICBrZXk6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHJhd1ZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBhdHRlbXB0OiB7IHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLCByZWNvcmQ6IGV2ZW50LnJlY29yZCB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25QYXVzZShldmVudDogUGF1c2VFdmVudCB8IEZsb3dQYXVzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gQm90aCBjaGFubmVscyBmaXJlIG9uUGF1c2Ugd2l0aCBkaWZmZXJlbnQgcGF5bG9hZCBzaGFwZXMuIE5hcnJhdGl2ZSBvbmx5XG4gICAgLy8gc3VyZmFjZXMgdGhlIGNvbnRyb2wtZmxvdyB2YXJpYW50ICh3aGljaCBoYXMgc3RhZ2VOYW1lL3N0YWdlSWQpLiBEYXRhXG4gICAgLy8gY2hhbm5lbCdzIFBhdXNlRXZlbnQgaXMgaWdub3JlZCB0byBhdm9pZCBkdXBsaWNhdGUgZW50cmllcy5cbiAgICBpZiAoIWlzRmxvd0V2ZW50KGV2ZW50KSkgcmV0dXJuO1xuICAgIGlmICghZXZlbnQuc3RhZ2VOYW1lIHx8ICFldmVudC5zdGFnZUlkKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IHBhdXNlU2VudGVuY2UoZXZlbnQpO1xuICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICB0eXBlOiAncGF1c2UnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkID8/IGV2ZW50LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uUmVzdW1lKGV2ZW50OiBSZXN1bWVFdmVudCB8IEZsb3dSZXN1bWVFdmVudCk6IHZvaWQge1xuICAgIC8vIFNhbWUgaXNGbG93RXZlbnQgZGlzY3JpbWluYW50IGFzIG9uUGF1c2Ug4oCUIGlnbm9yZSBzY29wZSBSZXN1bWVFdmVudC5cbiAgICBpZiAoIWlzRmxvd0V2ZW50KGV2ZW50KSkgcmV0dXJuO1xuICAgIGlmICghZXZlbnQuc3RhZ2VOYW1lIHx8ICFldmVudC5zdGFnZUlkKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IHJlc3VtZVNlbnRlbmNlKGV2ZW50KTtcbiAgICB0aGlzLnJlc3VtZWRTdGFnZSA9IGV2ZW50LnN0YWdlTmFtZTtcbiAgICB0aGlzLnN0b3JlLnB1c2goe1xuICAgICAgdHlwZTogJ3Jlc3VtZScsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQgPz8gZXZlbnQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25FcnJvcihldmVudDogRXJyb3JFdmVudCB8IEZsb3dFcnJvckV2ZW50KTogdm9pZCB7XG4gICAgLy8gTmFycmF0aXZlIG9ubHkgc3VyZmFjZXMgdGhlIGNvbnRyb2wtZmxvdyB2YXJpYW50IG9mIGVycm9ycyAoaGFzXG4gICAgLy8gc3RhZ2VOYW1lICsgbWVzc2FnZSkuIFNjb3BlLWxldmVsIEVycm9yRXZlbnQgaXMgY2FwdHVyZWQgZWxzZXdoZXJlLlxuICAgIGlmICghaXNGbG93RXZlbnQoZXZlbnQpKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBldmVudC5tZXNzYWdlICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbGV0IHZhbGlkYXRpb25Jc3N1ZXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXZlbnQuc3RydWN0dXJlZEVycm9yPy5pc3N1ZXM/Lmxlbmd0aCkge1xuICAgICAgdmFsaWRhdGlvbklzc3VlcyA9IHZhbGlkYXRpb25EZXRhaWxzKGV2ZW50LnN0cnVjdHVyZWRFcnJvci5pc3N1ZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGN0eDogRXJyb3JSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBtZXNzYWdlOiBldmVudC5tZXNzYWdlLFxuICAgICAgdmFsaWRhdGlvbklzc3VlcyxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJFcnJvcj8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyRXJyb3IoY3R4KTtcbiAgICB0aGlzLnN0b3JlLnB1c2goe1xuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICAgIHRoaXMuZmx1c2hBdHRlbXB0cyhldmVudC50cmF2ZXJzYWxDb250ZXh0LCBldmVudC5zdGFnZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmFpbGVkIHN0YWdlIGhhcyBubyBoZWFkZXIgKGl0cyBgW0Vycm9yXWAgbGluZSBzdGFuZHMgZm9yIGl0KSBhbmQgaXRzXG4gICAqIGJ1ZmZlcmVkIHJlYWRzIGFuZCB3cml0ZXMgYXJlIG5vdCBuYXJyYXRlZCDigJQgdGhlIG5hcnJhdGl2ZSdzIGxhdyBzaW5jZVxuICAgKiBiZWZvcmUgcmV0cnkgZXhpc3RlZCwga2VwdC4gSXRzIEFUVEVNUFQgbGluZXMgYXJlIHRoZSBleGNlcHRpb24gKDEwLjEpOlxuICAgKiB0aGUgc3RvcCByZWFzb24gaXMgdGhlIHBvaW50LCBzbyB0aGV5IGZvbGxvdyB0aGUgZXJyb3IgbGluZSwgaW4gb3JkZXIsXG4gICAqIGFzIGl0cyBkZXB0aC0xIHN1Yi1pdGVtcy4gQSBzdGFnZSB3aXRoIG5vIHJldHJ5IHBvbGljeSBidWZmZXJzIG5vIGF0dGVtcHRcbiAgICogbGluZXMsIHNvIGl0cyBmYWlsdXJlIG5hcnJhdGVzIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgKi9cbiAgcHJpdmF0ZSBmbHVzaEF0dGVtcHRzKHRyYXZlcnNhbENvbnRleHQ6IEZsb3dFcnJvckV2ZW50Wyd0cmF2ZXJzYWxDb250ZXh0J10sIHN0YWdlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcnVudGltZVN0YWdlSWQgPSB0cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAocnVudGltZVN0YWdlSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IG9wcyA9IHRoaXMucGVuZGluZ09wcy5nZXQocnVudGltZVN0YWdlSWQpO1xuICAgIGlmICghb3BzPy5zb21lKChvcCkgPT4gb3AudHlwZSA9PT0gJ2F0dGVtcHQnKSkgcmV0dXJuO1xuICAgIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgICBpZiAob3AudHlwZSA9PT0gJ2F0dGVtcHQnICYmIG9wLmF0dGVtcHQpIHtcbiAgICAgICAgdGhpcy5wdXNoQXR0ZW1wdChvcC5hdHRlbXB0LCBvcC5zdGVwTnVtYmVyLCB7XG4gICAgICAgICAgc3ViZmxvd0lkOiB0cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgICAgICAgc3RhZ2VJZDogdHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgICAgICBzdGFnZU5hbWUsXG4gICAgICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdPcHMuc2V0KFxuICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICBvcHMuZmlsdGVyKChvcCkgPT4gb3AudHlwZSAhPT0gJ2F0dGVtcHQnKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIE9uZSBhdHRlbXB0IGxpbmUg4oCUIHRoZSBjb25zdW1lcidzIGByZW5kZXJBdHRlbXB0YCBmaXJzdDsgYG51bGxgIGRyb3BzIGl0LCBgdW5kZWZpbmVkYCBmYWxscyBiYWNrLiAqL1xuICBwcml2YXRlIHB1c2hBdHRlbXB0KFxuICAgIGN0eDogQXR0ZW1wdFJlbmRlckNvbnRleHQsXG4gICAgc3RlcE51bWJlcjogbnVtYmVyLFxuICAgIGF0OiB7IHN1YmZsb3dJZD86IHN0cmluZzsgc3RhZ2VJZD86IHN0cmluZzsgc3RhZ2VOYW1lPzogc3RyaW5nOyBydW50aW1lU3RhZ2VJZDogc3RyaW5nIH0sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRleHQgPSByZXNvbHZlVGV4dCh0aGlzLnJlbmRlcmVyPy5yZW5kZXJBdHRlbXB0Py4oY3R4KSwgKCkgPT4gYXR0ZW1wdFNlbnRlbmNlKGN0eC5zdGFnZU5hbWUsIGN0eC5yZWNvcmQpKTtcbiAgICBpZiAodGV4dCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICB0eXBlOiAnYXR0ZW1wdCcsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDEsXG4gICAgICBzdGFnZU5hbWU6IGF0LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IGF0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogYXQucnVudGltZVN0YWdlSWQsXG4gICAgICBzdGVwTnVtYmVyLFxuICAgICAgc3ViZmxvd0lkOiBhdC5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgRW1pdCBjaGFubmVsIChQaGFzZSAzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVjZWl2ZSBhIGNvbnN1bWVyLWVtaXR0ZWQgZXZlbnQgZnJvbSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgLlxuICAgKlxuICAgKiBCdWZmZXJlZCBhbG9uZ3NpZGUgYG9uUmVhZGAvYG9uV3JpdGVgIHBlci1zdGFnZSBzbyB0aGF0IHRoZSBmaW5hbFxuICAgKiBuYXJyYXRpdmUgcHJlc2VydmVzIG9yZGVyaW5nOlxuICAgKlxuICAgKiAgIDEuIHN0YWdlIGhlYWRlciAoZW1pdHRlZCBieSBgb25TdGFnZUV4ZWN1dGVkYCAvIGBvbkRlY2lzaW9uYClcbiAgICogICAyLiBidWZmZXJlZCBvcHMgZm9yIHRoYXQgc3RhZ2Ug4oCUIGluIGNhbGwgb3JkZXIg4oCUIGZsdXNoZWQgcmlnaHQgYWZ0ZXJcbiAgICpcbiAgICogV2l0aG91dCBidWZmZXJpbmcsIGVtaXQgZXZlbnRzIHdvdWxkIGZpcmUgQkVGT1JFIHRoZSBzdGFnZSBoZWFkZXJcbiAgICogKHdoaWNoIG9ubHkgbGFuZHMgYXQgYG9uU3RhZ2VFeGVjdXRlZGApLCBwcm9kdWNpbmcgb3V0LW9mLW9yZGVyXG4gICAqIG5hcnJhdGl2ZSBlbnRyaWVzLiBGbHVzaCBoYXBwZW5zIGluIGBmbHVzaE9wc2Agd2hpY2ggcm91dGVzIGBlbWl0YC1cbiAgICogdHlwZWQgYnVmZmVyZWQgb3BzIHRocm91Z2ggYHJlbmRlckVtaXRgIGluc3RlYWQgb2YgYHJlbmRlck9wYC5cbiAgICovXG4gIG9uRW1pdChldmVudDogRW1pdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5ydW50aW1lU3RhZ2VJZCwge1xuICAgICAgdHlwZTogJ2VtaXQnLFxuICAgICAga2V5OiBldmVudC5uYW1lLFxuICAgICAgcmF3VmFsdWU6IGV2ZW50LnBheWxvYWQsXG4gICAgICBlbWl0RXZlbnQ6IGV2ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRW1pdChjdHg6IEVtaXRSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFtlbWl0XSAke2N0eC5uYW1lfTogJHtjdHgucGF5bG9hZFN1bW1hcnl9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBPdXRwdXQgKG5hcnJhdGl2ZS1zcGVjaWZpYykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgZW50cmllcyBncm91cGVkIGJ5IHN1YmZsb3dJZCBmb3Igc3RydWN0dXJlZCBhY2Nlc3MuXG4gICAqIFJvb3QtbGV2ZWwgZW50cmllcyBoYXZlIHN1YmZsb3dJZCA9IHVuZGVmaW5lZC5cbiAgICovXG4gIGdldEVudHJpZXNCeVN1YmZsb3coKTogUmVjb3JkPHN0cmluZywgQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10+ID0geyAnJzogW10gfTtcbiAgICB0aGlzLnN0b3JlLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBlbnRyeS5zdWJmbG93SWQgPz8gJyc7XG4gICAgICBpZiAoIXJlc3VsdFtrZXldKSByZXN1bHRba2V5XSA9IFtdO1xuICAgICAgcmVzdWx0W2tleV0ucHVzaChlbnRyeSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTZXF1ZW5jZSBxdWVyeSBBUEkgKGRlbGVnYXRlcyB0byB0aGUgY29tcG9zZWQgc3RvcmUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBBbGwgbmFycmF0aXZlIGVudHJpZXMgaW4gZXhlY3V0aW9uIG9yZGVyLiAqL1xuICBnZXRFbnRyaWVzKCk6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0QWxsKCk7XG4gIH1cblxuICAvKiogVG90YWwgbnVtYmVyIG9mIG5hcnJhdGl2ZSBlbnRyaWVzLiAqL1xuICBnZXQgZW50cnlDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gIH1cblxuICAvKiogTygxKSBsb29rdXA6IGFsbCBuYXJyYXRpdmUgZW50cmllcyBmb3Igb25lIGV4ZWN1dGlvbiBzdGVwLiAqL1xuICBnZXRFbnRyaWVzRm9yU3RlcChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRCeUtleShydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIGRpc3RpbmN0IGV4ZWN1dGlvbiBzdGVwcyB0aGF0IHByb2R1Y2VkIGVudHJpZXMuICovXG4gIGdldCBzdGVwQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5rZXlDb3VudDtcbiAgfVxuXG4gIC8qKiBQcmUtYnVpbHQgcGVyLXN0ZXAgcmFuZ2UgaW5kZXgg4oCUIE8oMSkgbG9va3VwcyBmb3IgdGltZS10cmF2ZWwgc2NydWJiaW5nLiAqL1xuICBnZXRFbnRyeVJhbmdlcygpOiBSZWFkb25seU1hcDxzdHJpbmcsIHsgcmVhZG9ubHkgZmlyc3RJZHg6IG51bWJlcjsgcmVhZG9ubHkgZW5kSWR4OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEVudHJ5UmFuZ2VzKCk7XG4gIH1cblxuICAvKiogUmVkdWNlIEFMTCBlbnRyaWVzIHRvIGEgc2luZ2xlIHZhbHVlLiAqL1xuICBhZ2dyZWdhdGU8Uj4oZm46IChhY2M6IFIsIGVudHJ5OiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5KSA9PiBSLCBpbml0aWFsOiBSKTogUiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuYWdncmVnYXRlKGZuLCBpbml0aWFsKTtcbiAgfVxuXG4gIC8qKiBSZWR1Y2UgZW50cmllcywgb3B0aW9uYWxseSBmaWx0ZXJlZCB0byBhIHNldCBvZiB2aXNpYmxlIHJ1bnRpbWVTdGFnZUlkcy4gKi9cbiAgYWNjdW11bGF0ZTxSPihmbjogKGFjYzogUiwgZW50cnk6IENvbWJpbmVkTmFycmF0aXZlRW50cnkpID0+IFIsIGluaXRpYWw6IFIsIGtleXM/OiBSZWFkb25seVNldDxzdHJpbmc+KTogUiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuYWNjdW11bGF0ZShmbiwgaW5pdGlhbCwga2V5cyk7XG4gIH1cblxuICAvKiogUHJvZ3Jlc3NpdmUgcmV2ZWFsOiBlbnRyaWVzIHdob3NlIHJ1bnRpbWVTdGFnZUlkIGlzIGluIHRoZSB2aXNpYmxlIHNldC4gKi9cbiAgZ2V0RW50cmllc1VwVG8odmlzaWJsZUlkczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RW50cmllc1VwVG8odmlzaWJsZUlkcyk7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3QgYnVuZGxlIGZvciBpbmNsdXNpb24gaW4gYGV4ZWN1dG9yLmdldFNuYXBzaG90KCkucmVjb3JkZXJzYCDigJRcbiAgICogdGhlIG5hcnJhdGl2ZSByaWRlcyB0aGUgc25hcHNob3QsIHNvIGEgY29uc3VtZXIgaG9sZGluZyBvbmx5IHRoZSBmcm96ZW5cbiAgICogc25hcHNob3QgKGEgdHJhY2Ugdmlld2VyLCBhbiBleHBvcnRlZCBydW4sIGEgVUkgcGFuZWwgdGhhdCBuZXZlciBzZWVzIHRoZVxuICAgKiBleGVjdXRvcikgY2FuIHJlYWQgdGhlIHJ1bidzIHN0b3J5IHdpdGhvdXQgY2FsbGluZyBiYWNrIGludG8gdGhlIGVuZ2luZS5cbiAgICpcbiAgICogYHJhd1ZhbHVlYCBpcyBkZWxpYmVyYXRlbHkgRFJPUFBFRCBmcm9tIHRoZSBzbmFwc2hvdCBlbnRyaWVzLiBJdCBpcyBhXG4gICAqIGxpdmUgcmVmZXJlbmNlIHRvIHNjb3BlL2VtaXQgcGF5bG9hZHMgYnkgY29udHJhY3QgKHNlZVxuICAgKiBgQ29tYmluZWROYXJyYXRpdmVFbnRyeS5yYXdWYWx1ZWApLCBzbyBrZWVwaW5nIGl0IHdvdWxkIGJvdGggYWxpYXMgZW5naW5lXG4gICAqIG1lbW9yeSBpbnRvIGFuIGFydGlmYWN0IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgZGV0YWNoZWQgQU5EIG1ha2UgdGhlXG4gICAqIHNuYXBzaG90IGZhaWwgYHN0cnVjdHVyZWRDbG9uZWAvYEpTT04uc3RyaW5naWZ5YCB3aGVuZXZlciBhIHBheWxvYWQgaXNcbiAgICogbm90IHNlcmlhbGl6YWJsZS4gVGhlIHJlbmRlcmVkIGB0ZXh0YCBhbHJlYWR5IGNhcnJpZXMgdGhlIHZhbHVlIHN1bW1hcnlcbiAgICogKGBpbmNsdWRlVmFsdWVzYCwgZGVmYXVsdCBvbikgYW5kIGBrZXlgIGNhcnJpZXMgdGhlIHNjb3BlIGtleSwgc28gbm90aGluZ1xuICAgKiBhIHNuYXBzaG90IGNvbnN1bWVyIGNhbiBhY3Qgb24gaXMgbG9zdC4gSW4tcHJvY2VzcyBjb25zdW1lcnMgdGhhdCBuZWVkXG4gICAqIHRoZSBsaXZlIHZhbHVlIGtlZXAgdXNpbmcgYGdldEVudHJpZXMoKWAuXG4gICAqL1xuICB0b1NuYXBzaG90KCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnTmFycmF0aXZlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVHJhbnNsYXRvciAoU2VxdWVuY2VTdG9yZSkg4oCUIHBsYWluLUVuZ2xpc2ggdHJhY2UgbWVyZ2VkIGZyb20gZmxvdyArIGRhdGEgZXZlbnRzJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldEVudHJpZXMoKS5tYXAoKHsgcmF3VmFsdWU6IF9yYXdWYWx1ZSwgLi4uZW50cnkgfSkgPT4gZW50cnkpLFxuICAgIH07XG4gIH1cblxuICAvKiogQ2xlYXJzIGFsbCBzdGF0ZS4gQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGVhY2ggcnVuLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nT3BzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5maXJzdFN0YWdlRmxhZ3MuY2xlYXIoKTtcbiAgICB0aGlzLnN0YWdlVmlzaXRDb3VudHMuY2xlYXIoKTtcbiAgICB0aGlzLnJlc3VtZWRTdGFnZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBpbmNyZW1lbnRTdGFnZUNvdW50ZXIoc3ViZmxvd0tleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zdGFnZUNvdW50ZXJzLmdldChzdWJmbG93S2V5KSA/PyAwO1xuICAgIGNvbnN0IG5leHQgPSBjdXJyZW50ICsgMTtcbiAgICB0aGlzLnN0YWdlQ291bnRlcnMuc2V0KHN1YmZsb3dLZXksIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgLyoqIFRoZSBmaXJzdCBzdGFnZSBoZWFkZXIgYWZ0ZXIgYSByZXN1bWUgYmVsb25ncyB0byB0aGUgcmVzdW1lZCBzdGFnZTsgdG9sZCBvbmNlLCB0aGVuIGNsZWFyZWQuICovXG4gIHByaXZhdGUgY29uc3VtZVJlc3VtZWQoc3RhZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZXN1bWVkID0gdGhpcy5yZXN1bWVkU3RhZ2UgPT09IHN0YWdlTmFtZTtcbiAgICB0aGlzLnJlc3VtZWRTdGFnZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdW1lZDtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZUZpcnN0U3RhZ2VGbGFnKHN1YmZsb3dLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5maXJzdFN0YWdlRmxhZ3MuaGFzKHN1YmZsb3dLZXkpKSB7XG4gICAgICB0aGlzLmZpcnN0U3RhZ2VGbGFncy5zZXQoc3ViZmxvd0tleSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVmZmVyT3AocnVudGltZVN0YWdlSWQ6IHN0cmluZywgb3A6IE9taXQ8QnVmZmVyZWRPcCwgJ3N0ZXBOdW1iZXInPik6IHZvaWQge1xuICAgIGxldCBvcHMgPSB0aGlzLnBlbmRpbmdPcHMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICBpZiAoIW9wcykge1xuICAgICAgb3BzID0gW107XG4gICAgICB0aGlzLnBlbmRpbmdPcHMuc2V0KHJ1bnRpbWVTdGFnZUlkLCBvcHMpO1xuICAgIH1cbiAgICBvcHMucHVzaCh7IC4uLm9wLCBzdGVwTnVtYmVyOiBvcHMubGVuZ3RoICsgMSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hPcHMocnVudGltZVN0YWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3ViZmxvd0lkPzogc3RyaW5nLCBzdGFnZUlkPzogc3RyaW5nLCBzdGFnZU5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocnVudGltZVN0YWdlSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IG9wcyA9IHRoaXMucGVuZGluZ09wcy5nZXQocnVudGltZVN0YWdlSWQpO1xuICAgIGlmICghb3BzIHx8IG9wcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgICAvLyDilIDilIAgRW1pdCBldmVudHMgdGFrZSBhIGRpZmZlcmVudCByZW5kZXIgcGF0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIC8vXG4gICAgICAvLyBFbWl0IGV2ZW50cyBhcmUgYnVmZmVyZWQgYWxvbmdzaWRlIHJlYWRzL3dyaXRlcyAoc28gdGhleSBhcHBlYXJcbiAgICAgIC8vIHVuZGVyIHRoZWlyIG93bmluZyBzdGFnZSdzIGhlYWRlciBpbiBuYXJyYXRpdmUgb3JkZXIsIG5vdCBpbmxpbmVcbiAgICAgIC8vIGF0IGNhbGwgdGltZSkuIEF0IGZsdXNoLCB0aGV5IHJvdXRlIHRocm91Z2ggYHJlbmRlckVtaXRgIGluc3RlYWRcbiAgICAgIC8vIG9mIGByZW5kZXJPcGAg4oCUIGNvbnN1bWVycyB3YW50aW5nIGN1c3RvbSBlbWl0IHJlbmRlcmluZyBpbXBsZW1lbnRcbiAgICAgIC8vIHRoZSBkZWRpY2F0ZWQgaG9vay4gVW5oYW5kbGVkIC8gbWlzc2luZyByZW5kZXJlciBmYWxscyBiYWNrIHRvXG4gICAgICAvLyB0aGUgc2FtZSBjb21wYWN0IGBbZW1pdF0gbmFtZTogcGF5bG9hZFN1bW1hcnlgIGRlZmF1bHQgdXNlZCBieVxuICAgICAgLy8gdGhlIHByZS1idWZmZXJpbmcgb25FbWl0IHBhdGguXG4gICAgICBpZiAob3AudHlwZSA9PT0gJ2VtaXQnICYmIG9wLmVtaXRFdmVudCkge1xuICAgICAgICBjb25zdCBlID0gb3AuZW1pdEV2ZW50O1xuICAgICAgICBjb25zdCBwYXlsb2FkU3VtbWFyeSA9IHRoaXMuZm9ybWF0VmFsdWUoZS5wYXlsb2FkLCB0aGlzLm1heFZhbHVlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZW1pdEN0eDogRW1pdFJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgICAgbmFtZTogZS5uYW1lLFxuICAgICAgICAgIHBheWxvYWQ6IGUucGF5bG9hZCxcbiAgICAgICAgICBzdGFnZU5hbWU6IGUuc3RhZ2VOYW1lLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHN1YmZsb3dQYXRoOiBlLnN1YmZsb3dQYXRoLFxuICAgICAgICAgIHBpcGVsaW5lSWQ6IGUucGlwZWxpbmVJZCxcbiAgICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgICAgIHBheWxvYWRTdW1tYXJ5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlbWl0VGV4dCA9IHJlc29sdmVUZXh0KHRoaXMucmVuZGVyZXI/LnJlbmRlckVtaXQ/LihlbWl0Q3R4KSwgKCkgPT4gdGhpcy5kZWZhdWx0UmVuZGVyRW1pdChlbWl0Q3R4KSk7XG4gICAgICAgIGlmIChlbWl0VGV4dCA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2VtaXQnLFxuICAgICAgICAgIHRleHQ6IGVtaXRUZXh0LFxuICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgIHN0YWdlTmFtZSxcbiAgICAgICAgICBzdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBBdHRlbXB0cyB0YWtlIHRoZWlyIG93biByZW5kZXIgcGF0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIC8vXG4gICAgICAvLyBTYW1lIGJ1ZmZlcmluZyByYXRpb25hbGUgYXMgZW1pdCBhYm92ZTogdGhlIGVudHJ5IGJlbG9uZ3MgSU5TSURFIGl0c1xuICAgICAgLy8gc3RhZ2UsIGluIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgYXR0ZW1wdCBhY3R1YWxseSBlbmRlZC5cbiAgICAgIGlmIChvcC50eXBlID09PSAnYXR0ZW1wdCcgJiYgb3AuYXR0ZW1wdCkge1xuICAgICAgICB0aGlzLnB1c2hBdHRlbXB0KG9wLmF0dGVtcHQsIG9wLnN0ZXBOdW1iZXIsIHsgc3ViZmxvd0lkLCBzdGFnZUlkLCBzdGFnZU5hbWUsIHJ1bnRpbWVTdGFnZUlkIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXQgdGhpcyBwb2ludCBvcC50eXBlIGlzIG5hcnJvd2VkIHRvICdyZWFkJyB8ICd3cml0ZScgKHRoZSBlbWl0IGFuZFxuICAgICAgLy8gYXR0ZW1wdCBicmFuY2hlcyBhYm92ZSB1c2UgYGNvbnRpbnVlYCkuIFR5cGVTY3JpcHQgY2FuJ3QgZm9sbG93IHRoYXRcbiAgICAgIC8vIG5hcnJvd2luZyB0aHJvdWdoIHRoZSBjb250aW51ZSwgc28gd2UgYXNzZXJ0IGF0IHJlbmRlciB0aW1lLlxuICAgICAgY29uc3Qgb3BUeXBlID0gb3AudHlwZSBhcyAncmVhZCcgfCAnd3JpdGUnO1xuICAgICAgY29uc3QgdmFsdWVTdW1tYXJ5ID0gdGhpcy5mb3JtYXRWYWx1ZShvcC5yYXdWYWx1ZSwgdGhpcy5tYXhWYWx1ZUxlbmd0aCk7XG4gICAgICBjb25zdCBvcEN0eDogT3BSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgICB0eXBlOiBvcFR5cGUsXG4gICAgICAgIGtleTogb3Aua2V5LFxuICAgICAgICByYXdWYWx1ZTogb3AucmF3VmFsdWUsXG4gICAgICAgIHZhbHVlU3VtbWFyeSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcC5vcGVyYXRpb24sXG4gICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0ZXh0ID0gcmVzb2x2ZVRleHQodGhpcy5yZW5kZXJlcj8ucmVuZGVyT3A/LihvcEN0eCksICgpID0+IHRoaXMuZGVmYXVsdFJlbmRlck9wKG9wQ3R4KSk7XG4gICAgICBpZiAodGV4dCA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgIHRoaXMuc3RvcmUucHVzaCh7XG4gICAgICAgIHR5cGU6ICdzdGVwJyxcbiAgICAgICAgdGV4dCxcbiAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgIHN0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAga2V5OiBvcC5rZXksXG4gICAgICAgIHJhd1ZhbHVlOiBvcC5yYXdWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ09wcy5kZWxldGUocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERlZmF1bHQgcmVuZGVyZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlclN0YWdlKGN0eDogU3RhZ2VSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBsZXQgaW5uZXI6IHN0cmluZztcbiAgICBpZiAoY3R4LnJlc3VtZWQpIHtcbiAgICAgIGlubmVyID0gJ0l0IGNvbnRpbnVlZCBmcm9tIHRoZSBwYXVzZS4nO1xuICAgIH0gZWxzZSBpZiAoY3R4LmlzRmlyc3QpIHtcbiAgICAgIGlubmVyID0gY3R4LmRlc2NyaXB0aW9uID8gYFRoZSBwcm9jZXNzIGJlZ2FuOiAke2N0eC5kZXNjcmlwdGlvbn0uYCA6IGBUaGUgcHJvY2VzcyBiZWdhbiB3aXRoICR7Y3R4LnN0YWdlTmFtZX0uYDtcbiAgICB9IGVsc2UgaWYgKGN0eC5sb29wSXRlcmF0aW9uICYmIGN0eC5sb29wSXRlcmF0aW9uID4gMCkge1xuICAgICAgaW5uZXIgPSBjdHguZGVzY3JpcHRpb25cbiAgICAgICAgPyBgTG9vcGVkIGJhY2s6ICR7Y3R4LmRlc2NyaXB0aW9ufSAocGFzcyAke2N0eC5sb29wSXRlcmF0aW9ufSkuYFxuICAgICAgICA6IGBMb29wZWQgYmFjayB0byAke2N0eC5zdGFnZU5hbWV9IChwYXNzICR7Y3R4Lmxvb3BJdGVyYXRpb259KS5gO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbm5lciA9IG5leHRTdGFnZVNlbnRlbmNlKGN0eCk7XG4gICAgfVxuICAgIHJldHVybiBgU3RhZ2UgJHtjdHguc3RhZ2VOdW1iZXJ9OiAke2lubmVyfWA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJPcChjdHg6IE9wUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RlcFByZWZpeCA9IHRoaXMuaW5jbHVkZVN0ZXBOdW1iZXJzID8gYFN0ZXAgJHtjdHguc3RlcE51bWJlcn06IGAgOiAnJztcbiAgICBpZiAoY3R4LnR5cGUgPT09ICdyZWFkJykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZVZhbHVlcyAmJiBjdHgudmFsdWVTdW1tYXJ5XG4gICAgICAgID8gYCR7c3RlcFByZWZpeH1SZWFkICR7Y3R4LmtleX0gPSAke2N0eC52YWx1ZVN1bW1hcnl9YFxuICAgICAgICA6IGAke3N0ZXBQcmVmaXh9UmVhZCAke2N0eC5rZXl9YDtcbiAgICB9XG4gICAgaWYgKGN0eC5vcGVyYXRpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICByZXR1cm4gYCR7c3RlcFByZWZpeH1EZWxldGUgJHtjdHgua2V5fWA7XG4gICAgfVxuICAgIGlmIChjdHgub3BlcmF0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZVZhbHVlc1xuICAgICAgICA/IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7Y3R4LmtleX0gPSAke2N0eC52YWx1ZVN1bW1hcnl9YFxuICAgICAgICA6IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7Y3R4LmtleX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbmNsdWRlVmFsdWVzID8gYCR7c3RlcFByZWZpeH1Xcml0ZSAke2N0eC5rZXl9ID0gJHtjdHgudmFsdWVTdW1tYXJ5fWAgOiBgJHtzdGVwUHJlZml4fVdyaXRlICR7Y3R4LmtleX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRGVjaXNpb24oY3R4OiBEZWNpc2lvblJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJyYW5jaE5hbWUgPSBjdHguY2hvc2VuO1xuICAgIGxldCBjb25kaXRpb25UZXh0OiBzdHJpbmc7XG4gICAgaWYgKGN0eC5ldmlkZW5jZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGV2aWRlbmNlID0gY3R4LmV2aWRlbmNlIGFzIGFueTtcbiAgICAgIGNvbnN0IG1hdGNoZWRSdWxlID0gZXZpZGVuY2UucnVsZXM/LmZpbmQoKHI6IGFueSkgPT4gci5tYXRjaGVkKTtcbiAgICAgIGlmIChtYXRjaGVkUnVsZSkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IG1hdGNoZWRSdWxlLmxhYmVsID8gYCBcIiR7bWF0Y2hlZFJ1bGUubGFiZWx9XCJgIDogJyc7XG4gICAgICAgIGlmIChtYXRjaGVkUnVsZS50eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gbWF0Y2hlZFJ1bGUuY29uZGl0aW9ucy5tYXAoXG4gICAgICAgICAgICAoYzogYW55KSA9PlxuICAgICAgICAgICAgICBgJHtjLmtleX0gJHtjLmFjdHVhbFN1bW1hcnl9ICR7Yy5vcH0gJHtKU09OLnN0cmluZ2lmeShjLnRocmVzaG9sZCl9ICR7Yy5yZXN1bHQgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbmRpdGlvblRleHQgPSBgSXQgZXZhbHVhdGVkIFJ1bGUgJHttYXRjaGVkUnVsZS5ydWxlSW5kZXh9JHtsYWJlbH06ICR7cGFydHMuam9pbihcbiAgICAgICAgICAgICcsICcsXG4gICAgICAgICAgKX0sIGFuZCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBtYXRjaGVkUnVsZS5pbnB1dHMubWFwKChpOiBhbnkpID0+IGAke2kua2V5fT0ke2kudmFsdWVTdW1tYXJ5fWApO1xuICAgICAgICAgIGNvbmRpdGlvblRleHQgPSBgSXQgZXhhbWluZWQke2xhYmVsfTogJHtwYXJ0cy5qb2luKCcsICcpfSwgYW5kIGNob3NlICR7YnJhbmNoTmFtZX0uYDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JlZENvdW50ID0gZXZpZGVuY2UucnVsZXM/LmZpbHRlcigocjogYW55KSA9PiByLm1hdGNoRXJyb3IgIT09IHVuZGVmaW5lZCkubGVuZ3RoID8/IDA7XG4gICAgICAgIGNvbnN0IGVycm9yTm90ZSA9IGVycm9yZWRDb3VudCA+IDAgPyBgICgke2Vycm9yZWRDb3VudH0gcnVsZSR7ZXJyb3JlZENvdW50ID4gMSA/ICdzJyA6ICcnfSB0aHJldyBlcnJvcnMpYCA6ICcnO1xuICAgICAgICAvLyBUaGUgZGVmYXVsdCBicmFuY2ggaXMgY2hvc2VuIGJ5IG5vIHJ1bGUsIHNvIG5vIHJ1bGUgbGFiZWwgY2FuIGV4cGxhaW5cbiAgICAgICAgLy8gaXQuIFdoZW4gZGVjaWRlKCkgd2FzIGdpdmVuIHRoZSBvYmplY3QgZm9ybSBvZiBpdHMgZGVmYXVsdCwgZXZpZGVuY2VcbiAgICAgICAgLy8gY2FycmllcyB0aGF0IG1lYW5pbmcg4oCUIHByaW50IGl0LCBleGFjdGx5IGFzIGEgbWF0Y2hlZCBydWxlJ3MgbGFiZWwgaXNcbiAgICAgICAgLy8gcHJpbnRlZC4gQWJzZW50LCB0aGUgc2VudGVuY2UgaXMgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIHRoaXMgZmllbGQuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMYWJlbCA9IGV2aWRlbmNlLmRlZmF1bHRMYWJlbCA/IGAgXCIke2V2aWRlbmNlLmRlZmF1bHRMYWJlbH1cImAgOiAnJztcbiAgICAgICAgY29uZGl0aW9uVGV4dCA9IGBObyBydWxlcyBtYXRjaGVkJHtlcnJvck5vdGV9LCBmZWxsIGJhY2sgdG8gZGVmYXVsdCR7ZGVmYXVsdExhYmVsfTogJHticmFuY2hOYW1lfS5gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25UZXh0ID0gZGVjaXNpb25TZW50ZW5jZShjdHgpO1xuICAgIH1cbiAgICByZXR1cm4gYFtDb25kaXRpb25dOiAke2NvbmRpdGlvblRleHR9YDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckZvcmsoY3R4OiBGb3JrUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbUGFyYWxsZWxdOiAke2ZvcmtTZW50ZW5jZShjdHgpfWA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJTZWxlY3RlZChjdHg6IFNlbGVjdGVkUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgaWYgKGN0eC5ldmlkZW5jZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGV2aWRlbmNlID0gY3R4LmV2aWRlbmNlIGFzIGFueTtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBldmlkZW5jZS5ydWxlcz8uZmlsdGVyKChyOiBhbnkpID0+IHIubWF0Y2hlZCkgPz8gW107XG4gICAgICBjb25zdCBwYXJ0cyA9IG1hdGNoZWQubWFwKChyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSByLmxhYmVsID8gYCBcIiR7ci5sYWJlbH1cImAgOiAnJztcbiAgICAgICAgaWYgKHIudHlwZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICBjb25zdCBjb25kcyA9IHIuY29uZGl0aW9uc1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgKGM6IGFueSkgPT5cbiAgICAgICAgICAgICAgICBgJHtjLmtleX0gJHtjLmFjdHVhbFN1bW1hcnl9ICR7Yy5vcH0gJHtKU09OLnN0cmluZ2lmeShjLnRocmVzaG9sZCl9ICR7Yy5yZXN1bHQgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgIHJldHVybiBgJHtyLmJyYW5jaH0ke2xhYmVsfSAoJHtjb25kc30pYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dHMgPSByLmlucHV0cy5tYXAoKGk6IGFueSkgPT4gYCR7aS5rZXl9PSR7aS52YWx1ZVN1bW1hcnl9YCkuam9pbignLCAnKTtcbiAgICAgICAgcmV0dXJuIGAke3IuYnJhbmNofSR7bGFiZWx9ICgke2lucHV0c30pYDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGBbU2VsZWN0ZWRdOiAke2N0eC5zZWxlY3RlZC5sZW5ndGh9IG9mICR7Y3R4LnRvdGFsfSBwYXRocyBzZWxlY3RlZDogJHtwYXJ0cy5qb2luKCc7ICcpfS5gO1xuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IGN0eC5zZWxlY3RlZC5qb2luKCcsICcpO1xuICAgIHJldHVybiBgW1NlbGVjdGVkXTogJHtjdHguc2VsZWN0ZWQubGVuZ3RofSBvZiAke2N0eC50b3RhbH0gcGF0aHMgc2VsZWN0ZWQgZm9yIGV4ZWN1dGlvbjogJHtuYW1lc30uYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlclN1YmZsb3coY3R4OiBTdWJmbG93UmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09ICdleGl0Jykge1xuICAgICAgcmV0dXJuIGBFeGl0aW5nIHRoZSAke2N0eC5uYW1lfSBzdWJmbG93LmA7XG4gICAgfVxuICAgIHJldHVybiBjdHguZGVzY3JpcHRpb24gPyBgRW50ZXJpbmcgJHtjdHgubmFtZX06ICR7Y3R4LmRlc2NyaXB0aW9ufS5gIDogYEVudGVyaW5nIHRoZSAke2N0eC5uYW1lfSBzdWJmbG93LmA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJMb29wKGN0eDogTG9vcFJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIHJldHVybiBsb29wU2VudGVuY2UoY3R4KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckJyZWFrKGN0eDogQnJlYWtSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnJlYWtTZW50ZW5jZShjdHgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRXJyb3IoY3R4OiBFcnJvclJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGxldCB0ZXh0ID0gZXJyb3JTZW50ZW5jZShjdHgpO1xuICAgIGlmIChjdHgudmFsaWRhdGlvbklzc3VlcykgdGV4dCArPSB2YWxpZGF0aW9uU2VudGVuY2UoY3R4LnZhbGlkYXRpb25Jc3N1ZXMpO1xuICAgIHJldHVybiBgW0Vycm9yXTogJHt0ZXh0fWA7XG4gIH1cbn1cbiJdfQ==
@@ -10,8 +10,10 @@
10
10
  *
11
11
  * When no recorders are attached, every method is a fast no-op (empty array check).
12
12
  */
13
+ import type { AttemptRecord } from '../../attempt/types.js';
13
14
  import type { DecisionEvidence, SelectionEvidence } from '../../decide/types.js';
14
15
  import type { StructuredErrorInfo } from '../../errors/errorInfo.js';
16
+ import type { TerminalFailureContext } from '../../errors/terminalFailure.js';
15
17
  import type { FlowRecorder, IControlFlowNarrative, StageType, TraversalContext } from './types.js';
16
18
  export declare class FlowRecorderDispatcher implements IControlFlowNarrative {
17
19
  private recorders;
@@ -34,13 +36,14 @@ export declare class FlowRecorderDispatcher implements IControlFlowNarrative {
34
36
  onLoop(targetStage: string, iteration: number, description?: string, traversalContext?: TraversalContext): void;
35
37
  onBreak(stageName: string, traversalContext?: TraversalContext, reason?: string, propagatedFromSubflow?: string): void;
36
38
  onError(stageName: string, errorMessage: string, structuredError: StructuredErrorInfo, traversalContext?: TraversalContext): void;
39
+ onAttempt(stageName: string, stageId: string, record: AttemptRecord, structuredError: StructuredErrorInfo | undefined, traversalContext?: TraversalContext): void;
37
40
  onStageRetry(stageName: string, stageId: string, attempt: number, maxAttempts: number, delayMs: number, structuredError: StructuredErrorInfo, traversalContext?: TraversalContext): void;
38
41
  onThrottled(stageName: string, stageId: string, structuredError: StructuredErrorInfo, traversalContext?: TraversalContext): void;
39
42
  onPause(stageName: string, stageId: string, pauseData: unknown, subflowPath: readonly string[], traversalContext?: TraversalContext): void;
40
43
  onResume(stageName: string, stageId: string, hasInput: boolean, traversalContext?: TraversalContext): void;
41
44
  onRunStart(input: unknown, traversalContext?: TraversalContext): void;
42
45
  onRunEnd(output: unknown, traversalContext?: TraversalContext): void;
43
- onRunFailed(error: StructuredErrorInfo, traversalContext?: TraversalContext): void;
46
+ onRunFailed(error: StructuredErrorInfo, traversalContext?: TraversalContext, failure?: TerminalFailureContext): void;
44
47
  /**
45
48
  * Returns sentences from an attached NarrativeFlowRecorder (looked up by ID).
46
49
  * Callers that need sentences should attach a NarrativeFlowRecorder with id 'narrative'