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
@@ -7,4 +7,4 @@ export { RLENarrativeFlowRecorder } from './RLENarrativeFlowRecorder.js';
7
7
  export { SeparateNarrativeFlowRecorder } from './SeparateNarrativeFlowRecorder.js';
8
8
  export { SilentNarrativeFlowRecorder } from './SilentNarrativeFlowRecorder.js';
9
9
  export { WindowedNarrativeFlowRecorder } from './WindowedNarrativeFlowRecorder.js';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBCQUEwQjtBQUMxQixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5leHBvcnQgeyBBZGFwdGl2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vQWRhcHRpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4vTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgTWlsZXN0b25lTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9NaWxlc3RvbmVOYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgUHJvZ3Jlc3NpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL1Byb2dyZXNzaXZlTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmV4cG9ydCB7IFJMRU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vUkxFTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmV4cG9ydCB7IFNlcGFyYXRlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9TZXBhcmF0ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBTaWxlbnROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL1NpbGVudE5hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBXaW5kb3dlZE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vV2luZG93ZWROYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBCQUEwQjtBQUMxQixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5leHBvcnQgeyBBZGFwdGl2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vQWRhcHRpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBNYW5pZmVzdEF0dGVtcHRSb3csIE1hbmlmZXN0RW50cnkgfSBmcm9tICcuL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmV4cG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBNaWxlc3RvbmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL01pbGVzdG9uZU5hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBQcm9ncmVzc2l2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vUHJvZ3Jlc3NpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgUkxFTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9STEVOYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgU2VwYXJhdGVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL1NlcGFyYXRlTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmV4cG9ydCB7IFNpbGVudE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vU2lsZW50TmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmV4cG9ydCB7IFdpbmRvd2VkTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9XaW5kb3dlZE5hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG4iXX0=
@@ -6,8 +6,10 @@
6
6
  *
7
7
  * @module
8
8
  */
9
+ import type { AttemptRecord, RunCorrelation } from '../../attempt/types.js';
9
10
  import type { DecisionEvidence, SelectionEvidence } from '../../decide/types.js';
10
11
  import type { StructuredErrorInfo } from '../../errors/errorInfo.js';
12
+ import type { TerminalFailureContext } from '../../errors/terminalFailure.js';
11
13
  /**
12
14
  *
13
15
  * Uses Null Object pattern: NullControlFlowNarrativeGenerator satisfies this
@@ -63,11 +65,28 @@ export interface IControlFlowNarrative {
63
65
  * `RedactionRule.retainStageError` (the diagnostic policy applied once), elsewhere `extractErrorInfo`.
64
66
  */
65
67
  onError(stageName: string, errorMessage: string, structuredError: StructuredErrorInfo, traversalContext?: TraversalContext): void;
68
+ /**
69
+ * Called at the END of every attempt (10.1) — every outcome, with the
70
+ * attempt's {@link AttemptRecord} (timing, outcome, category, the
71
+ * retry-or-stop decision): a stage's own (`record.kind === 'stage'`, under a
72
+ * retry policy, a `timeoutMs` or a run deadline), and the calls it makes
73
+ * (`'call'`, `scope.$call`) and outside attempts it reports (`'observed'`)
74
+ * during the stage (P2). A stage attempt fires before `onStageRetry` when it
75
+ * is retried, and before `onError` / `onStageExecuted` for the last.
76
+ * `structuredError` is the attempt's served error (`raw` included unless the
77
+ * policy masked it; never for an observed attempt); absent for a success or
78
+ * a pause.
79
+ *
80
+ * Event arithmetic: one per attempt — for a stage, the number of attempts it
81
+ * made plus one per call or observed attempt (filter on `record.kind`).
82
+ */
83
+ onAttempt(stageName: string, stageId: string, record: AttemptRecord, structuredError: StructuredErrorInfo | undefined, traversalContext?: TraversalContext): void;
66
84
  /**
67
85
  * Called when an attempt at a stage with a declared `retry` policy failed
68
- * AND another attempt will run. Fires after the failed attempt's staged
69
- * writes are discarded and BEFORE the backoff wait, so a live monitor learns
70
- * "retrying in 500 ms" when the decision is made, not after the wait.
86
+ * AND another attempt will run. Fires after that attempt's `onAttempt`,
87
+ * after its staged writes are discarded and BEFORE the backoff wait, so a
88
+ * live monitor learns "retrying in 500 ms" when the decision is made, not
89
+ * after the wait.
71
90
  *
72
91
  * Event arithmetic: an exhausted policy fires `attempts - 1` of these and
73
92
  * then one `onError`; a `retryOn` that declines fires ZERO of these and one
@@ -113,7 +132,7 @@ export interface IControlFlowNarrative {
113
132
  * error, so it does not fire this. Subflow-traversers do NOT fire it;
114
133
  * their errors propagate to the parent and surface at the top level.
115
134
  */
116
- onRunFailed(error: StructuredErrorInfo, traversalContext?: TraversalContext): void;
135
+ onRunFailed(error: StructuredErrorInfo, traversalContext?: TraversalContext, failure?: TerminalFailureContext): void;
117
136
  /** Returns accumulated narrative sentences in execution order. */
118
137
  getSentences(): string[];
119
138
  }
@@ -193,6 +212,12 @@ export interface TraversalContext {
193
212
  * checkpoint predates 9.37.0 (it did not record the paused execution).
194
213
  */
195
214
  readonly resumedFrom?: ResumeLink;
215
+ /**
216
+ * The run's correlation (10.1) — `env.traceparent`, or `env.traceId` + `env.operationId`, resolved once per
217
+ * leg. The SAME frozen object, by reference, on every stamp of the leg (subflows included) and on
218
+ * `getSnapshot().correlation`. Absent — no key — when the env gives none.
219
+ */
220
+ readonly correlation?: RunCorrelation;
196
221
  }
197
222
  /**
198
223
  * The paused execution a resume continues — `TraversalContext.resumedFrom`.
@@ -339,6 +364,39 @@ export interface FlowThrottledEvent {
339
364
  /** Explicit channel discriminant — see {@link FlowErrorEvent.channel}. */
340
365
  channel?: 'flow';
341
366
  }
367
+ /**
368
+ * Event passed to FlowRecorder.onAttempt — one attempt, at its end (10.1): a
369
+ * stage's own under its retry policy, a `timeoutMs` or a run deadline
370
+ * (`record.kind === 'stage'`), or — during the stage — a call it made
371
+ * (`'call'`, `scope.$call`) or an outside attempt it reported (`'observed'`,
372
+ * P2). `stageName` / `stageId` / `traversalContext` are the stage's in every
373
+ * case; filter on `record.kind` to count one kind.
374
+ *
375
+ * WHY this event exists: `onStageRetry` says "attempt N failed, retrying" and
376
+ * nothing else — not how long a try took, not why the series stopped, and
377
+ * nothing at all when `retryOn` declined. Every attempt is an
378
+ * {@link AttemptRecord} instead, whatever its outcome, with the decision that
379
+ * followed it in the shape `decide()` records — the same records the stage's
380
+ * execution-tree node keeps (`StageSnapshot.attempts`).
381
+ *
382
+ * Fires once per attempt, before `onStageRetry` (when the attempt is retried)
383
+ * and before `onError` / `onStageExecuted` (for the last). The record is
384
+ * frozen and survives `structuredClone`; `structuredError` is the served error
385
+ * with `raw`, as on {@link FlowStageRetryEvent} — except for an observed
386
+ * attempt, whose error the library never threw (`raw` is undefined).
387
+ */
388
+ export interface FlowAttemptEvent {
389
+ stageName: string;
390
+ /** Stable stage identifier from the builder (matches spec node id). */
391
+ stageId: string;
392
+ /** The attempt: timing, outcome, category, decision, and the served error without `raw`. */
393
+ record: AttemptRecord;
394
+ /** The attempt's served error with `raw` — absent for a success or a pause. */
395
+ structuredError?: StructuredErrorInfo;
396
+ traversalContext?: TraversalContext;
397
+ /** Explicit channel discriminant — see {@link FlowErrorEvent.channel}. */
398
+ channel?: 'flow';
399
+ }
342
400
  /**
343
401
  * Event passed to FlowRecorder.onStageRetry — one failed attempt at a stage
344
402
  * that carries a declared {@link import('../types.js').RetryPolicy}, and which
@@ -352,7 +410,9 @@ export interface FlowThrottledEvent {
352
410
  * Fires only for attempts followed by another attempt. The final failure takes
353
411
  * the ordinary error path (`onError`), so the two never double-report the same
354
412
  * failure: an exhausted `attempts: 3` policy emits 2 retry events + 1 error
355
- * event; a `retryOn` that declines emits 0 retry events + 1 error event.
413
+ * event; a `retryOn` that declines emits 0 retry events + 1 error event. Each
414
+ * attempt — retried or not — also fires {@link FlowAttemptEvent} first (10.1),
415
+ * which is where a declined stop is recorded (`reason: 'declined'`).
356
416
  */
