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
@@ -27,6 +27,17 @@
27
27
  * completing consumes its slot via `onError`, so the post-fan-out
28
28
  * convergence stage is never misattributed as a branch entry.
29
29
  *
30
+ * 3. attempt stops (10.1) — `onAttempt`: a stage whose retry series STOPPED
31
+ * (it gave up, or a later attempt paused or was aborted; the shared
32
+ * predicate `recorder/attemptSeries.ts · isRetryEvidence`) made a decision of its
33
+ * own — the retry-or-stop decision, in the shape `decide()` produces. It
34
+ * is recorded beside the deciders as `kind: 'attempt-stop'`
35
+ * (`getDecisions()`, `getAttemptStop(id)`), `chosen: 'stop'`, the stop
36
+ * reason as its `ruleLabel`. It is NOT a branch entry: a control edge in
37
+ * `causalChain` links a stage to ANOTHER execution that governed it, and
38
+ * the stop governs the stage itself — so `lookup` is unchanged, and a
39
+ * reader walking a failed stage reads the stop off its decision record.
40
+ *
30
41
  * `lookup(runtimeStageId)` then walks the ancestor chain from the stage
31
42
  * upward; the first ancestor (or the stage itself) registered as a
32
43
  * branch entry yields its governing decider — the NEAREST decision.
@@ -53,6 +64,7 @@ import { causalChain } from 'foottrace';
53
64
  * });
