@workflow/core 5.0.0-beta.4 → 5.0.0-beta.40

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 (325) hide show
  1. package/dist/attribute-changes.d.ts +7 -0
  2. package/dist/attribute-changes.d.ts.map +1 -0
  3. package/dist/attribute-changes.js +25 -0
  4. package/dist/capabilities.d.ts +33 -1
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +71 -4
  7. package/dist/capture-stack.d.ts +16 -0
  8. package/dist/capture-stack.d.ts.map +1 -0
  9. package/dist/capture-stack.js +21 -0
  10. package/dist/class-serialization.d.ts +32 -0
  11. package/dist/class-serialization.d.ts.map +1 -1
  12. package/dist/class-serialization.js +37 -1
  13. package/dist/classify-error.d.ts +26 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +109 -6
  16. package/dist/context-errors.d.ts +27 -0
  17. package/dist/context-errors.d.ts.map +1 -0
  18. package/dist/context-errors.js +101 -0
  19. package/dist/context-violation-error.d.ts +97 -0
  20. package/dist/context-violation-error.d.ts.map +1 -0
  21. package/dist/context-violation-error.js +149 -0
  22. package/dist/correlation-id.d.ts +109 -0
  23. package/dist/correlation-id.d.ts.map +1 -0
  24. package/dist/correlation-id.js +139 -0
  25. package/dist/create-hook.d.ts +62 -4
  26. package/dist/create-hook.d.ts.map +1 -1
  27. package/dist/create-hook.js +4 -3
  28. package/dist/define-hook.d.ts.map +1 -1
  29. package/dist/define-hook.js +20 -5
  30. package/dist/describe-error.d.ts +70 -0
  31. package/dist/describe-error.d.ts.map +1 -0
  32. package/dist/describe-error.js +189 -0
  33. package/dist/encryption.d.ts +37 -3
  34. package/dist/encryption.d.ts.map +1 -1
  35. package/dist/encryption.js +97 -31
  36. package/dist/events-consumer.d.ts +26 -1
  37. package/dist/events-consumer.d.ts.map +1 -1
  38. package/dist/events-consumer.js +105 -18
  39. package/dist/flushable-stream.d.ts +65 -10
  40. package/dist/flushable-stream.d.ts.map +1 -1
  41. package/dist/flushable-stream.js +131 -18
  42. package/dist/global.d.ts +37 -1
  43. package/dist/global.d.ts.map +1 -1
  44. package/dist/global.js +21 -3
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +2 -1
  48. package/dist/log-format.d.ts +25 -0
  49. package/dist/log-format.d.ts.map +1 -0
  50. package/dist/log-format.js +250 -0
  51. package/dist/logger.d.ts +29 -30
  52. package/dist/logger.d.ts.map +1 -1
  53. package/dist/logger.js +82 -32
  54. package/dist/private.d.ts +178 -9
  55. package/dist/private.d.ts.map +1 -1
  56. package/dist/private.js +273 -9
  57. package/dist/replay-payload-cache.d.ts +68 -0
  58. package/dist/replay-payload-cache.d.ts.map +1 -0
  59. package/dist/replay-payload-cache.js +160 -0
  60. package/dist/runtime/compute-instance.d.ts +12 -0
  61. package/dist/runtime/compute-instance.d.ts.map +1 -0
  62. package/dist/runtime/compute-instance.js +13 -0
  63. package/dist/runtime/constants.d.ts +237 -0
  64. package/dist/runtime/constants.d.ts.map +1 -1
  65. package/dist/runtime/constants.js +405 -15
  66. package/dist/runtime/count-step-started-events.d.ts +52 -0
  67. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  68. package/dist/runtime/count-step-started-events.js +72 -0
  69. package/dist/runtime/deployment-guard.d.ts +99 -0
  70. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  71. package/dist/runtime/deployment-guard.js +154 -0
  72. package/dist/runtime/get-port-lazy.d.ts +25 -0
  73. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  74. package/dist/runtime/get-port-lazy.js +92 -0
  75. package/dist/runtime/get-world-lazy.d.ts +23 -0
  76. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  77. package/dist/runtime/get-world-lazy.js +46 -0
  78. package/dist/runtime/helpers.d.ts +219 -10
  79. package/dist/runtime/helpers.d.ts.map +1 -1
  80. package/dist/runtime/helpers.js +414 -40
  81. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  82. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  83. package/dist/runtime/quickjs-assets.generated.js +30 -0
  84. package/dist/runtime/quickjs-entrypoint.d.ts +124 -0
  85. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  86. package/dist/runtime/quickjs-entrypoint.js +1429 -0
  87. package/dist/runtime/quickjs-runtime.d.ts +193 -0
  88. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  89. package/dist/runtime/quickjs-runtime.js +1944 -0
  90. package/dist/runtime/replay-budget.d.ts +98 -0
  91. package/dist/runtime/replay-budget.d.ts.map +1 -0
  92. package/dist/runtime/replay-budget.js +192 -0
  93. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  94. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  95. package/dist/runtime/replay-recovery-reporter.js +64 -0
  96. package/dist/runtime/resume-hook.d.ts +27 -4
  97. package/dist/runtime/resume-hook.d.ts.map +1 -1
  98. package/dist/runtime/resume-hook.js +448 -76
  99. package/dist/runtime/run-id-time.d.ts +19 -0
  100. package/dist/runtime/run-id-time.d.ts.map +1 -0
  101. package/dist/runtime/run-id-time.js +42 -0
  102. package/dist/runtime/run.d.ts +8 -2
  103. package/dist/runtime/run.d.ts.map +1 -1
  104. package/dist/runtime/run.js +62 -15
  105. package/dist/runtime/runs.d.ts +54 -3
  106. package/dist/runtime/runs.d.ts.map +1 -1
  107. package/dist/runtime/runs.js +117 -10
  108. package/dist/runtime/start.d.ts +70 -1
  109. package/dist/runtime/start.d.ts.map +1 -1
  110. package/dist/runtime/start.js +312 -54
  111. package/dist/runtime/step-executor.d.ts +177 -0
  112. package/dist/runtime/step-executor.d.ts.map +1 -0
  113. package/dist/runtime/step-executor.js +949 -0
  114. package/dist/runtime/step-latency.d.ts +197 -0
  115. package/dist/runtime/step-latency.d.ts.map +1 -0
  116. package/dist/runtime/step-latency.js +207 -0
  117. package/dist/runtime/step-ownership.d.ts +72 -0
  118. package/dist/runtime/step-ownership.d.ts.map +1 -0
  119. package/dist/runtime/step-ownership.js +114 -0
  120. package/dist/runtime/step-single-flight.d.ts +12 -0
  121. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  122. package/dist/runtime/step-single-flight.js +69 -0
  123. package/dist/runtime/suspension-handler.d.ts +102 -7
  124. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  125. package/dist/runtime/suspension-handler.js +439 -140
  126. package/dist/runtime/vm-mode.d.ts +44 -0
  127. package/dist/runtime/vm-mode.d.ts.map +1 -0
  128. package/dist/runtime/vm-mode.js +62 -0
  129. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  130. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  131. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  132. package/dist/runtime/wait-continuation.d.ts +84 -0
  133. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  134. package/dist/runtime/wait-continuation.js +105 -0
  135. package/dist/runtime/wait-until.d.ts +18 -0
  136. package/dist/runtime/wait-until.d.ts.map +1 -0
  137. package/dist/runtime/wait-until.js +42 -0
  138. package/dist/runtime/world-compatibility.d.ts +5 -0
  139. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  140. package/dist/runtime/world-compatibility.js +12 -0
  141. package/dist/runtime/world-init.d.ts +50 -0
  142. package/dist/runtime/world-init.d.ts.map +1 -0
  143. package/dist/runtime/world-init.js +50 -0
  144. package/dist/runtime/world.d.ts +14 -2
  145. package/dist/runtime/world.d.ts.map +1 -1
  146. package/dist/runtime/world.js +101 -26
  147. package/dist/runtime.d.ts +17 -12
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/runtime.js +3078 -327
  150. package/dist/schemas.d.ts +1 -1
  151. package/dist/schemas.d.ts.map +1 -1
  152. package/dist/schemas.js +1 -1
  153. package/dist/sealed-box.d.ts +167 -0
  154. package/dist/sealed-box.d.ts.map +1 -0
  155. package/dist/sealed-box.js +571 -0
  156. package/dist/serialization/client.d.ts +17 -0
  157. package/dist/serialization/client.d.ts.map +1 -0
  158. package/dist/serialization/client.js +48 -0
  159. package/dist/serialization/codec-devalue-vm.d.ts +9 -0
  160. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  161. package/dist/serialization/codec-devalue-vm.js +137 -0
  162. package/dist/serialization/codec-devalue.d.ts +14 -0
  163. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  164. package/dist/serialization/codec-devalue.js +105 -0
  165. package/dist/serialization/codec.d.ts +125 -0
  166. package/dist/serialization/codec.d.ts.map +1 -0
  167. package/dist/serialization/codec.js +17 -0
  168. package/dist/serialization/compression.d.ts +104 -0
  169. package/dist/serialization/compression.d.ts.map +1 -0
  170. package/dist/serialization/compression.js +260 -0
  171. package/dist/serialization/encryption.d.ts +134 -0
  172. package/dist/serialization/encryption.d.ts.map +1 -0
  173. package/dist/serialization/encryption.js +186 -0
  174. package/dist/serialization/errors.d.ts +34 -0
  175. package/dist/serialization/errors.d.ts.map +1 -0
  176. package/dist/serialization/errors.js +59 -0
  177. package/dist/serialization/format.d.ts +60 -0
  178. package/dist/serialization/format.d.ts.map +1 -0
  179. package/dist/serialization/format.js +97 -0
  180. package/dist/serialization/hardened.d.ts +155 -0
  181. package/dist/serialization/hardened.d.ts.map +1 -0
  182. package/dist/serialization/hardened.js +523 -0
  183. package/dist/serialization/index.d.ts +20 -0
  184. package/dist/serialization/index.d.ts.map +1 -0
  185. package/dist/serialization/index.js +22 -0
  186. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  187. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  188. package/dist/serialization/reducers/class-vm.js +77 -0
  189. package/dist/serialization/reducers/class.d.ts +11 -0
  190. package/dist/serialization/reducers/class.d.ts.map +1 -0
  191. package/dist/serialization/reducers/class.js +73 -0
  192. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  193. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  194. package/dist/serialization/reducers/common-vm.js +579 -0
  195. package/dist/serialization/reducers/common.d.ts +16 -0
  196. package/dist/serialization/reducers/common.d.ts.map +1 -0
  197. package/dist/serialization/reducers/common.js +478 -0
  198. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  199. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  200. package/dist/serialization/reducers/step-function-vm.js +97 -0
  201. package/dist/serialization/reducers/step-function.d.ts +35 -0
  202. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  203. package/dist/serialization/reducers/step-function.js +104 -0
  204. package/dist/serialization/step.d.ts +17 -0
  205. package/dist/serialization/step.d.ts.map +1 -0
  206. package/dist/serialization/step.js +48 -0
  207. package/dist/serialization/types.d.ts +273 -0
  208. package/dist/serialization/types.d.ts.map +1 -0
  209. package/dist/serialization/types.js +35 -0
  210. package/dist/serialization/vm-bundle-entry.d.ts +12 -0
  211. package/dist/serialization/vm-bundle-entry.d.ts.map +1 -0
  212. package/dist/serialization/vm-bundle-entry.js +58 -0
  213. package/dist/serialization/workflow-vm.d.ts +24 -0
  214. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  215. package/dist/serialization/workflow-vm.js +66 -0
  216. package/dist/serialization/workflow.d.ts +29 -0
  217. package/dist/serialization/workflow.d.ts.map +1 -0
  218. package/dist/serialization/workflow.js +54 -0
  219. package/dist/serialization-format.d.ts +60 -4
  220. package/dist/serialization-format.d.ts.map +1 -1
  221. package/dist/serialization-format.js +276 -56
  222. package/dist/serialization.d.ts +374 -221
  223. package/dist/serialization.d.ts.map +1 -1
  224. package/dist/serialization.js +2300 -783
  225. package/dist/set-attributes.d.ts +13 -0
  226. package/dist/set-attributes.d.ts.map +1 -0
  227. package/dist/set-attributes.js +60 -0
  228. package/dist/sleep.d.ts.map +1 -1
  229. package/dist/sleep.js +3 -2
  230. package/dist/source-map.d.ts +25 -0
  231. package/dist/source-map.d.ts.map +1 -1
  232. package/dist/source-map.js +148 -10
  233. package/dist/step/context-storage.d.ts +61 -2
  234. package/dist/step/context-storage.d.ts.map +1 -1
  235. package/dist/step/context-storage.js +7 -5
  236. package/dist/step/get-closure-vars.d.ts.map +1 -1
  237. package/dist/step/get-closure-vars.js +3 -2
  238. package/dist/step/get-step-metadata.d.ts.map +1 -1
  239. package/dist/step/get-step-metadata.js +3 -2
  240. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  241. package/dist/step/get-workflow-metadata.js +3 -2
  242. package/dist/step/writable-stream.d.ts.map +1 -1
  243. package/dist/step/writable-stream.js +71 -7
  244. package/dist/step.d.ts.map +1 -1
  245. package/dist/step.js +226 -30
  246. package/dist/symbols.d.ts +54 -0
  247. package/dist/symbols.d.ts.map +1 -1
  248. package/dist/symbols.js +55 -1
  249. package/dist/telemetry/semantic-conventions.d.ts +242 -2
  250. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  251. package/dist/telemetry/semantic-conventions.js +173 -1
  252. package/dist/telemetry.d.ts +73 -0
  253. package/dist/telemetry.d.ts.map +1 -1
  254. package/dist/telemetry.js +153 -16
  255. package/dist/types.d.ts +6 -0
  256. package/dist/types.d.ts.map +1 -1
  257. package/dist/types.js +23 -1
  258. package/dist/util.d.ts +16 -6
  259. package/dist/util.d.ts.map +1 -1
  260. package/dist/util.js +25 -16
  261. package/dist/version.d.ts +1 -1
  262. package/dist/version.d.ts.map +1 -1
  263. package/dist/version.js +2 -2
  264. package/dist/vm/index.d.ts.map +1 -1
  265. package/dist/vm/index.js +77 -9
  266. package/dist/vm/script-cache.d.ts +28 -0
  267. package/dist/vm/script-cache.d.ts.map +1 -0
  268. package/dist/vm/script-cache.js +140 -0
  269. package/dist/workflow/abort-controller.d.ts +65 -0
  270. package/dist/workflow/abort-controller.d.ts.map +1 -0
  271. package/dist/workflow/abort-controller.js +314 -0
  272. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  273. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  274. package/dist/workflow/attribute-dispatcher.js +48 -0
  275. package/dist/workflow/create-hook.d.ts.map +1 -1
  276. package/dist/workflow/create-hook.js +25 -3
  277. package/dist/workflow/define-hook.d.ts +1 -1
  278. package/dist/workflow/define-hook.d.ts.map +1 -1
  279. package/dist/workflow/define-hook.js +8 -4
  280. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  281. package/dist/workflow/get-workflow-metadata.js +14 -3
  282. package/dist/workflow/hook.d.ts.map +1 -1
  283. package/dist/workflow/hook.js +303 -37
  284. package/dist/workflow/index.d.ts +1 -0
  285. package/dist/workflow/index.d.ts.map +1 -1
  286. package/dist/workflow/index.js +5 -3
  287. package/dist/workflow/set-attributes.d.ts +68 -0
  288. package/dist/workflow/set-attributes.d.ts.map +1 -0
  289. package/dist/workflow/set-attributes.js +60 -0
  290. package/dist/workflow/sleep.d.ts.map +1 -1
  291. package/dist/workflow/sleep.js +58 -9
  292. package/dist/workflow/world-init-stub.d.ts +15 -0
  293. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  294. package/dist/workflow/world-init-stub.js +15 -0
  295. package/dist/workflow.d.ts +69 -3
  296. package/dist/workflow.d.ts.map +1 -1
  297. package/dist/workflow.js +791 -554
  298. package/docs/api-reference/create-hook.mdx +79 -0
  299. package/docs/api-reference/create-webhook.mdx +1 -0
  300. package/docs/api-reference/define-hook.mdx +26 -24
  301. package/docs/api-reference/fatal-error.mdx +29 -7
  302. package/docs/api-reference/fetch.mdx +8 -4
  303. package/docs/api-reference/index.mdx +3 -0
  304. package/docs/api-reference/set-attributes.mdx +61 -0
  305. package/docs/api-reference/sleep.mdx +1 -1
  306. package/docs/foundations/cancellation.mdx +459 -0
  307. package/docs/foundations/errors-and-retries.mdx +7 -3
  308. package/docs/foundations/hooks.mdx +29 -0
  309. package/docs/foundations/idempotency.mdx +243 -11
  310. package/docs/foundations/index.mdx +1 -23
  311. package/docs/foundations/meta.json +3 -1
  312. package/docs/foundations/serialization.mdx +77 -41
  313. package/docs/foundations/starting-workflows.mdx +79 -2
  314. package/docs/foundations/streaming.mdx +14 -23
  315. package/docs/foundations/versioning.mdx +263 -0
  316. package/docs/how-it-works/cancellation.mdx +287 -0
  317. package/docs/how-it-works/code-transform.mdx +21 -17
  318. package/docs/how-it-works/encryption.mdx +5 -5
  319. package/docs/how-it-works/event-sourcing.mdx +6 -6
  320. package/docs/how-it-works/framework-integrations.mdx +96 -337
  321. package/docs/how-it-works/meta.json +2 -1
  322. package/package.json +31 -13
  323. package/dist/runtime/step-handler.d.ts +0 -2
  324. package/dist/runtime/step-handler.d.ts.map +0 -1
  325. package/dist/runtime/step-handler.js +0 -678