357
417
  export interface FlowStageRetryEvent {
358
418
  stageName: string;
@@ -428,6 +488,8 @@ export interface FlowRunFailedEvent {
428
488
  /** Structured details of the error that terminated the run. */
429
489
  structuredError: StructuredErrorInfo;
430
490
  traversalContext?: TraversalContext;
491
+ /** Native terminal ownership, independent of served error details. Absent on legacy manually emitted events. */
492
+ readonly failure?: TerminalFailureContext;
431
493
  }
432
494
  /**
433
495
  * FlowRecorder — Pluggable observer for control flow events.
@@ -461,6 +523,13 @@ export interface FlowRecorder {
461
523
  onLoop?(event: FlowLoopEvent): void;
462
524
  onBreak?(event: FlowBreakEvent): void;
463
525
  onError?(event: FlowErrorEvent): void;
526
+ /**
527
+ * Called at the end of EVERY attempt — a stage's own, and the calls and
528
+ * observed attempts it makes during the stage (filter on `record.kind`) —
529
+ * with its record and the decision that followed (10.1). See
530
+ * {@link FlowAttemptEvent}.
531
+ */
532
+ onAttempt?(event: FlowAttemptEvent): void;
464
533
  /**
465
534
  * Called once per failed attempt that WILL be retried, for stages carrying a
466
535
  * declared `retry` policy. The final failure arrives via `onError` instead,
@@ -7,4 +7,4 @@
7
7
  * @module
8
8
  */
9
9
  export {};
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSUNvbnRyb2xGbG93TmFycmF0aXZlIOKAlCBJbnRlcmZhY2UgZm9yIGNvbnRyb2wgZmxvdyBuYXJyYXRpdmUgZ2VuZXJhdGlvbi5cbiAqXG4gKiBDYXB0dXJlcyBGTE9XIGV2ZW50cyBkdXJpbmcgdHJhdmVyc2FsOiBkZWNpc2lvbnMsIGZvcmtzLCBsb29wcywgc3ViZmxvd3MuXG4gKiBDb21wbGVtZW50YXJ5IHRvIHNjb3BlL3JlY29yZGVycy9OYXJyYXRpdmVSZWNvcmRlciB3aGljaCBjYXB0dXJlcyBEQVRBIGV2ZW50cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlLCBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcblxuLyoqXG4gKlxuICogVXNlcyBOdWxsIE9iamVjdCBwYXR0ZXJuOiBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3Igc2F0aXNmaWVzIHRoaXNcbiAqIGludGVyZmFjZSB3aXRoIGVtcHR5IG1ldGhvZHMgZm9yIHplcm8tY29zdCBkaXNhYmxlZCBwYXRoLlxuICovXG5cbi8qKlxuICogVGhlIGtpbmQgb2Ygc3RhZ2UgdGhhdCBjb21wbGV0ZWQuIExldHMgY29uc3VtZXJzIHJvdXRlIHVuaWZvcm1cbiAqIFwiZGlkIHRoaXMgc3RhZ2UgZXhlY3V0ZVwiIGhhbmRsaW5nIHdpdGhvdXQgYSBzaWRlLXRhYmxlIGxvb2t1cCBpbnRvXG4gKiB0aGUgY2hhcnQgc3BlYy4gUmVxdWlyZWQgb24gZXZlcnkgYG9uU3RhZ2VFeGVjdXRlZGAgZXZlbnQgc2luY2VcbiAqIHByb3Bvc2FsICMwMDMgdW5pZmllZCB0aGUgZXZlbnQgdG8gZmlyZSBmb3IgQUxMIHN0YWdlIGtpbmRzLlxuICovXG5leHBvcnQgdHlwZSBTdGFnZVR5cGUgPSAnbGluZWFyJyB8ICdkZWNpZGVyJyB8ICdmb3JrJyB8ICdzZWxlY3RvcicgfCAnc3ViZmxvdy1tb3VudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xGbG93TmFycmF0aXZlIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgc3RhZ2UgY29tcGxldGVzIGl0cyBtYWluIHdvcmsuIEZpcmVzIGZvciBBTEwgc3RhZ2VcbiAgICoga2luZHMgKGAnbGluZWFyJ2AsIGAnZGVjaWRlcidgLCBgJ2ZvcmsnYCwgYCdzZWxlY3RvcidgLCBgJ3N1YmZsb3ctbW91bnQnYClcbiAgICogQUZURVIgdGhlIGNvcnJlc3BvbmRpbmcgc3BlY2lhbGl6ZWQgZXZlbnQgKGBvbkRlY2lzaW9uYCwgYG9uRm9ya2AsXG4gICAqIGBvblNlbGVjdGVkYCwgYG9uU3ViZmxvd0VudHJ5YCkuIEZvciBsaW5lYXIgc3RhZ2VzLCBmaXJlcyBhZnRlclxuICAgKiB0aGUgc3RhZ2UgZnVuY3Rpb24gcmV0dXJucy5cbiAgICpcbiAgICogQ29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuP1wiIHVzZSB0aGlzIGV2ZW50IHVuaWZvcm1seVxuICAgKiBhbmQgc3dpdGNoIG9uIGBzdGFnZVR5cGVgIGZvciBraW5kLXNwZWNpZmljIHdvcmsuXG4gICAqL1xuICBvblN0YWdlRXhlY3V0ZWQoXG4gICAgc3RhZ2VOYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0IHwgdW5kZWZpbmVkLFxuICAgIHN0YWdlVHlwZTogU3RhZ2VUeXBlLFxuICApOiB2b2lkO1xuXG4gIC8qKiBDYWxsZWQgb24gbGluZWFyIGNvbnRpbnVhdGlvbiBmcm9tIG9uZSBzdGFnZSB0byB0aGUgbmV4dC4gKi9cbiAgb25OZXh0KGZyb21TdGFnZTogc3RyaW5nLCB0b1N0YWdlOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCk6IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCB3aGVuIGEgZGVjaWRlciBzZWxlY3RzIGEgYnJhbmNoLiBNb3N0IHZhbHVhYmxlIGZvciBMTE0gY29udGV4dC4gKi9cbiAgb25EZWNpc2lvbihcbiAgICBkZWNpZGVyTmFtZTogc3RyaW5nLFxuICAgIGNob3NlbkJyYW5jaDogc3RyaW5nLFxuICAgIHJhdGlvbmFsZT86IHN0cmluZyxcbiAgICBkZWNpZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICAgZXZpZGVuY2U/OiBEZWNpc2lvbkV2aWRlbmNlLFxuICApOiB2b2lkO1xuXG4gIC8qKiBDYWxsZWQgd2hlbiBhIGZvcmsgZXhlY3V0ZXMgYWxsIGNoaWxkcmVuIGluIHBhcmFsbGVsLiAqL1xuICBvbkZvcmsocGFyZW50U3RhZ2U6IHN0cmluZywgY2hpbGROYW1lczogc3RyaW5nW10sIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZDtcblxuICAvKiogQ2FsbGVkIHdoZW4gYSBzZWxlY3RvciBwaWNrcyBhIHN1YnNldCBvZiBjaGlsZHJlbi4gKi9cbiAgb25TZWxlY3RlZChcbiAgICBwYXJlbnRTdGFnZTogc3RyaW5nLFxuICAgIHNlbGVjdGVkTmFtZXM6IHN0cmluZ1tdLFxuICAgIHRvdGFsQ291bnQ6IG51bWJlcixcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICBldmlkZW5jZT86IFNlbGVjdGlvbkV2aWRlbmNlLFxuICApOiB2b2lkO1xuXG4gIC8qKiBDYWxsZWQgd2hlbiBlbnRlcmluZyBhIHN1YmZsb3cgKG5lc3RlZCBjb250ZXh0IGJvdW5kYXJ5KS4gKi9cbiAgb25TdWJmbG93RW50cnkoXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICBzdWJmbG93SWQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICAgbWFwcGVkSW5wdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogdm9pZDtcblxuICAvKiogQ2FsbGVkIHdoZW4gZXhpdGluZyBhIHN1YmZsb3cuICovXG4gIG9uU3ViZmxvd0V4aXQoXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICBzdWJmbG93SWQ/OiBzdHJpbmcsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICAgb3V0cHV0U3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogdm9pZDtcblxuICAvKiogQ2FsbGVkIHdoZW4gYSBkeW5hbWljIHN1YmZsb3cgaXMgcmVnaXN0ZXJlZCBkdXJpbmcgdHJhdmVyc2FsLiAqL1xuICBvblN1YmZsb3dSZWdpc3RlcmVkKHN1YmZsb3dJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBzcGVjU3RydWN0dXJlPzogdW5rbm93bik6IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCBvbiBsb29wIGl0ZXJhdGlvbiAoYmFjay1lZGdlIHRyYXZlcnNhbCkuICovXG4gIG9uTG9vcCh0YXJnZXRTdGFnZTogc3RyaW5nLCBpdGVyYXRpb246IG51bWJlciwgZGVzY3JpcHRpb24/OiBzdHJpbmcsIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBzdGFnZSB0cmlnZ2VycyBicmVhayAoZWFybHkgdGVybWluYXRpb24pLlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gT3B0aW9uYWwgc3RyaW5nIHBhc3NlZCB0byBgc2NvcGUuJGJyZWFrKHJlYXNvbilgLlxuICAgKiBAcGFyYW0gcHJvcGFnYXRlZEZyb21TdWJmbG93IC0gV2hlbiBzZXQsIHRoaXMgYnJlYWsgd2FzIHJhaXNlZCBvbiB0aGVcbiAgICogICBwYXJlbnQgYmVjYXVzZSBhbiBpbm5lciBzdWJmbG93ICh0aGlzIGlkKSBicm9rZSB3aXRoIGBwcm9wYWdhdGVCcmVha2BcbiAgICogICBlbmFibGVkLiBVc2VkIGJ5IHJlY29yZGVycyB0byBkaXN0aW5ndWlzaCBvcmlnaW5hdGluZyB2cyBwcm9wYWdhdGVkXG4gICAqICAgYnJlYWtzIGFuZCByZW5kZXIgdGhlbSBhY2NvcmRpbmdseS5cbiAgICovXG4gIG9uQnJlYWsoXG4gICAgc3RhZ2VOYW1lOiBzdHJpbmcsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICAgcmVhc29uPzogc3RyaW5nLFxuICAgIHByb3BhZ2F0ZWRGcm9tU3ViZmxvdz86IHN0cmluZyxcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBzdGFnZSB0aHJvd3MgYW4gZXJyb3IsIHdpdGggaXRzIFNFUlZFRCBmb3JtOiBmb3IgYSBzdGFnZSdzIG93biBmYWlsdXJlIHRoYXQgaXNcbiAgICogYFJlZGFjdGlvblJ1bGUucmV0YWluU3RhZ2VFcnJvcmAgKHRoZSBkaWFnbm9zdGljIHBvbGljeSBhcHBsaWVkIG9uY2UpLCBlbHNld2hlcmUgYGV4dHJhY3RFcnJvckluZm9gLlxuICAgKi9cbiAgb25FcnJvcihcbiAgICBzdGFnZU5hbWU6IHN0cmluZyxcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgICBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIGF0dGVtcHQgYXQgYSBzdGFnZSB3aXRoIGEgZGVjbGFyZWQgYHJldHJ5YCBwb2xpY3kgZmFpbGVkXG4gICAqIEFORCBhbm90aGVyIGF0dGVtcHQgd2lsbCBydW4uIEZpcmVzIGFmdGVyIHRoZSBmYWlsZWQgYXR0ZW1wdCdzIHN0YWdlZFxuICAgKiB3cml0ZXMgYXJlIGRpc2NhcmRlZCBhbmQgQkVGT1JFIHRoZSBiYWNrb2ZmIHdhaXQsIHNvIGEgbGl2ZSBtb25pdG9yIGxlYXJuc1xuICAgKiBcInJldHJ5aW5nIGluIDUwMCBtc1wiIHdoZW4gdGhlIGRlY2lzaW9uIGlzIG1hZGUsIG5vdCBhZnRlciB0aGUgd2FpdC5cbiAgICpcbiAgICogRXZlbnQgYXJpdGhtZXRpYzogYW4gZXhoYXVzdGVkIHBvbGljeSBmaXJlcyBgYXR0ZW1wdHMgLSAxYCBvZiB0aGVzZSBhbmRcbiAgICogdGhlbiBvbmUgYG9uRXJyb3JgOyBhIGByZXRyeU9uYCB0aGF0IGRlY2xpbmVzIGZpcmVzIFpFUk8gb2YgdGhlc2UgYW5kIG9uZVxuICAgKiBgb25FcnJvcmAuIFRoZSBmaW5hbCBhdHRlbXB0IG5ldmVyIGZpcmVzIHRoaXMgZXZlbnQuXG4gICAqL1xuICBvblN0YWdlUmV0cnkoXG4gICAgc3RhZ2VOYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIGF0dGVtcHQ6IG51bWJlcixcbiAgICBtYXhBdHRlbXB0czogbnVtYmVyLFxuICAgIGRlbGF5TXM6IG51bWJlcixcbiAgICBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgZm9yayBjaGlsZCBmYWlsZWQgYW5kIHRoZSBydW4ncyBgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcmBcbiAgICogY2xhc3NpZmllZCBpdHMgZXJyb3IgYXMgdGhyb3R0bGluZyAoOS4zOS4wKS4gVGhlIGNoaWxkJ3MgZmFpbHVyZSB0YWtlc1xuICAgKiBpdHMgb3JkaW5hcnkgcGF0aCB0b287IHRoaXMgb25seSBuYW1lcyBpdCBhcyB0aHJvdHRsaW5nLlxuICAgKi9cbiAgb25UaHJvdHRsZWQ/KFxuICAgIHN0YWdlTmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCB3aGVuIGEgcGF1c2FibGUgc3RhZ2UgcGF1c2VzIGV4ZWN1dGlvbi4gKi9cbiAgb25QYXVzZShcbiAgICBzdGFnZU5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgcGF1c2VEYXRhOiB1bmtub3duLFxuICAgIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogdm9pZDtcblxuICAvKiogQ2FsbGVkIHdoZW4gYSBwYXVzZWQgc3RhZ2UgaXMgcmVzdW1lZC4gKi9cbiAgb25SZXN1bWUoc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaGFzSW5wdXQ6IGJvb2xlYW4sIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIHRvcC1sZXZlbCBgZXhlY3V0b3IucnVuKClgLCBCRUZPUkUgdGhlIGZpcnN0IHN0YWdlIGV4ZWN1dGVzLlxuICAgKiBgaW5wdXRgIGlzIHRoZSByZXRhaW5lZCBmb3JtIG9mIGBydW4oe2lucHV0fSlgIGFmdGVyIHNjaGVtYSB2YWxpZGF0aW9uO1xuICAgKiB0aGUgcnVuJ3Mga2V5L3BhdGggcmVkYWN0aW9uIGFwcGxpZXMgYmVmb3JlIGRpc3BhdGNoLiBTZWUge0BsaW5rIEZsb3dSdW5FdmVudH0uXG4gICAqIFN1YmZsb3ctdHJhdmVyc2VycyBkbyBOT1QgZmlyZSB0aGlzIGV2ZW50IOKAlCB0aGV5IGZpcmUgYG9uU3ViZmxvd0VudHJ5YC5cbiAgICovXG4gIG9uUnVuU3RhcnQoaW5wdXQ6IHVua25vd24sIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIHRvcC1sZXZlbCBgZXhlY3V0b3IucnVuKClgLCBBRlRFUiB0aGUgbGFzdCBzdGFnZSBjb21taXRzLlxuICAgKiBgb3V0cHV0YCBpcyB0aGUgcmV0YWluZWQgZm9ybSBvZiB0aGUgY2hhcnQncyByZXR1cm4uIE5PVCBmaXJlZCBvbiBwYXVzZSAodGhlIHJ1blxuICAgKiBkaWRuJ3QgZW5kOyBpdCBzdXNwZW5kZWQpIG9yIG9uIHVuY2F1Z2h0IGVycm9yLiBTdWJmbG93LXRyYXZlcnNlcnMgZG9cbiAgICogTk9UIGZpcmUgdGhpcyBldmVudCDigJQgdGhleSBmaXJlIGBvblN1YmZsb3dFeGl0YC5cbiAgICovXG4gIG9uUnVuRW5kKG91dHB1dDogdW5rbm93biwgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSBwZXIgdG9wLWxldmVsIGBleGVjdXRvci5ydW4oKWAgd2hlbiB0cmF2ZXJzYWwgdGhyb3dzIGFcbiAgICogTk9OLXBhdXNlIGVycm9yLCBCRUZPUkUgdGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGVzIHRvIGBydW4oKWAncyBjYWxsZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFRFUk1JTkFMIGNvdW50ZXJwYXJ0IHRvIGBvblJ1bkVuZGAg4oCUIGl0IGNsb3NlcyB0aGUgcnVuXG4gICAqIGJvdW5kYXJ5IHN5bW1ldHJpY2FsbHkgc28gZXZlcnkgYG9uUnVuU3RhcnRgIGlzIGZvbGxvd2VkIGJ5IGV4YWN0bHlcbiAgICogb25lIG9mIGBvblJ1bkVuZGAgKGNsZWFuKSBvciBgb25SdW5GYWlsZWRgIChlcnJvcikuIFdpdGhvdXQgaXQsIGFcbiAgICogbGl2ZSBtb25pdG9yIHNlZXMgYG9uUnVuU3RhcnRgIHRoZW4gc2lsZW5jZSBvbiBhIGZhaWxlZCBydW4gYW5kIGNhbid0XG4gICAqIHRlbGwgXCJzdGlsbCBydW5uaW5nXCIgZnJvbSBcImNyYXNoZWQuXCJcbiAgICpcbiAgICogRXJyb3JzIFNUSUxMIHRocm93IOKAlCB0aGlzIGlzIHRoZSBvYnNlcnZhYmxlIHRlcm1pbmFsIHNpZ25hbCwgbm90IGFcbiAgICogcmVjb3ZlcnkgbWVjaGFuaXNtIChubyByb3V0aW5nLCBubyBlcnJvci1zdWJmbG93KS4gUGF1c2UgaXMgTk9UIGFuXG4gICAqIGVycm9yLCBzbyBpdCBkb2VzIG5vdCBmaXJlIHRoaXMuIFN1YmZsb3ctdHJhdmVyc2VycyBkbyBOT1QgZmlyZSBpdDtcbiAgICogdGhlaXIgZXJyb3JzIHByb3BhZ2F0ZSB0byB0aGUgcGFyZW50IGFuZCBzdXJmYWNlIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAqL1xuICBvblJ1bkZhaWxlZChlcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbywgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkO1xuXG4gIC8qKiBSZXR1cm5zIGFjY3VtdWxhdGVkIG5hcnJhdGl2ZSBzZW50ZW5jZXMgaW4gZXhlY3V0aW9uIG9yZGVyLiAqL1xuICBnZXRTZW50ZW5jZXMoKTogc3RyaW5nW107XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYXZlcnNhbENvbnRleHQg4oCUIHJlYWQtb25seSBleGVjdXRpb24gY29udGV4dCBmcm9tIHRoZSB0cmF2ZXJzZXIuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVHJhdmVyc2FsIGNvbnRleHQgYXR0YWNoZWQgdG8gZXZlcnkgRmxvd1JlY29yZGVyIGV2ZW50LlxuICogQ3JlYXRlZCBieSB0aGUgdHJhdmVyc2VyIGR1cmluZyBERlMsIHBhc3NlZCB0byByZWNvcmRlcnMgYXMgcmVhZC1vbmx5IGRhdGEuXG4gKiBFbmFibGVzIHJlY29yZGVycyB0byBidWlsZCB0cmVlcywgZ3JvdXAgYnkgc3ViZmxvdywgYW5kIGNvcnJlbGF0ZSBldmVudHNcbiAqIHdpdGhvdXQgbWFpbnRhaW5pbmcgdGhlaXIgb3duIHN0YWNrcyBvciBwb3N0LXByb2Nlc3NpbmcuXG4gKlxuICogTGlrZSBPcGVuVGVsZW1ldHJ5J3Mgc3BhbiBjb250ZXh0OiBzdGFnZUlkICsgcGFyZW50U3RhZ2VJZCBmb3JtIGEgdHJlZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzYWxDb250ZXh0IHtcbiAgLyoqXG4gICAqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIEdlbmVyYXRlZCBvbmNlIGF0IHRoZSBzdGFydCBvZiBldmVyeVxuICAgKiBgcnVuKClgIChhbmQgYWdhaW4gb24gYHJlc3VtZSgpYCk7IHNoYXJlZCBieSBldmVyeSBldmVudCBvZiB0aGF0IHJ1bjtcbiAgICogZGlmZmVycyBhY3Jvc3MgY29uc2VjdXRpdmUgcnVucyBvZiB0aGUgc2FtZSBleGVjdXRvci5cbiAgICpcbiAgICogRm9ybWF0OiBgJHtEYXRlLm5vdygpfS0ke2NvdW50ZXJ9YCDigJQgc29ydGFibGUgbGV4aWNvZ3JhcGhpY2FsbHkgKD09XG4gICAqIGNocm9ub2xvZ2ljYWxseSBmb3IgcnVucyA+IDFtcyBhcGFydCkuIFByb2Nlc3MtbG9jYWwg4oCUIGZvciBjcm9zcy1cbiAgICogcHJvY2VzcyBjb3JyZWxhdGlvbiB1c2UgYGdldEVudigpLnRyYWNlSWRgIChjb25zdW1lci1zdXBwbGllZCkuXG4gICAqXG4gICAqIFJlY29yZGVycyB0aGF0IGFjY3VtdWxhdGUgc3RhdGUgYWNyb3NzIHJ1bnMgKGZvcmsgYm9va2tlZXBpbmcsXG4gICAqIHNpYmxpbmctaGFuZG9mZiBzdGF0ZSwgZXRjLikgZGV0ZWN0IFwibmV3IHJ1blwiIHZpYVxuICAgKiBgZXZlbnQudHJhdmVyc2FsQ29udGV4dC5ydW5JZCAhPT0gdGhpcy5sYXN0UnVuSWRgIGFuZCByZXNldFxuICAgKiB0cmFuc2llbnQgYm9va2tlZXBpbmcuIFJlY29yZGVycyB0aGF0IGRvbid0IGNhcmUgYWJvdXQgc2NvcGluZ1xuICAgKiBpZ25vcmUgdGhlIGZpZWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIGZyb20gdGhlIGJ1aWxkZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleC5cbiAgICogIENvdW50ZXIgcmVzZXRzIHBlciBleGVjdXRvciDigJQgY29tYmluZSB3aXRoIGBydW5JZGAgZm9yIGdsb2JhbGx5IHVuaXF1ZSBzdGVwIGtleXMuICovXG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBzdGFnZSBuYW1lLiAqL1xuICByZWFkb25seSBzdGFnZU5hbWU6IHN0cmluZztcbiAgLyoqIFBhcmVudCBzdGFnZSBJRCDigJQgd2FsayB1cCB0byByZWNvbnN0cnVjdCB0aGUgdHJlZS4gVW5kZWZpbmVkIGF0IHJvb3QuICovXG4gIHJlYWRvbmx5IHBhcmVudFN0YWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IEVYRUNVVElPTiBzdGVwJ3MgcnVudGltZVN0YWdlSWQg4oCUIHRoZSBydW50aW1lIHR3aW4gb2ZcbiAgICogYHBhcmVudFN0YWdlSWRgIChSRkMtMDAzIEQxKS4gV2FsayB1cCB0byByZWNvbnN0cnVjdCB0aGUgcnVudGltZVxuICAgKiBhbmNlc3RvciBjaGFpbjsgbG9vcCByZS1lbnRyaWVzIHN0YXkgdW5hbWJpZ3VvdXMgYmVjYXVzZSBydW50aW1lIGlkc1xuICAgKiAoYHN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgKSBkaWZmZXIgcGVyIGl0ZXJhdGlvbiBldmVuIHdoZW4gc3RhZ2UgaWRzXG4gICAqIHJlcGVhdC4gQ3Jvc3NlcyBzdWJmbG93IGJvdW5kYXJpZXM6IHRoZSBmaXJzdCBzdGFnZSBpbnNpZGUgYSBzdWJmbG93XG4gICAqIHBvaW50cyBhdCB0aGUgTU9VTlQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCBpbiB0aGUgcGFyZW50IHRyYXZlcnNlci5cbiAgICogVW5kZWZpbmVkIG9ubHkgYXQgdGhlIGZpcnN0IHN0YWdlIG9mIHRoZSB0b3AtbGV2ZWwgY2hhcnQuXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgSUQgd2hlbiBpbnNpZGUgYSBzdWJmbG93LiBVbmRlZmluZWQgYXQgcm9vdCBsZXZlbC4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKiogRnVsbCBzdWJmbG93IHBhdGggZm9yIG5lc3RlZCBzdWJmbG93cyAoZS5nLiwgXCJzZi1vdXRlci9zZi1pbm5lclwiKS4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1BhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdWJmbG93IG5lc3RpbmcgZGVwdGggb2YgdGhlIHN0YWdlJ3MgQUREUkVTUzogaG93IG1hbnkgc3ViZmxvdyBzZWdtZW50cyBpdHNcbiAgICogYHJ1bnRpbWVTdGFnZUlkYCBjYXJyaWVzICgwID0gdG9wIGxldmVsLCAxID0gaW5zaWRlIGEgc3ViZmxvdyBvciBhXG4gICAqIGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCwgMiA9IGEgc3ViZmxvdyBpbnNpZGUgdGhhdCwg4oCmKS4gT25lIG1lYW5pbmcgb25cbiAgICogZXZlcnkgc3RhbXAg4oCUIHN0YWdlIGV2ZW50cywgdGhlIHJ1bi1ib3VuZGFyeSByb290ICgwKSBhbmQgYG9uUmVzdW1lYFxuICAgKiAoOS4zNy4wOyB1bnRpbCA5LjM2LjAgc3RhZ2UgZXZlbnRzIHN0YW1wZWQgdGhlIHBhcmVudC1jaGFpbiBsZW5ndGggb2YgdGhlXG4gICAqIHN0YWdlJ3MgY29udGV4dCBpbnN0ZWFkKS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbWFueSB0aW1lcyB0aGlzIHN0YWdlIGhhcyBleGVjdXRlZCBCRUZPUkUgaW4gdGhpcyBydW4g4oCUIHRoZSBsb29wXG4gICAqIGl0ZXJhdGlvbiBjb3VudCB3aGVuIGEgbm9kZSBpcyByZXZpc2l0ZWQgKGUuZy4gdmlhIGBsb29wVG9gKS4gQWJzZW50IG9uIHRoZVxuICAgKiBmaXJzdCBleGVjdXRpb247IGAxYCBvbiB0aGUgZmlyc3QgbG9vcC1iYWNrLCBgMmAgb24gdGhlIG5leHQsIOKApiAoaS5lLlxuICAgKiBgdmlzaXRDb3VudCAtIDFgKS4gUnVuLXNjb3BlZCAocmVzZXRzIGVhY2ggYHJ1bigpYC9gcmVzdW1lKClgKSBhbmQgbW9ub3RvbmljXG4gICAqIGFjcm9zcyBzdWJmbG93IHJlLW1vdW50cy4gUG9wdWxhdGVkIGZvciBldmVyeSBzdGFnZSBraW5kLiBNaXJyb3JzIHRoZVxuICAgKiBuYXJyYXRpdmUgcmVjb3JkZXIncyBcInBhc3MgTlwiIGNvdW50LlxuICAgKi9cbiAgcmVhZG9ubHkgbG9vcEl0ZXJhdGlvbj86IG51bWJlcjtcbiAgLyoqIEZvcmsgYnJhbmNoIElEIHdoZW4gaW5zaWRlIGEgcGFyYWxsZWwgb3IgZGVjaWRlciBicmFuY2guICovXG4gIHJlYWRvbmx5IGZvcmtCcmFuY2g/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPbiB0aGUgYG9uUmVzdW1lYCBldmVudCBvbmx5ICg5LjM3LjApOiB0aGUgUEFVU0VEIGV4ZWN1dGlvbiB0aGlzIHJlc3VtZWRcbiAgICogcnVuIGNvbnRpbnVlcyDigJQgYSBsaW5rIGluIHRoZSBPcGVuVGVsZW1ldHJ5IHNlbnNlLCBub3QgYSBwYXJlbnQuIEEgcmVzdW1lXG4gICAqIGlzIGEgbmV3IGBydW5JZGAsIHNvIHRoZSBwYXVzZWQgYChydW5JZCwgcnVudGltZVN0YWdlSWQpYCBjYW5ub3QgYmUgYVxuICAgKiBwYXJlbnQgb2YgYW55dGhpbmcgaW4gaXQ7IGl0IGlzIG5hbWVkIGhlcmUgaW5zdGVhZC4gQWJzZW50IHdoZW4gdGhlXG4gICAqIGNoZWNrcG9pbnQgcHJlZGF0ZXMgOS4zNy4wIChpdCBkaWQgbm90IHJlY29yZCB0aGUgcGF1c2VkIGV4ZWN1dGlvbikuXG4gICAqL1xuICByZWFkb25seSByZXN1bWVkRnJvbT86IFJlc3VtZUxpbms7XG59XG5cbi8qKlxuICogVGhlIHBhdXNlZCBleGVjdXRpb24gYSByZXN1bWUgY29udGludWVzIOKAlCBgVHJhdmVyc2FsQ29udGV4dC5yZXN1bWVkRnJvbWAuXG4gKiBCb3RoIGlkcyBhcmUgdGhlIFBBVVNFRCBydW4nczogYHJ1bklkYCBpcyB0aGF0IHJ1bidzLCBgcnVudGltZVN0YWdlSWRgIHRoZVxuICogZXhlY3V0aW9uIG9mIHRoZSBzdGFnZSB0aGF0IHBhdXNlZCAoYXMgaXRzIGBvblBhdXNlYCBldmVudCBzdGFtcGVkIGl0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN1bWVMaW5rIHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRmxvd1JlY29yZGVyIOKAlCBQbHVnZ2FibGUgb2JzZXJ2ZXIgZm9yIGNvbnRyb2wgZmxvdyBldmVudHMuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uU3RhZ2VFeGVjdXRlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd1N0YWdlRXZlbnQge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBUcmF2ZXJzYWwgY29udGV4dCBmcm9tIHRoZSBlbmdpbmUg4oCUIHJlYWQtb25seSwgc2V0IGJ5IHRyYXZlcnNlci4gKi9cbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG4gIC8qKlxuICAgKiBXaGljaCBraW5kIG9mIHN0YWdlIGNvbXBsZXRlZC4gVGhlIGVuZ2luZSBmaXJlcyBgb25TdGFnZUV4ZWN1dGVkYFxuICAgKiB1bmlmb3JtbHkgZm9yIGV2ZXJ5IHN0YWdlIGtpbmQgKHByb3Bvc2FsICMwMDMpOyBjb25zdW1lcnMgcm91dGUgYnlcbiAgICogYHN0YWdlVHlwZWAgd2l0aG91dCBhIGNoYXJ0LXNwZWMgbG9va3VwLlxuICAgKi9cbiAgc3RhZ2VUeXBlOiBTdGFnZVR5cGU7XG59XG5cbi8qKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uTmV4dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd05leHRFdmVudCB7XG4gIGZyb206IHN0cmluZztcbiAgdG86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0O1xufVxuXG4vKiogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vbkRlY2lzaW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93RGVjaXNpb25FdmVudCB7XG4gIGRlY2lkZXI6IHN0cmluZztcbiAgY2hvc2VuOiBzdHJpbmc7XG4gIHJhdGlvbmFsZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0O1xuICAvKiogU3RydWN0dXJlZCBkZWNpc2lvbiBldmlkZW5jZSBmcm9tIGRlY2lkZSgpIGhlbHBlci4gKi9cbiAgZXZpZGVuY2U/OiBEZWNpc2lvbkV2aWRlbmNlO1xufVxuXG4vKiogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vbkZvcmsuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dGb3JrRXZlbnQge1xuICBwYXJlbnQ6IHN0cmluZztcbiAgY2hpbGRyZW46IHN0cmluZ1tdO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbn1cblxuLyoqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25TZWxlY3RlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd1NlbGVjdGVkRXZlbnQge1xuICBwYXJlbnQ6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IHN0cmluZ1tdO1xuICB0b3RhbDogbnVtYmVyO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbiAgLyoqIFN0cnVjdHVyZWQgc2VsZWN0aW9uIGV2aWRlbmNlIGZyb20gc2VsZWN0KCkgaGVscGVyLiAqL1xuICBldmlkZW5jZT86IFNlbGVjdGlvbkV2aWRlbmNlO1xufVxuXG4vKiogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vblN1YmZsb3cuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dTdWJmbG93RXZlbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIg4oCUIHVzZSB0aGlzIHRvIGxvb2sgdXAgdGhlIGZ1bGwgc3BlYyB2aWEgdGhlIG1hbmlmZXN0LiAqL1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBCdWlsZC10aW1lIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBzdWJmbG93IGRvZXMuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbiAgLyoqIE1hcHBlZCBpbnB1dCB2YWx1ZXMgc2VudCBJTlRPIHRoZSBzdWJmbG93IChmcm9tIGlucHV0TWFwcGVyL2lucHV0S2V5cykuIFByZXNlbnQgb24gZW50cnkgZXZlbnRzLiAqL1xuICBtYXBwZWRJbnB1dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU3ViZmxvdyBzaGFyZWQgc3RhdGUgYXQgZXhpdC4gUHJlc2VudCBvbiBleGl0IGV2ZW50cy4gKi9cbiAgb3V0cHV0U3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25TdWJmbG93UmVnaXN0ZXJlZCAoZHluYW1pYyBzdWJmbG93IGF0dGFjaG1lbnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93U3ViZmxvd1JlZ2lzdGVyZWRFdmVudCB7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIuICovXG4gIHN1YmZsb3dJZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogQnVpbGQtdGltZSBkZXNjcmlwdGlvbi4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBGdWxsIHNwZWMgc3RydWN0dXJlICh3aGVuIGF2YWlsYWJsZSBmcm9tIGJ1aWxkVGltZVN0cnVjdHVyZSkuICovXG4gIHNwZWNTdHJ1Y3R1cmU/OiB1bmtub3duO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbn1cblxuLyoqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25Mb29wLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93TG9vcEV2ZW50IHtcbiAgdGFyZ2V0OiBzdHJpbmc7XG4gIGl0ZXJhdGlvbjogbnVtYmVyO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG59XG5cbi8qKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uQnJlYWsuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dCcmVha0V2ZW50IHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0O1xuICAvKipcbiAgICogT3B0aW9uYWwgZnJlZS1mb3JtIHJlYXNvbiBzdXBwbGllZCBieSBgc2NvcGUuJGJyZWFrKHJlYXNvbilgLiBBYnNlbnRcbiAgICogd2hlbiB0aGUgc3RhZ2UgaW52b2tlZCBgJGJyZWFrKClgIHdpdGhvdXQgYW4gYXJndW1lbnQuIFByb3BhZ2F0ZXMgd2hlblxuICAgKiBhIHN1YmZsb3cgaXMgbW91bnRlZCB3aXRoIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAg4oCUIHRoZSBvdXRlciBicmVha1xuICAgKiBldmVudCBjYXJyaWVzIHRoZSBpbm5lciBicmVhaydzIHJlYXNvbiB0b28uXG4gICAqL1xuICByZWFzb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoaXMgYnJlYWsgZXZlbnQgd2FzIHJhaXNlZCBvbiB0aGUgUEFSRU5UIGJlY2F1c2UgYW4gaW5uZXJcbiAgICogc3ViZmxvdydzIGJyZWFrIHByb3BhZ2F0ZWQgdXAgKHZpYSBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2ApLlxuICAgKiBUaGUgb3JpZ2luYXRpbmcgaW5uZXIgYnJlYWsgZmlyZXMgaXRzIG93biBgb25CcmVha2AgZXZlbnQgc2VwYXJhdGVseVxuICAgKiDigJQgdGhpcyBmbGFnIGxldHMgcmVjb3JkZXJzIGRpc3Rpbmd1aXNoIHRoZSB0d28uXG4gICAqL1xuICBwcm9wYWdhdGVkRnJvbVN1YmZsb3c/OiBzdHJpbmc7XG59XG5cbi8qKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uRXJyb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dFcnJvckV2ZW50IHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFN0cnVjdHVyZWQgZXJyb3IgZGV0YWlscyDigJQgcHJlc2VydmVzIGZpZWxkLWxldmVsIGlzc3VlcywgZXJyb3IgY29kZXMsIGV0Yy4gKi9cbiAgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbiAgLyoqXG4gICAqIEV4cGxpY2l0IGNoYW5uZWwgZGlzY3JpbWluYW50IOKAlCBgJ2Zsb3cnYCBvbiBldmVyeSBlbmdpbmUtZGlzcGF0Y2hlZFxuICAgKiBldmVudC4gYGlzRmxvd0V2ZW50KClgIGNoZWNrcyBpdCBmaXJzdCAoYmFja2xvZyBCMyk7IG9wdGlvbmFsIHNvXG4gICAqIGNvbnN1bWVyLWZhYnJpY2F0ZWQgZXZlbnRzICh0ZXN0cywgcmVwbGF5cykgcmVtYWluIHR5cGUtdmFsaWQgYW5kIGZhbGxcbiAgICogYmFjayB0byB0aGUgbGVnYWN5IHBpcGVsaW5lSWQtYWJzZW5jZSBoZXVyaXN0aWMuXG4gICAqL1xuICBjaGFubmVsPzogJ2Zsb3cnO1xufVxuXG4vKipcbiAqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25UaHJvdHRsZWQg4oCUIGEgZm9yayBjaGlsZCBmYWlsZWQgYW5kIHRoZVxuICogZXhlY3V0b3IncyBgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcmAgc2FpZCBpdHMgZXJyb3IgaXMgdGhyb3R0bGluZyAoOS4zOS4wKS5cbiAqXG4gKiBXSFkgYW4gZXZlbnQ6IHRoZSBjaGVja2VyIHVzZWQgdG8gd3JpdGUgYG1vbml0b3IuaXNUaHJvdHRsZWRgIGludG8gdGhlXG4gKiBjaGlsZCdzIGZyYW1lIEFGVEVSIHRoZSBjaGlsZCdzIGxhc3QgY29tbWl0LCBzbyB0aGUgZmxhZyBsYW5kZWQgbm93aGVyZSDigJRcbiAqIG5vdCBpbiBzdGF0ZSwgbm90IGluIHRoZSBsb2cuIFRocm90dGxpbmcgaXMgdGVsZW1ldHJ5LCBzbyBpdCB0cmF2ZWxzIHRoZVxuICogd2F5IHRlbGVtZXRyeSBkb2VzOiBhcyBhbiBldmVudCBhIHJlY29yZGVyIGNhbiBjb3VudCwgYWxlcnQgb24sIG9yIGJhY2sgb2ZmXG4gKiBmcm9tLiBUaGUgY2hpbGQncyBmYWlsdXJlIHN0aWxsIHRha2VzIGl0cyBvcmRpbmFyeSBwYXRoICh0aGUgZmFuLW91dFxuICogcmVjb3JkcyBpdCBhcyBgeyBpc0Vycm9yOiB0cnVlIH1gKTsgdGhpcyBldmVudCBvbmx5IGNsYXNzaWZpZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd1Rocm90dGxlZEV2ZW50IHtcbiAgLyoqIFRoZSBmb3JrIGNoaWxkIHdob3NlIGVycm9yIHdhcyBjbGFzc2lmaWVkIGFzIHRocm90dGxpbmcuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIgb2YgdGhhdCBjaGlsZCAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBtZXNzYWdlIG9mIHRoZSBjaGlsZCdzIGVycm9yLiAqL1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBTdHJ1Y3R1cmVkIGRldGFpbHMgb2YgdGhlIGNoaWxkJ3MgZXJyb3IuICovXG4gIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbztcbiAgLyoqIFRoZSBGT1JLJ3Mgc3RhbXAg4oCUIHRoZSBmYW4tb3V0IGlzIHdoZXJlIHRoZSBjbGFzc2lmaWNhdGlvbiBpcyBtYWRlLiAqL1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbiAgLyoqIEV4cGxpY2l0IGNoYW5uZWwgZGlzY3JpbWluYW50IOKAlCBzZWUge0BsaW5rIEZsb3dFcnJvckV2ZW50LmNoYW5uZWx9LiAqL1xuICBjaGFubmVsPzogJ2Zsb3cnO1xufVxuXG4vKipcbiAqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25TdGFnZVJldHJ5IOKAlCBvbmUgZmFpbGVkIGF0dGVtcHQgYXQgYSBzdGFnZVxuICogdGhhdCBjYXJyaWVzIGEgZGVjbGFyZWQge0BsaW5rIGltcG9ydCgnLi4vdHlwZXMuanMnKS5SZXRyeVBvbGljeX0sIGFuZCB3aGljaFxuICogV0lMTCBiZSBhdHRlbXB0ZWQgYWdhaW4uXG4gKlxuICogV0hZIHRoaXMgZXZlbnQgZXhpc3RzOiBhIHJldHJ5IGhhbmQtcm9sbGVkIGluc2lkZSBhIHN0YWdlIGZ1bmN0aW9uIGxlYXZlcyBub1xuICogbWFyayBvbiB0aGUgdHJhY2UgYXQgYWxsLiBUaGlzIGV2ZW50IGlzIHdoYXQgbWFrZXMgYSBkZWNsYXJlZCByZXRyeSBwYXJ0IG9mXG4gKiB0aGUgcmVjb3JkIOKAlCB3aGljaCBhdHRlbXB0IGZhaWxlZCwgd2h5LCBob3cgbG9uZyB0aGUgZW5naW5lIHdhaXRlZCwgYW5kIGhvd1xuICogbWFueSBhdHRlbXB0cyB0aGUgcG9saWN5IGFsbG93cy5cbiAqXG4gKiBGaXJlcyBvbmx5IGZvciBhdHRlbXB0cyBmb2xsb3dlZCBieSBhbm90aGVyIGF0dGVtcHQuIFRoZSBmaW5hbCBmYWlsdXJlIHRha2VzXG4gKiB0aGUgb3JkaW5hcnkgZXJyb3IgcGF0aCAoYG9uRXJyb3JgKSwgc28gdGhlIHR3byBuZXZlciBkb3VibGUtcmVwb3J0IHRoZSBzYW1lXG4gKiBmYWlsdXJlOiBhbiBleGhhdXN0ZWQgYGF0dGVtcHRzOiAzYCBwb2xpY3kgZW1pdHMgMiByZXRyeSBldmVudHMgKyAxIGVycm9yXG4gKiBldmVudDsgYSBgcmV0cnlPbmAgdGhhdCBkZWNsaW5lcyBlbWl0cyAwIHJldHJ5IGV2ZW50cyArIDEgZXJyb3IgZXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd1N0YWdlUmV0cnlFdmVudCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBXaGljaCBhdHRlbXB0IGp1c3QgRkFJTEVELCAxLWJhc2VkLiAqL1xuICBhdHRlbXB0OiBudW1iZXI7XG4gIC8qKiBUb3RhbCBhdHRlbXB0cyB0aGUgcG9saWN5IGFsbG93cywgaW5jbHVkaW5nIHRoZSBmaXJzdC4gKi9cbiAgbWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIE1pbGxpc2Vjb25kcyB0aGUgZW5naW5lIHdpbGwgd2FpdCBiZWZvcmUgdGhlIG5leHQgYXR0ZW1wdC4gYDBgID0gaW1tZWRpYXRlLiAqL1xuICBkZWxheU1zOiBudW1iZXI7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBtZXNzYWdlIOKAlCB0aGUgc2FtZSBzdHJpbmcgYG9uRXJyb3JgIHdvdWxkIGNhcnJ5LiAqL1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBTdHJ1Y3R1cmVkIGRldGFpbHMgb2YgdGhlIGVycm9yIHRoYXQgZW5kZWQgdGhpcyBhdHRlbXB0LiAqL1xuICBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm87XG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0O1xuICAvKiogRXhwbGljaXQgY2hhbm5lbCBkaXNjcmltaW5hbnQg4oCUIHNlZSB7QGxpbmsgRmxvd0Vycm9yRXZlbnQuY2hhbm5lbH0uICovXG4gIGNoYW5uZWw/OiAnZmxvdyc7XG59XG5cbi8qKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uUGF1c2UuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dQYXVzZUV2ZW50IHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIERhdGEgZnJvbSB0aGUgcGF1c2Ugc2lnbmFsIChxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YSkuICovXG4gIHBhdXNlRGF0YT86IHVua25vd247XG4gIC8qKiBQYXRoIHRocm91Z2ggc3ViZmxvd3MgdG8gdGhlIHBhdXNlZCBzdGFnZS4gRW1wdHkgYXQgcm9vdCBsZXZlbC4gKi9cbiAgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbiAgLyoqIEV4cGxpY2l0IGNoYW5uZWwgZGlzY3JpbWluYW50IOKAlCBzZWUge0BsaW5rIEZsb3dFcnJvckV2ZW50LmNoYW5uZWx9LiAqL1xuICBjaGFubmVsPzogJ2Zsb3cnO1xufVxuXG4vKiogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vblJlc3VtZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd1Jlc3VtZUV2ZW50IHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgcmVzdW1lIGlucHV0IHdhcyBwcm92aWRlZC4gKi9cbiAgaGFzSW5wdXQ6IGJvb2xlYW47XG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0O1xuICAvKiogRXhwbGljaXQgY2hhbm5lbCBkaXNjcmltaW5hbnQg4oCUIHNlZSB7QGxpbmsgRmxvd0Vycm9yRXZlbnQuY2hhbm5lbH0uICovXG4gIGNoYW5uZWw/OiAnZmxvdyc7XG59XG5cbi8qKlxuICogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vblJ1blN0YXJ0IC8gb25SdW5FbmQuXG4gKlxuICogQnJhY2tldHMgdGhlIHRvcC1sZXZlbCBgZXhlY3V0b3IucnVuKClgIGNhbGwuIFN1YmZsb3dzIGhhdmUgdGhlaXIgb3duXG4gKiBwYWlyIChgb25TdWJmbG93RW50cnlgIC8gYG9uU3ViZmxvd0V4aXRgKTsgdGhlIHJ1biBwYWlyIGlzIHRoZSBPVVRFUk1PU1RcbiAqIGJvdW5kYXJ5LCBzbyBjb25zdW1lcnMgYnVpbGRpbmcgXCJldmVyeSBzdGVwIGhhcyBhbiBpbi9vdXRcIiB2aWV3cyBjYW5cbiAqIGNsb3NlIHRoZSBjaGFpbiBhdCB0aGUgdG9wIGxldmVsLlxuICpcbiAqICAgLSBgb25SdW5TdGFydGAgcGF5bG9hZCDihpIgdGhlIGlucHV0IHBhc3NlZCB0byBgcnVuKHtpbnB1dH0pYFxuICogICAtIGBvblJ1bkVuZGAgICBwYXlsb2FkIOKGkiB0aGUgY2hhcnQncyByZXR1cm4gdmFsdWVcbiAqXG4gKiBCb3RoIGFyZSByZXRhaW5lZCBhdCBydW50aW1lIGJlZm9yZSBkaXNwYXRjaC9kZWZlcnJlZCBjYXB0dXJlIHVzaW5nIHRoZVxuICogcnVuJ3MgUmVkYWN0aW9uUnVsZSAoYHJldGFpbkJvdW5kYXJ5YCk6IG93biBzdHJpbmcga2V5cyBhdCBldmVyeSBkZXB0aCAoYnlcbiAqIG5hbWUgb3IgZG90dGVkIHBhdGgpIGFuZCBleHBsaWNpdCBuZXN0ZWQgZmllbGRzLiBTY2FsYXJzIHBhc3MgdGhyb3VnaDsgZm9ya1xuICogY2hpbGQtSUQgZW52ZWxvcGVzIG5lZWQgZXhwbGljaXQgcGF0aHMgc3VjaCBhcyBmaWVsZHM6IHsgY2hpbGRJZDogWydyZXN1bHQuc2VjcmV0J10gfS5cbiAqIFZhbHVlcyBhcmUgbm90IHNjYW5uZWQuIExpdmUgZXhlY3V0aW9uIGlucHV0cyBhbmQgcmV0dXJuIHZhbHVlcyBzdGF5IHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93UnVuRXZlbnQge1xuICAvKiogUmV0YWluZWQgaW5wdXQgYWZ0ZXIgdmFsaWRhdGlvbiAoYG9uUnVuU3RhcnRgKSBvciByZXRhaW5lZCBjaGFydCByZXR1cm5cbiAgICogIChgb25SdW5FbmRgKSwgdW5kZXIgdGhlIGtleS9wYXRoIGNvbnRyYWN0IGFib3ZlLiBVbmRlZmluZWQgaWYgbmVpdGhlci4gKi9cbiAgcGF5bG9hZD86IHVua25vd247XG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0O1xufVxuXG4vKipcbiAqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25SdW5GYWlsZWQg4oCUIHRoZSBURVJNSU5BTCBmYWlsdXJlIGJvdW5kYXJ5XG4gKiBmb3IgYSB0b3AtbGV2ZWwgcnVuLiBNaXJyb3Igb2YgYG9uUnVuRW5kYCBmb3IgdGhlIGVycm9yIHBhdGg6IGl0IGZpcmVzXG4gKiBvbmNlLCBkdXJpbmcgdHJhdmVyc2FsLCB3aGVuIHRoZSBydW4gdGhyb3dzIGEgbm9uLXBhdXNlIGVycm9yLCBiZWZvcmVcbiAqIHRoZSBleGNlcHRpb24gcHJvcGFnYXRlcy4gQ2FycmllcyB0aGUgc3RydWN0dXJlZCBlcnJvciAoZmllbGQtbGV2ZWxcbiAqIGlzc3VlcywgY29kZXMpIHJhdGhlciB0aGFuIGEgZmxhdHRlbmVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93UnVuRmFpbGVkRXZlbnQge1xuICAvKiogU3RydWN0dXJlZCBkZXRhaWxzIG9mIHRoZSBlcnJvciB0aGF0IHRlcm1pbmF0ZWQgdGhlIHJ1bi4gKi9cbiAgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbn1cblxuLyoqXG4gKiBGbG93UmVjb3JkZXIg4oCUIFBsdWdnYWJsZSBvYnNlcnZlciBmb3IgY29udHJvbCBmbG93IGV2ZW50cy5cbiAqXG4gKiBNaXJyb3JzIHRoZSBzY29wZS1sZXZlbCBTY29wZVJlY29yZGVyIHBhdHRlcm4gZm9yIHRoZSBlbmdpbmUgbGF5ZXIuXG4gKiBBbGwgbWV0aG9kcyBhcmUgb3B0aW9uYWwg4oCUIGltcGxlbWVudCBvbmx5IHRoZSBob29rcyB5b3UgbmVlZC5cbiAqIFJlY29yZGVycyBhcmUgaW52b2tlZCBzeW5jaHJvbm91c2x5IGluIGF0dGFjaG1lbnQgb3JkZXIuXG4gKiBJZiBhIHJlY29yZGVyIHRocm93cywgdGhlIGVycm9yIGlzIGNhdWdodCBhbmQgc3dhbGxvd2VkOyBleGVjdXRpb24gY29udGludWVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtZXRyaWNzUmVjb3JkZXI6IEZsb3dSZWNvcmRlciA9IHtcbiAqICAgaWQ6ICdtZXRyaWNzJyxcbiAqICAgb25Mb29wOiAoZXZlbnQpID0+IHJlY29yZE1ldHJpYygnbG9vcC5pdGVyYXRpb24nLCBldmVudC5pdGVyYXRpb24pLFxuICogICBvbkRlY2lzaW9uOiAoZXZlbnQpID0+IHJlY29yZE1ldHJpYygnZGVjaXNpb24nLCBldmVudC5jaG9zZW4pLFxuICogfTtcbiAqIGV4ZWN1dG9yLmF0dGFjaEZsb3dSZWNvcmRlcihtZXRyaWNzUmVjb3JkZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgb25TdGFnZUV4ZWN1dGVkPyhldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkO1xuICBvbk5leHQ/KGV2ZW50OiBGbG93TmV4dEV2ZW50KTogdm9pZDtcbiAgb25EZWNpc2lvbj8oZXZlbnQ6IEZsb3dEZWNpc2lvbkV2ZW50KTogdm9pZDtcbiAgb25Gb3JrPyhldmVudDogRmxvd0ZvcmtFdmVudCk6IHZvaWQ7XG4gIG9uU2VsZWN0ZWQ/KGV2ZW50OiBGbG93U2VsZWN0ZWRFdmVudCk6IHZvaWQ7XG4gIG9uU3ViZmxvd0VudHJ5PyhldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQ7XG4gIG9uU3ViZmxvd0V4aXQ/KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZDtcbiAgLyoqIENhbGxlZCB3aGVuIGEgZHluYW1pYyBzdWJmbG93IGlzIHJlZ2lzdGVyZWQgZHVyaW5nIHRyYXZlcnNhbC4gKi9cbiAgb25TdWJmbG93UmVnaXN0ZXJlZD8oZXZlbnQ6IEZsb3dTdWJmbG93UmVnaXN0ZXJlZEV2ZW50KTogdm9pZDtcbiAgb25Mb29wPyhldmVudDogRmxvd0xvb3BFdmVudCk6IHZvaWQ7XG4gIG9uQnJlYWs/KGV2ZW50OiBGbG93QnJlYWtFdmVudCk6IHZvaWQ7XG4gIG9uRXJyb3I/KGV2ZW50OiBGbG93RXJyb3JFdmVudCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSBwZXIgZmFpbGVkIGF0dGVtcHQgdGhhdCBXSUxMIGJlIHJldHJpZWQsIGZvciBzdGFnZXMgY2FycnlpbmcgYVxuICAgKiBkZWNsYXJlZCBgcmV0cnlgIHBvbGljeS4gVGhlIGZpbmFsIGZhaWx1cmUgYXJyaXZlcyB2aWEgYG9uRXJyb3JgIGluc3RlYWQsXG4gICAqIHNvIGEgc3RhZ2UgbmV2ZXIgcmVwb3J0cyB0aGUgc2FtZSBmYWlsdXJlIHR3aWNlLiBTZWVcbiAgICoge0BsaW5rIEZsb3dTdGFnZVJldHJ5RXZlbnR9IGZvciB0aGUgZXhhY3QgZXZlbnQgYXJpdGhtZXRpYy5cbiAgICovXG4gIG9uU3RhZ2VSZXRyeT8oZXZlbnQ6IEZsb3dTdGFnZVJldHJ5RXZlbnQpOiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBmb3JrIGNoaWxkJ3MgZXJyb3IgaXMgY2xhc3NpZmllZCBhcyB0aHJvdHRsaW5nIGJ5IHRoZVxuICAgKiBleGVjdXRvcidzIGB0aHJvdHRsaW5nRXJyb3JDaGVja2VyYCDigJQgc2VlIHtAbGluayBGbG93VGhyb3R0bGVkRXZlbnR9LlxuICAgKi9cbiAgb25UaHJvdHRsZWQ/KGV2ZW50OiBGbG93VGhyb3R0bGVkRXZlbnQpOiB2b2lkO1xuICBvblBhdXNlPyhldmVudDogRmxvd1BhdXNlRXZlbnQpOiB2b2lkO1xuICBvblJlc3VtZT8oZXZlbnQ6IEZsb3dSZXN1bWVFdmVudCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSBwZXIgdG9wLWxldmVsIGBleGVjdXRvci5ydW4oKWAgQkVGT1JFIHRyYXZlcnNhbCBiZWdpbnMuXG4gICAqIENhcnJpZXMgYGV2ZW50LnBheWxvYWQgPSBydW4oe2lucHV0fSlgLiBTdWJmbG93LXRyYXZlcnNlcnMgZG9uJ3QgZmlyZSBpdC5cbiAgICovXG4gIG9uUnVuU3RhcnQ/KGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIHRvcC1sZXZlbCBgZXhlY3V0b3IucnVuKClgIEFGVEVSIHRyYXZlcnNhbCBjb21wbGV0ZXNcbiAgICogY2xlYW5seS4gQ2FycmllcyBgZXZlbnQucGF5bG9hZCA9IGNoYXJ0J3MgcmV0dXJuIHZhbHVlYC4gTk9UIGZpcmVkIG9uXG4gICAqIHBhdXNlICh0aGUgcnVuIGRpZG4ndCBlbmQpIG9yIHVuY2F1Z2h0IGVycm9yLlxuICAgKi9cbiAgb25SdW5FbmQ/KGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIHRvcC1sZXZlbCBgZXhlY3V0b3IucnVuKClgIHdoZW4gdGhlIHJ1biB0aHJvd3MgYVxuICAgKiBub24tcGF1c2UgZXJyb3IsIEJFRk9SRSB0aGUgZXhjZXB0aW9uIHByb3BhZ2F0ZXMuIFRoZSBURVJNSU5BTFxuICAgKiBjb3VudGVycGFydCB0byBgb25SdW5FbmRgIOKAlCBsZXRzIGEgbW9uaXRvciBjbG9zZSB0aGUgcnVuIGJvdW5kYXJ5IG9uXG4gICAqIGZhaWx1cmUgaW5zdGVhZCBvZiB3YWl0aW5nIGZvcmV2ZXIuIE5PVCBmaXJlZCBvbiBwYXVzZS5cbiAgICovXG4gIG9uUnVuRmFpbGVkPyhldmVudDogRmxvd1J1bkZhaWxlZEV2ZW50KTogdm9pZDtcbiAgLyoqIENhbGxlZCBiZWZvcmUgZWFjaCBydW4gdG8gcmVzZXQgcGVyLXJ1biBzdGF0ZS4gSW1wbGVtZW50IGZvciBzdGF0ZWZ1bCByZWNvcmRlcnMuICovXG4gIGNsZWFyPygpOiB2b2lkO1xuICAvKiogT3B0aW9uYWw6IGV4cG9zZSBjb2xsZWN0ZWQgZGF0YSBmb3IgaW5jbHVzaW9uIGluIHNuYXBzaG90cy4gKi9cbiAgdG9TbmFwc2hvdD8oKTogaW1wb3J0KCcuLi8uLi9yZWNvcmRlci9zbmFwc2hvdC5qcycpLlJlY29yZGVyQnVuZGxlO1xufVxuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSUNvbnRyb2xGbG93TmFycmF0aXZlIOKAlCBJbnRlcmZhY2UgZm9yIGNvbnRyb2wgZmxvdyBuYXJyYXRpdmUgZ2VuZXJhdGlvbi5cbiAqXG4gKiBDYXB0dXJlcyBGTE9XIGV2ZW50cyBkdXJpbmcgdHJhdmVyc2FsOiBkZWNpc2lvbnMsIGZvcmtzLCBsb29wcywgc3ViZmxvd3MuXG4gKiBDb21wbGVtZW50YXJ5IHRvIHNjb3BlL3JlY29yZGVycy9OYXJyYXRpdmVSZWNvcmRlciB3aGljaCBjYXB0dXJlcyBEQVRBIGV2ZW50cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0UmVjb3JkLCBSdW5Db3JyZWxhdGlvbiB9IGZyb20gJy4uLy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlLCBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgVGVybWluYWxGYWlsdXJlQ29udGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy90ZXJtaW5hbEZhaWx1cmUuanMnO1xuXG4vKipcbiAqXG4gKiBVc2VzIE51bGwgT2JqZWN0IHBhdHRlcm46IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciBzYXRpc2ZpZXMgdGhpc1xuICogaW50ZXJmYWNlIHdpdGggZW1wdHkgbWV0aG9kcyBmb3IgemVyby1jb3N0IGRpc2FibGVkIHBhdGguXG4gKi9cblxuLyoqXG4gKiBUaGUga2luZCBvZiBzdGFnZSB0aGF0IGNvbXBsZXRlZC4gTGV0cyBjb25zdW1lcnMgcm91dGUgdW5pZm9ybVxuICogXCJkaWQgdGhpcyBzdGFnZSBleGVjdXRlXCIgaGFuZGxpbmcgd2l0aG91dCBhIHNpZGUtdGFibGUgbG9va3VwIGludG9cbiAqIHRoZSBjaGFydCBzcGVjLiBSZXF1aXJlZCBvbiBldmVyeSBgb25TdGFnZUV4ZWN1dGVkYCBldmVudCBzaW5jZVxuICogcHJvcG9zYWwgIzAwMyB1bmlmaWVkIHRoZSBldmVudCB0byBmaXJlIGZvciBBTEwgc3RhZ2Uga2luZHMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0YWdlVHlwZSA9ICdsaW5lYXInIHwgJ2RlY2lkZXInIHwgJ2ZvcmsnIHwgJ3NlbGVjdG9yJyB8ICdzdWJmbG93LW1vdW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbEZsb3dOYXJyYXRpdmUge1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBzdGFnZSBjb21wbGV0ZXMgaXRzIG1haW4gd29yay4gRmlyZXMgZm9yIEFMTCBzdGFnZVxuICAgKiBraW5kcyAoYCdsaW5lYXInYCwgYCdkZWNpZGVyJ2AsIGAnZm9yaydgLCBgJ3NlbGVjdG9yJ2AsIGAnc3ViZmxvdy1tb3VudCdgKVxuICAgKiBBRlRFUiB0aGUgY29ycmVzcG9uZGluZyBzcGVjaWFsaXplZCBldmVudCAoYG9uRGVjaXNpb25gLCBgb25Gb3JrYCxcbiAgICogYG9uU2VsZWN0ZWRgLCBgb25TdWJmbG93RW50cnlgKS4gRm9yIGxpbmVhciBzdGFnZXMsIGZpcmVzIGFmdGVyXG4gICAqIHRoZSBzdGFnZSBmdW5jdGlvbiByZXR1cm5zLlxuICAgKlxuICAgKiBDb25zdW1lcnMgdHJhY2tpbmcgXCJkaWQgdGhpcyBzdGFnZSBydW4/XCIgdXNlIHRoaXMgZXZlbnQgdW5pZm9ybWx5XG4gICAqIGFuZCBzd2l0Y2ggb24gYHN0YWdlVHlwZWAgZm9yIGtpbmQtc3BlY2lmaWMgd29yay5cbiAgICovXG4gIG9uU3RhZ2VFeGVjdXRlZChcbiAgICBzdGFnZU5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ6IFRyYXZlcnNhbENvbnRleHQgfCB1bmRlZmluZWQsXG4gICAgc3RhZ2VUeXBlOiBTdGFnZVR5cGUsXG4gICk6IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCBvbiBsaW5lYXIgY29udGludWF0aW9uIGZyb20gb25lIHN0YWdlIHRvIHRoZSBuZXh0LiAqL1xuICBvbk5leHQoZnJvbVN0YWdlOiBzdHJpbmcsIHRvU3RhZ2U6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcsIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZDtcblxuICAvKiogQ2FsbGVkIHdoZW4gYSBkZWNpZGVyIHNlbGVjdHMgYSBicmFuY2guIE1vc3QgdmFsdWFibGUgZm9yIExMTSBjb250ZXh0LiAqL1xuICBvbkRlY2lzaW9uKFxuICAgIGRlY2lkZXJOYW1lOiBzdHJpbmcsXG4gICAgY2hvc2VuQnJhbmNoOiBzdHJpbmcsXG4gICAgcmF0aW9uYWxlPzogc3RyaW5nLFxuICAgIGRlY2lkZXJEZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICBldmlkZW5jZT86IERlY2lzaW9uRXZpZGVuY2UsXG4gICk6IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCB3aGVuIGEgZm9yayBleGVjdXRlcyBhbGwgY2hpbGRyZW4gaW4gcGFyYWxsZWwuICovXG4gIG9uRm9yayhwYXJlbnRTdGFnZTogc3RyaW5nLCBjaGlsZE5hbWVzOiBzdHJpbmdbXSwgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkO1xuXG4gIC8qKiBDYWxsZWQgd2hlbiBhIHNlbGVjdG9yIHBpY2tzIGEgc3Vic2V0IG9mIGNoaWxkcmVuLiAqL1xuICBvblNlbGVjdGVkKFxuICAgIHBhcmVudFN0YWdlOiBzdHJpbmcsXG4gICAgc2VsZWN0ZWROYW1lczogc3RyaW5nW10sXG4gICAgdG90YWxDb3VudDogbnVtYmVyLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICAgIGV2aWRlbmNlPzogU2VsZWN0aW9uRXZpZGVuY2UsXG4gICk6IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCB3aGVuIGVudGVyaW5nIGEgc3ViZmxvdyAobmVzdGVkIGNvbnRleHQgYm91bmRhcnkpLiAqL1xuICBvblN1YmZsb3dFbnRyeShcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nLFxuICAgIHN1YmZsb3dJZD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICBtYXBwZWRJbnB1dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkO1xuXG4gIC8qKiBDYWxsZWQgd2hlbiBleGl0aW5nIGEgc3ViZmxvdy4gKi9cbiAgb25TdWJmbG93RXhpdChcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nLFxuICAgIHN1YmZsb3dJZD86IHN0cmluZyxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICBvdXRwdXRTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkO1xuXG4gIC8qKiBDYWxsZWQgd2hlbiBhIGR5bmFtaWMgc3ViZmxvdyBpcyByZWdpc3RlcmVkIGR1cmluZyB0cmF2ZXJzYWwuICovXG4gIG9uU3ViZmxvd1JlZ2lzdGVyZWQoc3ViZmxvd0lkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcsIHNwZWNTdHJ1Y3R1cmU/OiB1bmtub3duKTogdm9pZDtcblxuICAvKiogQ2FsbGVkIG9uIGxvb3AgaXRlcmF0aW9uIChiYWNrLWVkZ2UgdHJhdmVyc2FsKS4gKi9cbiAgb25Mb29wKHRhcmdldFN0YWdlOiBzdHJpbmcsIGl0ZXJhdGlvbjogbnVtYmVyLCBkZXNjcmlwdGlvbj86IHN0cmluZywgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIHN0YWdlIHRyaWdnZXJzIGJyZWFrIChlYXJseSB0ZXJtaW5hdGlvbikuXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBPcHRpb25hbCBzdHJpbmcgcGFzc2VkIHRvIGBzY29wZS4kYnJlYWsocmVhc29uKWAuXG4gICAqIEBwYXJhbSBwcm9wYWdhdGVkRnJvbVN1YmZsb3cgLSBXaGVuIHNldCwgdGhpcyBicmVhayB3YXMgcmFpc2VkIG9uIHRoZVxuICAgKiAgIHBhcmVudCBiZWNhdXNlIGFuIGlubmVyIHN1YmZsb3cgKHRoaXMgaWQpIGJyb2tlIHdpdGggYHByb3BhZ2F0ZUJyZWFrYFxuICAgKiAgIGVuYWJsZWQuIFVzZWQgYnkgcmVjb3JkZXJzIHRvIGRpc3Rpbmd1aXNoIG9yaWdpbmF0aW5nIHZzIHByb3BhZ2F0ZWRcbiAgICogICBicmVha3MgYW5kIHJlbmRlciB0aGVtIGFjY29yZGluZ2x5LlxuICAgKi9cbiAgb25CcmVhayhcbiAgICBzdGFnZU5hbWU6IHN0cmluZyxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgICByZWFzb24/OiBzdHJpbmcsXG4gICAgcHJvcGFnYXRlZEZyb21TdWJmbG93Pzogc3RyaW5nLFxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIHN0YWdlIHRocm93cyBhbiBlcnJvciwgd2l0aCBpdHMgU0VSVkVEIGZvcm06IGZvciBhIHN0YWdlJ3Mgb3duIGZhaWx1cmUgdGhhdCBpc1xuICAgKiBgUmVkYWN0aW9uUnVsZS5yZXRhaW5TdGFnZUVycm9yYCAodGhlIGRpYWdub3N0aWMgcG9saWN5IGFwcGxpZWQgb25jZSksIGVsc2V3aGVyZSBgZXh0cmFjdEVycm9ySW5mb2AuXG4gICAqL1xuICBvbkVycm9yKFxuICAgIHN0YWdlTmFtZTogc3RyaW5nLFxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICAgIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBFTkQgb2YgZXZlcnkgYXR0ZW1wdCAoMTAuMSkg4oCUIGV2ZXJ5IG91dGNvbWUsIHdpdGggdGhlXG4gICAqIGF0dGVtcHQncyB7QGxpbmsgQXR0ZW1wdFJlY29yZH0gKHRpbWluZywgb3V0Y29tZSwgY2F0ZWdvcnksIHRoZVxuICAgKiByZXRyeS1vci1zdG9wIGRlY2lzaW9uKTogYSBzdGFnZSdzIG93biAoYHJlY29yZC5raW5kID09PSAnc3RhZ2UnYCwgdW5kZXIgYVxuICAgKiByZXRyeSBwb2xpY3ksIGEgYHRpbWVvdXRNc2Agb3IgYSBydW4gZGVhZGxpbmUpLCBhbmQgdGhlIGNhbGxzIGl0IG1ha2VzXG4gICAqIChgJ2NhbGwnYCwgYHNjb3BlLiRjYWxsYCkgYW5kIG91dHNpZGUgYXR0ZW1wdHMgaXQgcmVwb3J0cyAoYCdvYnNlcnZlZCdgKVxuICAgKiBkdXJpbmcgdGhlIHN0YWdlIChQMikuIEEgc3RhZ2UgYXR0ZW1wdCBmaXJlcyBiZWZvcmUgYG9uU3RhZ2VSZXRyeWAgd2hlbiBpdFxuICAgKiBpcyByZXRyaWVkLCBhbmQgYmVmb3JlIGBvbkVycm9yYCAvIGBvblN0YWdlRXhlY3V0ZWRgIGZvciB0aGUgbGFzdC5cbiAgICogYHN0cnVjdHVyZWRFcnJvcmAgaXMgdGhlIGF0dGVtcHQncyBzZXJ2ZWQgZXJyb3IgKGByYXdgIGluY2x1ZGVkIHVubGVzcyB0aGVcbiAgICogcG9saWN5IG1hc2tlZCBpdDsgbmV2ZXIgZm9yIGFuIG9ic2VydmVkIGF0dGVtcHQpOyBhYnNlbnQgZm9yIGEgc3VjY2VzcyBvclxuICAgKiBhIHBhdXNlLlxuICAgKlxuICAgKiBFdmVudCBhcml0aG1ldGljOiBvbmUgcGVyIGF0dGVtcHQg4oCUIGZvciBhIHN0YWdlLCB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIGl0XG4gICAqIG1hZGUgcGx1cyBvbmUgcGVyIGNhbGwgb3Igb2JzZXJ2ZWQgYXR0ZW1wdCAoZmlsdGVyIG9uIGByZWNvcmQua2luZGApLlxuICAgKi9cbiAgb25BdHRlbXB0KFxuICAgIHN0YWdlTmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICByZWNvcmQ6IEF0dGVtcHRSZWNvcmQsXG4gICAgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhbiBhdHRlbXB0IGF0IGEgc3RhZ2Ugd2l0aCBhIGRlY2xhcmVkIGByZXRyeWAgcG9saWN5IGZhaWxlZFxuICAgKiBBTkQgYW5vdGhlciBhdHRlbXB0IHdpbGwgcnVuLiBGaXJlcyBhZnRlciB0aGF0IGF0dGVtcHQncyBgb25BdHRlbXB0YCxcbiAgICogYWZ0ZXIgaXRzIHN0YWdlZCB3cml0ZXMgYXJlIGRpc2NhcmRlZCBhbmQgQkVGT1JFIHRoZSBiYWNrb2ZmIHdhaXQsIHNvIGFcbiAgICogbGl2ZSBtb25pdG9yIGxlYXJucyBcInJldHJ5aW5nIGluIDUwMCBtc1wiIHdoZW4gdGhlIGRlY2lzaW9uIGlzIG1hZGUsIG5vdFxuICAgKiBhZnRlciB0aGUgd2FpdC5cbiAgICpcbiAgICogRXZlbnQgYXJpdGhtZXRpYzogYW4gZXhoYXVzdGVkIHBvbGljeSBmaXJlcyBgYXR0ZW1wdHMgLSAxYCBvZiB0aGVzZSBhbmRcbiAgICogdGhlbiBvbmUgYG9uRXJyb3JgOyBhIGByZXRyeU9uYCB0aGF0IGRlY2xpbmVzIGZpcmVzIFpFUk8gb2YgdGhlc2UgYW5kIG9uZVxuICAgKiBgb25FcnJvcmAuIFRoZSBmaW5hbCBhdHRlbXB0IG5ldmVyIGZpcmVzIHRoaXMgZXZlbnQuXG4gICAqL1xuICBvblN0YWdlUmV0cnkoXG4gICAgc3RhZ2VOYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIGF0dGVtcHQ6IG51bWJlcixcbiAgICBtYXhBdHRlbXB0czogbnVtYmVyLFxuICAgIGRlbGF5TXM6IG51bWJlcixcbiAgICBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgZm9yayBjaGlsZCBmYWlsZWQgYW5kIHRoZSBydW4ncyBgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcmBcbiAgICogY2xhc3NpZmllZCBpdHMgZXJyb3IgYXMgdGhyb3R0bGluZyAoOS4zOS4wKS4gVGhlIGNoaWxkJ3MgZmFpbHVyZSB0YWtlc1xuICAgKiBpdHMgb3JkaW5hcnkgcGF0aCB0b287IHRoaXMgb25seSBuYW1lcyBpdCBhcyB0aHJvdHRsaW5nLlxuICAgKi9cbiAgb25UaHJvdHRsZWQ/KFxuICAgIHN0YWdlTmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCB3aGVuIGEgcGF1c2FibGUgc3RhZ2UgcGF1c2VzIGV4ZWN1dGlvbi4gKi9cbiAgb25QYXVzZShcbiAgICBzdGFnZU5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgcGF1c2VEYXRhOiB1bmtub3duLFxuICAgIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogdm9pZDtcblxuICAvKiogQ2FsbGVkIHdoZW4gYSBwYXVzZWQgc3RhZ2UgaXMgcmVzdW1lZC4gKi9cbiAgb25SZXN1bWUoc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaGFzSW5wdXQ6IGJvb2xlYW4sIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIHRvcC1sZXZlbCBgZXhlY3V0b3IucnVuKClgLCBCRUZPUkUgdGhlIGZpcnN0IHN0YWdlIGV4ZWN1dGVzLlxuICAgKiBgaW5wdXRgIGlzIHRoZSByZXRhaW5lZCBmb3JtIG9mIGBydW4oe2lucHV0fSlgIGFmdGVyIHNjaGVtYSB2YWxpZGF0aW9uO1xuICAgKiB0aGUgcnVuJ3Mga2V5L3BhdGggcmVkYWN0aW9uIGFwcGxpZXMgYmVmb3JlIGRpc3BhdGNoLiBTZWUge0BsaW5rIEZsb3dSdW5FdmVudH0uXG4gICAqIFN1YmZsb3ctdHJhdmVyc2VycyBkbyBOT1QgZmlyZSB0aGlzIGV2ZW50IOKAlCB0aGV5IGZpcmUgYG9uU3ViZmxvd0VudHJ5YC5cbiAgICovXG4gIG9uUnVuU3RhcnQoaW5wdXQ6IHVua25vd24sIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIHRvcC1sZXZlbCBgZXhlY3V0b3IucnVuKClgLCBBRlRFUiB0aGUgbGFzdCBzdGFnZSBjb21taXRzLlxuICAgKiBgb3V0cHV0YCBpcyB0aGUgcmV0YWluZWQgZm9ybSBvZiB0aGUgY2hhcnQncyByZXR1cm4uIE5PVCBmaXJlZCBvbiBwYXVzZSAodGhlIHJ1blxuICAgKiBkaWRuJ3QgZW5kOyBpdCBzdXNwZW5kZWQpIG9yIG9uIHVuY2F1Z2h0IGVycm9yLiBTdWJmbG93LXRyYXZlcnNlcnMgZG9cbiAgICogTk9UIGZpcmUgdGhpcyBldmVudCDigJQgdGhleSBmaXJlIGBvblN1YmZsb3dFeGl0YC5cbiAgICovXG4gIG9uUnVuRW5kKG91dHB1dDogdW5rbm93biwgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSBwZXIgdG9wLWxldmVsIGBleGVjdXRvci5ydW4oKWAgd2hlbiB0cmF2ZXJzYWwgdGhyb3dzIGFcbiAgICogTk9OLXBhdXNlIGVycm9yLCBCRUZPUkUgdGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGVzIHRvIGBydW4oKWAncyBjYWxsZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFRFUk1JTkFMIGNvdW50ZXJwYXJ0IHRvIGBvblJ1bkVuZGAg4oCUIGl0IGNsb3NlcyB0aGUgcnVuXG4gICAqIGJvdW5kYXJ5IHN5bW1ldHJpY2FsbHkgc28gZXZlcnkgYG9uUnVuU3RhcnRgIGlzIGZvbGxvd2VkIGJ5IGV4YWN0bHlcbiAgICogb25lIG9mIGBvblJ1bkVuZGAgKGNsZWFuKSBvciBgb25SdW5GYWlsZWRgIChlcnJvcikuIFdpdGhvdXQgaXQsIGFcbiAgICogbGl2ZSBtb25pdG9yIHNlZXMgYG9uUnVuU3RhcnRgIHRoZW4gc2lsZW5jZSBvbiBhIGZhaWxlZCBydW4gYW5kIGNhbid0XG4gICAqIHRlbGwgXCJzdGlsbCBydW5uaW5nXCIgZnJvbSBcImNyYXNoZWQuXCJcbiAgICpcbiAgICogRXJyb3JzIFNUSUxMIHRocm93IOKAlCB0aGlzIGlzIHRoZSBvYnNlcnZhYmxlIHRlcm1pbmFsIHNpZ25hbCwgbm90IGFcbiAgICogcmVjb3ZlcnkgbWVjaGFuaXNtIChubyByb3V0aW5nLCBubyBlcnJvci1zdWJmbG93KS4gUGF1c2UgaXMgTk9UIGFuXG4gICAqIGVycm9yLCBzbyBpdCBkb2VzIG5vdCBmaXJlIHRoaXMuIFN1YmZsb3ctdHJhdmVyc2VycyBkbyBOT1QgZmlyZSBpdDtcbiAgICogdGhlaXIgZXJyb3JzIHByb3BhZ2F0ZSB0byB0aGUgcGFyZW50IGFuZCBzdXJmYWNlIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAqL1xuICBvblJ1bkZhaWxlZChlcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbywgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsIGZhaWx1cmU/OiBUZXJtaW5hbEZhaWx1cmVDb250ZXh0KTogdm9pZDtcblxuICAvKiogUmV0dXJucyBhY2N1bXVsYXRlZCBuYXJyYXRpdmUgc2VudGVuY2VzIGluIGV4ZWN1dGlvbiBvcmRlci4gKi9cbiAgZ2V0U2VudGVuY2VzKCk6IHN0cmluZ1tdO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUcmF2ZXJzYWxDb250ZXh0IOKAlCByZWFkLW9ubHkgZXhlY3V0aW9uIGNvbnRleHQgZnJvbSB0aGUgdHJhdmVyc2VyLlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRyYXZlcnNhbCBjb250ZXh0IGF0dGFjaGVkIHRvIGV2ZXJ5IEZsb3dSZWNvcmRlciBldmVudC5cbiAqIENyZWF0ZWQgYnkgdGhlIHRyYXZlcnNlciBkdXJpbmcgREZTLCBwYXNzZWQgdG8gcmVjb3JkZXJzIGFzIHJlYWQtb25seSBkYXRhLlxuICogRW5hYmxlcyByZWNvcmRlcnMgdG8gYnVpbGQgdHJlZXMsIGdyb3VwIGJ5IHN1YmZsb3csIGFuZCBjb3JyZWxhdGUgZXZlbnRzXG4gKiB3aXRob3V0IG1haW50YWluaW5nIHRoZWlyIG93biBzdGFja3Mgb3IgcG9zdC1wcm9jZXNzaW5nLlxuICpcbiAqIExpa2UgT3BlblRlbGVtZXRyeSdzIHNwYW4gY29udGV4dDogc3RhZ2VJZCArIHBhcmVudFN0YWdlSWQgZm9ybSBhIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhdmVyc2FsQ29udGV4dCB7XG4gIC8qKlxuICAgKiBQZXItYGV4ZWN1dG9yLnJ1bigpYCBpZGVudGlmaWVyLiBHZW5lcmF0ZWQgb25jZSBhdCB0aGUgc3RhcnQgb2YgZXZlcnlcbiAgICogYHJ1bigpYCAoYW5kIGFnYWluIG9uIGByZXN1bWUoKWApOyBzaGFyZWQgYnkgZXZlcnkgZXZlbnQgb2YgdGhhdCBydW47XG4gICAqIGRpZmZlcnMgYWNyb3NzIGNvbnNlY3V0aXZlIHJ1bnMgb2YgdGhlIHNhbWUgZXhlY3V0b3IuXG4gICAqXG4gICAqIEZvcm1hdDogYCR7RGF0ZS5ub3coKX0tJHtjb3VudGVyfWAg4oCUIHNvcnRhYmxlIGxleGljb2dyYXBoaWNhbGx5ICg9PVxuICAgKiBjaHJvbm9sb2dpY2FsbHkgZm9yIHJ1bnMgPiAxbXMgYXBhcnQpLiBQcm9jZXNzLWxvY2FsIOKAlCBmb3IgY3Jvc3MtXG4gICAqIHByb2Nlc3MgY29ycmVsYXRpb24gdXNlIGBnZXRFbnYoKS50cmFjZUlkYCAoY29uc3VtZXItc3VwcGxpZWQpLlxuICAgKlxuICAgKiBSZWNvcmRlcnMgdGhhdCBhY2N1bXVsYXRlIHN0YXRlIGFjcm9zcyBydW5zIChmb3JrIGJvb2trZWVwaW5nLFxuICAgKiBzaWJsaW5nLWhhbmRvZmYgc3RhdGUsIGV0Yy4pIGRldGVjdCBcIm5ldyBydW5cIiB2aWFcbiAgICogYGV2ZW50LnRyYXZlcnNhbENvbnRleHQucnVuSWQgIT09IHRoaXMubGFzdFJ1bklkYCBhbmQgcmVzZXRcbiAgICogdHJhbnNpZW50IGJvb2trZWVwaW5nLiBSZWNvcmRlcnMgdGhhdCBkb24ndCBjYXJlIGFib3V0IHNjb3BpbmdcbiAgICogaWdub3JlIHRoZSBmaWVsZC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHJlYWRvbmx5IHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gRm9ybWF0OiBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXguXG4gICAqICBDb3VudGVyIHJlc2V0cyBwZXIgZXhlY3V0b3Ig4oCUIGNvbWJpbmUgd2l0aCBgcnVuSWRgIGZvciBnbG9iYWxseSB1bmlxdWUgc3RlcCBrZXlzLiAqL1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBQYXJlbnQgc3RhZ2UgSUQg4oCUIHdhbGsgdXAgdG8gcmVjb25zdHJ1Y3QgdGhlIHRyZWUuIFVuZGVmaW5lZCBhdCByb290LiAqL1xuICByZWFkb25seSBwYXJlbnRTdGFnZUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhcmVudCBFWEVDVVRJT04gc3RlcCdzIHJ1bnRpbWVTdGFnZUlkIOKAlCB0aGUgcnVudGltZSB0d2luIG9mXG4gICAqIGBwYXJlbnRTdGFnZUlkYCAoUkZDLTAwMyBEMSkuIFdhbGsgdXAgdG8gcmVjb25zdHJ1Y3QgdGhlIHJ1bnRpbWVcbiAgICogYW5jZXN0b3IgY2hhaW47IGxvb3AgcmUtZW50cmllcyBzdGF5IHVuYW1iaWd1b3VzIGJlY2F1c2UgcnVudGltZSBpZHNcbiAgICogKGBzdGFnZUlkI2V4ZWN1dGlvbkluZGV4YCkgZGlmZmVyIHBlciBpdGVyYXRpb24gZXZlbiB3aGVuIHN0YWdlIGlkc1xuICAgKiByZXBlYXQuIENyb3NzZXMgc3ViZmxvdyBib3VuZGFyaWVzOiB0aGUgZmlyc3Qgc3RhZ2UgaW5zaWRlIGEgc3ViZmxvd1xuICAgKiBwb2ludHMgYXQgdGhlIE1PVU5UIHN0YWdlJ3MgcnVudGltZVN0YWdlSWQgaW4gdGhlIHBhcmVudCB0cmF2ZXJzZXIuXG4gICAqIFVuZGVmaW5lZCBvbmx5IGF0IHRoZSBmaXJzdCBzdGFnZSBvZiB0aGUgdG9wLWxldmVsIGNoYXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50UnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IElEIHdoZW4gaW5zaWRlIGEgc3ViZmxvdy4gVW5kZWZpbmVkIGF0IHJvb3QgbGV2ZWwuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIEZ1bGwgc3ViZmxvdyBwYXRoIGZvciBuZXN0ZWQgc3ViZmxvd3MgKGUuZy4sIFwic2Ytb3V0ZXIvc2YtaW5uZXJcIikuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogU3ViZmxvdyBuZXN0aW5nIGRlcHRoIG9mIHRoZSBzdGFnZSdzIEFERFJFU1M6IGhvdyBtYW55IHN1YmZsb3cgc2VnbWVudHMgaXRzXG4gICAqIGBydW50aW1lU3RhZ2VJZGAgY2FycmllcyAoMCA9IHRvcCBsZXZlbCwgMSA9IGluc2lkZSBhIHN1YmZsb3cgb3IgYVxuICAgKiBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2gsIDIgPSBhIHN1YmZsb3cgaW5zaWRlIHRoYXQsIOKApikuIE9uZSBtZWFuaW5nIG9uXG4gICAqIGV2ZXJ5IHN0YW1wIOKAlCBzdGFnZSBldmVudHMsIHRoZSBydW4tYm91bmRhcnkgcm9vdCAoMCkgYW5kIGBvblJlc3VtZWBcbiAgICogKDkuMzcuMDsgdW50aWwgOS4zNi4wIHN0YWdlIGV2ZW50cyBzdGFtcGVkIHRoZSBwYXJlbnQtY2hhaW4gbGVuZ3RoIG9mIHRoZVxuICAgKiBzdGFnZSdzIGNvbnRleHQgaW5zdGVhZCkuXG4gICAqL1xuICByZWFkb25seSBkZXB0aDogbnVtYmVyO1xuICAvKipcbiAgICogSG93IG1hbnkgdGltZXMgdGhpcyBzdGFnZSBoYXMgZXhlY3V0ZWQgQkVGT1JFIGluIHRoaXMgcnVuIOKAlCB0aGUgbG9vcFxuICAgKiBpdGVyYXRpb24gY291bnQgd2hlbiBhIG5vZGUgaXMgcmV2aXNpdGVkIChlLmcuIHZpYSBgbG9vcFRvYCkuIEFic2VudCBvbiB0aGVcbiAgICogZmlyc3QgZXhlY3V0aW9uOyBgMWAgb24gdGhlIGZpcnN0IGxvb3AtYmFjaywgYDJgIG9uIHRoZSBuZXh0LCDigKYgKGkuZS5cbiAgICogYHZpc2l0Q291bnQgLSAxYCkuIFJ1bi1zY29wZWQgKHJlc2V0cyBlYWNoIGBydW4oKWAvYHJlc3VtZSgpYCkgYW5kIG1vbm90b25pY1xuICAgKiBhY3Jvc3Mgc3ViZmxvdyByZS1tb3VudHMuIFBvcHVsYXRlZCBmb3IgZXZlcnkgc3RhZ2Uga2luZC4gTWlycm9ycyB0aGVcbiAgICogbmFycmF0aXZlIHJlY29yZGVyJ3MgXCJwYXNzIE5cIiBjb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IGxvb3BJdGVyYXRpb24/OiBudW1iZXI7XG4gIC8qKiBGb3JrIGJyYW5jaCBJRCB3aGVuIGluc2lkZSBhIHBhcmFsbGVsIG9yIGRlY2lkZXIgYnJhbmNoLiAqL1xuICByZWFkb25seSBmb3JrQnJhbmNoPzogc3RyaW5nO1xuICAvKipcbiAgICogT24gdGhlIGBvblJlc3VtZWAgZXZlbnQgb25seSAoOS4zNy4wKTogdGhlIFBBVVNFRCBleGVjdXRpb24gdGhpcyByZXN1bWVkXG4gICAqIHJ1biBjb250aW51ZXMg4oCUIGEgbGluayBpbiB0aGUgT3BlblRlbGVtZXRyeSBzZW5zZSwgbm90IGEgcGFyZW50LiBBIHJlc3VtZVxuICAgKiBpcyBhIG5ldyBgcnVuSWRgLCBzbyB0aGUgcGF1c2VkIGAocnVuSWQsIHJ1bnRpbWVTdGFnZUlkKWAgY2Fubm90IGJlIGFcbiAgICogcGFyZW50IG9mIGFueXRoaW5nIGluIGl0OyBpdCBpcyBuYW1lZCBoZXJlIGluc3RlYWQuIEFic2VudCB3aGVuIHRoZVxuICAgKiBjaGVja3BvaW50IHByZWRhdGVzIDkuMzcuMCAoaXQgZGlkIG5vdCByZWNvcmQgdGhlIHBhdXNlZCBleGVjdXRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdW1lZEZyb20/OiBSZXN1bWVMaW5rO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGNvcnJlbGF0aW9uICgxMC4xKSDigJQgYGVudi50cmFjZXBhcmVudGAsIG9yIGBlbnYudHJhY2VJZGAgKyBgZW52Lm9wZXJhdGlvbklkYCwgcmVzb2x2ZWQgb25jZSBwZXJcbiAgICogbGVnLiBUaGUgU0FNRSBmcm96ZW4gb2JqZWN0LCBieSByZWZlcmVuY2UsIG9uIGV2ZXJ5IHN0YW1wIG9mIHRoZSBsZWcgKHN1YmZsb3dzIGluY2x1ZGVkKSBhbmQgb25cbiAgICogYGdldFNuYXBzaG90KCkuY29ycmVsYXRpb25gLiBBYnNlbnQg4oCUIG5vIGtleSDigJQgd2hlbiB0aGUgZW52IGdpdmVzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBjb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xufVxuXG4vKipcbiAqIFRoZSBwYXVzZWQgZXhlY3V0aW9uIGEgcmVzdW1lIGNvbnRpbnVlcyDigJQgYFRyYXZlcnNhbENvbnRleHQucmVzdW1lZEZyb21gLlxuICogQm90aCBpZHMgYXJlIHRoZSBQQVVTRUQgcnVuJ3M6IGBydW5JZGAgaXMgdGhhdCBydW4ncywgYHJ1bnRpbWVTdGFnZUlkYCB0aGVcbiAqIGV4ZWN1dGlvbiBvZiB0aGUgc3RhZ2UgdGhhdCBwYXVzZWQgKGFzIGl0cyBgb25QYXVzZWAgZXZlbnQgc3RhbXBlZCBpdCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdW1lTGluayB7XG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEZsb3dSZWNvcmRlciDigJQgUGx1Z2dhYmxlIG9ic2VydmVyIGZvciBjb250cm9sIGZsb3cgZXZlbnRzLlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vblN0YWdlRXhlY3V0ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dTdGFnZUV2ZW50IHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogVHJhdmVyc2FsIGNvbnRleHQgZnJvbSB0aGUgZW5naW5lIOKAlCByZWFkLW9ubHksIHNldCBieSB0cmF2ZXJzZXIuICovXG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0O1xuICAvKipcbiAgICogV2hpY2gga2luZCBvZiBzdGFnZSBjb21wbGV0ZWQuIFRoZSBlbmdpbmUgZmlyZXMgYG9uU3RhZ2VFeGVjdXRlZGBcbiAgICogdW5pZm9ybWx5IGZvciBldmVyeSBzdGFnZSBraW5kIChwcm9wb3NhbCAjMDAzKTsgY29uc3VtZXJzIHJvdXRlIGJ5XG4gICAqIGBzdGFnZVR5cGVgIHdpdGhvdXQgYSBjaGFydC1zcGVjIGxvb2t1cC5cbiAgICovXG4gIHN0YWdlVHlwZTogU3RhZ2VUeXBlO1xufVxuXG4vKiogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vbk5leHQuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dOZXh0RXZlbnQge1xuICBmcm9tOiBzdHJpbmc7XG4gIHRvOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbn1cblxuLyoqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25EZWNpc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0RlY2lzaW9uRXZlbnQge1xuICBkZWNpZGVyOiBzdHJpbmc7XG4gIGNob3Nlbjogc3RyaW5nO1xuICByYXRpb25hbGU/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbiAgLyoqIFN0cnVjdHVyZWQgZGVjaXNpb24gZXZpZGVuY2UgZnJvbSBkZWNpZGUoKSBoZWxwZXIuICovXG4gIGV2aWRlbmNlPzogRGVjaXNpb25FdmlkZW5jZTtcbn1cblxuLyoqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25Gb3JrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93Rm9ya0V2ZW50IHtcbiAgcGFyZW50OiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBzdHJpbmdbXTtcbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG59XG5cbi8qKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uU2VsZWN0ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dTZWxlY3RlZEV2ZW50IHtcbiAgcGFyZW50OiBzdHJpbmc7XG4gIHNlbGVjdGVkOiBzdHJpbmdbXTtcbiAgdG90YWw6IG51bWJlcjtcbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG4gIC8qKiBTdHJ1Y3R1cmVkIHNlbGVjdGlvbiBldmlkZW5jZSBmcm9tIHNlbGVjdCgpIGhlbHBlci4gKi9cbiAgZXZpZGVuY2U/OiBTZWxlY3Rpb25FdmlkZW5jZTtcbn1cblxuLyoqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25TdWJmbG93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93U3ViZmxvd0V2ZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIOKAlCB1c2UgdGhpcyB0byBsb29rIHVwIHRoZSBmdWxsIHNwZWMgdmlhIHRoZSBtYW5pZmVzdC4gKi9cbiAgc3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKiogQnVpbGQtdGltZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgc3ViZmxvdyBkb2VzLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG4gIC8qKiBNYXBwZWQgaW5wdXQgdmFsdWVzIHNlbnQgSU5UTyB0aGUgc3ViZmxvdyAoZnJvbSBpbnB1dE1hcHBlci9pbnB1dEtleXMpLiBQcmVzZW50IG9uIGVudHJ5IGV2ZW50cy4gKi9cbiAgbWFwcGVkSW5wdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFN1YmZsb3cgc2hhcmVkIHN0YXRlIGF0IGV4aXQuIFByZXNlbnQgb24gZXhpdCBldmVudHMuICovXG4gIG91dHB1dFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uU3ViZmxvd1JlZ2lzdGVyZWQgKGR5bmFtaWMgc3ViZmxvdyBhdHRhY2htZW50KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQge1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyLiAqL1xuICBzdWJmbG93SWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIG5hbWUuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEJ1aWxkLXRpbWUgZGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogRnVsbCBzcGVjIHN0cnVjdHVyZSAod2hlbiBhdmFpbGFibGUgZnJvbSBidWlsZFRpbWVTdHJ1Y3R1cmUpLiAqL1xuICBzcGVjU3RydWN0dXJlPzogdW5rbm93bjtcbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG59XG5cbi8qKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uTG9vcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0xvb3BFdmVudCB7XG4gIHRhcmdldDogc3RyaW5nO1xuICBpdGVyYXRpb246IG51bWJlcjtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0O1xufVxuXG4vKiogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vbkJyZWFrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93QnJlYWtFdmVudCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZyZWUtZm9ybSByZWFzb24gc3VwcGxpZWQgYnkgYHNjb3BlLiRicmVhayhyZWFzb24pYC4gQWJzZW50XG4gICAqIHdoZW4gdGhlIHN0YWdlIGludm9rZWQgYCRicmVhaygpYCB3aXRob3V0IGFuIGFyZ3VtZW50LiBQcm9wYWdhdGVzIHdoZW5cbiAgICogYSBzdWJmbG93IGlzIG1vdW50ZWQgd2l0aCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgIOKAlCB0aGUgb3V0ZXIgYnJlYWtcbiAgICogZXZlbnQgY2FycmllcyB0aGUgaW5uZXIgYnJlYWsncyByZWFzb24gdG9vLlxuICAgKi9cbiAgcmVhc29uPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0aGlzIGJyZWFrIGV2ZW50IHdhcyByYWlzZWQgb24gdGhlIFBBUkVOVCBiZWNhdXNlIGFuIGlubmVyXG4gICAqIHN1YmZsb3cncyBicmVhayBwcm9wYWdhdGVkIHVwICh2aWEgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgKS5cbiAgICogVGhlIG9yaWdpbmF0aW5nIGlubmVyIGJyZWFrIGZpcmVzIGl0cyBvd24gYG9uQnJlYWtgIGV2ZW50IHNlcGFyYXRlbHlcbiAgICog4oCUIHRoaXMgZmxhZyBsZXRzIHJlY29yZGVycyBkaXN0aW5ndWlzaCB0aGUgdHdvLlxuICAgKi9cbiAgcHJvcGFnYXRlZEZyb21TdWJmbG93Pzogc3RyaW5nO1xufVxuXG4vKiogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vbkVycm9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93RXJyb3JFdmVudCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBTdHJ1Y3R1cmVkIGVycm9yIGRldGFpbHMg4oCUIHByZXNlcnZlcyBmaWVsZC1sZXZlbCBpc3N1ZXMsIGVycm9yIGNvZGVzLCBldGMuICovXG4gIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbztcbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBjaGFubmVsIGRpc2NyaW1pbmFudCDigJQgYCdmbG93J2Agb24gZXZlcnkgZW5naW5lLWRpc3BhdGNoZWRcbiAgICogZXZlbnQuIGBpc0Zsb3dFdmVudCgpYCBjaGVja3MgaXQgZmlyc3QgKGJhY2tsb2cgQjMpOyBvcHRpb25hbCBzb1xuICAgKiBjb25zdW1lci1mYWJyaWNhdGVkIGV2ZW50cyAodGVzdHMsIHJlcGxheXMpIHJlbWFpbiB0eXBlLXZhbGlkIGFuZCBmYWxsXG4gICAqIGJhY2sgdG8gdGhlIGxlZ2FjeSBwaXBlbGluZUlkLWFic2VuY2UgaGV1cmlzdGljLlxuICAgKi9cbiAgY2hhbm5lbD86ICdmbG93Jztcbn1cblxuLyoqXG4gKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uVGhyb3R0bGVkIOKAlCBhIGZvcmsgY2hpbGQgZmFpbGVkIGFuZCB0aGVcbiAqIGV4ZWN1dG9yJ3MgYHRocm90dGxpbmdFcnJvckNoZWNrZXJgIHNhaWQgaXRzIGVycm9yIGlzIHRocm90dGxpbmcgKDkuMzkuMCkuXG4gKlxuICogV0hZIGFuIGV2ZW50OiB0aGUgY2hlY2tlciB1c2VkIHRvIHdyaXRlIGBtb25pdG9yLmlzVGhyb3R0bGVkYCBpbnRvIHRoZVxuICogY2hpbGQncyBmcmFtZSBBRlRFUiB0aGUgY2hpbGQncyBsYXN0IGNvbW1pdCwgc28gdGhlIGZsYWcgbGFuZGVkIG5vd2hlcmUg4oCUXG4gKiBub3QgaW4gc3RhdGUsIG5vdCBpbiB0aGUgbG9nLiBUaHJvdHRsaW5nIGlzIHRlbGVtZXRyeSwgc28gaXQgdHJhdmVscyB0aGVcbiAqIHdheSB0ZWxlbWV0cnkgZG9lczogYXMgYW4gZXZlbnQgYSByZWNvcmRlciBjYW4gY291bnQsIGFsZXJ0IG9uLCBvciBiYWNrIG9mZlxuICogZnJvbS4gVGhlIGNoaWxkJ3MgZmFpbHVyZSBzdGlsbCB0YWtlcyBpdHMgb3JkaW5hcnkgcGF0aCAodGhlIGZhbi1vdXRcbiAqIHJlY29yZHMgaXQgYXMgYHsgaXNFcnJvcjogdHJ1ZSB9YCk7IHRoaXMgZXZlbnQgb25seSBjbGFzc2lmaWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dUaHJvdHRsZWRFdmVudCB7XG4gIC8qKiBUaGUgZm9yayBjaGlsZCB3aG9zZSBlcnJvciB3YXMgY2xhc3NpZmllZCBhcyB0aHJvdHRsaW5nLiAqL1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIG9mIHRoYXQgY2hpbGQgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgbWVzc2FnZSBvZiB0aGUgY2hpbGQncyBlcnJvci4gKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogU3RydWN0dXJlZCBkZXRhaWxzIG9mIHRoZSBjaGlsZCdzIGVycm9yLiAqL1xuICBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm87XG4gIC8qKiBUaGUgRk9SSydzIHN0YW1wIOKAlCB0aGUgZmFuLW91dCBpcyB3aGVyZSB0aGUgY2xhc3NpZmljYXRpb24gaXMgbWFkZS4gKi9cbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG4gIC8qKiBFeHBsaWNpdCBjaGFubmVsIGRpc2NyaW1pbmFudCDigJQgc2VlIHtAbGluayBGbG93RXJyb3JFdmVudC5jaGFubmVsfS4gKi9cbiAgY2hhbm5lbD86ICdmbG93Jztcbn1cblxuLyoqXG4gKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uQXR0ZW1wdCDigJQgb25lIGF0dGVtcHQsIGF0IGl0cyBlbmQgKDEwLjEpOiBhXG4gKiBzdGFnZSdzIG93biB1bmRlciBpdHMgcmV0cnkgcG9saWN5LCBhIGB0aW1lb3V0TXNgIG9yIGEgcnVuIGRlYWRsaW5lXG4gKiAoYHJlY29yZC5raW5kID09PSAnc3RhZ2UnYCksIG9yIOKAlCBkdXJpbmcgdGhlIHN0YWdlIOKAlCBhIGNhbGwgaXQgbWFkZVxuICogKGAnY2FsbCdgLCBgc2NvcGUuJGNhbGxgKSBvciBhbiBvdXRzaWRlIGF0dGVtcHQgaXQgcmVwb3J0ZWQgKGAnb2JzZXJ2ZWQnYCxcbiAqIFAyKS4gYHN0YWdlTmFtZWAgLyBgc3RhZ2VJZGAgLyBgdHJhdmVyc2FsQ29udGV4dGAgYXJlIHRoZSBzdGFnZSdzIGluIGV2ZXJ5XG4gKiBjYXNlOyBmaWx0ZXIgb24gYHJlY29yZC5raW5kYCB0byBjb3VudCBvbmUga2luZC5cbiAqXG4gKiBXSFkgdGhpcyBldmVudCBleGlzdHM6IGBvblN0YWdlUmV0cnlgIHNheXMgXCJhdHRlbXB0IE4gZmFpbGVkLCByZXRyeWluZ1wiIGFuZFxuICogbm90aGluZyBlbHNlIOKAlCBub3QgaG93IGxvbmcgYSB0cnkgdG9vaywgbm90IHdoeSB0aGUgc2VyaWVzIHN0b3BwZWQsIGFuZFxuICogbm90aGluZyBhdCBhbGwgd2hlbiBgcmV0cnlPbmAgZGVjbGluZWQuIEV2ZXJ5IGF0dGVtcHQgaXMgYW5cbiAqIHtAbGluayBBdHRlbXB0UmVjb3JkfSBpbnN0ZWFkLCB3aGF0ZXZlciBpdHMgb3V0Y29tZSwgd2l0aCB0aGUgZGVjaXNpb24gdGhhdFxuICogZm9sbG93ZWQgaXQgaW4gdGhlIHNoYXBlIGBkZWNpZGUoKWAgcmVjb3JkcyDigJQgdGhlIHNhbWUgcmVjb3JkcyB0aGUgc3RhZ2Unc1xuICogZXhlY3V0aW9uLXRyZWUgbm9kZSBrZWVwcyAoYFN0YWdlU25hcHNob3QuYXR0ZW1wdHNgKS5cbiAqXG4gKiBGaXJlcyBvbmNlIHBlciBhdHRlbXB0LCBiZWZvcmUgYG9uU3RhZ2VSZXRyeWAgKHdoZW4gdGhlIGF0dGVtcHQgaXMgcmV0cmllZClcbiAqIGFuZCBiZWZvcmUgYG9uRXJyb3JgIC8gYG9uU3RhZ2VFeGVjdXRlZGAgKGZvciB0aGUgbGFzdCkuIFRoZSByZWNvcmQgaXNcbiAqIGZyb3plbiBhbmQgc3Vydml2ZXMgYHN0cnVjdHVyZWRDbG9uZWA7IGBzdHJ1Y3R1cmVkRXJyb3JgIGlzIHRoZSBzZXJ2ZWQgZXJyb3JcbiAqIHdpdGggYHJhd2AsIGFzIG9uIHtAbGluayBGbG93U3RhZ2VSZXRyeUV2ZW50fSDigJQgZXhjZXB0IGZvciBhbiBvYnNlcnZlZFxuICogYXR0ZW1wdCwgd2hvc2UgZXJyb3IgdGhlIGxpYnJhcnkgbmV2ZXIgdGhyZXcgKGByYXdgIGlzIHVuZGVmaW5lZCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0F0dGVtcHRFdmVudCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgYXR0ZW1wdDogdGltaW5nLCBvdXRjb21lLCBjYXRlZ29yeSwgZGVjaXNpb24sIGFuZCB0aGUgc2VydmVkIGVycm9yIHdpdGhvdXQgYHJhd2AuICovXG4gIHJlY29yZDogQXR0ZW1wdFJlY29yZDtcbiAgLyoqIFRoZSBhdHRlbXB0J3Mgc2VydmVkIGVycm9yIHdpdGggYHJhd2Ag4oCUIGFic2VudCBmb3IgYSBzdWNjZXNzIG9yIGEgcGF1c2UuICovXG4gIHN0cnVjdHVyZWRFcnJvcj86IFN0cnVjdHVyZWRFcnJvckluZm87XG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0O1xuICAvKiogRXhwbGljaXQgY2hhbm5lbCBkaXNjcmltaW5hbnQg4oCUIHNlZSB7QGxpbmsgRmxvd0Vycm9yRXZlbnQuY2hhbm5lbH0uICovXG4gIGNoYW5uZWw/OiAnZmxvdyc7XG59XG5cbi8qKlxuICogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vblN0YWdlUmV0cnkg4oCUIG9uZSBmYWlsZWQgYXR0ZW1wdCBhdCBhIHN0YWdlXG4gKiB0aGF0IGNhcnJpZXMgYSBkZWNsYXJlZCB7QGxpbmsgaW1wb3J0KCcuLi90eXBlcy5qcycpLlJldHJ5UG9saWN5fSwgYW5kIHdoaWNoXG4gKiBXSUxMIGJlIGF0dGVtcHRlZCBhZ2Fpbi5cbiAqXG4gKiBXSFkgdGhpcyBldmVudCBleGlzdHM6IGEgcmV0cnkgaGFuZC1yb2xsZWQgaW5zaWRlIGEgc3RhZ2UgZnVuY3Rpb24gbGVhdmVzIG5vXG4gKiBtYXJrIG9uIHRoZSB0cmFjZSBhdCBhbGwuIFRoaXMgZXZlbnQgaXMgd2hhdCBtYWtlcyBhIGRlY2xhcmVkIHJldHJ5IHBhcnQgb2ZcbiAqIHRoZSByZWNvcmQg4oCUIHdoaWNoIGF0dGVtcHQgZmFpbGVkLCB3aHksIGhvdyBsb25nIHRoZSBlbmdpbmUgd2FpdGVkLCBhbmQgaG93XG4gKiBtYW55IGF0dGVtcHRzIHRoZSBwb2xpY3kgYWxsb3dzLlxuICpcbiAqIEZpcmVzIG9ubHkgZm9yIGF0dGVtcHRzIGZvbGxvd2VkIGJ5IGFub3RoZXIgYXR0ZW1wdC4gVGhlIGZpbmFsIGZhaWx1cmUgdGFrZXNcbiAqIHRoZSBvcmRpbmFyeSBlcnJvciBwYXRoIChgb25FcnJvcmApLCBzbyB0aGUgdHdvIG5ldmVyIGRvdWJsZS1yZXBvcnQgdGhlIHNhbWVcbiAqIGZhaWx1cmU6IGFuIGV4aGF1c3RlZCBgYXR0ZW1wdHM6IDNgIHBvbGljeSBlbWl0cyAyIHJldHJ5IGV2ZW50cyArIDEgZXJyb3JcbiAqIGV2ZW50OyBhIGByZXRyeU9uYCB0aGF0IGRlY2xpbmVzIGVtaXRzIDAgcmV0cnkgZXZlbnRzICsgMSBlcnJvciBldmVudC4gRWFjaFxuICogYXR0ZW1wdCDigJQgcmV0cmllZCBvciBub3Qg4oCUIGFsc28gZmlyZXMge0BsaW5rIEZsb3dBdHRlbXB0RXZlbnR9IGZpcnN0ICgxMC4xKSxcbiAqIHdoaWNoIGlzIHdoZXJlIGEgZGVjbGluZWQgc3RvcCBpcyByZWNvcmRlZCAoYHJlYXNvbjogJ2RlY2xpbmVkJ2ApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dTdGFnZVJldHJ5RXZlbnQge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIGZyb20gdGhlIGJ1aWxkZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogV2hpY2ggYXR0ZW1wdCBqdXN0IEZBSUxFRCwgMS1iYXNlZC4gKi9cbiAgYXR0ZW1wdDogbnVtYmVyO1xuICAvKiogVG90YWwgYXR0ZW1wdHMgdGhlIHBvbGljeSBhbGxvd3MsIGluY2x1ZGluZyB0aGUgZmlyc3QuICovXG4gIG1heEF0dGVtcHRzOiBudW1iZXI7XG4gIC8qKiBNaWxsaXNlY29uZHMgdGhlIGVuZ2luZSB3aWxsIHdhaXQgYmVmb3JlIHRoZSBuZXh0IGF0dGVtcHQuIGAwYCA9IGltbWVkaWF0ZS4gKi9cbiAgZGVsYXlNczogbnVtYmVyO1xuICAvKiogSHVtYW4tcmVhZGFibGUgbWVzc2FnZSDigJQgdGhlIHNhbWUgc3RyaW5nIGBvbkVycm9yYCB3b3VsZCBjYXJyeS4gKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogU3RydWN0dXJlZCBkZXRhaWxzIG9mIHRoZSBlcnJvciB0aGF0IGVuZGVkIHRoaXMgYXR0ZW1wdC4gKi9cbiAgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbiAgLyoqIEV4cGxpY2l0IGNoYW5uZWwgZGlzY3JpbWluYW50IOKAlCBzZWUge0BsaW5rIEZsb3dFcnJvckV2ZW50LmNoYW5uZWx9LiAqL1xuICBjaGFubmVsPzogJ2Zsb3cnO1xufVxuXG4vKiogRXZlbnQgcGFzc2VkIHRvIEZsb3dSZWNvcmRlci5vblBhdXNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93UGF1c2VFdmVudCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBEYXRhIGZyb20gdGhlIHBhdXNlIHNpZ25hbCAocXVlc3Rpb24sIHJlYXNvbiwgbWV0YWRhdGEpLiAqL1xuICBwYXVzZURhdGE/OiB1bmtub3duO1xuICAvKiogUGF0aCB0aHJvdWdoIHN1YmZsb3dzIHRvIHRoZSBwYXVzZWQgc3RhZ2UuIEVtcHR5IGF0IHJvb3QgbGV2ZWwuICovXG4gIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG4gIC8qKiBFeHBsaWNpdCBjaGFubmVsIGRpc2NyaW1pbmFudCDigJQgc2VlIHtAbGluayBGbG93RXJyb3JFdmVudC5jaGFubmVsfS4gKi9cbiAgY2hhbm5lbD86ICdmbG93Jztcbn1cblxuLyoqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25SZXN1bWUuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dSZXN1bWVFdmVudCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHJlc3VtZSBpbnB1dCB3YXMgcHJvdmlkZWQuICovXG4gIGhhc0lucHV0OiBib29sZWFuO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbiAgLyoqIEV4cGxpY2l0IGNoYW5uZWwgZGlzY3JpbWluYW50IOKAlCBzZWUge0BsaW5rIEZsb3dFcnJvckV2ZW50LmNoYW5uZWx9LiAqL1xuICBjaGFubmVsPzogJ2Zsb3cnO1xufVxuXG4vKipcbiAqIEV2ZW50IHBhc3NlZCB0byBGbG93UmVjb3JkZXIub25SdW5TdGFydCAvIG9uUnVuRW5kLlxuICpcbiAqIEJyYWNrZXRzIHRoZSB0b3AtbGV2ZWwgYGV4ZWN1dG9yLnJ1bigpYCBjYWxsLiBTdWJmbG93cyBoYXZlIHRoZWlyIG93blxuICogcGFpciAoYG9uU3ViZmxvd0VudHJ5YCAvIGBvblN1YmZsb3dFeGl0YCk7IHRoZSBydW4gcGFpciBpcyB0aGUgT1VURVJNT1NUXG4gKiBib3VuZGFyeSwgc28gY29uc3VtZXJzIGJ1aWxkaW5nIFwiZXZlcnkgc3RlcCBoYXMgYW4gaW4vb3V0XCIgdmlld3MgY2FuXG4gKiBjbG9zZSB0aGUgY2hhaW4gYXQgdGhlIHRvcCBsZXZlbC5cbiAqXG4gKiAgIC0gYG9uUnVuU3RhcnRgIHBheWxvYWQg4oaSIHRoZSBpbnB1dCBwYXNzZWQgdG8gYHJ1bih7aW5wdXR9KWBcbiAqICAgLSBgb25SdW5FbmRgICAgcGF5bG9hZCDihpIgdGhlIGNoYXJ0J3MgcmV0dXJuIHZhbHVlXG4gKlxuICogQm90aCBhcmUgcmV0YWluZWQgYXQgcnVudGltZSBiZWZvcmUgZGlzcGF0Y2gvZGVmZXJyZWQgY2FwdHVyZSB1c2luZyB0aGVcbiAqIHJ1bidzIFJlZGFjdGlvblJ1bGUgKGByZXRhaW5Cb3VuZGFyeWApOiBvd24gc3RyaW5nIGtleXMgYXQgZXZlcnkgZGVwdGggKGJ5XG4gKiBuYW1lIG9yIGRvdHRlZCBwYXRoKSBhbmQgZXhwbGljaXQgbmVzdGVkIGZpZWxkcy4gU2NhbGFycyBwYXNzIHRocm91Z2g7IGZvcmtcbiAqIGNoaWxkLUlEIGVudmVsb3BlcyBuZWVkIGV4cGxpY2l0IHBhdGhzIHN1Y2ggYXMgZmllbGRzOiB7IGNoaWxkSWQ6IFsncmVzdWx0LnNlY3JldCddIH0uXG4gKiBWYWx1ZXMgYXJlIG5vdCBzY2FubmVkLiBMaXZlIGV4ZWN1dGlvbiBpbnB1dHMgYW5kIHJldHVybiB2YWx1ZXMgc3RheSB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd1J1bkV2ZW50IHtcbiAgLyoqIFJldGFpbmVkIGlucHV0IGFmdGVyIHZhbGlkYXRpb24gKGBvblJ1blN0YXJ0YCkgb3IgcmV0YWluZWQgY2hhcnQgcmV0dXJuXG4gICAqICAoYG9uUnVuRW5kYCksIHVuZGVyIHRoZSBrZXkvcGF0aCBjb250cmFjdCBhYm92ZS4gVW5kZWZpbmVkIGlmIG5laXRoZXIuICovXG4gIHBheWxvYWQ/OiB1bmtub3duO1xuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dDtcbn1cblxuLyoqXG4gKiBFdmVudCBwYXNzZWQgdG8gRmxvd1JlY29yZGVyLm9uUnVuRmFpbGVkIOKAlCB0aGUgVEVSTUlOQUwgZmFpbHVyZSBib3VuZGFyeVxuICogZm9yIGEgdG9wLWxldmVsIHJ1bi4gTWlycm9yIG9mIGBvblJ1bkVuZGAgZm9yIHRoZSBlcnJvciBwYXRoOiBpdCBmaXJlc1xuICogb25jZSwgZHVyaW5nIHRyYXZlcnNhbCwgd2hlbiB0aGUgcnVuIHRocm93cyBhIG5vbi1wYXVzZSBlcnJvciwgYmVmb3JlXG4gKiB0aGUgZXhjZXB0aW9uIHByb3BhZ2F0ZXMuIENhcnJpZXMgdGhlIHN0cnVjdHVyZWQgZXJyb3IgKGZpZWxkLWxldmVsXG4gKiBpc3N1ZXMsIGNvZGVzKSByYXRoZXIgdGhhbiBhIGZsYXR0ZW5lZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd1J1bkZhaWxlZEV2ZW50IHtcbiAgLyoqIFN0cnVjdHVyZWQgZGV0YWlscyBvZiB0aGUgZXJyb3IgdGhhdCB0ZXJtaW5hdGVkIHRoZSBydW4uICovXG4gIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbztcbiAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQ7XG4gIC8qKiBOYXRpdmUgdGVybWluYWwgb3duZXJzaGlwLCBpbmRlcGVuZGVudCBvZiBzZXJ2ZWQgZXJyb3IgZGV0YWlscy4gQWJzZW50IG9uIGxlZ2FjeSBtYW51YWxseSBlbWl0dGVkIGV2ZW50cy4gKi9cbiAgcmVhZG9ubHkgZmFpbHVyZT86IFRlcm1pbmFsRmFpbHVyZUNvbnRleHQ7XG59XG5cbi8qKlxuICogRmxvd1JlY29yZGVyIOKAlCBQbHVnZ2FibGUgb2JzZXJ2ZXIgZm9yIGNvbnRyb2wgZmxvdyBldmVudHMuXG4gKlxuICogTWlycm9ycyB0aGUgc2NvcGUtbGV2ZWwgU2NvcGVSZWNvcmRlciBwYXR0ZXJuIGZvciB0aGUgZW5naW5lIGxheWVyLlxuICogQWxsIG1ldGhvZHMgYXJlIG9wdGlvbmFsIOKAlCBpbXBsZW1lbnQgb25seSB0aGUgaG9va3MgeW91IG5lZWQuXG4gKiBSZWNvcmRlcnMgYXJlIGludm9rZWQgc3luY2hyb25vdXNseSBpbiBhdHRhY2htZW50IG9yZGVyLlxuICogSWYgYSByZWNvcmRlciB0aHJvd3MsIHRoZSBlcnJvciBpcyBjYXVnaHQgYW5kIHN3YWxsb3dlZDsgZXhlY3V0aW9uIGNvbnRpbnVlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWV0cmljc1JlY29yZGVyOiBGbG93UmVjb3JkZXIgPSB7XG4gKiAgIGlkOiAnbWV0cmljcycsXG4gKiAgIG9uTG9vcDogKGV2ZW50KSA9PiByZWNvcmRNZXRyaWMoJ2xvb3AuaXRlcmF0aW9uJywgZXZlbnQuaXRlcmF0aW9uKSxcbiAqICAgb25EZWNpc2lvbjogKGV2ZW50KSA9PiByZWNvcmRNZXRyaWMoJ2RlY2lzaW9uJywgZXZlbnQuY2hvc2VuKSxcbiAqIH07XG4gKiBleGVjdXRvci5hdHRhY2hGbG93UmVjb3JkZXIobWV0cmljc1JlY29yZGVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIG9uU3RhZ2VFeGVjdXRlZD8oZXZlbnQ6IEZsb3dTdGFnZUV2ZW50KTogdm9pZDtcbiAgb25OZXh0PyhldmVudDogRmxvd05leHRFdmVudCk6IHZvaWQ7XG4gIG9uRGVjaXNpb24/KGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQ7XG4gIG9uRm9yaz8oZXZlbnQ6IEZsb3dGb3JrRXZlbnQpOiB2b2lkO1xuICBvblNlbGVjdGVkPyhldmVudDogRmxvd1NlbGVjdGVkRXZlbnQpOiB2b2lkO1xuICBvblN1YmZsb3dFbnRyeT8oZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkO1xuICBvblN1YmZsb3dFeGl0PyhldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQ7XG4gIC8qKiBDYWxsZWQgd2hlbiBhIGR5bmFtaWMgc3ViZmxvdyBpcyByZWdpc3RlcmVkIGR1cmluZyB0cmF2ZXJzYWwuICovXG4gIG9uU3ViZmxvd1JlZ2lzdGVyZWQ/KGV2ZW50OiBGbG93U3ViZmxvd1JlZ2lzdGVyZWRFdmVudCk6IHZvaWQ7XG4gIG9uTG9vcD8oZXZlbnQ6IEZsb3dMb29wRXZlbnQpOiB2b2lkO1xuICBvbkJyZWFrPyhldmVudDogRmxvd0JyZWFrRXZlbnQpOiB2b2lkO1xuICBvbkVycm9yPyhldmVudDogRmxvd0Vycm9yRXZlbnQpOiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgRVZFUlkgYXR0ZW1wdCDigJQgYSBzdGFnZSdzIG93biwgYW5kIHRoZSBjYWxscyBhbmRcbiAgICogb2JzZXJ2ZWQgYXR0ZW1wdHMgaXQgbWFrZXMgZHVyaW5nIHRoZSBzdGFnZSAoZmlsdGVyIG9uIGByZWNvcmQua2luZGApIOKAlFxuICAgKiB3aXRoIGl0cyByZWNvcmQgYW5kIHRoZSBkZWNpc2lvbiB0aGF0IGZvbGxvd2VkICgxMC4xKS4gU2VlXG4gICAqIHtAbGluayBGbG93QXR0ZW1wdEV2ZW50fS5cbiAgICovXG4gIG9uQXR0ZW1wdD8oZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIGZhaWxlZCBhdHRlbXB0IHRoYXQgV0lMTCBiZSByZXRyaWVkLCBmb3Igc3RhZ2VzIGNhcnJ5aW5nIGFcbiAgICogZGVjbGFyZWQgYHJldHJ5YCBwb2xpY3kuIFRoZSBmaW5hbCBmYWlsdXJlIGFycml2ZXMgdmlhIGBvbkVycm9yYCBpbnN0ZWFkLFxuICAgKiBzbyBhIHN0YWdlIG5ldmVyIHJlcG9ydHMgdGhlIHNhbWUgZmFpbHVyZSB0d2ljZS4gU2VlXG4gICAqIHtAbGluayBGbG93U3RhZ2VSZXRyeUV2ZW50fSBmb3IgdGhlIGV4YWN0IGV2ZW50IGFyaXRobWV0aWMuXG4gICAqL1xuICBvblN0YWdlUmV0cnk/KGV2ZW50OiBGbG93U3RhZ2VSZXRyeUV2ZW50KTogdm9pZDtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgZm9yayBjaGlsZCdzIGVycm9yIGlzIGNsYXNzaWZpZWQgYXMgdGhyb3R0bGluZyBieSB0aGVcbiAgICogZXhlY3V0b3IncyBgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcmAg4oCUIHNlZSB7QGxpbmsgRmxvd1Rocm90dGxlZEV2ZW50fS5cbiAgICovXG4gIG9uVGhyb3R0bGVkPyhldmVudDogRmxvd1Rocm90dGxlZEV2ZW50KTogdm9pZDtcbiAgb25QYXVzZT8oZXZlbnQ6IEZsb3dQYXVzZUV2ZW50KTogdm9pZDtcbiAgb25SZXN1bWU/KGV2ZW50OiBGbG93UmVzdW1lRXZlbnQpOiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIHRvcC1sZXZlbCBgZXhlY3V0b3IucnVuKClgIEJFRk9SRSB0cmF2ZXJzYWwgYmVnaW5zLlxuICAgKiBDYXJyaWVzIGBldmVudC5wYXlsb2FkID0gcnVuKHtpbnB1dH0pYC4gU3ViZmxvdy10cmF2ZXJzZXJzIGRvbid0IGZpcmUgaXQuXG4gICAqL1xuICBvblJ1blN0YXJ0PyhldmVudDogRmxvd1J1bkV2ZW50KTogdm9pZDtcbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIHBlciB0b3AtbGV2ZWwgYGV4ZWN1dG9yLnJ1bigpYCBBRlRFUiB0cmF2ZXJzYWwgY29tcGxldGVzXG4gICAqIGNsZWFubHkuIENhcnJpZXMgYGV2ZW50LnBheWxvYWQgPSBjaGFydCdzIHJldHVybiB2YWx1ZWAuIE5PVCBmaXJlZCBvblxuICAgKiBwYXVzZSAodGhlIHJ1biBkaWRuJ3QgZW5kKSBvciB1bmNhdWdodCBlcnJvci5cbiAgICovXG4gIG9uUnVuRW5kPyhldmVudDogRmxvd1J1bkV2ZW50KTogdm9pZDtcbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIHBlciB0b3AtbGV2ZWwgYGV4ZWN1dG9yLnJ1bigpYCB3aGVuIHRoZSBydW4gdGhyb3dzIGFcbiAgICogbm9uLXBhdXNlIGVycm9yLCBCRUZPUkUgdGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGVzLiBUaGUgVEVSTUlOQUxcbiAgICogY291bnRlcnBhcnQgdG8gYG9uUnVuRW5kYCDigJQgbGV0cyBhIG1vbml0b3IgY2xvc2UgdGhlIHJ1biBib3VuZGFyeSBvblxuICAgKiBmYWlsdXJlIGluc3RlYWQgb2Ygd2FpdGluZyBmb3JldmVyLiBOT1QgZmlyZWQgb24gcGF1c2UuXG4gICAqL1xuICBvblJ1bkZhaWxlZD8oZXZlbnQ6IEZsb3dSdW5GYWlsZWRFdmVudCk6IHZvaWQ7XG4gIC8qKiBDYWxsZWQgYmVmb3JlIGVhY2ggcnVuIHRvIHJlc2V0IHBlci1ydW4gc3RhdGUuIEltcGxlbWVudCBmb3Igc3RhdGVmdWwgcmVjb3JkZXJzLiAqL1xuICBjbGVhcj8oKTogdm9pZDtcbiAgLyoqIE9wdGlvbmFsOiBleHBvc2UgY29sbGVjdGVkIGRhdGEgZm9yIGluY2x1c2lvbiBpbiBzbmFwc2hvdHMuICovXG4gIHRvU25hcHNob3Q/KCk6IGltcG9ydCgnLi4vLi4vcmVjb3JkZXIvc25hcHNob3QuanMnKS5SZWNvcmRlckJ1bmRsZTtcbn1cbiJdfQ==
@@ -22,6 +22,7 @@
22
22
  * Break semantics: If a stage calls breakFn(), commit and STOP.
23
23
  * Patch model: Stage writes into local patch; commitPatch() after return or throw.
24
24
  */
25
+ import type { RunCorrelation } from '../../attempt/types.js';
25
26
  import type { ScopeProtectionMode } from '../../scope/protection/types.js';
26
27
  import type { QueuedPause, ResumeEntry } from '../handlers/ResumeEntry.js';
27
28
  import { FlowRecorderDispatcher } from '../narrative/FlowRecorderDispatcher.js';
@@ -128,6 +129,11 @@ export interface TraverserOptions<TOut = any, TScope = any> {
128
129
  * needs it. See `runner/runId.ts`.
129
130
  */
130
131
  runId: string;
132
+ /**
133
+ * The leg's correlation (10.1, `attempt/correlation.ts · resolveCorrelation`) — stamped onto every
134
+ * TraversalContext and the snapshot, inherited by subflow traversers BY REFERENCE. Absent when the env gave none.
135
+ */
136
+ correlation?: RunCorrelation;
131
137
  }
132
138
  /**
133
139
  * Traverser-local overlay entry for a node whose stage function returned a
@@ -173,6 +179,11 @@ export declare class FlowchartTraverser<TOut = any, TScope = any> {
173
179
  private subflows;
174
180
  private readonly logger;
175
181
  private readonly signal?;
182
+ /**
183
+ * The run's deadline, epoch ms (`env.deadline`, stamped by the executor's `armRun`; a subflow inherits the env).
184
+ * Under one, EVERY stage runs on the attempt runner, so a lone stage the deadline cuts still leaves its attempt.
185
+ */
186
+ private readonly deadline?;
176
187
  private readonly parentSubflowId?;
177
188
  /** RFC-003 D1: runtimeStageId of the subflow mount stage in the parent
178
189
  * traverser. Fallback `parentRuntimeStageId` for stages whose context has
@@ -187,6 +198,8 @@ export declare class FlowchartTraverser<TOut = any, TScope = any> {
187
198
  /** Per-`executor.run()` identifier. Stamped onto every TraversalContext.
188
199
  * Inherited by subflow traversers so all events of one run share one runId. */
189
200
  private readonly runId;
201
+ /** The leg's correlation — one frozen object, stamped on every TraversalContext; inherited by subflows. */
202
+ private readonly correlation?;
190
203
  private readonly nodeResolver;
191
204
  private readonly childrenExecutor;
192
205
  private readonly subflowExecutor;
@@ -327,6 +340,7 @@ export declare class FlowchartTraverser<TOut = any, TScope = any> {
327
340
  getSnapshot(options?: {
328
341
  redact?: boolean;
329
342
  }): {
343
+ correlation?: RunCorrelation | undefined;
330
344
  runId: string;
331
345
  sharedState: Record<string, unknown>;
332
346
  executionTree: unknown;
@@ -383,29 +397,55 @@ export declare class FlowchartTraverser<TOut = any, TScope = any> {
383
397
  * this method as `runStage`), and by extension fork children and
384
398
  * subflow-internal stages, which re-enter Phase 3 in their own traverser.
385
399
  *
386
- * Which is exactly why the declarative retry loop lives HERE and nowhere
387
- * else: one implementation gives `retry` to every stage kind that has a
388
- * function to retry. (Putting it in `StageRunner` would have been wrong —
389
- * the runner owns the scope and the interrupt boundary, but not the
390
- * `StageContext` whose staged writes a failed attempt must discard.)
400
+ * Which is exactly why a declared `retry` policy is honoured HERE and
401
+ * nowhere else: one call gives `retry` to every stage kind that has a
402
+ * function to retry. The loop itself is the attempt runner's
403
+ * (`attempt/runner.ts · runAttempts`, 10.1 — one runner, one record); this
404
+ * method hands it the engine's half: one attempt (`StageRunner · run`, a
405
+ * fresh scope each time), the discard between attempts
406
+ * (`StageContext · discardStaged` — the runner cannot reach a frame), the
407
+ * served form of an attempt's error (`servedStageError`, the run's
408
+ * redaction rule), and where each record goes (the frame, for the
409
+ * execution tree; `onAttempt` and `onStageRetry`, for recorders).
391
410
  *
392
- * With no `retry` policy this is a single call, byte-identical to the
393
- * pre-9.15 path.
411
+ * NOT `async`, on purpose — the microtask shape of a stage is part of what
412
+ * the engine keeps byte-identical (parallel siblings settle in the order
413
+ * they always did):
414
+ * - no policy (or `attempts: 1`, a declared-but-off policy): one call
415
+ * through an async frame ({@link runStageOnce}), exactly the pre-10.1
416
+ * shape — and no attempt is recorded;
417
+ * - a policy: the runner's own promise, whose one await per attempt is the
418
+ * same one await the 9.15 loop had.
394
419
  */
395
420
  private executeStage;
396
421
  /**
397
- * R5 for ids a stage ADOPTS at run time (a returned StageNode's `next` chain,
398
- * `children` and subflow ids): the same refusal the builder's doors apply —
399
- * `ids/reservedIds.ts · refuseReservedId` — so "no user id carries a
400
- * grammar delimiter" stays true by construction. Loop-ref stubs (they name an
401
- * existing node) and the chart's own nodes (admitted at build; a prefixed id
402
- * carries `/` on purpose) are not new ids and are skipped. A subflow
403
- * definition's own tree is a built chart and is not walked.
404
- */
405
- private admitDynamicIds;
406
- /** `retryOn` gate. A throwing predicate counts as "do not retry" — a broken
407
- * predicate must never turn a failing stage into an endless retry loop. */
408
- private shouldRetry;
422
+ * A touching stage's side-effect target for THIS execution (P3, design §3.3). The law first — a chart edited
423
+ * after `build()` reaches the stage without the builder's refusal, so the stage asks `touchesProblem` itself (the
424
+ * last door). Then the key: the declared rule runs ONCE per execution, before attempt 1, handed the frozen input,
425
+ * the run id and this execution's id; its answer is admitted (`admitIdempotencyKey` — the format, never echoed) and
426
+ * served under the run's diagnostic rule as `{ idempotencyKey }` for the records. Throws on any refusal.
427
+ */
428
+ private effectTarget;
429
+ /** One call of a stage with no retry policy, through an async frame — the pre-10.1 microtask shape. */
430
+ private runStageOnce;
431
+ /**
432
+ * The run-time door for nodes a stage RETURNS (its `next` chain, `children`
433
+ * and subflow ids) — the builder never saw them, so this applies the
434
+ * builder's refusals:
435
+ * - R5, ids: `ids/reservedIds.ts · refuseReservedId`, so "no user id
436
+ * carries a grammar delimiter" stays true by construction. Loop-ref stubs
437
+ * (they name an existing node) and the chart's own nodes (admitted at
438
+ * build; a prefixed id carries `/` on purpose) are not new ids and are
439
+ * skipped.
440
+ * - a declared `retry`: `attempt/policy.ts · retryPolicyProblem`, the rule
441
+ * `FlowChartBuilder · applyRetryPolicy` applies at build — `attempts`
442
+ * must be a whole number >= 1, never `NaN`, `Infinity` or `0`.
443
+ * - a declared `touches`: `attempt/effect.ts · touchesProblem`, the rule
444
+ * `FlowChartBuilder · applyTouches` applies at build — a node that
445
+ * touches an outside system and may retry must declare a key rule.
446
+ * A subflow definition's own tree is a built chart and is not walked.
447
+ */
448
+ private admitDynamicNodes;
409
449
  /**
410
450
  * Trampoline driver — pre-order DFS traversal entry point.
411
451
  *