54
65
  * ```
55
66
  */
67
+ import { isRetryEvidence } from './attemptSeries.js';
56
68
  let _counter = 0;
57
69
  /**
58
70
  * Factory — matches the `topologyRecorder()` / `inOutRecorder()` style.
@@ -98,6 +110,20 @@ export class ControlDepRecorder {
98
110
  });
99
111
  this.pending.push({ deciderId, remaining: 1 });
100
112
  }
113
+ onAttempt(event) {
114
+ const ctx = event.traversalContext;
115
+ const { record } = event;
116
+ if (!ctx || record.next !== 'stop' || !isRetryEvidence(record))
117
+ return;
118
+ this.resetIfNewRun(ctx.runId);
119
+ this.decisions.set(record.series, {
120
+ kind: 'attempt-stop',
121
+ deciderRuntimeStageId: record.series,
122
+ chosen: 'stop',
123
+ evidence: record.decision,
124
+ ruleLabel: record.reason,
125
+ });
126
+ }
101
127
  onSelected(event) {
102
128
  const ctx = event.traversalContext;
103
129
  if (!ctx)
@@ -171,10 +197,32 @@ export class ControlDepRecorder {
171
197
  asLookup() {
172
198
  return (runtimeStageId) => this.lookup(runtimeStageId);
173
199
  }
174
- /** All decisions recorded for the current run, in event order. */
200
+ /** The attempt-stop decision of a stage execution whose retry series stopped, if it did. */
201
+ getAttemptStop(runtimeStageId) {
202
+ const record = this.decisions.get(runtimeStageId);
203
+ return record?.kind === 'attempt-stop' ? record : undefined;
204
+ }
205
+ /** All decisions recorded for the current run, in event order — deciders, selectors and attempt stops. */
175
206
  getDecisions() {
176
207
  return [...this.decisions.values()];
177
208
  }
209
+ /**
210
+ * Current-run control evidence for the native snapshot. Project only the
211
+ * stage identities collected during traversal; never walk the execution tree.
212
+ * Parentless roots cannot have a governing control edge.
213
+ */
214
+ toSnapshot() {
215
+ const dependencies = [];
216
+ for (const runtimeStageId of this.parentOf.keys()) {
217
+ const dependency = this.lookup(runtimeStageId);
218
+ if (dependency)
219
+ dependencies.push([runtimeStageId, dependency]);
220
+ }
221
+ return {
222
+ name: 'control-dependencies',
223
+ data: { decisions: this.getDecisions(), controlDeps: Object.fromEntries(dependencies) },
224
+ };
225
+ }
178
226
  /** Reset all state (also happens automatically on runId change). */
179
227
  clear() {
180
228
  this.parentOf.clear();
@@ -226,4 +274,4 @@ function matchedRuleLabel(evidence) {
226
274
  const rule = evidence.rules.find((r) => r.matched && r.branch === evidence.chosen) ?? evidence.rules.find((r) => r.matched);
227
275
  return rule?.label;
228
276
  }
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbERlcFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNERztBQXlDSCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsVUFBcUMsRUFBRTtJQUN4RSxPQUFPLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3BCLEVBQUUsQ0FBUztJQUVwQiwwRUFBMEU7SUFDekQsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3RELDJEQUEyRDtJQUMxQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFDdEUsc0VBQXNFO0lBQ3JELHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ25FLGlFQUFpRTtJQUN6RCxPQUFPLEdBQXNCLEVBQUUsQ0FBQztJQUN4Qyx1RUFBdUU7SUFDdEQsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbkQsZ0VBQWdFO0lBQ3hELFNBQVMsQ0FBVTtJQUUzQixZQUFZLFVBQXFDLEVBQUU7UUFDakQsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFRCx5RUFBeUU7SUFFekUsVUFBVSxDQUFDLEtBQXdCO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUNuQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU87UUFDakIsSUFBSSxDQUFDLGFB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LENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUM7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFzQztJQUM5RCxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUNSLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakgsT0FBTyxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRyb2xEZXBSZWNvcmRlciDigJQgY29udHJvbC1kZXBlbmRlbmNlIHRyYWNraW5nIGZyb20gZmxvdyBldmVudHMgKFJGQy0wMDMgRDUpLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczpcbiAqICAgVGhlIGJhY2t0cmFja2VyJ3MgYGNvbnRyb2xEZXBzYCBvcHRpb24gKEQzKSBuZWVkcyBhIGBDb250cm9sRGVwTG9va3VwYDpcbiAqICAgXCJ3aGljaCBkZWNpZGVyIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuP1wiIFRoZSBlbmdpbmUga25vd3NcbiAqICAgdGhpcyBkdXJpbmcgdHJhdmVyc2FsIGJ1dCB0aGUgY29tbWl0IGxvZyBkb2Vzbid0IHJlY29yZCBpdCDigJQgY29udHJvbFxuICogICBmbG93IGlzIGEgRmxvd1JlY29yZGVyIGNvbmNlcm4uIFRoaXMgcmVjb3JkZXIgaXMgdGhlIHN0YW5kYXJkIHByb2R1Y2VyOlxuICogICBvbmUgc3Vic2NyaXB0aW9uLCBvbmUgbG9va3VwLCBwbHVnIGl0IHN0cmFpZ2h0IGludG8gYGNhdXNhbENoYWluYC5cbiAqXG4gKiBIb3cgaXQgd29ya3Mg4oCUIHR3byBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmVzIGJ1aWx0IGR1cmluZyB0cmF2ZXJzYWw6XG4gKlxuICogICAxLiBgcGFyZW50T2ZgIOKAlCB0aGUgcnVudGltZSBhbmNlc3RvciBjaGFpbiwgZnJvbSBldmVyeSBzdGFnZSBldmVudCdzXG4gKiAgICAgIGB0cmF2ZXJzYWxDb250ZXh0LnBhcmVudFJ1bnRpbWVTdGFnZUlkYCAoUkZDLTAwMyBEMSkuIENyb3NzZXNcbiAqICAgICAgc3ViZmxvdyBib3VuZGFyaWVzOyBsb29wIHJlLWVudHJpZXMgc3RheSB1bmFtYmlndW91cyBiZWNhdXNlXG4gKiAgICAgIHJ1bnRpbWUgaWRzIGRpZmZlciBwZXIgaXRlcmF0aW9uLlxuICpcbiAqICAgMi4gYGJyYW5jaEVudHJ5VG9EZWNpc2lvbmAg4oCUIG9uIGBvbkRlY2lzaW9uYC9gb25TZWxlY3RlZGAgdGhlIGRlY2lzaW9uXG4gKiAgICAgIGlzIHJlY29yZGVkIGFzIFBFTkRJTkc7IHRoZSBuZXh0IHN0YWdlKHMpIGV4ZWN1dGVkIHdob3NlXG4gKiAgICAgIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgSVMgdGhlIGRlY2lkZXIncyBydW50aW1lU3RhZ2VJZCBhcmUgaXRzXG4gKiAgICAgIGJyYW5jaCBlbnRyaWVzICgxIGZvciBhIGRlY2lkZXIsIE4gPSBzZWxlY3RlZC5sZW5ndGggZm9yIGFcbiAqICAgICAgc2VsZWN0b3IpLiBDb3JyZWxhdGlvbiBpcyBieSBwYXJlbnQtaWQgKyBjb3VudCwgTk9UIGJ5IHN0YWdlIG5hbWUg4oCUXG4gKiAgICAgIHN1YmZsb3ctbW91bnQgZXZlbnRzIGNhcnJ5IHBhdGgtcHJlZml4ZWQgaW5uZXItcm9vdCBuYW1lcyB0aGF0XG4gKiAgICAgIGRvbid0IG1hdGNoIGBGbG93RGVjaXNpb25FdmVudC5jaG9zZW5gLCBhbmQgc2VsZWN0b3JzIGVtaXQgYVxuICogICAgICBzeW50aGV0aWMgZm9yayBldmVudCBzaGFyaW5nIHRoZSBzZWxlY3RvcidzIG93biBydW50aW1lU3RhZ2VJZFxuICogICAgICAoZXhjbHVkZWQgdmlhIHRoZSBzZWxmLWlkIGd1YXJkKS4gQSBicmFuY2ggdGhhdCBUSFJPV1MgYmVmb3JlXG4gKiAgICAgIGNvbXBsZXRpbmcgY29uc3VtZXMgaXRzIHNsb3QgdmlhIGBvbkVycm9yYCwgc28gdGhlIHBvc3QtZmFuLW91dFxuICogICAgICBjb252ZXJnZW5jZSBzdGFnZSBpcyBuZXZlciBtaXNhdHRyaWJ1dGVkIGFzIGEgYnJhbmNoIGVudHJ5LlxuICpcbiAqICAgYGxvb2t1cChydW50aW1lU3RhZ2VJZClgIHRoZW4gd2Fsa3MgdGhlIGFuY2VzdG9yIGNoYWluIGZyb20gdGhlIHN0YWdlXG4gKiAgIHVwd2FyZDsgdGhlIGZpcnN0IGFuY2VzdG9yIChvciB0aGUgc3RhZ2UgaXRzZWxmKSByZWdpc3RlcmVkIGFzIGFcbiAqICAgYnJhbmNoIGVudHJ5IHlpZWxkcyBpdHMgZ292ZXJuaW5nIGRlY2lkZXIg4oCUIHRoZSBORUFSRVNUIGRlY2lzaW9uLlxuICogICBOZXN0ZWQgZGVjaXNpb25zIGNvbXBvc2UgbmF0dXJhbGx5OiB0aGUgYmFja3RyYWNrZXIgZXhwYW5kcyB0aGVcbiAqICAgZGVjaWRlciBub2RlIGFuZCBhc2tzIGFnYWluLlxuICpcbiAqIENvbnZlbnRpb24gNDogc3RhdGUgcmVzZXRzIHdoZW4gYHRyYXZlcnNhbENvbnRleHQucnVuSWRgIGNoYW5nZXMg4oCUIGVhY2hcbiAqIHJ1biAoYW5kIGVhY2ggcmVzdW1lLCB3aGljaCBtaW50cyBhIGZyZXNoIHJ1bklkKSBzdGFydHMgY2xlYW4uIENvbnRyb2xcbiAqIGNoYWlucyB0aGVyZWZvcmUgZG8gTk9UIHN1cnZpdmUgYSBwYXVzZS9yZXN1bWUgYm91bmRhcnk6IHBvc3QtcmVzdW1lXG4gKiBzdGFnZXMgY2Fubm90IHJlc29sdmUgcHJlLXBhdXNlIGRlY2lzaW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgY29udHJvbERlcFJlY29yZGVyIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuaW1wb3J0IHsgY2F1c2FsQ2hhaW4gfSBmcm9tICdmb290dHJhY2UnO1xuICpcbiAqIGNvbnN0IGN0cmwgPSBjb250cm9sRGVwUmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoY3RybCk7IC8vIGF1dG8tcm91dGVzIHRvIEZsb3dSZWNvcmRlciBjaGFubmVsXG4gKlxuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKlxuICogY29uc3QgZGFnID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCAnYXBwcm92ZSMyJywga2V5c1JlYWQsIHtcbiAqICAgY29udHJvbERlcHM6IGN0cmwuYXNMb29rdXAoKSxcbiAqIH0pO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb250cm9sRGVwZW5kZW5jeSwgQ29udHJvbERlcExvb2t1cCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgRGVjaXNpb25FdmlkZW5jZSwgU2VsZWN0aW9uRXZpZGVuY2UgfSBmcm9tICcuLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1NlbGVjdGVkRXZlbnQsXG4gIEZsb3dTdGFnZUV2ZW50LFxufSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcblxuLyoqIE9uZSByZWNvcmRlZCBkZWNpc2lvbi9zZWxlY3Rpb24gZXZlbnQgKFJGQy0wMDMgRDUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVjaXNpb25SZWNvcmQge1xuICAvKiogcnVudGltZVN0YWdlSWQgb2YgdGhlIGRlY2lkZXIvc2VsZWN0b3IgZXhlY3V0aW9uIHN0ZXAuICovXG4gIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogQ2hvc2VuIGJyYW5jaCBkaXNwbGF5IG5hbWUgKGRlY2lkZXIpIG9yIHNlbGVjdGVkIG5hbWVzIChzZWxlY3RvcikuICovXG4gIGNob3Nlbjogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBTdHJ1Y3R1cmVkIGV2aWRlbmNlIGZyb20gZGVjaWRlKCkvc2VsZWN0KCksIHdoZW4gdGhlIHN0YWdlIHVzZWQgdGhlbS4gKi9cbiAgZXZpZGVuY2U/OiBEZWNpc2lvbkV2aWRlbmNlIHwgU2VsZWN0aW9uRXZpZGVuY2U7XG4gIC8qKlxuICAgKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB0aGF0IHByb2R1Y2VkIHRoZSBkZWNpc2lvbiAoZS5nLiAnR29vZCBjcmVkaXQnKS5cbiAgICogRGVjaWRlcnMgb25seSDigJQgYSBzZWxlY3RvciBwaWNrcyBOIGJyYW5jaGVzIGFuZCBubyBzaW5nbGUgbGFiZWxcbiAgICogYXR0cmlidXRlcyB0byBhbGwgb2YgdGhlbSAoaW5zcGVjdCBgZXZpZGVuY2VgIGluc3RlYWQpLlxuICAgKi9cbiAgcnVsZUxhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMge1xuICAvKiogUmVjb3JkZXIgaWQuIERlZmF1bHRzIHRvIGBjb250cm9sLWRlcHMtTmAgKGF1dG8taW5jcmVtZW50ZWQpLiAqL1xuICBpZD86IHN0cmluZztcbn1cblxuLyoqIEEgZGVjaXNpb24gYXdhaXRpbmcgYnJhbmNoLWVudHJ5IGNvcnJlbGF0aW9uLiAqL1xuaW50ZXJmYWNlIFBlbmRpbmdEZWNpc2lvbiB7XG4gIGRlY2lkZXJJZDogc3RyaW5nO1xuICAvKiogSG93IG1hbnkgYnJhbmNoIGVudHJpZXMgYXJlIHN0aWxsIGV4cGVjdGVkIChkZWNpZGVyOiAxLCBzZWxlY3RvcjogTikuICovXG4gIHJlbWFpbmluZzogbnVtYmVyO1xufVxuXG5sZXQgX2NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEZhY3Rvcnkg4oCUIG1hdGNoZXMgdGhlIGB0b3BvbG9neVJlY29yZGVyKClgIC8gYGluT3V0UmVjb3JkZXIoKWAgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sRGVwUmVjb3JkZXIob3B0aW9uczogQ29udHJvbERlcFJlY29yZGVyT3B0aW9ucyA9IHt9KTogQ29udHJvbERlcFJlY29yZGVyIHtcbiAgcmV0dXJuIG5ldyBDb250cm9sRGVwUmVjb3JkZXIob3B0aW9ucyk7XG59XG5cbi8qKlxuICogU3RhdGVmdWwgYWNjdW11bGF0b3IgdGhhdCB3YXRjaGVzIEZsb3dSZWNvcmRlciBldmVudHMgYW5kIGFuc3dlcnNcbiAqIFwid2hpY2ggZGVjaXNpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bj9cIiBBdHRhY2ggdmlhXG4gKiBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcilgIChvciBgYXR0YWNoRmxvd1JlY29yZGVyYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9sRGVwUmVjb3JkZXIgaW1wbGVtZW50cyBGbG93UmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKiBSdW50aW1lIGFuY2VzdG9yIGNoYWluOiBydW50aW1lU3RhZ2VJZCDihpIgcGFyZW50UnVudGltZVN0YWdlSWQgKEQxKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRPZiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBSZWNvcmRlZCBkZWNpc2lvbnMsIGtleWVkIGJ5IGRlY2lkZXIgcnVudGltZVN0YWdlSWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaXNpb25zID0gbmV3IE1hcDxzdHJpbmcsIENvbnRyb2xEZWNpc2lvblJlY29yZD4oKTtcbiAgLyoqIEJyYW5jaC1lbnRyeSBydW50aW1lU3RhZ2VJZCDihpIgZ292ZXJuaW5nIGRlY2lkZXIgcnVudGltZVN0YWdlSWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoRW50cnlUb0RlY2lzaW9uID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIERlY2lzaW9ucyB3aG9zZSBicmFuY2ggZW50cmllcyBoYXZlIG5vdCBhbGwgYmVlbiBzZWVuIHlldC4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nOiBQZW5kaW5nRGVjaXNpb25bXSA9IFtdO1xuICAvKiogU3RhZ2UgaWRzIHRoYXQgYWxyZWFkeSBjb25zdW1lZCBhIHBlbmRpbmcgc2xvdCAoZW50cnkgT1IgZXJyb3IpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnN1bWVkU2xvdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqIENvbnZlbnRpb24gNCDigJQgcnVuSWQgb2YgdGhlIHJ1biBjdXJyZW50bHkgYmVpbmcgcmVjb3JkZWQuICovXG4gIHByaXZhdGUgbGFzdFJ1bklkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGBjb250cm9sLWRlcHMtJHsrK19jb3VudGVyfWA7XG4gIH1cblxuICAvLyDilIDilIAgRmxvd1JlY29yZGVyIGhvb2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uRGVjaXNpb24oZXZlbnQ6IEZsb3dEZWNpc2lvbkV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHJ1bGVMYWJlbCA9IG1hdGNoZWRSdWxlTGFiZWwoZXZlbnQuZXZpZGVuY2UpO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBldmVudC5jaG9zZW4sXG4gICAgICAuLi4oZXZlbnQuZXZpZGVuY2UgJiYgeyBldmlkZW5jZTogZXZlbnQuZXZpZGVuY2UgfSksXG4gICAgICAuLi4ocnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBydWxlTGFiZWwgfSksXG4gICAgfSk7XG4gICAgdGhpcy5wZW5kaW5nLnB1c2goeyBkZWNpZGVySWQsIHJlbWFpbmluZzogMSB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWQoZXZlbnQ6IEZsb3dTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIGlmIChldmVudC5zZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90aGluZyBzZWxlY3RlZCDihpIgbm90aGluZyBnb3Zlcm5lZFxuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBbLi4uZXZlbnQuc2VsZWN0ZWRdLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IGV2ZW50LnNlbGVjdGVkLmxlbmd0aCB9KTtcbiAgfVxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgdGhpcy5yZXNldElmTmV3UnVuKGN0eC5ydW5JZCk7XG5cbiAgICBjb25zdCB7IHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCB9ID0gY3R4O1xuICAgIGlmIChwYXJlbnRSdW50aW1lU3RhZ2VJZCkge1xuICAgICAgdGhpcy5wYXJlbnRPZi5zZXQocnVudGltZVN0YWdlSWQsIHBhcmVudFJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIHRoaXMuY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgYnJhbmNoIHRoYXQgdGhyb3dzIG5ldmVyIGZpcmVzIGBvblN0YWdlRXhlY3V0ZWRgIOKAlCB3aXRob3V0IHRoaXMgaG9va1xuICAgKiBpdHMgcGVuZGluZyBzbG90IHdvdWxkIGxlYWsgYW5kIHRoZSBwb3N0LWZhbi1vdXQgY29udmVyZ2VuY2Ugc3RhZ2VcbiAgICogKHdob3NlIGNvbnRleHQgYWxzbyBjaGFpbnMgdG8gdGhlIHNlbGVjdG9yKSB3b3VsZCBiZSBtaXNhdHRyaWJ1dGVkIGFzXG4gICAqIGEgYnJhbmNoIGVudHJ5IHVuZGVyIGJlc3QtZWZmb3J0IChgZmFpbEZhc3Q6IGZhbHNlYCkgZmFuLW91dHMuXG4gICAqL1xuICBvbkVycm9yKGV2ZW50OiBGbG93RXJyb3JFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcbiAgICBpZiAoY3R4LnBhcmVudFJ1bnRpbWVTdGFnZUlkKSB7XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYWluIEFORCBhdHRyaWJ1dGUgdGhlIGZhaWxlZCBzdGFnZSB0byBpdHMgZGVjaXNpb24g4oCUXG4gICAgICAvLyB0aGUgc3RhZ2UgUkFOIChhbmQgbWF5IGhhdmUgY29tbWl0dGVkIHBhcnRpYWwgd3JpdGVzKSBiZWNhdXNlIHRoZVxuICAgICAgLy8gZGVjaXNpb24gY2hvc2UgaXQ7IGZhaWxpbmcgYWZ0ZXJ3YXJkcyBkb2Vzbid0IHVuZG8gdGhlIGRlcGVuZGVuY3kuXG4gICAgICB0aGlzLnBhcmVudE9mLnNldChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCk7XG4gICAgICB0aGlzLmNvbnN1bWVQZW5kaW5nU2xvdChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIE5FQVJFU1QgZ292ZXJuaW5nIGRlY2lzaW9uIGZvciBhbiBleGVjdXRpb24gc3RlcDogd2Fsa3MgdGhlXG4gICAqIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4gKHRoZSBzdGVwIGl0c2VsZiBmaXJzdCkgdW50aWwgaXQgaGl0cyBhXG4gICAqIHJlZ2lzdGVyZWQgYnJhbmNoIGVudHJ5LiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzdGVwIGlzIG5vdCBkb3duc3RyZWFtIG9mXG4gICAqIGFueSByZWNvcmRlZCBkZWNpc2lvbi5cbiAgICovXG4gIGxvb2t1cChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBydW50aW1lU3RhZ2VJZDtcbiAgICB3aGlsZSAoY3VyICE9PSB1bmRlZmluZWQgJiYgIXNlZW4uaGFzKGN1cikpIHtcbiAgICAgIHNlZW4uYWRkKGN1cik7XG4gICAgICBjb25zdCBkZWNpZGVySWQgPSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5nZXQoY3VyKTtcbiAgICAgIGlmIChkZWNpZGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmRlY2lzaW9ucy5nZXQoZGVjaWRlcklkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZWNpZGVySWQsXG4gICAgICAgICAgLi4uKHJlY29yZD8ucnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbDogcmVjb3JkLnJ1bGVMYWJlbCB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1ciA9IHRoaXMucGFyZW50T2YuZ2V0KGN1cik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIGxvb2t1cCBhcyBhIGJhcmUgZnVuY3Rpb24g4oCUIHBsdWcgaW50byBgY2F1c2FsQ2hhaW4oLi4uLCB7IGNvbnRyb2xEZXBzIH0pYC4gKi9cbiAgYXNMb29rdXAoKTogQ29udHJvbERlcExvb2t1cCB7XG4gICAgcmV0dXJuIChydW50aW1lU3RhZ2VJZCkgPT4gdGhpcy5sb29rdXAocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBkZWNpc2lvbnMgcmVjb3JkZWQgZm9yIHRoZSBjdXJyZW50IHJ1biwgaW4gZXZlbnQgb3JkZXIuICovXG4gIGdldERlY2lzaW9ucygpOiBDb250cm9sRGVjaXNpb25SZWNvcmRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmRlY2lzaW9ucy52YWx1ZXMoKV07XG4gIH1cblxuICAvKiogUmVzZXQgYWxsIHN0YXRlIChhbHNvIGhhcHBlbnMgYXV0b21hdGljYWxseSBvbiBydW5JZCBjaGFuZ2UpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudE9mLmNsZWFyKCk7XG4gICAgdGhpcy5kZWNpc2lvbnMuY2xlYXIoKTtcbiAgICB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5jbGVhcigpO1xuICAgIHRoaXMucGVuZGluZyA9IFtdO1xuICAgIHRoaXMuY29uc3VtZWRTbG90cy5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ29udmVudGlvbiA0OiBhIG5ldyBydW5JZCBtZWFucyBhIG5ldyBydW4g4oCUIHJlc2V0IHRyYW5zaWVudCBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSByZXNldElmTmV3UnVuKHJ1bklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocnVuSWQgPT09IHRoaXMubGFzdFJ1bklkKSByZXR1cm47XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHRoaXMubGFzdFJ1bklkID0gcnVuSWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBpcyBhIGRlY2lkZXIgd2l0aCBhbiB1bm1hdGNoZWQgcGVuZGluZyBzbG90LFxuICAgKiBjb25zdW1lIG9uZS4gYHJlZ2lzdGVyYCBjb250cm9scyB3aGV0aGVyIHRoZSBzdGFnZSBpcyByZWNvcmRlZCBhcyBhXG4gICAqIGJyYW5jaCBlbnRyeSAoc3RhZ2UgZXhlY3V0ZWQvZXJyb3JlZCkg4oCUIGJvdGggcGF0aHMgY29uc3VtZSB0aGUgc2xvdCBzb1xuICAgKiBjb3VudHMgc3RheSBleGFjdCBldmVuIHdoZW4gYSBzdGFnZSBwcm9kdWNlcyBib3RoIGV2ZW50cy5cbiAgICovXG4gIHByaXZhdGUgY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIHBhcmVudFJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIHJlZ2lzdGVyOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRSdW50aW1lU3RhZ2VJZCkgcmV0dXJuOyAvLyBzeW50aGV0aWMgc2VsZi1ldmVudHNcbiAgICBpZiAodGhpcy5jb25zdW1lZFNsb3RzLmhhcyhydW50aW1lU3RhZ2VJZCkpIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wZW5kaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwID0gdGhpcy5wZW5kaW5nW2ldO1xuICAgICAgaWYgKHAuZGVjaWRlcklkICE9PSBwYXJlbnRSdW50aW1lU3RhZ2VJZCkgY29udGludWU7XG5cbiAgICAgIHRoaXMuY29uc3VtZWRTbG90cy5hZGQocnVudGltZVN0YWdlSWQpO1xuICAgICAgaWYgKHJlZ2lzdGVyKSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5zZXQocnVudGltZVN0YWdlSWQsIHAuZGVjaWRlcklkKTtcbiAgICAgIHAucmVtYWluaW5nLS07XG4gICAgICBpZiAocC5yZW1haW5pbmcgPD0gMCkgdGhpcy5wZW5kaW5nLnNwbGljZShpLCAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB0aGF0IHByb2R1Y2VkIHRoZSBkZWNpc2lvbjogdGhlIG1hdGNoZWQgcnVsZVxuICogbWFwcGluZyB0byB0aGUgY2hvc2VuIGJyYW5jaCAoZmlyc3QgbWF0Y2hlZCBydWxlIGFzIGZhbGxiYWNrKS5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlZFJ1bGVMYWJlbChldmlkZW5jZTogRGVjaXNpb25FdmlkZW5jZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXZpZGVuY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJ1bGUgPVxuICAgIGV2aWRlbmNlLnJ1bGVzLmZpbmQoKHIpID0+IHIubWF0Y2hlZCAmJiByLmJyYW5jaCA9PT0gZXZpZGVuY2UuY2hvc2VuKSA/PyBldmlkZW5jZS5ydWxlcy5maW5kKChyKSA9PiByLm1hdGNoZWQpO1xuICByZXR1cm4gcnVsZT8ubGFiZWw7XG59XG4iXX0=
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbERlcFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUVHO0FBYUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBb0NyRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsVUFBcUMsRUFBRTtJQUN4RSxPQUFPLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3BCLEVBQUUsQ0FBUztJQUVwQiwwRUFBMEU7SUFDekQsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3RELDJEQUEyRDtJQUMxQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFDdEUsc0VBQXNFO0lBQ3JELHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ25FLGlFQUFpRTtJQUN6RCxPQUFPLEdBQXNCLEVBQUUsQ0FBQztJQUN4Qyx1RUFBdUU7SUFDdEQsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbkQsZ0VBQWdFO0lBQ3hELFNBQVMsQ0FBVTtJQUUzQixZQUFZLFVBQXFDLEVBQUU7UUFDakQsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFRCx5RUFBeUU7SUFFekUsVUFBVSxDQUFDLEtBQXdCO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0Is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Q0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxvQkFBb0I7Z0JBQUUsU0FBUztZQUVuRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN2QyxJQUFJLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDO2dCQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsUUFBc0M7SUFDOUQsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FDUixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pILE9BQU8sSUFBSSxFQUFFLEtBQUssQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250cm9sRGVwUmVjb3JkZXIg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSB0cmFja2luZyBmcm9tIGZsb3cgZXZlbnRzIChSRkMtMDAzIEQ1KS5cbiAqXG4gKiBUaGUgZ2FwIHRoaXMgZmlsbHM6XG4gKiAgIFRoZSBiYWNrdHJhY2tlcidzIGBjb250cm9sRGVwc2Agb3B0aW9uIChEMykgbmVlZHMgYSBgQ29udHJvbERlcExvb2t1cGA6XG4gKiAgIFwid2hpY2ggZGVjaWRlciBleGVjdXRpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bj9cIiBUaGUgZW5naW5lIGtub3dzXG4gKiAgIHRoaXMgZHVyaW5nIHRyYXZlcnNhbCBidXQgdGhlIGNvbW1pdCBsb2cgZG9lc24ndCByZWNvcmQgaXQg4oCUIGNvbnRyb2xcbiAqICAgZmxvdyBpcyBhIEZsb3dSZWNvcmRlciBjb25jZXJuLiBUaGlzIHJlY29yZGVyIGlzIHRoZSBzdGFuZGFyZCBwcm9kdWNlcjpcbiAqICAgb25lIHN1YnNjcmlwdGlvbiwgb25lIGxvb2t1cCwgcGx1ZyBpdCBzdHJhaWdodCBpbnRvIGBjYXVzYWxDaGFpbmAuXG4gKlxuICogSG93IGl0IHdvcmtzIOKAlCB0d28gY29ycmVsYXRpb24gc3RydWN0dXJlcyBidWlsdCBkdXJpbmcgdHJhdmVyc2FsOlxuICpcbiAqICAgMS4gYHBhcmVudE9mYCDigJQgdGhlIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4sIGZyb20gZXZlcnkgc3RhZ2UgZXZlbnQnc1xuICogICAgICBgdHJhdmVyc2FsQ29udGV4dC5wYXJlbnRSdW50aW1lU3RhZ2VJZGAgKFJGQy0wMDMgRDEpLiBDcm9zc2VzXG4gKiAgICAgIHN1YmZsb3cgYm91bmRhcmllczsgbG9vcCByZS1lbnRyaWVzIHN0YXkgdW5hbWJpZ3VvdXMgYmVjYXVzZVxuICogICAgICBydW50aW1lIGlkcyBkaWZmZXIgcGVyIGl0ZXJhdGlvbi5cbiAqXG4gKiAgIDIuIGBicmFuY2hFbnRyeVRvRGVjaXNpb25gIOKAlCBvbiBgb25EZWNpc2lvbmAvYG9uU2VsZWN0ZWRgIHRoZSBkZWNpc2lvblxuICogICAgICBpcyByZWNvcmRlZCBhcyBQRU5ESU5HOyB0aGUgbmV4dCBzdGFnZShzKSBleGVjdXRlZCB3aG9zZVxuICogICAgICBgcGFyZW50UnVudGltZVN0YWdlSWRgIElTIHRoZSBkZWNpZGVyJ3MgcnVudGltZVN0YWdlSWQgYXJlIGl0c1xuICogICAgICBicmFuY2ggZW50cmllcyAoMSBmb3IgYSBkZWNpZGVyLCBOID0gc2VsZWN0ZWQubGVuZ3RoIGZvciBhXG4gKiAgICAgIHNlbGVjdG9yKS4gQ29ycmVsYXRpb24gaXMgYnkgcGFyZW50LWlkICsgY291bnQsIE5PVCBieSBzdGFnZSBuYW1lIOKAlFxuICogICAgICBzdWJmbG93LW1vdW50IGV2ZW50cyBjYXJyeSBwYXRoLXByZWZpeGVkIGlubmVyLXJvb3QgbmFtZXMgdGhhdFxuICogICAgICBkb24ndCBtYXRjaCBgRmxvd0RlY2lzaW9uRXZlbnQuY2hvc2VuYCwgYW5kIHNlbGVjdG9ycyBlbWl0IGFcbiAqICAgICAgc3ludGhldGljIGZvcmsgZXZlbnQgc2hhcmluZyB0aGUgc2VsZWN0b3IncyBvd24gcnVudGltZVN0YWdlSWRcbiAqICAgICAgKGV4Y2x1ZGVkIHZpYSB0aGUgc2VsZi1pZCBndWFyZCkuIEEgYnJhbmNoIHRoYXQgVEhST1dTIGJlZm9yZVxuICogICAgICBjb21wbGV0aW5nIGNvbnN1bWVzIGl0cyBzbG90IHZpYSBgb25FcnJvcmAsIHNvIHRoZSBwb3N0LWZhbi1vdXRcbiAqICAgICAgY29udmVyZ2VuY2Ugc3RhZ2UgaXMgbmV2ZXIgbWlzYXR0cmlidXRlZCBhcyBhIGJyYW5jaCBlbnRyeS5cbiAqXG4gKiAgIDMuIGF0dGVtcHQgc3RvcHMgKDEwLjEpIOKAlCBgb25BdHRlbXB0YDogYSBzdGFnZSB3aG9zZSByZXRyeSBzZXJpZXMgU1RPUFBFRFxuICogICAgICAoaXQgZ2F2ZSB1cCwgb3IgYSBsYXRlciBhdHRlbXB0IHBhdXNlZCBvciB3YXMgYWJvcnRlZDsgdGhlIHNoYXJlZFxuICogICAgICBwcmVkaWNhdGUgYHJlY29yZGVyL2F0dGVtcHRTZXJpZXMudHMgwrcgaXNSZXRyeUV2aWRlbmNlYCkgbWFkZSBhIGRlY2lzaW9uIG9mIGl0c1xuICogICAgICBvd24g4oCUIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uLCBpbiB0aGUgc2hhcGUgYGRlY2lkZSgpYCBwcm9kdWNlcy4gSXRcbiAqICAgICAgaXMgcmVjb3JkZWQgYmVzaWRlIHRoZSBkZWNpZGVycyBhcyBga2luZDogJ2F0dGVtcHQtc3RvcCdgXG4gKiAgICAgIChgZ2V0RGVjaXNpb25zKClgLCBgZ2V0QXR0ZW1wdFN0b3AoaWQpYCksIGBjaG9zZW46ICdzdG9wJ2AsIHRoZSBzdG9wXG4gKiAgICAgIHJlYXNvbiBhcyBpdHMgYHJ1bGVMYWJlbGAuIEl0IGlzIE5PVCBhIGJyYW5jaCBlbnRyeTogYSBjb250cm9sIGVkZ2UgaW5cbiAqICAgICAgYGNhdXNhbENoYWluYCBsaW5rcyBhIHN0YWdlIHRvIEFOT1RIRVIgZXhlY3V0aW9uIHRoYXQgZ292ZXJuZWQgaXQsIGFuZFxuICogICAgICB0aGUgc3RvcCBnb3Zlcm5zIHRoZSBzdGFnZSBpdHNlbGYg4oCUIHNvIGBsb29rdXBgIGlzIHVuY2hhbmdlZCwgYW5kIGFcbiAqICAgICAgcmVhZGVyIHdhbGtpbmcgYSBmYWlsZWQgc3RhZ2UgcmVhZHMgdGhlIHN0b3Agb2ZmIGl0cyBkZWNpc2lvbiByZWNvcmQuXG4gKlxuICogICBgbG9va3VwKHJ1bnRpbWVTdGFnZUlkKWAgdGhlbiB3YWxrcyB0aGUgYW5jZXN0b3IgY2hhaW4gZnJvbSB0aGUgc3RhZ2VcbiAqICAgdXB3YXJkOyB0aGUgZmlyc3QgYW5jZXN0b3IgKG9yIHRoZSBzdGFnZSBpdHNlbGYpIHJlZ2lzdGVyZWQgYXMgYVxuICogICBicmFuY2ggZW50cnkgeWllbGRzIGl0cyBnb3Zlcm5pbmcgZGVjaWRlciDigJQgdGhlIE5FQVJFU1QgZGVjaXNpb24uXG4gKiAgIE5lc3RlZCBkZWNpc2lvbnMgY29tcG9zZSBuYXR1cmFsbHk6IHRoZSBiYWNrdHJhY2tlciBleHBhbmRzIHRoZVxuICogICBkZWNpZGVyIG5vZGUgYW5kIGFza3MgYWdhaW4uXG4gKlxuICogQ29udmVudGlvbiA0OiBzdGF0ZSByZXNldHMgd2hlbiBgdHJhdmVyc2FsQ29udGV4dC5ydW5JZGAgY2hhbmdlcyDigJQgZWFjaFxuICogcnVuIChhbmQgZWFjaCByZXN1bWUsIHdoaWNoIG1pbnRzIGEgZnJlc2ggcnVuSWQpIHN0YXJ0cyBjbGVhbi4gQ29udHJvbFxuICogY2hhaW5zIHRoZXJlZm9yZSBkbyBOT1Qgc3Vydml2ZSBhIHBhdXNlL3Jlc3VtZSBib3VuZGFyeTogcG9zdC1yZXN1bWVcbiAqIHN0YWdlcyBjYW5ub3QgcmVzb2x2ZSBwcmUtcGF1c2UgZGVjaXNpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjb250cm9sRGVwUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG5pbXBvcnQgeyBjYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG4gKlxuICogY29uc3QgY3RybCA9IGNvbnRyb2xEZXBSZWNvcmRlcigpO1xuICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihjdHJsKTsgLy8gYXV0by1yb3V0ZXMgdG8gRmxvd1JlY29yZGVyIGNoYW5uZWxcbiAqXG4gKiBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAqXG4gKiBjb25zdCBkYWcgPSBjYXVzYWxDaGFpbihjb21taXRMb2csICdhcHByb3ZlIzInLCBrZXlzUmVhZCwge1xuICogICBjb250cm9sRGVwczogY3RybC5hc0xvb2t1cCgpLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbnRyb2xEZXBlbmRlbmN5LCBDb250cm9sRGVwTG9va3VwIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlLCBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG59IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeUV2aWRlbmNlIH0gZnJvbSAnLi9hdHRlbXB0U2VyaWVzLmpzJztcblxuLyoqIE9uZSByZWNvcmRlZCBkZWNpc2lvbi9zZWxlY3Rpb24gZXZlbnQgKFJGQy0wMDMgRDUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVjaXNpb25SZWNvcmQge1xuICAvKipcbiAgICogYCdhdHRlbXB0LXN0b3AnYCBmb3IgYSBzdGFnZSdzIG93biByZXRyeS1vci1zdG9wIGRlY2lzaW9uIHRoYXQgU1RPUFBFRCBpdHMgc2VyaWVzICgxMC4xKSDigJQgdGhlblxuICAgKiBgZGVjaWRlclJ1bnRpbWVTdGFnZUlkYCBpcyB0aGUgc3RhZ2UncyBleGVjdXRpb24sIGBjaG9zZW5gIGlzIGAnc3RvcCdgLCBgZXZpZGVuY2VgIHRoZSBhdHRlbXB0J3MgZGVjaXNpb24gYW5kXG4gICAqIGBydWxlTGFiZWxgIHRoZSBzdG9wIHJlYXNvbi4gQWJzZW50IGZvciBhIGRlY2lkZXIgLyBzZWxlY3Rvci5cbiAgICovXG4gIGtpbmQ/OiAnYXR0ZW1wdC1zdG9wJztcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBzdGVwLiAqL1xuICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIENob3NlbiBicmFuY2ggZGlzcGxheSBuYW1lIChkZWNpZGVyKSBvciBzZWxlY3RlZCBuYW1lcyAoc2VsZWN0b3IpLiAqL1xuICBjaG9zZW46IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU3RydWN0dXJlZCBldmlkZW5jZSBmcm9tIGRlY2lkZSgpL3NlbGVjdCgpLCB3aGVuIHRoZSBzdGFnZSB1c2VkIHRoZW0uICovXG4gIGV2aWRlbmNlPzogRGVjaXNpb25FdmlkZW5jZSB8IFNlbGVjdGlvbkV2aWRlbmNlO1xuICAvKipcbiAgICogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgdGhhdCBwcm9kdWNlZCB0aGUgZGVjaXNpb24gKGUuZy4gJ0dvb2QgY3JlZGl0JykuXG4gICAqIERlY2lkZXJzIG9ubHkg4oCUIGEgc2VsZWN0b3IgcGlja3MgTiBicmFuY2hlcyBhbmQgbm8gc2luZ2xlIGxhYmVsXG4gICAqIGF0dHJpYnV0ZXMgdG8gYWxsIG9mIHRoZW0gKGluc3BlY3QgYGV2aWRlbmNlYCBpbnN0ZWFkKS5cbiAgICovXG4gIHJ1bGVMYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFJlY29yZGVyIGlkLiBEZWZhdWx0cyB0byBgY29udHJvbC1kZXBzLU5gIChhdXRvLWluY3JlbWVudGVkKS4gKi9cbiAgaWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBBIGRlY2lzaW9uIGF3YWl0aW5nIGJyYW5jaC1lbnRyeSBjb3JyZWxhdGlvbi4gKi9cbmludGVyZmFjZSBQZW5kaW5nRGVjaXNpb24ge1xuICBkZWNpZGVySWQ6IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IGJyYW5jaCBlbnRyaWVzIGFyZSBzdGlsbCBleHBlY3RlZCAoZGVjaWRlcjogMSwgc2VsZWN0b3I6IE4pLiAqL1xuICByZW1haW5pbmc6IG51bWJlcjtcbn1cblxubGV0IF9jb3VudGVyID0gMDtcblxuLyoqXG4gKiBGYWN0b3J5IOKAlCBtYXRjaGVzIHRoZSBgdG9wb2xvZ3lSZWNvcmRlcigpYCAvIGBpbk91dFJlY29yZGVyKClgIHN0eWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbERlcFJlY29yZGVyKG9wdGlvbnM6IENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMgPSB7fSk6IENvbnRyb2xEZXBSZWNvcmRlciB7XG4gIHJldHVybiBuZXcgQ29udHJvbERlcFJlY29yZGVyKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFN0YXRlZnVsIGFjY3VtdWxhdG9yIHRoYXQgd2F0Y2hlcyBGbG93UmVjb3JkZXIgZXZlbnRzIGFuZCBhbnN3ZXJzXG4gKiBcIndoaWNoIGRlY2lzaW9uIGFsbG93ZWQgdGhpcyBzdGFnZSB0byBydW4/XCIgQXR0YWNoIHZpYVxuICogYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXIpYCAob3IgYGF0dGFjaEZsb3dSZWNvcmRlcmApLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbERlcFJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogUnVudGltZSBhbmNlc3RvciBjaGFpbjogcnVudGltZVN0YWdlSWQg4oaSIHBhcmVudFJ1bnRpbWVTdGFnZUlkIChEMSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50T2YgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogUmVjb3JkZWQgZGVjaXNpb25zLCBrZXllZCBieSBkZWNpZGVyIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY2lzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBDb250cm9sRGVjaXNpb25SZWNvcmQ+KCk7XG4gIC8qKiBCcmFuY2gtZW50cnkgcnVudGltZVN0YWdlSWQg4oaSIGdvdmVybmluZyBkZWNpZGVyIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaEVudHJ5VG9EZWNpc2lvbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBEZWNpc2lvbnMgd2hvc2UgYnJhbmNoIGVudHJpZXMgaGF2ZSBub3QgYWxsIGJlZW4gc2VlbiB5ZXQuICovXG4gIHByaXZhdGUgcGVuZGluZzogUGVuZGluZ0RlY2lzaW9uW10gPSBbXTtcbiAgLyoqIFN0YWdlIGlkcyB0aGF0IGFscmVhZHkgY29uc3VtZWQgYSBwZW5kaW5nIHNsb3QgKGVudHJ5IE9SIGVycm9yKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25zdW1lZFNsb3RzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBDb252ZW50aW9uIDQg4oCUIHJ1bklkIG9mIHRoZSBydW4gY3VycmVudGx5IGJlaW5nIHJlY29yZGVkLiAqL1xuICBwcml2YXRlIGxhc3RSdW5JZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZCA/PyBgY29udHJvbC1kZXBzLSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcblxuICAgIGNvbnN0IGRlY2lkZXJJZCA9IGN0eC5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBydWxlTGFiZWwgPSBtYXRjaGVkUnVsZUxhYmVsKGV2ZW50LmV2aWRlbmNlKTtcbiAgICB0aGlzLmRlY2lzaW9ucy5zZXQoZGVjaWRlcklkLCB7XG4gICAgICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IGRlY2lkZXJJZCxcbiAgICAgIGNob3NlbjogZXZlbnQuY2hvc2VuLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgICAgLi4uKHJ1bGVMYWJlbCAhPT0gdW5kZWZpbmVkICYmIHsgcnVsZUxhYmVsIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IDEgfSk7XG4gIH1cblxuICBvbkF0dGVtcHQoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGNvbnN0IHsgcmVjb3JkIH0gPSBldmVudDtcbiAgICBpZiAoIWN0eCB8fCByZWNvcmQubmV4dCAhPT0gJ3N0b3AnIHx8ICFpc1JldHJ5RXZpZGVuY2UocmVjb3JkKSkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChyZWNvcmQuc2VyaWVzLCB7XG4gICAgICBraW5kOiAnYXR0ZW1wdC1zdG9wJyxcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogcmVjb3JkLnNlcmllcyxcbiAgICAgIGNob3NlbjogJ3N0b3AnLFxuICAgICAgZXZpZGVuY2U6IHJlY29yZC5kZWNpc2lvbixcbiAgICAgIHJ1bGVMYWJlbDogcmVjb3JkLnJlYXNvbixcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWQoZXZlbnQ6IEZsb3dTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIGlmIChldmVudC5zZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90aGluZyBzZWxlY3RlZCDihpIgbm90aGluZyBnb3Zlcm5lZFxuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBbLi4uZXZlbnQuc2VsZWN0ZWRdLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IGV2ZW50LnNlbGVjdGVkLmxlbmd0aCB9KTtcbiAgfVxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgdGhpcy5yZXNldElmTmV3UnVuKGN0eC5ydW5JZCk7XG5cbiAgICBjb25zdCB7IHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCB9ID0gY3R4O1xuICAgIGlmIChwYXJlbnRSdW50aW1lU3RhZ2VJZCkge1xuICAgICAgdGhpcy5wYXJlbnRPZi5zZXQocnVudGltZVN0YWdlSWQsIHBhcmVudFJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIHRoaXMuY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgYnJhbmNoIHRoYXQgdGhyb3dzIG5ldmVyIGZpcmVzIGBvblN0YWdlRXhlY3V0ZWRgIOKAlCB3aXRob3V0IHRoaXMgaG9va1xuICAgKiBpdHMgcGVuZGluZyBzbG90IHdvdWxkIGxlYWsgYW5kIHRoZSBwb3N0LWZhbi1vdXQgY29udmVyZ2VuY2Ugc3RhZ2VcbiAgICogKHdob3NlIGNvbnRleHQgYWxzbyBjaGFpbnMgdG8gdGhlIHNlbGVjdG9yKSB3b3VsZCBiZSBtaXNhdHRyaWJ1dGVkIGFzXG4gICAqIGEgYnJhbmNoIGVudHJ5IHVuZGVyIGJlc3QtZWZmb3J0IChgZmFpbEZhc3Q6IGZhbHNlYCkgZmFuLW91dHMuXG4gICAqL1xuICBvbkVycm9yKGV2ZW50OiBGbG93RXJyb3JFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcbiAgICBpZiAoY3R4LnBhcmVudFJ1bnRpbWVTdGFnZUlkKSB7XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYWluIEFORCBhdHRyaWJ1dGUgdGhlIGZhaWxlZCBzdGFnZSB0byBpdHMgZGVjaXNpb24g4oCUXG4gICAgICAvLyB0aGUgc3RhZ2UgUkFOIChhbmQgbWF5IGhhdmUgY29tbWl0dGVkIHBhcnRpYWwgd3JpdGVzKSBiZWNhdXNlIHRoZVxuICAgICAgLy8gZGVjaXNpb24gY2hvc2UgaXQ7IGZhaWxpbmcgYWZ0ZXJ3YXJkcyBkb2Vzbid0IHVuZG8gdGhlIGRlcGVuZGVuY3kuXG4gICAgICB0aGlzLnBhcmVudE9mLnNldChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCk7XG4gICAgICB0aGlzLmNvbnN1bWVQZW5kaW5nU2xvdChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIE5FQVJFU1QgZ292ZXJuaW5nIGRlY2lzaW9uIGZvciBhbiBleGVjdXRpb24gc3RlcDogd2Fsa3MgdGhlXG4gICAqIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4gKHRoZSBzdGVwIGl0c2VsZiBmaXJzdCkgdW50aWwgaXQgaGl0cyBhXG4gICAqIHJlZ2lzdGVyZWQgYnJhbmNoIGVudHJ5LiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzdGVwIGlzIG5vdCBkb3duc3RyZWFtIG9mXG4gICAqIGFueSByZWNvcmRlZCBkZWNpc2lvbi5cbiAgICovXG4gIGxvb2t1cChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBydW50aW1lU3RhZ2VJZDtcbiAgICB3aGlsZSAoY3VyICE9PSB1bmRlZmluZWQgJiYgIXNlZW4uaGFzKGN1cikpIHtcbiAgICAgIHNlZW4uYWRkKGN1cik7XG4gICAgICBjb25zdCBkZWNpZGVySWQgPSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5nZXQoY3VyKTtcbiAgICAgIGlmIChkZWNpZGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmRlY2lzaW9ucy5nZXQoZGVjaWRlcklkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZWNpZGVySWQsXG4gICAgICAgICAgLi4uKHJlY29yZD8ucnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbDogcmVjb3JkLnJ1bGVMYWJlbCB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1ciA9IHRoaXMucGFyZW50T2YuZ2V0KGN1cik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIGxvb2t1cCBhcyBhIGJhcmUgZnVuY3Rpb24g4oCUIHBsdWcgaW50byBgY2F1c2FsQ2hhaW4oLi4uLCB7IGNvbnRyb2xEZXBzIH0pYC4gKi9cbiAgYXNMb29rdXAoKTogQ29udHJvbERlcExvb2t1cCB7XG4gICAgcmV0dXJuIChydW50aW1lU3RhZ2VJZCkgPT4gdGhpcy5sb29rdXAocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0LXN0b3AgZGVjaXNpb24gb2YgYSBzdGFnZSBleGVjdXRpb24gd2hvc2UgcmV0cnkgc2VyaWVzIHN0b3BwZWQsIGlmIGl0IGRpZC4gKi9cbiAgZ2V0QXR0ZW1wdFN0b3AocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IENvbnRyb2xEZWNpc2lvblJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5kZWNpc2lvbnMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXR1cm4gcmVjb3JkPy5raW5kID09PSAnYXR0ZW1wdC1zdG9wJyA/IHJlY29yZCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBbGwgZGVjaXNpb25zIHJlY29yZGVkIGZvciB0aGUgY3VycmVudCBydW4sIGluIGV2ZW50IG9yZGVyIOKAlCBkZWNpZGVycywgc2VsZWN0b3JzIGFuZCBhdHRlbXB0IHN0b3BzLiAqL1xuICBnZXREZWNpc2lvbnMoKTogQ29udHJvbERlY2lzaW9uUmVjb3JkW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5kZWNpc2lvbnMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQtcnVuIGNvbnRyb2wgZXZpZGVuY2UgZm9yIHRoZSBuYXRpdmUgc25hcHNob3QuIFByb2plY3Qgb25seSB0aGVcbiAgICogc3RhZ2UgaWRlbnRpdGllcyBjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbDsgbmV2ZXIgd2FsayB0aGUgZXhlY3V0aW9uIHRyZWUuXG4gICAqIFBhcmVudGxlc3Mgcm9vdHMgY2Fubm90IGhhdmUgYSBnb3Zlcm5pbmcgY29udHJvbCBlZGdlLlxuICAgKi9cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IFtzdHJpbmcsIENvbnRyb2xEZXBlbmRlbmN5XVtdID0gW107XG4gICAgZm9yIChjb25zdCBydW50aW1lU3RhZ2VJZCBvZiB0aGlzLnBhcmVudE9mLmtleXMoKSkge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHRoaXMubG9va3VwKHJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIGlmIChkZXBlbmRlbmN5KSBkZXBlbmRlbmNpZXMucHVzaChbcnVudGltZVN0YWdlSWQsIGRlcGVuZGVuY3ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdjb250cm9sLWRlcGVuZGVuY2llcycsXG4gICAgICBkYXRhOiB7IGRlY2lzaW9uczogdGhpcy5nZXREZWNpc2lvbnMoKSwgY29udHJvbERlcHM6IE9iamVjdC5mcm9tRW50cmllcyhkZXBlbmRlbmNpZXMpIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZXNldCBhbGwgc3RhdGUgKGFsc28gaGFwcGVucyBhdXRvbWF0aWNhbGx5IG9uIHJ1bklkIGNoYW5nZSkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50T2YuY2xlYXIoKTtcbiAgICB0aGlzLmRlY2lzaW9ucy5jbGVhcigpO1xuICAgIHRoaXMuYnJhbmNoRW50cnlUb0RlY2lzaW9uLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nID0gW107XG4gICAgdGhpcy5jb25zdW1lZFNsb3RzLmNsZWFyKCk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDb252ZW50aW9uIDQ6IGEgbmV3IHJ1bklkIG1lYW5zIGEgbmV3IHJ1biDigJQgcmVzZXQgdHJhbnNpZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIHJlc2V0SWZOZXdSdW4ocnVuSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChydW5JZCA9PT0gdGhpcy5sYXN0UnVuSWQpIHJldHVybjtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0UnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBgcGFyZW50UnVudGltZVN0YWdlSWRgIGlzIGEgZGVjaWRlciB3aXRoIGFuIHVubWF0Y2hlZCBwZW5kaW5nIHNsb3QsXG4gICAqIGNvbnN1bWUgb25lLiBgcmVnaXN0ZXJgIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHN0YWdlIGlzIHJlY29yZGVkIGFzIGFcbiAgICogYnJhbmNoIGVudHJ5IChzdGFnZSBleGVjdXRlZC9lcnJvcmVkKSDigJQgYm90aCBwYXRocyBjb25zdW1lIHRoZSBzbG90IHNvXG4gICAqIGNvdW50cyBzdGF5IGV4YWN0IGV2ZW4gd2hlbiBhIHN0YWdlIHByb2R1Y2VzIGJvdGggZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdW1lUGVuZGluZ1Nsb3QocnVudGltZVN0YWdlSWQ6IHN0cmluZywgcGFyZW50UnVudGltZVN0YWdlSWQ6IHN0cmluZywgcmVnaXN0ZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAocnVudGltZVN0YWdlSWQgPT09IHBhcmVudFJ1bnRpbWVTdGFnZUlkKSByZXR1cm47IC8vIHN5bnRoZXRpYyBzZWxmLWV2ZW50c1xuICAgIGlmICh0aGlzLmNvbnN1bWVkU2xvdHMuaGFzKHJ1bnRpbWVTdGFnZUlkKSkgcmV0dXJuO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBlbmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnBlbmRpbmdbaV07XG4gICAgICBpZiAocC5kZWNpZGVySWQgIT09IHBhcmVudFJ1bnRpbWVTdGFnZUlkKSBjb250aW51ZTtcblxuICAgICAgdGhpcy5jb25zdW1lZFNsb3RzLmFkZChydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAocmVnaXN0ZXIpIHRoaXMuYnJhbmNoRW50cnlUb0RlY2lzaW9uLnNldChydW50aW1lU3RhZ2VJZCwgcC5kZWNpZGVySWQpO1xuICAgICAgcC5yZW1haW5pbmctLTtcbiAgICAgIGlmIChwLnJlbWFpbmluZyA8PSAwKSB0aGlzLnBlbmRpbmcuc3BsaWNlKGksIDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWNpZGUoKSBydWxlIGxhYmVsIHRoYXQgcHJvZHVjZWQgdGhlIGRlY2lzaW9uOiB0aGUgbWF0Y2hlZCBydWxlXG4gKiBtYXBwaW5nIHRvIHRoZSBjaG9zZW4gYnJhbmNoIChmaXJzdCBtYXRjaGVkIHJ1bGUgYXMgZmFsbGJhY2spLlxuICovXG5mdW5jdGlvbiBtYXRjaGVkUnVsZUxhYmVsKGV2aWRlbmNlOiBEZWNpc2lvbkV2aWRlbmNlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFldmlkZW5jZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcnVsZSA9XG4gICAgZXZpZGVuY2UucnVsZXMuZmluZCgocikgPT4gci5tYXRjaGVkICYmIHIuYnJhbmNoID09PSBldmlkZW5jZS5jaG9zZW4pID8/IGV2aWRlbmNlLnJ1bGVzLmZpbmQoKHIpID0+IHIubWF0Y2hlZCk7XG4gIHJldHVybiBydWxlPy5sYWJlbDtcbn1cbiJdfQ==
@@ -59,6 +59,7 @@
59
59
  * ```
