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
@@ -0,0 +1,103 @@
1
+ /**
2
+ * recorder/attemptSeries.ts — what a RECORDER keeps of a series: the one evidence predicate, the stop that gave up, and a
3
+ * per-series tally rebuilt from `onAttempt` records (design §5.1, P1c).
4
+ *
5
+ * WHY one module: seven built-in recorders account for attempts, and each must agree on two questions — "is this
6
+ * series worth a row?" and "did it give up?" — or a Topology node and a boundary count would disagree about the
7
+ * same run. Asked here, once.
8
+ *
9
+ * THE predicate (`isRetryEvidence`): a series is evidence when it RETRIED (some attempt was followed by another),
10
+ * GAVE UP while a retry was possible (it stopped `exhausted`, `declined` or `no-time-left` with `of > 1`, §3.9), or
11
+ * TIMED OUT (an attempt ran out of its cap or the deadline — P1b's lone timeout is the incident's own shape). A
12
+ * policy stage that succeeded first time — or that paused or was aborted on its first attempt — is
13
+ * indistinguishable from a stage with no policy in every recorder row, so a chart in which nothing retried keeps
14
+ * those rows byte-identical (law 2). So is a LONE attempt (`of: 1`, recorded for every stage of a run with a
15
+ * deadline, P1b) that merely failed: a stage error like any other, so a deadline alone never multiplies rows.
16
+ *
17
+ * Records arrive in order within a series, so the predicate is decided at the series' FIRST record: attempt 1 is
18
+ * evidence iff it did not end the series quietly, and every later attempt is evidence by being one.
19
+ *
20
+ * L5 (`recorder/**`), beside the stores: it imports the attempt vocabulary's types only (the L0 leaf), so
21
+ * `recorder/` never takes a runtime edge into `attempt/` — whose runner reaches `decide/` and `scope/`, which
22
+ * import `recorder/` (a module cycle).
23
+ */
24
+ import { joinPath, subflowSegmentsOf } from 'foottrace';
25
+ /** The stop reasons that mean "gave up" — apart from `aborted` (the run ended it) and `paused` (§3.9). */
26
+ const GAVE_UP = new Set(['exhausted', 'declined', 'no-time-left']);
27
+ /** The series stopped on this record because retrying was given up (exhausted, declined or no time left). */
28
+ export function gaveUp(record) {
29
+ return record.next === 'stop' && GAVE_UP.has(record.reason);
30
+ }
31
+ /**
32
+ * The record belongs to a STAGE's series that retried, gave up or timed out — the one row predicate every recorder
33
+ * shares. A call's or an observed attempt (`scope.$call`, `observed()`, P2) is never a row here: these recorders keep
34
+ * one row per stage execution, and a call is counted per TARGET (the `attempts()` recorder, P7) — drawn as a stage's
35
+ * retry it would say the stage retried when only its call did.
36
+ */
37
+ export function isRetryEvidence(record) {
38
+ if (record.kind !== 'stage')
39
+ return false;
40
+ return (record.attempt > 1 ||
41
+ record.next === 'retry' ||
42
+ record.outcome === 'timeout' ||
43
+ (gaveUp(record) && (record.of ?? 1) > 1));
44
+ }
45
+ /** Did the attempt itself fail — a failure, a timeout or the run's abort (not a success, not a pause)? */
46
+ export function attemptFailed(record) {
47
+ return record.outcome === 'failed' || record.outcome === 'timeout' || record.outcome === 'aborted';
48
+ }
49
+ /** The record's name. */
50
+ export function attemptRef(record) {
51
+ return { series: record.series, attempt: record.attempt };
52
+ }
53
+ /**
54
+ * The path-prefixed id of the subflow an attempt's stage ran in (`'sf-outer/sf-inner'`), or `undefined` at the top
55
+ * level — read off the stage execution's `runtimeStageId` (the event's, else the series'), the one id that always
56
+ * carries it.
57
+ */
58
+ export function subflowOfAttempt(event) {
59
+ const segments = subflowSegmentsOf(event.traversalContext?.runtimeStageId ?? event.record.series);
60
+ return segments.length > 0 ? joinPath(...segments) : undefined;
61
+ }
62
+ /** A zeroed per-outcome count. */
63
+ export function emptyOutcomeCounts() {
64
+ return { ok: 0, failed: 0, timeout: 0, aborted: 0, paused: 0 };
65
+ }
66
+ /**
67
+ * Per-series tallies, keyed by `series`, for the series that are evidence. `add` returns the series' state after
68
+ * the record, or `undefined` for a record that is not evidence (nothing to keep).
69
+ */
70
+ export class AttemptSeriesBook {
71
+ bySeries = new Map();
72
+ add(record) {
73
+ if (!isRetryEvidence(record))
74
+ return undefined;
75
+ let entry = this.bySeries.get(record.series);
76
+ if (!entry) {
77
+ entry = { refs: [], counts: emptyOutcomeCounts() };
78
+ this.bySeries.set(record.series, entry);
79
+ }
80
+ entry.refs.push(attemptRef(record));
81
+ entry.counts[record.outcome] += 1;
82
+ const attempts = [...entry.refs];
83
+ if (record.next === 'retry')
84
+ return { series: record.series, attempts };
85
+ return { series: record.series, attempts, summary: summaryOf(entry.refs.length, entry.counts, record) };
86
+ }
87
+ clear() {
88
+ this.bySeries.clear();
89
+ }
90
+ }
91
+ function summaryOf(count, counts, last) {
92
+ return {
93
+ count,
94
+ ...counts,
95
+ last: {
96
+ next: last.next,
97
+ reason: last.reason,
98
+ ...(last.category !== undefined && { category: last.category }),
99
+ ...(last.retryOnThrew && { retryOnThrew: true }),
100
+ },
101
+ };
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdFNlcmllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvYXR0ZW1wdFNlcmllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFnQnhELDBHQUEwRztBQUMxRyxNQUFNLE9BQU8sR0FBK0IsSUFBSSxHQUFHLENBQWdCLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBRTlHLDZHQUE2RztBQUM3RyxNQUFNLFVBQVUsTUFBTSxDQUFDLE1BQThDO0lBQ25FLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFxQjtJQUNuRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFDLE9BQU8sQ0FDTCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUM7UUFDbEIsTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPO1FBQ3ZCLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUztRQUM1QixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3pDLENBQUM7QUFDSixDQUFDO0FBRUQsMEdBQTBHO0FBQzFHLE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBcUI7SUFDakQsT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsT0FB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RUFBRSxDQUFDO1NBQzFEO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlY29yZGVyL2F0dGVtcHRTZXJpZXMudHMg4oCUIHdoYXQgYSBSRUNPUkRFUiBrZWVwcyBvZiBhIHNlcmllczogdGhlIG9uZSBldmlkZW5jZSBwcmVkaWNhdGUsIHRoZSBzdG9wIHRoYXQgZ2F2ZSB1cCwgYW5kIGFcbiAqIHBlci1zZXJpZXMgdGFsbHkgcmVidWlsdCBmcm9tIGBvbkF0dGVtcHRgIHJlY29yZHMgKGRlc2lnbiDCpzUuMSwgUDFjKS5cbiAqXG4gKiBXSFkgb25lIG1vZHVsZTogc2V2ZW4gYnVpbHQtaW4gcmVjb3JkZXJzIGFjY291bnQgZm9yIGF0dGVtcHRzLCBhbmQgZWFjaCBtdXN0IGFncmVlIG9uIHR3byBxdWVzdGlvbnMg4oCUIFwiaXMgdGhpc1xuICogc2VyaWVzIHdvcnRoIGEgcm93P1wiIGFuZCBcImRpZCBpdCBnaXZlIHVwP1wiIOKAlCBvciBhIFRvcG9sb2d5IG5vZGUgYW5kIGEgYm91bmRhcnkgY291bnQgd291bGQgZGlzYWdyZWUgYWJvdXQgdGhlXG4gKiBzYW1lIHJ1bi4gQXNrZWQgaGVyZSwgb25jZS5cbiAqXG4gKiBUSEUgcHJlZGljYXRlIChgaXNSZXRyeUV2aWRlbmNlYCk6IGEgc2VyaWVzIGlzIGV2aWRlbmNlIHdoZW4gaXQgUkVUUklFRCAoc29tZSBhdHRlbXB0IHdhcyBmb2xsb3dlZCBieSBhbm90aGVyKSxcbiAqIEdBVkUgVVAgd2hpbGUgYSByZXRyeSB3YXMgcG9zc2libGUgKGl0IHN0b3BwZWQgYGV4aGF1c3RlZGAsIGBkZWNsaW5lZGAgb3IgYG5vLXRpbWUtbGVmdGAgd2l0aCBgb2YgPiAxYCwgwqczLjkpLCBvclxuICogVElNRUQgT1VUIChhbiBhdHRlbXB0IHJhbiBvdXQgb2YgaXRzIGNhcCBvciB0aGUgZGVhZGxpbmUg4oCUIFAxYidzIGxvbmUgdGltZW91dCBpcyB0aGUgaW5jaWRlbnQncyBvd24gc2hhcGUpLiBBXG4gKiBwb2xpY3kgc3RhZ2UgdGhhdCBzdWNjZWVkZWQgZmlyc3QgdGltZSDigJQgb3IgdGhhdCBwYXVzZWQgb3Igd2FzIGFib3J0ZWQgb24gaXRzIGZpcnN0IGF0dGVtcHQg4oCUIGlzXG4gKiBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgc3RhZ2Ugd2l0aCBubyBwb2xpY3kgaW4gZXZlcnkgcmVjb3JkZXIgcm93LCBzbyBhIGNoYXJ0IGluIHdoaWNoIG5vdGhpbmcgcmV0cmllZCBrZWVwc1xuICogdGhvc2Ugcm93cyBieXRlLWlkZW50aWNhbCAobGF3IDIpLiBTbyBpcyBhIExPTkUgYXR0ZW1wdCAoYG9mOiAxYCwgcmVjb3JkZWQgZm9yIGV2ZXJ5IHN0YWdlIG9mIGEgcnVuIHdpdGggYVxuICogZGVhZGxpbmUsIFAxYikgdGhhdCBtZXJlbHkgZmFpbGVkOiBhIHN0YWdlIGVycm9yIGxpa2UgYW55IG90aGVyLCBzbyBhIGRlYWRsaW5lIGFsb25lIG5ldmVyIG11bHRpcGxpZXMgcm93cy5cbiAqXG4gKiBSZWNvcmRzIGFycml2ZSBpbiBvcmRlciB3aXRoaW4gYSBzZXJpZXMsIHNvIHRoZSBwcmVkaWNhdGUgaXMgZGVjaWRlZCBhdCB0aGUgc2VyaWVzJyBGSVJTVCByZWNvcmQ6IGF0dGVtcHQgMSBpc1xuICogZXZpZGVuY2UgaWZmIGl0IGRpZCBub3QgZW5kIHRoZSBzZXJpZXMgcXVpZXRseSwgYW5kIGV2ZXJ5IGxhdGVyIGF0dGVtcHQgaXMgZXZpZGVuY2UgYnkgYmVpbmcgb25lLlxuICpcbiAqIEw1IChgcmVjb3JkZXIvKipgKSwgYmVzaWRlIHRoZSBzdG9yZXM6IGl0IGltcG9ydHMgdGhlIGF0dGVtcHQgdm9jYWJ1bGFyeSdzIHR5cGVzIG9ubHkgKHRoZSBMMCBsZWFmKSwgc29cbiAqIGByZWNvcmRlci9gIG5ldmVyIHRha2VzIGEgcnVudGltZSBlZGdlIGludG8gYGF0dGVtcHQvYCDigJQgd2hvc2UgcnVubmVyIHJlYWNoZXMgYGRlY2lkZS9gIGFuZCBgc2NvcGUvYCwgd2hpY2hcbiAqIGltcG9ydCBgcmVjb3JkZXIvYCAoYSBtb2R1bGUgY3ljbGUpLlxuICovXG5cbmltcG9ydCB7IGpvaW5QYXRoLCBzdWJmbG93U2VnbWVudHNPZiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdE91dGNvbWUsIEF0dGVtcHRSZWFzb24sIEF0dGVtcHRSZWNvcmQsIEF0dGVtcHRTdW1tYXJ5IH0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5cbi8qKlxuICogT25lIGF0dGVtcHQsIG5hbWVkIOKAlCBgc2VyaWVzYCAodGhlIHN0YWdlIGV4ZWN1dGlvbidzIGBydW50aW1lU3RhZ2VJZGApIHBsdXMgdGhlIDEtYmFzZWQgYGF0dGVtcHRgLiBUaGVcbiAqIGlkZW50aXR5IGBBdHRlbXB0UmVjb3JkYCBjYXJyaWVzIHVudGlsIHRoZSBlbmdpbmUgc3RhbXBzIGZvb3R0cmFjZSdzIGF0dGVtcHQgaWQgKGRlc2lnbiDCpzMuNCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXR0ZW1wdFJlZiB7XG4gIHJlYWRvbmx5IHNlcmllczogc3RyaW5nO1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG59XG5cbi8qKiBBdHRlbXB0IGNvdW50cyBwZXIgb3V0Y29tZSDigJQgdGhlIHNoYXBlIGBBdHRlbXB0U3VtbWFyeWAgdXNlcywgd2l0aG91dCB0aGUgc2VyaWVzJyBlbmQuICovXG5leHBvcnQgdHlwZSBBdHRlbXB0T3V0Y29tZUNvdW50cyA9IFJlYWRvbmx5PFJlY29yZDxBdHRlbXB0T3V0Y29tZSwgbnVtYmVyPj47XG5cbi8qKiBUaGUgc3RvcCByZWFzb25zIHRoYXQgbWVhbiBcImdhdmUgdXBcIiDigJQgYXBhcnQgZnJvbSBgYWJvcnRlZGAgKHRoZSBydW4gZW5kZWQgaXQpIGFuZCBgcGF1c2VkYCAowqczLjkpLiAqL1xuY29uc3QgR0FWRV9VUDogUmVhZG9ubHlTZXQ8QXR0ZW1wdFJlYXNvbj4gPSBuZXcgU2V0PEF0dGVtcHRSZWFzb24+KFsnZXhoYXVzdGVkJywgJ2RlY2xpbmVkJywgJ25vLXRpbWUtbGVmdCddKTtcblxuLyoqIFRoZSBzZXJpZXMgc3RvcHBlZCBvbiB0aGlzIHJlY29yZCBiZWNhdXNlIHJldHJ5aW5nIHdhcyBnaXZlbiB1cCAoZXhoYXVzdGVkLCBkZWNsaW5lZCBvciBubyB0aW1lIGxlZnQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdmVVcChyZWNvcmQ6IFBpY2s8QXR0ZW1wdFJlY29yZCwgJ25leHQnIHwgJ3JlYXNvbic+KTogYm9vbGVhbiB7XG4gIHJldHVybiByZWNvcmQubmV4dCA9PT0gJ3N0b3AnICYmIEdBVkVfVVAuaGFzKHJlY29yZC5yZWFzb24pO1xufVxuXG4vKipcbiAqIFRoZSByZWNvcmQgYmVsb25ncyB0byBhIFNUQUdFJ3Mgc2VyaWVzIHRoYXQgcmV0cmllZCwgZ2F2ZSB1cCBvciB0aW1lZCBvdXQg4oCUIHRoZSBvbmUgcm93IHByZWRpY2F0ZSBldmVyeSByZWNvcmRlclxuICogc2hhcmVzLiBBIGNhbGwncyBvciBhbiBvYnNlcnZlZCBhdHRlbXB0IChgc2NvcGUuJGNhbGxgLCBgb2JzZXJ2ZWQoKWAsIFAyKSBpcyBuZXZlciBhIHJvdyBoZXJlOiB0aGVzZSByZWNvcmRlcnMga2VlcFxuICogb25lIHJvdyBwZXIgc3RhZ2UgZXhlY3V0aW9uLCBhbmQgYSBjYWxsIGlzIGNvdW50ZWQgcGVyIFRBUkdFVCAodGhlIGBhdHRlbXB0cygpYCByZWNvcmRlciwgUDcpIOKAlCBkcmF3biBhcyBhIHN0YWdlJ3NcbiAqIHJldHJ5IGl0IHdvdWxkIHNheSB0aGUgc3RhZ2UgcmV0cmllZCB3aGVuIG9ubHkgaXRzIGNhbGwgZGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXRyeUV2aWRlbmNlKHJlY29yZDogQXR0ZW1wdFJlY29yZCk6IGJvb2xlYW4ge1xuICBpZiAocmVjb3JkLmtpbmQgIT09ICdzdGFnZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIChcbiAgICByZWNvcmQuYXR0ZW1wdCA+IDEgfHxcbiAgICByZWNvcmQubmV4dCA9PT0gJ3JldHJ5JyB8fFxuICAgIHJlY29yZC5vdXRjb21lID09PSAndGltZW91dCcgfHxcbiAgICAoZ2F2ZVVwKHJlY29yZCkgJiYgKHJlY29yZC5vZiA/PyAxKSA+IDEpXG4gICk7XG59XG5cbi8qKiBEaWQgdGhlIGF0dGVtcHQgaXRzZWxmIGZhaWwg4oCUIGEgZmFpbHVyZSwgYSB0aW1lb3V0IG9yIHRoZSBydW4ncyBhYm9ydCAobm90IGEgc3VjY2Vzcywgbm90IGEgcGF1c2UpPyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGVtcHRGYWlsZWQocmVjb3JkOiBBdHRlbXB0UmVjb3JkKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWNvcmQub3V0Y29tZSA9PT0gJ2ZhaWxlZCcgfHwgcmVjb3JkLm91dGNvbWUgPT09ICd0aW1lb3V0JyB8fCByZWNvcmQub3V0Y29tZSA9PT0gJ2Fib3J0ZWQnO1xufVxuXG4vKiogVGhlIHJlY29yZCdzIG5hbWUuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0ZW1wdFJlZihyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiBBdHRlbXB0UmVmIHtcbiAgcmV0dXJuIHsgc2VyaWVzOiByZWNvcmQuc2VyaWVzLCBhdHRlbXB0OiByZWNvcmQuYXR0ZW1wdCB9O1xufVxuXG4vKipcbiAqIFRoZSBwYXRoLXByZWZpeGVkIGlkIG9mIHRoZSBzdWJmbG93IGFuIGF0dGVtcHQncyBzdGFnZSByYW4gaW4gKGAnc2Ytb3V0ZXIvc2YtaW5uZXInYCksIG9yIGB1bmRlZmluZWRgIGF0IHRoZSB0b3BcbiAqIGxldmVsIOKAlCByZWFkIG9mZiB0aGUgc3RhZ2UgZXhlY3V0aW9uJ3MgYHJ1bnRpbWVTdGFnZUlkYCAodGhlIGV2ZW50J3MsIGVsc2UgdGhlIHNlcmllcycpLCB0aGUgb25lIGlkIHRoYXQgYWx3YXlzXG4gKiBjYXJyaWVzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViZmxvd09mQXR0ZW1wdChldmVudDoge1xuICByZWFkb25seSByZWNvcmQ6IEF0dGVtcHRSZWNvcmQ7XG4gIHJlYWRvbmx5IHRyYXZlcnNhbENvbnRleHQ/OiB7IHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcgfTtcbn0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWdtZW50cyA9IHN1YmZsb3dTZWdtZW50c09mKGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/IGV2ZW50LnJlY29yZC5zZXJpZXMpO1xuICByZXR1cm4gc2VnbWVudHMubGVuZ3RoID4gMCA/IGpvaW5QYXRoKC4uLnNlZ21lbnRzKSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIEEgemVyb2VkIHBlci1vdXRjb21lIGNvdW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5T3V0Y29tZUNvdW50cygpOiBSZWNvcmQ8QXR0ZW1wdE91dGNvbWUsIG51bWJlcj4ge1xuICByZXR1cm4geyBvazogMCwgZmFpbGVkOiAwLCB0aW1lb3V0OiAwLCBhYm9ydGVkOiAwLCBwYXVzZWQ6IDAgfTtcbn1cblxuLyoqIFdoYXQgYSByZWNvcmRlciBrbm93cyBvZiBvbmUgc2VyaWVzIHNvIGZhci4gYHN1bW1hcnlgIGlzIHByZXNlbnQgb25jZSB0aGUgc2VyaWVzIGVuZGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0U2VyaWVzU3RhdGUge1xuICByZWFkb25seSBzZXJpZXM6IHN0cmluZztcbiAgLyoqIFRoZSBzZXJpZXMnIGF0dGVtcHRzLCBpbiBvcmRlci4gKi9cbiAgcmVhZG9ubHkgYXR0ZW1wdHM6IHJlYWRvbmx5IEF0dGVtcHRSZWZbXTtcbiAgLyoqXG4gICAqIFRoZSBzZXJpZXMgYXQgYSBnbGFuY2Ug4oCUIHRoZSBzYW1lIHZhbHVlIHRoZSBydW5uZXIgc3RhbXBzIG9uIGBTdGFnZVNuYXBzaG90LmF0dGVtcHRTdW1tYXJ5YCwgcmVidWlsdCBmcm9tIHRoZVxuICAgKiByZWNvcmRzLiBBYnNlbnQgd2hpbGUgdGhlIGxhc3QgcmVjb3JkIHNheXMgYHJldHJ5YDogdGhlIHNlcmllcyBpcyBpbiBmbGlnaHQsIG9yIHRoZSBydW4ncyBzaWduYWwgY3V0IGl0cyB3YWl0XG4gICAqIChubyByZWNvcmQgZm9sbG93czsgb25seSB0aGUgZXhlY3V0aW9uIHRyZWUga25vd3MgaG93IGl0IGVuZGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IHN1bW1hcnk/OiBBdHRlbXB0U3VtbWFyeTtcbn1cblxuLyoqXG4gKiBQZXItc2VyaWVzIHRhbGxpZXMsIGtleWVkIGJ5IGBzZXJpZXNgLCBmb3IgdGhlIHNlcmllcyB0aGF0IGFyZSBldmlkZW5jZS4gYGFkZGAgcmV0dXJucyB0aGUgc2VyaWVzJyBzdGF0ZSBhZnRlclxuICogdGhlIHJlY29yZCwgb3IgYHVuZGVmaW5lZGAgZm9yIGEgcmVjb3JkIHRoYXQgaXMgbm90IGV2aWRlbmNlIChub3RoaW5nIHRvIGtlZXApLlxuICovXG5leHBvcnQgY2xhc3MgQXR0ZW1wdFNlcmllc0Jvb2sge1xuICBwcml2YXRlIHJlYWRvbmx5IGJ5U2VyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHsgcmVmczogQXR0ZW1wdFJlZltdOyBjb3VudHM6IFJlY29yZDxBdHRlbXB0T3V0Y29tZSwgbnVtYmVyPiB9PigpO1xuXG4gIGFkZChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiBBdHRlbXB0U2VyaWVzU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghaXNSZXRyeUV2aWRlbmNlKHJlY29yZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5ieVNlcmllcy5nZXQocmVjb3JkLnNlcmllcyk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgZW50cnkgPSB7IHJlZnM6IFtdLCBjb3VudHM6IGVtcHR5T3V0Y29tZUNvdW50cygpIH07XG4gICAgICB0aGlzLmJ5U2VyaWVzLnNldChyZWNvcmQuc2VyaWVzLCBlbnRyeSk7XG4gICAgfVxuICAgIGVudHJ5LnJlZnMucHVzaChhdHRlbXB0UmVmKHJlY29yZCkpO1xuICAgIGVudHJ5LmNvdW50c1tyZWNvcmQub3V0Y29tZV0gKz0gMTtcbiAgICBjb25zdCBhdHRlbXB0cyA9IFsuLi5lbnRyeS5yZWZzXTtcbiAgICBpZiAocmVjb3JkLm5leHQgPT09ICdyZXRyeScpIHJldHVybiB7IHNlcmllczogcmVjb3JkLnNlcmllcywgYXR0ZW1wdHMgfTtcbiAgICByZXR1cm4geyBzZXJpZXM6IHJlY29yZC5zZXJpZXMsIGF0dGVtcHRzLCBzdW1tYXJ5OiBzdW1tYXJ5T2YoZW50cnkucmVmcy5sZW5ndGgsIGVudHJ5LmNvdW50cywgcmVjb3JkKSB9O1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5ieVNlcmllcy5jbGVhcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1bW1hcnlPZihjb3VudDogbnVtYmVyLCBjb3VudHM6IFJlY29yZDxBdHRlbXB0T3V0Y29tZSwgbnVtYmVyPiwgbGFzdDogQXR0ZW1wdFJlY29yZCk6IEF0dGVtcHRTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBjb3VudCxcbiAgICAuLi5jb3VudHMsXG4gICAgbGFzdDoge1xuICAgICAgbmV4dDogbGFzdC5uZXh0IGFzIEF0dGVtcHRTdW1tYXJ5WydsYXN0J11bJ25leHQnXSxcbiAgICAgIHJlYXNvbjogbGFzdC5yZWFzb24sXG4gICAgICAuLi4obGFzdC5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkICYmIHsgY2F0ZWdvcnk6IGxhc3QuY2F0ZWdvcnkgfSksXG4gICAgICAuLi4obGFzdC5yZXRyeU9uVGhyZXcgJiYgeyByZXRyeU9uVGhyZXc6IHRydWUgYXMgY29uc3QgfSksXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -30,6 +30,7 @@
30
30
  *
31
31
  * Pinned by test/lib/recorder/hooks.test.ts (the `@ts-expect-error` probes).
32
32
  */
33
+ import type { RunCorrelation } from '../attempt/types.js';
33
34
  import type { FlowRecorder } from '../engine/narrative/types.js';
34
35
  import type { ErrorEvent, ScopeRecorder } from '../scope/types.js';
35
36
  import type { EmitRecorder } from './EmitRecorder.js';
@@ -174,6 +175,12 @@ export declare const HOOKS: {
174
175
  };
175
176
  readonly executorMade: false;
176
177
  };
