@logixjs/sandbox 0.0.1 → 0.0.2

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 (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -0,0 +1,731 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ LifecycleContext,
5
+ makeLogicPhaseError
6
+ } from "./chunk-XRXUJZ3X.js";
7
+ import {
8
+ makeMatch,
9
+ makeMatchTag
10
+ } from "./chunk-3U4CAKCX.js";
11
+ import {
12
+ create
13
+ } from "./chunk-Y5I45PEB.js";
14
+ import {
15
+ inSyncTransactionFiber,
16
+ makeTaskRunner
17
+ } from "./chunk-KQWWFYBF.js";
18
+ import {
19
+ Tag
20
+ } from "./chunk-ZWE3P6X2.js";
21
+ import {
22
+ make
23
+ } from "./chunk-5WN5IGKA.js";
24
+ import {
25
+ currentDiagnosticsLevel,
26
+ record
27
+ } from "./chunk-CVZPRIDB.js";
28
+ import {
29
+ RunSessionTag
30
+ } from "./chunk-RS5FFPUV.js";
31
+ import {
32
+ getRuntimeInternals,
33
+ setBoundInternals
34
+ } from "./chunk-6FKWRVP4.js";
35
+ import {
36
+ isDevEnv
37
+ } from "./chunk-GP37MEGJ.js";
38
+
39
+ // ../logix-core/src/internal/runtime/core/mutativePatches.ts
40
+ var toPatchPathString = (path) => {
41
+ if (typeof path === "string") {
42
+ const trimmed = path.trim();
43
+ return trimmed.length > 0 ? trimmed : void 0;
44
+ }
45
+ if (!Array.isArray(path)) return void 0;
46
+ const parts = [];
47
+ for (const seg of path) {
48
+ if (typeof seg === "string") {
49
+ if (seg.length > 0) parts.push(seg);
50
+ continue;
51
+ }
52
+ if (typeof seg === "number" && Number.isFinite(seg)) {
53
+ parts.push(String(Math.floor(seg)));
54
+ continue;
55
+ }
56
+ }
57
+ if (parts.length === 0) return "*";
58
+ return parts.join(".");
59
+ };
60
+ var mutateWithPatchPaths = (base, mutator) => {
61
+ const out = create(base, mutator, {
62
+ enablePatches: {
63
+ pathAsArray: true,
64
+ arrayLengthAssignment: false
65
+ }
66
+ });
67
+ if (!Array.isArray(out)) {
68
+ return { nextState: out, patchPaths: [] };
69
+ }
70
+ const nextState = out[0];
71
+ const patches = out[1] ?? [];
72
+ const set = /* @__PURE__ */ new Set();
73
+ for (const patch of patches) {
74
+ const p = toPatchPathString(patch?.path);
75
+ if (!p) continue;
76
+ set.add(p);
77
+ }
78
+ return {
79
+ nextState,
80
+ patchPaths: Array.from(set)
81
+ };
82
+ };
83
+
84
+ // ../logix-core/src/internal/runtime/BoundApiRuntime.ts
85
+ import { Context, Effect, FiberRef, Option, Schema, Stream } from "../effect.js";
86
+ var LogicBuilderFactory = (runtime, runtimeInternals) => {
87
+ const flowApi = make(runtime, runtimeInternals);
88
+ return (stream, triggerName) => {
89
+ const runWithStateTransaction = (origin, body) => runtimeInternals.txn.runWithStateTransaction(origin, body);
90
+ const taskRunnerRuntime = {
91
+ moduleId: runtime.moduleId,
92
+ instanceId: runtimeInternals.instanceId,
93
+ runWithStateTransaction,
94
+ resolveConcurrencyPolicy: runtimeInternals.concurrency.resolveConcurrencyPolicy
95
+ };
96
+ const builder = {
97
+ debounce: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(
98
+ flowApi.debounce(ms)(stream),
99
+ triggerName
100
+ ),
101
+ throttle: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(
102
+ flowApi.throttle(ms)(stream),
103
+ triggerName
104
+ ),
105
+ filter: (predicate) => LogicBuilderFactory(runtime, runtimeInternals)(
106
+ flowApi.filter(predicate)(stream),
107
+ triggerName
108
+ ),
109
+ map: (f) => LogicBuilderFactory(runtime, runtimeInternals)(
110
+ stream.pipe(Stream.map(f)),
111
+ triggerName
112
+ ),
113
+ run(eff, options) {
114
+ return flowApi.run(eff, options)(stream);
115
+ },
116
+ runLatest(eff, options) {
117
+ return flowApi.runLatest(eff, options)(stream);
118
+ },
119
+ runExhaust(eff, options) {
120
+ return flowApi.runExhaust(eff, options)(stream);
121
+ },
122
+ runParallel(eff, options) {
123
+ return flowApi.runParallel(eff, options)(stream);
124
+ },
125
+ runFork: (eff) => Effect.forkScoped(flowApi.run(eff)(stream)).pipe(
126
+ Effect.asVoid
127
+ ),
128
+ runParallelFork: (eff) => Effect.forkScoped(
129
+ flowApi.runParallel(eff)(stream)
130
+ ).pipe(
131
+ Effect.asVoid
132
+ ),
133
+ runTask: (config) => makeTaskRunner(
134
+ stream,
135
+ "task",
136
+ taskRunnerRuntime,
137
+ {
138
+ ...config,
139
+ triggerName: config.triggerName ?? triggerName
140
+ }
141
+ ),
142
+ runParallelTask: (config) => makeTaskRunner(
143
+ stream,
144
+ "parallel",
145
+ taskRunnerRuntime,
146
+ {
147
+ ...config,
148
+ triggerName: config.triggerName ?? triggerName
149
+ }
150
+ ),
151
+ runLatestTask: (config) => makeTaskRunner(
152
+ stream,
153
+ "latest",
154
+ taskRunnerRuntime,
155
+ {
156
+ ...config,
157
+ triggerName: config.triggerName ?? triggerName
158
+ }
159
+ ),
160
+ runExhaustTask: (config) => makeTaskRunner(
161
+ stream,
162
+ "exhaust",
163
+ taskRunnerRuntime,
164
+ {
165
+ ...config,
166
+ triggerName: config.triggerName ?? triggerName
167
+ }
168
+ ),
169
+ toStream: () => stream,
170
+ update: (reducer) => Stream.runForEach(
171
+ stream,
172
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
173
+ {
174
+ kind: "watcher:update",
175
+ name: triggerName
176
+ },
177
+ () => Effect.gen(function* () {
178
+ const prev = yield* runtime.getState;
179
+ const next = reducer(prev, payload);
180
+ if (Effect.isEffect(next)) {
181
+ const exit = yield* Effect.exit(
182
+ next
183
+ );
184
+ if (exit._tag === "Failure") {
185
+ yield* Effect.logError("Flow error", exit.cause);
186
+ return;
187
+ }
188
+ yield* runtime.setState(exit.value);
189
+ return;
190
+ }
191
+ yield* runtime.setState(next);
192
+ })
193
+ )
194
+ ).pipe(
195
+ Effect.catchAllCause(
196
+ (cause) => Effect.logError("Flow error", cause)
197
+ )
198
+ ),
199
+ mutate: (reducer) => Stream.runForEach(
200
+ stream,
201
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
202
+ {
203
+ kind: "watcher:mutate",
204
+ name: triggerName
205
+ },
206
+ () => Effect.gen(function* () {
207
+ const prev = yield* runtime.getState;
208
+ const recordPatch = runtimeInternals?.txn.recordStatePatch;
209
+ const { nextState, patchPaths } = mutateWithPatchPaths(
210
+ prev,
211
+ (draft) => {
212
+ reducer(draft, payload);
213
+ }
214
+ );
215
+ for (const path of patchPaths) {
216
+ recordPatch?.({
217
+ path,
218
+ reason: "watcher:mutate"
219
+ });
220
+ }
221
+ yield* runtime.setState(nextState);
222
+ })
223
+ )
224
+ ).pipe(
225
+ Effect.catchAllCause(
226
+ (cause) => Effect.logError("Flow error", cause)
227
+ )
228
+ )
229
+ };
230
+ const andThen = (handlerOrEff) => {
231
+ if (typeof handlerOrEff === "function") {
232
+ if (handlerOrEff.length >= 2) {
233
+ return builder.update(handlerOrEff);
234
+ }
235
+ return builder.run(handlerOrEff);
236
+ }
237
+ return builder.run(handlerOrEff);
238
+ };
239
+ const pipe = function() {
240
+ const fns = arguments;
241
+ let acc = builder;
242
+ for (let i = 0; i < fns.length; i++) {
243
+ acc = fns[i](acc);
244
+ }
245
+ return acc;
246
+ };
247
+ return Object.assign(builder, { pipe, andThen });
248
+ };
249
+ };
250
+ function make2(shape, runtime, options) {
251
+ const runtimeInternals = getRuntimeInternals(runtime);
252
+ const getPhase = options?.getPhase ?? (() => "run");
253
+ const getCurrentPhase = () => {
254
+ const phaseService = options?.phaseService;
255
+ const phase = phaseService?.current ?? getPhase();
256
+ return phase === "setup" ? "setup" : "run";
257
+ };
258
+ const guardRunOnly = (kind, api2) => {
259
+ const phaseService = options?.phaseService;
260
+ const phase = phaseService?.current ?? getPhase();
261
+ if (phase === "setup") {
262
+ throw makeLogicPhaseError(
263
+ kind,
264
+ api2,
265
+ "setup",
266
+ options?.moduleId
267
+ );
268
+ }
269
+ };
270
+ const flowApi = make(runtime, runtimeInternals);
271
+ const makeIntentBuilder = (runtime_) => LogicBuilderFactory(runtime_, runtimeInternals);
272
+ const withLifecycle = (available, missing) => Effect.serviceOption(LifecycleContext).pipe(
273
+ Effect.flatMap(
274
+ (maybe) => Option.match(maybe, {
275
+ onSome: available,
276
+ onNone: missing
277
+ })
278
+ )
279
+ );
280
+ const withPlatform = (invoke) => Effect.serviceOption(Tag).pipe(
281
+ Effect.flatMap(
282
+ (maybe) => Option.match(maybe, {
283
+ onSome: invoke,
284
+ onNone: () => Effect.void
285
+ })
286
+ )
287
+ );
288
+ const emitSetupOnlyViolation = (api2) => record({
289
+ type: "diagnostic",
290
+ moduleId: runtime.moduleId,
291
+ instanceId: runtime.instanceId,
292
+ code: "logic::invalid_phase",
293
+ severity: "error",
294
+ message: `${api2} is setup-only and is not allowed in run phase.`,
295
+ hint: "\u5C06 $.lifecycle.* \u8C03\u7528\u79FB\u52A8\u5230 Module.logic builder \u7684\u540C\u6B65\u90E8\u5206\uFF08return \u4E4B\u524D\uFF09\u7528\u4E8E\u6CE8\u518C\uFF1Brun \u6BB5\u9700\u8981\u52A8\u6001\u8D44\u6E90\u6E05\u7406\u65F6\uFF0C\u8BF7\u4F7F\u7528 Effect.acquireRelease / Scope finalizer\uFF0C\u800C\u4E0D\u662F late \u6CE8\u518C onDestroy\u3002",
296
+ kind: "lifecycle_in_run"
297
+ });
298
+ const createIntentBuilder = (stream, triggerName) => makeIntentBuilder(runtime)(stream, triggerName);
299
+ const onceInRunSession = (key) => Effect.serviceOption(RunSessionTag).pipe(
300
+ Effect.map(
301
+ (maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true
302
+ )
303
+ );
304
+ let cachedDiagnosticsLevel;
305
+ const isModuleLike = (value) => Boolean(
306
+ value && typeof value === "object" && ((value._kind === "ModuleDef" || value._kind === "Module") && "tag" in value) && Context.isTag(value.tag)
307
+ );
308
+ const buildModuleHandle = (tag, rt) => {
309
+ const actionsProxy = new Proxy(
310
+ {},
311
+ {
312
+ get: (_target, prop) => (payload) => rt.dispatch({
313
+ _tag: prop,
314
+ payload
315
+ })
316
+ }
317
+ );
318
+ const handle = {
319
+ read: (selector) => Effect.map(rt.getState, selector),
320
+ changes: rt.changes,
321
+ dispatch: rt.dispatch,
322
+ actions$: rt.actions$,
323
+ actions: actionsProxy
324
+ };
325
+ const EXTEND_HANDLE = /* @__PURE__ */ Symbol.for("logix.module.handle.extend");
326
+ const extend = tag?.[EXTEND_HANDLE];
327
+ return typeof extend === "function" ? extend(rt, handle) ?? handle : handle;
328
+ };
329
+ const emitModuleDescriptorOnce = (module, rt) => Effect.gen(function* () {
330
+ if (cachedDiagnosticsLevel === "off") return;
331
+ const key = `module_descriptor:${String(rt.instanceId ?? "unknown")}`;
332
+ const shouldEmit = yield* onceInRunSession(key);
333
+ if (!shouldEmit) return;
334
+ const actionKeys = Object.keys(module.tag?.shape?.actionMap ?? {});
335
+ const internalSymbol = /* @__PURE__ */ Symbol.for("logix.module.internal");
336
+ const internal = module[internalSymbol];
337
+ const logicUnits = (internal?.mounted ?? []).map((u) => ({
338
+ kind: String(u?.kind ?? "user"),
339
+ id: String(u?.id ?? ""),
340
+ derived: u?.derived ? true : void 0,
341
+ name: typeof u?.name === "string" ? u.name : void 0
342
+ }));
343
+ const schemaKeys = module.schemas && typeof module.schemas === "object" ? Object.keys(module.schemas) : void 0;
344
+ const meta = module.meta && typeof module.meta === "object" ? module.meta : void 0;
345
+ const source = module.dev?.source;
346
+ const traitsSnapshot = runtimeInternals.traits.getModuleTraitsSnapshot();
347
+ const traits = traitsSnapshot ? {
348
+ digest: traitsSnapshot.digest,
349
+ count: traitsSnapshot.traits.length
350
+ } : void 0;
351
+ const data = {
352
+ id: module.id,
353
+ moduleId: String(rt.moduleId),
354
+ instanceId: String(rt.instanceId),
355
+ actionKeys,
356
+ logicUnits,
357
+ schemaKeys,
358
+ meta,
359
+ source,
360
+ traits
361
+ };
362
+ yield* record({
363
+ type: "trace:module:descriptor",
364
+ moduleId: rt.moduleId,
365
+ instanceId: rt.instanceId,
366
+ data
367
+ });
368
+ });
369
+ const resolveModuleRuntime = (tag) => Effect.gen(function* () {
370
+ const requestedModuleId = typeof tag?.id === "string" ? tag.id : void 0;
371
+ const fromModuleId = typeof options?.moduleId === "string" ? options.moduleId : void 0;
372
+ const fromEnv = yield* Effect.serviceOption(tag);
373
+ if (Option.isSome(fromEnv)) {
374
+ return fromEnv.value;
375
+ }
376
+ const tokenId = requestedModuleId ?? "<unknown module id>";
377
+ const fix = isDevEnv() ? [
378
+ "- Provide the child implementation in the same scope (imports).",
379
+ ` Example: ${fromModuleId ?? "ParentModule"}.implement({ imports: [${requestedModuleId ?? "ChildModule"}.impl], ... })`,
380
+ "- If you intentionally want a root singleton, provide it at app root (Runtime.make(...,{ layer }) / root imports),",
381
+ " and use Root.resolve(ModuleTag) (instead of $.use) at the callsite."
382
+ ] : [];
383
+ const err = new Error(
384
+ isDevEnv() ? [
385
+ "[MissingModuleRuntimeError] Cannot resolve ModuleRuntime for ModuleTag.",
386
+ "",
387
+ `tokenId: ${tokenId}`,
388
+ "entrypoint: logic.$.use",
389
+ "mode: strict",
390
+ `from: ${fromModuleId ?? "<unknown module id>"}`,
391
+ `startScope: moduleId=${fromModuleId ?? "<unknown>"}, instanceId=${String(runtime.instanceId ?? "<unknown>")}`,
392
+ "",
393
+ "fix:",
394
+ ...fix
395
+ ].join("\n") : "[MissingModuleRuntimeError] module runtime not found"
396
+ );
397
+ err.tokenId = tokenId;
398
+ err.entrypoint = "logic.$.use";
399
+ err.mode = "strict";
400
+ err.from = fromModuleId;
401
+ err.startScope = {
402
+ moduleId: fromModuleId,
403
+ instanceId: String(runtime.instanceId ?? "<unknown>")
404
+ };
405
+ err.fix = fix;
406
+ err.name = "MissingModuleRuntimeError";
407
+ return yield* Effect.die(err);
408
+ });
409
+ const stateApi = {
410
+ read: runtime.getState,
411
+ update: (f) => Effect.gen(function* () {
412
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
413
+ if (inTxn) {
414
+ const prev = yield* runtime.getState;
415
+ return yield* runtime.setState(f(prev));
416
+ }
417
+ const body = () => Effect.flatMap(runtime.getState, (prev) => runtime.setState(f(prev)));
418
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction(
419
+ { kind: "state", name: "update" },
420
+ body
421
+ ) : body();
422
+ }),
423
+ mutate: (f) => Effect.gen(function* () {
424
+ const recordPatch = runtimeInternals?.txn.recordStatePatch;
425
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
426
+ if (inTxn) {
427
+ const prev = yield* runtime.getState;
428
+ const { nextState, patchPaths } = mutateWithPatchPaths(
429
+ prev,
430
+ (draft) => {
431
+ f(draft);
432
+ }
433
+ );
434
+ for (const path of patchPaths) {
435
+ recordPatch?.({
436
+ path,
437
+ reason: "state:mutate"
438
+ });
439
+ }
440
+ return yield* runtime.setState(nextState);
441
+ }
442
+ const body = () => Effect.flatMap(runtime.getState, (prev) => {
443
+ const { nextState, patchPaths } = mutateWithPatchPaths(
444
+ prev,
445
+ (draft) => {
446
+ f(draft);
447
+ }
448
+ );
449
+ for (const path of patchPaths) {
450
+ recordPatch?.({
451
+ path,
452
+ reason: "state:mutate"
453
+ });
454
+ }
455
+ return runtime.setState(nextState);
456
+ });
457
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction(
458
+ { kind: "state", name: "mutate" },
459
+ body
460
+ ) : body();
461
+ }),
462
+ ref: runtime.ref
463
+ };
464
+ const actionsApi = new Proxy({}, {
465
+ get: (_target, prop) => {
466
+ if (prop === "dispatch") {
467
+ return (a) => runtime.dispatch(a);
468
+ }
469
+ if (prop === "actions$") {
470
+ return runtime.actions$;
471
+ }
472
+ return (payload) => runtime.dispatch({ _tag: prop, payload });
473
+ }
474
+ });
475
+ const matchApi = (value) => makeMatch(value);
476
+ const matchTagApi = (value) => makeMatchTag(value);
477
+ const reducer = (tag, fn) => {
478
+ return Effect.sync(() => {
479
+ runtimeInternals.txn.registerReducer(String(tag), fn);
480
+ });
481
+ };
482
+ const api = {
483
+ state: stateApi,
484
+ actions: actionsApi,
485
+ flow: flowApi,
486
+ match: matchApi,
487
+ matchTag: matchTagApi,
488
+ lifecycle: {
489
+ onInitRequired: (eff) => {
490
+ if (getCurrentPhase() === "run") {
491
+ return emitSetupOnlyViolation("$.lifecycle.onInitRequired");
492
+ }
493
+ runtimeInternals.lifecycle.registerInitRequired(eff);
494
+ return Effect.void;
495
+ },
496
+ onStart: (eff) => {
497
+ if (getCurrentPhase() === "run") {
498
+ return emitSetupOnlyViolation("$.lifecycle.onStart");
499
+ }
500
+ runtimeInternals.lifecycle.registerStart(eff);
501
+ return Effect.void;
502
+ },
503
+ onInit: (eff) => {
504
+ if (getCurrentPhase() === "run") {
505
+ return emitSetupOnlyViolation("$.lifecycle.onInit");
506
+ }
507
+ runtimeInternals.lifecycle.registerInitRequired(eff);
508
+ return Effect.void;
509
+ },
510
+ onDestroy: (eff) => {
511
+ if (getCurrentPhase() === "run") {
512
+ return emitSetupOnlyViolation("$.lifecycle.onDestroy");
513
+ }
514
+ runtimeInternals.lifecycle.registerDestroy(eff);
515
+ return Effect.void;
516
+ },
517
+ onError: (handler) => {
518
+ if (getCurrentPhase() === "run") {
519
+ return emitSetupOnlyViolation("$.lifecycle.onError");
520
+ }
521
+ runtimeInternals.lifecycle.registerOnError(handler);
522
+ return Effect.void;
523
+ },
524
+ onSuspend: (eff) => {
525
+ if (getCurrentPhase() === "run") {
526
+ return emitSetupOnlyViolation("$.lifecycle.onSuspend");
527
+ }
528
+ runtimeInternals.lifecycle.registerPlatformSuspend(
529
+ Effect.asVoid(eff)
530
+ );
531
+ return Effect.void;
532
+ },
533
+ onResume: (eff) => {
534
+ if (getCurrentPhase() === "run") {
535
+ return emitSetupOnlyViolation("$.lifecycle.onResume");
536
+ }
537
+ runtimeInternals.lifecycle.registerPlatformResume(
538
+ Effect.asVoid(eff)
539
+ );
540
+ return Effect.void;
541
+ },
542
+ onReset: (eff) => {
543
+ if (getCurrentPhase() === "run") {
544
+ return emitSetupOnlyViolation("$.lifecycle.onReset");
545
+ }
546
+ runtimeInternals.lifecycle.registerPlatformReset(
547
+ Effect.asVoid(eff)
548
+ );
549
+ return Effect.void;
550
+ }
551
+ },
552
+ traits: {
553
+ declare: (traits) => {
554
+ if (getCurrentPhase() === "run") {
555
+ throw makeLogicPhaseError(
556
+ "traits_declare_in_run",
557
+ "$.traits.declare",
558
+ "run",
559
+ options?.moduleId
560
+ );
561
+ }
562
+ if (!traits || typeof traits !== "object") {
563
+ throw new Error(
564
+ "[InvalidTraitsDeclaration] $.traits.declare expects an object."
565
+ );
566
+ }
567
+ const logicUnit = options?.logicUnit ?? {
568
+ logicUnitId: "unknown",
569
+ logicUnitIdKind: "derived",
570
+ logicUnitLabel: "logicUnit:unknown",
571
+ path: void 0
572
+ };
573
+ runtimeInternals.traits.registerModuleTraitsContribution({
574
+ traits,
575
+ provenance: {
576
+ originType: "logicUnit",
577
+ originId: logicUnit.logicUnitId,
578
+ originIdKind: logicUnit.logicUnitIdKind,
579
+ originLabel: logicUnit.logicUnitLabel,
580
+ path: logicUnit.path
581
+ }
582
+ });
583
+ },
584
+ source: {
585
+ refresh: (fieldPath) => Effect.gen(function* () {
586
+ const handler = runtimeInternals.traits.getSourceRefreshHandler(
587
+ fieldPath
588
+ );
589
+ if (!handler) {
590
+ return yield* Effect.void;
591
+ }
592
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
593
+ if (inTxn) {
594
+ const state = yield* runtime.getState;
595
+ return yield* handler(state);
596
+ }
597
+ return yield* runtimeInternals.txn.runWithStateTransaction(
598
+ {
599
+ kind: "source-refresh",
600
+ name: fieldPath
601
+ },
602
+ () => Effect.gen(function* () {
603
+ const state = yield* runtime.getState;
604
+ return yield* handler(state);
605
+ })
606
+ );
607
+ })
608
+ }
609
+ },
610
+ reducer,
611
+ use: new Proxy(() => {
612
+ }, {
613
+ apply: (_target, _thisArg, [arg]) => {
614
+ guardRunOnly("use_in_setup", "$.use");
615
+ if (isModuleLike(arg)) {
616
+ const domain = arg;
617
+ const tag = domain.tag;
618
+ const resolveAndBuild = resolveModuleRuntime(tag).pipe(
619
+ Effect.map((rt) => buildModuleHandle(tag, rt))
620
+ );
621
+ const resolveWithDescriptor = resolveModuleRuntime(tag).pipe(
622
+ Effect.tap((rt) => emitModuleDescriptorOnce(domain, rt)),
623
+ Effect.map((rt) => buildModuleHandle(tag, rt))
624
+ );
625
+ const detectAndSelect = FiberRef.get(currentDiagnosticsLevel).pipe(
626
+ Effect.tap((level) => {
627
+ cachedDiagnosticsLevel = level;
628
+ }),
629
+ Effect.flatMap(
630
+ (level) => level === "off" ? resolveAndBuild : resolveWithDescriptor
631
+ )
632
+ );
633
+ return Effect.suspend(() => {
634
+ if (cachedDiagnosticsLevel === "off") {
635
+ return resolveAndBuild;
636
+ }
637
+ if (cachedDiagnosticsLevel !== void 0) {
638
+ return resolveWithDescriptor;
639
+ }
640
+ return detectAndSelect;
641
+ });
642
+ }
643
+ if (Context.isTag(arg)) {
644
+ const candidate = arg;
645
+ if (candidate._kind === "ModuleTag") {
646
+ return resolveModuleRuntime(arg).pipe(
647
+ Effect.map(
648
+ (rt) => buildModuleHandle(arg, rt)
649
+ )
650
+ );
651
+ }
652
+ return arg;
653
+ }
654
+ return Effect.die("BoundApi.use: unsupported argument");
655
+ }
656
+ }),
657
+ onAction: new Proxy(() => {
658
+ }, {
659
+ apply: (_target, _thisArg, args) => {
660
+ guardRunOnly("use_in_setup", "$.onAction");
661
+ const arg = args[0];
662
+ if (typeof arg === "function") {
663
+ return createIntentBuilder(
664
+ runtime.actions$.pipe(Stream.filter(arg))
665
+ );
666
+ }
667
+ if (typeof arg === "string") {
668
+ return createIntentBuilder(
669
+ runtime.actions$.pipe(
670
+ Stream.filter((a) => a._tag === arg || a.type === arg)
671
+ ),
672
+ arg
673
+ );
674
+ }
675
+ if (typeof arg === "object" && arg !== null) {
676
+ if ("_tag" in arg) {
677
+ return createIntentBuilder(
678
+ runtime.actions$.pipe(
679
+ Stream.filter((a) => a._tag === arg._tag)
680
+ ),
681
+ String(arg._tag)
682
+ );
683
+ }
684
+ if (Schema.isSchema(arg)) {
685
+ return createIntentBuilder(
686
+ runtime.actions$.pipe(
687
+ Stream.filter((a) => {
688
+ const result = Schema.decodeUnknownSync(
689
+ arg
690
+ )(a);
691
+ return !!result;
692
+ })
693
+ )
694
+ );
695
+ }
696
+ }
697
+ return createIntentBuilder(runtime.actions$);
698
+ },
699
+ get: (_target, prop) => {
700
+ guardRunOnly("use_in_setup", "$.onAction");
701
+ if (typeof prop === "string") {
702
+ return createIntentBuilder(
703
+ runtime.actions$.pipe(
704
+ Stream.filter(
705
+ (a) => a._tag === prop || a.type === prop
706
+ )
707
+ ),
708
+ prop
709
+ );
710
+ }
711
+ return void 0;
712
+ }
713
+ }),
714
+ onState: (selector) => {
715
+ guardRunOnly("use_in_setup", "$.onState");
716
+ return createIntentBuilder(runtime.changes(selector));
717
+ },
718
+ on: (stream) => {
719
+ guardRunOnly("use_in_setup", "$.on");
720
+ return createIntentBuilder(stream);
721
+ }
722
+ };
723
+ setBoundInternals(api, runtimeInternals);
724
+ return api;
725
+ }
726
+
727
+ export {
728
+ mutateWithPatchPaths,
729
+ make2 as make
730
+ };
731
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL0JvdW5kQXBpUnVudGltZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgY3JlYXRlLCB0eXBlIFBhdGNoZXMgfSBmcm9tIFwibXV0YXRpdmVcIlxuXG5leHBvcnQgdHlwZSBQYXRjaFBhdGggPSBzdHJpbmdcblxuY29uc3QgdG9QYXRjaFBhdGhTdHJpbmcgPSAocGF0aDogdW5rbm93bik6IFBhdGNoUGF0aCB8IFwiKlwiIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHBhdGgudHJpbSgpXG4gICAgcmV0dXJuIHRyaW1tZWQubGVuZ3RoID4gMCA/IHRyaW1tZWQgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHBhcnRzOiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCBzZWcgb2YgcGF0aCkge1xuICAgIGlmICh0eXBlb2Ygc2VnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoc2VnLmxlbmd0aCA+IDApIHBhcnRzLnB1c2goc2VnKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWcgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHNlZykpIHtcbiAgICAgIHBhcnRzLnB1c2goU3RyaW5nKE1hdGguZmxvb3Ioc2VnKSkpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBcIipcIlxuICByZXR1cm4gcGFydHMuam9pbihcIi5cIilcbn1cblxuZXhwb3J0IGNvbnN0IG11dGF0ZVdpdGhQYXRjaFBhdGhzID0gPFM+KFxuICBiYXNlOiBTLFxuICBtdXRhdG9yOiAoZHJhZnQ6IFMpID0+IHZvaWQsXG4pOiB7IHJlYWRvbmx5IG5leHRTdGF0ZTogUzsgcmVhZG9ubHkgcGF0Y2hQYXRoczogUmVhZG9ubHlBcnJheTxQYXRjaFBhdGggfCBcIipcIj4gfSA9PiB7XG4gIGNvbnN0IG91dCA9IGNyZWF0ZShiYXNlLCBtdXRhdG9yIGFzIGFueSwge1xuICAgIGVuYWJsZVBhdGNoZXM6IHtcbiAgICAgIHBhdGhBc0FycmF5OiB0cnVlLFxuICAgICAgYXJyYXlMZW5ndGhBc3NpZ25tZW50OiBmYWxzZSxcbiAgICB9LFxuICB9KSBhcyB1bmtub3duXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KG91dCkpIHtcbiAgICByZXR1cm4geyBuZXh0U3RhdGU6IG91dCBhcyBTLCBwYXRjaFBhdGhzOiBbXSB9XG4gIH1cblxuICBjb25zdCBuZXh0U3RhdGUgPSBvdXRbMF0gYXMgU1xuICBjb25zdCBwYXRjaGVzID0gKG91dFsxXSA/PyBbXSkgYXMgUGF0Y2hlczx7IHBhdGhBc0FycmF5OiB0cnVlOyBhcnJheUxlbmd0aEFzc2lnbm1lbnQ6IGZhbHNlIH0+XG5cbiAgY29uc3Qgc2V0ID0gbmV3IFNldDxQYXRjaFBhdGggfCBcIipcIj4oKVxuICBmb3IgKGNvbnN0IHBhdGNoIG9mIHBhdGNoZXMpIHtcbiAgICBjb25zdCBwID0gdG9QYXRjaFBhdGhTdHJpbmcoKHBhdGNoIGFzIGFueSk/LnBhdGgpXG4gICAgaWYgKCFwKSBjb250aW51ZVxuICAgIHNldC5hZGQocClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmV4dFN0YXRlLFxuICAgIHBhdGNoUGF0aHM6IEFycmF5LmZyb20oc2V0KSxcbiAgfVxufVxuXG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0LCBGaWJlclJlZiwgT3B0aW9uLCBTY2hlbWEsIFN0cmVhbSwgU3Vic2NyaXB0aW9uUmVmIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tIFwibXV0YXRpdmVcIlxuaW1wb3J0IHR5cGUgKiBhcyBMb2dpeCBmcm9tIFwiLi9jb3JlL21vZHVsZS5qc1wiXG5pbXBvcnQgKiBhcyBMb2dpYyBmcm9tIFwiLi9jb3JlL0xvZ2ljTWlkZGxld2FyZS5qc1wiXG5pbXBvcnQgKiBhcyBUYXNrUnVubmVyIGZyb20gXCIuL2NvcmUvVGFza1J1bm5lci5qc1wiXG5pbXBvcnQgeyBtdXRhdGVXaXRoUGF0Y2hQYXRocyB9IGZyb20gXCIuL2NvcmUvbXV0YXRpdmVQYXRjaGVzLmpzXCJcbmltcG9ydCAqIGFzIEZsb3dSdW50aW1lIGZyb20gXCIuL0Zsb3dSdW50aW1lLmpzXCJcbmltcG9ydCAqIGFzIE1hdGNoQnVpbGRlciBmcm9tIFwiLi9jb3JlL01hdGNoQnVpbGRlci5qc1wiXG5pbXBvcnQgKiBhcyBQbGF0Zm9ybSBmcm9tIFwiLi9jb3JlL1BsYXRmb3JtLmpzXCJcbmltcG9ydCAqIGFzIExpZmVjeWNsZSBmcm9tIFwiLi9MaWZlY3ljbGUuanNcIlxuaW1wb3J0ICogYXMgRGVidWcgZnJvbSBcIi4vY29yZS9EZWJ1Z1NpbmsuanNcIlxuaW1wb3J0ICogYXMgTG9naWNEaWFnbm9zdGljcyBmcm9tIFwiLi9jb3JlL0xvZ2ljRGlhZ25vc3RpY3MuanNcIlxuaW1wb3J0IHsgaXNEZXZFbnYgfSBmcm9tIFwiLi9jb3JlL2Vudi5qc1wiXG5pbXBvcnQgeyBSdW5TZXNzaW9uVGFnIH0gZnJvbSBcIi4uL29ic2VydmFiaWxpdHkvcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVJbnRlcm5hbHMgfSBmcm9tIFwiLi9jb3JlL1J1bnRpbWVJbnRlcm5hbHMuanNcIlxuaW1wb3J0IHR5cGUgKiBhcyBNb2R1bGVUcmFpdHMgZnJvbSBcIi4vY29yZS9Nb2R1bGVUcmFpdHMuanNcIlxuaW1wb3J0IHtcbiAgZ2V0UnVudGltZUludGVybmFscyxcbiAgc2V0Qm91bmRJbnRlcm5hbHMsXG59IGZyb20gXCIuL2NvcmUvcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzXCJcbmltcG9ydCB0eXBlIHtcbiAgQW55TW9kdWxlU2hhcGUsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIFN0YXRlT2YsXG4gIEFjdGlvbk9mLFxufSBmcm9tIFwiLi9jb3JlL21vZHVsZS5qc1wiXG5cbi8vIFx1NjcyQ1x1NTczMFx1Njc4NFx1OTAyMCBJbnRlbnRCdWlsZGVyIFx1NURFNVx1NTM4Mlx1RkYwQ1x1N0I0OVx1NEVGN1x1NEU4RVx1NTM5RiBpbnRlcm5hbC9kc2wvTG9naWNCdWlsZGVyLm1ha2VJbnRlbnRCdWlsZGVyRmFjdG9yeVxuY29uc3QgTG9naWNCdWlsZGVyRmFjdG9yeSA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlLCBSID0gbmV2ZXI+KFxuICBydW50aW1lOiBNb2R1bGVSdW50aW1lPFN0YXRlT2Y8U2g+LCBBY3Rpb25PZjxTaD4+LFxuICBydW50aW1lSW50ZXJuYWxzOiBSdW50aW1lSW50ZXJuYWxzLFxuKSA9PiB7XG4gIGNvbnN0IGZsb3dBcGkgPSBGbG93UnVudGltZS5tYWtlPFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKVxuXG4gIHJldHVybiA8VD4oXG4gICAgc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFQ+LFxuICAgIHRyaWdnZXJOYW1lPzogc3RyaW5nLFxuICApOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPiA9PiB7XG4gICAgY29uc3QgcnVuV2l0aFN0YXRlVHJhbnNhY3Rpb246IFRhc2tSdW5uZXIuVGFza1J1bm5lclJ1bnRpbWVbXCJydW5XaXRoU3RhdGVUcmFuc2FjdGlvblwiXSA9XG4gICAgICAob3JpZ2luLCBib2R5KSA9PiBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihvcmlnaW4gYXMgYW55LCBib2R5KVxuXG5cdCAgICBjb25zdCB0YXNrUnVubmVyUnVudGltZTogVGFza1J1bm5lci5UYXNrUnVubmVyUnVudGltZSA9IHtcblx0ICAgICAgbW9kdWxlSWQ6IHJ1bnRpbWUubW9kdWxlSWQsXG5cdCAgICAgIGluc3RhbmNlSWQ6IHJ1bnRpbWVJbnRlcm5hbHMuaW5zdGFuY2VJZCxcblx0ICAgICAgcnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24sXG5cdCAgICAgIHJlc29sdmVDb25jdXJyZW5jeVBvbGljeTogcnVudGltZUludGVybmFscy5jb25jdXJyZW5jeS5yZXNvbHZlQ29uY3VycmVuY3lQb2xpY3ksXG5cdCAgICB9XG5cblx0ICAgIGNvbnN0IGJ1aWxkZXIgPSB7XG5cdCAgICAgIGRlYm91bmNlOiAobXM6IG51bWJlcikgPT5cblx0ICAgICAgICBMb2dpY0J1aWxkZXJGYWN0b3J5PFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKShcblx0ICAgICAgICAgIGZsb3dBcGkuZGVib3VuY2U8VD4obXMpKHN0cmVhbSksXG5cdCAgICAgICAgICB0cmlnZ2VyTmFtZSxcblx0ICAgICAgICApLFxuXHQgICAgICB0aHJvdHRsZTogKG1zOiBudW1iZXIpID0+XG5cdCAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoXG5cdCAgICAgICAgICBmbG93QXBpLnRocm90dGxlPFQ+KG1zKShzdHJlYW0pLFxuXHQgICAgICAgICAgdHJpZ2dlck5hbWUsXG5cdCAgICAgICAgKSxcblx0ICAgICAgZmlsdGVyOiAocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pID0+XG5cdCAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoXG5cdCAgICAgICAgICBmbG93QXBpLmZpbHRlcihwcmVkaWNhdGUpKHN0cmVhbSksXG5cdCAgICAgICAgICB0cmlnZ2VyTmFtZSxcblx0ICAgICAgICApLFxuXHQgICAgICBtYXA6IDxVPihmOiAodmFsdWU6IFQpID0+IFUpID0+XG5cdCAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoXG5cdCAgICAgICAgICBzdHJlYW0ucGlwZShTdHJlYW0ubWFwKGYpKSxcblx0ICAgICAgICAgIHRyaWdnZXJOYW1lLFxuXHQgICAgICAgICksXG4gICAgICBydW48QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOlxuICAgICAgICAgIHwgTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT5cbiAgICAgICAgICB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+IHtcbiAgICAgICAgcmV0dXJuIGZsb3dBcGkucnVuPFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5MYXRlc3Q8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOlxuICAgICAgICAgIHwgTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT5cbiAgICAgICAgICB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+IHtcbiAgICAgICAgcmV0dXJuIGZsb3dBcGkucnVuTGF0ZXN0PFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5FeGhhdXN0PEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1bkV4aGF1c3Q8VCwgQSwgRSwgUjI+KGVmZiwgb3B0aW9ucykoc3RyZWFtKVxuICAgICAgfSxcbiAgICAgIHJ1blBhcmFsbGVsPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1blBhcmFsbGVsPFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5Gb3JrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOlxuICAgICAgICAgIHwgTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT5cbiAgICAgICAgICB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiA9PlxuICAgICAgICBFZmZlY3QuZm9ya1Njb3BlZChmbG93QXBpLnJ1bjxULCBBLCBFLCBSMj4oZWZmKShzdHJlYW0pKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQsXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4sXG4gICAgICBydW5QYXJhbGxlbEZvcms6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6XG4gICAgICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgICAgIHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPilcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+ID0+XG4gICAgICAgIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgIGZsb3dBcGkucnVuUGFyYWxsZWw8VCwgQSwgRSwgUjI+KGVmZikoc3RyZWFtKSxcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQsXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4sXG4gICAgICBydW5UYXNrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgY29uZmlnOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJDb25maWc8VCwgU2gsIFIgJiBSMiwgQSwgRT4sXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgVGFza1J1bm5lci5tYWtlVGFza1J1bm5lcjxULCBTaCwgUiAmIFIyLCBBLCBFPihcbiAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgXCJ0YXNrXCIsXG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHJ1blBhcmFsbGVsVGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIFwicGFyYWxsZWxcIixcbiAgICAgICAgICB0YXNrUnVubmVyUnVudGltZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICB0cmlnZ2VyTmFtZTogY29uZmlnLnRyaWdnZXJOYW1lID8/IHRyaWdnZXJOYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgcnVuTGF0ZXN0VGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIFwibGF0ZXN0XCIsXG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHJ1bkV4aGF1c3RUYXNrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgY29uZmlnOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJDb25maWc8VCwgU2gsIFIgJiBSMiwgQSwgRT4sXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgVGFza1J1bm5lci5tYWtlVGFza1J1bm5lcjxULCBTaCwgUiAmIFIyLCBBLCBFPihcbiAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgXCJleGhhdXN0XCIsXG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHRvU3RyZWFtOiAoKSA9PiBzdHJlYW0sXG4gICAgICB1cGRhdGU6IChcbiAgICAgICAgcmVkdWNlcjogKFxuICAgICAgICAgIHByZXY6IFN0YXRlT2Y8U2g+LFxuICAgICAgICAgIHBheWxvYWQ6IFRcbiAgICAgICAgKSA9PlxuICAgICAgICAgIHwgU3RhdGVPZjxTaD5cbiAgICAgICAgICB8IEVmZmVjdC5FZmZlY3Q8U3RhdGVPZjxTaD4sIGFueSwgYW55PlxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBTdHJlYW0ucnVuRm9yRWFjaChzdHJlYW0sIChwYXlsb2FkKSA9PlxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiBcIndhdGNoZXI6dXBkYXRlXCIsXG4gICAgICAgICAgICAgIG5hbWU6IHRyaWdnZXJOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBTdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSByZWR1Y2VyKHByZXYsIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgaWYgKEVmZmVjdC5pc0VmZmVjdChuZXh0KSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChcbiAgICAgICAgICAgICAgICAgICAgbmV4dCBhcyBFZmZlY3QuRWZmZWN0PFN0YXRlT2Y8U2g+LCBhbnksIGFueT4sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBpZiAoZXhpdC5fdGFnID09PSBcIkZhaWx1cmVcIikge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0Vycm9yKFwiRmxvdyBlcnJvclwiLCBleGl0LmNhdXNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKGV4aXQudmFsdWUgYXMgU3RhdGVPZjxTaD4pXG4gICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeWllbGQqIHJ1bnRpbWUuc2V0U3RhdGUobmV4dCBhcyBTdGF0ZU9mPFNoPilcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKVxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKFwiRmxvdyBlcnJvclwiLCBjYXVzZSlcbiAgICAgICAgICApXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICAgIG11dGF0ZTogKFxuICAgICAgICByZWR1Y2VyOiAoZHJhZnQ6IExvZ2ljLkRyYWZ0PFN0YXRlT2Y8U2g+PiwgcGF5bG9hZDogVCkgPT4gdm9pZFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBTdHJlYW0ucnVuRm9yRWFjaChzdHJlYW0sIChwYXlsb2FkKSA9PlxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiBcIndhdGNoZXI6bXV0YXRlXCIsXG4gICAgICAgICAgICAgIG5hbWU6IHRyaWdnZXJOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBTdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZFBhdGNoID0gcnVudGltZUludGVybmFscz8udHhuLnJlY29yZFN0YXRlUGF0Y2hcblxuICAgICAgICAgICAgICAgIGNvbnN0IHsgbmV4dFN0YXRlLCBwYXRjaFBhdGhzIH0gPSBtdXRhdGVXaXRoUGF0Y2hQYXRocyhcbiAgICAgICAgICAgICAgICAgIHByZXYgYXMgU3RhdGVPZjxTaD4sXG4gICAgICAgICAgICAgICAgICAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVkdWNlcihkcmFmdCBhcyBMb2dpYy5EcmFmdDxTdGF0ZU9mPFNoPj4sIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgICAgICAgICByZWNvcmRQYXRjaD8uKHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBcIndhdGNoZXI6bXV0YXRlXCIsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKG5leHRTdGF0ZSlcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKVxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKFwiRmxvdyBlcnJvclwiLCBjYXVzZSlcbiAgICAgICAgICApXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICB9IGFzIE9taXQ8TG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4sIFwicGlwZVwiIHwgXCJhbmRUaGVuXCI+XG5cbiAgICBjb25zdCBhbmRUaGVuOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPltcImFuZFRoZW5cIl0gPSAoXG4gICAgICBoYW5kbGVyT3JFZmY6IGFueSxcbiAgICApOiBhbnkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyT3JFZmYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpZiAoaGFuZGxlck9yRWZmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIChidWlsZGVyIGFzIGFueSkudXBkYXRlKGhhbmRsZXJPckVmZilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGJ1aWxkZXIgYXMgYW55KS5ydW4oaGFuZGxlck9yRWZmKVxuICAgICAgfVxuICAgICAgcmV0dXJuIChidWlsZGVyIGFzIGFueSkucnVuKGhhbmRsZXJPckVmZilcbiAgICB9XG5cbiAgICBjb25zdCBwaXBlOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPltcInBpcGVcIl0gPSBmdW5jdGlvbiAodGhpczogdW5rbm93bikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgY29uc3QgZm5zID0gYXJndW1lbnRzIGFzIHVua25vd24gYXMgUmVhZG9ubHlBcnJheTxcbiAgICAgICAgKHNlbGY6IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+KSA9PiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPlxuICAgICAgPlxuICAgICAgbGV0IGFjYzogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4gPSBidWlsZGVyIGFzIExvZ2ljLkludGVudEJ1aWxkZXI8XG4gICAgICAgIFQsXG4gICAgICAgIFNoLFxuICAgICAgICBSXG4gICAgICA+XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY2MgPSBmbnNbaV0oYWNjKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGJ1aWxkZXIsIHsgcGlwZSwgYW5kVGhlbiB9KSBhcyBMb2dpYy5JbnRlbnRCdWlsZGVyPFxuICAgICAgVCxcbiAgICAgIFNoLFxuICAgICAgUlxuICAgID5cbiAgfVxufVxuaW1wb3J0IHR5cGUgeyBCb3VuZEFwaSB9IGZyb20gXCIuL2NvcmUvbW9kdWxlLmpzXCJcblxuLyoqXG4gKiBCb3VuZEFwaSBcdTVCOUVcdTczQjBcdUZGMUFcdTRFM0FcdTY3RDBcdTRFMDBcdTdDN0IgU3RvcmUgU2hhcGUgKyBSdW50aW1lIFx1NTIxQlx1NUVGQVx1OTg4NFx1N0VEMVx1NUI5QVx1NzY4NCBgJGBcdTMwMDJcbiAqXG4gKiBcdThCRjRcdTY2MEVcdUZGMUFcdTdDN0JcdTU3OEJcdTRFMEVcdTUxNjVcdTUzRTNcdTdCN0VcdTU0MERcdTU3MjggYXBpL0JvdW5kQXBpLnRzIFx1NEUyRFx1NThGMFx1NjYwRVx1RkYwQ1x1OEZEOVx1OTFDQ1x1NTNFQVx1NjI3Rlx1OEY3RFx1NTE3N1x1NEY1M1x1NUI5RVx1NzNCMFx1MzAwMlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZTxTaCBleHRlbmRzIExvZ2l4LkFueU1vZHVsZVNoYXBlLCBSID0gbmV2ZXI+KFxuICBzaGFwZTogU2gsXG4gIHJ1bnRpbWU6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8TG9naXguU3RhdGVPZjxTaD4sIExvZ2l4LkFjdGlvbk9mPFNoPj4sXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgZ2V0UGhhc2U/OiAoKSA9PiBcInNldHVwXCIgfCBcInJ1blwiXG4gICAgcmVhZG9ubHkgcGhhc2VTZXJ2aWNlPzogTG9naWNEaWFnbm9zdGljcy5Mb2dpY1BoYXNlU2VydmljZVxuICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgcmVhZG9ubHkgbG9naWNVbml0PzogTG9naWNEaWFnbm9zdGljcy5Mb2dpY1VuaXRTZXJ2aWNlXG4gIH1cbiAgKTogQm91bmRBcGk8U2gsIFI+IHtcbiAgY29uc3QgcnVudGltZUludGVybmFscyA9IGdldFJ1bnRpbWVJbnRlcm5hbHMocnVudGltZSBhcyBhbnkpXG5cbiAgY29uc3QgZ2V0UGhhc2UgPSBvcHRpb25zPy5nZXRQaGFzZSA/PyAoKCkgPT4gXCJydW5cIilcbiAgY29uc3QgZ2V0Q3VycmVudFBoYXNlID0gKCk6IFwic2V0dXBcIiB8IFwicnVuXCIgPT4ge1xuICAgIGNvbnN0IHBoYXNlU2VydmljZSA9IG9wdGlvbnM/LnBoYXNlU2VydmljZVxuICAgIGNvbnN0IHBoYXNlID0gcGhhc2VTZXJ2aWNlPy5jdXJyZW50ID8/IGdldFBoYXNlKClcbiAgICByZXR1cm4gcGhhc2UgPT09IFwic2V0dXBcIiA/IFwic2V0dXBcIiA6IFwicnVuXCJcbiAgfVxuICBjb25zdCBndWFyZFJ1bk9ubHkgPSAoa2luZDogc3RyaW5nLCBhcGk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHBoYXNlU2VydmljZSA9IG9wdGlvbnM/LnBoYXNlU2VydmljZVxuICAgIGNvbnN0IHBoYXNlID0gcGhhc2VTZXJ2aWNlPy5jdXJyZW50ID8/IGdldFBoYXNlKClcbiAgICBpZiAocGhhc2UgPT09IFwic2V0dXBcIikge1xuICAgICAgdGhyb3cgTG9naWNEaWFnbm9zdGljcy5tYWtlTG9naWNQaGFzZUVycm9yKFxuICAgICAgICBraW5kLFxuICAgICAgICBhcGksXG4gICAgICAgIFwic2V0dXBcIixcbiAgICAgICAgb3B0aW9ucz8ubW9kdWxlSWRcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgY29uc3QgZmxvd0FwaSA9IEZsb3dSdW50aW1lLm1ha2U8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpXG5cbiAgY29uc3QgbWFrZUludGVudEJ1aWxkZXIgPSAocnVudGltZV86IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+KSA9PlxuICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWVfLCBydW50aW1lSW50ZXJuYWxzKVxuICBjb25zdCB3aXRoTGlmZWN5Y2xlID0gPEE+KFxuICAgIGF2YWlsYWJsZTogKFxuICAgICAgbWFuYWdlcjogTGlmZWN5Y2xlLkxpZmVjeWNsZU1hbmFnZXJcbiAgICApID0+IEVmZmVjdC5FZmZlY3Q8QSwgbmV2ZXIsIGFueT4sXG4gICAgbWlzc2luZzogKCkgPT4gRWZmZWN0LkVmZmVjdDxBLCBuZXZlciwgYW55PlxuICApID0+XG4gICAgRWZmZWN0LnNlcnZpY2VPcHRpb24oTGlmZWN5Y2xlLkxpZmVjeWNsZUNvbnRleHQpLnBpcGUoXG4gICAgICBFZmZlY3QuZmxhdE1hcCgobWF5YmUpID0+XG4gICAgICAgIE9wdGlvbi5tYXRjaChtYXliZSwge1xuICAgICAgICAgIG9uU29tZTogYXZhaWxhYmxlLFxuICAgICAgICAgIG9uTm9uZTogbWlzc2luZyxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApXG4gIGNvbnN0IHdpdGhQbGF0Zm9ybSA9IChcbiAgICBpbnZva2U6IChwbGF0Zm9ybTogUGxhdGZvcm0uU2VydmljZSkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICApID0+XG4gICAgRWZmZWN0LnNlcnZpY2VPcHRpb24oUGxhdGZvcm0uVGFnKS5waXBlKFxuICAgICAgRWZmZWN0LmZsYXRNYXAoKG1heWJlKSA9PlxuICAgICAgICBPcHRpb24ubWF0Y2gobWF5YmUsIHtcbiAgICAgICAgICBvblNvbWU6IGludm9rZSxcbiAgICAgICAgICBvbk5vbmU6ICgpID0+IEVmZmVjdC52b2lkLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIClcblxuICBjb25zdCBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uID0gKGFwaTogc3RyaW5nKTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PlxuICAgIERlYnVnLnJlY29yZCh7XG4gICAgICB0eXBlOiBcImRpYWdub3N0aWNcIixcbiAgICAgIG1vZHVsZUlkOiBydW50aW1lLm1vZHVsZUlkLFxuICAgICAgaW5zdGFuY2VJZDogcnVudGltZS5pbnN0YW5jZUlkLFxuICAgICAgY29kZTogXCJsb2dpYzo6aW52YWxpZF9waGFzZVwiLFxuICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgIG1lc3NhZ2U6IGAke2FwaX0gaXMgc2V0dXAtb25seSBhbmQgaXMgbm90IGFsbG93ZWQgaW4gcnVuIHBoYXNlLmAsXG4gICAgICBoaW50OlxuICAgICAgICBcIlx1NUMwNiAkLmxpZmVjeWNsZS4qIFx1OEMwM1x1NzUyOFx1NzlGQlx1NTJBOFx1NTIzMCBNb2R1bGUubG9naWMgYnVpbGRlciBcdTc2ODRcdTU0MENcdTZCNjVcdTkwRThcdTUyMDZcdUZGMDhyZXR1cm4gXHU0RTRCXHU1MjREXHVGRjA5XHU3NTI4XHU0RThFXHU2Q0U4XHU1MThDXHVGRjFCXCIgK1xuICAgICAgICBcInJ1biBcdTZCQjVcdTk3MDBcdTg5ODFcdTUyQThcdTYwMDFcdThENDRcdTZFOTBcdTZFMDVcdTc0MDZcdTY1RjZcdUZGMENcdThCRjdcdTRGN0ZcdTc1MjggRWZmZWN0LmFjcXVpcmVSZWxlYXNlIC8gU2NvcGUgZmluYWxpemVyXHVGRjBDXHU4MDBDXHU0RTBEXHU2NjJGIGxhdGUgXHU2Q0U4XHU1MThDIG9uRGVzdHJveVx1MzAwMlwiLFxuICAgICAga2luZDogXCJsaWZlY3ljbGVfaW5fcnVuXCIsXG4gICAgfSlcblxuICBjb25zdCBjcmVhdGVJbnRlbnRCdWlsZGVyID0gPFQ+KFxuICAgIHN0cmVhbTogU3RyZWFtLlN0cmVhbTxUPixcbiAgICB0cmlnZ2VyTmFtZT86IHN0cmluZyxcbiAgKSA9PiBtYWtlSW50ZW50QnVpbGRlcihydW50aW1lKShzdHJlYW0sIHRyaWdnZXJOYW1lKVxuXG4gIGNvbnN0IG9uY2VJblJ1blNlc3Npb24gPSAoa2V5OiBzdHJpbmcpOiBFZmZlY3QuRWZmZWN0PGJvb2xlYW4sIG5ldmVyLCBhbnk+ID0+XG4gICAgRWZmZWN0LnNlcnZpY2VPcHRpb24oUnVuU2Vzc2lvblRhZykucGlwZShcbiAgICAgIEVmZmVjdC5tYXAoKG1heWJlKSA9PlxuICAgICAgICBPcHRpb24uaXNTb21lKG1heWJlKSA/IG1heWJlLnZhbHVlLmxvY2FsLm9uY2Uoa2V5KSA6IHRydWUsXG4gICAgICApLFxuICAgIClcblxuICBsZXQgY2FjaGVkRGlhZ25vc3RpY3NMZXZlbDogRGVidWcuRGlhZ25vc3RpY3NMZXZlbCB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGlzTW9kdWxlTGlrZSA9IChcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgKTogdmFsdWUgaXMge1xuICAgIHJlYWRvbmx5IF9raW5kOiBcIk1vZHVsZURlZlwiIHwgXCJNb2R1bGVcIlxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmdcbiAgICByZWFkb25seSB0YWc6IENvbnRleHQuVGFnPGFueSwgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4+XG4gICAgcmVhZG9ubHkgc2NoZW1hcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgcmVhZG9ubHkgZGV2PzogeyByZWFkb25seSBzb3VyY2U/OiB7IHJlYWRvbmx5IGZpbGU6IHN0cmluZzsgcmVhZG9ubHkgbGluZTogbnVtYmVyOyByZWFkb25seSBjb2x1bW46IG51bWJlciB9IH1cbiAgfSA9PlxuICAgIEJvb2xlYW4oXG4gICAgICB2YWx1ZSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgKCgodmFsdWUgYXMgYW55KS5fa2luZCA9PT0gXCJNb2R1bGVEZWZcIiB8fCAodmFsdWUgYXMgYW55KS5fa2luZCA9PT0gXCJNb2R1bGVcIikgJiZcbiAgICAgICAgICBcInRhZ1wiIGluICh2YWx1ZSBhcyBvYmplY3QpKSAmJlxuICAgICAgICBDb250ZXh0LmlzVGFnKCh2YWx1ZSBhcyBhbnkpLnRhZyksXG4gICAgKVxuXG4gIGNvbnN0IGJ1aWxkTW9kdWxlSGFuZGxlID0gKFxuICAgIHRhZzogQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj4sXG4gICAgcnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LFxuICApOiB1bmtub3duID0+IHtcbiAgICBjb25zdCBhY3Rpb25zUHJveHk6IExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+W1wiYWN0aW9uc1wiXSA9XG4gICAgICBuZXcgUHJveHkoXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT5cbiAgICAgICAgICAgIChwYXlsb2FkOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgICBydC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgX3RhZzogcHJvcCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICApIGFzIExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+W1wiYWN0aW9uc1wiXVxuXG4gICAgY29uc3QgaGFuZGxlOiBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PiA9IHtcbiAgICAgIHJlYWQ6IChzZWxlY3RvcikgPT4gRWZmZWN0Lm1hcChydC5nZXRTdGF0ZSwgc2VsZWN0b3IpLFxuICAgICAgY2hhbmdlczogcnQuY2hhbmdlcyxcbiAgICAgIGRpc3BhdGNoOiBydC5kaXNwYXRjaCxcbiAgICAgIGFjdGlvbnMkOiBydC5hY3Rpb25zJCxcbiAgICAgIGFjdGlvbnM6IGFjdGlvbnNQcm94eSxcbiAgICB9XG5cbiAgICBjb25zdCBFWFRFTkRfSEFORExFID0gU3ltYm9sLmZvcihcImxvZ2l4Lm1vZHVsZS5oYW5kbGUuZXh0ZW5kXCIpXG4gICAgY29uc3QgZXh0ZW5kID1cbiAgICAgICh0YWcgYXMgYW55KT8uW0VYVEVORF9IQU5ETEVdIGFzXG4gICAgICAgIHwgKChcbiAgICAgICAgICAgIHJ1bnRpbWU6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LFxuICAgICAgICAgICAgYmFzZTogTG9naXguTW9kdWxlSGFuZGxlPGFueT4sXG4gICAgICAgICAgKSA9PiB1bmtub3duKVxuICAgICAgICB8IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHR5cGVvZiBleHRlbmQgPT09IFwiZnVuY3Rpb25cIiA/IChleHRlbmQocnQsIGhhbmRsZSkgPz8gaGFuZGxlKSA6IGhhbmRsZVxuICB9XG5cbiAgY29uc3QgZW1pdE1vZHVsZURlc2NyaXB0b3JPbmNlID0gKFxuICAgIG1vZHVsZToge1xuICAgICAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGFnOiBhbnlcbiAgICAgIHJlYWRvbmx5IHNjaGVtYXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICByZWFkb25seSBkZXY/OiB7IHJlYWRvbmx5IHNvdXJjZT86IHsgcmVhZG9ubHkgZmlsZTogc3RyaW5nOyByZWFkb25seSBsaW5lOiBudW1iZXI7IHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyIH0gfVxuICAgIH0sXG4gICAgcnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LFxuICApOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+XG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgLy8gXHU0RTNBIGhvdC1wYXRoIFx1NTE1Q1x1NUU5NVx1RkYxQVx1OEJDQVx1NjVBRFx1N0VBN1x1NTIyQlx1NEUzQSBvZmYgXHU2NUY2XHU2QzM4XHU0RTBEXHU1M0QxXHU0RThCXHU0RUY2XHUzMDAyXG4gICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJvZmZcIikgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGtleSA9IGBtb2R1bGVfZGVzY3JpcHRvcjoke1N0cmluZyhydC5pbnN0YW5jZUlkID8/IFwidW5rbm93blwiKX1gXG4gICAgICBjb25zdCBzaG91bGRFbWl0ID0geWllbGQqIG9uY2VJblJ1blNlc3Npb24oa2V5KVxuICAgICAgaWYgKCFzaG91bGRFbWl0KSByZXR1cm5cblxuICAgICAgY29uc3QgYWN0aW9uS2V5cyA9IE9iamVjdC5rZXlzKChtb2R1bGUudGFnIGFzIGFueSk/LnNoYXBlPy5hY3Rpb25NYXAgPz8ge30pXG5cbiAgICAgIGNvbnN0IGludGVybmFsU3ltYm9sID0gU3ltYm9sLmZvcihcImxvZ2l4Lm1vZHVsZS5pbnRlcm5hbFwiKVxuICAgICAgY29uc3QgaW50ZXJuYWwgPSAobW9kdWxlIGFzIGFueSlbaW50ZXJuYWxTeW1ib2xdIGFzXG4gICAgICAgIHwgeyByZWFkb25seSBtb3VudGVkPzogUmVhZG9ubHlBcnJheTxhbnk+IH1cbiAgICAgICAgfCB1bmRlZmluZWRcblxuICAgICAgY29uc3QgbG9naWNVbml0cyA9IChpbnRlcm5hbD8ubW91bnRlZCA/PyBbXSkubWFwKCh1OiBhbnkpID0+ICh7XG4gICAgICAgIGtpbmQ6IFN0cmluZyh1Py5raW5kID8/IFwidXNlclwiKSxcbiAgICAgICAgaWQ6IFN0cmluZyh1Py5pZCA/PyBcIlwiKSxcbiAgICAgICAgZGVyaXZlZDogdT8uZGVyaXZlZCA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgICAgIG5hbWU6IHR5cGVvZiB1Py5uYW1lID09PSBcInN0cmluZ1wiID8gdS5uYW1lIDogdW5kZWZpbmVkLFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHNjaGVtYUtleXMgPVxuICAgICAgICBtb2R1bGUuc2NoZW1hcyAmJiB0eXBlb2YgbW9kdWxlLnNjaGVtYXMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICA/IE9iamVjdC5rZXlzKG1vZHVsZS5zY2hlbWFzKVxuICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IG1ldGEgPVxuICAgICAgICBtb2R1bGUubWV0YSAmJiB0eXBlb2YgbW9kdWxlLm1ldGEgPT09IFwib2JqZWN0XCIgPyBtb2R1bGUubWV0YSA6IHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCBzb3VyY2UgPSBtb2R1bGUuZGV2Py5zb3VyY2VcblxuICAgICAgY29uc3QgdHJhaXRzU25hcHNob3QgPSBydW50aW1lSW50ZXJuYWxzLnRyYWl0cy5nZXRNb2R1bGVUcmFpdHNTbmFwc2hvdCgpXG4gICAgICBjb25zdCB0cmFpdHMgPVxuICAgICAgICB0cmFpdHNTbmFwc2hvdFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkaWdlc3Q6IHRyYWl0c1NuYXBzaG90LmRpZ2VzdCxcbiAgICAgICAgICAgICAgY291bnQ6IHRyYWl0c1NuYXBzaG90LnRyYWl0cy5sZW5ndGgsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgaWQ6IG1vZHVsZS5pZCxcbiAgICAgICAgbW9kdWxlSWQ6IFN0cmluZyhydC5tb2R1bGVJZCksXG4gICAgICAgIGluc3RhbmNlSWQ6IFN0cmluZyhydC5pbnN0YW5jZUlkKSxcbiAgICAgICAgYWN0aW9uS2V5cyxcbiAgICAgICAgbG9naWNVbml0cyxcbiAgICAgICAgc2NoZW1hS2V5cyxcbiAgICAgICAgbWV0YSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0cmFpdHMsXG4gICAgICB9XG5cbiAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICB0eXBlOiBcInRyYWNlOm1vZHVsZTpkZXNjcmlwdG9yXCIsXG4gICAgICAgIG1vZHVsZUlkOiBydC5tb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogcnQuaW5zdGFuY2VJZCxcbiAgICAgICAgZGF0YSxcbiAgICAgIH0gYXMgYW55KVxuICAgIH0pXG5cbiAgLyoqXG4gICAqIHN0cmljdFx1RkYxQVx1NTNFQVx1NEVDRVx1MjAxQ1x1NUY1M1x1NTI0RCBFZmZlY3QgRW52XHUyMDFEXHU4OUUzXHU2NzkwXHU2N0QwXHU0RTJBIE1vZHVsZSBcdTc2ODQgUnVudGltZVx1MzAwMlxuICAgKlxuICAgKiBcdThCRjRcdTY2MEVcdUZGMUFcbiAgICogLSBcdTU5MUEgcm9vdCAvIFx1NTkxQVx1NUI5RVx1NEY4Qlx1NTczQVx1NjY2Rlx1NEUwQlx1RkYwQ1x1NEVGQlx1NEY1NVx1OEZEQlx1N0EwQlx1N0VBNyByZWdpc3RyeSBcdTkwRkRcdTY1RTBcdTZDRDVcdTg4NjhcdThGQkVcdTZCNjNcdTc4NkVcdThCRURcdTRFNDlcdUZGMUJcbiAgICogLSBcdTdGM0FcdTU5MzFcdTYzRDBcdTRGOUJcdTgwMDVcdTVDNUVcdTRFOEVcdTg4QzVcdTkxNERcdTk1MTlcdThCRUZcdUZGMUFcdTVGQzVcdTk4N0JcdTdBMzNcdTVCOUFcdTU5MzFcdThEMjVcdUZGMENcdTVFNzZcdTdFRDlcdTUxRkFcdTUzRUZcdTRGRUVcdTU5MERcdTc2ODRcdTYzRDBcdTc5M0FcdUZGMDhkZXYvdGVzdCBcdTRFMEJcdTY2RjRcdThCRTZcdTdFQzZcdUZGMDlcdTMwMDJcbiAgICovXG4gIGNvbnN0IHJlc29sdmVNb2R1bGVSdW50aW1lID0gKFxuICAgIHRhZzogQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj5cbiAgKTogRWZmZWN0LkVmZmVjdDxMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PiwgbmV2ZXIsIGFueT4gPT5cbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRNb2R1bGVJZCA9XG4gICAgICAgIHR5cGVvZiAodGFnIGFzIGFueSk/LmlkID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyAoKHRhZyBhcyBhbnkpLmlkIGFzIHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgZnJvbU1vZHVsZUlkID1cbiAgICAgICAgdHlwZW9mIG9wdGlvbnM/Lm1vZHVsZUlkID09PSBcInN0cmluZ1wiID8gb3B0aW9ucy5tb2R1bGVJZCA6IHVuZGVmaW5lZFxuXG4gICAgICAvLyAxKSBcdTRGMThcdTUxNDhcdTVDMURcdThCRDVcdTRFQ0VcdTVGNTNcdTUyNEQgQ29udGV4dCBcdTRFMkRcdThCRkJcdTUzRDZcbiAgICAgIGNvbnN0IGZyb21FbnYgPSB5aWVsZCogRWZmZWN0LnNlcnZpY2VPcHRpb24odGFnKVxuICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZnJvbUVudikpIHtcbiAgICAgICAgcmV0dXJuIGZyb21FbnYudmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gMikgXHU2NUUwXHU2Q0Q1XHU2MjdFXHU1MjMwXHU2NUY2XHU3NkY0XHU2M0E1IGRpZSBcdTIwMTRcdTIwMTQgXHU4RkQ5XHU2NjJGXHU5MTREXHU3RjZFXHU5NTE5XHU4QkVGXHVGRjBDXHU2M0QwXHU3OTNBXHU4QzAzXHU3NTI4XHU2NUI5XHU0RkVFXHU2QjYzXHU4OEM1XHU5MTREXHU2NUI5XHU1RjBGXG4gICAgICBjb25zdCB0b2tlbklkID0gcmVxdWVzdGVkTW9kdWxlSWQgPz8gXCI8dW5rbm93biBtb2R1bGUgaWQ+XCJcbiAgICAgIGNvbnN0IGZpeDogc3RyaW5nW10gPSBpc0RldkVudigpXG4gICAgICAgID8gW1xuICAgICAgICAgICAgXCItIFByb3ZpZGUgdGhlIGNoaWxkIGltcGxlbWVudGF0aW9uIGluIHRoZSBzYW1lIHNjb3BlIChpbXBvcnRzKS5cIixcbiAgICAgICAgICAgIGAgIEV4YW1wbGU6ICR7ZnJvbU1vZHVsZUlkID8/IFwiUGFyZW50TW9kdWxlXCJ9LmltcGxlbWVudCh7IGltcG9ydHM6IFske3JlcXVlc3RlZE1vZHVsZUlkID8/IFwiQ2hpbGRNb2R1bGVcIn0uaW1wbF0sIC4uLiB9KWAsXG4gICAgICAgICAgICBcIi0gSWYgeW91IGludGVudGlvbmFsbHkgd2FudCBhIHJvb3Qgc2luZ2xldG9uLCBwcm92aWRlIGl0IGF0IGFwcCByb290IChSdW50aW1lLm1ha2UoLi4uLHsgbGF5ZXIgfSkgLyByb290IGltcG9ydHMpLFwiLFxuICAgICAgICAgICAgXCIgIGFuZCB1c2UgUm9vdC5yZXNvbHZlKE1vZHVsZVRhZykgKGluc3RlYWQgb2YgJC51c2UpIGF0IHRoZSBjYWxsc2l0ZS5cIixcbiAgICAgICAgICBdXG4gICAgICAgIDogW11cblxuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICBpc0RldkVudigpXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFwiW01pc3NpbmdNb2R1bGVSdW50aW1lRXJyb3JdIENhbm5vdCByZXNvbHZlIE1vZHVsZVJ1bnRpbWUgZm9yIE1vZHVsZVRhZy5cIixcbiAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgYHRva2VuSWQ6ICR7dG9rZW5JZH1gLFxuICAgICAgICAgICAgICBcImVudHJ5cG9pbnQ6IGxvZ2ljLiQudXNlXCIsXG4gICAgICAgICAgICAgIFwibW9kZTogc3RyaWN0XCIsXG4gICAgICAgICAgICAgIGBmcm9tOiAke2Zyb21Nb2R1bGVJZCA/PyBcIjx1bmtub3duIG1vZHVsZSBpZD5cIn1gLFxuICAgICAgICAgICAgICBgc3RhcnRTY29wZTogbW9kdWxlSWQ9JHtmcm9tTW9kdWxlSWQgPz8gXCI8dW5rbm93bj5cIn0sIGluc3RhbmNlSWQ9JHtTdHJpbmcocnVudGltZS5pbnN0YW5jZUlkID8/IFwiPHVua25vd24+XCIpfWAsXG4gICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICAgIFwiZml4OlwiLFxuICAgICAgICAgICAgICAuLi5maXgsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICA6IFwiW01pc3NpbmdNb2R1bGVSdW50aW1lRXJyb3JdIG1vZHVsZSBydW50aW1lIG5vdCBmb3VuZFwiLFxuICAgICAgKVxuXG4gICAgICA7KGVyciBhcyBhbnkpLnRva2VuSWQgPSB0b2tlbklkXG4gICAgICA7KGVyciBhcyBhbnkpLmVudHJ5cG9pbnQgPSBcImxvZ2ljLiQudXNlXCJcbiAgICAgIDsoZXJyIGFzIGFueSkubW9kZSA9IFwic3RyaWN0XCJcbiAgICAgIDsoZXJyIGFzIGFueSkuZnJvbSA9IGZyb21Nb2R1bGVJZFxuICAgICAgOyhlcnIgYXMgYW55KS5zdGFydFNjb3BlID0ge1xuICAgICAgICBtb2R1bGVJZDogZnJvbU1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBTdHJpbmcocnVudGltZS5pbnN0YW5jZUlkID8/IFwiPHVua25vd24+XCIpLFxuICAgICAgfVxuICAgICAgOyhlcnIgYXMgYW55KS5maXggPSBmaXhcblxuICAgICAgZXJyLm5hbWUgPSBcIk1pc3NpbmdNb2R1bGVSdW50aW1lRXJyb3JcIlxuICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZGllKGVycilcbiAgICB9KVxuXG4gIGNvbnN0IHN0YXRlQXBpOiBCb3VuZEFwaTxTaCwgUj5bXCJzdGF0ZVwiXSA9IHtcbiAgICByZWFkOiBydW50aW1lLmdldFN0YXRlLFxuICAgIHVwZGF0ZTogKGYpID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGluVHhuID0geWllbGQqIEZpYmVyUmVmLmdldChUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIpXG4gICAgICAgIGlmIChpblR4bikge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB5aWVsZCogcnVudGltZS5nZXRTdGF0ZVxuICAgICAgICAgIHJldHVybiB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShmKHByZXYpKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9ICgpID0+XG4gICAgICAgICAgRWZmZWN0LmZsYXRNYXAocnVudGltZS5nZXRTdGF0ZSwgKHByZXYpID0+IHJ1bnRpbWUuc2V0U3RhdGUoZihwcmV2KSkpXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiAocnVudGltZUludGVybmFsc1xuICAgICAgICAgID8gcnVudGltZUludGVybmFscy50eG4ucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICAgIHsga2luZDogXCJzdGF0ZVwiLCBuYW1lOiBcInVwZGF0ZVwiIH0gYXMgYW55LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogYm9keSgpKVxuICAgICAgfSksXG4gICAgbXV0YXRlOiAoZikgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkUGF0Y2ggPSBydW50aW1lSW50ZXJuYWxzPy50eG4ucmVjb3JkU3RhdGVQYXRjaFxuXG4gICAgICAgIGNvbnN0IGluVHhuID0geWllbGQqIEZpYmVyUmVmLmdldChUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIpXG4gICAgICAgIGlmIChpblR4bikge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB5aWVsZCogcnVudGltZS5nZXRTdGF0ZVxuICAgICAgICAgIGNvbnN0IHsgbmV4dFN0YXRlLCBwYXRjaFBhdGhzIH0gPSBtdXRhdGVXaXRoUGF0Y2hQYXRocyhcbiAgICAgICAgICAgIHByZXYgYXMgTG9naXguU3RhdGVPZjxTaD4sXG4gICAgICAgICAgICAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgZihkcmFmdCBhcyBMb2dpYy5EcmFmdDxMb2dpeC5TdGF0ZU9mPFNoPj4pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcblxuICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgICByZWNvcmRQYXRjaD8uKHtcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgcmVhc29uOiBcInN0YXRlOm11dGF0ZVwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bnRpbWUuc2V0U3RhdGUobmV4dFN0YXRlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9ICgpID0+XG4gICAgICAgICAgRWZmZWN0LmZsYXRNYXAocnVudGltZS5nZXRTdGF0ZSwgKHByZXYpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmV4dFN0YXRlLCBwYXRjaFBhdGhzIH0gPSBtdXRhdGVXaXRoUGF0Y2hQYXRocyhcbiAgICAgICAgICAgICAgcHJldiBhcyBMb2dpeC5TdGF0ZU9mPFNoPixcbiAgICAgICAgICAgICAgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgZihkcmFmdCBhcyBMb2dpYy5EcmFmdDxMb2dpeC5TdGF0ZU9mPFNoPj4pXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgICAgIHJlY29yZFBhdGNoPy4oe1xuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgcmVhc29uOiBcInN0YXRlOm11dGF0ZVwiLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcnVudGltZS5zZXRTdGF0ZShuZXh0U3RhdGUpXG4gICAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4geWllbGQqIChydW50aW1lSW50ZXJuYWxzXG4gICAgICAgICAgPyBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgICAgeyBraW5kOiBcInN0YXRlXCIsIG5hbWU6IFwibXV0YXRlXCIgfSBhcyBhbnksXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBib2R5KCkpXG4gICAgICB9KSxcbiAgICByZWY6IHJ1bnRpbWUucmVmLFxuICB9XG5cbiAgY29uc3QgYWN0aW9uc0FwaSA9IG5ldyBQcm94eSh7fSBhcyBCb3VuZEFwaTxTaCwgUj5bXCJhY3Rpb25zXCJdLCB7XG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgaWYgKHByb3AgPT09IFwiZGlzcGF0Y2hcIikge1xuICAgICAgICByZXR1cm4gKGE6IExvZ2l4LkFjdGlvbk9mPFNoPikgPT4gcnVudGltZS5kaXNwYXRjaChhKVxuICAgICAgfVxuICAgICAgaWYgKHByb3AgPT09IFwiYWN0aW9ucyRcIikge1xuICAgICAgICByZXR1cm4gcnVudGltZS5hY3Rpb25zJFxuICAgICAgfVxuICAgICAgcmV0dXJuIChwYXlsb2FkOiBhbnkpID0+XG4gICAgICAgIHJ1bnRpbWUuZGlzcGF0Y2goeyBfdGFnOiBwcm9wIGFzIHN0cmluZywgcGF5bG9hZCB9IGFzIExvZ2l4LkFjdGlvbk9mPFNoPilcbiAgICB9LFxuICB9KVxuXG4gIGNvbnN0IG1hdGNoQXBpID0gPFY+KHZhbHVlOiBWKTogTG9naWMuRmx1ZW50TWF0Y2g8Vj4gPT5cbiAgICBNYXRjaEJ1aWxkZXIubWFrZU1hdGNoKHZhbHVlKVxuXG4gIGNvbnN0IG1hdGNoVGFnQXBpID0gPFYgZXh0ZW5kcyB7IF90YWc6IHN0cmluZyB9PihcbiAgICB2YWx1ZTogVlxuICApOiBMb2dpYy5GbHVlbnRNYXRjaFRhZzxWPiA9PiBNYXRjaEJ1aWxkZXIubWFrZU1hdGNoVGFnKHZhbHVlKVxuXG4gIC8vIFByaW1hcnkgUmVkdWNlciBcdTZDRThcdTUxOENcdUZGMUFcdTkwMUFcdThGQzcgcnVudGltZSBcdTRFMEFcdTc2ODRcdTUxODVcdTkwRThcdTZDRThcdTUxOENcdTUxRkRcdTY1NzBcdUZGMDhcdTgyRTVcdTVCNThcdTU3MjhcdUZGMDlcdTUxOTlcdTUxNjUgcmVkdWNlciBcdTY2MjBcdTVDMDRcdTMwMDJcbiAgY29uc3QgcmVkdWNlcjogQm91bmRBcGk8U2gsIFI+W1wicmVkdWNlclwiXSA9ICh0YWcsIGZuKSA9PiB7XG4gICAgcmV0dXJuIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJlZ2lzdGVyUmVkdWNlcihTdHJpbmcodGFnKSwgZm4gYXMgYW55KVxuICAgIH0pIGFzIGFueVxuICB9XG5cbiAgY29uc3QgYXBpOiBCb3VuZEFwaTxTaCwgUj4gPSB7XG4gICAgc3RhdGU6IHN0YXRlQXBpLFxuICAgIGFjdGlvbnM6IGFjdGlvbnNBcGksXG4gICAgZmxvdzogZmxvd0FwaSxcbiAgICBtYXRjaDogbWF0Y2hBcGksXG4gICAgbWF0Y2hUYWc6IG1hdGNoVGFnQXBpLFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25Jbml0UmVxdWlyZWQ6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vbkluaXRSZXF1aXJlZFwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlckluaXRSZXF1aXJlZChlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25TdGFydDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uU3RhcnRcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJTdGFydChlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25Jbml0OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIC8vIGxlZ2FjeSBhbGlhc1x1RkYxQVx1OEJFRFx1NEU0OVx1N0I0OVx1NTQwQ1x1NEU4RSBvbkluaXRSZXF1aXJlZFx1RkYwOFx1NEUzQVx1NEU4Nlx1OEZDMVx1NzlGQlx1NjcxRlx1NTFDRlx1NUMxMVx1NjQ2OVx1NjRFNlx1RkYwOVx1MzAwMlxuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uSW5pdFwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlckluaXRSZXF1aXJlZChlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25EZXN0cm95OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25EZXN0cm95XCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyRGVzdHJveShlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKFxuICAgICAgICBoYW5kbGVyOiAoXG4gICAgICAgICAgY2F1c2U6IGltcG9ydChcImVmZmVjdFwiKS5DYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICAgICAgICBjb250ZXh0OiBMaWZlY3ljbGUuRXJyb3JDb250ZXh0LFxuICAgICAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIFI+LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25FcnJvclwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3Rlck9uRXJyb3IoaGFuZGxlciBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblN1c3BlbmQ6IChcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25TdXNwZW5kXCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kKFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQoZWZmIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblJlc3VtZTogKFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vblJlc3VtZVwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlclBsYXRmb3JtUmVzdW1lKFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQoZWZmIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblJlc2V0OiAoXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uUmVzZXRcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJQbGF0Zm9ybVJlc2V0KFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQoZWZmIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgfSxcbiAgICB0cmFpdHM6IHtcbiAgICAgIGRlY2xhcmU6ICh0cmFpdHM6IE1vZHVsZVRyYWl0cy5UcmFpdFNwZWMpID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgdGhyb3cgTG9naWNEaWFnbm9zdGljcy5tYWtlTG9naWNQaGFzZUVycm9yKFxuICAgICAgICAgICAgXCJ0cmFpdHNfZGVjbGFyZV9pbl9ydW5cIixcbiAgICAgICAgICAgIFwiJC50cmFpdHMuZGVjbGFyZVwiLFxuICAgICAgICAgICAgXCJydW5cIixcbiAgICAgICAgICAgIG9wdGlvbnM/Lm1vZHVsZUlkLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIltJbnZhbGlkVHJhaXRzRGVjbGFyYXRpb25dICQudHJhaXRzLmRlY2xhcmUgZXhwZWN0cyBhbiBvYmplY3QuXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9naWNVbml0ID0gb3B0aW9ucz8ubG9naWNVbml0ID8/IHtcbiAgICAgICAgICBsb2dpY1VuaXRJZDogXCJ1bmtub3duXCIsXG4gICAgICAgICAgbG9naWNVbml0SWRLaW5kOiBcImRlcml2ZWRcIiBhcyBjb25zdCxcbiAgICAgICAgICBsb2dpY1VuaXRMYWJlbDogXCJsb2dpY1VuaXQ6dW5rbm93blwiLFxuICAgICAgICAgIHBhdGg6IHVuZGVmaW5lZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH1cblxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLnRyYWl0cy5yZWdpc3Rlck1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbih7XG4gICAgICAgICAgdHJhaXRzLFxuICAgICAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAgICAgIG9yaWdpblR5cGU6IFwibG9naWNVbml0XCIsXG4gICAgICAgICAgICBvcmlnaW5JZDogbG9naWNVbml0LmxvZ2ljVW5pdElkLFxuICAgICAgICAgICAgb3JpZ2luSWRLaW5kOiBsb2dpY1VuaXQubG9naWNVbml0SWRLaW5kLFxuICAgICAgICAgICAgb3JpZ2luTGFiZWw6IGxvZ2ljVW5pdC5sb2dpY1VuaXRMYWJlbCxcbiAgICAgICAgICAgIHBhdGg6IGxvZ2ljVW5pdC5wYXRoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIHJlZnJlc2g6IChmaWVsZFBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKHJ1bnRpbWVJbnRlcm5hbHMudHJhaXRzLmdldFNvdXJjZVJlZnJlc2hIYW5kbGVyKFxuICAgICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICApIGFzXG4gICAgICAgICAgICAgIHwgKChzdGF0ZTogTG9naXguU3RhdGVPZjxTaD4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pXG4gICAgICAgICAgICAgIHwgdW5kZWZpbmVkKVxuICAgICAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICAgIC8vIFx1ODJFNVx1NjcyQVx1NkNFOFx1NTE4Q1x1NTIzN1x1NjVCMFx1OTAzQlx1OEY5MVx1RkYwQ1x1NTIxOVx1ODlDNlx1NEUzQSBuby1vcFx1RkYwQ1x1OTA3Rlx1NTE0RFx1NTcyOFx1NjcyQVx1NjMwMiBTdGF0ZVRyYWl0UHJvZ3JhbSBcdTY1RjZcdTYyOUJcdTk1MTlcdTMwMDJcbiAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3Qudm9pZFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBcdTRFOEJcdTUyQTFcdTdBOTdcdTUzRTNcdTUxODVcdTc5ODFcdTZCNjJcdTUxOERcdThENzAgZW5xdWV1ZVRyYW5zYWN0aW9uXHVGRjA4XHU0RjFBXHU1QkZDXHU4MUY0XHU2QjdCXHU5NTAxXHVGRjA5XHVGRjFBXG4gICAgICAgICAgICAvLyAtIFx1NzZGNFx1NjNBNVx1NTcyOFx1NUY1M1x1NTI0RFx1NEU4Qlx1NTJBMVx1NTE4NVx1NjI2N1x1ODg0QyBoYW5kbGVyXHVGRjBDXHU0RjdGXHU1MTc2XHU5MDFBXHU4RkM3IGJvdW5kLnN0YXRlLm11dGF0ZSBcdTUxOTlcdTUxNjUgZHJhZnRcdUZGMUJcbiAgICAgICAgICAgIC8vIC0gXHU3NTMxXHU1OTE2XHU1QzQyXHU1NDBDXHU0RTAwXHU0RThCXHU1MkExXHU3QTk3XHU1M0UzXHU4RDFGXHU4RDIzIGNvbW1pdCArIGRlYnVnIFx1ODA1QVx1NTQwOFx1MzAwMlxuICAgICAgICAgICAgY29uc3QgaW5UeG4gPSB5aWVsZCogRmliZXJSZWYuZ2V0KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlcilcbiAgICAgICAgICAgIGlmIChpblR4bikge1xuICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9ICh5aWVsZCogcnVudGltZS5nZXRTdGF0ZSkgYXMgTG9naXguU3RhdGVPZjxTaD5cbiAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBoYW5kbGVyKHN0YXRlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBcdTVDMDZcdTRFMDBcdTZCMjEgc291cmNlLXJlZnJlc2ggXHU4OUM2XHU0RTNBXHU1MzU1XHU3MkVDXHU3Njg0XHU0RThCXHU1MkExXHU1MTY1XHU1M0UzXHUzMDAyXG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2luZDogXCJzb3VyY2UtcmVmcmVzaFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IGZpZWxkUGF0aCxcbiAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoeWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGUpIGFzIExvZ2l4LlN0YXRlT2Y8U2g+XG4gICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIGhhbmRsZXIoc3RhdGUpXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVkdWNlcixcbiAgICB1c2U6IG5ldyBQcm94eSgoKSA9PiB7fSwge1xuICAgICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgW2FyZ10pID0+IHtcbiAgICAgICAgZ3VhcmRSdW5Pbmx5KFwidXNlX2luX3NldHVwXCIsIFwiJC51c2VcIilcbiAgICAgICAgaWYgKGlzTW9kdWxlTGlrZShhcmcpKSB7XG4gICAgICAgICAgY29uc3QgZG9tYWluID0gYXJnXG4gICAgICAgICAgY29uc3QgdGFnID0gZG9tYWluLnRhZyBhcyB1bmtub3duIGFzIENvbnRleHQuVGFnPFxuICAgICAgICAgICAgYW55LFxuICAgICAgICAgICAgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT5cbiAgICAgICAgICA+XG5cbiAgICAgICAgICBjb25zdCByZXNvbHZlQW5kQnVpbGQgPSByZXNvbHZlTW9kdWxlUnVudGltZSh0YWcpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QubWFwKChydCkgPT4gYnVpbGRNb2R1bGVIYW5kbGUodGFnLCBydCkpLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGNvbnN0IHJlc29sdmVXaXRoRGVzY3JpcHRvciA9IHJlc29sdmVNb2R1bGVSdW50aW1lKHRhZykucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC50YXAoKHJ0KSA9PiBlbWl0TW9kdWxlRGVzY3JpcHRvck9uY2UoZG9tYWluLCBydCkpLFxuICAgICAgICAgICAgRWZmZWN0Lm1hcCgocnQpID0+IGJ1aWxkTW9kdWxlSGFuZGxlKHRhZywgcnQpKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCBkZXRlY3RBbmRTZWxlY3QgPSBGaWJlclJlZi5nZXQoRGVidWcuY3VycmVudERpYWdub3N0aWNzTGV2ZWwpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QudGFwKChsZXZlbCkgPT4ge1xuICAgICAgICAgICAgICBjYWNoZWREaWFnbm9zdGljc0xldmVsID0gbGV2ZWxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgRWZmZWN0LmZsYXRNYXAoKGxldmVsKSA9PlxuICAgICAgICAgICAgICBsZXZlbCA9PT0gXCJvZmZcIiA/IHJlc29sdmVBbmRCdWlsZCA6IHJlc29sdmVXaXRoRGVzY3JpcHRvcixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgLy8gMDIyIHBlcmYgZ2F0ZVx1RkYxQWRpYWdub3N0aWNzIG9mZiBcdTY1RjZcdUZGMEMkLnVzZShtb2R1bGUpIFx1NEUwRSAkLnVzZShtb2R1bGUudGFnKSBcdTVGQzVcdTk4N0JcdTdCNDlcdTRFRjdcdTRFMTRcdTk2RjZcdTk4OURcdTU5MTZcdTVGMDBcdTk1MDBcdTMwMDJcbiAgICAgICAgICAvLyBcdTdFQTZcdTY3NUZcdUZGMUFFZmZlY3QgXHU2NjJGXHU1MDNDXHVGRjA4XHU1M0VGXHU1OTBEXHU3NTI4XHVGRjA5XHVGRjFCXHU1NkUwXHU2QjY0XHU1RkM1XHU5ODdCXHU1NzI4XHU2MjY3XHU4ODRDXHU2NzFGXHU1MDVBXHU0RTAwXHU2QjIxXHU2MDI3XHU3RjEzXHU1QjU4XHVGRjBDXHU4MDBDXHU0RTBEXHU4MEZEXHU1NzI4XHU2Nzg0XHU5MDIwXHU2NzFGXHU1NkZBXHU1QjlBXHU1MjA2XHU2NTJGXHUzMDAyXG5cdCAgICAgICAgICByZXR1cm4gRWZmZWN0LnN1c3BlbmQoKCkgPT4ge1xuXHQgICAgICAgICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJvZmZcIikge1xuXHQgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQW5kQnVpbGRcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIGlmIChjYWNoZWREaWFnbm9zdGljc0xldmVsICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVdpdGhEZXNjcmlwdG9yXG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gZGV0ZWN0QW5kU2VsZWN0XG5cdCAgICAgICAgICB9KSBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFNoLCBSLCBhbnksIG5ldmVyPlxuXHQgICAgICAgIH1cbiAgICAgICAgaWYgKENvbnRleHQuaXNUYWcoYXJnKSkge1xuICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGFyZyBhcyB7IF9raW5kPzogdW5rbm93biB9XG5cbiAgICAgICAgICAvLyBNb2R1bGVcdUZGMUFcdThGRDRcdTU2REVcdTUzRUFcdThCRkIgTW9kdWxlSGFuZGxlIFx1ODlDNlx1NTZGRVxuICAgICAgICAgIGlmIChjYW5kaWRhdGUuX2tpbmQgPT09IFwiTW9kdWxlVGFnXCIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlTW9kdWxlUnVudGltZShhcmcgYXMgYW55KS5waXBlKFxuICAgICAgICAgICAgICBFZmZlY3QubWFwKChydDogTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4pID0+XG4gICAgICAgICAgICAgICAgYnVpbGRNb2R1bGVIYW5kbGUoYXJnIGFzIGFueSwgcnQpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFNoLCBSLCBhbnksIG5ldmVyPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFx1NjY2RVx1OTAxQSBTZXJ2aWNlIFRhZ1x1RkYxQVx1NzZGNFx1NjNBNVx1NEVDRSBFbnYgXHU4M0I3XHU1M0Q2IFNlcnZpY2VcbiAgICAgICAgICByZXR1cm4gYXJnIGFzIHVua25vd24gYXMgTG9naWMuT2Y8U2gsIFIsIGFueSwgbmV2ZXI+XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVmZmVjdC5kaWUoXCJCb3VuZEFwaS51c2U6IHVuc3VwcG9ydGVkIGFyZ3VtZW50XCIpIGFzIHVua25vd24gYXMgTG9naWMuT2Y8XG4gICAgICAgICAgU2gsXG4gICAgICAgICAgUixcbiAgICAgICAgICBhbnksXG4gICAgICAgICAgbmV2ZXJcbiAgICAgICAgPlxuICAgICAgfSxcbiAgICB9KSBhcyB1bmtub3duIGFzIEJvdW5kQXBpPFNoLCBSPltcInVzZVwiXSxcbiAgICBvbkFjdGlvbjogbmV3IFByb3h5KCgpID0+IHt9LCB7XG4gICAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25BY3Rpb25cIilcbiAgICAgICAgY29uc3QgYXJnID0gYXJnc1swXVxuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoU3RyZWFtLmZpbHRlcihhcmcpKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgcnVudGltZS5hY3Rpb25zJC5waXBlKFxuICAgICAgICAgICAgICBTdHJlYW0uZmlsdGVyKChhOiBhbnkpID0+IGEuX3RhZyA9PT0gYXJnIHx8IGEudHlwZSA9PT0gYXJnKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgJiYgYXJnICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKFwiX3RhZ1wiIGluIGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShcbiAgICAgICAgICAgICAgICBTdHJlYW0uZmlsdGVyKChhOiBhbnkpID0+IGEuX3RhZyA9PT0gKGFyZyBhcyBhbnkpLl90YWcpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIFN0cmluZygoYXJnIGFzIGFueSkuX3RhZyksXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChTY2hlbWEuaXNTY2hlbWEoYXJnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShcbiAgICAgICAgICAgICAgICBTdHJlYW0uZmlsdGVyKChhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjaGVtYS5kZWNvZGVVbmtub3duU3luYyhcbiAgICAgICAgICAgICAgICAgICAgYXJnIGFzIFNjaGVtYS5TY2hlbWE8YW55LCBhbnksIG5ldmVyPlxuICAgICAgICAgICAgICAgICAgKShhKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuICEhcmVzdWx0XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihydW50aW1lLmFjdGlvbnMkKVxuICAgICAgfSxcbiAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgZ3VhcmRSdW5Pbmx5KFwidXNlX2luX3NldHVwXCIsIFwiJC5vbkFjdGlvblwiKVxuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShcbiAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoYTogYW55KSA9PiBhLl90YWcgPT09IHByb3AgfHwgYS50eXBlID09PSBwcm9wXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9LFxuICAgIH0pIGFzIHVua25vd24gYXMgQm91bmRBcGk8U2gsIFI+W1wib25BY3Rpb25cIl0sXG4gICAgb25TdGF0ZTogKFxuICAgICAgc2VsZWN0b3I6IChzOiBMb2dpeC5TdGF0ZU9mPFNoPikgPT4gYW55LFxuICAgICkgPT4ge1xuICAgICAgZ3VhcmRSdW5Pbmx5KFwidXNlX2luX3NldHVwXCIsIFwiJC5vblN0YXRlXCIpXG4gICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihydW50aW1lLmNoYW5nZXMoc2VsZWN0b3IpKVxuICAgIH0sXG4gICAgb246IChcbiAgICAgIHN0cmVhbTogU3RyZWFtLlN0cmVhbTxhbnk+LFxuICAgICkgPT4ge1xuICAgICAgZ3VhcmRSdW5Pbmx5KFwidXNlX2luX3NldHVwXCIsIFwiJC5vblwiKVxuICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoc3RyZWFtKVxuICAgIH0sXG4gIH0gYXMgYW55XG5cbiAgc2V0Qm91bmRJbnRlcm5hbHMoYXBpIGFzIGFueSwgcnVudGltZUludGVybmFscylcblxuICByZXR1cm4gYXBpXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQSxJQUFNLG9CQUFvQixDQUFDLFNBQStDO0FBQ3hFLE1BQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsVUFBTSxVQUFVLEtBQUssS0FBSztBQUMxQixXQUFPLFFBQVEsU0FBUyxJQUFJLFVBQVU7QUFBQSxFQUN4QztBQUVBLE1BQUksQ0FBQyxNQUFNLFFBQVEsSUFBSSxFQUFHLFFBQU87QUFFakMsUUFBTSxRQUF1QixDQUFDO0FBQzlCLGFBQVcsT0FBTyxNQUFNO0FBQ3RCLFFBQUksT0FBTyxRQUFRLFVBQVU7QUFDM0IsVUFBSSxJQUFJLFNBQVMsRUFBRyxP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