60
60
  */
61
61
  import type { EmitSourcePosition } from 'foottrace';
62
+ import type { RunCorrelation } from '../attempt/types.js';
62
63
  import type { RecorderBundle } from './snapshot.js';
63
64
  /**
64
65
  * Event delivered to `EmitRecorder.onEmit`.
@@ -109,6 +110,8 @@ export interface EmitEvent {
109
110
  * Absent on old/manual events and scopes without a bound engine log.
110
111
  */
111
112
  readonly sourcePosition?: EmitSourcePosition;
113
+ /** The run's correlation (10.1) — as on every scope event (`RecorderContext.correlation`). Absent when none. */
114
+ readonly correlation?: RunCorrelation;
112
115
  }
113
116
  /**
114
117
  * Pluggable observer for consumer-emitted structured events.
@@ -59,4 +59,4 @@
59
59
  * ```
60
60
  */
61
61
  export {};
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW1pdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9FbWl0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbWl0UmVjb3JkZXIg4oCUIHRoZSB0aGlyZCBvYnNlcnZlciBjaGFubmVsLCBhbG9uZ3NpZGUgYFNjb3BlUmVjb3JkZXJgXG4gKiAoc2NvcGUgZGF0YS1mbG93KSBhbmQgYEZsb3dSZWNvcmRlcmAgKGNvbnRyb2wtZmxvdykuXG4gKlxuICogIyMgV2h5IHRoaXMgZXhpc3RzXG4gKlxuICogVGhlIGZpcnN0IHR3byBjaGFubmVscyBjYXB0dXJlIHdoYXQgdGhlIExJQlJBUlkga25vd3MgYWJvdXQg4oCUIHNjb3BlXG4gKiByZWFkcy93cml0ZXMgZmlyZWQgYnkgYHNldFZhbHVlYCwgYW5kIGNvbnRyb2wtZmxvdyBldmVudHMgZmlyZWQgYnkgdGhlXG4gKiB0cmF2ZXJzZXIuIEJ1dCAqKnVzZXItZW1pdHRlZCBzdHJ1Y3R1cmVkIGV2ZW50cyoqIOKAlCB0aGluZ3MgYSBzdGFnZVxuICogZnVuY3Rpb24gd2FudHMgdG8gc3VyZmFjZSBmb3Igb2JzZXJ2YWJpbGl0eSAoTExNIHRva2VucywgYmlsbGluZyBtZXRyaWNzLFxuICogYXV0aCBkZWNpc2lvbnMsIGRvbWFpbiBtaWxlc3RvbmVzKSDigJQgaGF2ZSBub3doZXJlIHRvIGdvIHRvZGF5LiBUaGV5IGxhbmRcbiAqIGluIHVub2JzZXJ2ZWQgYERpYWdub3N0aWNDb2xsZWN0b3JgIHNpZGUgYmFncyB0aGF0IG5vIHJlY29yZGVyIHdhdGNoZXMuXG4gKlxuICogVGhpcyBjaGFubmVsIGNsb3NlcyB0aGF0IGdhcC4gQ29uc3VtZXIgY2FsbHMgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYFxuICogZnJvbSBpbnNpZGUgYSBzdGFnZTsgdGhlIGxpYnJhcnkgZW5yaWNoZXMgdGhlIGV2ZW50IHdpdGggc3RhZ2UgY29udGV4dFxuICogYW5kIGRpc3BhdGNoZXMgaXQgc3luY2hyb25vdXNseSB0byBldmVyeSBhdHRhY2hlZCBgRW1pdFJlY29yZGVyYC5cbiAqXG4gKiAjIyBEZXNpZ24gcHJvcGVydGllc1xuICpcbiAqIC0gKipQYXNzLXRocm91Z2gsIG5vdCBidWZmZXJlZC4qKiBaZXJvIGFsbG9jYXRpb24gd2hlbiBubyByZWNvcmRlciBpc1xuICogICBhdHRhY2hlZC4gRXZlbnRzIGRlbGl2ZXJlZCBzeW5jaHJvbm91c2x5LCBpbi1vcmRlciwgYXQgY2FsbCB0aW1lLlxuICogICBTYW1lIHNlbWFudGljcyBhcyBgb25SZWFkYC9gb25Xcml0ZWAgYWxyZWFkeSB1c2UuXG4gKiAtICoqTGlicmFyeS1hZ25vc3RpYyB2b2NhYnVsYXJ5LioqIEV2ZW50IG5hbWVzIGFyZSBjb25zdW1lci1jaG9zZW4gc3RyaW5ncy5cbiAqICAgQ29udmVudGlvbjogaGllcmFyY2hpY2FsIGRvdHRlZCBuYW1lcywgZS5nLiBgJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnYCxcbiAqICAgYCdteWFwcC5iaWxsaW5nLnNwZW5kJ2AuIExpYnJhcnkgZW5mb3JjZXMgbm8gcmVnaXN0cnkuXG4gKiAtICoqQXV0by1lbnJpY2hlZCBjb250ZXh0LioqIEV2ZXJ5IGV2ZW50IGNhcnJpZXMgYHN0YWdlTmFtZWAsXG4gKiAgIGBydW50aW1lU3RhZ2VJZGAsIGBzdWJmbG93UGF0aGAsIGBwaXBlbGluZUlkYCwgYHRpbWVzdGFtcGAuIENvbnN1bWVyc1xuICogICBuZXZlciBuZWVkIHRvIHRocmVhZCBleGVjdXRpb24gY29udGV4dCB0aHJvdWdoIHRoZWlyIGVtaXQgcGF5bG9hZHMuXG4gKiAtICoqUmVkYWN0aW9uLWF3YXJlLioqIGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCBtYXRjaGVzIGV2ZW50IG5hbWVzXG4gKiAgIGJlZm9yZSBkaXNwYXRjaCDigJQgbWF0Y2hlZCBldmVudHMgaGF2ZSB0aGVpciBwYXlsb2FkIHJlcGxhY2VkIHdpdGhcbiAqICAgYCdbUkVEQUNURURdJ2Agc28gc2VjcmV0cyBjYW4ndCBsZWFrIHZpYSBlbWl0LlxuICpcbiAqICMjIFJlbGF0aW9uc2hpcCB0byBleGlzdGluZyBjaGFubmVsc1xuICpcbiAqIHwgQ2hhbm5lbCAgICAgICAgIHwgRmlyZXMgd2hlbiAgICAgICAgICAgICAgICAgICAgICAgICB8IEJ1aWx0LWluIGNvbnN1bWVycyAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IGBTY29wZVJlY29yZGVyYCAgICAgIHwgc2NvcGUgcmVhZC93cml0ZS9jb21taXQgICAgICAgICAgICB8IERlYnVnUmVjb3JkZXIsIE1ldHJpY1JlY29yZGVyIHxcbiAqIHwgYEZsb3dSZWNvcmRlcmAgIHwgdHJhdmVyc2FsIHRyYW5zaXRpb25zICAgICAgICAgICAgICB8IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciwgZXRjLiB8XG4gKiB8IGBFbWl0UmVjb3JkZXJgICB8IGNvbnN1bWVyIGNhbGxzIGBzY29wZS4kZW1pdCguLi4pYCAgfCAobm9uZSBzaGlwcyB0b2RheTsgUGhhc2UgMy5YIGFkZHMgTWVtb3J5RW1pdFJlY29yZGVyKSB8XG4gKlxuICogYENvbWJpbmVkUmVjb3JkZXJgIChmcm9tIGAuL0NvbWJpbmVkUmVjb3JkZXIudHNgKSBpbnRlcnNlY3RzIGFsbCB0aHJlZVxuICogdmlhIGBQYXJ0aWFsPC4uLj5gLiBBIGNvbnN1bWVyIGNhbiB3cml0ZSBPTkUgb2JqZWN0IGltcGxlbWVudGluZyBhbnlcbiAqIGNvbWJpbmF0aW9uOyBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyKWAgZHVjay10eXBlcyBhbmQgcm91dGVzXG4gKiB0byB0aGUgcmlnaHQgY2hhbm5lbChzKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdG9rZW5NZXRlcjogRW1pdFJlY29yZGVyID0ge1xuICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAqICAgb25FbWl0KGV2ZW50KSB7XG4gKiAgICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJykge1xuICogICAgICAgdGhpcy50b3RhbCArPSAoZXZlbnQucGF5bG9hZCBhcyB7IGlucHV0OiBudW1iZXI7IG91dHB1dDogbnVtYmVyIH0pLmlucHV0O1xuICogICAgIH1cbiAqICAgfSxcbiAqICAgdG90YWw6IDAsXG4gKiB9IGFzIGFueTtcbiAqXG4gKiBleGVjdXRvci5hdHRhY2hFbWl0UmVjb3JkZXIodG9rZW5NZXRlcik7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEVtaXRTb3VyY2VQb3NpdGlvbiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgUmVjb3JkZXJCdW5kbGUgfSBmcm9tICcuL3NuYXBzaG90LmpzJztcblxuLyoqXG4gKiBFdmVudCBkZWxpdmVyZWQgdG8gYEVtaXRSZWNvcmRlci5vbkVtaXRgLlxuICpcbiAqIE5hbWUgKyBwYXlsb2FkIGFyZSBjb25zdW1lci1zdXBwbGllZCB2aWEgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYC5cbiAqIEV2ZXJ5dGhpbmcgZWxzZSBpcyBsaWJyYXJ5LWVucmljaGVkIGF0IGRpc3BhdGNoIHRpbWUgZnJvbSB0aGUgY3VycmVudFxuICogc3RhZ2UncyBleGVjdXRpb24gY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWl0RXZlbnQge1xuICAvKipcbiAgICogQ29uc3VtZXItc3VwcGxpZWQgZXZlbnQgbmFtZS4gQ29udmVudGlvbjogaGllcmFyY2hpY2FsIGRvdHRlZCBuYW1lc3BhY2VcbiAgICogKGUuZy4gYCdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJ2AsIGAnbXlhcHAuYmlsbGluZy5zcGVuZCdgKS4gS2VlcHNcbiAgICogdm9jYWJ1bGFyaWVzIGNvbGxpc2lvbi1mcmVlIGFjcm9zcyBsaWJyYXJpZXMvYXBwcyB3aXRob3V0IHJlcXVpcmluZyBhXG4gICAqIGNlbnRyYWwgcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnN1bWVyLXN1cHBsaWVkIHBheWxvYWQuIFNoYXBlIGlzIHVwIHRvIHRoZSBjb25zdW1lciBhbmQgdGhlaXJcbiAgICogY29udmVudGlvbjsgbGlicmFyeSB0cmVhdHMgaXQgYXMgb3BhcXVlIGFuZCBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWRcbiAgICogKG1vZHVsbyByZWRhY3Rpb24g4oCUIHNlZSBgUmVkYWN0aW9uUG9saWN5LmVtaXRQYXR0ZXJuc2ApLlxuICAgKlxuICAgKiBXaGVuIHJlZGFjdGVkLCByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgYCdbUkVEQUNURURdJ2AuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkOiB1bmtub3duO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBzdGFnZSB0aGF0IGVtaXR0ZWQgdGhpcyBldmVudC4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllciDigJQgdGhlIHNhbWUgdmFsdWUgcmVjb3JkZXIgZXZlbnRzXG4gICAqIGFuZCBjb21taXQtbG9nIGVudHJpZXMgY2FycnkuIFNlZSBgcnVudGltZVN0YWdlSWQudHNgIGZvciBmb3JtYXQuXG4gICAqL1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdWJmbG93IHBhdGggZnJvbSB0aGUgb3V0ZXJtb3N0IHBhcmVudCBkb3duIHRvIHRoZSBzdWJmbG93IHRoYXQgZW1pdHRlZFxuICAgKiB0aGlzIGV2ZW50LiBFbXB0eSBhcnJheSB3aGVuIHRoZSBlbWl0IGNhbWUgZnJvbSB0aGUgcm9vdCBmbG93Y2hhcnQuXG4gICAqIE1hdGNoZXMgdGhlIGNvbnZlbnRpb24gdXNlZCBieSBgRmxvd1BhdXNlRXZlbnQuc3ViZmxvd1BhdGhgLFxuICAgKiBgRmxvd2NoYXJ0Q2hlY2twb2ludC5zdWJmbG93UGF0aGAsIGV0Yy5cbiAgICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogUGlwZWxpbmUvcnVuIGlkZW50aWZpZXIgKG1hdGNoZXMgYFJlY29yZGVyQ29udGV4dC5waXBlbGluZUlkYCkuICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lSWQ6IHN0cmluZztcblxuICAvKiogRW1pc3Npb24gdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCAoYERhdGUubm93KClgKS4gKi9cbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNvdXJjZS10aW1lIGNvbW1pdHRlZCBwcmVmaXggaW4gdGhpcyBzdGFnZSdzIG93biBsb2csIGNhcHR1cmVkIGJlZm9yZVxuICAgKiBvYnNlcnZlciBkaXNwYXRjaC4gTm90IHRoaXMgc3RhZ2UncyBmdXR1cmUgY29tbWl0IG9yIHVuY29tbWl0dGVkIHN0YXRlLlxuICAgKiBNYXRjaCBsb2dSdW5JZCArIGRyaWxsUGF0aCBhZ2FpbnN0IHRoZSBzb3VyY2UncyBsb2dBZGRyZXNzIGJlZm9yZSBmb2xkaW5nO1xuICAgKiBhIG5hbWVkIG5lc3RlZCBoaXN0b3J5IGNhbiBiZSB1bmF2YWlsYWJsZSAoZS5nLiBhIHBhdXNlZCBzdWJmbG93KS5cbiAgICogQWJzZW50IG9uIG9sZC9tYW51YWwgZXZlbnRzIGFuZCBzY29wZXMgd2l0aG91dCBhIGJvdW5kIGVuZ2luZSBsb2cuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQb3NpdGlvbj86IEVtaXRTb3VyY2VQb3NpdGlvbjtcbn1cblxuLyoqXG4gKiBQbHVnZ2FibGUgb2JzZXJ2ZXIgZm9yIGNvbnN1bWVyLWVtaXR0ZWQgc3RydWN0dXJlZCBldmVudHMuXG4gKlxuICogQWxsIG1ldGhvZHMgYXJlIG9wdGlvbmFsOyBpbXBsZW1lbnQgb25seSB3aGF0IHlvdSBjYXJlIGFib3V0LiBSZWNvcmRlcnNcbiAqIGFyZSBpbnZva2VkIHN5bmNocm9ub3VzbHkgaW4gYXR0YWNobWVudCBvcmRlci4gSWYgYSByZWNvcmRlciB0aHJvd3MsIHRoZVxuICogZXJyb3IgaXMgY2F1Z2h0IGFuZCBpc29sYXRlZCDigJQgb3RoZXIgcmVjb3JkZXJzIGNvbnRpbnVlIHRvIHJlY2VpdmUgdGhlXG4gKiBldmVudCBhbmQgdGhlIGVtaXR0aW5nIHN0YWdlIGlzIHVuYWZmZWN0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1pdFJlY29yZGVyIHtcbiAgLyoqXG4gICAqIFN0YWJsZSBpZGVudGlmaWVyIGZvciBpZGVtcG90ZW50IGF0dGFjaC9kZXRhY2guIFJlLWF0dGFjaGluZyB3aXRoIHRoZVxuICAgKiBzYW1lIGlkIHJlcGxhY2VzIHRoZSBwcmV2aW91cyByZWdpc3RyYXRpb24gb24gdGhlIGV4ZWN1dG9yLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogQ2FsbGVkIGZvciBldmVyeSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGNhbGwgaW4gYW55IHN0YWdlLiAqL1xuICBvbkVtaXQ/KGV2ZW50OiBFbWl0RXZlbnQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbDogcmVzZXQgcmVjb3JkZXItaW50ZXJuYWwgc3RhdGUgYmV0d2VlbiBydW5zLiBDYWxsZWQgYnkgdGhlXG4gICAqIGV4ZWN1dG9yIGJlZm9yZSBlYWNoIGBydW4oKWAuXG4gICAqL1xuICBjbGVhcj8oKTogdm9pZDtcblxuICAvKipcbiAgICogT3B0aW9uYWw6IGV4cG9zZSBjb2xsZWN0ZWQgZGF0YSBmb3IgaW5jbHVzaW9uIGluXG4gICAqIGBleGVjdXRvci5nZXRTbmFwc2hvdCgpLnJlY29yZGVyc2AuXG4gICAqL1xuICB0b1NuYXBzaG90PygpOiBSZWNvcmRlckJ1bmRsZTtcbn1cbiJdfQ==
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW1pdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9FbWl0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbWl0UmVjb3JkZXIg4oCUIHRoZSB0aGlyZCBvYnNlcnZlciBjaGFubmVsLCBhbG9uZ3NpZGUgYFNjb3BlUmVjb3JkZXJgXG4gKiAoc2NvcGUgZGF0YS1mbG93KSBhbmQgYEZsb3dSZWNvcmRlcmAgKGNvbnRyb2wtZmxvdykuXG4gKlxuICogIyMgV2h5IHRoaXMgZXhpc3RzXG4gKlxuICogVGhlIGZpcnN0IHR3byBjaGFubmVscyBjYXB0dXJlIHdoYXQgdGhlIExJQlJBUlkga25vd3MgYWJvdXQg4oCUIHNjb3BlXG4gKiByZWFkcy93cml0ZXMgZmlyZWQgYnkgYHNldFZhbHVlYCwgYW5kIGNvbnRyb2wtZmxvdyBldmVudHMgZmlyZWQgYnkgdGhlXG4gKiB0cmF2ZXJzZXIuIEJ1dCAqKnVzZXItZW1pdHRlZCBzdHJ1Y3R1cmVkIGV2ZW50cyoqIOKAlCB0aGluZ3MgYSBzdGFnZVxuICogZnVuY3Rpb24gd2FudHMgdG8gc3VyZmFjZSBmb3Igb2JzZXJ2YWJpbGl0eSAoTExNIHRva2VucywgYmlsbGluZyBtZXRyaWNzLFxuICogYXV0aCBkZWNpc2lvbnMsIGRvbWFpbiBtaWxlc3RvbmVzKSDigJQgaGF2ZSBub3doZXJlIHRvIGdvIHRvZGF5LiBUaGV5IGxhbmRcbiAqIGluIHVub2JzZXJ2ZWQgYERpYWdub3N0aWNDb2xsZWN0b3JgIHNpZGUgYmFncyB0aGF0IG5vIHJlY29yZGVyIHdhdGNoZXMuXG4gKlxuICogVGhpcyBjaGFubmVsIGNsb3NlcyB0aGF0IGdhcC4gQ29uc3VtZXIgY2FsbHMgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYFxuICogZnJvbSBpbnNpZGUgYSBzdGFnZTsgdGhlIGxpYnJhcnkgZW5yaWNoZXMgdGhlIGV2ZW50IHdpdGggc3RhZ2UgY29udGV4dFxuICogYW5kIGRpc3BhdGNoZXMgaXQgc3luY2hyb25vdXNseSB0byBldmVyeSBhdHRhY2hlZCBgRW1pdFJlY29yZGVyYC5cbiAqXG4gKiAjIyBEZXNpZ24gcHJvcGVydGllc1xuICpcbiAqIC0gKipQYXNzLXRocm91Z2gsIG5vdCBidWZmZXJlZC4qKiBaZXJvIGFsbG9jYXRpb24gd2hlbiBubyByZWNvcmRlciBpc1xuICogICBhdHRhY2hlZC4gRXZlbnRzIGRlbGl2ZXJlZCBzeW5jaHJvbm91c2x5LCBpbi1vcmRlciwgYXQgY2FsbCB0aW1lLlxuICogICBTYW1lIHNlbWFudGljcyBhcyBgb25SZWFkYC9gb25Xcml0ZWAgYWxyZWFkeSB1c2UuXG4gKiAtICoqTGlicmFyeS1hZ25vc3RpYyB2b2NhYnVsYXJ5LioqIEV2ZW50IG5hbWVzIGFyZSBjb25zdW1lci1jaG9zZW4gc3RyaW5ncy5cbiAqICAgQ29udmVudGlvbjogaGllcmFyY2hpY2FsIGRvdHRlZCBuYW1lcywgZS5nLiBgJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnYCxcbiAqICAgYCdteWFwcC5iaWxsaW5nLnNwZW5kJ2AuIExpYnJhcnkgZW5mb3JjZXMgbm8gcmVnaXN0cnkuXG4gKiAtICoqQXV0by1lbnJpY2hlZCBjb250ZXh0LioqIEV2ZXJ5IGV2ZW50IGNhcnJpZXMgYHN0YWdlTmFtZWAsXG4gKiAgIGBydW50aW1lU3RhZ2VJZGAsIGBzdWJmbG93UGF0aGAsIGBwaXBlbGluZUlkYCwgYHRpbWVzdGFtcGAuIENvbnN1bWVyc1xuICogICBuZXZlciBuZWVkIHRvIHRocmVhZCBleGVjdXRpb24gY29udGV4dCB0aHJvdWdoIHRoZWlyIGVtaXQgcGF5bG9hZHMuXG4gKiAtICoqUmVkYWN0aW9uLWF3YXJlLioqIGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCBtYXRjaGVzIGV2ZW50IG5hbWVzXG4gKiAgIGJlZm9yZSBkaXNwYXRjaCDigJQgbWF0Y2hlZCBldmVudHMgaGF2ZSB0aGVpciBwYXlsb2FkIHJlcGxhY2VkIHdpdGhcbiAqICAgYCdbUkVEQUNURURdJ2Agc28gc2VjcmV0cyBjYW4ndCBsZWFrIHZpYSBlbWl0LlxuICpcbiAqICMjIFJlbGF0aW9uc2hpcCB0byBleGlzdGluZyBjaGFubmVsc1xuICpcbiAqIHwgQ2hhbm5lbCAgICAgICAgIHwgRmlyZXMgd2hlbiAgICAgICAgICAgICAgICAgICAgICAgICB8IEJ1aWx0LWluIGNvbnN1bWVycyAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IGBTY29wZVJlY29yZGVyYCAgICAgIHwgc2NvcGUgcmVhZC93cml0ZS9jb21taXQgICAgICAgICAgICB8IERlYnVnUmVjb3JkZXIsIE1ldHJpY1JlY29yZGVyIHxcbiAqIHwgYEZsb3dSZWNvcmRlcmAgIHwgdHJhdmVyc2FsIHRyYW5zaXRpb25zICAgICAgICAgICAgICB8IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciwgZXRjLiB8XG4gKiB8IGBFbWl0UmVjb3JkZXJgICB8IGNvbnN1bWVyIGNhbGxzIGBzY29wZS4kZW1pdCguLi4pYCAgfCAobm9uZSBzaGlwcyB0b2RheTsgUGhhc2UgMy5YIGFkZHMgTWVtb3J5RW1pdFJlY29yZGVyKSB8XG4gKlxuICogYENvbWJpbmVkUmVjb3JkZXJgIChmcm9tIGAuL0NvbWJpbmVkUmVjb3JkZXIudHNgKSBpbnRlcnNlY3RzIGFsbCB0aHJlZVxuICogdmlhIGBQYXJ0aWFsPC4uLj5gLiBBIGNvbnN1bWVyIGNhbiB3cml0ZSBPTkUgb2JqZWN0IGltcGxlbWVudGluZyBhbnlcbiAqIGNvbWJpbmF0aW9uOyBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyKWAgZHVjay10eXBlcyBhbmQgcm91dGVzXG4gKiB0byB0aGUgcmlnaHQgY2hhbm5lbChzKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdG9rZW5NZXRlcjogRW1pdFJlY29yZGVyID0ge1xuICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAqICAgb25FbWl0KGV2ZW50KSB7XG4gKiAgICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJykge1xuICogICAgICAgdGhpcy50b3RhbCArPSAoZXZlbnQucGF5bG9hZCBhcyB7IGlucHV0OiBudW1iZXI7IG91dHB1dDogbnVtYmVyIH0pLmlucHV0O1xuICogICAgIH1cbiAqICAgfSxcbiAqICAgdG90YWw6IDAsXG4gKiB9IGFzIGFueTtcbiAqXG4gKiBleGVjdXRvci5hdHRhY2hFbWl0UmVjb3JkZXIodG9rZW5NZXRlcik7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEVtaXRTb3VyY2VQb3NpdGlvbiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgUnVuQ29ycmVsYXRpb24gfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXJCdW5kbGUgfSBmcm9tICcuL3NuYXBzaG90LmpzJztcblxuLyoqXG4gKiBFdmVudCBkZWxpdmVyZWQgdG8gYEVtaXRSZWNvcmRlci5vbkVtaXRgLlxuICpcbiAqIE5hbWUgKyBwYXlsb2FkIGFyZSBjb25zdW1lci1zdXBwbGllZCB2aWEgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYC5cbiAqIEV2ZXJ5dGhpbmcgZWxzZSBpcyBsaWJyYXJ5LWVucmljaGVkIGF0IGRpc3BhdGNoIHRpbWUgZnJvbSB0aGUgY3VycmVudFxuICogc3RhZ2UncyBleGVjdXRpb24gY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWl0RXZlbnQge1xuICAvKipcbiAgICogQ29uc3VtZXItc3VwcGxpZWQgZXZlbnQgbmFtZS4gQ29udmVudGlvbjogaGllcmFyY2hpY2FsIGRvdHRlZCBuYW1lc3BhY2VcbiAgICogKGUuZy4gYCdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJ2AsIGAnbXlhcHAuYmlsbGluZy5zcGVuZCdgKS4gS2VlcHNcbiAgICogdm9jYWJ1bGFyaWVzIGNvbGxpc2lvbi1mcmVlIGFjcm9zcyBsaWJyYXJpZXMvYXBwcyB3aXRob3V0IHJlcXVpcmluZyBhXG4gICAqIGNlbnRyYWwgcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnN1bWVyLXN1cHBsaWVkIHBheWxvYWQuIFNoYXBlIGlzIHVwIHRvIHRoZSBjb25zdW1lciBhbmQgdGhlaXJcbiAgICogY29udmVudGlvbjsgbGlicmFyeSB0cmVhdHMgaXQgYXMgb3BhcXVlIGFuZCBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWRcbiAgICogKG1vZHVsbyByZWRhY3Rpb24g4oCUIHNlZSBgUmVkYWN0aW9uUG9saWN5LmVtaXRQYXR0ZXJuc2ApLlxuICAgKlxuICAgKiBXaGVuIHJlZGFjdGVkLCByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgYCdbUkVEQUNURURdJ2AuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkOiB1bmtub3duO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBzdGFnZSB0aGF0IGVtaXR0ZWQgdGhpcyBldmVudC4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllciDigJQgdGhlIHNhbWUgdmFsdWUgcmVjb3JkZXIgZXZlbnRzXG4gICAqIGFuZCBjb21taXQtbG9nIGVudHJpZXMgY2FycnkuIFNlZSBgcnVudGltZVN0YWdlSWQudHNgIGZvciBmb3JtYXQuXG4gICAqL1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdWJmbG93IHBhdGggZnJvbSB0aGUgb3V0ZXJtb3N0IHBhcmVudCBkb3duIHRvIHRoZSBzdWJmbG93IHRoYXQgZW1pdHRlZFxuICAgKiB0aGlzIGV2ZW50LiBFbXB0eSBhcnJheSB3aGVuIHRoZSBlbWl0IGNhbWUgZnJvbSB0aGUgcm9vdCBmbG93Y2hhcnQuXG4gICAqIE1hdGNoZXMgdGhlIGNvbnZlbnRpb24gdXNlZCBieSBgRmxvd1BhdXNlRXZlbnQuc3ViZmxvd1BhdGhgLFxuICAgKiBgRmxvd2NoYXJ0Q2hlY2twb2ludC5zdWJmbG93UGF0aGAsIGV0Yy5cbiAgICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogUGlwZWxpbmUvcnVuIGlkZW50aWZpZXIgKG1hdGNoZXMgYFJlY29yZGVyQ29udGV4dC5waXBlbGluZUlkYCkuICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lSWQ6IHN0cmluZztcblxuICAvKiogRW1pc3Npb24gdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCAoYERhdGUubm93KClgKS4gKi9cbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNvdXJjZS10aW1lIGNvbW1pdHRlZCBwcmVmaXggaW4gdGhpcyBzdGFnZSdzIG93biBsb2csIGNhcHR1cmVkIGJlZm9yZVxuICAgKiBvYnNlcnZlciBkaXNwYXRjaC4gTm90IHRoaXMgc3RhZ2UncyBmdXR1cmUgY29tbWl0IG9yIHVuY29tbWl0dGVkIHN0YXRlLlxuICAgKiBNYXRjaCBsb2dSdW5JZCArIGRyaWxsUGF0aCBhZ2FpbnN0IHRoZSBzb3VyY2UncyBsb2dBZGRyZXNzIGJlZm9yZSBmb2xkaW5nO1xuICAgKiBhIG5hbWVkIG5lc3RlZCBoaXN0b3J5IGNhbiBiZSB1bmF2YWlsYWJsZSAoZS5nLiBhIHBhdXNlZCBzdWJmbG93KS5cbiAgICogQWJzZW50IG9uIG9sZC9tYW51YWwgZXZlbnRzIGFuZCBzY29wZXMgd2l0aG91dCBhIGJvdW5kIGVuZ2luZSBsb2cuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQb3NpdGlvbj86IEVtaXRTb3VyY2VQb3NpdGlvbjtcblxuICAvKiogVGhlIHJ1bidzIGNvcnJlbGF0aW9uICgxMC4xKSDigJQgYXMgb24gZXZlcnkgc2NvcGUgZXZlbnQgKGBSZWNvcmRlckNvbnRleHQuY29ycmVsYXRpb25gKS4gQWJzZW50IHdoZW4gbm9uZS4gKi9cbiAgcmVhZG9ubHkgY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcbn1cblxuLyoqXG4gKiBQbHVnZ2FibGUgb2JzZXJ2ZXIgZm9yIGNvbnN1bWVyLWVtaXR0ZWQgc3RydWN0dXJlZCBldmVudHMuXG4gKlxuICogQWxsIG1ldGhvZHMgYXJlIG9wdGlvbmFsOyBpbXBsZW1lbnQgb25seSB3aGF0IHlvdSBjYXJlIGFib3V0LiBSZWNvcmRlcnNcbiAqIGFyZSBpbnZva2VkIHN5bmNocm9ub3VzbHkgaW4gYXR0YWNobWVudCBvcmRlci4gSWYgYSByZWNvcmRlciB0aHJvd3MsIHRoZVxuICogZXJyb3IgaXMgY2F1Z2h0IGFuZCBpc29sYXRlZCDigJQgb3RoZXIgcmVjb3JkZXJzIGNvbnRpbnVlIHRvIHJlY2VpdmUgdGhlXG4gKiBldmVudCBhbmQgdGhlIGVtaXR0aW5nIHN0YWdlIGlzIHVuYWZmZWN0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1pdFJlY29yZGVyIHtcbiAgLyoqXG4gICAqIFN0YWJsZSBpZGVudGlmaWVyIGZvciBpZGVtcG90ZW50IGF0dGFjaC9kZXRhY2guIFJlLWF0dGFjaGluZyB3aXRoIHRoZVxuICAgKiBzYW1lIGlkIHJlcGxhY2VzIHRoZSBwcmV2aW91cyByZWdpc3RyYXRpb24gb24gdGhlIGV4ZWN1dG9yLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogQ2FsbGVkIGZvciBldmVyeSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGNhbGwgaW4gYW55IHN0YWdlLiAqL1xuICBvbkVtaXQ/KGV2ZW50OiBFbWl0RXZlbnQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbDogcmVzZXQgcmVjb3JkZXItaW50ZXJuYWwgc3RhdGUgYmV0d2VlbiBydW5zLiBDYWxsZWQgYnkgdGhlXG4gICAqIGV4ZWN1dG9yIGJlZm9yZSBlYWNoIGBydW4oKWAuXG4gICAqL1xuICBjbGVhcj8oKTogdm9pZDtcblxuICAvKipcbiAgICogT3B0aW9uYWw6IGV4cG9zZSBjb2xsZWN0ZWQgZGF0YSBmb3IgaW5jbHVzaW9uIGluXG4gICAqIGBleGVjdXRvci5nZXRTbmFwc2hvdCgpLnJlY29yZGVyc2AuXG4gICAqL1xuICB0b1NuYXBzaG90PygpOiBSZWNvcmRlckJ1bmRsZTtcbn1cbiJdfQ==
@@ -33,6 +33,18 @@
33
33
  * (it means "in progress" or "paused"). The `getBoundary()` helper