178
+ readonly onAttempt: {
179
+ readonly on: {
180
+ readonly flow: "FlowAttemptEvent";
181
+ };
182
+ readonly executorMade: false;
183
+ };
177
184
  readonly onStageRetry: {
178
185
  readonly on: {
179
186
  readonly flow: "FlowStageRetryEvent";
@@ -240,6 +247,8 @@ export interface FailureSite {
240
247
  readonly stageId: string;
241
248
  readonly runtimeStageId: string;
242
249
  readonly pipelineId: string;
250
+ /** The run's correlation, when the site's events carry one — the failure event carries it too. */
251
+ readonly correlation?: RunCorrelation;
243
252
  }
244
253
  /**
245
254
  * THE scope-channel `onError` event for a recorder that threw in `hook` — built in ONE place
@@ -54,6 +54,8 @@ export const HOOKS = {
54
54
  onError: { on: { scope: 'ErrorEvent', flow: 'FlowErrorEvent' }, executorMade: false },
55
55
  onStageStart: { on: { scope: 'StageEvent' }, executorMade: false },
56
56
  onStageEnd: { on: { scope: 'StageEvent' }, executorMade: false },
57
+ // Every attempt of a declared retry policy (10.1): fires DURING a stage, once per attempt, before onStageRetry.
58
+ onAttempt: { on: { flow: 'FlowAttemptEvent' }, executorMade: false },
57
59
  // Declarative per-stage retry (9.15): fires DURING a stage, once per failed attempt that will be retried.
58
60
  onStageRetry: { on: { flow: 'FlowStageRetryEvent' }, executorMade: false },
59
61
  // Throttling (9.39.0, R9): a fork child's error the run's `throttlingErrorChecker` classified.
@@ -105,6 +107,7 @@ export function recorderFailureEvent(site, thrown, hook) {
105
107
  error: extractErrorInfo(thrown),
106
108
  operation: operationFor(hook),
107
109
  channel: 'scope',
110
+ ...(site.correlation && { correlation: site.correlation }),
108
111
  };
109
112
  }
110
113
  /**
@@ -153,4 +156,4 @@ export function fire(recorders, hook, event, onFailure = SWALLOW) {
153
156
  }
154
157
  }
155
158
  }
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9va3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2hvb2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWdEMUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQzNELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQzdELFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUU7SUFDeEUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUU7SUFDOUQsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRTtJQUN0RSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtB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ZWdpc3RyeSBhbmQgdGhlIG9uZSBkaXNwYXRjaGVyIChGNikuXG4gKlxuICogRXZlcnkgcmVjb3JkZXIgaG9vayBuYW1lIGlzIGRlY2xhcmVkIE9OQ0UsIGhlcmUsIGluIGBIT09LU2AuIEV2ZXJ5dGhpbmcgdGhhdCB1c2VkIHRvIGtlZXBcbiAqIGl0cyBvd24gaGFuZCBsaXN0IGRlcml2ZXMgZnJvbSBpdDpcbiAqXG4gKiAgIC0gY2hhbm5lbCByb3V0aW5nIChgQ29tYmluZWRSZWNvcmRlciDCtyBoYXMqUmVjb3JkZXJNZXRob2RzYCkgYXNrcyBgaG9va3NPbihjaGFubmVsKWAg4oCUIHRoZVxuICogICAgIHRocmVlIGhhbmQgbGlzdHMgaXQgcmVwbGFjZWQgKGBSRUNPUkRFUl9FVkVOVF9NRVRIT0RTYCwgYEZMT1df4oCmYCwgYEVNSVRf4oCmYCkgYXJlIGdvbmU7XG4gKiAgIC0gdGhlIGRlZmVycmVkIHRpZXIncyB0YXBzIChgRGVmZXJyZWRPYnNlcnZlclRpZXIgwrcgYnVpbGRTY29wZVRhcCAvIGJ1aWxkRmxvd1RhcGApIGl0ZXJhdGVcbiAqICAgICBgaG9va3NPbmA7XG4gKiAgIC0gYENvbXBvc2l0ZVJlY29yZGVyYCdzIGZhbi1vdXQgaXMgZ2VuZXJhdGVkIGZyb20gYEhPT0tfTkFNRVNgIChldmVyeSBob29rLCBldmVyeSBjaGFubmVsKS5cbiAqXG4gKiBgZmlyZWAgaXMgdGhlIG9uZSBwZXItcmVjb3JkZXIgbG9vcDogY2FsbCB0aGUgaG9vayBvbiBlYWNoIHJlY29yZGVyLCBhbmQgaGFuZCBhIHRocm93IHRvIHRoZVxuICogY2FsbGVyJ3MgZmFpbHVyZSBwb2xpY3kg4oCUIG5ldmVyIHRvIHRoZSBjYWxsZXIncyBjYWxsZXIuIFRoZSBlbmdpbmUga2VlcHMgaXRzIHR3byBwb2xpY2llc1xuICogKHRoZSBzY29wZSBjaGFubmVsIHJvdXRlcyBhIHRocm93IHRvIGV2ZXJ5IHJlY29yZGVyJ3MgYG9uRXJyb3JgOyB0aGUgZmxvdyBjaGFubmVsIHdhcm5zIGluXG4gKiBkZXYgbW9kZSBhbmQgbW92ZXMgb24pOyBgZmlyZWAgb25seSBndWFyYW50ZWVzIHRoYXQgd2hhdGV2ZXIgdGhlIHBvbGljeSBkb2VzLCB0aGUgbG9vcCBnb2VzXG4gKiBvbiBhbmQgbm90aGluZyBlc2NhcGVzLiBCb3Jyb3dlZDogQyMgYE11bHRpY2FzdERlbGVnYXRlYCAob25lIGludm9jYXRpb24gbGlzdCksIE9wZW5UZWxlbWV0cnlcbiAqIGBNdWx0aVNwYW5Qcm9jZXNzb3JgIChvbmUgZmFuLW91dCwgYSBmYWlsaW5nIHByb2Nlc3NvciBuZXZlciBzdG9wcyB0aGUgb3RoZXJzKS5cbiAqXG4gKiAjIyBUaGUgY29tcGlsZS10aW1lIGxhd1xuICpcbiAqIGBIT09LU2AgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSB0aHJlZSByZWNvcmRlciBpbnRlcmZhY2VzIGluIEJPVEggZGlyZWN0aW9uczpcbiAqXG4gKiAgIC0gYSBob29rIGFkZGVkIHRvIGBTY29wZVJlY29yZGVyYCAvIGBGbG93UmVjb3JkZXJgIC8gYEVtaXRSZWNvcmRlcmAgYW5kIG5vdCB0byBgSE9PS1NgIGlzIGFcbiAqICAgICBtaXNzaW5nIHByb3BlcnR5IG9mIHRoZSBgc2F0aXNmaWVzYCBjbGF1c2Ug4oCUIGl0IGRvZXMgbm90IGNvbXBpbGU7XG4gKiAgIC0gYSBob29rIGFkZGVkIHRvIG9uZSBpbnRlcmZhY2UgdGhhdCBgSE9PS1NgIGxpc3RzIG9uIGFub3RoZXIgY2hhbm5lbCBvbmx5IGlzIGEgbWlzc2luZ1xuICogICAgIGtleSBvZiB0aGF0IGVudHJ5J3MgYG9uYCDigJQgaXQgZG9lcyBub3QgY29tcGlsZTtcbiAqICAgLSBhbiBlbnRyeSBuYW1pbmcgYSBjaGFubmVsIHdob3NlIGludGVyZmFjZSBkb2VzIG5vdCBkZWNsYXJlIGl0IGlzIGFuIGV4Y2VzcyBwcm9wZXJ0eSDigJRcbiAqICAgICBpdCBkb2VzIG5vdCBjb21waWxlLlxuICpcbiAqIFBpbm5lZCBieSB0ZXN0L2xpYi9yZWNvcmRlci9ob29rcy50ZXN0LnRzICh0aGUgYEB0cy1leHBlY3QtZXJyb3JgIHByb2JlcykuXG4gKi9cblxuaW1wb3J0IHsgaW52b2tlUmVjb3JkZXJIb29rIH0gZnJvbSAnLi4vY2FwdHVyZS9pbnZva2VIb29rLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgRXJyb3JFdmVudCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9FbWl0UmVjb3JkZXIuanMnO1xuXG4vKiogTWVtYmVycyBldmVyeSByZWNvcmRlciBpbnRlcmZhY2Ugc2hhcmVzIHRoYXQgYXJlIE5PVCBldmVudHMuICovXG50eXBlIExpZmVjeWNsZSA9ICdpZCcgfCAnY2xlYXInIHwgJ3RvU25hcHNob3QnO1xuXG4vKiogSG9va3Mgb2YgdGhlIGVtaXQgY2hhbm5lbCAoYEVtaXRSZWNvcmRlcmApLiAqL1xuZXhwb3J0IHR5cGUgRW1pdEhvb2tOYW1lID0gRXhjbHVkZTxrZXlvZiBFbWl0UmVjb3JkZXIsIExpZmVjeWNsZT47XG4vKiogSG9va3Mgb2YgdGhlIHNjb3BlIChkYXRhLWZsb3cpIGNoYW5uZWwuIGBTY29wZVJlY29yZGVyYCBhbHNvIGRlY2xhcmVzIGBvbkVtaXRgIOKAlCB0aGUgZW1pdFxuICogIGNoYW5uZWwgcmlkZXMgdGhlIHNjb3BlIGxpc3Qg4oCUIHNvIGl0IGlzIHN1YnRyYWN0ZWQgaGVyZSBhbmQgY291bnRlZCBvbiBgZW1pdGAuICovXG5leHBvcnQgdHlwZSBTY29wZUhvb2tOYW1lID0gRXhjbHVkZTxrZXlvZiBTY29wZVJlY29yZGVyLCBMaWZlY3ljbGUgfCBFbWl0SG9va05hbWU+O1xuLyoqIEhvb2tzIG9mIHRoZSBmbG93IChjb250cm9sLWZsb3cpIGNoYW5uZWwuICovXG5leHBvcnQgdHlwZSBGbG93SG9va05hbWUgPSBFeGNsdWRlPGtleW9mIEZsb3dSZWNvcmRlciwgTGlmZWN5Y2xlPjtcbi8qKiBFdmVyeSByZWNvcmRlciBob29rLCBvbiBhbnkgY2hhbm5lbC4gKi9cbmV4cG9ydCB0eXBlIEhvb2tOYW1lID0gU2NvcGVIb29rTmFtZSB8IEZsb3dIb29rTmFtZSB8IEVtaXRIb29rTmFtZTtcbi8qKiBUaGUgdGhyZWUgcnVudGltZSBjaGFubmVscyAodGhlIGJ1aWxkLXRpbWUgc3RydWN0dXJlIGNoYW5uZWwgZmlyZXMgaXRzIGhvb2tzIGJ5IG5hbWUpLiAqL1xuZXhwb3J0IHR5cGUgSG9va0NoYW5uZWwgPSAnc2NvcGUnIHwgJ2Zsb3cnIHwgJ2VtaXQnO1xuXG4vKiogVGhlIGNoYW5uZWxzIHdob3NlIGludGVyZmFjZSBERUNMQVJFUyBob29rIGBLYCDigJQgd2hhdCBhbiBlbnRyeSdzIGBvbmAgbXVzdCBuYW1lIGV4YWN0bHkuICovXG5leHBvcnQgdHlwZSBDaGFubmVsc09mPEsgZXh0ZW5kcyBIb29rTmFtZT4gPVxuICB8IChLIGV4dGVuZHMgU2NvcGVIb29rTmFtZSA/ICdzY29wZScgOiBuZXZlcilcbiAgfCAoSyBleHRlbmRzIEZsb3dIb29rTmFtZSA/ICdmbG93JyA6IG5ldmVyKVxuICB8IChLIGV4dGVuZHMgRW1pdEhvb2tOYW1lID8gJ2VtaXQnIDogbmV2ZXIpO1xuXG50eXBlIFBheWxvYWRPZjxJLCBLPiA9IEsgZXh0ZW5kcyBrZXlvZiBJID8gKE5vbk51bGxhYmxlPElbS10+IGV4dGVuZHMgKGV2ZW50OiBpbmZlciBFKSA9PiB1bmtub3duID8gRSA6IG5ldmVyKSA6IG5ldmVyO1xudHlwZSBDaGFubmVsSW50ZXJmYWNlID0geyBzY29wZTogU2NvcGVSZWNvcmRlcjsgZmxvdzogRmxvd1JlY29yZGVyOyBlbWl0OiBFbWl0UmVjb3JkZXIgfTtcblxuLyoqIFRoZSBwYXlsb2FkIGhvb2sgYEtgIHJlY2VpdmVzIG9uIGNoYW5uZWwgYENgIOKAlCByZWFkIG9mZiB0aGUgY2hhbm5lbCdzIGludGVyZmFjZSwgbmV2ZXIgcmVzdGF0ZWQuICovXG5leHBvcnQgdHlwZSBIb29rUGF5bG9hZDxLIGV4dGVuZHMgSG9va05hbWUsIEMgZXh0ZW5kcyBDaGFubmVsc09mPEs+ID0gQ2hhbm5lbHNPZjxLPj4gPSBDIGV4dGVuZHMgSG9va0NoYW5uZWxcbiAgPyBQYXlsb2FkT2Y8Q2hhbm5lbEludGVyZmFjZVtDXSwgSz5cbiAgOiBuZXZlcjtcblxuLyoqXG4gKiBPbmUgcmVnaXN0cnkgZW50cnkuXG4gKlxuICogLSBgb25gIOKAlCBldmVyeSBjaGFubmVsIHRoZSBob29rIGlzIGRlY2xhcmVkIG9uLCBlYWNoIG1hcHBlZCB0byB0aGUgTkFNRSBvZiBpdHMgcGF5bG9hZCB0eXBlXG4gKiAgIChwcm9zZSBmb3IgcmVhZGVyczsgdGhlIHR5cGUgaXRzZWxmIGlzIGBIb29rUGF5bG9hZDxLLCBDPmAsIHJlYWQgb2ZmIHRoZSBpbnRlcmZhY2UpLlxuICogLSBgZXhlY3V0b3JNYWRlYCDigJQgYSBMQUJFTCAocmVhZCBieSB0ZXN0cyBhbmQgZG9jcywgbm90IGJ5IHJvdXRpbmcpOiBgdHJ1ZWAgd2hlbiB0aGUgZXhlY3V0b3Igc3ludGhlc2l6ZXMgdGhlIGV2ZW50IGl0c2VsZiBpbnN0ZWFkIG9mIGFcbiAqICAgZGlzcGF0Y2ggc2l0ZSBpbiB0aGUgZW5naW5lICh0b2RheSBvbmx5IGBvblJlc3VtZWAsIGZpcmVkIGJ5IGBydW5uZXIvcmVzdW1lLnRzIMK3IGFubm91bmNlUmVzdW1lYCkuXG4gKiAgIFN1Y2ggYW4gZXZlbnQgZ29lcyB0aHJvdWdoIGBmaXJlYCBsaWtlIGV2ZXJ5IG90aGVyLCBzbyBhIHRocm93aW5nIHJlY29yZGVyIG5ldmVyIGFib3J0c1xuICogICB0aGUgZXhlY3V0b3IgY2FsbCB0aGF0IG1hZGUgaXQuXG4gKi9cbmV4cG9ydCB0eXBlIEhvb2tTcGVjPEsgZXh0ZW5kcyBIb29rTmFtZT4gPSB7XG4gIHJlYWRvbmx5IG9uOiB7IHJlYWRvbmx5IFtDIGluIENoYW5uZWxzT2Y8Sz5dOiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgZXhlY3V0b3JNYWRlOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBUSEUgcmVnaXN0cnkuIEtleSBvcmRlciBpcyB0aGUgb3JkZXIgZXZlcnkgZGVyaXZlZCBsaXN0IGtlZXBzOiBgaG9va3NPbihjaGFubmVsKWAgaXMgYW5cbiAqIG9yZGVyLXByZXNlcnZpbmcgZmlsdGVyIG9mIGl0LCBpZGVudGljYWwgdG8gdGhlIDkuMzUuMCBoYW5kLXdyaXR0ZW4gbGlzdHMgaXQgcmVwbGFjZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBIT09LUyA9IHtcbiAgb25SZWFkOiB7IG9uOiB7IHNjb3BlOiAnUmVhZEV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uV3JpdGU6IHsgb246IHsgc2NvcGU6ICdXcml0ZUV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uQ29tbWl0OiB7IG9uOiB7IHNjb3BlOiAnQ29tbWl0RXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25TdGFnZUV4ZWN1dGVkOiB7IG9uOiB7IGZsb3c6ICdGbG93U3RhZ2VFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvbk5leHQ6IHsgb246IHsgZmxvdzogJ0Zsb3dOZXh0RXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25EZWNpc2lvbjogeyBvbjogeyBmbG93OiAnRmxvd0RlY2lzaW9uRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25Gb3JrOiB7IG9uOiB7IGZsb3c6ICdGbG93Rm9ya0V2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uU2VsZWN0ZWQ6IHsgb246IHsgZmxvdzogJ0Zsb3dTZWxlY3RlZEV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uU3ViZmxvd0VudHJ5OiB7IG9uOiB7IGZsb3c6ICdGbG93U3ViZmxvd0V2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uU3ViZmxvd0V4aXQ6IHsgb246IHsgZmxvdzogJ0Zsb3dTdWJmbG93RXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25TdWJmbG93UmVnaXN0ZXJlZDogeyBvbjogeyBmbG93OiAnRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25Mb29wOiB7IG9uOiB7IGZsb3c6ICdGbG93TG9vcEV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uQnJlYWs6IHsgb246IHsgZmxvdzogJ0Zsb3dCcmVha0V2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uRXJyb3I6IHsgb246IHsgc2NvcGU6ICdFcnJvckV2ZW50JywgZmxvdzogJ0Zsb3dFcnJvckV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uU3RhZ2VTdGFydDogeyBvbjogeyBzY29wZTogJ1N0YWdlRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25TdGFnZUVuZDogeyBvbjogeyBzY29wZTogJ1N0YWdlRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgLy8gRGVjbGFyYXRpdmUgcGVyLXN0YWdlIHJldHJ5ICg5LjE1KTogZmlyZXMgRFVSSU5HIGEgc3RhZ2UsIG9uY2UgcGVyIGZhaWxlZCBhdHRlbXB0IHRoYXQgd2lsbCBiZSByZXRyaWVkLlxuICBvblN0YWdlUmV0cnk6IHsgb246IHsgZmxvdzogJ0Zsb3dTdGFnZVJldHJ5RXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgLy8gVGhyb3R0bGluZyAoOS4zOS4wLCBSOSk6IGEgZm9yayBjaGlsZCdzIGVycm9yIHRoZSBydW4ncyBgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcmAgY2xhc3NpZmllZC5cbiAgb25UaHJvdHRsZWQ6IHsgb246IHsgZmxvdzogJ0Zsb3dUaHJvdHRsZWRFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvblBhdXNlOiB7IG9uOiB7IHNjb3BlOiAnUGF1c2VFdmVudCcsIGZsb3c6ICdGbG93UGF1c2VFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvblJlc3VtZTogeyBvbjogeyBzY29wZTogJ1Jlc3VtZUV2ZW50JywgZmxvdzogJ0Zsb3dSZXN1bWVFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiB0cnVlIH0sXG4gIC8vIFJ1biBib3VuZGFyaWVzIOKAlCBsaXN0ZWQgc28gYSByZWNvcmRlciB3aG9zZSBPTkxZIGhvb2sgaXMgb25lIG9mIHRoZW0gc3RpbGwgcm91dGVzIHRvIHRoZSBmbG93IGNoYW5uZWwuXG4gIG9uUnVuU3RhcnQ6IHsgb246IHsgZmxvdzogJ0Zsb3dSdW5FdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvblJ1bkVuZDogeyBvbjogeyBmbG93OiAnRmxvd1J1bkV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uUnVuRmFpbGVkOiB7IG9uOiB7IGZsb3c6ICdGbG93UnVuRmFpbGVkRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25FbWl0OiB7IG9uOiB7IGVtaXQ6ICdFbWl0RXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIHsgcmVhZG9ubHkgW0sgaW4gSG9va05hbWVdOiBIb29rU3BlYzxLPiB9O1xuXG4vKiogRXZlcnkgaG9vayBuYW1lLCBpbiByZWdpc3RyeSBvcmRlci4gKi9cbmV4cG9ydCBjb25zdCBIT09LX05BTUVTID0gT2JqZWN0LmZyZWV6ZShPYmplY3Qua2V5cyhIT09LUykpIGFzIHJlYWRvbmx5IEhvb2tOYW1lW107XG5cbi8qKiBUaGUgaG9va3MgZGVjbGFyZWQgb24gYGNoYW5uZWxgLCBpbiByZWdpc3RyeSBvcmRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob29rc09uKGNoYW5uZWw6ICdzY29wZScpOiByZWFkb25seSBTY29wZUhvb2tOYW1lW107XG5leHBvcnQgZnVuY3Rpb24gaG9va3NPbihjaGFubmVsOiAnZmxvdycpOiByZWFkb25seSBGbG93SG9va05hbWVbXTtcbmV4cG9ydCBmdW5jdGlvbiBob29rc09uKGNoYW5uZWw6ICdlbWl0Jyk6IHJlYWRvbmx5IEVtaXRIb29rTmFtZVtdO1xuZXhwb3J0IGZ1bmN0aW9uIGhvb2tzT24oY2hhbm5lbDogSG9va0NoYW5uZWwpOiByZWFkb25seSBIb29rTmFtZVtdO1xuZXhwb3J0IGZ1bmN0aW9uIGhvb2tzT24oY2hhbm5lbDogSG9va0NoYW5uZWwpOiByZWFkb25seSBIb29rTmFtZVtdIHtcbiAgcmV0dXJuIEJZX0NIQU5ORUxbY2hhbm5lbF07XG59XG5cbmNvbnN0IGRlY2xhcmVkT24gPSAoY2hhbm5lbDogSG9va0NoYW5uZWwpID0+XG4gIE9iamVjdC5mcmVlemUoSE9PS19OQU1FUy5maWx0ZXIoKGhvb2spID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChIT09LU1tob29rXS5vbiwgY2hhbm5lbCkpKTtcbi8qKiBDb21wdXRlZCBvbmNlIGF0IGxvYWQg4oCUIHJvdXRpbmcgYXNrcyBvbiBldmVyeSBhdHRhY2gsIHRoZSB0YXBzIG9uIGV2ZXJ5IHRyYXZlcnNlci4gKi9cbmNvbnN0IEJZX0NIQU5ORUw6IFJlYWRvbmx5PFJlY29yZDxIb29rQ2hhbm5lbCwgcmVhZG9ubHkgSG9va05hbWVbXT4+ID0ge1xuICBzY29wZTogZGVjbGFyZWRPbignc2NvcGUnKSxcbiAgZmxvdzogZGVjbGFyZWRPbignZmxvdycpLFxuICBlbWl0OiBkZWNsYXJlZE9uKCdlbWl0JyksXG59O1xuXG4vKiogVGhlIHNjb3BlLWNoYW5uZWwgZXJyb3Igb3BlcmF0aW9uIGEgZmFpbGluZyBob29rIGlzIHJlcG9ydGVkIHVuZGVyIChgRXJyb3JFdmVudC5vcGVyYXRpb25gKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRpb25Gb3IoaG9vazogc3RyaW5nKTogJ3JlYWQnIHwgJ3dyaXRlJyB8ICdjb21taXQnIHtcbiAgaWYgKGhvb2sgPT09ICdvblJlYWQnKSByZXR1cm4gJ3JlYWQnO1xuICBpZiAoaG9vayA9PT0gJ29uQ29tbWl0JykgcmV0dXJuICdjb21taXQnO1xuICByZXR1cm4gJ3dyaXRlJztcbn1cblxuLyoqIFdoZXJlIGEgcmVjb3JkZXIgZmFpbHVyZSBpcyByZXBvcnRlZCBGUk9NIOKAlCB0aGUgc3RhZ2UgKG9yIHN5bnRoZXNpemVkIGV2ZW50KSB3aG9zZSBob29rIHRocmV3LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWlsdXJlU2l0ZSB7XG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFnZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUSEUgc2NvcGUtY2hhbm5lbCBgb25FcnJvcmAgZXZlbnQgZm9yIGEgcmVjb3JkZXIgdGhhdCB0aHJldyBpbiBgaG9va2Ag4oCUIGJ1aWx0IGluIE9ORSBwbGFjZVxuICogZm9yIGV2ZXJ5IHBhdGggdGhhdCByZXBvcnRzIG9uZTogdGhlIGlubGluZSBmYWNhZGUgKGBTY29wZUZhY2FkZSDCtyBfcm91dGVGYWlsdXJlYCksIHRoZVxuICogZXhlY3V0b3IncyBvd24gYG9uUmVzdW1lYCAoYHJ1bm5lci9yZXN1bWUudHMgwrcgYW5ub3VuY2VSZXN1bWVgKSBhbmQgZGVmZXJyZWQgZGVsaXZlcnlcbiAqIChgRGVmZXJyZWRPYnNlcnZlclRpZXIgwrcgcm91dGVMaXN0ZW5lckVycm9yYCkuIGBlcnJvcmAgaXMgdGhlIHN0cnVjdHVyZWQgZm9ybVxuICogKGBleHRyYWN0RXJyb3JJbmZvYDogYG1lc3NhZ2VgLCBgbmFtZWAsIGBjb2RlP2AsIGByYXdgID0gdGhlIHRocm93biB2YWx1ZSBpdHNlbGYpIHdoYXRldmVyXG4gKiB3YXMgdGhyb3duIOKAlCBhbiBgRXJyb3JgLCBhIHN0cmluZywgYW55dGhpbmcgKDkuMzkuMDsgYmVmb3JlLCB0aGUgaW5saW5lIHBhdGhzIHBhc3NlZCB0aGUgcmF3XG4gKiB0aHJvd24gdmFsdWUgYW5kIHRoZSBkZWZlcnJlZCB0aWVyIHdyYXBwZWQgaXQgaW4gYG5ldyBFcnJvciguLi4pYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRlckZhaWx1cmVFdmVudChzaXRlOiBGYWlsdXJlU2l0ZSwgdGhyb3duOiB1bmtub3duLCBob29rOiBzdHJpbmcpOiBFcnJvckV2ZW50IHtcbiAgcmV0dXJuIHtcbiAgICBzdGFnZU5hbWU6IHNpdGUuc3RhZ2VOYW1lLFxuICAgIHN0YWdlSWQ6IHNpdGUuc3RhZ2VJZCxcbiAgICBydW50aW1lU3RhZ2VJZDogc2l0ZS5ydW50aW1lU3RhZ2VJZCxcbiAgICBwaXBlbGluZUlkOiBzaXRlLnBpcGVsaW5lSWQsXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIGVycm9yOiBleHRyYWN0RXJyb3JJbmZvKHRocm93biksXG4gICAgb3BlcmF0aW9uOiBvcGVyYXRpb25Gb3IoaG9vayksXG4gICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgfTtcbn1cblxuLyoqXG4gKiBUZXh0IGZvciBhbnl0aGluZyBhIHJlY29yZGVyIHRocmV3LiBgJHtlcnJ9YCB0aHJvd3Mgb24gYSBudWxsLXByb3RvdHlwZSBvYmplY3QgKG5vXG4gKiBgdG9TdHJpbmdgKSBhbmQgb24gYSBzeW1ib2wg4oCUIGFuZCBhIHRocm93IGluc2lkZSB0aGUgaXNvbGF0aW9uIHdvdWxkIGVzY2FwZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlVGhyb3duKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcnJvcik7XG4gIH1cbn1cblxuLyoqIFdoYXQgdG8gZG8gd2l0aCBhIHJlY29yZGVyJ3MgdGhyb3cuIEl0cyBvd24gdGhyb3cgaXMgc3dhbGxvd2VkIGJ5IGBmaXJlYC4gKi9cbmV4cG9ydCB0eXBlIEhvb2tGYWlsdXJlID0gKGVycm9yOiB1bmtub3duLCByZWNvcmRlcjogb2JqZWN0LCBob29rOiBIb29rTmFtZSkgPT4gdm9pZDtcblxuLyoqXG4gKiBUaGUgZmxvdyBjaGFubmVsJ3MgcG9saWN5LCB2ZXJiYXRpbSBzaW5jZSA5LjA6IHdhcm4gaW4gZGV2IG1vZGUsIG90aGVyd2lzZSBzYXkgbm90aGluZy5cbiAqIGBzb3VyY2VgIG5hbWVzIHRoZSBkaXNwYXRjaGVyIGluIHRoZSB3YXJuaW5nIChgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcmAsIGBGbG93Q2hhcnRFeGVjdXRvcmApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FybkluRGV2TW9kZShzb3VyY2U6IHN0cmluZyk6IEhvb2tGYWlsdXJlIHtcbiAgcmV0dXJuIChlcnJvciwgcmVjb3JkZXIsIGhvb2spID0+IHtcbiAgICBpZiAoIWlzRGV2TW9kZSgpKSByZXR1cm47XG4gICAgY29uc3QgaWQgPSAocmVjb3JkZXIgYXMgeyBpZD86IHVua25vd24gfSkuaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oYFtmb290cHJpbnRdICR7c291cmNlfTogcmVjb3JkZXIgXCIke1N0cmluZyhpZCl9XCIgdGhyZXcgaW4gJHtob29rfTogJHtkZXNjcmliZVRocm93bihlcnJvcil9YCk7XG4gIH07XG59XG5cbmNvbnN0IFNXQUxMT1c6IEhvb2tGYWlsdXJlID0gKCkgPT4gdW5kZWZpbmVkO1xuXG4vKipcbiAqIENhbGwgYGhvb2tgIG9uIGV2ZXJ5IHJlY29yZGVyIHRoYXQgaW1wbGVtZW50cyBpdCAobm9ybWFsIHByb3BlcnR5IGxvb2t1cCwgYHRoaXNgIGJvdW5kIOKAlFxuICogYGludm9rZVJlY29yZGVySG9va2ApLCBpbiBvcmRlci4gQSB0aHJvdyBnb2VzIHRvIGBvbkZhaWx1cmVgIGFuZCB0aGUgbG9vcCBjb250aW51ZXM7IGFcbiAqIHRocm93IEZST00gYG9uRmFpbHVyZWAgaXMgc3dhbGxvd2VkLiBOb3RoaW5nIGEgcmVjb3JkZXIgZG9lcyBjYW4gcmVhY2ggdGhlIGNhbGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpcmU8SyBleHRlbmRzIEhvb2tOYW1lPihcbiAgcmVjb3JkZXJzOiBJdGVyYWJsZTxvYmplY3Q+LFxuICBob29rOiBLLFxuICBldmVudDogSG9va1BheWxvYWQ8Sz4sXG4gIG9uRmFpbHVyZTogSG9va0ZhaWx1cmUgPSBTV0FMTE9XLFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcmVjb3JkZXIgb2YgcmVjb3JkZXJzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGludm9rZVJlY29yZGVySG9vayhyZWNvcmRlciwgaG9vaywgZXZlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvbkZhaWx1cmUoZXJyb3IsIHJlY29yZGVyLCBob29rKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbiBpc29sYXRpb24gdGhhdCB0aHJvd3MgaXMgaXRzZWxmIGlzb2xhdGVkIOKAlCByZWNvcmRlciBlcnJvcnMgbmV2ZXIgcmVhY2ggdGhlIHJ1bi5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9va3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2hvb2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBR0gsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWdEMUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQzNELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQzdELFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUU7SUFDeEUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUU7SUFDOUQsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRTtJQUN0RSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtB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SyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLHFGQUFxRjtZQUN2RixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWNvcmRlci9ob29rcy50cyDigJQgdGhlIGhvb2sgcmVnaXN0cnkgYW5kIHRoZSBvbmUgZGlzcGF0Y2hlciAoRjYpLlxuICpcbiAqIEV2ZXJ5IHJlY29yZGVyIGhvb2sgbmFtZSBpcyBkZWNsYXJlZCBPTkNFLCBoZXJlLCBpbiBgSE9PS1NgLiBFdmVyeXRoaW5nIHRoYXQgdXNlZCB0byBrZWVwXG4gKiBpdHMgb3duIGhhbmQgbGlzdCBkZXJpdmVzIGZyb20gaXQ6XG4gKlxuICogICAtIGNoYW5uZWwgcm91dGluZyAoYENvbWJpbmVkUmVjb3JkZXIgwrcgaGFzKlJlY29yZGVyTWV0aG9kc2ApIGFza3MgYGhvb2tzT24oY2hhbm5lbClgIOKAlCB0aGVcbiAqICAgICB0aHJlZSBoYW5kIGxpc3RzIGl0IHJlcGxhY2VkIChgUkVDT1JERVJfRVZFTlRfTUVUSE9EU2AsIGBGTE9XX+KApmAsIGBFTUlUX+KApmApIGFyZSBnb25lO1xuICogICAtIHRoZSBkZWZlcnJlZCB0aWVyJ3MgdGFwcyAoYERlZmVycmVkT2JzZXJ2ZXJUaWVyIMK3IGJ1aWxkU2NvcGVUYXAgLyBidWlsZEZsb3dUYXBgKSBpdGVyYXRlXG4gKiAgICAgYGhvb2tzT25gO1xuICogICAtIGBDb21wb3NpdGVSZWNvcmRlcmAncyBmYW4tb3V0IGlzIGdlbmVyYXRlZCBmcm9tIGBIT09LX05BTUVTYCAoZXZlcnkgaG9vaywgZXZlcnkgY2hhbm5lbCkuXG4gKlxuICogYGZpcmVgIGlzIHRoZSBvbmUgcGVyLXJlY29yZGVyIGxvb3A6IGNhbGwgdGhlIGhvb2sgb24gZWFjaCByZWNvcmRlciwgYW5kIGhhbmQgYSB0aHJvdyB0byB0aGVcbiAqIGNhbGxlcidzIGZhaWx1cmUgcG9saWN5IOKAlCBuZXZlciB0byB0aGUgY2FsbGVyJ3MgY2FsbGVyLiBUaGUgZW5naW5lIGtlZXBzIGl0cyB0d28gcG9saWNpZXNcbiAqICh0aGUgc2NvcGUgY2hhbm5lbCByb3V0ZXMgYSB0aHJvdyB0byBldmVyeSByZWNvcmRlcidzIGBvbkVycm9yYDsgdGhlIGZsb3cgY2hhbm5lbCB3YXJucyBpblxuICogZGV2IG1vZGUgYW5kIG1vdmVzIG9uKTsgYGZpcmVgIG9ubHkgZ3VhcmFudGVlcyB0aGF0IHdoYXRldmVyIHRoZSBwb2xpY3kgZG9lcywgdGhlIGxvb3AgZ29lc1xuICogb24gYW5kIG5vdGhpbmcgZXNjYXBlcy4gQm9ycm93ZWQ6IEMjIGBNdWx0aWNhc3REZWxlZ2F0ZWAgKG9uZSBpbnZvY2F0aW9uIGxpc3QpLCBPcGVuVGVsZW1ldHJ5XG4gKiBgTXVsdGlTcGFuUHJvY2Vzc29yYCAob25lIGZhbi1vdXQsIGEgZmFpbGluZyBwcm9jZXNzb3IgbmV2ZXIgc3RvcHMgdGhlIG90aGVycykuXG4gKlxuICogIyMgVGhlIGNvbXBpbGUtdGltZSBsYXdcbiAqXG4gKiBgSE9PS1NgIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgdGhyZWUgcmVjb3JkZXIgaW50ZXJmYWNlcyBpbiBCT1RIIGRpcmVjdGlvbnM6XG4gKlxuICogICAtIGEgaG9vayBhZGRlZCB0byBgU2NvcGVSZWNvcmRlcmAgLyBgRmxvd1JlY29yZGVyYCAvIGBFbWl0UmVjb3JkZXJgIGFuZCBub3QgdG8gYEhPT0tTYCBpcyBhXG4gKiAgICAgbWlzc2luZyBwcm9wZXJ0eSBvZiB0aGUgYHNhdGlzZmllc2AgY2xhdXNlIOKAlCBpdCBkb2VzIG5vdCBjb21waWxlO1xuICogICAtIGEgaG9vayBhZGRlZCB0byBvbmUgaW50ZXJmYWNlIHRoYXQgYEhPT0tTYCBsaXN0cyBvbiBhbm90aGVyIGNoYW5uZWwgb25seSBpcyBhIG1pc3NpbmdcbiAqICAgICBrZXkgb2YgdGhhdCBlbnRyeSdzIGBvbmAg4oCUIGl0IGRvZXMgbm90IGNvbXBpbGU7XG4gKiAgIC0gYW4gZW50cnkgbmFtaW5nIGEgY2hhbm5lbCB3aG9zZSBpbnRlcmZhY2UgZG9lcyBub3QgZGVjbGFyZSBpdCBpcyBhbiBleGNlc3MgcHJvcGVydHkg4oCUXG4gKiAgICAgaXQgZG9lcyBub3QgY29tcGlsZS5cbiAqXG4gKiBQaW5uZWQgYnkgdGVzdC9saWIvcmVjb3JkZXIvaG9va3MudGVzdC50cyAodGhlIGBAdHMtZXhwZWN0LWVycm9yYCBwcm9iZXMpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUnVuQ29ycmVsYXRpb24gfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB7IGludm9rZVJlY29yZGVySG9vayB9IGZyb20gJy4uL2NhcHR1cmUvaW52b2tlSG9vay5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRXZlbnQsIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRSZWNvcmRlciB9IGZyb20gJy4vRW1pdFJlY29yZGVyLmpzJztcblxuLyoqIE1lbWJlcnMgZXZlcnkgcmVjb3JkZXIgaW50ZXJmYWNlIHNoYXJlcyB0aGF0IGFyZSBOT1QgZXZlbnRzLiAqL1xudHlwZSBMaWZlY3ljbGUgPSAnaWQnIHwgJ2NsZWFyJyB8ICd0b1NuYXBzaG90JztcblxuLyoqIEhvb2tzIG9mIHRoZSBlbWl0IGNoYW5uZWwgKGBFbWl0UmVjb3JkZXJgKS4gKi9cbmV4cG9ydCB0eXBlIEVtaXRIb29rTmFtZSA9IEV4Y2x1ZGU8a2V5b2YgRW1pdFJlY29yZGVyLCBMaWZlY3ljbGU+O1xuLyoqIEhvb2tzIG9mIHRoZSBzY29wZSAoZGF0YS1mbG93KSBjaGFubmVsLiBgU2NvcGVSZWNvcmRlcmAgYWxzbyBkZWNsYXJlcyBgb25FbWl0YCDigJQgdGhlIGVtaXRcbiAqICBjaGFubmVsIHJpZGVzIHRoZSBzY29wZSBsaXN0IOKAlCBzbyBpdCBpcyBzdWJ0cmFjdGVkIGhlcmUgYW5kIGNvdW50ZWQgb24gYGVtaXRgLiAqL1xuZXhwb3J0IHR5cGUgU2NvcGVIb29rTmFtZSA9IEV4Y2x1ZGU8a2V5b2YgU2NvcGVSZWNvcmRlciwgTGlmZWN5Y2xlIHwgRW1pdEhvb2tOYW1lPjtcbi8qKiBIb29rcyBvZiB0aGUgZmxvdyAoY29udHJvbC1mbG93KSBjaGFubmVsLiAqL1xuZXhwb3J0IHR5cGUgRmxvd0hvb2tOYW1lID0gRXhjbHVkZTxrZXlvZiBGbG93UmVjb3JkZXIsIExpZmVjeWNsZT47XG4vKiogRXZlcnkgcmVjb3JkZXIgaG9vaywgb24gYW55IGNoYW5uZWwuICovXG5leHBvcnQgdHlwZSBIb29rTmFtZSA9IFNjb3BlSG9va05hbWUgfCBGbG93SG9va05hbWUgfCBFbWl0SG9va05hbWU7XG4vKiogVGhlIHRocmVlIHJ1bnRpbWUgY2hhbm5lbHMgKHRoZSBidWlsZC10aW1lIHN0cnVjdHVyZSBjaGFubmVsIGZpcmVzIGl0cyBob29rcyBieSBuYW1lKS4gKi9cbmV4cG9ydCB0eXBlIEhvb2tDaGFubmVsID0gJ3Njb3BlJyB8ICdmbG93JyB8ICdlbWl0JztcblxuLyoqIFRoZSBjaGFubmVscyB3aG9zZSBpbnRlcmZhY2UgREVDTEFSRVMgaG9vayBgS2Ag4oCUIHdoYXQgYW4gZW50cnkncyBgb25gIG11c3QgbmFtZSBleGFjdGx5LiAqL1xuZXhwb3J0IHR5cGUgQ2hhbm5lbHNPZjxLIGV4dGVuZHMgSG9va05hbWU+ID1cbiAgfCAoSyBleHRlbmRzIFNjb3BlSG9va05hbWUgPyAnc2NvcGUnIDogbmV2ZXIpXG4gIHwgKEsgZXh0ZW5kcyBGbG93SG9va05hbWUgPyAnZmxvdycgOiBuZXZlcilcbiAgfCAoSyBleHRlbmRzIEVtaXRIb29rTmFtZSA/ICdlbWl0JyA6IG5ldmVyKTtcblxudHlwZSBQYXlsb2FkT2Y8SSwgSz4gPSBLIGV4dGVuZHMga2V5b2YgSSA/IChOb25OdWxsYWJsZTxJW0tdPiBleHRlbmRzIChldmVudDogaW5mZXIgRSkgPT4gdW5rbm93biA/IEUgOiBuZXZlcikgOiBuZXZlcjtcbnR5cGUgQ2hhbm5lbEludGVyZmFjZSA9IHsgc2NvcGU6IFNjb3BlUmVjb3JkZXI7IGZsb3c6IEZsb3dSZWNvcmRlcjsgZW1pdDogRW1pdFJlY29yZGVyIH07XG5cbi8qKiBUaGUgcGF5bG9hZCBob29rIGBLYCByZWNlaXZlcyBvbiBjaGFubmVsIGBDYCDigJQgcmVhZCBvZmYgdGhlIGNoYW5uZWwncyBpbnRlcmZhY2UsIG5ldmVyIHJlc3RhdGVkLiAqL1xuZXhwb3J0IHR5cGUgSG9va1BheWxvYWQ8SyBleHRlbmRzIEhvb2tOYW1lLCBDIGV4dGVuZHMgQ2hhbm5lbHNPZjxLPiA9IENoYW5uZWxzT2Y8Sz4+ID0gQyBleHRlbmRzIEhvb2tDaGFubmVsXG4gID8gUGF5bG9hZE9mPENoYW5uZWxJbnRlcmZhY2VbQ10sIEs+XG4gIDogbmV2ZXI7XG5cbi8qKlxuICogT25lIHJlZ2lzdHJ5IGVudHJ5LlxuICpcbiAqIC0gYG9uYCDigJQgZXZlcnkgY2hhbm5lbCB0aGUgaG9vayBpcyBkZWNsYXJlZCBvbiwgZWFjaCBtYXBwZWQgdG8gdGhlIE5BTUUgb2YgaXRzIHBheWxvYWQgdHlwZVxuICogICAocHJvc2UgZm9yIHJlYWRlcnM7IHRoZSB0eXBlIGl0c2VsZiBpcyBgSG9va1BheWxvYWQ8SywgQz5gLCByZWFkIG9mZiB0aGUgaW50ZXJmYWNlKS5cbiAqIC0gYGV4ZWN1dG9yTWFkZWAg4oCUIGEgTEFCRUwgKHJlYWQgYnkgdGVzdHMgYW5kIGRvY3MsIG5vdCBieSByb3V0aW5nKTogYHRydWVgIHdoZW4gdGhlIGV4ZWN1dG9yIHN5bnRoZXNpemVzIHRoZSBldmVudCBpdHNlbGYgaW5zdGVhZCBvZiBhXG4gKiAgIGRpc3BhdGNoIHNpdGUgaW4gdGhlIGVuZ2luZSAodG9kYXkgb25seSBgb25SZXN1bWVgLCBmaXJlZCBieSBgcnVubmVyL3Jlc3VtZS50cyDCtyBhbm5vdW5jZVJlc3VtZWApLlxuICogICBTdWNoIGFuIGV2ZW50IGdvZXMgdGhyb3VnaCBgZmlyZWAgbGlrZSBldmVyeSBvdGhlciwgc28gYSB0aHJvd2luZyByZWNvcmRlciBuZXZlciBhYm9ydHNcbiAqICAgdGhlIGV4ZWN1dG9yIGNhbGwgdGhhdCBtYWRlIGl0LlxuICovXG5leHBvcnQgdHlwZSBIb29rU3BlYzxLIGV4dGVuZHMgSG9va05hbWU+ID0ge1xuICByZWFkb25seSBvbjogeyByZWFkb25seSBbQyBpbiBDaGFubmVsc09mPEs+XTogc3RyaW5nIH07XG4gIHJlYWRvbmx5IGV4ZWN1dG9yTWFkZTogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogVEhFIHJlZ2lzdHJ5LiBLZXkgb3JkZXIgaXMgdGhlIG9yZGVyIGV2ZXJ5IGRlcml2ZWQgbGlzdCBrZWVwczogYGhvb2tzT24oY2hhbm5lbClgIGlzIGFuXG4gKiBvcmRlci1wcmVzZXJ2aW5nIGZpbHRlciBvZiBpdCwgaWRlbnRpY2FsIHRvIHRoZSA5LjM1LjAgaGFuZC13cml0dGVuIGxpc3RzIGl0IHJlcGxhY2VkLlxuICovXG5leHBvcnQgY29uc3QgSE9PS1MgPSB7XG4gIG9uUmVhZDogeyBvbjogeyBzY29wZTogJ1JlYWRFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvbldyaXRlOiB7IG9uOiB7IHNjb3BlOiAnV3JpdGVFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvbkNvbW1pdDogeyBvbjogeyBzY29wZTogJ0NvbW1pdEV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uU3RhZ2VFeGVjdXRlZDogeyBvbjogeyBmbG93OiAnRmxvd1N0YWdlRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25OZXh0OiB7IG9uOiB7IGZsb3c6ICdGbG93TmV4dEV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uRGVjaXNpb246IHsgb246IHsgZmxvdzogJ0Zsb3dEZWNpc2lvbkV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uRm9yazogeyBvbjogeyBmbG93OiAnRmxvd0ZvcmtFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvblNlbGVjdGVkOiB7IG9uOiB7IGZsb3c6ICdGbG93U2VsZWN0ZWRFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvblN1YmZsb3dFbnRyeTogeyBvbjogeyBmbG93OiAnRmxvd1N1YmZsb3dFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvblN1YmZsb3dFeGl0OiB7IG9uOiB7IGZsb3c6ICdGbG93U3ViZmxvd0V2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uU3ViZmxvd1JlZ2lzdGVyZWQ6IHsgb246IHsgZmxvdzogJ0Zsb3dTdWJmbG93UmVnaXN0ZXJlZEV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uTG9vcDogeyBvbjogeyBmbG93OiAnRmxvd0xvb3BFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvbkJyZWFrOiB7IG9uOiB7IGZsb3c6ICdGbG93QnJlYWtFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvbkVycm9yOiB7IG9uOiB7IHNjb3BlOiAnRXJyb3JFdmVudCcsIGZsb3c6ICdGbG93RXJyb3JFdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvblN0YWdlU3RhcnQ6IHsgb246IHsgc2NvcGU6ICdTdGFnZUV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uU3RhZ2VFbmQ6IHsgb246IHsgc2NvcGU6ICdTdGFnZUV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIC8vIEV2ZXJ5IGF0dGVtcHQgb2YgYSBkZWNsYXJlZCByZXRyeSBwb2xpY3kgKDEwLjEpOiBmaXJlcyBEVVJJTkcgYSBzdGFnZSwgb25jZSBwZXIgYXR0ZW1wdCwgYmVmb3JlIG9uU3RhZ2VSZXRyeS5cbiAgb25BdHRlbXB0OiB7IG9uOiB7IGZsb3c6ICdGbG93QXR0ZW1wdEV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIC8vIERlY2xhcmF0aXZlIHBlci1zdGFnZSByZXRyeSAoOS4xNSk6IGZpcmVzIERVUklORyBhIHN0YWdlLCBvbmNlIHBlciBmYWlsZWQgYXR0ZW1wdCB0aGF0IHdpbGwgYmUgcmV0cmllZC5cbiAgb25TdGFnZVJldHJ5OiB7IG9uOiB7IGZsb3c6ICdGbG93U3RhZ2VSZXRyeUV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIC8vIFRocm90dGxpbmcgKDkuMzkuMCwgUjkpOiBhIGZvcmsgY2hpbGQncyBlcnJvciB0aGUgcnVuJ3MgYHRocm90dGxpbmdFcnJvckNoZWNrZXJgIGNsYXNzaWZpZWQuXG4gIG9uVGhyb3R0bGVkOiB7IG9uOiB7IGZsb3c6ICdGbG93VGhyb3R0bGVkRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25QYXVzZTogeyBvbjogeyBzY29wZTogJ1BhdXNlRXZlbnQnLCBmbG93OiAnRmxvd1BhdXNlRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25SZXN1bWU6IHsgb246IHsgc2NvcGU6ICdSZXN1bWVFdmVudCcsIGZsb3c6ICdGbG93UmVzdW1lRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogdHJ1ZSB9LFxuICAvLyBSdW4gYm91bmRhcmllcyDigJQgbGlzdGVkIHNvIGEgcmVjb3JkZXIgd2hvc2UgT05MWSBob29rIGlzIG9uZSBvZiB0aGVtIHN0aWxsIHJvdXRlcyB0byB0aGUgZmxvdyBjaGFubmVsLlxuICBvblJ1blN0YXJ0OiB7IG9uOiB7IGZsb3c6ICdGbG93UnVuRXZlbnQnIH0sIGV4ZWN1dG9yTWFkZTogZmFsc2UgfSxcbiAgb25SdW5FbmQ6IHsgb246IHsgZmxvdzogJ0Zsb3dSdW5FdmVudCcgfSwgZXhlY3V0b3JNYWRlOiBmYWxzZSB9LFxuICBvblJ1bkZhaWxlZDogeyBvbjogeyBmbG93OiAnRmxvd1J1bkZhaWxlZEV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG4gIG9uRW1pdDogeyBvbjogeyBlbWl0OiAnRW1pdEV2ZW50JyB9LCBleGVjdXRvck1hZGU6IGZhbHNlIH0sXG59IGFzIGNvbnN0IHNhdGlzZmllcyB7IHJlYWRvbmx5IFtLIGluIEhvb2tOYW1lXTogSG9va1NwZWM8Sz4gfTtcblxuLyoqIEV2ZXJ5IGhvb2sgbmFtZSwgaW4gcmVnaXN0cnkgb3JkZXIuICovXG5leHBvcnQgY29uc3QgSE9PS19OQU1FUyA9IE9iamVjdC5mcmVlemUoT2JqZWN0LmtleXMoSE9PS1MpKSBhcyByZWFkb25seSBIb29rTmFtZVtdO1xuXG4vKiogVGhlIGhvb2tzIGRlY2xhcmVkIG9uIGBjaGFubmVsYCwgaW4gcmVnaXN0cnkgb3JkZXIuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va3NPbihjaGFubmVsOiAnc2NvcGUnKTogcmVhZG9ubHkgU2NvcGVIb29rTmFtZVtdO1xuZXhwb3J0IGZ1bmN0aW9uIGhvb2tzT24oY2hhbm5lbDogJ2Zsb3cnKTogcmVhZG9ubHkgRmxvd0hvb2tOYW1lW107XG5leHBvcnQgZnVuY3Rpb24gaG9va3NPbihjaGFubmVsOiAnZW1pdCcpOiByZWFkb25seSBFbWl0SG9va05hbWVbXTtcbmV4cG9ydCBmdW5jdGlvbiBob29rc09uKGNoYW5uZWw6IEhvb2tDaGFubmVsKTogcmVhZG9ubHkgSG9va05hbWVbXTtcbmV4cG9ydCBmdW5jdGlvbiBob29rc09uKGNoYW5uZWw6IEhvb2tDaGFubmVsKTogcmVhZG9ubHkgSG9va05hbWVbXSB7XG4gIHJldHVybiBCWV9DSEFOTkVMW2NoYW5uZWxdO1xufVxuXG5jb25zdCBkZWNsYXJlZE9uID0gKGNoYW5uZWw6IEhvb2tDaGFubmVsKSA9PlxuICBPYmplY3QuZnJlZXplKEhPT0tfTkFNRVMuZmlsdGVyKChob29rKSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoSE9PS1NbaG9va10ub24sIGNoYW5uZWwpKSk7XG4vKiogQ29tcHV0ZWQgb25jZSBhdCBsb2FkIOKAlCByb3V0aW5nIGFza3Mgb24gZXZlcnkgYXR0YWNoLCB0aGUgdGFwcyBvbiBldmVyeSB0cmF2ZXJzZXIuICovXG5jb25zdCBCWV9DSEFOTkVMOiBSZWFkb25seTxSZWNvcmQ8SG9va0NoYW5uZWwsIHJlYWRvbmx5IEhvb2tOYW1lW10+PiA9IHtcbiAgc2NvcGU6IGRlY2xhcmVkT24oJ3Njb3BlJyksXG4gIGZsb3c6IGRlY2xhcmVkT24oJ2Zsb3cnKSxcbiAgZW1pdDogZGVjbGFyZWRPbignZW1pdCcpLFxufTtcblxuLyoqIFRoZSBzY29wZS1jaGFubmVsIGVycm9yIG9wZXJhdGlvbiBhIGZhaWxpbmcgaG9vayBpcyByZXBvcnRlZCB1bmRlciAoYEVycm9yRXZlbnQub3BlcmF0aW9uYCkuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlcmF0aW9uRm9yKGhvb2s6IHN0cmluZyk6ICdyZWFkJyB8ICd3cml0ZScgfCAnY29tbWl0JyB7XG4gIGlmIChob29rID09PSAnb25SZWFkJykgcmV0dXJuICdyZWFkJztcbiAgaWYgKGhvb2sgPT09ICdvbkNvbW1pdCcpIHJldHVybiAnY29tbWl0JztcbiAgcmV0dXJuICd3cml0ZSc7XG59XG5cbi8qKiBXaGVyZSBhIHJlY29yZGVyIGZhaWx1cmUgaXMgcmVwb3J0ZWQgRlJPTSDigJQgdGhlIHN0YWdlIChvciBzeW50aGVzaXplZCBldmVudCkgd2hvc2UgaG9vayB0aHJldy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbHVyZVNpdGUge1xuICByZWFkb25seSBzdGFnZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhZ2VJZDogc3RyaW5nO1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICByZWFkb25seSBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgcnVuJ3MgY29ycmVsYXRpb24sIHdoZW4gdGhlIHNpdGUncyBldmVudHMgY2Fycnkgb25lIOKAlCB0aGUgZmFpbHVyZSBldmVudCBjYXJyaWVzIGl0IHRvby4gKi9cbiAgcmVhZG9ubHkgY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcbn1cblxuLyoqXG4gKiBUSEUgc2NvcGUtY2hhbm5lbCBgb25FcnJvcmAgZXZlbnQgZm9yIGEgcmVjb3JkZXIgdGhhdCB0aHJldyBpbiBgaG9va2Ag4oCUIGJ1aWx0IGluIE9ORSBwbGFjZVxuICogZm9yIGV2ZXJ5IHBhdGggdGhhdCByZXBvcnRzIG9uZTogdGhlIGlubGluZSBmYWNhZGUgKGBTY29wZUZhY2FkZSDCtyBfcm91dGVGYWlsdXJlYCksIHRoZVxuICogZXhlY3V0b3IncyBvd24gYG9uUmVzdW1lYCAoYHJ1bm5lci9yZXN1bWUudHMgwrcgYW5ub3VuY2VSZXN1bWVgKSBhbmQgZGVmZXJyZWQgZGVsaXZlcnlcbiAqIChgRGVmZXJyZWRPYnNlcnZlclRpZXIgwrcgcm91dGVMaXN0ZW5lckVycm9yYCkuIGBlcnJvcmAgaXMgdGhlIHN0cnVjdHVyZWQgZm9ybVxuICogKGBleHRyYWN0RXJyb3JJbmZvYDogYG1lc3NhZ2VgLCBgbmFtZWAsIGBjb2RlP2AsIGByYXdgID0gdGhlIHRocm93biB2YWx1ZSBpdHNlbGYpIHdoYXRldmVyXG4gKiB3YXMgdGhyb3duIOKAlCBhbiBgRXJyb3JgLCBhIHN0cmluZywgYW55dGhpbmcgKDkuMzkuMDsgYmVmb3JlLCB0aGUgaW5saW5lIHBhdGhzIHBhc3NlZCB0aGUgcmF3XG4gKiB0aHJvd24gdmFsdWUgYW5kIHRoZSBkZWZlcnJlZCB0aWVyIHdyYXBwZWQgaXQgaW4gYG5ldyBFcnJvciguLi4pYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRlckZhaWx1cmVFdmVudChzaXRlOiBGYWlsdXJlU2l0ZSwgdGhyb3duOiB1bmtub3duLCBob29rOiBzdHJpbmcpOiBFcnJvckV2ZW50IHtcbiAgcmV0dXJuIHtcbiAgICBzdGFnZU5hbWU6IHNpdGUuc3RhZ2VOYW1lLFxuICAgIHN0YWdlSWQ6IHNpdGUuc3RhZ2VJZCxcbiAgICBydW50aW1lU3RhZ2VJZDogc2l0ZS5ydW50aW1lU3RhZ2VJZCxcbiAgICBwaXBlbGluZUlkOiBzaXRlLnBpcGVsaW5lSWQsXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIGVycm9yOiBleHRyYWN0RXJyb3JJbmZvKHRocm93biksXG4gICAgb3BlcmF0aW9uOiBvcGVyYXRpb25Gb3IoaG9vayksXG4gICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICAuLi4oc2l0ZS5jb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uOiBzaXRlLmNvcnJlbGF0aW9uIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIFRleHQgZm9yIGFueXRoaW5nIGEgcmVjb3JkZXIgdGhyZXcuIGAke2Vycn1gIHRocm93cyBvbiBhIG51bGwtcHJvdG90eXBlIG9iamVjdCAobm9cbiAqIGB0b1N0cmluZ2ApIGFuZCBvbiBhIHN5bWJvbCDigJQgYW5kIGEgdGhyb3cgaW5zaWRlIHRoZSBpc29sYXRpb24gd291bGQgZXNjYXBlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVUaHJvd24oZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycm9yKTtcbiAgfVxufVxuXG4vKiogV2hhdCB0byBkbyB3aXRoIGEgcmVjb3JkZXIncyB0aHJvdy4gSXRzIG93biB0aHJvdyBpcyBzd2FsbG93ZWQgYnkgYGZpcmVgLiAqL1xuZXhwb3J0IHR5cGUgSG9va0ZhaWx1cmUgPSAoZXJyb3I6IHVua25vd24sIHJlY29yZGVyOiBvYmplY3QsIGhvb2s6IEhvb2tOYW1lKSA9PiB2b2lkO1xuXG4vKipcbiAqIFRoZSBmbG93IGNoYW5uZWwncyBwb2xpY3ksIHZlcmJhdGltIHNpbmNlIDkuMDogd2FybiBpbiBkZXYgbW9kZSwgb3RoZXJ3aXNlIHNheSBub3RoaW5nLlxuICogYHNvdXJjZWAgbmFtZXMgdGhlIGRpc3BhdGNoZXIgaW4gdGhlIHdhcm5pbmcgKGBGbG93UmVjb3JkZXJEaXNwYXRjaGVyYCwgYEZsb3dDaGFydEV4ZWN1dG9yYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXJuSW5EZXZNb2RlKHNvdXJjZTogc3RyaW5nKTogSG9va0ZhaWx1cmUge1xuICByZXR1cm4gKGVycm9yLCByZWNvcmRlciwgaG9vaykgPT4ge1xuICAgIGlmICghaXNEZXZNb2RlKCkpIHJldHVybjtcbiAgICBjb25zdCBpZCA9IChyZWNvcmRlciBhcyB7IGlkPzogdW5rbm93biB9KS5pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihgW2Zvb3RwcmludF0gJHtzb3VyY2V9OiByZWNvcmRlciBcIiR7U3RyaW5nKGlkKX1cIiB0aHJldyBpbiAke2hvb2t9OiAke2Rlc2NyaWJlVGhyb3duKGVycm9yKX1gKTtcbiAgfTtcbn1cblxuY29uc3QgU1dBTExPVzogSG9va0ZhaWx1cmUgPSAoKSA9PiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2FsbCBgaG9va2Agb24gZXZlcnkgcmVjb3JkZXIgdGhhdCBpbXBsZW1lbnRzIGl0IChub3JtYWwgcHJvcGVydHkgbG9va3VwLCBgdGhpc2AgYm91bmQg4oCUXG4gKiBgaW52b2tlUmVjb3JkZXJIb29rYCksIGluIG9yZGVyLiBBIHRocm93IGdvZXMgdG8gYG9uRmFpbHVyZWAgYW5kIHRoZSBsb29wIGNvbnRpbnVlczsgYVxuICogdGhyb3cgRlJPTSBgb25GYWlsdXJlYCBpcyBzd2FsbG93ZWQuIE5vdGhpbmcgYSByZWNvcmRlciBkb2VzIGNhbiByZWFjaCB0aGUgY2FsbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlyZTxLIGV4dGVuZHMgSG9va05hbWU+KFxuICByZWNvcmRlcnM6IEl0ZXJhYmxlPG9iamVjdD4sXG4gIGhvb2s6IEssXG4gIGV2ZW50OiBIb29rUGF5bG9hZDxLPixcbiAgb25GYWlsdXJlOiBIb29rRmFpbHVyZSA9IFNXQUxMT1csXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCByZWNvcmRlciBvZiByZWNvcmRlcnMpIHtcbiAgICB0cnkge1xuICAgICAgaW52b2tlUmVjb3JkZXJIb29rKHJlY29yZGVyLCBob29rLCBldmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uRmFpbHVyZShlcnJvciwgcmVjb3JkZXIsIGhvb2spO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEFuIGlzb2xhdGlvbiB0aGF0IHRocm93cyBpcyBpdHNlbGYgaXNvbGF0ZWQg4oCUIHJlY29yZGVyIGVycm9ycyBuZXZlciByZWFjaCB0aGUgcnVuLlxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -309,6 +309,7 @@ export class DeferredObserverTier {
309
309
  stageId: stageIdOf(envelope.runtimeStageId),
310
310
  runtimeStageId: envelope.runtimeStageId,
311
311
  pipelineId: envelope.runId,
312
+ ...correlationOf(envelope.payload),
312
313
  }, error, envelope.method);
313
314
  for (const [, { recorder, channels }] of this.registrations) {
314
315
  // Inline-tier parity (review CRITICAL-1): the synthesized event is
@@ -359,4 +360,15 @@ export class DeferredObserverTier {
359
360
  console.warn(message);
360
361
  }
361
362
  }
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmZXJyZWRPYnNlcnZlclRpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9EZWZlcnJlZE9ic2VydmVyVGllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Q0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQU9MLGtCQUFrQixHQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUE2RHJGLHlGQUF5RjtBQUN6RixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyx1QkFBdUIsQ0FBQztBQUU1RCw2RUFBNkU7QUFDN0UsTUFBTSxtQkFBbUIsR0FBOEIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekUsK0NBQStDO0FBQy9DLE1BQU0sa0JBQWtCLEdBQThCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFpQi9ELE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxVQUFVLENBQXFCO0lBQy9CLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUN4RCxhQUFhLENBQTBCO0lBQ3hELDJFQUEyRTtJQUMxRCxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM1QyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFFN0IsWUFBWSxPQUErQjtRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ25CLG9FQUFvRTtZQUNwRSxr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Q0FBQyxPQUFlO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPO1FBQ3pCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTztRQUM3QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJ1bm5lci9EZWZlcnJlZE9ic2VydmVyVGllci50cyDigJQgUkZDLTAwMSBCbG9ja3MgNuKAkzk6IHRoZSBlbmdpbmUgd2lyaW5nIG9mXG4gKiB0aGUgZGVmZXJyZWQtb2JzZXJ2ZXIgcGlwZWxpbmUuXG4gKlxuICogUGF0dGVybjogIFRoaW4gYWRhcHRlciBiZXR3ZWVuIHRoZSBleGVjdXRvcidzIHRocmVlIG9ic2VydmVyIGNoYW5uZWxzIGFuZFxuICogICAgICAgICAgIHRoZSBQVVJFIGBvYnNlcnZlci1xdWV1ZWAgbW9kdWxlLiBUaGUgcHVyZSBtb2R1bGUgc3RheXNcbiAqICAgICAgICAgICBlbmdpbmUtZnJlZSAoaXQgaW1wb3J0cyBub3RoaW5nIGZyb20gdGhlIGVuZ2luZSDigJQgdGhlIGVuZ2luZVxuICogICAgICAgICAgIGltcG9ydHMgSVQpOyB0aGlzIHRpZXIgb3ducyBldmVyeSBlbmdpbmUtZmxhdm9yZWQgY29uY2VybjpcbiAqICAgICAgICAgICAgIC0gdGhlIGBpc0Rldk1vZGUoKWAtZ2F0ZWQsIGRlZHVwbGljYXRlZCBgQ2FwdHVyZUhvb2tzLndhcm5gXG4gKiAgICAgICAgICAgICAgIGJpbmRpbmcgKHRoZSBkZXYtd2FybiBzZWFtLCBSRkMtMDAxIMKnXCJSZXNvbHV0aW9uXCIpO1xuICogICAgICAgICAgICAgLSByb3V0aW5nIGBEZWZlcnJlZERpc3BhdGNoZXIub25FcnJvcmAgaW50byB0aGUgZXhpc3RpbmdcbiAqICAgICAgICAgICAgICAgcmVjb3JkZXIgZXJyb3IgY2hhbm5lbCAoYG9uRXJyb3JgIG9uIHNpYmxpbmcgb2JzZXJ2ZXJzKTtcbiAqICAgICAgICAgICAgIC0gdGhlIGNhcHR1cmUgVEFQUyDigJQgc3ludGhldGljIHJlY29yZGVycyBwbGFjZWQgb24gdGhlXG4gKiAgICAgICAgICAgICAgIGV4aXN0aW5nIGlubGluZSBkaXNwYXRjaCBsaXN0cyBzbyB0aGUgdGhyZWUgZGlzcGF0Y2ggc2l0ZXNcbiAqICAgICAgICAgICAgICAgKGBTY29wZUZhY2FkZS5faW52b2tlSG9va2AsIGBTY29wZUZhY2FkZS5lbWl0RXZlbnRgLFxuICogICAgICAgICAgICAgICBgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcmApIG5lZWQgTk8gcGVyLXNpdGUgdGllciBsb2dpYzogYVxuICogICAgICAgICAgICAgICB0YXAncyBob29rIGJvZHkgSVMgYGRpc3BhdGNoZXIuY2FwdHVyZSguLi4pYCwgYW5kIGJlY2F1c2VcbiAqICAgICAgICAgICAgICAgdGhlIHRhcCBzaXRzIGluIHRoZSBzYW1lIGxvb3AgYXMgaW5saW5lIHJlY29yZGVycyBpdCBzZWVzXG4gKiAgICAgICAgICAgICAgIGV4YWN0bHkgdGhlIHBvc3QtcmVkYWN0aW9uIGV2ZW50IG9iamVjdCBpbmxpbmUgb2JzZXJ2ZXJzXG4gKiAgICAgICAgICAgICAgIHNlZSDigJQgY2FwdHVyZSBjYW4gbmV2ZXIgb2JzZXJ2ZSBhIHByZS1yZWRhY3Rpb24gdmFsdWU7XG4gKiAgICAgICAgICAgICAtIHRoZSB0ZXJtaW5hbCBmbHVzaCAoQmxvY2sgOCkgd2l0aCBob25lc3Qgc3RyYW5kaW5nXG4gKiAgICAgICAgICAgICAgIGFjY291bnRpbmcsIGFuZCB0aGUgQmxvY2sgOSBzdGF0cyBzdXJmYWNlLlxuICpcbiAqIFJvbGU6ICAgICBPbmUgaW5zdGFuY2UgcGVyIGBGbG93Q2hhcnRFeGVjdXRvcmAsIGNyZWF0ZWQgTEFaSUxZIG9uIHRoZVxuICogICAgICAgICAgIGZpcnN0IGBkZWxpdmVyeTogJ2RlZmVycmVkJ2AgYXR0YWNoICh6ZXJvIGFsbG9jYXRpb24gd2hlbiBub2JvZHlcbiAqICAgICAgICAgICBvcHRzIGluIOKAlCBtaXJyb3JzIHRoZSBlbWl0IGZhc3QtcGF0aCBwcmVjZWRlbnQpLiBIb2xkcyB0aGUgT05FXG4gKiAgICAgICAgICAgYERlZmVycmVkRGlzcGF0Y2hlcmAgKG9uZSBtZXJnZWQgcXVldWUsIHRvdGFsIG9yZGVyIGFjcm9zc1xuICogICAgICAgICAgIGNoYW5uZWxzKSBwbHVzIHRoZSByZWdpc3RyeSBvZiBkZWZlcnJlZCByZWNvcmRlcnMuXG4gKlxuICogRGVsaXZlcnk6IGEgZGVmZXJyZWQgcmVjb3JkZXIncyBob29rcyBhcmUgaW52b2tlZCB0aHJvdWdoIHRoZSBTQU1FXG4gKiBgaW52b2tlUmVjb3JkZXJIb29rYCBoZWxwZXIgdGhlIGlubGluZSB0aWVyIHVzZXMgKFJGQy0wMDEgwqc5IG1pdGlnYXRpb24pIOKAlFxuICogb25lIGJlYXQgYmVoaW5kLCB3aXRoIGBlbnZlbG9wZS5wYXlsb2FkYCBtYXRlcmlhbGl6ZWQgcGVyIHRoZSBjYXB0dXJlXG4gKiBwb2xpY3kgKGAnY2xvbmUnYCBkZWZhdWx0IGF0IHRoaXMgYXR0YWNoIHRpZXIg4oCUIGZ1bGwgc3RydWN0dXJhbCBjb3B5LFxuICogZXZlbnQtc2hhcGUgY29tcGF0aWJsZSB3aXRoIGlubGluZTsgZXhwbGljaXQgYCdzdW1tYXJ5J2Ag4oCUIGJvdW5kZWQsXG4gKiByZWZlcmVuY2UtZnJlZTsgYCdyZWYnYCDigJQgdGhlIGxpdmUgZXZlbnQgb2JqZWN0LCBkZXYtd2FybmVkKS4gVGhlIHN0YW5kYWxvbmVcbiAqIHF1ZXVlIHJldGFpbnMgaXRzIGAnc3VtbWFyeSdgIGRlZmF1bHQgKGBvYnNlcnZlci1xdWV1ZS9tZXJnZWRRdWV1ZS50cyDCtyBNZXJnZWRRdWV1ZWApLlxuICpcbiAqIENoYW5uZWwgZmlsdGVyOiBhIHJlZ2lzdHJhdGlvbiByZW1lbWJlcnMgd2hpY2ggY2hhbm5lbHMgd291bGQgaGF2ZVxuICogcmVhY2hlZCB0aGUgcmVjb3JkZXIgaW5saW5lIChzY29wZS1saXN0IHJlY29yZGVycyBzZWUgYHNjb3BlYCArIGBlbWl0YFxuICogZW52ZWxvcGVzOyBmbG93LWxpc3QgcmVjb3JkZXJzIHNlZSBgZmxvd2AgZW52ZWxvcGVzKSBhbmQgc2tpcHMgdGhlIHJlc3Qg4oCUXG4gKiBzYW1lIHJlYWNoIGFzIHRoZSBpbmxpbmUgdGllciwgb25lIGJlYXQgYmVoaW5kLlxuICovXG5cbmltcG9ydCB7IHN0YWdlSWRPZiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGludm9rZVJlY29yZGVySG9vayB9IGZyb20gJy4uL2NhcHR1cmUvaW52b2tlSG9vay5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIENhcHR1cmVDaGFubmVsLFxuICB0eXBlIENhcHR1cmVFbnZlbG9wZSxcbiAgdHlwZSBDYXB0dXJlUG9saWN5LFxuICB0eXBlIERpc3BhdGNoZXJTdGF0cyxcbiAgdHlwZSBEcmFpblJlc3VsdCxcbiAgdHlwZSBPdmVyZmxvd1BvbGljeSxcbiAgRGVmZXJyZWREaXNwYXRjaGVyLFxufSBmcm9tICcuLi9vYnNlcnZlci1xdWV1ZS9pbmRleC5qcyc7XG5pbXBvcnQgeyBkZXNjcmliZVRocm93biwgaG9va3NPbiwgcmVjb3JkZXJGYWlsdXJlRXZlbnQgfSBmcm9tICcuLi9yZWNvcmRlci9ob29rcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5cbi8qKiBEZWxpdmVyeSB0aWVyIGZvciBhbiBhdHRhY2hlZCBvYnNlcnZlciAoUkZDLTAwMSkuICovXG5leHBvcnQgdHlwZSBPYnNlcnZlckRlbGl2ZXJ5ID0gJ2lubGluZScgfCAnZGVmZXJyZWQnO1xuXG4vKipcbiAqIE9wdGlvbnMgYmFnIGFjY2VwdGVkIGJ5IGV2ZXJ5IGBhdHRhY2gqUmVjb3JkZXJgIGNhbGwuXG4gKlxuICogYGRlbGl2ZXJ5OiAnZGVmZXJyZWQnYCBvcHRzIHRoZSByZWNvcmRlciBpbnRvIHRoZSBib3VuZGVkIGNhcHR1cmUgcXVldWVcbiAqIChcIm9uZSBiZWF0IGJlaGluZFwiKTsgYWJzZW50IC8gYCdpbmxpbmUnYCBrZWVwcyB0aGUgaGlzdG9yaWNhbCBzeW5jaHJvbm91c1xuICogY2FsbCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIHByZS1SRkMgcGF0aC5cbiAqXG4gKiBUaGUgcmVtYWluaW5nIGZpZWxkcyBjb25maWd1cmUgdGhlIGV4ZWN1dG9yJ3MgT05FIHNoYXJlZCBkaXNwYXRjaGVyIGFuZFxuICogYXJlIGFwcGxpZWQgd2hlbiB0aGUgRklSU1QgZGVmZXJyZWQgYXR0YWNoIGNyZWF0ZXMgaXQ7IGxhdGVyIGF0dGFjaGVzXG4gKiBwYXNzaW5nIGRpZmZlcmVudCB2YWx1ZXMgZ2V0IGEgZGV2LW1vZGUgd2FybmluZyBhbmQga2VlcCB0aGUgb3JpZ2luYWxcbiAqIGNvbmZpZ3VyYXRpb24gKG9uZSBxdWV1ZSBwZXIgZXhlY3V0b3Ig4oCUIHBlci1yZWNvcmRlciBxdWV1ZXMgd291bGQgYnJlYWtcbiAqIHRoZSB0b3RhbCBjcm9zcy1jaGFubmVsIG9yZGVyKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRhY2hSZWNvcmRlck9wdGlvbnMge1xuICAvKiogYCdkZWZlcnJlZCdgID0gY2FwdHVyZSDihpIgcXVldWUg4oaSIG5leHQtY2hlY2twb2ludCBkZWxpdmVyeS4gRGVmYXVsdCBgJ2lubGluZSdgLiAqL1xuICByZWFkb25seSBkZWxpdmVyeT86IE9ic2VydmVyRGVsaXZlcnk7XG4gIC8qKlxuICAgKiBQYXlsb2FkIG1hdGVyaWFsaXphdGlvbiBhdCBjYXB0dXJlIHRpbWUuIERlZmF1bHQgYCdjbG9uZSdgIOKAlCB5b3VyXG4gICAqIHJlY29yZGVyJ3MgaG9va3MgcmVjZWl2ZSB0aGUgU0FNRSBldmVudCBzaGFwZSBhcyBpbmxpbmUgZGVsaXZlcnlcbiAgICogKGBzdHJ1Y3R1cmVkQ2xvbmVgZDsgYGUua2V5YC9gZS52YWx1ZWAvYGUucnVudGltZVN0YWdlSWRgIGFsbCB3b3JrXG4gICAqIHVuY2hhbmdlZCksIHNvIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIGlzIGEgZHJvcC1pbiBwb3J0LlxuICAgKiBgJ3N1bW1hcnknYCDigJQgYSBib3VuZGVkIHR5cGUvc2l6ZS9wcmV2aWV3IGRpZ2VzdCAoYFBheWxvYWRTdW1tYXJ5YClcbiAgICogaW5zdGVhZCBvZiB0aGUgZXZlbnQgc2hhcGU6IGNoZWFwZXIgY2FwdHVyZSBmb3IgdGVsZW1ldHJ5LW9ubHlcbiAgICogY29uc3VtZXJzIHRoYXQgZG9uJ3QgcmVhZCBkb21haW4gZmllbGRzLiBgJ3JlZidgIOKAlCBwYXNzLXRocm91Z2ggYnlcbiAgICogcmVmZXJlbmNlOyB0aGUgY2FsbGVyIGFzc2VydHMgaW1tdXRhYmlsaXR5IChkZXYtbW9kZSB3YXJucykuXG4gICAqL1xuICByZWFkb25seSBjYXB0dXJlPzogQ2FwdHVyZVBvbGljeTtcbiAgLyoqIFF1ZXVlIGJvdW5kIOKAlCBkZWZhdWx0IDEwIDAwMC4gKi9cbiAgcmVhZG9ubHkgbWF4UXVldWU/OiBudW1iZXI7XG4gIC8qKiBPdmVyZmxvdyBwb2xpY3kgYXQgYG1heFF1ZXVlYCDigJQgZGVmYXVsdCBgJ2Ryb3Atb2xkZXN0J2AuICovXG4gIHJlYWRvbmx5IG92ZXJmbG93PzogT3ZlcmZsb3dQb2xpY3k7XG4gIC8qKiBgJ3NhbXBsZSdgIG92ZXJmbG93IG9ubHkg4oCUIGFkbWl0IDEgaW4gdGhpcyBtYW55IHNhdHVyYXRlZCBhcnJpdmFscy4gKi9cbiAgcmVhZG9ubHkgc2FtcGxlRXZlcnk/OiBudW1iZXI7XG4gIC8qKiBQZXItY2hlY2twb2ludCBmbHVzaCBidWRnZXQsIG1zIChBMSkg4oCUIGRlZmF1bHQgMjsgYEluZmluaXR5YCA9IGZ1bGwgZHJhaW4uICovXG4gIHJlYWRvbmx5IGZsdXNoQnVkZ2V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEJsb2NrIDkgb2JzZXJ2YWJpbGl0eSBzdXJmYWNlIOKAlCBgc25hcHNob3Qub2JzZXJ2ZXJTdGF0c2AuIFRoZSBBNFxuICogZGlzcGF0Y2hlciBzdGF0cyBwbHVzIHRoZSB0ZXJtaW5hbC1mbHVzaCBzdHJhbmRpbmcgY291bnQgZnJvbSBCbG9jayA4LlxuICogUHJlc2VudCBvbiBgUnVudGltZVNuYXBzaG90YCBvbmx5IHdoZW4gYSBkZWZlcnJlZCBvYnNlcnZlciB3YXMgYXR0YWNoZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzZXJ2ZXJTdGF0cyBleHRlbmRzIERpc3BhdGNoZXJTdGF0cyB7XG4gIC8qKlxuICAgKiBFbnZlbG9wZXMgc3RpbGwgcXVldWVkIHdoZW4gYSB0ZXJtaW5hbCBmbHVzaCBoaXQgaXRzIHJ1bmF3YXktY2FzY2FkZVxuICAgKiByb3VuZCBjYXAgKEJsb2NrIDgpLiBgMGAgaW4gYW55IHNhbmUgcnVuIOKAlCBhIG5vbi16ZXJvIHZhbHVlIG1lYW5zIGFcbiAgICogbGlzdGVuZXIga2VwdCBlbnF1ZXVlaW5nIHdvcmsgYXQgZW5kLW9mLXJ1biBhbmQgZGVsaXZlcnkgd2FzIGN1dCBvZmZcbiAgICogKGFsc28gZGV2LXdhcm5lZCBhdCB0aGUgbW9tZW50IGl0IGhhcHBlbmVkKS4gTmV2ZXIgc2lsZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdGVybWluYWxTdHJhbmRlZDogbnVtYmVyO1xufVxuXG4vKiogUmVzdWx0IHNoYXBlIG9mIGBleGVjdXRvci5kcmFpbk9ic2VydmVycygpYCDigJQgc2VlIGBEcmFpblJlc3VsdGAuICovXG5leHBvcnQgdHlwZSBPYnNlcnZlckRyYWluUmVzdWx0ID0gRHJhaW5SZXN1bHQ7XG5cbi8qKiBXZWxsLWtub3duIGlkcyBvZiB0aGUgc3ludGhldGljIGNhcHR1cmUgdGFwcyAoaW50ZXJuYWwsIGRvY3VtZW50ZWQgZm9yIGRlYnVnZ2luZykuICovXG5leHBvcnQgY29uc3QgREVGRVJSRURfU0NPUEVfVEFQX0lEID0gJ19fZGVmZXJyZWQtc2NvcGUtdGFwX18nO1xuZXhwb3J0IGNvbnN0IERFRkVSUkVEX0ZMT1dfVEFQX0lEID0gJ19fZGVmZXJyZWQtZmxvdy10YXBfXyc7XG5cbi8qKiBDaGFubmVsIHJlYWNoIG9mIHRoZSBzY29wZS1yZWNvcmRlciBsaXN0IChzY29wZSBldmVudHMgKyBlbWl0IGV2ZW50cykuICovXG5jb25zdCBTQ09QRV9MSVNUX0NIQU5ORUxTOiByZWFkb25seSBDYXB0dXJlQ2hhbm5lbFtdID0gWydzY29wZScsICdlbWl0J107XG4vKiogQ2hhbm5lbCByZWFjaCBvZiB0aGUgZmxvdy1yZWNvcmRlciBsaXN0LiAqL1xuY29uc3QgRkxPV19MSVNUX0NIQU5ORUxTOiByZWFkb25seSBDYXB0dXJlQ2hhbm5lbFtdID0gWydmbG93J107XG5cbi8qKiBEaXNwYXRjaGVyLWxldmVsIG9wdGlvbnMgc25hcHNob3QsIGtlcHQgZm9yIGNvbmZsaWN0IGRldGVjdGlvbi4gKi9cbmludGVyZmFjZSBBcHBsaWVkRGlzcGF0Y2hlckNvbmZpZyB7XG4gIHJlYWRvbmx5IGNhcHR1cmU/OiBDYXB0dXJlUG9saWN5O1xuICByZWFkb25seSBtYXhRdWV1ZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgb3ZlcmZsb3c/OiBPdmVyZmxvd1BvbGljeTtcbiAgcmVhZG9ubHkgc2FtcGxlRXZlcnk/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGZsdXNoQnVkZ2V0TXM/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBEZWZlcnJlZFJlZ2lzdHJhdGlvbiB7XG4gIHJlYWRvbmx5IHJlY29yZGVyOiBTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyO1xuICAvKiogV2hpY2ggZW52ZWxvcGUgY2hhbm5lbHMgcmVhY2ggdGhpcyByZWNvcmRlciAoaW5saW5lLXRpZXIgcGFyaXR5KS4gKi9cbiAgcmVhZG9ubHkgY2hhbm5lbHM6IFNldDxDYXB0dXJlQ2hhbm5lbD47XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZE9ic2VydmVyVGllciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGF0Y2hlcjogRGVmZXJyZWREaXNwYXRjaGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgRGVmZXJyZWRSZWdpc3RyYXRpb24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwbGllZENvbmZpZzogQXBwbGllZERpc3BhdGNoZXJDb25maWc7XG4gIC8qKiBEZWR1cCBtZW1vcnkgZm9yIHRoZSBkZXYtd2FybiBzZWFtIChvbmUgd2FybmluZyBwZXIgdW5pcXVlIG1lc3NhZ2UpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHdhcm5lZE1lc3NhZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgdGVybWluYWxTdHJhbmRlZCA9IDA7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucykge1xuICAgIHRoaXMuYXBwbGllZENvbmZpZyA9IHtcbiAgICAgIC8vIEF0dGFjaC1zdXJmYWNlIGRlZmF1bHQgaXMgJ2Nsb25lJyAocmV2aWV3IENSSVRJQ0FMLTIpOiBhIHJlY29yZGVyXG4gICAgICAvLyBwb3J0ZWQgd2l0aCBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBrZWVwcyByZWNlaXZpbmcgdGhlIFNBTUVcbiAgICAgIC8vIGV2ZW50IHNoYXBlIGFzIGlubGluZSAoZS5rZXkvZS52YWx1ZS9lLnJ1bnRpbWVTdGFnZUlkIGFsbCBpbnRhY3QpLlxuICAgICAgLy8gVGhlIG1vZHVsZS1pbnRlcm5hbCBlbnZlbG9wZSBkZWZhdWx0IHN0YXlzICdzdW1tYXJ5JyBmb3IgcmF3LVxuICAgICAgLy8gZW52ZWxvcGUgY29uc3VtZXJzOyAnc3VtbWFyeScgaGVyZSBpcyBhbiBleHBsaWNpdCB0ZWxlbWV0cnkgY2hvaWNlLlxuICAgICAgY2FwdHVyZTogb3B0aW9ucz8uY2FwdHVyZSA/PyAnY2xvbmUnLFxuICAgICAgbWF4UXVldWU6IG9wdGlvbnM/Lm1heFF1ZXVlLFxuICAgICAgb3ZlcmZsb3c6IG9wdGlvbnM/Lm92ZXJmbG93LFxuICAgICAgc2FtcGxlRXZlcnk6IG9wdGlvbnM/LnNhbXBsZUV2ZXJ5LFxuICAgICAgZmx1c2hCdWRnZXRNczogb3B0aW9ucz8uZmx1c2hCdWRnZXRNcyxcbiAgICB9O1xuICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBEZWZlcnJlZERpc3BhdGNoZXIoe1xuICAgICAgbWF4UXVldWU6IG9wdGlvbnM/Lm1heFF1ZXVlLFxuICAgICAgb3ZlcmZsb3c6IG9wdGlvbnM/Lm92ZXJmbG93LFxuICAgICAgc2FtcGxlRXZlcnk6IG9wdGlvbnM/LnNhbXBsZUV2ZXJ5LFxuICAgICAgY2FwdHVyZVBvbGljeTogb3B0aW9ucz8uY2FwdHVyZSA/PyAnY2xvbmUnLFxuICAgICAgZmx1c2hCdWRnZXRNczogb3B0aW9ucz8uZmx1c2hCdWRnZXRNcyxcbiAgICAgIC8vIFRoZSBkZXYtd2FybiBzZWFtIChSRkMtMDAxIMKnXCJSZXNvbHV0aW9uOiB0aGUgZGV2LXdhcm4gc2VhbVwiKTogdGhlXG4gICAgICAvLyBwdXJlIG1vZHVsZSBpbnZva2VzIGB3YXJuYCBvbiBldmVyeSAncmVmJyBjYXB0dXJlIGFuZCBldmVyeSAnY2xvbmUnXG4gICAgICAvLyBkZWdyYWRhdGlvbjsgdGhlIHRpZXIgYmluZHMgaXQgdG8gdGhlIGNlbnRyYWwgaXNEZXZNb2RlKCkgZmxhZyBhbmRcbiAgICAgIC8vIGRlZHVwZXMgYnkgbWVzc2FnZSBzbyBhIGhvdCBsb29wIGNhbm5vdCBzcGFtIHRoZSBjb25zb2xlLlxuICAgICAgaG9va3M6IHsgd2FybjogKG1lc3NhZ2UpID0+IHRoaXMuZGV2V2FybkRlZHVwZWQobWVzc2FnZSkgfSxcbiAgICAgIC8vIExpc3RlbmVyIGZhaWx1cmVzIChzeW5jIHRocm93cyBBTkQgYXN5bmMgcmVqZWN0aW9ucykgcm91dGUgaW50byB0aGVcbiAgICAgIC8vIGV4aXN0aW5nIHJlY29yZGVyIGVycm9yIGNoYW5uZWwg4oCUIHNlZSByb3V0ZUxpc3RlbmVyRXJyb3IuXG4gICAgICBvbkVycm9yOiAoZXJyb3IsIGN0eCkgPT4gdGhpcy5yb3V0ZUxpc3RlbmVyRXJyb3IoZXJyb3IsIGN0eC5saXN0ZW5lcklkLCBjdHguZW52ZWxvcGUsIGN0eC5waGFzZSksXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgUmVnaXN0cnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgcmVjb3JkZXIgZm9yIGRlZmVycmVkIGRlbGl2ZXJ5IG9uIHRoZSBzY29wZS1saXN0IGNoYW5uZWxzXG4gICAqIChgc2NvcGVgICsgYGVtaXRgKSBhbmQvb3IgdGhlIGZsb3cgY2hhbm5lbC4gSWRlbXBvdGVudCBieSBpZCDigJQgc2FtZSBpZFxuICAgKiByZXBsYWNlcyB0aGUgcmVjb3JkZXIgb2JqZWN0OyBjaGFubmVsIGxpc3RzIE1FUkdFIGFjcm9zcyBjYWxscyAoc2FtZSBhc1xuICAgKiB0aGUgaW5saW5lIHRpZXIsIHdoZXJlIGBhdHRhY2hTY29wZVJlY29yZGVyKHgpYCArIGBhdHRhY2hGbG93UmVjb3JkZXIoeClgXG4gICAqIGxhbmRzIGB4YCBvbiBib3RoIGxpc3RzKS4gTGF0ZXIgYXR0YWNoZXMgcGFzc2luZyBkaXNwYXRjaGVyLWxldmVsXG4gICAqIG9wdGlvbnMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZmlyc3QgYXR0YWNoJ3MgY29uZmlndXJhdGlvbiBrZWVwIHRoZVxuICAgKiBvcmlnaW5hbCBjb25maWcgYW5kIGRldi13YXJuLlxuICAgKi9cbiAgcmVnaXN0ZXIoXG4gICAgcmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIgfCBGbG93UmVjb3JkZXIsXG4gICAgbGlzdHM6IHsgc2NvcGU/OiBib29sZWFuOyBmbG93PzogYm9vbGVhbiB9LFxuICAgIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMsXG4gICk6IHZvaWQge1xuICAgIHRoaXMud2Fybk9uQ29uZmlnQ29uZmxpY3QocmVjb3JkZXIuaWQsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGNoYW5uZWxzID0gdGhpcy5yZWdpc3RyYXRpb25zLmdldChyZWNvcmRlci5pZCk/LmNoYW5uZWxzID8/IG5ldyBTZXQ8Q2FwdHVyZUNoYW5uZWw+KCk7XG4gICAgaWYgKGxpc3RzLnNjb3BlKSBmb3IgKGNvbnN0IGMgb2YgU0NPUEVfTElTVF9DSEFOTkVMUykgY2hhbm5lbHMuYWRkKGMpO1xuICAgIGlmIChsaXN0cy5mbG93KSBmb3IgKGNvbnN0IGMgb2YgRkxPV19MSVNUX0NIQU5ORUxTKSBjaGFubmVscy5hZGQoYyk7XG4gICAgdGhpcy5yZWdpc3RyYXRpb25zLnNldChyZWNvcmRlci5pZCwgeyByZWNvcmRlciwgY2hhbm5lbHMgfSk7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmFkZExpc3RlbmVyKHJlY29yZGVyLmlkLCAoZW52ZWxvcGUpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMucmVnaXN0cmF0aW9ucy5nZXQocmVjb3JkZXIuaWQpO1xuICAgICAgaWYgKCFyZWdpc3RyYXRpb24gfHwgIXJlZ2lzdHJhdGlvbi5jaGFubmVscy5oYXMoZW52ZWxvcGUuY2hhbm5lbCkpIHJldHVybjtcbiAgICAgIC8vIFNBTUUgaW52b2tlIGhlbHBlciBhcyB0aGUgaW5saW5lIHRpZXIgKFJGQy0wMDEgwqc5IG1pdGlnYXRpb24pIOKAlCBhXG4gICAgICAvLyByZXR1cm5lZCBQcm9taXNlIGxhbmRzIGluIHRoZSBkaXNwYXRjaGVyJ3MgaW5mbGlnaHQgc2V0LlxuICAgICAgcmV0dXJuIGludm9rZVJlY29yZGVySG9vayhyZWNvcmRlciwgZW52ZWxvcGUubWV0aG9kLCBlbnZlbG9wZS5wYXlsb2FkKSBhcyB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIGNoYW5uZWwgbGlzdHMgZnJvbSBhIHJlZ2lzdHJhdGlvbiAobWlycm9ycyB0aGUgaW5saW5lXG4gICAqIHRpZXIsIHdoZXJlIGBkZXRhY2hTY29wZVJlY29yZGVyYCAvIGBkZXRhY2hGbG93UmVjb3JkZXJgIGVhY2ggY2xlYXIgb25lXG4gICAqIGxpc3QpLiBXaGVuIG5vIGNoYW5uZWxzIHJlbWFpbiwgdGhlIGxpc3RlbmVyIGlzIGZ1bGx5IHJlbW92ZWQuXG4gICAqL1xuICByZW1vdmVGcm9tTGlzdHMoaWQ6IHN0cmluZywgbGlzdHM6IHsgc2NvcGU/OiBib29sZWFuOyBmbG93PzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZWdpc3RyYXRpb25zLmdldChpZCk7XG4gICAgaWYgKCFyZWdpc3RyYXRpb24pIHJldHVybjtcbiAgICBpZiAobGlzdHMuc2NvcGUpIGZvciAoY29uc3QgYyBvZiBTQ09QRV9MSVNUX0NIQU5ORUxTKSByZWdpc3RyYXRpb24uY2hhbm5lbHMuZGVsZXRlKGMpO1xuICAgIGlmIChsaXN0cy5mbG93KSBmb3IgKGNvbnN0IGMgb2YgRkxPV19MSVNUX0NIQU5ORUxTKSByZWdpc3RyYXRpb24uY2hhbm5lbHMuZGVsZXRlKGMpO1xuICAgIGlmIChyZWdpc3RyYXRpb24uY2hhbm5lbHMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlTGlzdGVuZXIoaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYGlkYCBpcyByZWdpc3RlcmVkIGZvciBkZWZlcnJlZCBkZWxpdmVyeSAoYW55IGNoYW5uZWwpLiAqL1xuICBoYXMoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJhdGlvbnMuaGFzKGlkKTtcbiAgfVxuXG4gIC8qKiBEZWZlcnJlZCByZWNvcmRlcnMgd2hvc2UgcmVhY2ggaW5jbHVkZXMgdGhlIHNjb3BlIGxpc3QgKHNjb3BlK2VtaXQpLiAqL1xuICBzY29wZUxpc3RSZWNvcmRlcnMoKTogU2NvcGVSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5ieUNoYW5uZWwoJ3Njb3BlJykgYXMgU2NvcGVSZWNvcmRlcltdO1xuICB9XG5cbiAgLyoqIERlZmVycmVkIHJlY29yZGVycyB3aG9zZSByZWFjaCBpbmNsdWRlcyB0aGUgZmxvdyBjaGFubmVsLiAqL1xuICBmbG93TGlzdFJlY29yZGVycygpOiBGbG93UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnlDaGFubmVsKCdmbG93JykgYXMgRmxvd1JlY29yZGVyW107XG4gIH1cblxuICAvKiogUmVzZXQgZGVmZXJyZWQgcmVjb3JkZXJzIGJlZm9yZSBhIGZyZXNoIHJ1biAoc2FtZSBjb250cmFjdCBhcyBpbmxpbmUpLiAqL1xuICBjbGVhclJlY29yZGVycygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHsgcmVjb3JkZXIgfSBvZiB0aGlzLnJlZ2lzdHJhdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIChyZWNvcmRlciBhcyB7IGNsZWFyPzogKCkgPT4gdm9pZCB9KS5jbGVhcj8uKCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENhcHR1cmUgdGFwcyAoQmxvY2sgNykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBzeW50aGV0aWMgc2NvcGUtY2hhbm5lbCB0YXAg4oCUIGEgYFNjb3BlUmVjb3JkZXJgIHBsYWNlZCBvbiB0aGVcbiAgICogbm9ybWFsIHNjb3BlLXJlY29yZGVyIGxpc3Qgd2hvc2UgaG9va3MgY2FwdHVyZSBpbnRvIHRoZSBxdWV1ZS4gQnVpbHRcbiAgICogZnJlc2ggcGVyIHRyYXZlcnNlciBzbyBpdCByZWZsZWN0cyB0aGUgY3VycmVudCByZWdpc3RyYXRpb25zLiBPbmx5XG4gICAqIG1ldGhvZHMgc29tZSBkZWZlcnJlZCByZWNvcmRlciBhY3R1YWxseSBpbXBsZW1lbnRzIGFyZSBwcmVzZW50IChub1xuICAgKiB3YXN0ZWQgY2FwdHVyZXMpLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gbm90aGluZyBpcyByZWdpc3RlcmVkIGZvclxuICAgKiB0aGUgc2NvcGUgbGlzdC5cbiAgICpcbiAgICogUmVkYWN0aW9uIG9yZGVyaW5nOiB0aGUgdGFwIGlzIGludm9rZWQgZnJvbSB0aGUgU0FNRSBsb29wcyBhcyBpbmxpbmVcbiAgICogcmVjb3JkZXJzIChgX2ludm9rZUhvb2tgIC8gYGVtaXRFdmVudGApLCB3aGljaCByZWNlaXZlIGV2ZW50cyBBRlRFUiB0aGVcbiAgICogcmVkYWN0aW9uIGRlY2lzaW9uIOKAlCBzbyBhIGNhcHR1cmVkIHBheWxvYWQgY2FuIG5ldmVyIGNvbnRhaW4gYVxuICAgKiBwcmUtcmVkYWN0aW9uIHZhbHVlIHRoZSBpbmxpbmUgdGllciB3b3VsZCBub3QgaGF2ZSBzZWVuLlxuICAgKi9cbiAgYnVpbGRTY29wZVRhcCgpOiBTY29wZVJlY29yZGVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlcnMgPSB0aGlzLnNjb3BlTGlzdFJlY29yZGVycygpO1xuICAgIGlmIChyZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRhcDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGlkOiBERUZFUlJFRF9TQ09QRV9UQVBfSUQgfTtcbiAgICAvLyBEZXJpdmVkIGZyb20gdGhlIGhvb2sgcmVnaXN0cnk6IGV2ZXJ5IGhvb2sgb2YgdGhlIHNjb3BlIGNoYW5uZWwgYW5kIG9mIHRoZSBlbWl0IGNoYW5uZWxcbiAgICAvLyAod2hpY2ggcmlkZXMgdGhlIHNjb3BlIGxpc3QpIOKAlCBhIGhvb2sgdGhlIHJlZ2lzdHJ5IGdhaW5zIGlzIHRhcHBlZCB3aXRoIG5vIGVkaXQgaGVyZS5cbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgWydzY29wZScsICdlbWl0J10gYXMgY29uc3QpIHtcbiAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGhvb2tzT24oY2hhbm5lbCkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFueUltcGxlbWVudHMocmVjb3JkZXJzLCBtZXRob2QpKSBjb250aW51ZTtcbiAgICAgICAgdGFwW21ldGhvZF0gPSAoZXZlbnQ6IHVua25vd24pID0+IHRoaXMuY2FwdHVyZVNjb3BlRXZlbnQoY2hhbm5lbCwgbWV0aG9kLCBldmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXAgYXMgdW5rbm93biBhcyBTY29wZVJlY29yZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBzeW50aGV0aWMgZmxvdy1jaGFubmVsIHRhcCDigJQgYSBgRmxvd1JlY29yZGVyYCBhcHBlbmRlZCB0byB0aGVcbiAgICogZmxvdy1yZWNvcmRlcnMgbGlzdCBoYW5kZWQgdG8gdGhlIHRyYXZlcnNlci4gU2FtZSBjb250cmFjdCBhc1xuICAgKiB7QGxpbmsgYnVpbGRTY29wZVRhcH0uXG4gICAqL1xuICBidWlsZEZsb3dUYXAoKTogRmxvd1JlY29yZGVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlcnMgPSB0aGlzLmZsb3dMaXN0UmVjb3JkZXJzKCk7XG4gICAgaWYgKHJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgaWQ6IERFRkVSUkVEX0ZMT1dfVEFQX0lEIH07XG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgaG9va3NPbignZmxvdycpKSB7XG4gICAgICBpZiAoIXRoaXMuYW55SW1wbGVtZW50cyhyZWNvcmRlcnMsIG1ldGhvZCkpIGNvbnRpbnVlO1xuICAgICAgdGFwW21ldGhvZF0gPSAoZXZlbnQ6IHVua25vd24pID0+IHRoaXMuY2FwdHVyZUZsb3dFdmVudChtZXRob2QsIGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcCBhcyB1bmtub3duIGFzIEZsb3dSZWNvcmRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXJlY3QgY2FwdHVyZSBmb3IgZXhlY3V0b3Itc3ludGhlc2l6ZWQgZXZlbnRzIHRoYXQgYnlwYXNzIHRoZSBkaXNwYXRjaFxuICAgKiBzaXRlcyAoZS5nLiB0aGUgc3ludGhldGljIGBvblJlc3VtZWAgdGhlIGV4ZWN1dG9yIGZpcmVzIG9uIHJlc3VtZSkuXG4gICAqL1xuICBjYXB0dXJlKGNoYW5uZWw6IENhcHR1cmVDaGFubmVsLCBtZXRob2Q6IHN0cmluZywgcnVudGltZVN0YWdlSWQ6IHN0cmluZywgcnVuSWQ6IHN0cmluZywgcGF5bG9hZDogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2hlci5jYXB0dXJlKHsgY2hhbm5lbCwgbWV0aG9kLCBydW50aW1lU3RhZ2VJZCwgcnVuSWQsIHBheWxvYWQgfSk7XG4gIH1cblxuICAvLyDilIDilIAgVGVybWluYWwgZmx1c2ggKyBkcmFpbiAoQmxvY2sgOCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgZGVsaXZlciBldmVyeXRoaW5nIHN0aWxsIHF1ZXVlZCDigJQgY2FsbGVkIGJ5IHRoZSBleGVjdXRvclxuICAgKiBhdCB0aGUgT1VURVJNT1NUIHJ1biBib3VuZGFyeSAocmVzb2x2ZSwgcmVqZWN0LCBwYXVzZSksIEJFRk9SRSBgcnVuKClgXG4gICAqIHJldHVybnMgLyByZXRocm93cyAvIHRoZSBjaGVja3BvaW50IGJlY29tZXMgYXZhaWxhYmxlLiBJbnNwZWN0c1xuICAgKiBgZmx1c2hTeW5jYCdzIGByZW1haW5pbmdgIChyZXZpZXdlciBOMSk6IGBmbHVzaFN5bmNgIGFscmVhZHkgbG9vcHNcbiAgICogc25hcHNob3Qgcm91bmRzIHVwIHRvIGl0cyBydW5hd2F5LWNhc2NhZGUgY2FwLCBzbyBhIG5vbi16ZXJvIHJlbWFpbmRlclxuICAgKiBtZWFucyBhIHBhdGhvbG9naWNhbCBzZWxmLWVucXVldWVpbmcgbGlzdGVuZXIg4oCUIGNvdW50ZWQgaW5cbiAgICogYG9ic2VydmVyU3RhdHMudGVybWluYWxTdHJhbmRlZGAgYW5kIGRldi13YXJuZWQsIG5ldmVyIHNpbGVudC5cbiAgICovXG4gIHRlcm1pbmFsRmx1c2goKTogdm9pZCB7XG4gICAgY29uc3QgeyByZW1haW5pbmcgfSA9IHRoaXMuZGlzcGF0Y2hlci5mbHVzaE5vdygpO1xuICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICB0aGlzLnRlcm1pbmFsU3RyYW5kZWQgKz0gcmVtYWluaW5nO1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludGpzXSBkZWZlcnJlZCBvYnNlcnZlcnM6IHRlcm1pbmFsIGZsdXNoIGhpdCB0aGUgcnVuYXdheS1jYXNjYWRlIGNhcCB3aXRoICR7cmVtYWluaW5nfSBgICtcbiAgICAgICAgICAgICdldmVudChzKSBzdGlsbCBxdWV1ZWQg4oCUIGEgbGlzdGVuZXIga2VwdCBlbnF1ZXVlaW5nIGR1cmluZyB0aGUgZmx1c2guIFRoZSBzdHJhbmRlZCBjb3VudCBpcyAnICtcbiAgICAgICAgICAgICdzdXJmYWNlZCBvbiBzbmFwc2hvdC5vYnNlcnZlclN0YXRzLnRlcm1pbmFsU3RyYW5kZWQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIGJhY2tsb2csIHRoZW4gc2V0dGxlIGFzeW5jIGxpc3RlbmVyIGNvbnRpbnVhdGlvbnMgdW5kZXIgYVxuICAgKiBkZWFkbGluZSDigJQgdGhlIHNlcnZlcmxlc3MgLyBncmFjZWZ1bC1zaHV0ZG93biBwYXR0ZXJuIChSRkMtMDAxIMKnMTEpLlxuICAgKi9cbiAgZHJhaW4ob3B0cz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPE9ic2VydmVyRHJhaW5SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyLmRyYWluKG9wdHMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN0YXRzIChCbG9jayA5KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhlIGBzbmFwc2hvdC5vYnNlcnZlclN0YXRzYCBwYXlsb2FkIOKAlCBBNCBzdGF0cyArIEJsb2NrIDggc3RyYW5kaW5nLiAqL1xuICBnZXRTdGF0cygpOiBPYnNlcnZlclN0YXRzIHtcbiAgICByZXR1cm4geyAuLi50aGlzLmRpc3BhdGNoZXIuZ2V0U3RhdHMoKSwgdGVybWluYWxTdHJhbmRlZDogdGhpcy50ZXJtaW5hbFN0cmFuZGVkIH07XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgYnlDaGFubmVsKGNoYW5uZWw6IENhcHR1cmVDaGFubmVsKTogQXJyYXk8U2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcj4ge1xuICAgIGNvbnN0IG91dDogQXJyYXk8U2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcj4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHsgcmVjb3JkZXIsIGNoYW5uZWxzIH0gb2YgdGhpcy5yZWdpc3RyYXRpb25zLnZhbHVlcygpKSB7XG4gICAgICBpZiAoY2hhbm5lbHMuaGFzKGNoYW5uZWwpKSBvdXQucHVzaChyZWNvcmRlcik7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogTm9ybWFsIHByb3BlcnR5IGxvb2t1cCDigJQgaW52b2NhdGlvbiBwYXJpdHkgd2l0aCB0aGUgaW5saW5lIHRpZXIuICovXG4gIHByaXZhdGUgYW55SW1wbGVtZW50cyhyZWNvcmRlcnM6IEFycmF5PFNjb3BlUmVjb3JkZXIgfCBGbG93UmVjb3JkZXI+LCBtZXRob2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmRlcnMuc29tZSgocikgPT4gdHlwZW9mIChyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW21ldGhvZF0gPT09ICdmdW5jdGlvbicpO1xuICB9XG5cbiAgLyoqIFNjb3BlL2VtaXQgZXZlbnRzIGNhcnJ5IHRoZWlyIG93biBpZHMgKGBydW50aW1lU3RhZ2VJZGAgKyBgcGlwZWxpbmVJZGApLiAqL1xuICBwcml2YXRlIGNhcHR1cmVTY29wZUV2ZW50KGNoYW5uZWw6IENhcHR1cmVDaGFubmVsLCBtZXRob2Q6IHN0cmluZywgZXZlbnQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBlID0gZXZlbnQgYXMgeyBydW50aW1lU3RhZ2VJZD86IHN0cmluZzsgcGlwZWxpbmVJZD86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuZGlzcGF0Y2hlci5jYXB0dXJlKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBtZXRob2QsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZT8ucnVudGltZVN0YWdlSWQgPz8gJycsXG4gICAgICBydW5JZDogZT8ucGlwZWxpbmVJZCA/PyAnJyxcbiAgICAgIHBheWxvYWQ6IGV2ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEZsb3cgZXZlbnRzIGNhcnJ5IGlkcyBvbiBgdHJhdmVyc2FsQ29udGV4dGAgKGFic2VudCBvbiBhIGZldyBldmVudHMpLiAqL1xuICBwcml2YXRlIGNhcHR1cmVGbG93RXZlbnQobWV0aG9kOiBzdHJpbmcsIGV2ZW50OiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gKGV2ZW50IGFzIHsgdHJhdmVyc2FsQ29udGV4dD86IHsgcnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7IHJ1bklkPzogc3RyaW5nIH0gfSB8IHVuZGVmaW5lZClcbiAgICAgID8udHJhdmVyc2FsQ29udGV4dDtcbiAgICB0aGlzLmRpc3BhdGNoZXIuY2FwdHVyZSh7XG4gICAgICBjaGFubmVsOiAnZmxvdycsXG4gICAgICBtZXRob2QsXG4gICAgICBydW50aW1lU3RhZ2VJZDogY3R4Py5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICAgIHJ1bklkOiBjdHg/LnJ1bklkID8/ICcnLFxuICAgICAgcGF5bG9hZDogZXZlbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgYSBkZWZlcnJlZCBsaXN0ZW5lciBmYWlsdXJlIGludG8gdGhlIGV4aXN0aW5nIHJlY29yZGVyIGVycm9yXG4gICAqIGNoYW5uZWw6IGV2ZXJ5IHJlZ2lzdGVyZWQgc2NvcGUgb2JzZXJ2ZXIg4oCUIHRoZSBmYWlsaW5nIG9uZSBpbmNsdWRlZCwgaW5cbiAgICogcmVnaXN0cmF0aW9uIG9yZGVyIOKAlCByZWNlaXZlcyB0aGUgc2NvcGUtc2hhcGVkIGBvbkVycm9yYCBldmVudCB0aGUgaW5saW5lXG4gICAqIHRpZXIgYnVpbGRzIChgcmVjb3JkZXJGYWlsdXJlRXZlbnRgKSwgYW5kIGEgdGhyb3cgZnJvbSBgb25FcnJvcmAgaXRzZWxmXG4gICAqIGlzIG5vdCByb3V0ZWQgYWdhaW46IHRoZSBjb250cmFjdCB0aGUgaW5saW5lIHRpZXIgaG9ub3JzIHdoZW4gYSByZWNvcmRlclxuICAgKiB0aHJvd3MgbWlkLWRpc3BhdGNoICg5LjM5LjAg4oCUIGJlZm9yZSwgdGhlIGZhaWxpbmcgbGlzdGVuZXIgd2FzIHNraXBwZWQsXG4gICAqIHNvIGEgQ29tcG9zaXRlUmVjb3JkZXIncyBvdGhlciBjaGlsZHJlbiBuZXZlciBoZWFyZCBhIHNpYmxpbmcncyB0aHJvdykuXG4gICAqIFRoZSBlcnJvciBzaW5rIG11c3QgbmV2ZXIgYmVjb21lIGFuIGVycm9yIHNvdXJjZTogc2luayB0aHJvd3MgYXJlXG4gICAqIHN3YWxsb3dlZCAoaXNvbGF0aW9uIGlzIGFic29sdXRlKS5cbiAgICovXG4gIHByaXZhdGUgcm91dGVMaXN0ZW5lckVycm9yKFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIGxpc3RlbmVySWQ6IHN0cmluZyxcbiAgICBlbnZlbG9wZTogQ2FwdHVyZUVudmVsb3BlLFxuICAgIHBoYXNlOiAnc3luYycgfCAnYXN5bmMnLFxuICApOiB2b2lkIHtcbiAgICAvLyBJbmxpbmUgcGFyaXR5ICg5LjM5LjApOiB0aGUgaW5saW5lIHRpZXIgaGFuZHMgYSByZWNvcmRlcidzIHRocm93IHRvIEVWRVJZIHJlY29yZGVyIG9uIHRoZVxuICAgIC8vIHNjb3BlIGxpc3Qg4oCUIHRoZSB0aHJvd2VyIGluY2x1ZGVkLCBzbyBhIENvbXBvc2l0ZVJlY29yZGVyJ3Mgb3RoZXIgY2hpbGRyZW4gaGVhciBpdCDigJQgYW5kXG4gICAgLy8gZHJvcHMgYSB0aHJvdyBmcm9tIGBvbkVycm9yYCBpdHNlbGYuIFNhbWUgaGVyZSwgd2l0aCB0aGUgc2FtZSBldmVudCAoYHJlY29yZGVyRmFpbHVyZUV2ZW50YCkuXG4gICAgaWYgKGVudmVsb3BlLm1ldGhvZCAhPT0gJ29uRXJyb3InKSB0aGlzLmRlbGl2ZXJMaXN0ZW5lckVycm9yKGVycm9yLCBlbnZlbG9wZSk7XG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludGpzXSBkZWZlcnJlZCBvYnNlcnZlciAnJHtsaXN0ZW5lcklkfScgZmFpbGVkICgke3BoYXNlfSkgaGFuZGxpbmcgYCArXG4gICAgICAgICAgYCR7ZW52ZWxvcGUuY2hhbm5lbH0uJHtlbnZlbG9wZS5tZXRob2R9IChzZXEgJHtlbnZlbG9wZS5zZXF9KTogJHtkZXNjcmliZVRocm93bihlcnJvcil9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEhhbmQgb25lIGxpc3RlbmVyIGZhaWx1cmUgdG8gZXZlcnkgc2NvcGUgb2JzZXJ2ZXIgYXMgYW4gYG9uRXJyb3JgIOKAlCBzZWUge0BsaW5rIHJvdXRlTGlzdGVuZXJFcnJvcn0uICovXG4gIHByaXZhdGUgZGVsaXZlckxpc3RlbmVyRXJyb3IoZXJyb3I6IHVua25vd24sIGVudmVsb3BlOiBDYXB0dXJlRW52ZWxvcGUpOiB2b2lkIHtcbiAgICBjb25zdCBlcnJvckV2ZW50ID0gcmVjb3JkZXJGYWlsdXJlRXZlbnQoXG4gICAgICB7XG4gICAgICAgIHN0YWdlTmFtZTogJycsXG4gICAgICAgIHN0YWdlSWQ6IHN0YWdlSWRPZihlbnZlbG9wZS5ydW50aW1lU3RhZ2VJZCksXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBlbnZlbG9wZS5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogZW52ZWxvcGUucnVuSWQsXG4gICAgICB9LFxuICAgICAgZXJyb3IsXG4gICAgICBlbnZlbG9wZS5tZXRob2QsXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IFssIHsgcmVjb3JkZXIsIGNoYW5uZWxzIH1dIG9mIHRoaXMucmVnaXN0cmF0aW9ucykge1xuICAgICAgLy8gSW5saW5lLXRpZXIgcGFyaXR5IChyZXZpZXcgQ1JJVElDQUwtMSk6IHRoZSBzeW50aGVzaXplZCBldmVudCBpc1xuICAgICAgLy8gc2NvcGUtdHlwZWQsIHNvIGl0IHJlYWNoZXMgT05MWSByZWNvcmRlcnMgcmVnaXN0ZXJlZCBvbiB0aGUgc2NvcGVcbiAgICAgIC8vIGxpc3RzIOKAlCBhIGZsb3ctb25seSByZWNvcmRlciBuZXZlciByZWNlaXZlcyBzY29wZS1jaGFubmVsIGVycm9yc1xuICAgICAgLy8gaW5saW5lIGFuZCBtdXN0IG5vdCBoZXJlIGVpdGhlci5cbiAgICAgIGlmICghY2hhbm5lbHMuaGFzKCdzY29wZScpKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGludm9rZVJlY29yZGVySG9vayhyZWNvcmRlciwgJ29uRXJyb3InLCBlcnJvckV2ZW50KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTd2FsbG93IOKAlCBzYW1lIHJ1bGUgYXMgRGVmZXJyZWREaXNwYXRjaGVyLnNhZmVPbkVycm9yLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBEaXNwYXRjaGVyLWxldmVsIG9wdGlvbnMgYXJlIGZpcnN0LWF0dGFjaC13aW5zOyBkaWZmZXJpbmcgbGF0ZXIgdmFsdWVzIGRldi13YXJuLiAqL1xuICBwcml2YXRlIHdhcm5PbkNvbmZpZ0NvbmZsaWN0KHJlY29yZGVySWQ6IHN0cmluZywgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuICAgIGNvbnN0IGNvbmZsaWN0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXF1ZXN0ZWQ6IEFwcGxpZWREaXNwYXRjaGVyQ29uZmlnID0ge1xuICAgICAgY2FwdHVyZTogb3B0aW9ucy5jYXB0dXJlLFxuICAgICAgbWF4UXVldWU6IG9wdGlvbnMubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0aW9ucy5vdmVyZmxvdyxcbiAgICAgIHNhbXBsZUV2ZXJ5OiBvcHRpb25zLnNhbXBsZUV2ZXJ5LFxuICAgICAgZmx1c2hCdWRnZXRNczogb3B0aW9ucy5mbHVzaEJ1ZGdldE1zLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVxdWVzdGVkKSBhcyBBcnJheTxrZXlvZiBBcHBsaWVkRGlzcGF0Y2hlckNvbmZpZz4pIHtcbiAgICAgIGlmIChyZXF1ZXN0ZWRba2V5XSAhPT0gdW5kZWZpbmVkICYmIHJlcXVlc3RlZFtrZXldICE9PSB0aGlzLmFwcGxpZWRDb25maWdba2V5XSkge1xuICAgICAgICBjb25mbGljdHMucHVzaChTdHJpbmcoa2V5KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb25mbGljdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kZXZXYXJuRGVkdXBlZChcbiAgICAgICAgYFtmb290cHJpbnRqc10gYXR0YWNoICcke3JlY29yZGVySWR9JzogdGhlIGV4ZWN1dG9yJ3MgZGVmZXJyZWQtb2JzZXJ2ZXIgcXVldWUgd2FzIGFscmVhZHkgYCArXG4gICAgICAgICAgYGNvbmZpZ3VyZWQgYnkgdGhlIGZpcnN0IGRlZmVycmVkIGF0dGFjaCDigJQgaWdub3JpbmcgZGlmZmVyaW5nIG9wdGlvbihzKTogJHtjb25mbGljdHMuam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICdPbmUgZXhlY3V0b3IgaGFzIE9ORSBtZXJnZWQgcXVldWU7IGNvbmZpZ3VyZSBpdCBvbiB0aGUgZmlyc3QgZGVmZXJyZWQgYXR0YWNoLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBgaXNEZXZNb2RlKClgLWdhdGVkLCBkZWR1cGxpY2F0ZWQgd2FybmVyIOKAlCB0aGUgYm91bmQgd2FybiBzZWFtLiAqL1xuICBwcml2YXRlIGRldldhcm5EZWR1cGVkKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNEZXZNb2RlKCkpIHJldHVybjtcbiAgICBpZiAodGhpcy53YXJuZWRNZXNzYWdlcy5oYXMobWVzc2FnZSkpIHJldHVybjtcbiAgICB0aGlzLndhcm5lZE1lc3NhZ2VzLmFkZChtZXNzYWdlKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxufVxuIl19
363
+ /**
364
+ * The run's correlation the failed event carried, as captured — a scope or emit event's own `correlation`, a flow
365
+ * event's on its `traversalContext` — spread into the synthesized `onError` (10.1). Empty when it carried none.
366
+ */
367
+ function correlationOf(payload) {
368
+ if (payload === null || typeof payload !== 'object')
369
+ return {};
370
+ const event = payload;
371
+ const correlation = event.correlation ?? event.traversalContext?.correlation;
372
+ return correlation !== null && typeof correlation === 'object' ? { correlation: correlation } : {};
373
+ }
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmZXJyZWRPYnNlcnZlclRpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9EZWZlcnJlZE9ic2VydmVyVGllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Q0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQU9MLGtCQUFrQixHQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUE2RHJGLHlGQUF5RjtBQUN6RixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyx1QkFBdUIsQ0FBQztBQUU1RCw2RUFBNkU7QUFDN0UsTUFBTSxtQkFBbUIsR0FBOEIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekUsK0NBQStDO0FBQy9DLE1BQU0sa0JBQWtCLEdBQThCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFpQi9ELE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxVQUFVLENBQXFCO0lBQy9CLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUN4RCxhQUFhLENBQTBCO0lBQ3hELDJFQUEyRTtJQUMxRCxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM1QyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFFN0IsWUFBWSxPQUErQjtRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ25CLG9FQUFvRTtZQUNwRSxr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Q0osQ0FBQztJQUNILENBQUM7SUFFRCxzRUFBc0U7SUFDOUQsY0FBYyxDQUFDLE9BQWU7UUFDcEMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU87UUFDekIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPO1FBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLE9BQWdCO0lBQ3JDLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDL0QsTUFBTSxLQUFLLEdBQUcsT0FBa0YsQ0FBQztJQUNqRyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUM7SUFDN0UsT0FBTyxXQUFXLEtBQUssSUFBSSxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsV0FBNkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDdkgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcnVubmVyL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLnRzIOKAlCBSRkMtMDAxIEJsb2NrcyA24oCTOTogdGhlIGVuZ2luZSB3aXJpbmcgb2ZcbiAqIHRoZSBkZWZlcnJlZC1vYnNlcnZlciBwaXBlbGluZS5cbiAqXG4gKiBQYXR0ZXJuOiAgVGhpbiBhZGFwdGVyIGJldHdlZW4gdGhlIGV4ZWN1dG9yJ3MgdGhyZWUgb2JzZXJ2ZXIgY2hhbm5lbHMgYW5kXG4gKiAgICAgICAgICAgdGhlIFBVUkUgYG9ic2VydmVyLXF1ZXVlYCBtb2R1bGUuIFRoZSBwdXJlIG1vZHVsZSBzdGF5c1xuICogICAgICAgICAgIGVuZ2luZS1mcmVlIChpdCBpbXBvcnRzIG5vdGhpbmcgZnJvbSB0aGUgZW5naW5lIOKAlCB0aGUgZW5naW5lXG4gKiAgICAgICAgICAgaW1wb3J0cyBJVCk7IHRoaXMgdGllciBvd25zIGV2ZXJ5IGVuZ2luZS1mbGF2b3JlZCBjb25jZXJuOlxuICogICAgICAgICAgICAgLSB0aGUgYGlzRGV2TW9kZSgpYC1nYXRlZCwgZGVkdXBsaWNhdGVkIGBDYXB0dXJlSG9va3Mud2FybmBcbiAqICAgICAgICAgICAgICAgYmluZGluZyAodGhlIGRldi13YXJuIHNlYW0sIFJGQy0wMDEgwqdcIlJlc29sdXRpb25cIik7XG4gKiAgICAgICAgICAgICAtIHJvdXRpbmcgYERlZmVycmVkRGlzcGF0Y2hlci5vbkVycm9yYCBpbnRvIHRoZSBleGlzdGluZ1xuICogICAgICAgICAgICAgICByZWNvcmRlciBlcnJvciBjaGFubmVsIChgb25FcnJvcmAgb24gc2libGluZyBvYnNlcnZlcnMpO1xuICogICAgICAgICAgICAgLSB0aGUgY2FwdHVyZSBUQVBTIOKAlCBzeW50aGV0aWMgcmVjb3JkZXJzIHBsYWNlZCBvbiB0aGVcbiAqICAgICAgICAgICAgICAgZXhpc3RpbmcgaW5saW5lIGRpc3BhdGNoIGxpc3RzIHNvIHRoZSB0aHJlZSBkaXNwYXRjaCBzaXRlc1xuICogICAgICAgICAgICAgICAoYFNjb3BlRmFjYWRlLl9pbnZva2VIb29rYCwgYFNjb3BlRmFjYWRlLmVtaXRFdmVudGAsXG4gKiAgICAgICAgICAgICAgIGBGbG93UmVjb3JkZXJEaXNwYXRjaGVyYCkgbmVlZCBOTyBwZXItc2l0ZSB0aWVyIGxvZ2ljOiBhXG4gKiAgICAgICAgICAgICAgIHRhcCdzIGhvb2sgYm9keSBJUyBgZGlzcGF0Y2hlci5jYXB0dXJlKC4uLilgLCBhbmQgYmVjYXVzZVxuICogICAgICAgICAgICAgICB0aGUgdGFwIHNpdHMgaW4gdGhlIHNhbWUgbG9vcCBhcyBpbmxpbmUgcmVjb3JkZXJzIGl0IHNlZXNcbiAqICAgICAgICAgICAgICAgZXhhY3RseSB0aGUgcG9zdC1yZWRhY3Rpb24gZXZlbnQgb2JqZWN0IGlubGluZSBvYnNlcnZlcnNcbiAqICAgICAgICAgICAgICAgc2VlIOKAlCBjYXB0dXJlIGNhbiBuZXZlciBvYnNlcnZlIGEgcHJlLXJlZGFjdGlvbiB2YWx1ZTtcbiAqICAgICAgICAgICAgIC0gdGhlIHRlcm1pbmFsIGZsdXNoIChCbG9jayA4KSB3aXRoIGhvbmVzdCBzdHJhbmRpbmdcbiAqICAgICAgICAgICAgICAgYWNjb3VudGluZywgYW5kIHRoZSBCbG9jayA5IHN0YXRzIHN1cmZhY2UuXG4gKlxuICogUm9sZTogICAgIE9uZSBpbnN0YW5jZSBwZXIgYEZsb3dDaGFydEV4ZWN1dG9yYCwgY3JlYXRlZCBMQVpJTFkgb24gdGhlXG4gKiAgICAgICAgICAgZmlyc3QgYGRlbGl2ZXJ5OiAnZGVmZXJyZWQnYCBhdHRhY2ggKHplcm8gYWxsb2NhdGlvbiB3aGVuIG5vYm9keVxuICogICAgICAgICAgIG9wdHMgaW4g4oCUIG1pcnJvcnMgdGhlIGVtaXQgZmFzdC1wYXRoIHByZWNlZGVudCkuIEhvbGRzIHRoZSBPTkVcbiAqICAgICAgICAgICBgRGVmZXJyZWREaXNwYXRjaGVyYCAob25lIG1lcmdlZCBxdWV1ZSwgdG90YWwgb3JkZXIgYWNyb3NzXG4gKiAgICAgICAgICAgY2hhbm5lbHMpIHBsdXMgdGhlIHJlZ2lzdHJ5IG9mIGRlZmVycmVkIHJlY29yZGVycy5cbiAqXG4gKiBEZWxpdmVyeTogYSBkZWZlcnJlZCByZWNvcmRlcidzIGhvb2tzIGFyZSBpbnZva2VkIHRocm91Z2ggdGhlIFNBTUVcbiAqIGBpbnZva2VSZWNvcmRlckhvb2tgIGhlbHBlciB0aGUgaW5saW5lIHRpZXIgdXNlcyAoUkZDLTAwMSDCpzkgbWl0aWdhdGlvbikg4oCUXG4gKiBvbmUgYmVhdCBiZWhpbmQsIHdpdGggYGVudmVsb3BlLnBheWxvYWRgIG1hdGVyaWFsaXplZCBwZXIgdGhlIGNhcHR1cmVcbiAqIHBvbGljeSAoYCdjbG9uZSdgIGRlZmF1bHQgYXQgdGhpcyBhdHRhY2ggdGllciDigJQgZnVsbCBzdHJ1Y3R1cmFsIGNvcHksXG4gKiBldmVudC1zaGFwZSBjb21wYXRpYmxlIHdpdGggaW5saW5lOyBleHBsaWNpdCBgJ3N1bW1hcnknYCDigJQgYm91bmRlZCxcbiAqIHJlZmVyZW5jZS1mcmVlOyBgJ3JlZidgIOKAlCB0aGUgbGl2ZSBldmVudCBvYmplY3QsIGRldi13YXJuZWQpLiBUaGUgc3RhbmRhbG9uZVxuICogcXVldWUgcmV0YWlucyBpdHMgYCdzdW1tYXJ5J2AgZGVmYXVsdCAoYG9ic2VydmVyLXF1ZXVlL21lcmdlZFF1ZXVlLnRzIMK3IE1lcmdlZFF1ZXVlYCkuXG4gKlxuICogQ2hhbm5lbCBmaWx0ZXI6IGEgcmVnaXN0cmF0aW9uIHJlbWVtYmVycyB3aGljaCBjaGFubmVscyB3b3VsZCBoYXZlXG4gKiByZWFjaGVkIHRoZSByZWNvcmRlciBpbmxpbmUgKHNjb3BlLWxpc3QgcmVjb3JkZXJzIHNlZSBgc2NvcGVgICsgYGVtaXRgXG4gKiBlbnZlbG9wZXM7IGZsb3ctbGlzdCByZWNvcmRlcnMgc2VlIGBmbG93YCBlbnZlbG9wZXMpIGFuZCBza2lwcyB0aGUgcmVzdCDigJRcbiAqIHNhbWUgcmVhY2ggYXMgdGhlIGlubGluZSB0aWVyLCBvbmUgYmVhdCBiZWhpbmQuXG4gKi9cblxuaW1wb3J0IHsgc3RhZ2VJZE9mIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBSdW5Db3JyZWxhdGlvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHsgaW52b2tlUmVjb3JkZXJIb29rIH0gZnJvbSAnLi4vY2FwdHVyZS9pbnZva2VIb29rLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ2FwdHVyZUNoYW5uZWwsXG4gIHR5cGUgQ2FwdHVyZUVudmVsb3BlLFxuICB0eXBlIENhcHR1cmVQb2xpY3ksXG4gIHR5cGUgRGlzcGF0Y2hlclN0YXRzLFxuICB0eXBlIERyYWluUmVzdWx0LFxuICB0eXBlIE92ZXJmbG93UG9saWN5LFxuICBEZWZlcnJlZERpc3BhdGNoZXIsXG59IGZyb20gJy4uL29ic2VydmVyLXF1ZXVlL2luZGV4LmpzJztcbmltcG9ydCB7IGRlc2NyaWJlVGhyb3duLCBob29rc09uLCByZWNvcmRlckZhaWx1cmVFdmVudCB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcblxuLyoqIERlbGl2ZXJ5IHRpZXIgZm9yIGFuIGF0dGFjaGVkIG9ic2VydmVyIChSRkMtMDAxKS4gKi9cbmV4cG9ydCB0eXBlIE9ic2VydmVyRGVsaXZlcnkgPSAnaW5saW5lJyB8ICdkZWZlcnJlZCc7XG5cbi8qKlxuICogT3B0aW9ucyBiYWcgYWNjZXB0ZWQgYnkgZXZlcnkgYGF0dGFjaCpSZWNvcmRlcmAgY2FsbC5cbiAqXG4gKiBgZGVsaXZlcnk6ICdkZWZlcnJlZCdgIG9wdHMgdGhlIHJlY29yZGVyIGludG8gdGhlIGJvdW5kZWQgY2FwdHVyZSBxdWV1ZVxuICogKFwib25lIGJlYXQgYmVoaW5kXCIpOyBhYnNlbnQgLyBgJ2lubGluZSdgIGtlZXBzIHRoZSBoaXN0b3JpY2FsIHN5bmNocm9ub3VzXG4gKiBjYWxsIOKAlCBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLVJGQyBwYXRoLlxuICpcbiAqIFRoZSByZW1haW5pbmcgZmllbGRzIGNvbmZpZ3VyZSB0aGUgZXhlY3V0b3IncyBPTkUgc2hhcmVkIGRpc3BhdGNoZXIgYW5kXG4gKiBhcmUgYXBwbGllZCB3aGVuIHRoZSBGSVJTVCBkZWZlcnJlZCBhdHRhY2ggY3JlYXRlcyBpdDsgbGF0ZXIgYXR0YWNoZXNcbiAqIHBhc3NpbmcgZGlmZmVyZW50IHZhbHVlcyBnZXQgYSBkZXYtbW9kZSB3YXJuaW5nIGFuZCBrZWVwIHRoZSBvcmlnaW5hbFxuICogY29uZmlndXJhdGlvbiAob25lIHF1ZXVlIHBlciBleGVjdXRvciDigJQgcGVyLXJlY29yZGVyIHF1ZXVlcyB3b3VsZCBicmVha1xuICogdGhlIHRvdGFsIGNyb3NzLWNoYW5uZWwgb3JkZXIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGFjaFJlY29yZGVyT3B0aW9ucyB7XG4gIC8qKiBgJ2RlZmVycmVkJ2AgPSBjYXB0dXJlIOKGkiBxdWV1ZSDihpIgbmV4dC1jaGVja3BvaW50IGRlbGl2ZXJ5LiBEZWZhdWx0IGAnaW5saW5lJ2AuICovXG4gIHJlYWRvbmx5IGRlbGl2ZXJ5PzogT2JzZXJ2ZXJEZWxpdmVyeTtcbiAgLyoqXG4gICAqIFBheWxvYWQgbWF0ZXJpYWxpemF0aW9uIGF0IGNhcHR1cmUgdGltZS4gRGVmYXVsdCBgJ2Nsb25lJ2Ag4oCUIHlvdXJcbiAgICogcmVjb3JkZXIncyBob29rcyByZWNlaXZlIHRoZSBTQU1FIGV2ZW50IHNoYXBlIGFzIGlubGluZSBkZWxpdmVyeVxuICAgKiAoYHN0cnVjdHVyZWRDbG9uZWBkOyBgZS5rZXlgL2BlLnZhbHVlYC9gZS5ydW50aW1lU3RhZ2VJZGAgYWxsIHdvcmtcbiAgICogdW5jaGFuZ2VkKSwgc28gYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgaXMgYSBkcm9wLWluIHBvcnQuXG4gICAqIGAnc3VtbWFyeSdgIOKAlCBhIGJvdW5kZWQgdHlwZS9zaXplL3ByZXZpZXcgZGlnZXN0IChgUGF5bG9hZFN1bW1hcnlgKVxuICAgKiBpbnN0ZWFkIG9mIHRoZSBldmVudCBzaGFwZTogY2hlYXBlciBjYXB0dXJlIGZvciB0ZWxlbWV0cnktb25seVxuICAgKiBjb25zdW1lcnMgdGhhdCBkb24ndCByZWFkIGRvbWFpbiBmaWVsZHMuIGAncmVmJ2Ag4oCUIHBhc3MtdGhyb3VnaCBieVxuICAgKiByZWZlcmVuY2U7IHRoZSBjYWxsZXIgYXNzZXJ0cyBpbW11dGFiaWxpdHkgKGRldi1tb2RlIHdhcm5zKS5cbiAgICovXG4gIHJlYWRvbmx5IGNhcHR1cmU/OiBDYXB0dXJlUG9saWN5O1xuICAvKiogUXVldWUgYm91bmQg4oCUIGRlZmF1bHQgMTAgMDAwLiAqL1xuICByZWFkb25seSBtYXhRdWV1ZT86IG51bWJlcjtcbiAgLyoqIE92ZXJmbG93IHBvbGljeSBhdCBgbWF4UXVldWVgIOKAlCBkZWZhdWx0IGAnZHJvcC1vbGRlc3QnYC4gKi9cbiAgcmVhZG9ubHkgb3ZlcmZsb3c/OiBPdmVyZmxvd1BvbGljeTtcbiAgLyoqIGAnc2FtcGxlJ2Agb3ZlcmZsb3cgb25seSDigJQgYWRtaXQgMSBpbiB0aGlzIG1hbnkgc2F0dXJhdGVkIGFycml2YWxzLiAqL1xuICByZWFkb25seSBzYW1wbGVFdmVyeT86IG51bWJlcjtcbiAgLyoqIFBlci1jaGVja3BvaW50IGZsdXNoIGJ1ZGdldCwgbXMgKEExKSDigJQgZGVmYXVsdCAyOyBgSW5maW5pdHlgID0gZnVsbCBkcmFpbi4gKi9cbiAgcmVhZG9ubHkgZmx1c2hCdWRnZXRNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgQmxvY2sgOSBvYnNlcnZhYmlsaXR5IHN1cmZhY2Ug4oCUIGBzbmFwc2hvdC5vYnNlcnZlclN0YXRzYC4gVGhlIEE0XG4gKiBkaXNwYXRjaGVyIHN0YXRzIHBsdXMgdGhlIHRlcm1pbmFsLWZsdXNoIHN0cmFuZGluZyBjb3VudCBmcm9tIEJsb2NrIDguXG4gKiBQcmVzZW50IG9uIGBSdW50aW1lU25hcHNob3RgIG9ubHkgd2hlbiBhIGRlZmVycmVkIG9ic2VydmVyIHdhcyBhdHRhY2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZlclN0YXRzIGV4dGVuZHMgRGlzcGF0Y2hlclN0YXRzIHtcbiAgLyoqXG4gICAqIEVudmVsb3BlcyBzdGlsbCBxdWV1ZWQgd2hlbiBhIHRlcm1pbmFsIGZsdXNoIGhpdCBpdHMgcnVuYXdheS1jYXNjYWRlXG4gICAqIHJvdW5kIGNhcCAoQmxvY2sgOCkuIGAwYCBpbiBhbnkgc2FuZSBydW4g4oCUIGEgbm9uLXplcm8gdmFsdWUgbWVhbnMgYVxuICAgKiBsaXN0ZW5lciBrZXB0IGVucXVldWVpbmcgd29yayBhdCBlbmQtb2YtcnVuIGFuZCBkZWxpdmVyeSB3YXMgY3V0IG9mZlxuICAgKiAoYWxzbyBkZXYtd2FybmVkIGF0IHRoZSBtb21lbnQgaXQgaGFwcGVuZWQpLiBOZXZlciBzaWxlbnQuXG4gICAqL1xuICByZWFkb25seSB0ZXJtaW5hbFN0cmFuZGVkOiBudW1iZXI7XG59XG5cbi8qKiBSZXN1bHQgc2hhcGUgb2YgYGV4ZWN1dG9yLmRyYWluT2JzZXJ2ZXJzKClgIOKAlCBzZWUgYERyYWluUmVzdWx0YC4gKi9cbmV4cG9ydCB0eXBlIE9ic2VydmVyRHJhaW5SZXN1bHQgPSBEcmFpblJlc3VsdDtcblxuLyoqIFdlbGwta25vd24gaWRzIG9mIHRoZSBzeW50aGV0aWMgY2FwdHVyZSB0YXBzIChpbnRlcm5hbCwgZG9jdW1lbnRlZCBmb3IgZGVidWdnaW5nKS4gKi9cbmV4cG9ydCBjb25zdCBERUZFUlJFRF9TQ09QRV9UQVBfSUQgPSAnX19kZWZlcnJlZC1zY29wZS10YXBfXyc7XG5leHBvcnQgY29uc3QgREVGRVJSRURfRkxPV19UQVBfSUQgPSAnX19kZWZlcnJlZC1mbG93LXRhcF9fJztcblxuLyoqIENoYW5uZWwgcmVhY2ggb2YgdGhlIHNjb3BlLXJlY29yZGVyIGxpc3QgKHNjb3BlIGV2ZW50cyArIGVtaXQgZXZlbnRzKS4gKi9cbmNvbnN0IFNDT1BFX0xJU1RfQ0hBTk5FTFM6IHJlYWRvbmx5IENhcHR1cmVDaGFubmVsW10gPSBbJ3Njb3BlJywgJ2VtaXQnXTtcbi8qKiBDaGFubmVsIHJlYWNoIG9mIHRoZSBmbG93LXJlY29yZGVyIGxpc3QuICovXG5jb25zdCBGTE9XX0xJU1RfQ0hBTk5FTFM6IHJlYWRvbmx5IENhcHR1cmVDaGFubmVsW10gPSBbJ2Zsb3cnXTtcblxuLyoqIERpc3BhdGNoZXItbGV2ZWwgb3B0aW9ucyBzbmFwc2hvdCwga2VwdCBmb3IgY29uZmxpY3QgZGV0ZWN0aW9uLiAqL1xuaW50ZXJmYWNlIEFwcGxpZWREaXNwYXRjaGVyQ29uZmlnIHtcbiAgcmVhZG9ubHkgY2FwdHVyZT86IENhcHR1cmVQb2xpY3k7XG4gIHJlYWRvbmx5IG1heFF1ZXVlPzogbnVtYmVyO1xuICByZWFkb25seSBvdmVyZmxvdz86IE92ZXJmbG93UG9saWN5O1xuICByZWFkb25seSBzYW1wbGVFdmVyeT86IG51bWJlcjtcbiAgcmVhZG9ubHkgZmx1c2hCdWRnZXRNcz86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIERlZmVycmVkUmVnaXN0cmF0aW9uIHtcbiAgcmVhZG9ubHkgcmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIgfCBGbG93UmVjb3JkZXI7XG4gIC8qKiBXaGljaCBlbnZlbG9wZSBjaGFubmVscyByZWFjaCB0aGlzIHJlY29yZGVyIChpbmxpbmUtdGllciBwYXJpdHkpLiAqL1xuICByZWFkb25seSBjaGFubmVsczogU2V0PENhcHR1cmVDaGFubmVsPjtcbn1cblxuZXhwb3J0IGNsYXNzIERlZmVycmVkT2JzZXJ2ZXJUaWVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaGVyOiBEZWZlcnJlZERpc3BhdGNoZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmF0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBEZWZlcnJlZFJlZ2lzdHJhdGlvbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBsaWVkQ29uZmlnOiBBcHBsaWVkRGlzcGF0Y2hlckNvbmZpZztcbiAgLyoqIERlZHVwIG1lbW9yeSBmb3IgdGhlIGRldi13YXJuIHNlYW0gKG9uZSB3YXJuaW5nIHBlciB1bmlxdWUgbWVzc2FnZSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgd2FybmVkTWVzc2FnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSB0ZXJtaW5hbFN0cmFuZGVkID0gMDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKSB7XG4gICAgdGhpcy5hcHBsaWVkQ29uZmlnID0ge1xuICAgICAgLy8gQXR0YWNoLXN1cmZhY2UgZGVmYXVsdCBpcyAnY2xvbmUnIChyZXZpZXcgQ1JJVElDQUwtMik6IGEgcmVjb3JkZXJcbiAgICAgIC8vIHBvcnRlZCB3aXRoIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIGtlZXBzIHJlY2VpdmluZyB0aGUgU0FNRVxuICAgICAgLy8gZXZlbnQgc2hhcGUgYXMgaW5saW5lIChlLmtleS9lLnZhbHVlL2UucnVudGltZVN0YWdlSWQgYWxsIGludGFjdCkuXG4gICAgICAvLyBUaGUgbW9kdWxlLWludGVybmFsIGVudmVsb3BlIGRlZmF1bHQgc3RheXMgJ3N1bW1hcnknIGZvciByYXctXG4gICAgICAvLyBlbnZlbG9wZSBjb25zdW1lcnM7ICdzdW1tYXJ5JyBoZXJlIGlzIGFuIGV4cGxpY2l0IHRlbGVtZXRyeSBjaG9pY2UuXG4gICAgICBjYXB0dXJlOiBvcHRpb25zPy5jYXB0dXJlID8/ICdjbG9uZScsXG4gICAgICBtYXhRdWV1ZTogb3B0aW9ucz8ubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0aW9ucz8ub3ZlcmZsb3csXG4gICAgICBzYW1wbGVFdmVyeTogb3B0aW9ucz8uc2FtcGxlRXZlcnksXG4gICAgICBmbHVzaEJ1ZGdldE1zOiBvcHRpb25zPy5mbHVzaEJ1ZGdldE1zLFxuICAgIH07XG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IERlZmVycmVkRGlzcGF0Y2hlcih7XG4gICAgICBtYXhRdWV1ZTogb3B0aW9ucz8ubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0aW9ucz8ub3ZlcmZsb3csXG4gICAgICBzYW1wbGVFdmVyeTogb3B0aW9ucz8uc2FtcGxlRXZlcnksXG4gICAgICBjYXB0dXJlUG9saWN5OiBvcHRpb25zPy5jYXB0dXJlID8/ICdjbG9uZScsXG4gICAgICBmbHVzaEJ1ZGdldE1zOiBvcHRpb25zPy5mbHVzaEJ1ZGdldE1zLFxuICAgICAgLy8gVGhlIGRldi13YXJuIHNlYW0gKFJGQy0wMDEgwqdcIlJlc29sdXRpb246IHRoZSBkZXYtd2FybiBzZWFtXCIpOiB0aGVcbiAgICAgIC8vIHB1cmUgbW9kdWxlIGludm9rZXMgYHdhcm5gIG9uIGV2ZXJ5ICdyZWYnIGNhcHR1cmUgYW5kIGV2ZXJ5ICdjbG9uZSdcbiAgICAgIC8vIGRlZ3JhZGF0aW9uOyB0aGUgdGllciBiaW5kcyBpdCB0byB0aGUgY2VudHJhbCBpc0Rldk1vZGUoKSBmbGFnIGFuZFxuICAgICAgLy8gZGVkdXBlcyBieSBtZXNzYWdlIHNvIGEgaG90IGxvb3AgY2Fubm90IHNwYW0gdGhlIGNvbnNvbGUuXG4gICAgICBob29rczogeyB3YXJuOiAobWVzc2FnZSkgPT4gdGhpcy5kZXZXYXJuRGVkdXBlZChtZXNzYWdlKSB9LFxuICAgICAgLy8gTGlzdGVuZXIgZmFpbHVyZXMgKHN5bmMgdGhyb3dzIEFORCBhc3luYyByZWplY3Rpb25zKSByb3V0ZSBpbnRvIHRoZVxuICAgICAgLy8gZXhpc3RpbmcgcmVjb3JkZXIgZXJyb3IgY2hhbm5lbCDigJQgc2VlIHJvdXRlTGlzdGVuZXJFcnJvci5cbiAgICAgIG9uRXJyb3I6IChlcnJvciwgY3R4KSA9PiB0aGlzLnJvdXRlTGlzdGVuZXJFcnJvcihlcnJvciwgY3R4Lmxpc3RlbmVySWQsIGN0eC5lbnZlbG9wZSwgY3R4LnBoYXNlKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWdpc3RyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSByZWNvcmRlciBmb3IgZGVmZXJyZWQgZGVsaXZlcnkgb24gdGhlIHNjb3BlLWxpc3QgY2hhbm5lbHNcbiAgICogKGBzY29wZWAgKyBgZW1pdGApIGFuZC9vciB0aGUgZmxvdyBjaGFubmVsLiBJZGVtcG90ZW50IGJ5IGlkIOKAlCBzYW1lIGlkXG4gICAqIHJlcGxhY2VzIHRoZSByZWNvcmRlciBvYmplY3Q7IGNoYW5uZWwgbGlzdHMgTUVSR0UgYWNyb3NzIGNhbGxzIChzYW1lIGFzXG4gICAqIHRoZSBpbmxpbmUgdGllciwgd2hlcmUgYGF0dGFjaFNjb3BlUmVjb3JkZXIoeClgICsgYGF0dGFjaEZsb3dSZWNvcmRlcih4KWBcbiAgICogbGFuZHMgYHhgIG9uIGJvdGggbGlzdHMpLiBMYXRlciBhdHRhY2hlcyBwYXNzaW5nIGRpc3BhdGNoZXItbGV2ZWxcbiAgICogb3B0aW9ucyB0aGF0IGRpZmZlciBmcm9tIHRoZSBmaXJzdCBhdHRhY2gncyBjb25maWd1cmF0aW9uIGtlZXAgdGhlXG4gICAqIG9yaWdpbmFsIGNvbmZpZyBhbmQgZGV2LXdhcm4uXG4gICAqL1xuICByZWdpc3RlcihcbiAgICByZWNvcmRlcjogU2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcixcbiAgICBsaXN0czogeyBzY29wZT86IGJvb2xlYW47IGZsb3c/OiBib29sZWFuIH0sXG4gICAgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy53YXJuT25Db25maWdDb25mbGljdChyZWNvcmRlci5pZCwgb3B0aW9ucyk7XG4gICAgY29uc3QgY2hhbm5lbHMgPSB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KHJlY29yZGVyLmlkKT8uY2hhbm5lbHMgPz8gbmV3IFNldDxDYXB0dXJlQ2hhbm5lbD4oKTtcbiAgICBpZiAobGlzdHMuc2NvcGUpIGZvciAoY29uc3QgYyBvZiBTQ09QRV9MSVNUX0NIQU5ORUxTKSBjaGFubmVscy5hZGQoYyk7XG4gICAgaWYgKGxpc3RzLmZsb3cpIGZvciAoY29uc3QgYyBvZiBGTE9XX0xJU1RfQ0hBTk5FTFMpIGNoYW5uZWxzLmFkZChjKTtcbiAgICB0aGlzLnJlZ2lzdHJhdGlvbnMuc2V0KHJlY29yZGVyLmlkLCB7IHJlY29yZGVyLCBjaGFubmVscyB9KTtcbiAgICB0aGlzLmRpc3BhdGNoZXIuYWRkTGlzdGVuZXIocmVjb3JkZXIuaWQsIChlbnZlbG9wZSkgPT4ge1xuICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZWdpc3RyYXRpb25zLmdldChyZWNvcmRlci5pZCk7XG4gICAgICBpZiAoIXJlZ2lzdHJhdGlvbiB8fCAhcmVnaXN0cmF0aW9uLmNoYW5uZWxzLmhhcyhlbnZlbG9wZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgICAgLy8gU0FNRSBpbnZva2UgaGVscGVyIGFzIHRoZSBpbmxpbmUgdGllciAoUkZDLTAwMSDCpzkgbWl0aWdhdGlvbikg4oCUIGFcbiAgICAgIC8vIHJldHVybmVkIFByb21pc2UgbGFuZHMgaW4gdGhlIGRpc3BhdGNoZXIncyBpbmZsaWdodCBzZXQuXG4gICAgICByZXR1cm4gaW52b2tlUmVjb3JkZXJIb29rKHJlY29yZGVyLCBlbnZlbG9wZS5tZXRob2QsIGVudmVsb3BlLnBheWxvYWQpIGFzIHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2hhbm5lbCBsaXN0cyBmcm9tIGEgcmVnaXN0cmF0aW9uIChtaXJyb3JzIHRoZSBpbmxpbmVcbiAgICogdGllciwgd2hlcmUgYGRldGFjaFNjb3BlUmVjb3JkZXJgIC8gYGRldGFjaEZsb3dSZWNvcmRlcmAgZWFjaCBjbGVhciBvbmVcbiAgICogbGlzdCkuIFdoZW4gbm8gY2hhbm5lbHMgcmVtYWluLCB0aGUgbGlzdGVuZXIgaXMgZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIHJlbW92ZUZyb21MaXN0cyhpZDogc3RyaW5nLCBsaXN0czogeyBzY29wZT86IGJvb2xlYW47IGZsb3c/OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KGlkKTtcbiAgICBpZiAoIXJlZ2lzdHJhdGlvbikgcmV0dXJuO1xuICAgIGlmIChsaXN0cy5zY29wZSkgZm9yIChjb25zdCBjIG9mIFNDT1BFX0xJU1RfQ0hBTk5FTFMpIHJlZ2lzdHJhdGlvbi5jaGFubmVscy5kZWxldGUoYyk7XG4gICAgaWYgKGxpc3RzLmZsb3cpIGZvciAoY29uc3QgYyBvZiBGTE9XX0xJU1RfQ0hBTk5FTFMpIHJlZ2lzdHJhdGlvbi5jaGFubmVscy5kZWxldGUoYyk7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbi5jaGFubmVscy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJhdGlvbnMuZGVsZXRlKGlkKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmVMaXN0ZW5lcihpZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBgaWRgIGlzIHJlZ2lzdGVyZWQgZm9yIGRlZmVycmVkIGRlbGl2ZXJ5IChhbnkgY2hhbm5lbCkuICovXG4gIGhhcyhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cmF0aW9ucy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqIERlZmVycmVkIHJlY29yZGVycyB3aG9zZSByZWFjaCBpbmNsdWRlcyB0aGUgc2NvcGUgbGlzdCAoc2NvcGUrZW1pdCkuICovXG4gIHNjb3BlTGlzdFJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLmJ5Q2hhbm5lbCgnc2NvcGUnKSBhcyBTY29wZVJlY29yZGVyW107XG4gIH1cblxuICAvKiogRGVmZXJyZWQgcmVjb3JkZXJzIHdob3NlIHJlYWNoIGluY2x1ZGVzIHRoZSBmbG93IGNoYW5uZWwuICovXG4gIGZsb3dMaXN0UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5ieUNoYW5uZWwoJ2Zsb3cnKSBhcyBGbG93UmVjb3JkZXJbXTtcbiAgfVxuXG4gIC8qKiBSZXNldCBkZWZlcnJlZCByZWNvcmRlcnMgYmVmb3JlIGEgZnJlc2ggcnVuIChzYW1lIGNvbnRyYWN0IGFzIGlubGluZSkuICovXG4gIGNsZWFyUmVjb3JkZXJzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyByZWNvcmRlciB9IG9mIHRoaXMucmVnaXN0cmF0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgKHJlY29yZGVyIGFzIHsgY2xlYXI/OiAoKSA9PiB2b2lkIH0pLmNsZWFyPy4oKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ2FwdHVyZSB0YXBzIChCbG9jayA3KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN5bnRoZXRpYyBzY29wZS1jaGFubmVsIHRhcCDigJQgYSBgU2NvcGVSZWNvcmRlcmAgcGxhY2VkIG9uIHRoZVxuICAgKiBub3JtYWwgc2NvcGUtcmVjb3JkZXIgbGlzdCB3aG9zZSBob29rcyBjYXB0dXJlIGludG8gdGhlIHF1ZXVlLiBCdWlsdFxuICAgKiBmcmVzaCBwZXIgdHJhdmVyc2VyIHNvIGl0IHJlZmxlY3RzIHRoZSBjdXJyZW50IHJlZ2lzdHJhdGlvbnMuIE9ubHlcbiAgICogbWV0aG9kcyBzb21lIGRlZmVycmVkIHJlY29yZGVyIGFjdHVhbGx5IGltcGxlbWVudHMgYXJlIHByZXNlbnQgKG5vXG4gICAqIHdhc3RlZCBjYXB0dXJlcykuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBub3RoaW5nIGlzIHJlZ2lzdGVyZWQgZm9yXG4gICAqIHRoZSBzY29wZSBsaXN0LlxuICAgKlxuICAgKiBSZWRhY3Rpb24gb3JkZXJpbmc6IHRoZSB0YXAgaXMgaW52b2tlZCBmcm9tIHRoZSBTQU1FIGxvb3BzIGFzIGlubGluZVxuICAgKiByZWNvcmRlcnMgKGBfaW52b2tlSG9va2AgLyBgZW1pdEV2ZW50YCksIHdoaWNoIHJlY2VpdmUgZXZlbnRzIEFGVEVSIHRoZVxuICAgKiByZWRhY3Rpb24gZGVjaXNpb24g4oCUIHNvIGEgY2FwdHVyZWQgcGF5bG9hZCBjYW4gbmV2ZXIgY29udGFpbiBhXG4gICAqIHByZS1yZWRhY3Rpb24gdmFsdWUgdGhlIGlubGluZSB0aWVyIHdvdWxkIG5vdCBoYXZlIHNlZW4uXG4gICAqL1xuICBidWlsZFNjb3BlVGFwKCk6IFNjb3BlUmVjb3JkZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVMaXN0UmVjb3JkZXJzKCk7XG4gICAgaWYgKHJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgaWQ6IERFRkVSUkVEX1NDT1BFX1RBUF9JRCB9O1xuICAgIC8vIERlcml2ZWQgZnJvbSB0aGUgaG9vayByZWdpc3RyeTogZXZlcnkgaG9vayBvZiB0aGUgc2NvcGUgY2hhbm5lbCBhbmQgb2YgdGhlIGVtaXQgY2hhbm5lbFxuICAgIC8vICh3aGljaCByaWRlcyB0aGUgc2NvcGUgbGlzdCkg4oCUIGEgaG9vayB0aGUgcmVnaXN0cnkgZ2FpbnMgaXMgdGFwcGVkIHdpdGggbm8gZWRpdCBoZXJlLlxuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBbJ3Njb3BlJywgJ2VtaXQnXSBhcyBjb25zdCkge1xuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgaG9va3NPbihjaGFubmVsKSkge1xuICAgICAgICBpZiAoIXRoaXMuYW55SW1wbGVtZW50cyhyZWNvcmRlcnMsIG1ldGhvZCkpIGNvbnRpbnVlO1xuICAgICAgICB0YXBbbWV0aG9kXSA9IChldmVudDogdW5rbm93bikgPT4gdGhpcy5jYXB0dXJlU2NvcGVFdmVudChjaGFubmVsLCBtZXRob2QsIGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcCBhcyB1bmtub3duIGFzIFNjb3BlUmVjb3JkZXI7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN5bnRoZXRpYyBmbG93LWNoYW5uZWwgdGFwIOKAlCBhIGBGbG93UmVjb3JkZXJgIGFwcGVuZGVkIHRvIHRoZVxuICAgKiBmbG93LXJlY29yZGVycyBsaXN0IGhhbmRlZCB0byB0aGUgdHJhdmVyc2VyLiBTYW1lIGNvbnRyYWN0IGFzXG4gICAqIHtAbGluayBidWlsZFNjb3BlVGFwfS5cbiAgICovXG4gIGJ1aWxkRmxvd1RhcCgpOiBGbG93UmVjb3JkZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuZmxvd0xpc3RSZWNvcmRlcnMoKTtcbiAgICBpZiAocmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB0YXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBpZDogREVGRVJSRURfRkxPV19UQVBfSUQgfTtcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBob29rc09uKCdmbG93JykpIHtcbiAgICAgIGlmICghdGhpcy5hbnlJbXBsZW1lbnRzKHJlY29yZGVycywgbWV0aG9kKSkgY29udGludWU7XG4gICAgICB0YXBbbWV0aG9kXSA9IChldmVudDogdW5rbm93bikgPT4gdGhpcy5jYXB0dXJlRmxvd0V2ZW50KG1ldGhvZCwgZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdGFwIGFzIHVua25vd24gYXMgRmxvd1JlY29yZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERpcmVjdCBjYXB0dXJlIGZvciBleGVjdXRvci1zeW50aGVzaXplZCBldmVudHMgdGhhdCBieXBhc3MgdGhlIGRpc3BhdGNoXG4gICAqIHNpdGVzIChlLmcuIHRoZSBzeW50aGV0aWMgYG9uUmVzdW1lYCB0aGUgZXhlY3V0b3IgZmlyZXMgb24gcmVzdW1lKS5cbiAgICovXG4gIGNhcHR1cmUoY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWwsIG1ldGhvZDogc3RyaW5nLCBydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBydW5JZDogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmNhcHR1cmUoeyBjaGFubmVsLCBtZXRob2QsIHJ1bnRpbWVTdGFnZUlkLCBydW5JZCwgcGF5bG9hZCB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUZXJtaW5hbCBmbHVzaCArIGRyYWluIChCbG9jayA4KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBkZWxpdmVyIGV2ZXJ5dGhpbmcgc3RpbGwgcXVldWVkIOKAlCBjYWxsZWQgYnkgdGhlIGV4ZWN1dG9yXG4gICAqIGF0IHRoZSBPVVRFUk1PU1QgcnVuIGJvdW5kYXJ5IChyZXNvbHZlLCByZWplY3QsIHBhdXNlKSwgQkVGT1JFIGBydW4oKWBcbiAgICogcmV0dXJucyAvIHJldGhyb3dzIC8gdGhlIGNoZWNrcG9pbnQgYmVjb21lcyBhdmFpbGFibGUuIEluc3BlY3RzXG4gICAqIGBmbHVzaFN5bmNgJ3MgYHJlbWFpbmluZ2AgKHJldmlld2VyIE4xKTogYGZsdXNoU3luY2AgYWxyZWFkeSBsb29wc1xuICAgKiBzbmFwc2hvdCByb3VuZHMgdXAgdG8gaXRzIHJ1bmF3YXktY2FzY2FkZSBjYXAsIHNvIGEgbm9uLXplcm8gcmVtYWluZGVyXG4gICAqIG1lYW5zIGEgcGF0aG9sb2dpY2FsIHNlbGYtZW5xdWV1ZWluZyBsaXN0ZW5lciDigJQgY291bnRlZCBpblxuICAgKiBgb2JzZXJ2ZXJTdGF0cy50ZXJtaW5hbFN0cmFuZGVkYCBhbmQgZGV2LXdhcm5lZCwgbmV2ZXIgc2lsZW50LlxuICAgKi9cbiAgdGVybWluYWxGbHVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlbWFpbmluZyB9ID0gdGhpcy5kaXNwYXRjaGVyLmZsdXNoTm93KCk7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIHRoaXMudGVybWluYWxTdHJhbmRlZCArPSByZW1haW5pbmc7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50anNdIGRlZmVycmVkIG9ic2VydmVyczogdGVybWluYWwgZmx1c2ggaGl0IHRoZSBydW5hd2F5LWNhc2NhZGUgY2FwIHdpdGggJHtyZW1haW5pbmd9IGAgK1xuICAgICAgICAgICAgJ2V2ZW50KHMpIHN0aWxsIHF1ZXVlZCDigJQgYSBsaXN0ZW5lciBrZXB0IGVucXVldWVpbmcgZHVyaW5nIHRoZSBmbHVzaC4gVGhlIHN0cmFuZGVkIGNvdW50IGlzICcgK1xuICAgICAgICAgICAgJ3N1cmZhY2VkIG9uIHNuYXBzaG90Lm9ic2VydmVyU3RhdHMudGVybWluYWxTdHJhbmRlZC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCB0aGUgYmFja2xvZywgdGhlbiBzZXR0bGUgYXN5bmMgbGlzdGVuZXIgY29udGludWF0aW9ucyB1bmRlciBhXG4gICAqIGRlYWRsaW5lIOKAlCB0aGUgc2VydmVybGVzcyAvIGdyYWNlZnVsLXNodXRkb3duIHBhdHRlcm4gKFJGQy0wMDEgwqcxMSkuXG4gICAqL1xuICBkcmFpbihvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8T2JzZXJ2ZXJEcmFpblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXIuZHJhaW4ob3B0cyk7XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMgKEJsb2NrIDkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgYHNuYXBzaG90Lm9ic2VydmVyU3RhdHNgIHBheWxvYWQg4oCUIEE0IHN0YXRzICsgQmxvY2sgOCBzdHJhbmRpbmcuICovXG4gIGdldFN0YXRzKCk6IE9ic2VydmVyU3RhdHMge1xuICAgIHJldHVybiB7IC4uLnRoaXMuZGlzcGF0Y2hlci5nZXRTdGF0cygpLCB0ZXJtaW5hbFN0cmFuZGVkOiB0aGlzLnRlcm1pbmFsU3RyYW5kZWQgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBieUNoYW5uZWwoY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWwpOiBBcnJheTxTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyPiB7XG4gICAgY29uc3Qgb3V0OiBBcnJheTxTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyPiA9IFtdO1xuICAgIGZvciAoY29uc3QgeyByZWNvcmRlciwgY2hhbm5lbHMgfSBvZiB0aGlzLnJlZ2lzdHJhdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChjaGFubmVscy5oYXMoY2hhbm5lbCkpIG91dC5wdXNoKHJlY29yZGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBOb3JtYWwgcHJvcGVydHkgbG9va3VwIOKAlCBpbnZvY2F0aW9uIHBhcml0eSB3aXRoIHRoZSBpbmxpbmUgdGllci4gKi9cbiAgcHJpdmF0ZSBhbnlJbXBsZW1lbnRzKHJlY29yZGVyczogQXJyYXk8U2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcj4sIG1ldGhvZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlY29yZGVycy5zb21lKChyKSA9PiB0eXBlb2YgKHIgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJyk7XG4gIH1cblxuICAvKiogU2NvcGUvZW1pdCBldmVudHMgY2FycnkgdGhlaXIgb3duIGlkcyAoYHJ1bnRpbWVTdGFnZUlkYCArIGBwaXBlbGluZUlkYCkuICovXG4gIHByaXZhdGUgY2FwdHVyZVNjb3BlRXZlbnQoY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWwsIG1ldGhvZDogc3RyaW5nLCBldmVudDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGUgPSBldmVudCBhcyB7IHJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nOyBwaXBlbGluZUlkPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmNhcHR1cmUoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBlPy5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICAgIHJ1bklkOiBlPy5waXBlbGluZUlkID8/ICcnLFxuICAgICAgcGF5bG9hZDogZXZlbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogRmxvdyBldmVudHMgY2FycnkgaWRzIG9uIGB0cmF2ZXJzYWxDb250ZXh0YCAoYWJzZW50IG9uIGEgZmV3IGV2ZW50cykuICovXG4gIHByaXZhdGUgY2FwdHVyZUZsb3dFdmVudChtZXRob2Q6IHN0cmluZywgZXZlbnQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSAoZXZlbnQgYXMgeyB0cmF2ZXJzYWxDb250ZXh0PzogeyBydW50aW1lU3RhZ2VJZD86IHN0cmluZzsgcnVuSWQ/OiBzdHJpbmcgfSB9IHwgdW5kZWZpbmVkKVxuICAgICAgPy50cmF2ZXJzYWxDb250ZXh0O1xuICAgIHRoaXMuZGlzcGF0Y2hlci5jYXB0dXJlKHtcbiAgICAgIGNoYW5uZWw6ICdmbG93JyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjdHg/LnJ1bnRpbWVTdGFnZUlkID8/ICcnLFxuICAgICAgcnVuSWQ6IGN0eD8ucnVuSWQgPz8gJycsXG4gICAgICBwYXlsb2FkOiBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZSBhIGRlZmVycmVkIGxpc3RlbmVyIGZhaWx1cmUgaW50byB0aGUgZXhpc3RpbmcgcmVjb3JkZXIgZXJyb3JcbiAgICogY2hhbm5lbDogZXZlcnkgcmVnaXN0ZXJlZCBzY29wZSBvYnNlcnZlciDigJQgdGhlIGZhaWxpbmcgb25lIGluY2x1ZGVkLCBpblxuICAgKiByZWdpc3RyYXRpb24gb3JkZXIg4oCUIHJlY2VpdmVzIHRoZSBzY29wZS1zaGFwZWQgYG9uRXJyb3JgIGV2ZW50IHRoZSBpbmxpbmVcbiAgICogdGllciBidWlsZHMgKGByZWNvcmRlckZhaWx1cmVFdmVudGApLCBhbmQgYSB0aHJvdyBmcm9tIGBvbkVycm9yYCBpdHNlbGZcbiAgICogaXMgbm90IHJvdXRlZCBhZ2FpbjogdGhlIGNvbnRyYWN0IHRoZSBpbmxpbmUgdGllciBob25vcnMgd2hlbiBhIHJlY29yZGVyXG4gICAqIHRocm93cyBtaWQtZGlzcGF0Y2ggKDkuMzkuMCDigJQgYmVmb3JlLCB0aGUgZmFpbGluZyBsaXN0ZW5lciB3YXMgc2tpcHBlZCxcbiAgICogc28gYSBDb21wb3NpdGVSZWNvcmRlcidzIG90aGVyIGNoaWxkcmVuIG5ldmVyIGhlYXJkIGEgc2libGluZydzIHRocm93KS5cbiAgICogVGhlIGVycm9yIHNpbmsgbXVzdCBuZXZlciBiZWNvbWUgYW4gZXJyb3Igc291cmNlOiBzaW5rIHRocm93cyBhcmVcbiAgICogc3dhbGxvd2VkIChpc29sYXRpb24gaXMgYWJzb2x1dGUpLlxuICAgKi9cbiAgcHJpdmF0ZSByb3V0ZUxpc3RlbmVyRXJyb3IoXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgbGlzdGVuZXJJZDogc3RyaW5nLFxuICAgIGVudmVsb3BlOiBDYXB0dXJlRW52ZWxvcGUsXG4gICAgcGhhc2U6ICdzeW5jJyB8ICdhc3luYycsXG4gICk6IHZvaWQge1xuICAgIC8vIElubGluZSBwYXJpdHkgKDkuMzkuMCk6IHRoZSBpbmxpbmUgdGllciBoYW5kcyBhIHJlY29yZGVyJ3MgdGhyb3cgdG8gRVZFUlkgcmVjb3JkZXIgb24gdGhlXG4gICAgLy8gc2NvcGUgbGlzdCDigJQgdGhlIHRocm93ZXIgaW5jbHVkZWQsIHNvIGEgQ29tcG9zaXRlUmVjb3JkZXIncyBvdGhlciBjaGlsZHJlbiBoZWFyIGl0IOKAlCBhbmRcbiAgICAvLyBkcm9wcyBhIHRocm93IGZyb20gYG9uRXJyb3JgIGl0c2VsZi4gU2FtZSBoZXJlLCB3aXRoIHRoZSBzYW1lIGV2ZW50IChgcmVjb3JkZXJGYWlsdXJlRXZlbnRgKS5cbiAgICBpZiAoZW52ZWxvcGUubWV0aG9kICE9PSAnb25FcnJvcicpIHRoaXMuZGVsaXZlckxpc3RlbmVyRXJyb3IoZXJyb3IsIGVudmVsb3BlKTtcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50anNdIGRlZmVycmVkIG9ic2VydmVyICcke2xpc3RlbmVySWR9JyBmYWlsZWQgKCR7cGhhc2V9KSBoYW5kbGluZyBgICtcbiAgICAgICAgICBgJHtlbnZlbG9wZS5jaGFubmVsfS4ke2VudmVsb3BlLm1ldGhvZH0gKHNlcSAke2VudmVsb3BlLnNlcX0pOiAke2Rlc2NyaWJlVGhyb3duKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKiogSGFuZCBvbmUgbGlzdGVuZXIgZmFpbHVyZSB0byBldmVyeSBzY29wZSBvYnNlcnZlciBhcyBhbiBgb25FcnJvcmAg4oCUIHNlZSB7QGxpbmsgcm91dGVMaXN0ZW5lckVycm9yfS4gKi9cbiAgcHJpdmF0ZSBkZWxpdmVyTGlzdGVuZXJFcnJvcihlcnJvcjogdW5rbm93biwgZW52ZWxvcGU6IENhcHR1cmVFbnZlbG9wZSk6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yRXZlbnQgPSByZWNvcmRlckZhaWx1cmVFdmVudChcbiAgICAgIHtcbiAgICAgICAgc3RhZ2VOYW1lOiAnJyxcbiAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZE9mKGVudmVsb3BlLnJ1bnRpbWVTdGFnZUlkKSxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IGVudmVsb3BlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiBlbnZlbG9wZS5ydW5JZCxcbiAgICAgICAgLi4uY29ycmVsYXRpb25PZihlbnZlbG9wZS5wYXlsb2FkKSxcbiAgICAgIH0sXG4gICAgICBlcnJvcixcbiAgICAgIGVudmVsb3BlLm1ldGhvZCxcbiAgICApO1xuICAgIGZvciAoY29uc3QgWywgeyByZWNvcmRlciwgY2hhbm5lbHMgfV0gb2YgdGhpcy5yZWdpc3RyYXRpb25zKSB7XG4gICAgICAvLyBJbmxpbmUtdGllciBwYXJpdHkgKHJldmlldyBDUklUSUNBTC0xKTogdGhlIHN5bnRoZXNpemVkIGV2ZW50IGlzXG4gICAgICAvLyBzY29wZS10eXBlZCwgc28gaXQgcmVhY2hlcyBPTkxZIHJlY29yZGVycyByZWdpc3RlcmVkIG9uIHRoZSBzY29wZVxuICAgICAgLy8gbGlzdHMg4oCUIGEgZmxvdy1vbmx5IHJlY29yZGVyIG5ldmVyIHJlY2VpdmVzIHNjb3BlLWNoYW5uZWwgZXJyb3JzXG4gICAgICAvLyBpbmxpbmUgYW5kIG11c3Qgbm90IGhlcmUgZWl0aGVyLlxuICAgICAgaWYgKCFjaGFubmVscy5oYXMoJ3Njb3BlJykpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW52b2tlUmVjb3JkZXJIb29rKHJlY29yZGVyLCAnb25FcnJvcicsIGVycm9yRXZlbnQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN3YWxsb3cg4oCUIHNhbWUgcnVsZSBhcyBEZWZlcnJlZERpc3BhdGNoZXIuc2FmZU9uRXJyb3IuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIERpc3BhdGNoZXItbGV2ZWwgb3B0aW9ucyBhcmUgZmlyc3QtYXR0YWNoLXdpbnM7IGRpZmZlcmluZyBsYXRlciB2YWx1ZXMgZGV2LXdhcm4uICovXG4gIHByaXZhdGUgd2Fybk9uQ29uZmlnQ29uZmxpY3QocmVjb3JkZXJJZDogc3RyaW5nLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm47XG4gICAgY29uc3QgY29uZmxpY3RzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlcXVlc3RlZDogQXBwbGllZERpc3BhdGNoZXJDb25maWcgPSB7XG4gICAgICBjYXB0dXJlOiBvcHRpb25zLmNhcHR1cmUsXG4gICAgICBtYXhRdWV1ZTogb3B0aW9ucy5tYXhRdWV1ZSxcbiAgICAgIG92ZXJmbG93OiBvcHRpb25zLm92ZXJmbG93LFxuICAgICAgc2FtcGxlRXZlcnk6IG9wdGlvbnMuc2FtcGxlRXZlcnksXG4gICAgICBmbHVzaEJ1ZGdldE1zOiBvcHRpb25zLmZsdXNoQnVkZ2V0TXMsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZXF1ZXN0ZWQpIGFzIEFycmF5PGtleW9mIEFwcGxpZWREaXNwYXRjaGVyQ29uZmlnPikge1xuICAgICAgaWYgKHJlcXVlc3RlZFtrZXldICE9PSB1bmRlZmluZWQgJiYgcmVxdWVzdGVkW2tleV0gIT09IHRoaXMuYXBwbGllZENvbmZpZ1trZXldKSB7XG4gICAgICAgIGNvbmZsaWN0cy5wdXNoKFN0cmluZyhrZXkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZsaWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRldldhcm5EZWR1cGVkKFxuICAgICAgICBgW2Zvb3RwcmludGpzXSBhdHRhY2ggJyR7cmVjb3JkZXJJZH0nOiB0aGUgZXhlY3V0b3IncyBkZWZlcnJlZC1vYnNlcnZlciBxdWV1ZSB3YXMgYWxyZWFkeSBgICtcbiAgICAgICAgICBgY29uZmlndXJlZCBieSB0aGUgZmlyc3QgZGVmZXJyZWQgYXR0YWNoIOKAlCBpZ25vcmluZyBkaWZmZXJpbmcgb3B0aW9uKHMpOiAke2NvbmZsaWN0cy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICAgJ09uZSBleGVjdXRvciBoYXMgT05FIG1lcmdlZCBxdWV1ZTsgY29uZmlndXJlIGl0IG9uIHRoZSBmaXJzdCBkZWZlcnJlZCBhdHRhY2guJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGBpc0Rldk1vZGUoKWAtZ2F0ZWQsIGRlZHVwbGljYXRlZCB3YXJuZXIg4oCUIHRoZSBib3VuZCB3YXJuIHNlYW0uICovXG4gIHByaXZhdGUgZGV2V2FybkRlZHVwZWQobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFpc0Rldk1vZGUoKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLndhcm5lZE1lc3NhZ2VzLmhhcyhtZXNzYWdlKSkgcmV0dXJuO1xuICAgIHRoaXMud2FybmVkTWVzc2FnZXMuYWRkKG1lc3NhZ2UpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIHJ1bidzIGNvcnJlbGF0aW9uIHRoZSBmYWlsZWQgZXZlbnQgY2FycmllZCwgYXMgY2FwdHVyZWQg4oCUIGEgc2NvcGUgb3IgZW1pdCBldmVudCdzIG93biBgY29ycmVsYXRpb25gLCBhIGZsb3dcbiAqIGV2ZW50J3Mgb24gaXRzIGB0cmF2ZXJzYWxDb250ZXh0YCDigJQgc3ByZWFkIGludG8gdGhlIHN5bnRoZXNpemVkIGBvbkVycm9yYCAoMTAuMSkuIEVtcHR5IHdoZW4gaXQgY2FycmllZCBub25lLlxuICovXG5mdW5jdGlvbiBjb3JyZWxhdGlvbk9mKHBheWxvYWQ6IHVua25vd24pOiB7IGNvcnJlbGF0aW9uPzogUnVuQ29ycmVsYXRpb24gfSB7XG4gIGlmIChwYXlsb2FkID09PSBudWxsIHx8IHR5cGVvZiBwYXlsb2FkICE9PSAnb2JqZWN0JykgcmV0dXJuIHt9O1xuICBjb25zdCBldmVudCA9IHBheWxvYWQgYXMgeyBjb3JyZWxhdGlvbj86IHVua25vd247IHRyYXZlcnNhbENvbnRleHQ/OiB7IGNvcnJlbGF0aW9uPzogdW5rbm93biB9IH07XG4gIGNvbnN0IGNvcnJlbGF0aW9uID0gZXZlbnQuY29ycmVsYXRpb24gPz8gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uY29ycmVsYXRpb247XG4gIHJldHVybiBjb3JyZWxhdGlvbiAhPT0gbnVsbCAmJiB0eXBlb2YgY29ycmVsYXRpb24gPT09ICdvYmplY3QnID8geyBjb3JyZWxhdGlvbjogY29ycmVsYXRpb24gYXMgUnVuQ29ycmVsYXRpb24gfSA6IHt9O1xufVxuIl19
@@ -9,9 +9,10 @@
9
9
  * The engine (FlowchartTraverser) receives this as its runtime parameter.
10
10
  * After execution, consumers query it for the full execution state.
11
11
  */
12
- import type { CommitBundle, CommitValuesMode, LogAddress } from 'foottrace';
13
- import type { WriteProvenanceMode } from 'foottrace/write';
12
+ import type { CommitBundle, CommitValuesMode, LogAddress, LogOutcome, Meta } from 'foottrace';
13
+ import type { RecordSink, WriteProvenanceMode } from 'foottrace/write';
14
14
  import { EventLog, SharedMemory } from 'foottrace/write';
15
+ import type { RunCorrelation } from '../attempt/types.js';
15
16
  import type { StageSnapshot } from '../memory/frameTypes.js';
16
17
  import type { RunPolicy } from '../memory/runPolicy.js';
17
18
  import { StageContext } from '../memory/StageContext.js';
@@ -56,6 +57,13 @@ export type RuntimeSnapshot = {
56
57
  * snapshot carries a DIFFERENT runId than the paused run's snapshot.
57
58
  */
58
59
  readonly runId: string;
60
+ /**
61
+ * The run's correlation (10.1) — `env.traceparent`, or `env.traceId` + `env.operationId`, resolved once per
62
+ * leg; the same frozen object every event of the leg carries (`TraversalContext.correlation`, a scope event's
63
+ * `correlation`). Like `runId`, per leg: a resume carries ITS env's, never the paused leg's. Absent — no
64
+ * key — when none was given.
65
+ */
66
+ readonly correlation?: RunCorrelation;
59
67
  sharedState: Record<string, unknown>;
60
68
  executionTree: StageSnapshot;
61
69
  /**
@@ -124,7 +132,34 @@ export type RuntimeSnapshot = {
124
132
  * with `{ delivery: 'deferred' }` on this executor (zero-cost discipline).
125
133
  */
126
134
  observerStats?: ObserverStats;
135
+ /**
136
+ * The crash-safe record's accounting (10.1, P6) — how many entries the run handed its sink and how many the sink
137
+ * did not take. ABSENT unless the executor was built with a `sink` and a run started.
138
+ */
139
+ sink?: RecordSinkStats;
127
140
  };
141
+ /** `getSnapshot().sink` — what the run handed its sink, and what the sink did not take (10.1, P6). */
142
+ export interface RecordSinkStats {
143
+ /** Entries handed to the adapter (each `opened`, `commit`, `note`, `closed` call). */
144
+ readonly entries: number;
145
+ /**
146
+ * Losses — a method that threw or rejected, an entry the log refused to send, a `meta` the log could not copy
147
+ * (that entry was still stored, without it), and failed or timed-out flushes. A rejection that settles after the
148
+ * run finished is counted when it settles.
149
+ */
150
+ readonly failed: number;
151
+ /** The last loss's error, as text. Absent while nothing was lost. */
152
+ readonly lastError?: string;
153
+ }
154
+ /**
155
+ * Where a runtime's log writes as it lands (10.1, P6): the run's sink, the log's address and what the writer puts on
156
+ * its `opened` entry. Absent → the log is the plain one-argument `EventLog`, byte-identical to 10.0.
157
+ */
158
+ export interface RuntimeRecord {
159
+ readonly sink: RecordSink;
160
+ readonly address: LogAddress;
161
+ readonly meta?: Meta;
162
+ }
128
163
  export declare class ExecutionRuntime {
129
164
  globalStore: SharedMemory;
130
165
  /**
@@ -139,6 +174,8 @@ export declare class ExecutionRuntime {
139
174
  redactedStore?: SharedMemory;
140
175
  rootStageContext: StageContext;
141
176
  executionHistory: EventLog;
177
+ /** The run's sink, when this runtime's log writes to one — handed on to every mount (`recordFor`). */
178
+ private recordSink?;
142
179
  /** Original root for getSnapshot() — set before resume changes rootStageContext. */
143
180
  private _snapshotRoot?;
144
181
  private _initialState;
@@ -155,7 +192,7 @@ export declare class ExecutionRuntime {
155
192
  * every frame after inherits the same reference. Default: every dial at
156
193
  * its default, no rule, no mirror.
157
194
  */
158
- constructor(rootName: string, rootId: string, defaultValues?: unknown, initialState?: unknown, policy?: RunPolicy);
195
+ constructor(rootName: string, rootId: string, defaultValues?: unknown, initialState?: unknown, policy?: RunPolicy, record?: RuntimeRecord);
159
196
  /**
160
197
  * A fresh root frame for this runtime — `globalStore`, `executionHistory`,
161
198
  * the run's policy and (when kept) the mirror. Also how `SubflowExecutor`
@@ -193,6 +230,16 @@ export declare class ExecutionRuntime {
193
230
  * 9.44.2).
194
231
  */
195
232
  private getFoldBase;
233
+ /**
234
+ * Where a mount's log writes (10.1, P6): the same sink, at this log's address plus the mount's `runtimeStageId`
235
+ * (`drillPath: [...parent, mount]`, the address law `RuntimeSnapshot.logAddress` states). Absent when this log
236
+ * writes to no sink — a mount of a plain log is plain too.
237
+ */
238
+ recordFor(mountRuntimeStageId: string, meta?: Meta): RuntimeRecord | undefined;
239
+ /** Tell the sink this runtime's log ended. Nothing happens without a sink; never throws. */
240
+ closeRecord(outcome: LogOutcome, meta?: Meta): void;
241
+ /** Note something beside this runtime's log, in its sink (a resumed leg). Nothing without a sink; never throws. */
242
+ noteRecord(kind: string, data: Meta): void;
196
243
  getPipelines(): string[];
197
244
  setRootObject(path: string[], key: string, value: unknown): void;
198
245
  /**
@@ -222,14 +269,15 @@ export declare class ExecutionRuntime {
222
269
  * `stateAt`, which is the honest signal that the base did not travel with
223
270
  * this log — a partial answer that says it is partial, never a silent one.
224
271
  *
225
- * Returns `Omit<RuntimeSnapshot, 'runId'>`: the runtime is the memory
272
+ * Returns `Omit<RuntimeSnapshot, 'runId' | 'correlation'>`: the runtime is the memory
226
273
  * container and doesn't know which run it serves — `runId` is per-run
227
274
  * executor state, stamped by `FlowchartTraverser.getSnapshot()` (which
228
275
  * owns the run's id and already stamps it on every event). Subflows'
229
276
  * nested runtimes deliberately have NO runId of their own (a subflow is
230
- * part of the parent's logical run).
277
+ * part of the parent's logical run). `correlation` is the traverser's for
278
+ * the same reason.
231
279
  */
232
280
  getSnapshot(options?: {
233
281
  redact?: boolean;
234
- }): Omit<RuntimeSnapshot, 'runId'>;
282
+ }): Omit<RuntimeSnapshot, 'runId' | 'correlation'>;
235
283
  }