@@ -0,0 +1,523 @@
1
+ /**
2
+ * Hardened introspection for serializing values that may originate inside a
3
+ * workflow VM (`node:vm`) sandbox realm.
4
+ *
5
+ * Serialization runs on the host, but the values it inspects were
6
+ * constructed by workflow code — so a naive dynamic operation like
7
+ * `value.toISOString()`, `Array.from(map)`, or `Object.prototype.toString`
8
+ * dispatches into the sandbox realm and executes workflow code (patched
9
+ * prototype methods, getters, proxy traps, `Symbol.toStringTag` accessors).
10
+ * That is a determinism hazard: serialization happens exactly once per
11
+ * payload (never again on replay), so any workflow-visible side effect it
12
+ * triggers exists only on the live execution path and diverges from replay.
13
+ *
14
+ * This module makes serialization side-effect free wherever the data allows
15
+ * it, and *observable* where it does not:
16
+ *
17
+ * - **Classification** uses engine-level brand checks (`node:util` `types`,
18
+ * internal-slot probes) instead of `instanceof` / `Object.prototype.toString`
19
+ * — immune to `Symbol.hasInstance`, `Symbol.toStringTag`, and reassigned
20
+ * globals.
21
+ * - **Extraction** goes through intrinsics captured at module load (host
22
+ * boot, before any workflow code runs). Internal slots are realm-agnostic,
23
+ * so host intrinsics read VM-realm objects without touching the sandbox's
24
+ * (patchable) prototypes.
25
+ * - **Property access** reads through descriptors, so plain data never
26
+ * invokes anything. Where workflow code *must* run because the data itself
27
+ * lives behind it — getters, proxies, custom `[WORKFLOW_SERIALIZE]`
28
+ * methods, `toString()` on toStringTag-branded objects (e.g. Temporal
29
+ * polyfills) — the execution is preserved for compatibility and recorded
30
+ * in the active {@link GuestCodeStats} sink, so callers (e.g. a retained-VM
31
+ * gate) can react.
32
+ *
33
+ * **Recording is not prevention.** For the recorded cases the determinism
34
+ * hazard is still live: a getter that calls `Math.random()` advances the
35
+ * run's seeded PRNG during serialization, and because serialization happens
36
+ * exactly once and is never replayed, every subsequent draw — including the
37
+ * correlation ids derived from that stream — shifts relative to replay. The
38
+ * report is the only trace of that; acting on it (warning, demoting a
39
+ * retained VM to replay) is left to the caller.
40
+ *
41
+ * The recorder is ambient module state, set for the duration of a
42
+ * synchronous `stringify` call via {@link withGuestCodeStats}. devalue's
43
+ * `stringify` is fully synchronous, so this is safe without async context.
44
+ */
45
+ import { types } from 'node:util';
46
+ import { defaultStringifyOperations } from 'devalue';
47
+ let activeStats = null;
48
+ let reportedProxies = null;
49
+ /**
50
+ * Runs `fn` (synchronously) with `stats` as the active guest-code sink.
51
+ * Nested calls stack correctly; a `null`/`undefined` sink disables
52
+ * recording without disabling hardening.
53
+ */
54
+ export function withGuestCodeStats(stats, fn) {
55
+ const previousStats = activeStats;
56
+ const previousProxies = reportedProxies;
57
+ activeStats = stats ?? null;
58
+ reportedProxies = stats ? new WeakSet() : null;
59
+ try {
60
+ return fn();
61
+ }
62
+ finally {
63
+ activeStats = previousStats;
64
+ reportedProxies = previousProxies;
65
+ }
66
+ }
67
+ /**
68
+ * Closure-variable functions that arrived through `useStep` when a step
69
+ * proxy was built. The step-function reducer must invoke `__closureVarsFn`,
70
+ * and the compiler-generated function is a pure sequence of lexical reads —
71
+ * but the *property* is reachable from workflow code, which can replace it
72
+ * with an arbitrary function. The reducer checks membership here instead of
73
+ * assuming provenance, and reports anything it does not recognize.
74
+ *
75
+ * Membership proves the function was passed to `useStep`, not that the
76
+ * compiler generated it — workflow code can call `useStep` directly and
77
+ * launder a side-effectful function past the report. That costs a missing
78
+ * report entry, never incorrect output; closing it means branding at the
79
+ * compiler, which does not belong here.
80
+ */
81
+ const useStepClosureFns = new WeakSet();
82
+ /** Marks a function as having been passed to `useStep`. */
83
+ export function markUseStepClosureFn(fn) {
84
+ useStepClosureFns.add(fn);
85
+ return fn;
86
+ }
87
+ /** Whether `fn` was marked by {@link markUseStepClosureFn}. */
88
+ export function isUseStepClosureFn(fn) {
89
+ return typeof fn === 'function' && useStepClosureFns.has(fn);
90
+ }
91
+ export function recordGuestCode(kind, detail) {
92
+ if (!activeStats)
93
+ return;
94
+ const execution = { kind };
95
+ if (detail !== undefined)
96
+ execution.detail = detail;
97
+ activeStats.executions.push(execution);
98
+ }
99
+ /** Records a proxy once per serialization pass (proxies fire many traps). */
100
+ function recordProxy(value) {
101
+ if (!activeStats || !reportedProxies)
102
+ return;
103
+ if (reportedProxies.has(value))
104
+ return;
105
+ reportedProxies.add(value);
106
+ recordGuestCode('proxy');
107
+ }
108
+ // ---- Captured intrinsics ----------------------------------------------------
109
+ //
110
+ // Captured at module load — host boot, before any workflow bundle can run —
111
+ // and invoked with explicit receivers, so no lookup ever resolves through a
112
+ // sandbox-reachable prototype. Every member below exists on every supported
113
+ // engine (Node 18+), so a missing one is a bug in this table: fail at import
114
+ // rather than serialize through a live (patchable) lookup later.
115
+ const uncurryThis = Function.prototype.bind.bind(Function.prototype.call);
116
+ function protoGetter(prototype, key) {
117
+ const getter = Object.getOwnPropertyDescriptor(prototype, key)?.get;
118
+ if (!getter) {
119
+ throw new Error(`Missing intrinsic getter: ${String(key)}`);
120
+ }
121
+ return uncurryThis(getter);
122
+ }
123
+ // ECMAScript intrinsics. All read internal slots, so they work on values
124
+ // from any realm and are unaffected by prototype patching in any realm.
125
+ /** `Date.prototype.getDate`, for invalid-date checks. */
126
+ export const dateGetDate = uncurryThis(Date.prototype.getDate);
127
+ /** `Date.prototype.getTime`. */
128
+ export const dateGetTime = uncurryThis(Date.prototype.getTime);
129
+ /** `Date.prototype.toISOString`. */
130
+ export const dateToISOString = uncurryThis(Date.prototype.toISOString);
131
+ /** `RegExp.prototype.source` getter. */
132
+ export const regExpSource = protoGetter(RegExp.prototype, 'source');
133
+ /** `RegExp.prototype.flags` getter. */
134
+ export const regExpFlags = protoGetter(RegExp.prototype, 'flags');
135
+ /** `ArrayBuffer.prototype.byteLength` getter (internal slot read). */
136
+ export const arrayBufferByteLength = protoGetter(ArrayBuffer.prototype, 'byteLength');
137
+ const mapEntries = uncurryThis(Map.prototype.entries);
138
+ const setValues = uncurryThis(Set.prototype.values);
139
+ const numberValueOf = uncurryThis(Number.prototype.valueOf);
140
+ const stringValueOf = uncurryThis(String.prototype.valueOf);
141
+ const booleanValueOf = uncurryThis(Boolean.prototype.valueOf);
142
+ const bigIntValueOf = uncurryThis(BigInt.prototype.valueOf);
143
+ const TypedArrayPrototype = Object.getPrototypeOf(Uint8Array.prototype);
144
+ const typedArrayTag = protoGetter(TypedArrayPrototype, Symbol.toStringTag);
145
+ const typedArrayBuffer = protoGetter(TypedArrayPrototype, 'buffer');
146
+ const typedArrayByteOffset = protoGetter(TypedArrayPrototype, 'byteOffset');
147
+ const typedArrayByteLength = protoGetter(TypedArrayPrototype, 'byteLength');
148
+ const typedArrayLength = protoGetter(TypedArrayPrototype, 'length');
149
+ const dataViewBuffer = protoGetter(DataView.prototype, 'buffer');
150
+ const dataViewByteOffset = protoGetter(DataView.prototype, 'byteOffset');
151
+ const dataViewByteLength = protoGetter(DataView.prototype, 'byteLength');
152
+ const sharedArrayBufferByteLength = protoGetter(SharedArrayBuffer.prototype, 'byteLength');
153
+ // Host (WHATWG) classes. Injected into the sandbox by reference, so
154
+ // instances from any realm carry these prototypes — and the shared
155
+ // prototypes are reachable from workflow code, which makes the boot-time
156
+ // capture (rather than a live lookup) load-bearing.
157
+ const headersIterator = uncurryThis(Headers.prototype[Symbol.iterator]);
158
+ const urlHrefGetter = protoGetter(URL.prototype, 'href');
159
+ const urlSearchParamsToStringMethod = uncurryThis(URLSearchParams.prototype.toString);
160
+ // ---- Safe access primitives -------------------------------------------------
161
+ const { isProxy } = types;
162
+ const functionToString = uncurryThis(Function.prototype.toString);
163
+ /**
164
+ * Whether an accessor is provided by the engine or the host, rather than
165
+ * defined by workflow code. Serialization must read some properties that are
166
+ * accessors by construction (V8 defines `stack` as an own accessor on every
167
+ * Error instance; Node implements `DOMException.prototype.message` in
168
+ * JavaScript), and reporting those would drown the signal in noise.
169
+ *
170
+ * - Engine accessors are native code, detected via the captured host
171
+ * `Function.prototype.toString` (cross-realm, uninterceptable). Bound
172
+ * functions and callable Proxies also present as native code but run
173
+ * workflow code, so both are excluded first.
174
+ * - Host builtins implemented in JavaScript are ordinary functions, but they
175
+ * belong to the host realm — detected by comparing the function's
176
+ * prototype against the host `Function.prototype`. Workflow code that
177
+ * reaches a host function can `setPrototypeOf` its own getter to
178
+ * impersonate this; that costs a missing report entry, never incorrect
179
+ * output.
180
+ *
181
+ * V8's native `stack` getter can itself invoke a workflow-defined
182
+ * `Error.prepareStackTrace`; that indirection is not detected here.
183
+ */
184
+ function isEngineAccessor(getter) {
185
+ if (isProxy(getter))
186
+ return false;
187
+ // A bound function stringifies as native code but runs its target — the
188
+ // one passive distinguisher V8 exposes is the `name` own property
189
+ // (`"bound fn"`). Workflow code can redefine the name to hide it; that
190
+ // costs a missing report entry, like the other impersonation caveats.
191
+ const name = Object.getOwnPropertyDescriptor(getter, 'name')?.value;
192
+ if (typeof name === 'string' && name.startsWith('bound '))
193
+ return false;
194
+ return (functionToString(getter).endsWith('{ [native code] }') ||
195
+ Reflect.getPrototypeOf(getter) === Function.prototype);
196
+ }
197
+ /**
198
+ * Reads `value[key]` with `[[Get]]` semantics, but through descriptors:
199
+ * plain data properties never invoke anything; accessor properties are
200
+ * invoked (the data lives behind them) and recorded; proxies fall back to
201
+ * a plain read (their traps are the only access path) and are recorded.
202
+ */
203
+ export function readProperty(value, key) {
204
+ if (value === null ||
205
+ (typeof value !== 'object' && typeof value !== 'function')) {
206
+ return undefined;
207
+ }
208
+ if (isProxy(value)) {
209
+ recordProxy(value);
210
+ return value[key];
211
+ }
212
+ let current = value;
213
+ while (current !== null) {
214
+ if (isProxy(current)) {
215
+ // a proxy in the prototype chain — its traps answer the lookup
216
+ recordProxy(current);
217
+ return value[key];
218
+ }
219
+ const descriptor = Object.getOwnPropertyDescriptor(current, key);
220
+ if (descriptor) {
221
+ if ('value' in descriptor)
222
+ return descriptor.value;
223
+ if (descriptor.get) {
224
+ if (!isEngineAccessor(descriptor.get)) {
225
+ recordGuestCode('getter', String(key));
226
+ }
227
+ return descriptor.get.call(value);
228
+ }
229
+ return undefined; // setter-only property
230
+ }
231
+ current = Reflect.getPrototypeOf(current);
232
+ }
233
+ return undefined;
234
+ }
235
+ /**
236
+ * `key in value` semantics without firing proxy traps for ordinary
237
+ * objects. Proxies fall back to the `in` operator and are recorded.
238
+ */
239
+ export function hasProperty(value, key) {
240
+ if (value === null ||
241
+ (typeof value !== 'object' && typeof value !== 'function')) {
242
+ return false;
243
+ }
244
+ if (isProxy(value)) {
245
+ recordProxy(value);
246
+ return key in value;
247
+ }
248
+ let current = value;
249
+ while (current !== null) {
250
+ if (isProxy(current)) {
251
+ recordProxy(current);
252
+ return key in value;
253
+ }
254
+ if (Object.getOwnPropertyDescriptor(current, key))
255
+ return true;
256
+ current = Reflect.getPrototypeOf(current);
257
+ }
258
+ return false;
259
+ }
260
+ /**
261
+ * `value instanceof C` semantics for a known `C.prototype`, without
262
+ * consulting `Symbol.hasInstance` (which workflow code can define). Used
263
+ * for host classes that are injected into the sandbox (Headers, URL,
264
+ * URLSearchParams, DOMException), where the instances — from any realm the
265
+ * host handed the class to — carry the host prototype in their chain.
266
+ *
267
+ * Proxies are walked rather than rejected: `Reflect.getPrototypeOf` fires
268
+ * the proxy's `getPrototypeOf` trap, matching `instanceof` semantics, and
269
+ * real values depend on that — Next.js hands the runtime a proxied
270
+ * `NextRequest`, and answering "not a Request" for it would silently break
271
+ * webhooks. The traps are guest-observable, so the proxy is recorded.
272
+ */
273
+ export function isInstanceOfPrototype(value, prototype) {
274
+ if (!prototype)
275
+ return false;
276
+ if (value === null || typeof value !== 'object')
277
+ return false;
278
+ if (isProxy(value))
279
+ recordProxy(value);
280
+ let current = Reflect.getPrototypeOf(value);
281
+ while (current !== null) {
282
+ if (current === prototype)
283
+ return true;
284
+ if (isProxy(current))
285
+ recordProxy(current);
286
+ current = Reflect.getPrototypeOf(current);
287
+ }
288
+ return false;
289
+ }
290
+ // ---- Intrinsic-backed extraction helpers (used by the reducers) -------------
291
+ //
292
+ // Intrinsics read internal slots, which a Proxy does not have — invoking one
293
+ // with a proxy receiver throws, where the pre-existing dynamic read forwarded
294
+ // through the trap. For the (rare) proxy case, fall back to the dynamic read
295
+ // so behavior is unchanged, and record that the traps ran.
296
+ /** `URL.prototype.href` getter. */
297
+ export function urlHref(value) {
298
+ if (isProxy(value)) {
299
+ recordProxy(value);
300
+ return value.href;
301
+ }
302
+ return urlHrefGetter(value);
303
+ }
304
+ /** `URLSearchParams.prototype.toString` — returns `''` iff empty. */
305
+ export function urlSearchParamsToString(value) {
306
+ if (isProxy(value)) {
307
+ recordProxy(value);
308
+ return String(value);
309
+ }
310
+ return urlSearchParamsToStringMethod(value);
311
+ }
312
+ /**
313
+ * Iterates a Headers instance through the captured host iterator, so the
314
+ * iterator object — and its `next` — are host-realm.
315
+ */
316
+ export function headersToEntries(value) {
317
+ if (isProxy(value)) {
318
+ recordProxy(value);
319
+ return Array.from(value);
320
+ }
321
+ return [...headersIterator(value)];
322
+ }
323
+ /**
324
+ * Iterates a genuine Map's entries entirely through host intrinsics: the
325
+ * iterator object is created by the host `Map.prototype.entries`, so its
326
+ * realm — and therefore its `next` — is the host's, not the sandbox's.
327
+ */
328
+ export function mapToEntries(value) {
329
+ return [...mapEntries(value)];
330
+ }
331
+ /** See {@link mapToEntries}. */
332
+ export function setToValues(value) {
333
+ return [...setValues(value)];
334
+ }
335
+ /**
336
+ * The bytes of an `ArrayBufferView`, read via internal-slot getters —
337
+ * own-property shadowing and prototype patches cannot change which bytes
338
+ * are serialized.
339
+ */
340
+ export function viewInfo(value) {
341
+ if (types.isDataView(value)) {
342
+ return {
343
+ buffer: dataViewBuffer(value),
344
+ byteOffset: dataViewByteOffset(value),
345
+ byteLength: dataViewByteLength(value),
346
+ };
347
+ }
348
+ return {
349
+ buffer: typedArrayBuffer(value),
350
+ byteOffset: typedArrayByteOffset(value),
351
+ byteLength: typedArrayByteLength(value),
352
+ };
353
+ }
354
+ // ---- Hardened devalue operations ---------------------------------------------
355
+ //
356
+ // The workflow reducers claim most special types before devalue's built-in
357
+ // handling runs, so these operations mainly govern plain objects, arrays,
358
+ // boxed primitives, thenable probes — and classification (`tagOf`), which
359
+ // runs for every object the reducers did not claim.
360
+ const KNOWN_VIEW_TAGS = new Set([
361
+ 'Int8Array',
362
+ 'Uint8Array',
363
+ 'Uint8ClampedArray',
364
+ 'Int16Array',
365
+ 'Uint16Array',
366
+ 'Float16Array',
367
+ 'Int32Array',
368
+ 'Uint32Array',
369
+ 'Float32Array',
370
+ 'Float64Array',
371
+ 'BigInt64Array',
372
+ 'BigUint64Array',
373
+ ]);
374
+ /**
375
+ * Tags that {@link brandOf} decides authoritatively. If the brand check said
376
+ * "not one of these" then a `Symbol.toStringTag` claiming one is a spoof, and
377
+ * honouring it would route the value into an extractor that requires the real
378
+ * internal slot (`Object.prototype.toString` semantics let any object claim
379
+ * `[object Date]`). Unbranded values that claim one of these are classified
380
+ * as plain objects instead.
381
+ */
382
+ const BRAND_DECIDED_TAGS = new Set([
383
+ 'Date',
384
+ 'RegExp',
385
+ 'Map',
386
+ 'Set',
387
+ 'Array',
388
+ 'DataView',
389
+ 'ArrayBuffer',
390
+ 'SharedArrayBuffer',
391
+ 'Number',
392
+ 'String',
393
+ 'Boolean',
394
+ 'BigInt',
395
+ 'URL',
396
+ 'URLSearchParams',
397
+ ...KNOWN_VIEW_TAGS,
398
+ ]);
399
+ /**
400
+ * Classifies a value by engine brand. Returns undefined when no brand
401
+ * matches (the caller falls back to `Symbol.toStringTag` semantics).
402
+ */
403
+ function brandOf(value) {
404
+ if (types.isDate(value))
405
+ return 'Date';
406
+ if (types.isRegExp(value))
407
+ return 'RegExp';
408
+ if (types.isMap(value))
409
+ return 'Map';
410
+ if (types.isSet(value))
411
+ return 'Set';
412
+ if (Array.isArray(value))
413
+ return 'Array';
414
+ if (types.isTypedArray(value)) {
415
+ const tag = typedArrayTag(value);
416
+ return tag !== undefined && KNOWN_VIEW_TAGS.has(tag) ? tag : undefined;
417
+ }
418
+ if (types.isDataView(value))
419
+ return 'DataView';
420
+ if (types.isArrayBuffer(value))
421
+ return 'ArrayBuffer';
422
+ if (types.isSharedArrayBuffer(value))
423
+ return 'SharedArrayBuffer';
424
+ if (types.isNumberObject(value))
425
+ return 'Number';
426
+ if (types.isStringObject(value))
427
+ return 'String';
428
+ if (types.isBooleanObject(value))
429
+ return 'Boolean';
430
+ if (types.isBigIntObject(value))
431
+ return 'BigInt';
432
+ if (isInstanceOfPrototype(value, URL.prototype))
433
+ return 'URL';
434
+ if (isInstanceOfPrototype(value, URLSearchParams.prototype)) {
435
+ return 'URLSearchParams';
436
+ }
437
+ return undefined;
438
+ }
439
+ /**
440
+ * Reads `Symbol.toStringTag` the way `Object.prototype.toString` would,
441
+ * but through descriptors — a data-property tag (the common case, e.g.
442
+ * Temporal polyfills) costs no workflow-code execution; an accessor tag is
443
+ * invoked (compat) and recorded.
444
+ */
445
+ function readToStringTag(value) {
446
+ const tag = readProperty(value, Symbol.toStringTag);
447
+ return typeof tag === 'string' ? tag : undefined;
448
+ }
449
+ export const hardenedStringifyOperations = {
450
+ tagOf: (value) => {
451
+ if (isProxy(value)) {
452
+ // A proxy's classification is answered by its traps — that is the
453
+ // only access path there is. Record it and preserve today's
454
+ // behavior for everything downstream.
455
+ recordProxy(value);
456
+ return defaultStringifyOperations.tagOf(value);
457
+ }
458
+ const brand = brandOf(value);
459
+ if (brand !== undefined)
460
+ return brand;
461
+ // No engine brand matched. A `Symbol.toStringTag` is still meaningful for
462
+ // types devalue identifies that way (`Temporal.*`), but one naming a
463
+ // brand-decided type is a spoof and is ignored.
464
+ const tag = readToStringTag(value);
465
+ if (tag === undefined || BRAND_DECIDED_TAGS.has(tag))
466
+ return 'Object';
467
+ return tag;
468
+ },
469
+ isThenable: (value) => {
470
+ if (types.isPromise(value))
471
+ return true;
472
+ return typeof readProperty(value, 'then') === 'function';
473
+ },
474
+ unbox: (boxed) => {
475
+ if (types.isNumberObject(boxed))
476
+ return numberValueOf(boxed);
477
+ if (types.isStringObject(boxed))
478
+ return stringValueOf(boxed);
479
+ if (types.isBooleanObject(boxed))
480
+ return booleanValueOf(boxed);
481
+ return bigIntValueOf(boxed);
482
+ },
483
+ toISOString: (date) => Number.isNaN(dateGetDate(date)) ? '' : dateToISOString(date),
484
+ toStringValue: (value) => {
485
+ // Reached for URL / URLSearchParams (when the reducers did not claim
486
+ // them, e.g. instances of a different realm's classes) and for
487
+ // toStringTag-branded objects like Temporal polyfills, whose string
488
+ // form only their own toString() can produce.
489
+ if (isInstanceOfPrototype(value, URL.prototype)) {
490
+ return urlHref(value);
491
+ }
492
+ if (isInstanceOfPrototype(value, URLSearchParams.prototype)) {
493
+ return urlSearchParamsToString(value);
494
+ }
495
+ recordGuestCode('method', `toString (${readToStringTag(value) ?? 'unknown'})`);
496
+ return value.toString();
497
+ },
498
+ regExpInfo: (regexp) => ({
499
+ source: regExpSource(regexp),
500
+ flags: regExpFlags(regexp),
501
+ }),
502
+ valuesOf: (set) => setToValues(set),
503
+ entriesOf: (map) => mapToEntries(map),
504
+ viewInfo: (view) => {
505
+ const info = viewInfo(view);
506
+ return {
507
+ ...info,
508
+ // devalue only reads `length` for typed-array subviews; DataView
509
+ // subviews are encoded from `byteLength`.
510
+ length: types.isDataView(view) ? 0 : typedArrayLength(view),
511
+ bufferByteLength: types.isSharedArrayBuffer(info.buffer)
512
+ ? sharedArrayBufferByteLength(info.buffer)
513
+ : arrayBufferByteLength(info.buffer),
514
+ };
515
+ },
516
+ shapeOf: (value) => {
517
+ if (isProxy(value))
518
+ recordProxy(value);
519
+ return defaultStringifyOperations.shapeOf(value);
520
+ },
521
+ get: (value, key) => readProperty(value, key),
522
+ };
523
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFyZGVuZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VyaWFsaXphdGlvbi9oYXJkZW5lZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBc0NyRCxJQUFJLFdBQVcsR0FBMEIsSUFBSSxDQUFDO0FBQzlDLElBQUksZUFBZSxHQUEyQixJQUFJLENBQUM7QUFFbkQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsS0FBaUMsRUFDakMsRUFBVztJQUVYLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUM7SUFDeEMsV0FBVyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUM7SUFDNUIsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9DLElBQUksQ0FBQztRQUNILE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDZCxDQUFDO1lBQVMsQ0FBQztRQUNULFdBQVcsR0FBRyxhQUFhLENBQUM7UUFDNUIsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUNwQyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7QUFFaEQsMkRBQTJEO0FBQzNELE1BQU0sVUFBVSxvQkFBb0IsQ0FBbUIsRUFBSztJQUMxRCxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUIsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFB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RyxJQUFJO1lBQ1AsaUVBQWlFO1lBQ2pFLDBDQUEwQztZQUMxQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDM0QsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3RELENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUMxQyxDQUFDLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO1FBQ3pCLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxPQUFPLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsR0FBRyxFQUFFLENBQUMsS0FBYSxFQUFFLEdBQW9CLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO0NBQ3ZFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhhcmRlbmVkIGludHJvc3BlY3Rpb24gZm9yIHNlcmlhbGl6aW5nIHZhbHVlcyB0aGF0IG1heSBvcmlnaW5hdGUgaW5zaWRlIGFcbiAqIHdvcmtmbG93IFZNIChgbm9kZTp2bWApIHNhbmRib3ggcmVhbG0uXG4gKlxuICogU2VyaWFsaXphdGlvbiBydW5zIG9uIHRoZSBob3N0LCBidXQgdGhlIHZhbHVlcyBpdCBpbnNwZWN0cyB3ZXJlXG4gKiBjb25zdHJ1Y3RlZCBieSB3b3JrZmxvdyBjb2RlIOKAlCBzbyBhIG5haXZlIGR5bmFtaWMgb3BlcmF0aW9uIGxpa2VcbiAqIGB2YWx1ZS50b0lTT1N0cmluZygpYCwgYEFycmF5LmZyb20obWFwKWAsIG9yIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxuICogZGlzcGF0Y2hlcyBpbnRvIHRoZSBzYW5kYm94IHJlYWxtIGFuZCBleGVjdXRlcyB3b3JrZmxvdyBjb2RlIChwYXRjaGVkXG4gKiBwcm90b3R5cGUgbWV0aG9kcywgZ2V0dGVycywgcHJveHkgdHJhcHMsIGBTeW1ib2wudG9TdHJpbmdUYWdgIGFjY2Vzc29ycykuXG4gKiBUaGF0IGlzIGEgZGV0ZXJtaW5pc20gaGF6YXJkOiBzZXJpYWxpemF0aW9uIGhhcHBlbnMgZXhhY3RseSBvbmNlIHBlclxuICogcGF5bG9hZCAobmV2ZXIgYWdhaW4gb24gcmVwbGF5KSwgc28gYW55IHdvcmtmbG93LXZpc2libGUgc2lkZSBlZmZlY3QgaXRcbiAqIHRyaWdnZXJzIGV4aXN0cyBvbmx5IG9uIHRoZSBsaXZlIGV4ZWN1dGlvbiBwYXRoIGFuZCBkaXZlcmdlcyBmcm9tIHJlcGxheS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBtYWtlcyBzZXJpYWxpemF0aW9uIHNpZGUtZWZmZWN0IGZyZWUgd2hlcmV2ZXIgdGhlIGRhdGEgYWxsb3dzXG4gKiBpdCwgYW5kICpvYnNlcnZhYmxlKiB3aGVyZSBpdCBkb2VzIG5vdDpcbiAqXG4gKiAtICoqQ2xhc3NpZmljYXRpb24qKiB1c2VzIGVuZ2luZS1sZXZlbCBicmFuZCBjaGVja3MgKGBub2RlOnV0aWxgIGB0eXBlc2AsXG4gKiAgIGludGVybmFsLXNsb3QgcHJvYmVzKSBpbnN0ZWFkIG9mIGBpbnN0YW5jZW9mYCAvIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxuICogICDigJQgaW1tdW5lIHRvIGBTeW1ib2wuaGFzSW5zdGFuY2VgLCBgU3ltYm9sLnRvU3RyaW5nVGFnYCwgYW5kIHJlYXNzaWduZWRcbiAqICAgZ2xvYmFscy5cbiAqIC0gKipFeHRyYWN0aW9uKiogZ29lcyB0aHJvdWdoIGludHJpbnNpY3MgY2FwdHVyZWQgYXQgbW9kdWxlIGxvYWQgKGhvc3RcbiAqICAgYm9vdCwgYmVmb3JlIGFueSB3b3JrZmxvdyBjb2RlIHJ1bnMpLiBJbnRlcm5hbCBzbG90cyBhcmUgcmVhbG0tYWdub3N0aWMsXG4gKiAgIHNvIGhvc3QgaW50cmluc2ljcyByZWFkIFZNLXJlYWxtIG9iamVjdHMgd2l0aG91dCB0b3VjaGluZyB0aGUgc2FuZGJveCdzXG4gKiAgIChwYXRjaGFibGUpIHByb3RvdHlwZXMuXG4gKiAtICoqUHJvcGVydHkgYWNjZXNzKiogcmVhZHMgdGhyb3VnaCBkZXNjcmlwdG9ycywgc28gcGxhaW4gZGF0YSBuZXZlclxuICogICBpbnZva2VzIGFueXRoaW5nLiBXaGVyZSB3b3JrZmxvdyBjb2RlICptdXN0KiBydW4gYmVjYXVzZSB0aGUgZGF0YSBpdHNlbGZcbiAqICAgbGl2ZXMgYmVoaW5kIGl0IOKAlCBnZXR0ZXJzLCBwcm94aWVzLCBjdXN0b20gYFtXT1JLRkxPV19TRVJJQUxJWkVdYFxuICogICBtZXRob2RzLCBgdG9TdHJpbmcoKWAgb24gdG9TdHJpbmdUYWctYnJhbmRlZCBvYmplY3RzIChlLmcuIFRlbXBvcmFsXG4gKiAgIHBvbHlmaWxscykg4oCUIHRoZSBleGVjdXRpb24gaXMgcHJlc2VydmVkIGZvciBjb21wYXRpYmlsaXR5IGFuZCByZWNvcmRlZFxuICogICBpbiB0aGUgYWN0aXZlIHtAbGluayBHdWVzdENvZGVTdGF0c30gc2luaywgc28gY2FsbGVycyAoZS5nLiBhIHJldGFpbmVkLVZNXG4gKiAgIGdhdGUpIGNhbiByZWFjdC5cbiAqXG4gKiAqKlJlY29yZGluZyBpcyBub3QgcHJldmVudGlvbi4qKiBGb3IgdGhlIHJlY29yZGVkIGNhc2VzIHRoZSBkZXRlcm1pbmlzbVxuICogaGF6YXJkIGlzIHN0aWxsIGxpdmU6IGEgZ2V0dGVyIHRoYXQgY2FsbHMgYE1hdGgucmFuZG9tKClgIGFkdmFuY2VzIHRoZVxuICogcnVuJ3Mgc2VlZGVkIFBSTkcgZHVyaW5nIHNlcmlhbGl6YXRpb24sIGFuZCBiZWNhdXNlIHNlcmlhbGl6YXRpb24gaGFwcGVuc1xuICogZXhhY3RseSBvbmNlIGFuZCBpcyBuZXZlciByZXBsYXllZCwgZXZlcnkgc3Vic2VxdWVudCBkcmF3IOKAlCBpbmNsdWRpbmcgdGhlXG4gKiBjb3JyZWxhdGlvbiBpZHMgZGVyaXZlZCBmcm9tIHRoYXQgc3RyZWFtIOKAlCBzaGlmdHMgcmVsYXRpdmUgdG8gcmVwbGF5LiBUaGVcbiAqIHJlcG9ydCBpcyB0aGUgb25seSB0cmFjZSBvZiB0aGF0OyBhY3Rpbmcgb24gaXQgKHdhcm5pbmcsIGRlbW90aW5nIGFcbiAqIHJldGFpbmVkIFZNIHRvIHJlcGxheSkgaXMgbGVmdCB0byB0aGUgY2FsbGVyLlxuICpcbiAqIFRoZSByZWNvcmRlciBpcyBhbWJpZW50IG1vZHVsZSBzdGF0ZSwgc2V0IGZvciB0aGUgZHVyYXRpb24gb2YgYVxuICogc3luY2hyb25vdXMgYHN0cmluZ2lmeWAgY2FsbCB2aWEge0BsaW5rIHdpdGhHdWVzdENvZGVTdGF0c30uIGRldmFsdWUnc1xuICogYHN0cmluZ2lmeWAgaXMgZnVsbHkgc3luY2hyb25vdXMsIHNvIHRoaXMgaXMgc2FmZSB3aXRob3V0IGFzeW5jIGNvbnRleHQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdpZnlPcGVyYXRpb25zIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBkZWZhdWx0U3RyaW5naWZ5T3BlcmF0aW9ucyB9IGZyb20gJ2RldmFsdWUnO1xuXG4vLyAtLS0tIEd1ZXN0IGNvZGUgb2JzZXJ2YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEEgc2luZ2xlIGluc3RhbmNlIG9mIHdvcmtmbG93IChndWVzdCkgY29kZSBleGVjdXRpbmcgZHVyaW5nIHNlcmlhbGl6YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3Vlc3RDb2RlRXhlY3V0aW9uIHtcbiAgLyoqXG4gICAqIFdoYXQgZm9yY2VkIHRoZSBleGVjdXRpb246XG4gICAqIC0gYGdldHRlcmA6IGFuIGFjY2Vzc29yIHByb3BlcnR5IHdhcyBpbnZva2VkIHRvIHJlYWQgZGF0YVxuICAgKiAtIGBwcm94eWA6IGEgcHJveHkgd2FzIGludHJvc3BlY3RlZCwgZmlyaW5nIGl0cyB0cmFwcy4gTm90ZSB0aGlzIGFsc29cbiAgICogICBpbXBsaWVzIGEgKipzaGFwZSBjaGFuZ2UqKjogYnJhbmQgY2hlY2tzIGFuc3dlciBcIm5vdCB0aGF0IHR5cGVcIiBmb3IgYVxuICAgKiAgIHByb3h5LCBzbyBhIHByb3hpZWQgYE1hcGAgc2VyaWFsaXplcyBhcyBhIHBsYWluIG9iamVjdCByYXRoZXIgdGhhbiBhcyBhXG4gICAqICAgYE1hcGAsIGFuZCB0aGlzIHJlcG9ydCBpcyB0aGUgb25seSBldmlkZW5jZSBvZiBpdC4gKFN1Y2ggdmFsdWVzIHdlcmVcbiAgICogICBuZXZlciBzZXJpYWxpemFibGUgYmVmb3JlIOKAlCB0aGUgaW50ZXJuYWwtc2xvdCByZWFkcyBpbiB0aGUgcHJldmlvdXNcbiAgICogICBpbXBsZW1lbnRhdGlvbiB0aHJldyBvbiB0aGVtIOKAlCBzbyB0aGUgc2hhcGUgY2hhbmdlIHJlcGxhY2VzIGEgY3Jhc2gsXG4gICAqICAgYnV0IGl0IGlzIHNpbGVudC4pXG4gICAqIC0gYG1ldGhvZGA6IGEgd29ya2Zsb3ctZGVmaW5lZCBmdW5jdGlvbiB3YXMgaW52b2tlZCAoZS5nLiBhIGN1c3RvbVxuICAgKiAgIGBbV09SS0ZMT1dfU0VSSUFMSVpFXWAgc2VyaWFsaXplciwgYHRvU3RyaW5nKClgIG9uIGFcbiAgICogICBgU3ltYm9sLnRvU3RyaW5nVGFnYC1icmFuZGVkIG9iamVjdCwgYSBkdWNrLXR5cGVkIGBnZXRUaW1lKClgLCBvciBhXG4gICAqICAgYF9fY2xvc3VyZVZhcnNGbmAgdGhpcyBwYWNrYWdlIGRpZCBub3QgZ2VuZXJhdGUpXG4gICAqL1xuICBraW5kOiAnZ2V0dGVyJyB8ICdwcm94eScgfCAnbWV0aG9kJztcbiAgLyoqIEJlc3QtZWZmb3J0IGNvbnRleHQ6IHRoZSBwcm9wZXJ0eSBrZXksIG1ldGhvZCBuYW1lLCBvciB0YWcgaW52b2x2ZWQuICovXG4gIGRldGFpbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBNdXRhYmxlIHNpbmsgcmVjb3JkaW5nIGV2ZXJ5IHdvcmtmbG93LWNvZGUgZXhlY3V0aW9uIHNlcmlhbGl6YXRpb24gY291bGRcbiAqIG5vdCBhdm9pZC4gUGFzcyB2aWEgYENvZGVjT3B0aW9ucy5ndWVzdENvZGVTdGF0c2A7IGNvbnN1bWVycyB0aGF0IHJldGFpblxuICogdGhlIFZNIGFjcm9zcyBzdGVwcyBjYW4gdXNlIGEgbm9uLWVtcHR5IGBleGVjdXRpb25zYCBhcnJheSBhcyBhIHNpZ25hbFxuICogdGhhdCB0aGUgVk0gc3RhdGUgbWF5IGhhdmUgYmVlbiBwZXJ0dXJiZWQgYnkgc2VyaWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHdWVzdENvZGVTdGF0cyB7XG4gIGV4ZWN1dGlvbnM6IEd1ZXN0Q29kZUV4ZWN1dGlvbltdO1xufVxuXG5sZXQgYWN0aXZlU3RhdHM6IEd1ZXN0Q29kZVN0YXRzIHwgbnVsbCA9IG51bGw7XG5sZXQgcmVwb3J0ZWRQcm94aWVzOiBXZWFrU2V0PG9iamVjdD4gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBSdW5zIGBmbmAgKHN5bmNocm9ub3VzbHkpIHdpdGggYHN0YXRzYCBhcyB0aGUgYWN0aXZlIGd1ZXN0LWNvZGUgc2luay5cbiAqIE5lc3RlZCBjYWxscyBzdGFjayBjb3JyZWN0bHk7IGEgYG51bGxgL2B1bmRlZmluZWRgIHNpbmsgZGlzYWJsZXNcbiAqIHJlY29yZGluZyB3aXRob3V0IGRpc2FibGluZyBoYXJkZW5pbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoR3Vlc3RDb2RlU3RhdHM8VD4oXG4gIHN0YXRzOiBHdWVzdENvZGVTdGF0cyB8IHVuZGVmaW5lZCxcbiAgZm46ICgpID0+IFRcbik6IFQge1xuICBjb25zdCBwcmV2aW91c1N0YXRzID0gYWN0aXZlU3RhdHM7XG4gIGNvbnN0IHByZXZpb3VzUHJveGllcyA9IHJlcG9ydGVkUHJveGllcztcbiAgYWN0aXZlU3RhdHMgPSBzdGF0cyA/PyBudWxsO1xuICByZXBvcnRlZFByb3hpZXMgPSBzdGF0cyA/IG5ldyBXZWFrU2V0KCkgOiBudWxsO1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZVN0YXRzID0gcHJldmlvdXNTdGF0cztcbiAgICByZXBvcnRlZFByb3hpZXMgPSBwcmV2aW91c1Byb3hpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBDbG9zdXJlLXZhcmlhYmxlIGZ1bmN0aW9ucyB0aGF0IGFycml2ZWQgdGhyb3VnaCBgdXNlU3RlcGAgd2hlbiBhIHN0ZXBcbiAqIHByb3h5IHdhcyBidWlsdC4gVGhlIHN0ZXAtZnVuY3Rpb24gcmVkdWNlciBtdXN0IGludm9rZSBgX19jbG9zdXJlVmFyc0ZuYCxcbiAqIGFuZCB0aGUgY29tcGlsZXItZ2VuZXJhdGVkIGZ1bmN0aW9uIGlzIGEgcHVyZSBzZXF1ZW5jZSBvZiBsZXhpY2FsIHJlYWRzIOKAlFxuICogYnV0IHRoZSAqcHJvcGVydHkqIGlzIHJlYWNoYWJsZSBmcm9tIHdvcmtmbG93IGNvZGUsIHdoaWNoIGNhbiByZXBsYWNlIGl0XG4gKiB3aXRoIGFuIGFyYml0cmFyeSBmdW5jdGlvbi4gVGhlIHJlZHVjZXIgY2hlY2tzIG1lbWJlcnNoaXAgaGVyZSBpbnN0ZWFkIG9mXG4gKiBhc3N1bWluZyBwcm92ZW5hbmNlLCBhbmQgcmVwb3J0cyBhbnl0aGluZyBpdCBkb2VzIG5vdCByZWNvZ25pemUuXG4gKlxuICogTWVtYmVyc2hpcCBwcm92ZXMgdGhlIGZ1bmN0aW9uIHdhcyBwYXNzZWQgdG8gYHVzZVN0ZXBgLCBub3QgdGhhdCB0aGVcbiAqIGNvbXBpbGVyIGdlbmVyYXRlZCBpdCDigJQgd29ya2Zsb3cgY29kZSBjYW4gY2FsbCBgdXNlU3RlcGAgZGlyZWN0bHkgYW5kXG4gKiBsYXVuZGVyIGEgc2lkZS1lZmZlY3RmdWwgZnVuY3Rpb24gcGFzdCB0aGUgcmVwb3J0LiBUaGF0IGNvc3RzIGEgbWlzc2luZ1xuICogcmVwb3J0IGVudHJ5LCBuZXZlciBpbmNvcnJlY3Qgb3V0cHV0OyBjbG9zaW5nIGl0IG1lYW5zIGJyYW5kaW5nIGF0IHRoZVxuICogY29tcGlsZXIsIHdoaWNoIGRvZXMgbm90IGJlbG9uZyBoZXJlLlxuICovXG5jb25zdCB1c2VTdGVwQ2xvc3VyZUZucyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuLyoqIE1hcmtzIGEgZnVuY3Rpb24gYXMgaGF2aW5nIGJlZW4gcGFzc2VkIHRvIGB1c2VTdGVwYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrVXNlU3RlcENsb3N1cmVGbjxUIGV4dGVuZHMgb2JqZWN0PihmbjogVCk6IFQge1xuICB1c2VTdGVwQ2xvc3VyZUZucy5hZGQoZm4pO1xuICByZXR1cm4gZm47XG59XG5cbi8qKiBXaGV0aGVyIGBmbmAgd2FzIG1hcmtlZCBieSB7QGxpbmsgbWFya1VzZVN0ZXBDbG9zdXJlRm59LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVXNlU3RlcENsb3N1cmVGbihmbjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmIHVzZVN0ZXBDbG9zdXJlRm5zLmhhcyhmbiBhcyBvYmplY3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkR3Vlc3RDb2RlKFxuICBraW5kOiBHdWVzdENvZGVFeGVjdXRpb25bJ2tpbmQnXSxcbiAgZGV0YWlsPzogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKCFhY3RpdmVTdGF0cykgcmV0dXJuO1xuICBjb25zdCBleGVjdXRpb246IEd1ZXN0Q29kZUV4ZWN1dGlvbiA9IHsga2luZCB9O1xuICBpZiAoZGV0YWlsICE9PSB1bmRlZmluZWQpIGV4ZWN1dGlvbi5kZXRhaWwgPSBkZXRhaWw7XG4gIGFjdGl2ZVN0YXRzLmV4ZWN1dGlvbnMucHVzaChleGVjdXRpb24pO1xufVxuXG4vKiogUmVjb3JkcyBhIHByb3h5IG9uY2UgcGVyIHNlcmlhbGl6YXRpb24gcGFzcyAocHJveGllcyBmaXJlIG1hbnkgdHJhcHMpLiAqL1xuZnVuY3Rpb24gcmVjb3JkUHJveHkodmFsdWU6IG9iamVjdCk6IHZvaWQge1xuICBpZiAoIWFjdGl2ZVN0YXRzIHx8ICFyZXBvcnRlZFByb3hpZXMpIHJldHVybjtcbiAgaWYgKHJlcG9ydGVkUHJveGllcy5oYXModmFsdWUpKSByZXR1cm47XG4gIHJlcG9ydGVkUHJveGllcy5hZGQodmFsdWUpO1xuICByZWNvcmRHdWVzdENvZGUoJ3Byb3h5Jyk7XG59XG5cbi8vIC0tLS0gQ2FwdHVyZWQgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gQ2FwdHVyZWQgYXQgbW9kdWxlIGxvYWQg4oCUIGhvc3QgYm9vdCwgYmVmb3JlIGFueSB3b3JrZmxvdyBidW5kbGUgY2FuIHJ1biDigJRcbi8vIGFuZCBpbnZva2VkIHdpdGggZXhwbGljaXQgcmVjZWl2ZXJzLCBzbyBubyBsb29rdXAgZXZlciByZXNvbHZlcyB0aHJvdWdoIGFcbi8vIHNhbmRib3gtcmVhY2hhYmxlIHByb3RvdHlwZS4gRXZlcnkgbWVtYmVyIGJlbG93IGV4aXN0cyBvbiBldmVyeSBzdXBwb3J0ZWRcbi8vIGVuZ2luZSAoTm9kZSAxOCspLCBzbyBhIG1pc3Npbmcgb25lIGlzIGEgYnVnIGluIHRoaXMgdGFibGU6IGZhaWwgYXQgaW1wb3J0XG4vLyByYXRoZXIgdGhhbiBzZXJpYWxpemUgdGhyb3VnaCBhIGxpdmUgKHBhdGNoYWJsZSkgbG9va3VwIGxhdGVyLlxuXG5jb25zdCB1bmN1cnJ5VGhpcyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmJpbmQoRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwpIGFzIDxcbiAgVCxcbiAgQSBleHRlbmRzIHVua25vd25bXSxcbiAgUixcbj4oXG4gIGZuOiAodGhpczogVCwgLi4uYXJnczogQSkgPT4gUlxuKSA9PiAodGhpc0FyZzogVCwgLi4uYXJnczogQSkgPT4gUjtcblxuZnVuY3Rpb24gcHJvdG9HZXR0ZXI8VD4oXG4gIHByb3RvdHlwZTogb2JqZWN0LFxuICBrZXk6IFByb3BlcnR5S2V5XG4pOiAodmFsdWU6IHVua25vd24pID0+IFQge1xuICBjb25zdCBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwga2V5KT8uZ2V0O1xuICBpZiAoIWdldHRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBpbnRyaW5zaWMgZ2V0dGVyOiAke1N0cmluZyhrZXkpfWApO1xuICB9XG4gIHJldHVybiB1bmN1cnJ5VGhpcyhnZXR0ZXIpIGFzICh2YWx1ZTogdW5rbm93bikgPT4gVDtcbn1cblxuLy8gRUNNQVNjcmlwdCBpbnRyaW5zaWNzLiBBbGwgcmVhZCBpbnRlcm5hbCBzbG90cywgc28gdGhleSB3b3JrIG9uIHZhbHVlc1xuLy8gZnJvbSBhbnkgcmVhbG0gYW5kIGFyZSB1bmFmZmVjdGVkIGJ5IHByb3RvdHlwZSBwYXRjaGluZyBpbiBhbnkgcmVhbG0uXG5cbi8qKiBgRGF0ZS5wcm90b3R5cGUuZ2V0RGF0ZWAsIGZvciBpbnZhbGlkLWRhdGUgY2hlY2tzLiAqL1xuZXhwb3J0IGNvbnN0IGRhdGVHZXREYXRlID0gdW5jdXJyeVRoaXMoRGF0ZS5wcm90b3R5cGUuZ2V0RGF0ZSk7XG4vKiogYERhdGUucHJvdG90eXBlLmdldFRpbWVgLiAqL1xuZXhwb3J0IGNvbnN0IGRhdGVHZXRUaW1lID0gdW5jdXJyeVRoaXMoRGF0ZS5wcm90b3R5cGUuZ2V0VGltZSk7XG4vKiogYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYC4gKi9cbmV4cG9ydCBjb25zdCBkYXRlVG9JU09TdHJpbmcgPSB1bmN1cnJ5VGhpcyhEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyk7XG4vKiogYFJlZ0V4cC5wcm90b3R5cGUuc291cmNlYCBnZXR0ZXIuICovXG5leHBvcnQgY29uc3QgcmVnRXhwU291cmNlID0gcHJvdG9HZXR0ZXI8c3RyaW5nPihSZWdFeHAucHJvdG90eXBlLCAnc291cmNlJyk7XG4vKiogYFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3NgIGdldHRlci4gKi9cbmV4cG9ydCBjb25zdCByZWdFeHBGbGFncyA9IHByb3RvR2V0dGVyPHN0cmluZz4oUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJyk7XG4vKiogYEFycmF5QnVmZmVyLnByb3RvdHlwZS5ieXRlTGVuZ3RoYCBnZXR0ZXIgKGludGVybmFsIHNsb3QgcmVhZCkuICovXG5leHBvcnQgY29uc3QgYXJyYXlCdWZmZXJCeXRlTGVuZ3RoID0gcHJvdG9HZXR0ZXI8bnVtYmVyPihcbiAgQXJyYXlCdWZmZXIucHJvdG90eXBlLFxuICAnYnl0ZUxlbmd0aCdcbik7XG5cbmNvbnN0IG1hcEVudHJpZXMgPSB1bmN1cnJ5VGhpcyhNYXAucHJvdG90eXBlLmVudHJpZXMpO1xuY29uc3Qgc2V0VmFsdWVzID0gdW5jdXJyeVRoaXMoU2V0LnByb3RvdHlwZS52YWx1ZXMpO1xuY29uc3QgbnVtYmVyVmFsdWVPZiA9IHVuY3VycnlUaGlzKE51bWJlci5wcm90b3R5cGUudmFsdWVPZik7XG5jb25zdCBzdHJpbmdWYWx1ZU9mID0gdW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS52YWx1ZU9mKTtcbmNvbnN0IGJvb2xlYW5WYWx1ZU9mID0gdW5jdXJyeVRoaXMoQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZik7XG5jb25zdCBiaWdJbnRWYWx1ZU9mID0gdW5jdXJyeVRoaXMoXG4gIEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZiBhcyAodGhpczogdW5rbm93bikgPT4gYmlnaW50XG4pO1xuXG5jb25zdCBUeXBlZEFycmF5UHJvdG90eXBlOiBvYmplY3QgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRhZyA9IHByb3RvR2V0dGVyPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIFR5cGVkQXJyYXlQcm90b3R5cGUsXG4gIFN5bWJvbC50b1N0cmluZ1RhZ1xuKTtcbmNvbnN0IHR5cGVkQXJyYXlCdWZmZXIgPSBwcm90b0dldHRlcjxBcnJheUJ1ZmZlckxpa2U+KFxuICBUeXBlZEFycmF5UHJvdG90eXBlLFxuICAnYnVmZmVyJ1xuKTtcbmNvbnN0IHR5cGVkQXJyYXlCeXRlT2Zmc2V0ID0gcHJvdG9HZXR0ZXI8bnVtYmVyPihcbiAgVHlwZWRBcnJheVByb3RvdHlwZSxcbiAgJ2J5dGVPZmZzZXQnXG4pO1xuY29uc3QgdHlwZWRBcnJheUJ5dGVMZW5ndGggPSBwcm90b0dldHRlcjxudW1iZXI+KFxuICBUeXBlZEFycmF5UHJvdG90eXBlLFxuICAnYnl0ZUxlbmd0aCdcbik7XG5jb25zdCB0eXBlZEFycmF5TGVuZ3RoID0gcHJvdG9HZXR0ZXI8bnVtYmVyPihUeXBlZEFycmF5UHJvdG90eXBlLCAnbGVuZ3RoJyk7XG5jb25zdCBkYXRhVmlld0J1ZmZlciA9IHByb3RvR2V0dGVyPEFycmF5QnVmZmVyTGlrZT4oXG4gIERhdGFWaWV3LnByb3RvdHlwZSxcbiAgJ2J1ZmZlcidcbik7XG5jb25zdCBkYXRhVmlld0J5dGVPZmZzZXQgPSBwcm90b0dldHRlcjxudW1iZXI+KFxuICBEYXRhVmlldy5wcm90b3R5cGUsXG4gICdieXRlT2Zmc2V0J1xuKTtcbmNvbnN0IGRhdGFWaWV3Qnl0ZUxlbmd0aCA9IHByb3RvR2V0dGVyPG51bWJlcj4oXG4gIERhdGFWaWV3LnByb3RvdHlwZSxcbiAgJ2J5dGVMZW5ndGgnXG4pO1xuY29uc3Qgc2hhcmVkQXJyYXlCdWZmZXJCeXRlTGVuZ3RoID0gcHJvdG9HZXR0ZXI8bnVtYmVyPihcbiAgU2hhcmVkQXJyYXlCdWZmZXIucHJvdG90eXBlLFxuICAnYnl0ZUxlbmd0aCdcbik7XG5cbi8vIEhvc3QgKFdIQVRXRykgY2xhc3Nlcy4gSW5qZWN0ZWQgaW50byB0aGUgc2FuZGJveCBieSByZWZlcmVuY2UsIHNvXG4vLyBpbnN0YW5jZXMgZnJvbSBhbnkgcmVhbG0gY2FycnkgdGhlc2UgcHJvdG90eXBlcyDigJQgYW5kIHRoZSBzaGFyZWRcbi8vIHByb3RvdHlwZXMgYXJlIHJlYWNoYWJsZSBmcm9tIHdvcmtmbG93IGNvZGUsIHdoaWNoIG1ha2VzIHRoZSBib290LXRpbWVcbi8vIGNhcHR1cmUgKHJhdGhlciB0aGFuIGEgbGl2ZSBsb29rdXApIGxvYWQtYmVhcmluZy5cbmNvbnN0IGhlYWRlcnNJdGVyYXRvciA9IHVuY3VycnlUaGlzKEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0pO1xuY29uc3QgdXJsSHJlZkdldHRlciA9IHByb3RvR2V0dGVyPHN0cmluZz4oVVJMLnByb3RvdHlwZSwgJ2hyZWYnKTtcbmNvbnN0IHVybFNlYXJjaFBhcmFtc1RvU3RyaW5nTWV0aG9kID0gdW5jdXJyeVRoaXMoXG4gIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUudG9TdHJpbmdcbik7XG5cbi8vIC0tLS0gU2FmZSBhY2Nlc3MgcHJpbWl0aXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IHsgaXNQcm94eSB9ID0gdHlwZXM7XG5cbmNvbnN0IGZ1bmN0aW9uVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcpO1xuXG4vKipcbiAqIFdoZXRoZXIgYW4gYWNjZXNzb3IgaXMgcHJvdmlkZWQgYnkgdGhlIGVuZ2luZSBvciB0aGUgaG9zdCwgcmF0aGVyIHRoYW5cbiAqIGRlZmluZWQgYnkgd29ya2Zsb3cgY29kZS4gU2VyaWFsaXphdGlvbiBtdXN0IHJlYWQgc29tZSBwcm9wZXJ0aWVzIHRoYXQgYXJlXG4gKiBhY2Nlc3NvcnMgYnkgY29uc3RydWN0aW9uIChWOCBkZWZpbmVzIGBzdGFja2AgYXMgYW4gb3duIGFjY2Vzc29yIG9uIGV2ZXJ5XG4gKiBFcnJvciBpbnN0YW5jZTsgTm9kZSBpbXBsZW1lbnRzIGBET01FeGNlcHRpb24ucHJvdG90eXBlLm1lc3NhZ2VgIGluXG4gKiBKYXZhU2NyaXB0KSwgYW5kIHJlcG9ydGluZyB0aG9zZSB3b3VsZCBkcm93biB0aGUgc2lnbmFsIGluIG5vaXNlLlxuICpcbiAqIC0gRW5naW5lIGFjY2Vzc29ycyBhcmUgbmF0aXZlIGNvZGUsIGRldGVjdGVkIHZpYSB0aGUgY2FwdHVyZWQgaG9zdFxuICogICBgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nYCAoY3Jvc3MtcmVhbG0sIHVuaW50ZXJjZXB0YWJsZSkuIEJvdW5kXG4gKiAgIGZ1bmN0aW9ucyBhbmQgY2FsbGFibGUgUHJveGllcyBhbHNvIHByZXNlbnQgYXMgbmF0aXZlIGNvZGUgYnV0IHJ1blxuICogICB3b3JrZmxvdyBjb2RlLCBzbyBib3RoIGFyZSBleGNsdWRlZCBmaXJzdC5cbiAqIC0gSG9zdCBidWlsdGlucyBpbXBsZW1lbnRlZCBpbiBKYXZhU2NyaXB0IGFyZSBvcmRpbmFyeSBmdW5jdGlvbnMsIGJ1dCB0aGV5XG4gKiAgIGJlbG9uZyB0byB0aGUgaG9zdCByZWFsbSDigJQgZGV0ZWN0ZWQgYnkgY29tcGFyaW5nIHRoZSBmdW5jdGlvbidzXG4gKiAgIHByb3RvdHlwZSBhZ2FpbnN0IHRoZSBob3N0IGBGdW5jdGlvbi5wcm90b3R5cGVgLiBXb3JrZmxvdyBjb2RlIHRoYXRcbiAqICAgcmVhY2hlcyBhIGhvc3QgZnVuY3Rpb24gY2FuIGBzZXRQcm90b3R5cGVPZmAgaXRzIG93biBnZXR0ZXIgdG9cbiAqICAgaW1wZXJzb25hdGUgdGhpczsgdGhhdCBjb3N0cyBhIG1pc3NpbmcgcmVwb3J0IGVudHJ5LCBuZXZlciBpbmNvcnJlY3RcbiAqICAgb3V0cHV0LlxuICpcbiAqIFY4J3MgbmF0aXZlIGBzdGFja2AgZ2V0dGVyIGNhbiBpdHNlbGYgaW52b2tlIGEgd29ya2Zsb3ctZGVmaW5lZFxuICogYEVycm9yLnByZXBhcmVTdGFja1RyYWNlYDsgdGhhdCBpbmRpcmVjdGlvbiBpcyBub3QgZGV0ZWN0ZWQgaGVyZS5cbiAqL1xuZnVuY3Rpb24gaXNFbmdpbmVBY2Nlc3NvcihnZXR0ZXI6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBpZiAoaXNQcm94eShnZXR0ZXIpKSByZXR1cm4gZmFsc2U7XG4gIC8vIEEgYm91bmQgZnVuY3Rpb24gc3RyaW5naWZpZXMgYXMgbmF0aXZlIGNvZGUgYnV0IHJ1bnMgaXRzIHRhcmdldCDigJQgdGhlXG4gIC8vIG9uZSBwYXNzaXZlIGRpc3Rpbmd1aXNoZXIgVjggZXhwb3NlcyBpcyB0aGUgYG5hbWVgIG93biBwcm9wZXJ0eVxuICAvLyAoYFwiYm91bmQgZm5cImApLiBXb3JrZmxvdyBjb2RlIGNhbiByZWRlZmluZSB0aGUgbmFtZSB0byBoaWRlIGl0OyB0aGF0XG4gIC8vIGNvc3RzIGEgbWlzc2luZyByZXBvcnQgZW50cnksIGxpa2UgdGhlIG90aGVyIGltcGVyc29uYXRpb24gY2F2ZWF0cy5cbiAgY29uc3QgbmFtZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2V0dGVyLCAnbmFtZScpPy52YWx1ZTtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBuYW1lLnN0YXJ0c1dpdGgoJ2JvdW5kICcpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoXG4gICAgZnVuY3Rpb25Ub1N0cmluZyhnZXR0ZXIgYXMgKCkgPT4gdW5rbm93bikuZW5kc1dpdGgoJ3sgW25hdGl2ZSBjb2RlXSB9JykgfHxcbiAgICBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGdldHRlcikgPT09IEZ1bmN0aW9uLnByb3RvdHlwZVxuICApO1xufVxuXG4vKipcbiAqIFJlYWRzIGB2YWx1ZVtrZXldYCB3aXRoIGBbW0dldF1dYCBzZW1hbnRpY3MsIGJ1dCB0aHJvdWdoIGRlc2NyaXB0b3JzOlxuICogcGxhaW4gZGF0YSBwcm9wZXJ0aWVzIG5ldmVyIGludm9rZSBhbnl0aGluZzsgYWNjZXNzb3IgcHJvcGVydGllcyBhcmVcbiAqIGludm9rZWQgKHRoZSBkYXRhIGxpdmVzIGJlaGluZCB0aGVtKSBhbmQgcmVjb3JkZWQ7IHByb3hpZXMgZmFsbCBiYWNrIHRvXG4gKiBhIHBsYWluIHJlYWQgKHRoZWlyIHRyYXBzIGFyZSB0aGUgb25seSBhY2Nlc3MgcGF0aCkgYW5kIGFyZSByZWNvcmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRQcm9wZXJ0eSh2YWx1ZTogdW5rbm93biwga2V5OiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICBpZiAoXG4gICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGlzUHJveHkodmFsdWUpKSB7XG4gICAgcmVjb3JkUHJveHkodmFsdWUpO1xuICAgIHJldHVybiAodmFsdWUgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPilba2V5XTtcbiAgfVxuXG4gIGxldCBjdXJyZW50OiBvYmplY3QgfCBudWxsID0gdmFsdWU7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGlzUHJveHkoY3VycmVudCkpIHtcbiAgICAgIC8vIGEgcHJveHkgaW4gdGhlIHByb3RvdHlwZSBjaGFpbiDigJQgaXRzIHRyYXBzIGFuc3dlciB0aGUgbG9va3VwXG4gICAgICByZWNvcmRQcm94eShjdXJyZW50KTtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPilba2V5XTtcbiAgICB9XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3VycmVudCwga2V5KTtcbiAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgcmV0dXJuIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgICBpZiAoZGVzY3JpcHRvci5nZXQpIHtcbiAgICAgICAgaWYgKCFpc0VuZ2luZUFjY2Vzc29yKGRlc2NyaXB0b3IuZ2V0KSkge1xuICAgICAgICAgIHJlY29yZEd1ZXN0Q29kZSgnZ2V0dGVyJywgU3RyaW5nKGtleSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldC5jYWxsKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIHNldHRlci1vbmx5IHByb3BlcnR5XG4gICAgfVxuICAgIGN1cnJlbnQgPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYGtleSBpbiB2YWx1ZWAgc2VtYW50aWNzIHdpdGhvdXQgZmlyaW5nIHByb3h5IHRyYXBzIGZvciBvcmRpbmFyeVxuICogb2JqZWN0cy4gUHJveGllcyBmYWxsIGJhY2sgdG8gdGhlIGBpbmAgb3BlcmF0b3IgYW5kIGFyZSByZWNvcmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Byb3BlcnR5KHZhbHVlOiB1bmtub3duLCBrZXk6IFByb3BlcnR5S2V5KTogYm9vbGVhbiB7XG4gIGlmIChcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgICByZXR1cm4ga2V5IGluICh2YWx1ZSBhcyBvYmplY3QpO1xuICB9XG5cbiAgbGV0IGN1cnJlbnQ6IG9iamVjdCB8IG51bGwgPSB2YWx1ZTtcbiAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICBpZiAoaXNQcm94eShjdXJyZW50KSkge1xuICAgICAgcmVjb3JkUHJveHkoY3VycmVudCk7XG4gICAgICByZXR1cm4ga2V5IGluICh2YWx1ZSBhcyBvYmplY3QpO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdXJyZW50LCBrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXJyZW50ID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogYHZhbHVlIGluc3RhbmNlb2YgQ2Agc2VtYW50aWNzIGZvciBhIGtub3duIGBDLnByb3RvdHlwZWAsIHdpdGhvdXRcbiAqIGNvbnN1bHRpbmcgYFN5bWJvbC5oYXNJbnN0YW5jZWAgKHdoaWNoIHdvcmtmbG93IGNvZGUgY2FuIGRlZmluZSkuIFVzZWRcbiAqIGZvciBob3N0IGNsYXNzZXMgdGhhdCBhcmUgaW5qZWN0ZWQgaW50byB0aGUgc2FuZGJveCAoSGVhZGVycywgVVJMLFxuICogVVJMU2VhcmNoUGFyYW1zLCBET01FeGNlcHRpb24pLCB3aGVyZSB0aGUgaW5zdGFuY2VzIOKAlCBmcm9tIGFueSByZWFsbSB0aGVcbiAqIGhvc3QgaGFuZGVkIHRoZSBjbGFzcyB0byDigJQgY2FycnkgdGhlIGhvc3QgcHJvdG90eXBlIGluIHRoZWlyIGNoYWluLlxuICpcbiAqIFByb3hpZXMgYXJlIHdhbGtlZCByYXRoZXIgdGhhbiByZWplY3RlZDogYFJlZmxlY3QuZ2V0UHJvdG90eXBlT2ZgIGZpcmVzXG4gKiB0aGUgcHJveHkncyBgZ2V0UHJvdG90eXBlT2ZgIHRyYXAsIG1hdGNoaW5nIGBpbnN0YW5jZW9mYCBzZW1hbnRpY3MsIGFuZFxuICogcmVhbCB2YWx1ZXMgZGVwZW5kIG9uIHRoYXQg4oCUIE5leHQuanMgaGFuZHMgdGhlIHJ1bnRpbWUgYSBwcm94aWVkXG4gKiBgTmV4dFJlcXVlc3RgLCBhbmQgYW5zd2VyaW5nIFwibm90IGEgUmVxdWVzdFwiIGZvciBpdCB3b3VsZCBzaWxlbnRseSBicmVha1xuICogd2ViaG9va3MuIFRoZSB0cmFwcyBhcmUgZ3Vlc3Qtb2JzZXJ2YWJsZSwgc28gdGhlIHByb3h5IGlzIHJlY29yZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcHJvdG90eXBlOiBvYmplY3QgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIXByb3RvdHlwZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBpZiAoaXNQcm94eSh2YWx1ZSkpIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgbGV0IGN1cnJlbnQ6IG9iamVjdCB8IG51bGwgPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gcHJvdG90eXBlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNQcm94eShjdXJyZW50KSkgcmVjb3JkUHJveHkoY3VycmVudCk7XG4gICAgY3VycmVudCA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyAtLS0tIEludHJpbnNpYy1iYWNrZWQgZXh0cmFjdGlvbiBoZWxwZXJzICh1c2VkIGJ5IHRoZSByZWR1Y2VycykgLS0tLS0tLS0tLS0tLVxuLy9cbi8vIEludHJpbnNpY3MgcmVhZCBpbnRlcm5hbCBzbG90cywgd2hpY2ggYSBQcm94eSBkb2VzIG5vdCBoYXZlIOKAlCBpbnZva2luZyBvbmVcbi8vIHdpdGggYSBwcm94eSByZWNlaXZlciB0aHJvd3MsIHdoZXJlIHRoZSBwcmUtZXhpc3RpbmcgZHluYW1pYyByZWFkIGZvcndhcmRlZFxuLy8gdGhyb3VnaCB0aGUgdHJhcC4gRm9yIHRoZSAocmFyZSkgcHJveHkgY2FzZSwgZmFsbCBiYWNrIHRvIHRoZSBkeW5hbWljIHJlYWRcbi8vIHNvIGJlaGF2aW9yIGlzIHVuY2hhbmdlZCwgYW5kIHJlY29yZCB0aGF0IHRoZSB0cmFwcyByYW4uXG5cbi8qKiBgVVJMLnByb3RvdHlwZS5ocmVmYCBnZXR0ZXIuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsSHJlZih2YWx1ZTogVVJMKTogc3RyaW5nIHtcbiAgaWYgKGlzUHJveHkodmFsdWUpKSB7XG4gICAgcmVjb3JkUHJveHkodmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZS5ocmVmO1xuICB9XG4gIHJldHVybiB1cmxIcmVmR2V0dGVyKHZhbHVlKTtcbn1cblxuLyoqIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnRvU3RyaW5nYCDigJQgcmV0dXJucyBgJydgIGlmZiBlbXB0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZyh2YWx1ZTogVVJMU2VhcmNoUGFyYW1zKTogc3RyaW5nIHtcbiAgaWYgKGlzUHJveHkodmFsdWUpKSB7XG4gICAgcmVjb3JkUHJveHkodmFsdWUpO1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG4gIHJldHVybiB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZ01ldGhvZCh2YWx1ZSk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgYSBIZWFkZXJzIGluc3RhbmNlIHRocm91Z2ggdGhlIGNhcHR1cmVkIGhvc3QgaXRlcmF0b3IsIHNvIHRoZVxuICogaXRlcmF0b3Igb2JqZWN0IOKAlCBhbmQgaXRzIGBuZXh0YCDigJQgYXJlIGhvc3QtcmVhbG0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWFkZXJzVG9FbnRyaWVzKHZhbHVlOiBIZWFkZXJzKTogW3N0cmluZywgc3RyaW5nXVtdIHtcbiAgaWYgKGlzUHJveHkodmFsdWUpKSB7XG4gICAgcmVjb3JkUHJveHkodmFsdWUpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlKSBhcyBbc3RyaW5nLCBzdHJpbmddW107XG4gIH1cbiAgcmV0dXJuIFsuLi5oZWFkZXJzSXRlcmF0b3IodmFsdWUpXSBhcyBbc3RyaW5nLCBzdHJpbmddW107XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgYSBnZW51aW5lIE1hcCdzIGVudHJpZXMgZW50aXJlbHkgdGhyb3VnaCBob3N0IGludHJpbnNpY3M6IHRoZVxuICogaXRlcmF0b3Igb2JqZWN0IGlzIGNyZWF0ZWQgYnkgdGhlIGhvc3QgYE1hcC5wcm90b3R5cGUuZW50cmllc2AsIHNvIGl0c1xuICogcmVhbG0g4oCUIGFuZCB0aGVyZWZvcmUgaXRzIGBuZXh0YCDigJQgaXMgdGhlIGhvc3Qncywgbm90IHRoZSBzYW5kYm94J3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb0VudHJpZXMoXG4gIHZhbHVlOiBNYXA8dW5rbm93biwgdW5rbm93bj5cbik6IFt1bmtub3duLCB1bmtub3duXVtdIHtcbiAgcmV0dXJuIFsuLi5tYXBFbnRyaWVzKHZhbHVlKV07XG59XG5cbi8qKiBTZWUge0BsaW5rIG1hcFRvRW50cmllc30uICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VG9WYWx1ZXModmFsdWU6IFNldDx1bmtub3duPik6IHVua25vd25bXSB7XG4gIHJldHVybiBbLi4uc2V0VmFsdWVzKHZhbHVlKV07XG59XG5cbi8qKlxuICogVGhlIGJ5dGVzIG9mIGFuIGBBcnJheUJ1ZmZlclZpZXdgLCByZWFkIHZpYSBpbnRlcm5hbC1zbG90IGdldHRlcnMg4oCUXG4gKiBvd24tcHJvcGVydHkgc2hhZG93aW5nIGFuZCBwcm90b3R5cGUgcGF0Y2hlcyBjYW5ub3QgY2hhbmdlIHdoaWNoIGJ5dGVzXG4gKiBhcmUgc2VyaWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpZXdJbmZvKHZhbHVlOiBBcnJheUJ1ZmZlclZpZXcpOiB7XG4gIGJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlO1xuICBieXRlT2Zmc2V0OiBudW1iZXI7XG4gIGJ5dGVMZW5ndGg6IG51bWJlcjtcbn0ge1xuICBpZiAodHlwZXMuaXNEYXRhVmlldyh2YWx1ZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyOiBkYXRhVmlld0J1ZmZlcih2YWx1ZSksXG4gICAgICBieXRlT2Zmc2V0OiBkYXRhVmlld0J5dGVPZmZzZXQodmFsdWUpLFxuICAgICAgYnl0ZUxlbmd0aDogZGF0YVZpZXdCeXRlTGVuZ3RoKHZhbHVlKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgYnVmZmVyOiB0eXBlZEFycmF5QnVmZmVyKHZhbHVlKSxcbiAgICBieXRlT2Zmc2V0OiB0eXBlZEFycmF5Qnl0ZU9mZnNldCh2YWx1ZSksXG4gICAgYnl0ZUxlbmd0aDogdHlwZWRBcnJheUJ5dGVMZW5ndGgodmFsdWUpLFxuICB9O1xufVxuXG4vLyAtLS0tIEhhcmRlbmVkIGRldmFsdWUgb3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyBUaGUgd29ya2Zsb3cgcmVkdWNlcnMgY2xhaW0gbW9zdCBzcGVjaWFsIHR5cGVzIGJlZm9yZSBkZXZhbHVlJ3MgYnVpbHQtaW5cbi8vIGhhbmRsaW5nIHJ1bnMsIHNvIHRoZXNlIG9wZXJhdGlvbnMgbWFpbmx5IGdvdmVybiBwbGFpbiBvYmplY3RzLCBhcnJheXMsXG4vLyBib3hlZCBwcmltaXRpdmVzLCB0aGVuYWJsZSBwcm9iZXMg4oCUIGFuZCBjbGFzc2lmaWNhdGlvbiAoYHRhZ09mYCksIHdoaWNoXG4vLyBydW5zIGZvciBldmVyeSBvYmplY3QgdGhlIHJlZHVjZXJzIGRpZCBub3QgY2xhaW0uXG5cbmNvbnN0IEtOT1dOX1ZJRVdfVEFHUyA9IG5ldyBTZXQoW1xuICAnSW50OEFycmF5JyxcbiAgJ1VpbnQ4QXJyYXknLFxuICAnVWludDhDbGFtcGVkQXJyYXknLFxuICAnSW50MTZBcnJheScsXG4gICdVaW50MTZBcnJheScsXG4gICdGbG9hdDE2QXJyYXknLFxuICAnSW50MzJBcnJheScsXG4gICdVaW50MzJBcnJheScsXG4gICdGbG9hdDMyQXJyYXknLFxuICAnRmxvYXQ2NEFycmF5JyxcbiAgJ0JpZ0ludDY0QXJyYXknLFxuICAnQmlnVWludDY0QXJyYXknLFxuXSk7XG5cbi8qKlxuICogVGFncyB0aGF0IHtAbGluayBicmFuZE9mfSBkZWNpZGVzIGF1dGhvcml0YXRpdmVseS4gSWYgdGhlIGJyYW5kIGNoZWNrIHNhaWRcbiAqIFwibm90IG9uZSBvZiB0aGVzZVwiIHRoZW4gYSBgU3ltYm9sLnRvU3RyaW5nVGFnYCBjbGFpbWluZyBvbmUgaXMgYSBzcG9vZiwgYW5kXG4gKiBob25vdXJpbmcgaXQgd291bGQgcm91dGUgdGhlIHZhbHVlIGludG8gYW4gZXh0cmFjdG9yIHRoYXQgcmVxdWlyZXMgdGhlIHJlYWxcbiAqIGludGVybmFsIHNsb3QgKGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBzZW1hbnRpY3MgbGV0IGFueSBvYmplY3QgY2xhaW1cbiAqIGBbb2JqZWN0IERhdGVdYCkuIFVuYnJhbmRlZCB2YWx1ZXMgdGhhdCBjbGFpbSBvbmUgb2YgdGhlc2UgYXJlIGNsYXNzaWZpZWRcbiAqIGFzIHBsYWluIG9iamVjdHMgaW5zdGVhZC5cbiAqL1xuY29uc3QgQlJBTkRfREVDSURFRF9UQUdTID0gbmV3IFNldChbXG4gICdEYXRlJyxcbiAgJ1JlZ0V4cCcsXG4gICdNYXAnLFxuICAnU2V0JyxcbiAgJ0FycmF5JyxcbiAgJ0RhdGFWaWV3JyxcbiAgJ0FycmF5QnVmZmVyJyxcbiAgJ1NoYXJlZEFycmF5QnVmZmVyJyxcbiAgJ051bWJlcicsXG4gICdTdHJpbmcnLFxuICAnQm9vbGVhbicsXG4gICdCaWdJbnQnLFxuICAnVVJMJyxcbiAgJ1VSTFNlYXJjaFBhcmFtcycsXG4gIC4uLktOT1dOX1ZJRVdfVEFHUyxcbl0pO1xuXG4vKipcbiAqIENsYXNzaWZpZXMgYSB2YWx1ZSBieSBlbmdpbmUgYnJhbmQuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gbm8gYnJhbmRcbiAqIG1hdGNoZXMgKHRoZSBjYWxsZXIgZmFsbHMgYmFjayB0byBgU3ltYm9sLnRvU3RyaW5nVGFnYCBzZW1hbnRpY3MpLlxuICovXG5mdW5jdGlvbiBicmFuZE9mKHZhbHVlOiBvYmplY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZXMuaXNEYXRlKHZhbHVlKSkgcmV0dXJuICdEYXRlJztcbiAgaWYgKHR5cGVzLmlzUmVnRXhwKHZhbHVlKSkgcmV0dXJuICdSZWdFeHAnO1xuICBpZiAodHlwZXMuaXNNYXAodmFsdWUpKSByZXR1cm4gJ01hcCc7XG4gIGlmICh0eXBlcy5pc1NldCh2YWx1ZSkpIHJldHVybiAnU2V0JztcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gJ0FycmF5JztcbiAgaWYgKHR5cGVzLmlzVHlwZWRBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCB0YWcgPSB0eXBlZEFycmF5VGFnKHZhbHVlKTtcbiAgICByZXR1cm4gdGFnICE9PSB1bmRlZmluZWQgJiYgS05PV05fVklFV19UQUdTLmhhcyh0YWcpID8gdGFnIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlcy5pc0RhdGFWaWV3KHZhbHVlKSkgcmV0dXJuICdEYXRhVmlldyc7XG4gIGlmICh0eXBlcy5pc0FycmF5QnVmZmVyKHZhbHVlKSkgcmV0dXJuICdBcnJheUJ1ZmZlcic7XG4gIGlmICh0eXBlcy5pc1NoYXJlZEFycmF5QnVmZmVyKHZhbHVlKSkgcmV0dXJuICdTaGFyZWRBcnJheUJ1ZmZlcic7XG4gIGlmICh0eXBlcy5pc051bWJlck9iamVjdCh2YWx1ZSkpIHJldHVybiAnTnVtYmVyJztcbiAgaWYgKHR5cGVzLmlzU3RyaW5nT2JqZWN0KHZhbHVlKSkgcmV0dXJuICdTdHJpbmcnO1xuICBpZiAodHlwZXMuaXNCb29sZWFuT2JqZWN0KHZhbHVlKSkgcmV0dXJuICdCb29sZWFuJztcbiAgaWYgKHR5cGVzLmlzQmlnSW50T2JqZWN0KHZhbHVlKSkgcmV0dXJuICdCaWdJbnQnO1xuICBpZiAoaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCBVUkwucHJvdG90eXBlKSkgcmV0dXJuICdVUkwnO1xuICBpZiAoaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlKSkge1xuICAgIHJldHVybiAnVVJMU2VhcmNoUGFyYW1zJztcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWRzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHRoZSB3YXkgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIHdvdWxkLFxuICogYnV0IHRocm91Z2ggZGVzY3JpcHRvcnMg4oCUIGEgZGF0YS1wcm9wZXJ0eSB0YWcgKHRoZSBjb21tb24gY2FzZSwgZS5nLlxuICogVGVtcG9yYWwgcG9seWZpbGxzKSBjb3N0cyBubyB3b3JrZmxvdy1jb2RlIGV4ZWN1dGlvbjsgYW4gYWNjZXNzb3IgdGFnIGlzXG4gKiBpbnZva2VkIChjb21wYXQpIGFuZCByZWNvcmRlZC5cbiAqL1xuZnVuY3Rpb24gcmVhZFRvU3RyaW5nVGFnKHZhbHVlOiBvYmplY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWcgPSByZWFkUHJvcGVydHkodmFsdWUsIFN5bWJvbC50b1N0cmluZ1RhZyk7XG4gIHJldHVybiB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyA/IHRhZyA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNvbnN0IGhhcmRlbmVkU3RyaW5naWZ5T3BlcmF0aW9uczogUGFydGlhbDxTdHJpbmdpZnlPcGVyYXRpb25zPiA9IHtcbiAgdGFnT2Y6ICh2YWx1ZTogb2JqZWN0KSA9PiB7XG4gICAgaWYgKGlzUHJveHkodmFsdWUpKSB7XG4gICAgICAvLyBBIHByb3h5J3MgY2xhc3NpZmljYXRpb24gaXMgYW5zd2VyZWQgYnkgaXRzIHRyYXBzIOKAlCB0aGF0IGlzIHRoZVxuICAgICAgLy8gb25seSBhY2Nlc3MgcGF0aCB0aGVyZSBpcy4gUmVjb3JkIGl0IGFuZCBwcmVzZXJ2ZSB0b2RheSdzXG4gICAgICAvLyBiZWhhdmlvciBmb3IgZXZlcnl0aGluZyBkb3duc3RyZWFtLlxuICAgICAgcmVjb3JkUHJveHkodmFsdWUpO1xuICAgICAgcmV0dXJuIGRlZmF1bHRTdHJpbmdpZnlPcGVyYXRpb25zLnRhZ09mKHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgYnJhbmQgPSBicmFuZE9mKHZhbHVlKTtcbiAgICBpZiAoYnJhbmQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGJyYW5kO1xuICAgIC8vIE5vIGVuZ2luZSBicmFuZCBtYXRjaGVkLiBBIGBTeW1ib2wudG9TdHJpbmdUYWdgIGlzIHN0aWxsIG1lYW5pbmdmdWwgZm9yXG4gICAgLy8gdHlwZXMgZGV2YWx1ZSBpZGVudGlmaWVzIHRoYXQgd2F5IChgVGVtcG9yYWwuKmApLCBidXQgb25lIG5hbWluZyBhXG4gICAgLy8gYnJhbmQtZGVjaWRlZCB0eXBlIGlzIGEgc3Bvb2YgYW5kIGlzIGlnbm9yZWQuXG4gICAgY29uc3QgdGFnID0gcmVhZFRvU3RyaW5nVGFnKHZhbHVlKTtcbiAgICBpZiAodGFnID09PSB1bmRlZmluZWQgfHwgQlJBTkRfREVDSURFRF9UQUdTLmhhcyh0YWcpKSByZXR1cm4gJ09iamVjdCc7XG4gICAgcmV0dXJuIHRhZztcbiAgfSxcblxuICBpc1RoZW5hYmxlOiAodmFsdWU6IHsgdGhlbj86IHVua25vd24gfSkgPT4ge1xuICAgIGlmICh0eXBlcy5pc1Byb21pc2UodmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdHlwZW9mIHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3RoZW4nKSA9PT0gJ2Z1bmN0aW9uJztcbiAgfSxcblxuICB1bmJveDogKGJveGVkOiBvYmplY3QpID0+IHtcbiAgICBpZiAodHlwZXMuaXNOdW1iZXJPYmplY3QoYm94ZWQpKSByZXR1cm4gbnVtYmVyVmFsdWVPZihib3hlZCk7XG4gICAgaWYgKHR5cGVzLmlzU3RyaW5nT2JqZWN0KGJveGVkKSkgcmV0dXJuIHN0cmluZ1ZhbHVlT2YoYm94ZWQpO1xuICAgIGlmICh0eXBlcy5pc0Jvb2xlYW5PYmplY3QoYm94ZWQpKSByZXR1cm4gYm9vbGVhblZhbHVlT2YoYm94ZWQpO1xuICAgIHJldHVybiBiaWdJbnRWYWx1ZU9mKGJveGVkKTtcbiAgfSxcblxuICB0b0lTT1N0cmluZzogKGRhdGU6IERhdGUpID0+XG4gICAgTnVtYmVyLmlzTmFOKGRhdGVHZXREYXRlKGRhdGUpKSA/ICcnIDogZGF0ZVRvSVNPU3RyaW5nKGRhdGUpLFxuXG4gIHRvU3RyaW5nVmFsdWU6ICh2YWx1ZTogb2JqZWN0KSA9PiB7XG4gICAgLy8gUmVhY2hlZCBmb3IgVVJMIC8gVVJMU2VhcmNoUGFyYW1zICh3aGVuIHRoZSByZWR1Y2VycyBkaWQgbm90IGNsYWltXG4gICAgLy8gdGhlbSwgZS5nLiBpbnN0YW5jZXMgb2YgYSBkaWZmZXJlbnQgcmVhbG0ncyBjbGFzc2VzKSBhbmQgZm9yXG4gICAgLy8gdG9TdHJpbmdUYWctYnJhbmRlZCBvYmplY3RzIGxpa2UgVGVtcG9yYWwgcG9seWZpbGxzLCB3aG9zZSBzdHJpbmdcbiAgICAvLyBmb3JtIG9ubHkgdGhlaXIgb3duIHRvU3RyaW5nKCkgY2FuIHByb2R1Y2UuXG4gICAgaWYgKGlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgVVJMLnByb3RvdHlwZSkpIHtcbiAgICAgIHJldHVybiB1cmxIcmVmKHZhbHVlIGFzIFVSTCk7XG4gICAgfVxuICAgIGlmIChpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUpKSB7XG4gICAgICByZXR1cm4gdXJsU2VhcmNoUGFyYW1zVG9TdHJpbmcodmFsdWUgYXMgVVJMU2VhcmNoUGFyYW1zKTtcbiAgICB9XG4gICAgcmVjb3JkR3Vlc3RDb2RlKFxuICAgICAgJ21ldGhvZCcsXG4gICAgICBgdG9TdHJpbmcgKCR7cmVhZFRvU3RyaW5nVGFnKHZhbHVlKSA/PyAndW5rbm93bid9KWBcbiAgICApO1xuICAgIHJldHVybiAodmFsdWUgYXMgeyB0b1N0cmluZygpOiBzdHJpbmcgfSkudG9TdHJpbmcoKTtcbiAgfSxcblxuICByZWdFeHBJbmZvOiAocmVnZXhwOiBSZWdFeHApID0+ICh7XG4gICAgc291cmNlOiByZWdFeHBTb3VyY2UocmVnZXhwKSxcbiAgICBmbGFnczogcmVnRXhwRmxhZ3MocmVnZXhwKSxcbiAgfSksXG5cbiAgdmFsdWVzT2Y6IChzZXQ6IFNldDx1bmtub3duPikgPT4gc2V0VG9WYWx1ZXMoc2V0KSxcbiAgZW50cmllc09mOiAobWFwOiBNYXA8dW5rbm93biwgdW5rbm93bj4pID0+XG4gICAgbWFwVG9FbnRyaWVzKG1hcCkgYXMgW3Vua25vd24sIHVua25vd25dW10sXG5cbiAgdmlld0luZm86ICh2aWV3OiBBcnJheUJ1ZmZlclZpZXcpID0+IHtcbiAgICBjb25zdCBpbmZvID0gdmlld0luZm8odmlldyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmluZm8sXG4gICAgICAvLyBkZXZhbHVlIG9ubHkgcmVhZHMgYGxlbmd0aGAgZm9yIHR5cGVkLWFycmF5IHN1YnZpZXdzOyBEYXRhVmlld1xuICAgICAgLy8gc3Vidmlld3MgYXJlIGVuY29kZWQgZnJvbSBgYnl0ZUxlbmd0aGAuXG4gICAgICBsZW5ndGg6IHR5cGVzLmlzRGF0YVZpZXcodmlldykgPyAwIDogdHlwZWRBcnJheUxlbmd0aCh2aWV3KSxcbiAgICAgIGJ1ZmZlckJ5dGVMZW5ndGg6IHR5cGVzLmlzU2hhcmVkQXJyYXlCdWZmZXIoaW5mby5idWZmZXIpXG4gICAgICAgID8gc2hhcmVkQXJyYXlCdWZmZXJCeXRlTGVuZ3RoKGluZm8uYnVmZmVyKVxuICAgICAgICA6IGFycmF5QnVmZmVyQnl0ZUxlbmd0aChpbmZvLmJ1ZmZlciksXG4gICAgfTtcbiAgfSxcblxuICBzaGFwZU9mOiAodmFsdWU6IG9iamVjdCkgPT4ge1xuICAgIGlmIChpc1Byb3h5KHZhbHVlKSkgcmVjb3JkUHJveHkodmFsdWUpO1xuICAgIHJldHVybiBkZWZhdWx0U3RyaW5naWZ5T3BlcmF0aW9ucy5zaGFwZU9mKHZhbHVlKTtcbiAgfSxcblxuICBnZXQ6ICh2YWx1ZTogb2JqZWN0LCBrZXk6IHN0cmluZyB8IG51bWJlcikgPT4gcmVhZFByb3BlcnR5KHZhbHVlLCBrZXkpLFxufTtcbiJdfQ==
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Serialization module — public API.
3
+ *
4
+ * Re-exports the mode-specific serialize/deserialize functions and
5
+ * the codec/format/encryption abstractions.
6
+ */
7
+ export type { Codec, CodecOptions, SerializationMode } from './codec.js';
8
+ export { devalueCodec } from './codec-devalue.js';
9
+ export { COMPRESSION_MIN_BYTES, type CompressionCodec, type CompressionStats, compress, decompress, isCompressed, } from './compression.js';
10
+ export { type CryptoKey, decrypt, type EncryptionKeyParam, encrypt, } from './encryption.js';
11
+ export { decodeFormatPrefix, encodeWithFormatPrefix, isEncrypted, peekFormatPrefix, } from './format.js';
12
+ export type { GuestCodeExecution, GuestCodeStats } from './hardened.js';
13
+ export type { FormatPrefix, Reducers, Revivers, SerializableSpecial, } from './types.js';
14
+ export { isFormatPrefix, SerializationFormat } from './types.js';
15
+ import * as client from './client.js';
16
+ import * as step from './step.js';
17
+ import * as workflow from './workflow.js';
18
+ export { workflow, step, client };
19
+ export { revive } from './reducers/common.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serialization/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EACL,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,QAAQ,EACR,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,KAAK,SAAS,EACd,OAAO,EACP,KAAK,kBAAkB,EACvB,OAAO,GACR,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAExE,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAGlC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC"}