34
34
  * returns `{ entry, exit: undefined }` in that case.
35
35
  *
36
+ * Attempts (10.1):
37
+ * An `exit` entry carries `attempts` — the count of attempts made inside
38
+ * the boundary, at any depth, by outcome, and how many series gave up —
39
+ * and `failedAttempts`, the failed / timed-out / aborted ones by name. Only
40
+ * series that retried, gave up or timed out count (`recorder/attemptSeries.ts ·
41
+ * isRetryEvidence`), so both fields are absent when nothing retried, and a
42
+ * boundary pair says what it cost to get through. An `entry` never carries
43
+ * them: the cost is known only at the exit — so a boundary that never
44
+ * exits (a run or subflow that failed, e.g. because a stage gave up, or a
45
+ * pause) carries no count; the attempts are then on the execution tree and
46
+ * the attempt-aware recorders (Topology, Debug, Quality).
47
+ *
36
48
  * Redaction:
37
49
  * Payload redaction is the engine's responsibility (`RedactionPolicy`).
38
50
  * By the time payloads reach this recorder via `FlowSubflowEvent` or
@@ -63,7 +75,8 @@
63
75
  * .filter((b) => b.subflowPath[1] === 'sf-agent'); // path[0] is the root
64
76
  * ```
65
77
  */
66
- import type { FlowRecorder, FlowRunEvent, FlowSubflowEvent } from '../engine/narrative/types.js';
78
+ import type { FlowAttemptEvent, FlowRecorder, FlowRunEvent, FlowSubflowEvent } from '../engine/narrative/types.js';
79
+ import type { AttemptOutcomeCounts, AttemptRef } from './attemptSeries.js';
67
80
  export type InOutPhase = 'entry' | 'exit';
68
81
  /** Synthetic id for the top-level run's boundary pair. */
69
82
  export declare const ROOT_SUBFLOW_ID = "__root__";
@@ -111,6 +124,20 @@ export interface InOutEntry {
111
124
  * Lens uses this to render the root pair as `user → run → user` instead of
112
125
  * the regular subflow shape. */
113
126
  readonly isRoot: boolean;
127
+ /** `phase: 'exit'` only, and only when something inside retried, gave up or timed out — see {@link InOutAttempts}. */
128
+ readonly attempts?: InOutAttempts;
129
+ /** With `attempts`: the attempts inside that failed, timed out or were aborted, in the order they ended. */
130
+ readonly failedAttempts?: readonly AttemptRef[];
131
+ }
132
+ /**
133
+ * What it cost to get through a boundary: the attempts made inside it (at any depth) by series that retried, gave
134
+ * up or timed out — `count`, per outcome (`timeout` included), and how many of those series gave up (`exhausted`,
135
+ * `declined`, `no-time-left`).
136
+ */
137
+ export interface InOutAttempts {
138
+ readonly count: number;
139
+ readonly byOutcome: AttemptOutcomeCounts;
140
+ readonly gaveUp: number;
114
141
  }
115
142
  export interface InOutRecorderOptions {
116
143
  /** ScopeRecorder id. Defaults to `inout-N` (auto-incremented). */
@@ -132,11 +159,20 @@ export declare class InOutRecorder implements FlowRecorder {
132
159
  readonly id: string;
133
160
  /** 1:N ordered storage with per-step index (Convention 1 — composed). */
134
161
  private readonly store;
162
+ /** The root run's attempts — every attempt is inside it. */
163
+ private rootAttempts;
164
+ /** Open subflow boundaries' attempts, by path-prefixed subflowId. */
165
+ private readonly openAttempts;
135
166
  constructor(options?: InOutRecorderOptions);
136
167
  onRunStart(event: FlowRunEvent): void;
137
168
  onRunEnd(event: FlowRunEvent): void;
138
169
  onSubflowEntry(event: FlowSubflowEvent): void;
139
170
  onSubflowExit(event: FlowSubflowEvent): void;
171
+ /**
172
+ * Counts an attempt in the root boundary and in every open subflow boundary that contains the stage — the
173
+ * subflow the stage ran in is that subflow's id or below it.
174
+ */
175
+ onAttempt(event: FlowAttemptEvent): void;
140
176
  /** All entries in execution order (entry+exit interleaved). */
141
177
  getBoundaries(): InOutEntry[];
142
178
  /** Entry/exit pair for one chart execution.
@@ -33,6 +33,18 @@
33
33
  * (it means "in progress" or "paused"). The `getBoundary()` helper
34
34
  * returns `{ entry, exit: undefined }` in that case.
35
35
  *
36
+ * Attempts (10.1):
37
+ * An `exit` entry carries `attempts` — the count of attempts made inside
38
+ * the boundary, at any depth, by outcome, and how many series gave up —
39
+ * and `failedAttempts`, the failed / timed-out / aborted ones by name. Only
40
+ * series that retried, gave up or timed out count (`recorder/attemptSeries.ts ·
41
+ * isRetryEvidence`), so both fields are absent when nothing retried, and a
42
+ * boundary pair says what it cost to get through. An `entry` never carries
43
+ * them: the cost is known only at the exit — so a boundary that never
44
+ * exits (a run or subflow that failed, e.g. because a stage gave up, or a
45
+ * pause) carries no count; the attempts are then on the execution tree and
46
+ * the attempt-aware recorders (Topology, Debug, Quality).
47
+ *
36
48
  * Redaction:
37
49
  * Payload redaction is the engine's responsibility (`RedactionPolicy`).
38
50
  * By the time payloads reach this recorder via `FlowSubflowEvent` or
@@ -64,11 +76,36 @@
64
76
  * ```
65
77
  */
66
78
  import { idPathSegments as pathSegments } from 'foottrace';
79
+ import { attemptFailed, attemptRef, emptyOutcomeCounts, gaveUp, isRetryEvidence, subflowOfAttempt, } from './attemptSeries.js';
67
80
  import { SequenceStore } from './SequenceStore.js';
68
81
  /** Synthetic id for the top-level run's boundary pair. */
69
82
  export const ROOT_SUBFLOW_ID = '__root__';
70
83
  /** Synthetic runtimeStageId for the top-level run boundary pair. */
71
84
  export const ROOT_RUNTIME_STAGE_ID = '__root__#0';
85
+ /** Attempts accumulated inside one open boundary. */
86
+ class BoundaryAttempts {
87
+ count = 0;
88
+ byOutcome = emptyOutcomeCounts();
89
+ gaveUp = 0;
90
+ failed = [];
91
+ add(outcome, gave, failed) {
92
+ this.count += 1;
93
+ this.byOutcome[outcome] += 1;
94
+ if (gave)
95
+ this.gaveUp += 1;
96
+ if (failed)
97
+ this.failed.push(failed);
98
+ }
99
+ /** The exit entry's fields — none when nothing retried inside. */
100
+ fields() {
101
+ if (this.count === 0)
102
+ return {};
103
+ return {
104
+ attempts: { count: this.count, byOutcome: { ...this.byOutcome }, gaveUp: this.gaveUp },
105
+ failedAttempts: [...this.failed],
106
+ };
107
+ }
108
+ }
72
109
  let _counter = 0;
73
110
  /**
74
111
  * Factory — matches the `topologyRecorder()` / `narrative()` style.
@@ -88,25 +125,55 @@ export class InOutRecorder {
88
125
  id;
89
126
  /** 1:N ordered storage with per-step index (Convention 1 — composed). */
90
127
  store = new SequenceStore();
128
+ /** The root run's attempts — every attempt is inside it. */
129
+ rootAttempts = new BoundaryAttempts();
130
+ /** Open subflow boundaries' attempts, by path-prefixed subflowId. */
131
+ openAttempts = new Map();
91
132
  constructor(options = {}) {
92
133
  this.id = options.id ?? `inout-${++_counter}`;
93
134
  }
94
135
  // ── FlowRecorder hooks ────────────────────────────────────────────────
95
136
  onRunStart(event) {
137
+ this.rootAttempts = new BoundaryAttempts();
138
+ this.openAttempts.clear();
96
139
  this.store.push(buildRootEntry('entry', event.payload));
97
140
  }
98
141
  onRunEnd(event) {
99
- this.store.push(buildRootEntry('exit', event.payload));
142
+ this.store.push({ ...buildRootEntry('exit', event.payload), ...this.rootAttempts.fields() });
100
143
  }
101
144
  onSubflowEntry(event) {
102
145
  const entry = buildSubflowEntry(event, 'entry');
103
- if (entry)
104
- this.store.push(entry);
146
+ if (!entry)
147
+ return;
148
+ this.openAttempts.set(entry.subflowId, new BoundaryAttempts());
149
+ this.store.push(entry);
105
150
  }
106
151
  onSubflowExit(event) {
107
152
  const entry = buildSubflowEntry(event, 'exit');
108
- if (entry)
109
- this.store.push(entry);
153
+ if (!entry)
154
+ return;
155
+ const attempts = this.openAttempts.get(entry.subflowId);
156
+ this.openAttempts.delete(entry.subflowId);
157
+ this.store.push(attempts ? { ...entry, ...attempts.fields() } : entry);
158
+ }
159
+ /**
160
+ * Counts an attempt in the root boundary and in every open subflow boundary that contains the stage — the
161
+ * subflow the stage ran in is that subflow's id or below it.
162
+ */
163
+ onAttempt(event) {
164
+ const { record } = event;
165
+ if (!isRetryEvidence(record))
166
+ return;
167
+ const gave = gaveUp(record);
168
+ const failed = attemptFailed(record) ? attemptRef(record) : undefined;
169
+ this.rootAttempts.add(record.outcome, gave, failed);
170
+ const path = subflowOfAttempt(event);
171
+ if (path === undefined)
172
+ return;
173
+ for (const [subflowId, attempts] of this.openAttempts) {
174
+ if (path === subflowId || path.startsWith(`${subflowId}/`))
175
+ attempts.add(record.outcome, gave, failed);
176
+ }
110
177
  }
111
178
  // ── Query API ─────────────────────────────────────────────────────────
112
179
  /** All entries in execution order (entry+exit interleaved). */
@@ -150,6 +217,8 @@ export class InOutRecorder {
150
217
  /** Clear all stored boundaries — called by the executor before each run(). */
151
218
  clear() {
152
219
  this.store.clear();
220
+ this.rootAttempts = new BoundaryAttempts();
221
+ this.openAttempts.clear();
153
222
  }
154
223
  /** The root run's entry/exit pair, if the run has started.
155
224
  * Convenience for consumers that want to bracket the timeline by the
@@ -222,4 +291,4 @@ function buildSubflowEntry(event, phase) {
222
291
  isRoot: false,
223
292
  };
224
293
  }
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5PdXRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdFRztBQUVILE9BQU8sRUFBRSxjQUFjLElBQUksWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU1uRCwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQztBQUUxQyxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsWUFBWSxDQUFDO0FBbURsRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFVBQWdDLEVBQUU7SUFDOUQsT0FBTyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ2YsRUFBRSxDQUFTO0lBQ3BCLHlFQUF5RTtJQUN4RCxLQUFLLEdBQUcsSUFBSSxhQUFhLEVBQWMsQ0FBQztJQUV6RCxZQUFZLFVBQWdDLEVBQUU7UUFDNUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQseUVBQXlFO0lBRXpFLFVBQVUsQ0FBQyxLQUFtQjtRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxRQUFRLENBQUMsS0FB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ZXMgZXZlcnkgY2hhcnQncyBpbnB1dC9vdXRwdXQgYXMgZW50cnkvZXhpdCBwYWlycy5cbiAqXG4gKiBUaGUgZ2FwIHRoaXMgZmlsbHM6XG4gKiAgIEV2ZXJ5IGNoYXJ0IGluIGZvb3RwcmludGpzIGhhcyB0d28gbmF0dXJhbCBkYXRhIGJvdW5kYXJpZXM6XG4gKiAgICAgLSB0aGUgKippbnB1dCoqIHRoYXQgZmxvd2VkIGluICh0b3AtbGV2ZWw6IGBydW4oe2lucHV0fSlgO1xuICogICAgICAgc3ViZmxvdzogYGlucHV0TWFwcGVyYCByZXN1bHQpXG4gKiAgICAgLSB0aGUgKipvdXRwdXQqKiB0aGF0IGZsb3dlZCBvdXQgKHRvcC1sZXZlbDogY2hhcnQgcmV0dXJuIHZhbHVlO1xuICogICAgICAgc3ViZmxvdzogc2hhcmVkIHN0YXRlIGF0IGV4aXQgLyBgb3V0cHV0TWFwcGVyYCByZXN1bHQpXG4gKlxuICogICBUb2dldGhlciB3aXRoIGBUb3BvbG9neVJlY29yZGVyYCAoY29tcG9zaXRpb24gc2hhcGUpIHRoaXMgaXMgdGhlXG4gKiAgIHVuaXZlcnNhbCBcInN0ZXBcIiBwcmltaXRpdmUgdGhhdCBkb3duc3RyZWFtIGxheWVycyBwcm9qZWN0IOKAlCBhIExlbnNcbiAqICAgU3RlcEdyYXBoLCBhIFRyYWNlIHZpZXcsIGN1c3RvbSBkYXNoYm9hcmRzLiBBbGwgYmluZCBieSBgcnVudGltZVN0YWdlSWRgLlxuICpcbiAqICAgVGhlIHJvb3QgY2hhcnQgaXMgdHJlYXRlZCBpZGVudGljYWxseSB0byBhbnkgc3ViZmxvdzogYW4gYGVudHJ5YFxuICogICBib3VuZGFyeSBvbiBgb25SdW5TdGFydGAgYW5kIGFuIGBleGl0YCBib3VuZGFyeSBvbiBgb25SdW5FbmRgLCB3aXRoXG4gKiAgIGBzdWJmbG93SWQ6ICdfX3Jvb3RfXydgLiBTbyBjb25zdW1lcnMgYnVpbGRpbmcgXCJldmVyeSBzdGVwIGhhcyBhblxuICogICBpbi9vdXQgYXJyb3dcIiB2aWV3cyBjYW4gY2xvc2UgdGhlIGNoYWluIGF0IHRoZSB0b3AgbGV2ZWwg4oCUIG5vXG4gKiAgIHNwZWNpYWwtY2FzZSByZW5kZXJpbmcgcmVxdWlyZWQuXG4gKlxuICogVHdvIGJvdW5kYXJ5IHBoYXNlcyBwZXIgY2hhcnQgZXhlY3V0aW9uOlxuICogICAxLiBgcGhhc2U6ICdlbnRyeSdgIOKAlCBwYXlsb2FkID0gdGhlIGlucHV0IGNyb3NzaW5nIHRoZSBib3VuZGFyeSBJTlxuICogICAyLiBgcGhhc2U6ICdleGl0J2AgIOKAlCBwYXlsb2FkID0gdGhlIG91dHB1dCBjcm9zc2luZyB0aGUgYm91bmRhcnkgT1VUXG4gKlxuICogICBMb29wcyByZS1lbnRlcmluZyB0aGUgc2FtZSBzdWJmbG93IGdldCBkaXN0aW5jdCBgcnVudGltZVN0YWdlSWRgc1xuICogICBhdXRvbWF0aWNhbGx5IChwYXJlbnQgc3RhZ2UncyBleGVjdXRpb25JbmRleCBpbmNyZW1lbnRzIHBlciBpdGVyYXRpb24pLlxuICpcbiAqIFBhdXNlIHNlbWFudGljczpcbiAqICAgV2hlbiBhIHN0YWdlIHBhdXNlcyBpbnNpZGUgYSBzdWJmbG93LCB0aGUgZW5naW5lIHJlLXRocm93cyB0aGUgcGF1c2VcbiAqICAgc2lnbmFsIHdpdGhvdXQgZmlyaW5nIGBvblN1YmZsb3dFeGl0YCAob3IgYG9uUnVuRW5kYCkuIFRoZSBzdWJmbG93XG4gKiAgIGhhcyBhbiBgZW50cnlgIHdpdGggbm8gbWF0Y2hpbmcgYGV4aXRgIHVudGlsIHRoZSBydW4gcmVzdW1lcyBhbmRcbiAqICAgZXhpdHMgY2xlYW5seS4gQ29uc3VtZXJzIHNob3VsZCBoYW5kbGUgZW50cnktd2l0aG91dC1leGl0IGdyYWNlZnVsbHlcbiAqICAgKGl0IG1lYW5zIFwiaW4gcHJvZ3Jlc3NcIiBvciBcInBhdXNlZFwiKS4gVGhlIGBnZXRCb3VuZGFyeSgpYCBoZWxwZXJcbiAqICAgcmV0dXJucyBgeyBlbnRyeSwgZXhpdDogdW5kZWZpbmVkIH1gIGluIHRoYXQgY2FzZS5cbiAqXG4gKiBSZWRhY3Rpb246XG4gKiAgIFBheWxvYWQgcmVkYWN0aW9uIGlzIHRoZSBlbmdpbmUncyByZXNwb25zaWJpbGl0eSAoYFJlZGFjdGlvblBvbGljeWApLlxuICogICBCeSB0aGUgdGltZSBwYXlsb2FkcyByZWFjaCB0aGlzIHJlY29yZGVyIHZpYSBgRmxvd1N1YmZsb3dFdmVudGAgb3JcbiAqICAgYEZsb3dSdW5FdmVudGAsIG5hbWVkIHZhbHVlcyBoYXZlIHBhc3NlZCB0aGUgcnVuJ3MgcnVsZS4gUm9vdCBydW5cbiAqICAgcGF5bG9hZHMgYXJlIHdhbGtlZCBhdCBldmVyeSBkZXB0aCAoYSBuZXN0ZWQga2V5IGJ5IGl0cyBvd24gbmFtZSBvclxuICogICBkb3R0ZWQgcGF0aCkgcGx1cyBleHBsaWNpdCBuZXN0ZWQgZmllbGRzOyBzY2FsYXJzIHBhc3MgdGhyb3VnaCwgYW5kIGZvcmtcbiAqICAgY2hpbGQtSUQgZW52ZWxvcGVzIG5lZWQgZXhwbGljaXQgcmVzdWx0IHBhdGhzLiBUaGlzIGlzIG5vdCBjb250ZW50IHNjYW5uaW5nLiBUaGUgcmVjb3JkZXJcbiAqICAgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90KSByZS1yZWRhY3Qgb3IgcmVjb25zdHJ1Y3QgdGhlIHJ1bi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgaW5PdXRSZWNvcmRlciB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbiAqXG4gKiBjb25zdCBpbk91dCA9IGluT3V0UmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoaW5PdXQpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKlxuICogaW5PdXQuZ2V0U3RlcHMoKTsgICAgICAgICAgICAgICAgICAgIC8vIGVudHJ5IGJvdW5kYXJpZXMg4oCUIHRpbWVsaW5lIHByb2plY3Rpb25cbiAqIGluT3V0LmdldEJvdW5kYXJ5KHJ1bnRpbWVTdGFnZUlkKTsgICAvLyB7IGVudHJ5LCBleGl0IH0gcGFpciBmb3Igb25lIGV4ZWN1dGlvblxuICogaW5PdXQuZ2V0Qm91bmRhcmllcygpOyAgICAgICAgICAgICAgIC8vIGZsYXQgbGlzdCAoZW50cnkrZXhpdCBpbnRlcmxlYXZlZClcbiAqIGluT3V0LmdldFJvb3RCb3VuZGFyeSgpOyAgICAgICAgICAgICAvLyB7IGVudHJ5LCBleGl0IH0gZm9yIHRoZSB0b3AtbGV2ZWwgcnVuXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBGaWx0ZXJpbmcgYnkgc3ViZmxvdyBwYXRoXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBhZ2VudFN0ZXBzID0gaW5PdXRcbiAqICAgLmdldFN0ZXBzKClcbiAqICAgLmZpbHRlcigoYikgPT4gYi5zdWJmbG93UGF0aFsxXSA9PT0gJ3NmLWFnZW50Jyk7ICAvLyBwYXRoWzBdIGlzIHRoZSByb290XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBpZFBhdGhTZWdtZW50cyBhcyBwYXRoU2VnbWVudHMgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciwgRmxvd1J1bkV2ZW50LCBGbG93U3ViZmxvd0V2ZW50IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBTZXF1ZW5jZVN0b3JlIH0gZnJvbSAnLi9TZXF1ZW5jZVN0b3JlLmpzJztcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgdHlwZSBJbk91dFBoYXNlID0gJ2VudHJ5JyB8ICdleGl0JztcblxuLyoqIFN5bnRoZXRpYyBpZCBmb3IgdGhlIHRvcC1sZXZlbCBydW4ncyBib3VuZGFyeSBwYWlyLiAqL1xuZXhwb3J0IGNvbnN0IFJPT1RfU1VCRkxPV19JRCA9ICdfX3Jvb3RfXyc7XG5cbi8qKiBTeW50aGV0aWMgcnVudGltZVN0YWdlSWQgZm9yIHRoZSB0b3AtbGV2ZWwgcnVuIGJvdW5kYXJ5IHBhaXIuICovXG5leHBvcnQgY29uc3QgUk9PVF9SVU5USU1FX1NUQUdFX0lEID0gJ19fcm9vdF9fIzAnO1xuXG4vKipcbiAqIE9uZSBoYWxmIG9mIGEgY2hhcnQgZXhlY3V0aW9uIGJvdW5kYXJ5LiBFbnRyeS9leGl0IHBhaXJzIHNoYXJlIGBydW50aW1lU3RhZ2VJZGAuXG4gKlxuICogTmFtaW5nIGZvbGxvd3MgdGhlIGVuZ2luZTogYHN1YmZsb3dJZGAgaXMgdGhlIHBhdGgtcHJlZml4ZWQgaWRlbnRpZmllciB0aGVcbiAqIGVuZ2luZSBlbWl0cyAoZS5nLiBgJ3NmLW91dGVyL3NmLWlubmVyJ2AgZm9yIG5lc3RlZCBzdWJmbG93cykuIEZvciB0aGVcbiAqIHRvcC1sZXZlbCBydW4sIGl0J3MgdGhlIHN5bnRoZXRpYyBgJ19fcm9vdF9fJ2AuIGBzdWJmbG93UGF0aGAgaXMgdGhlXG4gKiBkZWNvbXBvc2l0aW9uIGludG8gc2VnbWVudHMg4oCUIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgYmVjYXVzZSBjb25zdW1lcnNcbiAqIG9mdGVuIHF1ZXJ5IC8gZ3JvdXAgYnkgdGhlIHBhdGggdHJlZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbk91dEVudHJ5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIOKAlCBzYW1lIHZhbHVlIGZvciB0aGUgZW50cnkvZXhpdCBwYWlyIG9mIG9uZSBleGVjdXRpb24uXG4gICAqICBUb3AtbGV2ZWwgcnVuIHVzZXMgdGhlIHN5bnRoZXRpYyBgUk9PVF9SVU5USU1FX1NUQUdFX0lEYC4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFBhdGgtcHJlZml4ZWQgc3ViZmxvdyBpZGVudGlmaWVyIChtYXRjaGVzIHRoZSBlbmdpbmUncyBgRmxvd1N1YmZsb3dFdmVudC5zdWJmbG93SWRgKS5cbiAgICogIFRvcC1sZXZlbCDihpIgYCdfX3Jvb3RfXydgLiBTdWJmbG93IOKGkiBgJ3NmLW91dGVyJ2Agb3IgYCdzZi1vdXRlci9zZi1pbm5lcidgLiAqL1xuICByZWFkb25seSBzdWJmbG93SWQ6IHN0cmluZztcbiAgLyoqIExhc3Qgc2VnbWVudCBvZiBgc3ViZmxvd0lkYCDigJQgY29udmVuaWVuY2UgZm9yIGNvbnN1bWVycyB0aGF0IGdyb3VwIGJ5IGxlYWYgbmFtZS5cbiAgICogIFRvcC1sZXZlbCDihpIgYCdfX3Jvb3RfXydgLiAqL1xuICByZWFkb25seSBsb2NhbFN1YmZsb3dJZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGlzcGxheSBuYW1lIChmcm9tIHRoZSBidWlsZGVyOyBgJ1J1bidgIGZvciB0aGUgdG9wLWxldmVsIHJ1bikuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dOYW1lOiBzdHJpbmc7XG4gIC8qKiBCdWlsZC10aW1lIGRlc2NyaXB0aW9uIGZyb20gdGhlIHN1YmZsb3cncyByb290IHN0YWdlLlxuICAgKiAgQ2FycmllcyB0YXhvbm9teSBtYXJrZXJzIChlLmcuIGAnQWdlbnQ6IFJlQWN0IGxvb3AnYCkuIFVuZGVmaW5lZCBmb3Igcm9vdC4gKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBEZWNvbXBvc2l0aW9uIG9mIGBzdWJmbG93SWRgIGludG8gc2VnbWVudHMuIFRvcC1sZXZlbCDihpIgYFsnX19yb290X18nXWAuXG4gICAqICBTdWJmbG93cyBsaXZlIFVOREVSIHRoZSByb290OiBhIHRvcC1sZXZlbCBzdWJmbG93IGhhcyBwYXRoIGBbJ19fcm9vdF9fJywgJ3NmLXgnXWAuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIERlcHRoIGluIHRoZSBzdWJmbG93IHRyZWUuIFJvb3Qg4oaSIDAuIEZpcnN0LWxldmVsIHN1YmZsb3cg4oaSIDEuICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG4gIC8qKiBXaGljaCBzaWRlIG9mIHRoZSBib3VuZGFyeSB0aGlzIGVudHJ5IHJlcHJlc2VudHMuICovXG4gIHJlYWRvbmx5IHBoYXNlOiBJbk91dFBoYXNlO1xuICAvKiogRGF0YSBjcm9zc2luZyB0aGUgYm91bmRhcnkuXG4gICAqICAtIGBwaGFzZTogJ2VudHJ5J2Ag4oaSIGBpbnB1dE1hcHBlcmAgcmVzdWx0IChzdWJmbG93KSBvciBgcnVuKHtpbnB1dH0pYCAocm9vdClcbiAgICogIC0gYHBoYXNlOiAnZXhpdCdgICDihpIgc3ViZmxvdyBzaGFyZWQgc3RhdGUgYXQgZXhpdCAoc3ViZmxvdykgb3IgY2hhcnQgcmV0dXJuIHZhbHVlIChyb290KVxuICAgKlxuICAgKiAgVW5kZWZpbmVkIHdoZW4gbm8gbWFwcGVyIC8gbm8gaW5wdXQgd2FzIHByb3ZpZGVkLiAqL1xuICByZWFkb25seSBwYXlsb2FkPzogdW5rbm93bjtcbiAgLyoqIFRydWUgd2hlbiB0aGlzIGVudHJ5IGNhbWUgZnJvbSB0aGUgdG9wLWxldmVsIHJ1biAoYG9uUnVuU3RhcnRgIC8gYG9uUnVuRW5kYClcbiAgICogIHJhdGhlciB0aGFuIGZyb20gYSBzdWJmbG93IChgb25TdWJmbG93RW50cnlgIC8gYG9uU3ViZmxvd0V4aXRgKS5cbiAgICogIExlbnMgdXNlcyB0aGlzIHRvIHJlbmRlciB0aGUgcm9vdCBwYWlyIGFzIGB1c2VyIOKGkiBydW4g4oaSIHVzZXJgIGluc3RlYWQgb2ZcbiAgICogIHRoZSByZWd1bGFyIHN1YmZsb3cgc2hhcGUuICovXG4gIHJlYWRvbmx5IGlzUm9vdDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbk91dFJlY29yZGVyT3B0aW9ucyB7XG4gIC8qKiBTY29wZVJlY29yZGVyIGlkLiBEZWZhdWx0cyB0byBgaW5vdXQtTmAgKGF1dG8taW5jcmVtZW50ZWQpLiAqL1xuICBpZD86IHN0cmluZztcbn1cblxubGV0IF9jb3VudGVyID0gMDtcblxuLyoqXG4gKiBGYWN0b3J5IOKAlCBtYXRjaGVzIHRoZSBgdG9wb2xvZ3lSZWNvcmRlcigpYCAvIGBuYXJyYXRpdmUoKWAgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbk91dFJlY29yZGVyKG9wdGlvbnM6IEluT3V0UmVjb3JkZXJPcHRpb25zID0ge30pOiBJbk91dFJlY29yZGVyIHtcbiAgcmV0dXJuIG5ldyBJbk91dFJlY29yZGVyKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFN0YXRlZnVsIGFjY3VtdWxhdG9yIHRoYXQgd2F0Y2hlcyBgRmxvd1JlY29yZGVyYCBjaGFydC1ib3VuZGFyeSBldmVudHNcbiAqIChydW4gc3RhcnQvZW5kICsgc3ViZmxvdyBlbnRyeS9leGl0KSBhbmQgcHVzaGVzIGBJbk91dEVudHJ5YCByZWNvcmRzIHRvXG4gKiBpdHMgY29tcG9zZWQgYFNlcXVlbmNlU3RvcmVgIChDb252ZW50aW9uIDEg4oCUIG9uZSBwdXJwb3NlIHBlciByZWNvcmRlcikuXG4gKlxuICogQXR0YWNoIHZpYSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcilgIOKAlCBmb290cHJpbnRqc1xuICogZGV0ZWN0cyB0aGUgYEZsb3dSZWNvcmRlcmAgbWV0aG9kIHNoYXBlIGFuZCByb3V0ZXMgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgSW5PdXRSZWNvcmRlciBpbXBsZW1lbnRzIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIC8qKiAxOk4gb3JkZXJlZCBzdG9yYWdlIHdpdGggcGVyLXN0ZXAgaW5kZXggKENvbnZlbnRpb24gMSDigJQgY29tcG9zZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gbmV3IFNlcXVlbmNlU3RvcmU8SW5PdXRFbnRyeT4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbk91dFJlY29yZGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQgPz8gYGlub3V0LSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblJ1blN0YXJ0KGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnB1c2goYnVpbGRSb290RW50cnkoJ2VudHJ5JywgZXZlbnQucGF5bG9hZCkpO1xuICB9XG5cbiAgb25SdW5FbmQoZXZlbnQ6IEZsb3dSdW5FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucHVzaChidWlsZFJvb3RFbnRyeSgnZXhpdCcsIGV2ZW50LnBheWxvYWQpKTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSBidWlsZFN1YmZsb3dFbnRyeShldmVudCwgJ2VudHJ5Jyk7XG4gICAgaWYgKGVudHJ5KSB0aGlzLnN0b3JlLnB1c2goZW50cnkpO1xuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gYnVpbGRTdWJmbG93RW50cnkoZXZlbnQsICdleGl0Jyk7XG4gICAgaWYgKGVudHJ5KSB0aGlzLnN0b3JlLnB1c2goZW50cnkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJ5IEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQWxsIGVudHJpZXMgaW4gZXhlY3V0aW9uIG9yZGVyIChlbnRyeStleGl0IGludGVybGVhdmVkKS4gKi9cbiAgZ2V0Qm91bmRhcmllcygpOiBJbk91dEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEFsbCgpO1xuICB9XG5cbiAgLyoqIEVudHJ5L2V4aXQgcGFpciBmb3Igb25lIGNoYXJ0IGV4ZWN1dGlvbi5cbiAgICogIFJldHVybnMgYHsgZW50cnksIGV4aXQgfWAg4oCUIGBleGl0YCBpcyBgdW5kZWZpbmVkYCBmb3IgaW4tcHJvZ3Jlc3MgLyBwYXVzZWRcbiAgICogIGNoYXJ0cyBvciBpZiBgcnVudGltZVN0YWdlSWRgIGlzIHVua25vd24uICovXG4gIGdldEJvdW5kYXJ5KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiB7IGVudHJ5PzogSW5PdXRFbnRyeTsgZXhpdD86IEluT3V0RW50cnkgfSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMuc3RvcmUuZ2V0QnlLZXkocnVudGltZVN0YWdlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBlbnRyeTogZW50cmllcy5maW5kKChlKSA9PiBlLnBoYXNlID09PSAnZW50cnknKSxcbiAgICAgIGV4aXQ6IGVudHJpZXMuZmluZCgoZSkgPT4gZS5waGFzZSA9PT0gJ2V4aXQnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEp1c3QgdGhlIGBlbnRyeWAtcGhhc2UgYm91bmRhcmllcyDigJQgdGhlIFwic3RlcCBsaXN0XCIgcHJvamVjdGlvbiBpblxuICAgKiAgZXhlY3V0aW9uIG9yZGVyLiBUaGlzIGlzIHRoZSBuYXR1cmFsIHRpbWVsaW5lIG9mIGNoYXJ0IGV4ZWN1dGlvbnNcbiAgICogIGZvciBzbGlkZXIgLyBzY3J1YmJpbmcgVUlzLiBUaGUgdG9wLWxldmVsIHJ1bidzIGVudHJ5IGlzIHRoZSBmaXJzdFxuICAgKiAgc3RlcCAoZGVwdGggMCkuICovXG4gIGdldFN0ZXBzKCk6IEluT3V0RW50cnlbXSB7XG4gICAgY29uc3Qgc3RlcHM6IEluT3V0RW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLnN0b3JlLmdldEFsbCgpKSB7XG4gICAgICBpZiAoYi5waGFzZSA9PT0gJ2VudHJ5Jykgc3RlcHMucHVzaChiKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzO1xuICB9XG5cbiAgLyoqIE8oMSkgbG9va3VwOiBhbGwgYm91bmRhcnkgZW50cmllcyAoYm90aCBwaGFzZXMpIGZvciBvbmUgcnVudGltZVN0YWdlSWQuICovXG4gIGdldEVudHJpZXNGb3JTdGVwKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBJbk91dEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEJ5S2V5KHJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBQcmUtYnVpbHQgcGVyLXN0ZXAgcmFuZ2UgaW5kZXgg4oCUIE8oMSkgbG9va3VwcyBmb3IgdGltZS10cmF2ZWwgc2NydWJiaW5nLiAqL1xuICBnZXRFbnRyeVJhbmdlcygpOiBSZWFkb25seU1hcDxzdHJpbmcsIHsgcmVhZG9ubHkgZmlyc3RJZHg6IG51bWJlcjsgcmVhZG9ubHkgZW5kSWR4OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEVudHJ5UmFuZ2VzKCk7XG4gIH1cblxuICAvKiogUHJvZ3Jlc3NpdmUgcmV2ZWFsOiBib3VuZGFyaWVzIHdob3NlIHJ1bnRpbWVTdGFnZUlkIGlzIGluIHRoZSB2aXNpYmxlIHNldC4gKi9cbiAgZ2V0RW50cmllc1VwVG8odmlzaWJsZUlkczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IEluT3V0RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RW50cmllc1VwVG8odmlzaWJsZUlkcyk7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIHN0b3JlZCBib3VuZGFyaWVzIOKAlCBjYWxsZWQgYnkgdGhlIGV4ZWN1dG9yIGJlZm9yZSBlYWNoIHJ1bigpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmNsZWFyKCk7XG4gIH1cblxuICAvKiogVGhlIHJvb3QgcnVuJ3MgZW50cnkvZXhpdCBwYWlyLCBpZiB0aGUgcnVuIGhhcyBzdGFydGVkLlxuICAgKiAgQ29udmVuaWVuY2UgZm9yIGNvbnN1bWVycyB0aGF0IHdhbnQgdG8gYnJhY2tldCB0aGUgdGltZWxpbmUgYnkgdGhlXG4gICAqICBvdXRlcm1vc3QgaW4vb3V0LiAqL1xuICBnZXRSb290Qm91bmRhcnkoKTogeyBlbnRyeT86IEluT3V0RW50cnk7IGV4aXQ/OiBJbk91dEVudHJ5IH0ge1xuICAgIHJldHVybiB0aGlzLmdldEJvdW5kYXJ5KFJPT1RfUlVOVElNRV9TVEFHRV9JRCk7XG4gIH1cblxuICAvKiogU25hcHNob3QgYnVuZGxlIGZvciBpbmNsdXNpb24gaW4gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgLiAqL1xuICB0b1NuYXBzaG90KCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnSW5PdXQnLFxuICAgICAgZGVzY3JpcHRpb246ICdDaGFydCBpbi9vdXQgc3RyZWFtIOKAlCBlbnRyeS9leGl0IHBhaXJzIGF0IGV2ZXJ5IGNoYXJ0IGJvdW5kYXJ5IChyb290ICsgc3ViZmxvd3MpJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldEJvdW5kYXJpZXMoKSxcbiAgICB9O1xuICB9XG59XG5cbi8vIOKUgOKUgCBJbnRlcm5hbCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzeW50aGV0aWMgcm9vdCBlbnRyeS9leGl0LiBEZXB0aCBpcyBgMGAgYW5kIHRoZSBwYXRoIGlzXG4gKiBgW1JPT1RfU1VCRkxPV19JRF1gIHNvIGNvbnN1bWVycyBncm91cGluZyBieSBwYXRoIHNlZSB0aGUgcm9vdCBhcyBhXG4gKiByZWd1bGFyIHRvcC1sZXZlbCBjb250YWluZXIuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUm9vdEVudHJ5KHBoYXNlOiBJbk91dFBoYXNlLCBwYXlsb2FkOiB1bmtub3duKTogSW5PdXRFbnRyeSB7XG4gIHJldHVybiB7XG4gICAgcnVudGltZVN0YWdlSWQ6IFJPT1RfUlVOVElNRV9TVEFHRV9JRCxcbiAgICBzdWJmbG93SWQ6IFJPT1RfU1VCRkxPV19JRCxcbiAgICBsb2NhbFN1YmZsb3dJZDogUk9PVF9TVUJGTE9XX0lELFxuICAgIHN1YmZsb3dOYW1lOiAnUnVuJyxcbiAgICBzdWJmbG93UGF0aDogW1JPT1RfU1VCRkxPV19JRF0sXG4gICAgZGVwdGg6IDAsXG4gICAgcGhhc2UsXG4gICAgcGF5bG9hZCxcbiAgICBpc1Jvb3Q6IHRydWUsXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBzdWJmbG93IGBJbk91dEVudHJ5YCBmcm9tIGEgYEZsb3dTdWJmbG93RXZlbnRgLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgZXZlbnQgbGFja3MgYSBgc3ViZmxvd0lkYCAoYW5vbnltb3VzIC9cbiAqIG1hbGZvcm1lZCBzdWJmbG93IGV2ZW50cyDigJQgc2FtZSBkZWZlbnNpdmUgcG9saWN5IGFzIGBUb3BvbG9neVJlY29yZGVyYCkuXG4gKlxuICogUGF0aCBkZXJpdmF0aW9uOiB0aGUgZW5naW5lIGVtaXRzIGBzdWJmbG93SWRgIGFscmVhZHkgcHJlZml4ZWQgd2l0aCB0aGVcbiAqIGZ1bGwgcGF0aCBvZiBwYXJlbnQgc3ViZmxvd3MgKGUuZy4gYCdzZi1vdXRlci9zZi1pbm5lcidgKS4gV2UgZGVjb21wb3NlXG4gKiB0aGF0IGludG8gc2VnbWVudHMgdG8gcG9wdWxhdGUgYHN1YmZsb3dQYXRoYCBhbmQgY29tcHV0ZSBgZGVwdGhgLlxuICpcbiAqIFN1YmZsb3dzIG5lc3QgVU5ERVIgdGhlIHN5bnRoZXRpYyByb290IGluIGBzdWJmbG93UGF0aGAgc28gdGhlIHRyZWUgaXNcbiAqIGNvbXBsZXRlOiBhIHRvcC1sZXZlbCBzdWJmbG93IGhhcyBwYXRoIGBbJ19fcm9vdF9fJywgJ3NmLXgnXWAgYW5kIGRlcHRoIDEuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50LCBwaGFzZTogSW5PdXRQaGFzZSk6IEluT3V0RW50cnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdWJmbG93SWQgPSBldmVudC5zdWJmbG93SWQ7XG4gIGlmICghc3ViZmxvd0lkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHJ1bnRpbWVTdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aFNlZ21lbnRzKHN1YmZsb3dJZCk7XG4gIGNvbnN0IHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSA9IFtST09UX1NVQkZMT1dfSUQsIC4uLnNlZ21lbnRzXTtcbiAgY29uc3QgZGVwdGggPSBzdWJmbG93UGF0aC5sZW5ndGggLSAxO1xuICBjb25zdCBsb2NhbFN1YmZsb3dJZCA9IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdID8/IHN1YmZsb3dJZDtcbiAgY29uc3QgcGF5bG9hZCA9IHBoYXNlID09PSAnZW50cnknID8gZXZlbnQubWFwcGVkSW5wdXQgOiBldmVudC5vdXRwdXRTdGF0ZTtcblxuICByZXR1cm4ge1xuICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgIHN1YmZsb3dJZCxcbiAgICBsb2NhbFN1YmZsb3dJZCxcbiAgICBzdWJmbG93TmFtZTogZXZlbnQubmFtZSxcbiAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgc3ViZmxvd1BhdGgsXG4gICAgZGVwdGgsXG4gICAgcGhhc2UsXG4gICAgcGF5bG9hZCxcbiAgICBpc1Jvb3Q6IGZhbHNlLFxuICB9O1xufVxuIl19
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5PdXRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRFRztBQUVILE9BQU8sRUFBRSxjQUFjLElBQUksWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSzNELE9BQU8sRUFDTCxhQUFhLEVBQ2IsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZUFBZSxFQUNmLGdCQUFnQixHQUNqQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU1uRCwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQztBQUUxQyxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsWUFBWSxDQUFDO0FBa0RsRCxxREFBcUQ7QUFDckQsTUFBTSxnQkFBZ0I7SUFDWixLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ0QsU0FBUyxHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDMUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNGLE1BQU0sR0FBaUIsRUFBRSxDQUFDO0lBRTNDLEdBQUcsQ0FBQyxPQUF1QixFQUFFLElBQWEsRUFBRSxNQUE4QjtRQUN4RSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxN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RSxNQUFNLE9BQU8sR0FBRyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBRTFFLE9BQU87UUFDTCxjQUFjO1FBQ2QsU0FBUztRQUNULGNBQWM7UUFDZCxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUk7UUFDdkIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1FBQzlCLFdBQVc7UUFDWCxLQUFLO1FBQ0wsS0FBSztRQUNMLE9BQU87UUFDUCxNQUFNLEVBQUUsS0FBSztLQUNkLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbk91dFJlY29yZGVyIOKAlCBjYXB0dXJlcyBldmVyeSBjaGFydCdzIGlucHV0L291dHB1dCBhcyBlbnRyeS9leGl0IHBhaXJzLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczpcbiAqICAgRXZlcnkgY2hhcnQgaW4gZm9vdHByaW50anMgaGFzIHR3byBuYXR1cmFsIGRhdGEgYm91bmRhcmllczpcbiAqICAgICAtIHRoZSAqKmlucHV0KiogdGhhdCBmbG93ZWQgaW4gKHRvcC1sZXZlbDogYHJ1bih7aW5wdXR9KWA7XG4gKiAgICAgICBzdWJmbG93OiBgaW5wdXRNYXBwZXJgIHJlc3VsdClcbiAqICAgICAtIHRoZSAqKm91dHB1dCoqIHRoYXQgZmxvd2VkIG91dCAodG9wLWxldmVsOiBjaGFydCByZXR1cm4gdmFsdWU7XG4gKiAgICAgICBzdWJmbG93OiBzaGFyZWQgc3RhdGUgYXQgZXhpdCAvIGBvdXRwdXRNYXBwZXJgIHJlc3VsdClcbiAqXG4gKiAgIFRvZ2V0aGVyIHdpdGggYFRvcG9sb2d5UmVjb3JkZXJgIChjb21wb3NpdGlvbiBzaGFwZSkgdGhpcyBpcyB0aGVcbiAqICAgdW5pdmVyc2FsIFwic3RlcFwiIHByaW1pdGl2ZSB0aGF0IGRvd25zdHJlYW0gbGF5ZXJzIHByb2plY3Qg4oCUIGEgTGVuc1xuICogICBTdGVwR3JhcGgsIGEgVHJhY2UgdmlldywgY3VzdG9tIGRhc2hib2FyZHMuIEFsbCBiaW5kIGJ5IGBydW50aW1lU3RhZ2VJZGAuXG4gKlxuICogICBUaGUgcm9vdCBjaGFydCBpcyB0cmVhdGVkIGlkZW50aWNhbGx5IHRvIGFueSBzdWJmbG93OiBhbiBgZW50cnlgXG4gKiAgIGJvdW5kYXJ5IG9uIGBvblJ1blN0YXJ0YCBhbmQgYW4gYGV4aXRgIGJvdW5kYXJ5IG9uIGBvblJ1bkVuZGAsIHdpdGhcbiAqICAgYHN1YmZsb3dJZDogJ19fcm9vdF9fJ2AuIFNvIGNvbnN1bWVycyBidWlsZGluZyBcImV2ZXJ5IHN0ZXAgaGFzIGFuXG4gKiAgIGluL291dCBhcnJvd1wiIHZpZXdzIGNhbiBjbG9zZSB0aGUgY2hhaW4gYXQgdGhlIHRvcCBsZXZlbCDigJQgbm9cbiAqICAgc3BlY2lhbC1jYXNlIHJlbmRlcmluZyByZXF1aXJlZC5cbiAqXG4gKiBUd28gYm91bmRhcnkgcGhhc2VzIHBlciBjaGFydCBleGVjdXRpb246XG4gKiAgIDEuIGBwaGFzZTogJ2VudHJ5J2Ag4oCUIHBheWxvYWQgPSB0aGUgaW5wdXQgY3Jvc3NpbmcgdGhlIGJvdW5kYXJ5IElOXG4gKiAgIDIuIGBwaGFzZTogJ2V4aXQnYCAg4oCUIHBheWxvYWQgPSB0aGUgb3V0cHV0IGNyb3NzaW5nIHRoZSBib3VuZGFyeSBPVVRcbiAqXG4gKiAgIExvb3BzIHJlLWVudGVyaW5nIHRoZSBzYW1lIHN1YmZsb3cgZ2V0IGRpc3RpbmN0IGBydW50aW1lU3RhZ2VJZGBzXG4gKiAgIGF1dG9tYXRpY2FsbHkgKHBhcmVudCBzdGFnZSdzIGV4ZWN1dGlvbkluZGV4IGluY3JlbWVudHMgcGVyIGl0ZXJhdGlvbikuXG4gKlxuICogUGF1c2Ugc2VtYW50aWNzOlxuICogICBXaGVuIGEgc3RhZ2UgcGF1c2VzIGluc2lkZSBhIHN1YmZsb3csIHRoZSBlbmdpbmUgcmUtdGhyb3dzIHRoZSBwYXVzZVxuICogICBzaWduYWwgd2l0aG91dCBmaXJpbmcgYG9uU3ViZmxvd0V4aXRgIChvciBgb25SdW5FbmRgKS4gVGhlIHN1YmZsb3dcbiAqICAgaGFzIGFuIGBlbnRyeWAgd2l0aCBubyBtYXRjaGluZyBgZXhpdGAgdW50aWwgdGhlIHJ1biByZXN1bWVzIGFuZFxuICogICBleGl0cyBjbGVhbmx5LiBDb25zdW1lcnMgc2hvdWxkIGhhbmRsZSBlbnRyeS13aXRob3V0LWV4aXQgZ3JhY2VmdWxseVxuICogICAoaXQgbWVhbnMgXCJpbiBwcm9ncmVzc1wiIG9yIFwicGF1c2VkXCIpLiBUaGUgYGdldEJvdW5kYXJ5KClgIGhlbHBlclxuICogICByZXR1cm5zIGB7IGVudHJ5LCBleGl0OiB1bmRlZmluZWQgfWAgaW4gdGhhdCBjYXNlLlxuICpcbiAqIEF0dGVtcHRzICgxMC4xKTpcbiAqICAgQW4gYGV4aXRgIGVudHJ5IGNhcnJpZXMgYGF0dGVtcHRzYCDigJQgdGhlIGNvdW50IG9mIGF0dGVtcHRzIG1hZGUgaW5zaWRlXG4gKiAgIHRoZSBib3VuZGFyeSwgYXQgYW55IGRlcHRoLCBieSBvdXRjb21lLCBhbmQgaG93IG1hbnkgc2VyaWVzIGdhdmUgdXAg4oCUXG4gKiAgIGFuZCBgZmFpbGVkQXR0ZW1wdHNgLCB0aGUgZmFpbGVkIC8gdGltZWQtb3V0IC8gYWJvcnRlZCBvbmVzIGJ5IG5hbWUuIE9ubHlcbiAqICAgc2VyaWVzIHRoYXQgcmV0cmllZCwgZ2F2ZSB1cCBvciB0aW1lZCBvdXQgY291bnQgKGByZWNvcmRlci9hdHRlbXB0U2VyaWVzLnRzIMK3XG4gKiAgIGlzUmV0cnlFdmlkZW5jZWApLCBzbyBib3RoIGZpZWxkcyBhcmUgYWJzZW50IHdoZW4gbm90aGluZyByZXRyaWVkLCBhbmQgYVxuICogICBib3VuZGFyeSBwYWlyIHNheXMgd2hhdCBpdCBjb3N0IHRvIGdldCB0aHJvdWdoLiBBbiBgZW50cnlgIG5ldmVyIGNhcnJpZXNcbiAqICAgdGhlbTogdGhlIGNvc3QgaXMga25vd24gb25seSBhdCB0aGUgZXhpdCDigJQgc28gYSBib3VuZGFyeSB0aGF0IG5ldmVyXG4gKiAgIGV4aXRzIChhIHJ1biBvciBzdWJmbG93IHRoYXQgZmFpbGVkLCBlLmcuIGJlY2F1c2UgYSBzdGFnZSBnYXZlIHVwLCBvciBhXG4gKiAgIHBhdXNlKSBjYXJyaWVzIG5vIGNvdW50OyB0aGUgYXR0ZW1wdHMgYXJlIHRoZW4gb24gdGhlIGV4ZWN1dGlvbiB0cmVlIGFuZFxuICogICB0aGUgYXR0ZW1wdC1hd2FyZSByZWNvcmRlcnMgKFRvcG9sb2d5LCBEZWJ1ZywgUXVhbGl0eSkuXG4gKlxuICogUmVkYWN0aW9uOlxuICogICBQYXlsb2FkIHJlZGFjdGlvbiBpcyB0aGUgZW5naW5lJ3MgcmVzcG9uc2liaWxpdHkgKGBSZWRhY3Rpb25Qb2xpY3lgKS5cbiAqICAgQnkgdGhlIHRpbWUgcGF5bG9hZHMgcmVhY2ggdGhpcyByZWNvcmRlciB2aWEgYEZsb3dTdWJmbG93RXZlbnRgIG9yXG4gKiAgIGBGbG93UnVuRXZlbnRgLCBuYW1lZCB2YWx1ZXMgaGF2ZSBwYXNzZWQgdGhlIHJ1bidzIHJ1bGUuIFJvb3QgcnVuXG4gKiAgIHBheWxvYWRzIGFyZSB3YWxrZWQgYXQgZXZlcnkgZGVwdGggKGEgbmVzdGVkIGtleSBieSBpdHMgb3duIG5hbWUgb3JcbiAqICAgZG90dGVkIHBhdGgpIHBsdXMgZXhwbGljaXQgbmVzdGVkIGZpZWxkczsgc2NhbGFycyBwYXNzIHRocm91Z2gsIGFuZCBmb3JrXG4gKiAgIGNoaWxkLUlEIGVudmVsb3BlcyBuZWVkIGV4cGxpY2l0IHJlc3VsdCBwYXRocy4gVGhpcyBpcyBub3QgY29udGVudCBzY2FubmluZy4gVGhlIHJlY29yZGVyXG4gKiAgIGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCkgcmUtcmVkYWN0IG9yIHJlY29uc3RydWN0IHRoZSBydW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGluT3V0UmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgaW5PdXQgPSBpbk91dFJlY29yZGVyKCk7XG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGluT3V0KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICpcbiAqIGluT3V0LmdldFN0ZXBzKCk7ICAgICAgICAgICAgICAgICAgICAvLyBlbnRyeSBib3VuZGFyaWVzIOKAlCB0aW1lbGluZSBwcm9qZWN0aW9uXG4gKiBpbk91dC5nZXRCb3VuZGFyeShydW50aW1lU3RhZ2VJZCk7ICAgLy8geyBlbnRyeSwgZXhpdCB9IHBhaXIgZm9yIG9uZSBleGVjdXRpb25cbiAqIGluT3V0LmdldEJvdW5kYXJpZXMoKTsgICAgICAgICAgICAgICAvLyBmbGF0IGxpc3QgKGVudHJ5K2V4aXQgaW50ZXJsZWF2ZWQpXG4gKiBpbk91dC5nZXRSb290Qm91bmRhcnkoKTsgICAgICAgICAgICAgLy8geyBlbnRyeSwgZXhpdCB9IGZvciB0aGUgdG9wLWxldmVsIHJ1blxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgRmlsdGVyaW5nIGJ5IHN1YmZsb3cgcGF0aFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYWdlbnRTdGVwcyA9IGluT3V0XG4gKiAgIC5nZXRTdGVwcygpXG4gKiAgIC5maWx0ZXIoKGIpID0+IGIuc3ViZmxvd1BhdGhbMV0gPT09ICdzZi1hZ2VudCcpOyAgLy8gcGF0aFswXSBpcyB0aGUgcm9vdFxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgaWRQYXRoU2VnbWVudHMgYXMgcGF0aFNlZ21lbnRzIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0T3V0Y29tZSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93QXR0ZW1wdEV2ZW50LCBGbG93UmVjb3JkZXIsIEZsb3dSdW5FdmVudCwgRmxvd1N1YmZsb3dFdmVudCB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBBdHRlbXB0T3V0Y29tZUNvdW50cywgQXR0ZW1wdFJlZiB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5pbXBvcnQge1xuICBhdHRlbXB0RmFpbGVkLFxuICBhdHRlbXB0UmVmLFxuICBlbXB0eU91dGNvbWVDb3VudHMsXG4gIGdhdmVVcCxcbiAgaXNSZXRyeUV2aWRlbmNlLFxuICBzdWJmbG93T2ZBdHRlbXB0LFxufSBmcm9tICcuL2F0dGVtcHRTZXJpZXMuanMnO1xuaW1wb3J0IHsgU2VxdWVuY2VTdG9yZSB9IGZyb20gJy4vU2VxdWVuY2VTdG9yZS5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IHR5cGUgSW5PdXRQaGFzZSA9ICdlbnRyeScgfCAnZXhpdCc7XG5cbi8qKiBTeW50aGV0aWMgaWQgZm9yIHRoZSB0b3AtbGV2ZWwgcnVuJ3MgYm91bmRhcnkgcGFpci4gKi9cbmV4cG9ydCBjb25zdCBST09UX1NVQkZMT1dfSUQgPSAnX19yb290X18nO1xuXG4vKiogU3ludGhldGljIHJ1bnRpbWVTdGFnZUlkIGZvciB0aGUgdG9wLWxldmVsIHJ1biBib3VuZGFyeSBwYWlyLiAqL1xuZXhwb3J0IGNvbnN0IFJPT1RfUlVOVElNRV9TVEFHRV9JRCA9ICdfX3Jvb3RfXyMwJztcblxuLyoqXG4gKiBPbmUgaGFsZiBvZiBhIGNoYXJ0IGV4ZWN1dGlvbiBib3VuZGFyeS4gRW50cnkvZXhpdCBwYWlycyBzaGFyZSBgcnVudGltZVN0YWdlSWRgLlxuICpcbiAqIE5hbWluZyBmb2xsb3dzIHRoZSBlbmdpbmU6IGBzdWJmbG93SWRgIGlzIHRoZSBwYXRoLXByZWZpeGVkIGlkZW50aWZpZXIgdGhlXG4gKiBlbmdpbmUgZW1pdHMgKGUuZy4gYCdzZi1vdXRlci9zZi1pbm5lcidgIGZvciBuZXN0ZWQgc3ViZmxvd3MpLiBGb3IgdGhlXG4gKiB0b3AtbGV2ZWwgcnVuLCBpdCdzIHRoZSBzeW50aGV0aWMgYCdfX3Jvb3RfXydgLiBgc3ViZmxvd1BhdGhgIGlzIHRoZVxuICogZGVjb21wb3NpdGlvbiBpbnRvIHNlZ21lbnRzIOKAlCBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlIGJlY2F1c2UgY29uc3VtZXJzXG4gKiBvZnRlbiBxdWVyeSAvIGdyb3VwIGJ5IHRoZSBwYXRoIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5PdXRFbnRyeSB7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCDigJQgc2FtZSB2YWx1ZSBmb3IgdGhlIGVudHJ5L2V4aXQgcGFpciBvZiBvbmUgZXhlY3V0aW9uLlxuICAgKiAgVG9wLWxldmVsIHJ1biB1c2VzIHRoZSBzeW50aGV0aWMgYFJPT1RfUlVOVElNRV9TVEFHRV9JRGAuICovXG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBQYXRoLXByZWZpeGVkIHN1YmZsb3cgaWRlbnRpZmllciAobWF0Y2hlcyB0aGUgZW5naW5lJ3MgYEZsb3dTdWJmbG93RXZlbnQuc3ViZmxvd0lkYCkuXG4gICAqICBUb3AtbGV2ZWwg4oaSIGAnX19yb290X18nYC4gU3ViZmxvdyDihpIgYCdzZi1vdXRlcidgIG9yIGAnc2Ytb3V0ZXIvc2YtaW5uZXInYC4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIC8qKiBMYXN0IHNlZ21lbnQgb2YgYHN1YmZsb3dJZGAg4oCUIGNvbnZlbmllbmNlIGZvciBjb25zdW1lcnMgdGhhdCBncm91cCBieSBsZWFmIG5hbWUuXG4gICAqICBUb3AtbGV2ZWwg4oaSIGAnX19yb290X18nYC4gKi9cbiAgcmVhZG9ubHkgbG9jYWxTdWJmbG93SWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRpc3BsYXkgbmFtZSAoZnJvbSB0aGUgYnVpbGRlcjsgYCdSdW4nYCBmb3IgdGhlIHRvcC1sZXZlbCBydW4pLiAqL1xuICByZWFkb25seSBzdWJmbG93TmFtZTogc3RyaW5nO1xuICAvKiogQnVpbGQtdGltZSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBzdWJmbG93J3Mgcm9vdCBzdGFnZS5cbiAgICogIENhcnJpZXMgdGF4b25vbXkgbWFya2VycyAoZS5nLiBgJ0FnZW50OiBSZUFjdCBsb29wJ2ApLiBVbmRlZmluZWQgZm9yIHJvb3QuICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogRGVjb21wb3NpdGlvbiBvZiBgc3ViZmxvd0lkYCBpbnRvIHNlZ21lbnRzLiBUb3AtbGV2ZWwg4oaSIGBbJ19fcm9vdF9fJ11gLlxuICAgKiAgU3ViZmxvd3MgbGl2ZSBVTkRFUiB0aGUgcm9vdDogYSB0b3AtbGV2ZWwgc3ViZmxvdyBoYXMgcGF0aCBgWydfX3Jvb3RfXycsICdzZi14J11gLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBEZXB0aCBpbiB0aGUgc3ViZmxvdyB0cmVlLiBSb290IOKGkiAwLiBGaXJzdC1sZXZlbCBzdWJmbG93IOKGkiAxLiAqL1xuICByZWFkb25seSBkZXB0aDogbnVtYmVyO1xuICAvKiogV2hpY2ggc2lkZSBvZiB0aGUgYm91bmRhcnkgdGhpcyBlbnRyeSByZXByZXNlbnRzLiAqL1xuICByZWFkb25seSBwaGFzZTogSW5PdXRQaGFzZTtcbiAgLyoqIERhdGEgY3Jvc3NpbmcgdGhlIGJvdW5kYXJ5LlxuICAgKiAgLSBgcGhhc2U6ICdlbnRyeSdgIOKGkiBgaW5wdXRNYXBwZXJgIHJlc3VsdCAoc3ViZmxvdykgb3IgYHJ1bih7aW5wdXR9KWAgKHJvb3QpXG4gICAqICAtIGBwaGFzZTogJ2V4aXQnYCAg4oaSIHN1YmZsb3cgc2hhcmVkIHN0YXRlIGF0IGV4aXQgKHN1YmZsb3cpIG9yIGNoYXJ0IHJldHVybiB2YWx1ZSAocm9vdClcbiAgICpcbiAgICogIFVuZGVmaW5lZCB3aGVuIG5vIG1hcHBlciAvIG5vIGlucHV0IHdhcyBwcm92aWRlZC4gKi9cbiAgcmVhZG9ubHkgcGF5bG9hZD86IHVua25vd247XG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBlbnRyeSBjYW1lIGZyb20gdGhlIHRvcC1sZXZlbCBydW4gKGBvblJ1blN0YXJ0YCAvIGBvblJ1bkVuZGApXG4gICAqICByYXRoZXIgdGhhbiBmcm9tIGEgc3ViZmxvdyAoYG9uU3ViZmxvd0VudHJ5YCAvIGBvblN1YmZsb3dFeGl0YCkuXG4gICAqICBMZW5zIHVzZXMgdGhpcyB0byByZW5kZXIgdGhlIHJvb3QgcGFpciBhcyBgdXNlciDihpIgcnVuIOKGkiB1c2VyYCBpbnN0ZWFkIG9mXG4gICAqICB0aGUgcmVndWxhciBzdWJmbG93IHNoYXBlLiAqL1xuICByZWFkb25seSBpc1Jvb3Q6IGJvb2xlYW47XG4gIC8qKiBgcGhhc2U6ICdleGl0J2Agb25seSwgYW5kIG9ubHkgd2hlbiBzb21ldGhpbmcgaW5zaWRlIHJldHJpZWQsIGdhdmUgdXAgb3IgdGltZWQgb3V0IOKAlCBzZWUge0BsaW5rIEluT3V0QXR0ZW1wdHN9LiAqL1xuICByZWFkb25seSBhdHRlbXB0cz86IEluT3V0QXR0ZW1wdHM7XG4gIC8qKiBXaXRoIGBhdHRlbXB0c2A6IHRoZSBhdHRlbXB0cyBpbnNpZGUgdGhhdCBmYWlsZWQsIHRpbWVkIG91dCBvciB3ZXJlIGFib3J0ZWQsIGluIHRoZSBvcmRlciB0aGV5IGVuZGVkLiAqL1xuICByZWFkb25seSBmYWlsZWRBdHRlbXB0cz86IHJlYWRvbmx5IEF0dGVtcHRSZWZbXTtcbn1cblxuLyoqIEF0dGVtcHRzIGFjY3VtdWxhdGVkIGluc2lkZSBvbmUgb3BlbiBib3VuZGFyeS4gKi9cbmNsYXNzIEJvdW5kYXJ5QXR0ZW1wdHMge1xuICBwcml2YXRlIGNvdW50ID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBieU91dGNvbWUgPSBlbXB0eU91dGNvbWVDb3VudHMoKTtcbiAgcHJpdmF0ZSBnYXZlVXAgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZhaWxlZDogQXR0ZW1wdFJlZltdID0gW107XG5cbiAgYWRkKG91dGNvbWU6IEF0dGVtcHRPdXRjb21lLCBnYXZlOiBib29sZWFuLCBmYWlsZWQ6IEF0dGVtcHRSZWYgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50ICs9IDE7XG4gICAgdGhpcy5ieU91dGNvbWVbb3V0Y29tZV0gKz0gMTtcbiAgICBpZiAoZ2F2ZSkgdGhpcy5nYXZlVXAgKz0gMTtcbiAgICBpZiAoZmFpbGVkKSB0aGlzLmZhaWxlZC5wdXNoKGZhaWxlZCk7XG4gIH1cblxuICAvKiogVGhlIGV4aXQgZW50cnkncyBmaWVsZHMg4oCUIG5vbmUgd2hlbiBub3RoaW5nIHJldHJpZWQgaW5zaWRlLiAqL1xuICBmaWVsZHMoKTogUGljazxJbk91dEVudHJ5LCAnYXR0ZW1wdHMnIHwgJ2ZhaWxlZEF0dGVtcHRzJz4ge1xuICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dGVtcHRzOiB7IGNvdW50OiB0aGlzLmNvdW50LCBieU91dGNvbWU6IHsgLi4udGhpcy5ieU91dGNvbWUgfSwgZ2F2ZVVwOiB0aGlzLmdhdmVVcCB9LFxuICAgICAgZmFpbGVkQXR0ZW1wdHM6IFsuLi50aGlzLmZhaWxlZF0sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFdoYXQgaXQgY29zdCB0byBnZXQgdGhyb3VnaCBhIGJvdW5kYXJ5OiB0aGUgYXR0ZW1wdHMgbWFkZSBpbnNpZGUgaXQgKGF0IGFueSBkZXB0aCkgYnkgc2VyaWVzIHRoYXQgcmV0cmllZCwgZ2F2ZVxuICogdXAgb3IgdGltZWQgb3V0IOKAlCBgY291bnRgLCBwZXIgb3V0Y29tZSAoYHRpbWVvdXRgIGluY2x1ZGVkKSwgYW5kIGhvdyBtYW55IG9mIHRob3NlIHNlcmllcyBnYXZlIHVwIChgZXhoYXVzdGVkYCxcbiAqIGBkZWNsaW5lZGAsIGBuby10aW1lLWxlZnRgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbk91dEF0dGVtcHRzIHtcbiAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgYnlPdXRjb21lOiBBdHRlbXB0T3V0Y29tZUNvdW50cztcbiAgcmVhZG9ubHkgZ2F2ZVVwOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5PdXRSZWNvcmRlck9wdGlvbnMge1xuICAvKiogU2NvcGVSZWNvcmRlciBpZC4gRGVmYXVsdHMgdG8gYGlub3V0LU5gIChhdXRvLWluY3JlbWVudGVkKS4gKi9cbiAgaWQ/OiBzdHJpbmc7XG59XG5cbmxldCBfY291bnRlciA9IDA7XG5cbi8qKlxuICogRmFjdG9yeSDigJQgbWF0Y2hlcyB0aGUgYHRvcG9sb2d5UmVjb3JkZXIoKWAgLyBgbmFycmF0aXZlKClgIHN0eWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5PdXRSZWNvcmRlcihvcHRpb25zOiBJbk91dFJlY29yZGVyT3B0aW9ucyA9IHt9KTogSW5PdXRSZWNvcmRlciB7XG4gIHJldHVybiBuZXcgSW5PdXRSZWNvcmRlcihvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTdGF0ZWZ1bCBhY2N1bXVsYXRvciB0aGF0IHdhdGNoZXMgYEZsb3dSZWNvcmRlcmAgY2hhcnQtYm91bmRhcnkgZXZlbnRzXG4gKiAocnVuIHN0YXJ0L2VuZCArIHN1YmZsb3cgZW50cnkvZXhpdCkgYW5kIHB1c2hlcyBgSW5PdXRFbnRyeWAgcmVjb3JkcyB0b1xuICogaXRzIGNvbXBvc2VkIGBTZXF1ZW5jZVN0b3JlYCAoQ29udmVudGlvbiAxIOKAlCBvbmUgcHVycG9zZSBwZXIgcmVjb3JkZXIpLlxuICpcbiAqIEF0dGFjaCB2aWEgYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXIpYCDigJQgZm9vdHByaW50anNcbiAqIGRldGVjdHMgdGhlIGBGbG93UmVjb3JkZXJgIG1ldGhvZCBzaGFwZSBhbmQgcm91dGVzIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEluT3V0UmVjb3JkZXIgaW1wbGVtZW50cyBGbG93UmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogMTpOIG9yZGVyZWQgc3RvcmFnZSB3aXRoIHBlci1zdGVwIGluZGV4IChDb252ZW50aW9uIDEg4oCUIGNvbXBvc2VkKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IG5ldyBTZXF1ZW5jZVN0b3JlPEluT3V0RW50cnk+KCk7XG4gIC8qKiBUaGUgcm9vdCBydW4ncyBhdHRlbXB0cyDigJQgZXZlcnkgYXR0ZW1wdCBpcyBpbnNpZGUgaXQuICovXG4gIHByaXZhdGUgcm9vdEF0dGVtcHRzID0gbmV3IEJvdW5kYXJ5QXR0ZW1wdHMoKTtcbiAgLyoqIE9wZW4gc3ViZmxvdyBib3VuZGFyaWVzJyBhdHRlbXB0cywgYnkgcGF0aC1wcmVmaXhlZCBzdWJmbG93SWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb3BlbkF0dGVtcHRzID0gbmV3IE1hcDxzdHJpbmcsIEJvdW5kYXJ5QXR0ZW1wdHM+KCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5PdXRSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGBpbm91dC0keysrX2NvdW50ZXJ9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93UmVjb3JkZXIgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25SdW5TdGFydChldmVudDogRmxvd1J1bkV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5yb290QXR0ZW1wdHMgPSBuZXcgQm91bmRhcnlBdHRlbXB0cygpO1xuICAgIHRoaXMub3BlbkF0dGVtcHRzLmNsZWFyKCk7XG4gICAgdGhpcy5zdG9yZS5wdXNoKGJ1aWxkUm9vdEVudHJ5KCdlbnRyeScsIGV2ZW50LnBheWxvYWQpKTtcbiAgfVxuXG4gIG9uUnVuRW5kKGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnB1c2goeyAuLi5idWlsZFJvb3RFbnRyeSgnZXhpdCcsIGV2ZW50LnBheWxvYWQpLCAuLi50aGlzLnJvb3RBdHRlbXB0cy5maWVsZHMoKSB9KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSBidWlsZFN1YmZsb3dFbnRyeShldmVudCwgJ2VudHJ5Jyk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICAgIHRoaXMub3BlbkF0dGVtcHRzLnNldChlbnRyeS5zdWJmbG93SWQsIG5ldyBCb3VuZGFyeUF0dGVtcHRzKCkpO1xuICAgIHRoaXMuc3RvcmUucHVzaChlbnRyeSk7XG4gIH1cblxuICBvblN1YmZsb3dFeGl0KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSBidWlsZFN1YmZsb3dFbnRyeShldmVudCwgJ2V4aXQnKTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgY29uc3QgYXR0ZW1wdHMgPSB0aGlzLm9wZW5BdHRlbXB0cy5nZXQoZW50cnkuc3ViZmxvd0lkKTtcbiAgICB0aGlzLm9wZW5BdHRlbXB0cy5kZWxldGUoZW50cnkuc3ViZmxvd0lkKTtcbiAgICB0aGlzLnN0b3JlLnB1c2goYXR0ZW1wdHMgPyB7IC4uLmVudHJ5LCAuLi5hdHRlbXB0cy5maWVsZHMoKSB9IDogZW50cnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyBhbiBhdHRlbXB0IGluIHRoZSByb290IGJvdW5kYXJ5IGFuZCBpbiBldmVyeSBvcGVuIHN1YmZsb3cgYm91bmRhcnkgdGhhdCBjb250YWlucyB0aGUgc3RhZ2Ug4oCUIHRoZVxuICAgKiBzdWJmbG93IHRoZSBzdGFnZSByYW4gaW4gaXMgdGhhdCBzdWJmbG93J3MgaWQgb3IgYmVsb3cgaXQuXG4gICAqL1xuICBvbkF0dGVtcHQoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlY29yZCB9ID0gZXZlbnQ7XG4gICAgaWYgKCFpc1JldHJ5RXZpZGVuY2UocmVjb3JkKSkgcmV0dXJuO1xuICAgIGNvbnN0IGdhdmUgPSBnYXZlVXAocmVjb3JkKTtcbiAgICBjb25zdCBmYWlsZWQgPSBhdHRlbXB0RmFpbGVkKHJlY29yZCkgPyBhdHRlbXB0UmVmKHJlY29yZCkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yb290QXR0ZW1wdHMuYWRkKHJlY29yZC5vdXRjb21lLCBnYXZlLCBmYWlsZWQpO1xuICAgIGNvbnN0IHBhdGggPSBzdWJmbG93T2ZBdHRlbXB0KGV2ZW50KTtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBbc3ViZmxvd0lkLCBhdHRlbXB0c10gb2YgdGhpcy5vcGVuQXR0ZW1wdHMpIHtcbiAgICAgIGlmIChwYXRoID09PSBzdWJmbG93SWQgfHwgcGF0aC5zdGFydHNXaXRoKGAke3N1YmZsb3dJZH0vYCkpIGF0dGVtcHRzLmFkZChyZWNvcmQub3V0Y29tZSwgZ2F2ZSwgZmFpbGVkKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgUXVlcnkgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBBbGwgZW50cmllcyBpbiBleGVjdXRpb24gb3JkZXIgKGVudHJ5K2V4aXQgaW50ZXJsZWF2ZWQpLiAqL1xuICBnZXRCb3VuZGFyaWVzKCk6IEluT3V0RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0QWxsKCk7XG4gIH1cblxuICAvKiogRW50cnkvZXhpdCBwYWlyIGZvciBvbmUgY2hhcnQgZXhlY3V0aW9uLlxuICAgKiAgUmV0dXJucyBgeyBlbnRyeSwgZXhpdCB9YCDigJQgYGV4aXRgIGlzIGB1bmRlZmluZWRgIGZvciBpbi1wcm9ncmVzcyAvIHBhdXNlZFxuICAgKiAgY2hhcnRzIG9yIGlmIGBydW50aW1lU3RhZ2VJZGAgaXMgdW5rbm93bi4gKi9cbiAgZ2V0Qm91bmRhcnkocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHsgZW50cnk/OiBJbk91dEVudHJ5OyBleGl0PzogSW5PdXRFbnRyeSB9IHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5zdG9yZS5nZXRCeUtleShydW50aW1lU3RhZ2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudHJ5OiBlbnRyaWVzLmZpbmQoKGUpID0+IGUucGhhc2UgPT09ICdlbnRyeScpLFxuICAgICAgZXhpdDogZW50cmllcy5maW5kKChlKSA9PiBlLnBoYXNlID09PSAnZXhpdCcpLFxuICAgIH07XG4gIH1cblxuICAvKiogSnVzdCB0aGUgYGVudHJ5YC1waGFzZSBib3VuZGFyaWVzIOKAlCB0aGUgXCJzdGVwIGxpc3RcIiBwcm9qZWN0aW9uIGluXG4gICAqICBleGVjdXRpb24gb3JkZXIuIFRoaXMgaXMgdGhlIG5hdHVyYWwgdGltZWxpbmUgb2YgY2hhcnQgZXhlY3V0aW9uc1xuICAgKiAgZm9yIHNsaWRlciAvIHNjcnViYmluZyBVSXMuIFRoZSB0b3AtbGV2ZWwgcnVuJ3MgZW50cnkgaXMgdGhlIGZpcnN0XG4gICAqICBzdGVwIChkZXB0aCAwKS4gKi9cbiAgZ2V0U3RlcHMoKTogSW5PdXRFbnRyeVtdIHtcbiAgICBjb25zdCBzdGVwczogSW5PdXRFbnRyeVtdID0gW107XG4gICAgZm9yIChjb25zdCBiIG9mIHRoaXMuc3RvcmUuZ2V0QWxsKCkpIHtcbiAgICAgIGlmIChiLnBoYXNlID09PSAnZW50cnknKSBzdGVwcy5wdXNoKGIpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICAvKiogTygxKSBsb29rdXA6IGFsbCBib3VuZGFyeSBlbnRyaWVzIChib3RoIHBoYXNlcykgZm9yIG9uZSBydW50aW1lU3RhZ2VJZC4gKi9cbiAgZ2V0RW50cmllc0ZvclN0ZXAocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IEluT3V0RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0QnlLZXkocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFByZS1idWlsdCBwZXItc3RlcCByYW5nZSBpbmRleCDigJQgTygxKSBsb29rdXBzIGZvciB0aW1lLXRyYXZlbCBzY3J1YmJpbmcuICovXG4gIGdldEVudHJ5UmFuZ2VzKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgeyByZWFkb25seSBmaXJzdElkeDogbnVtYmVyOyByZWFkb25seSBlbmRJZHg6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RW50cnlSYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBQcm9ncmVzc2l2ZSByZXZlYWw6IGJvdW5kYXJpZXMgd2hvc2UgcnVudGltZVN0YWdlSWQgaXMgaW4gdGhlIHZpc2libGUgc2V0LiAqL1xuICBnZXRFbnRyaWVzVXBUbyh2aXNpYmxlSWRzOiBSZWFkb25seVNldDxzdHJpbmc+KTogSW5PdXRFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRFbnRyaWVzVXBUbyh2aXNpYmxlSWRzKTtcbiAgfVxuXG4gIC8qKiBDbGVhciBhbGwgc3RvcmVkIGJvdW5kYXJpZXMg4oCUIGNhbGxlZCBieSB0aGUgZXhlY3V0b3IgYmVmb3JlIGVhY2ggcnVuKCkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuY2xlYXIoKTtcbiAgICB0aGlzLnJvb3RBdHRlbXB0cyA9IG5ldyBCb3VuZGFyeUF0dGVtcHRzKCk7XG4gICAgdGhpcy5vcGVuQXR0ZW1wdHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKiBUaGUgcm9vdCBydW4ncyBlbnRyeS9leGl0IHBhaXIsIGlmIHRoZSBydW4gaGFzIHN0YXJ0ZWQuXG4gICAqICBDb252ZW5pZW5jZSBmb3IgY29uc3VtZXJzIHRoYXQgd2FudCB0byBicmFja2V0IHRoZSB0aW1lbGluZSBieSB0aGVcbiAgICogIG91dGVybW9zdCBpbi9vdXQuICovXG4gIGdldFJvb3RCb3VuZGFyeSgpOiB7IGVudHJ5PzogSW5PdXRFbnRyeTsgZXhpdD86IEluT3V0RW50cnkgfSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm91bmRhcnkoUk9PVF9SVU5USU1FX1NUQUdFX0lEKTtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCBidW5kbGUgZm9yIGluY2x1c2lvbiBpbiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAuICovXG4gIHRvU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdJbk91dCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NoYXJ0IGluL291dCBzdHJlYW0g4oCUIGVudHJ5L2V4aXQgcGFpcnMgYXQgZXZlcnkgY2hhcnQgYm91bmRhcnkgKHJvb3QgKyBzdWJmbG93cyknLFxuICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiAndHJhbnNsYXRlJyBhcyBjb25zdCxcbiAgICAgIGRhdGE6IHRoaXMuZ2V0Qm91bmRhcmllcygpLFxuICAgIH07XG4gIH1cbn1cblxuLy8g4pSA4pSAIEludGVybmFsIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQnVpbGQgdGhlIHN5bnRoZXRpYyByb290IGVudHJ5L2V4aXQuIERlcHRoIGlzIGAwYCBhbmQgdGhlIHBhdGggaXNcbiAqIGBbUk9PVF9TVUJGTE9XX0lEXWAgc28gY29uc3VtZXJzIGdyb3VwaW5nIGJ5IHBhdGggc2VlIHRoZSByb290IGFzIGFcbiAqIHJlZ3VsYXIgdG9wLWxldmVsIGNvbnRhaW5lci5cbiAqL1xuZnVuY3Rpb24gYnVpbGRSb290RW50cnkocGhhc2U6IEluT3V0UGhhc2UsIHBheWxvYWQ6IHVua25vd24pOiBJbk91dEVudHJ5IHtcbiAgcmV0dXJuIHtcbiAgICBydW50aW1lU3RhZ2VJZDogUk9PVF9SVU5USU1FX1NUQUdFX0lELFxuICAgIHN1YmZsb3dJZDogUk9PVF9TVUJGTE9XX0lELFxuICAgIGxvY2FsU3ViZmxvd0lkOiBST09UX1NVQkZMT1dfSUQsXG4gICAgc3ViZmxvd05hbWU6ICdSdW4nLFxuICAgIHN1YmZsb3dQYXRoOiBbUk9PVF9TVUJGTE9XX0lEXSxcbiAgICBkZXB0aDogMCxcbiAgICBwaGFzZSxcbiAgICBwYXlsb2FkLFxuICAgIGlzUm9vdDogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIHN1YmZsb3cgYEluT3V0RW50cnlgIGZyb20gYSBgRmxvd1N1YmZsb3dFdmVudGAuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBldmVudCBsYWNrcyBhIGBzdWJmbG93SWRgIChhbm9ueW1vdXMgL1xuICogbWFsZm9ybWVkIHN1YmZsb3cgZXZlbnRzIOKAlCBzYW1lIGRlZmVuc2l2ZSBwb2xpY3kgYXMgYFRvcG9sb2d5UmVjb3JkZXJgKS5cbiAqXG4gKiBQYXRoIGRlcml2YXRpb246IHRoZSBlbmdpbmUgZW1pdHMgYHN1YmZsb3dJZGAgYWxyZWFkeSBwcmVmaXhlZCB3aXRoIHRoZVxuICogZnVsbCBwYXRoIG9mIHBhcmVudCBzdWJmbG93cyAoZS5nLiBgJ3NmLW91dGVyL3NmLWlubmVyJ2ApLiBXZSBkZWNvbXBvc2VcbiAqIHRoYXQgaW50byBzZWdtZW50cyB0byBwb3B1bGF0ZSBgc3ViZmxvd1BhdGhgIGFuZCBjb21wdXRlIGBkZXB0aGAuXG4gKlxuICogU3ViZmxvd3MgbmVzdCBVTkRFUiB0aGUgc3ludGhldGljIHJvb3QgaW4gYHN1YmZsb3dQYXRoYCBzbyB0aGUgdHJlZSBpc1xuICogY29tcGxldGU6IGEgdG9wLWxldmVsIHN1YmZsb3cgaGFzIHBhdGggYFsnX19yb290X18nLCAnc2YteCddYCBhbmQgZGVwdGggMS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTdWJmbG93RW50cnkoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQsIHBoYXNlOiBJbk91dFBoYXNlKTogSW5PdXRFbnRyeSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN1YmZsb3dJZCA9IGV2ZW50LnN1YmZsb3dJZDtcbiAgaWYgKCFzdWJmbG93SWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcnVudGltZVN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJztcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoU2VnbWVudHMoc3ViZmxvd0lkKTtcbiAgY29uc3Qgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JPT1RfU1VCRkxPV19JRCwgLi4uc2VnbWVudHNdO1xuICBjb25zdCBkZXB0aCA9IHN1YmZsb3dQYXRoLmxlbmd0aCAtIDE7XG4gIGNvbnN0IGxvY2FsU3ViZmxvd0lkID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0gPz8gc3ViZmxvd0lkO1xuICBjb25zdCBwYXlsb2FkID0gcGhhc2UgPT09ICdlbnRyeScgPyBldmVudC5tYXBwZWRJbnB1dCA6IGV2ZW50Lm91dHB1dFN0YXRlO1xuXG4gIHJldHVybiB7XG4gICAgcnVudGltZVN0YWdlSWQsXG4gICAgc3ViZmxvd0lkLFxuICAgIGxvY2FsU3ViZmxvd0lkLFxuICAgIHN1YmZsb3dOYW1lOiBldmVudC5uYW1lLFxuICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICBzdWJmbG93UGF0aCxcbiAgICBkZXB0aCxcbiAgICBwaGFzZSxcbiAgICBwYXlsb2FkLFxuICAgIGlzUm9vdDogZmFsc2UsXG4gIH07XG59XG4iXX0=