@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,867 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ makeApp,
5
+ makeProgramRunnerKernel,
6
+ provide
7
+ } from "./chunk-J45VPU24.js";
8
+ import {
9
+ exportStaticIr
10
+ } from "./chunk-R5HQS6RB.js";
11
+ import {
12
+ evidenceCollectorLayer,
13
+ makeEvidenceCollector
14
+ } from "./chunk-PBPT2U2N.js";
15
+ import {
16
+ appendConvergeStaticIrCollectors
17
+ } from "./chunk-ZVVBP7ON.js";
18
+ import {
19
+ getModuleTraitsProgram
20
+ } from "./chunk-EP5GQYZ5.js";
21
+ import {
22
+ appendSinks,
23
+ diagnosticsLevel,
24
+ toSerializableErrorSummary
25
+ } from "./chunk-4GMUQTWH.js";
26
+ import {
27
+ fnv1a32,
28
+ stableStringify
29
+ } from "./chunk-6JRP52YT.js";
30
+ import {
31
+ makeRunSession,
32
+ runSessionLayer
33
+ } from "./chunk-GZ2NSE6A.js";
34
+ import {
35
+ isJsonValue
36
+ } from "./chunk-S6ZZHV6G.js";
37
+ import {
38
+ RuntimeServicesInstanceOverridesTag,
39
+ getKernelImplementationRef,
40
+ getRuntimeServicesEvidence
41
+ } from "./chunk-CRE4NJJ6.js";
42
+
43
+ // ../logix-core/src/internal/reflection/staticIr.ts
44
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
45
+ var isModuleImpl = (value) => isRecord(value) && value._tag === "ModuleImpl" && isRecord(value.module);
46
+ var resolveModuleId = (input) => {
47
+ if (isModuleImpl(input)) {
48
+ const id = input.module.id;
49
+ return typeof id === "string" && id.length > 0 ? id : "unknown";
50
+ }
51
+ if (isRecord(input)) {
52
+ const id = input.id;
53
+ if (typeof id === "string" && id.length > 0) return id;
54
+ const tag = input.tag;
55
+ if (tag && (typeof tag === "object" || typeof tag === "function")) {
56
+ const tagId = tag.id;
57
+ if (typeof tagId === "string" && tagId.length > 0) return tagId;
58
+ }
59
+ }
60
+ return "unknown";
61
+ };
62
+ var resolveModuleTag = (input) => {
63
+ if (isModuleImpl(input)) return input.module;
64
+ if (isRecord(input) && input.tag) return input.tag;
65
+ return void 0;
66
+ };
67
+ var exportStaticIr2 = (module) => {
68
+ const tag = resolveModuleTag(module);
69
+ if (!tag) return void 0;
70
+ const program = getModuleTraitsProgram(tag);
71
+ if (!program) return void 0;
72
+ return exportStaticIr({
73
+ program,
74
+ moduleId: resolveModuleId(module)
75
+ });
76
+ };
77
+
78
+ // ../logix-core/src/internal/reflection/manifest.ts
79
+ var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
80
+ var isModuleImpl2 = (value) => isRecord2(value) && value._tag === "ModuleImpl" && isRecord2(value.module);
81
+ var resolveModuleId2 = (input) => {
82
+ if (isModuleImpl2(input)) {
83
+ const id = input.module.id;
84
+ return typeof id === "string" && id.length > 0 ? id : "unknown";
85
+ }
86
+ if (isRecord2(input)) {
87
+ const id = input.id;
88
+ if (typeof id === "string" && id.length > 0) return id;
89
+ const tag = input.tag;
90
+ if (tag && (typeof tag === "object" || typeof tag === "function")) {
91
+ const tagId = tag.id;
92
+ if (typeof tagId === "string" && tagId.length > 0) return tagId;
93
+ }
94
+ }
95
+ return "unknown";
96
+ };
97
+ var resolveActionKeys = (input) => {
98
+ const tag = isModuleImpl2(input) ? input.module : input?.tag;
99
+ const actionMap = tag?.shape?.actionMap;
100
+ if (!isRecord2(actionMap)) return [];
101
+ return Object.keys(actionMap).sort();
102
+ };
103
+ var resolveSchemaKeys = (input) => {
104
+ if (!isRecord2(input)) return void 0;
105
+ const schemas = input.schemas;
106
+ if (!isRecord2(schemas)) return void 0;
107
+ return Object.keys(schemas).sort();
108
+ };
109
+ var resolveSource = (input) => {
110
+ if (!isRecord2(input)) return void 0;
111
+ const dev = input.dev;
112
+ const source = dev?.source;
113
+ if (!isRecord2(source)) return void 0;
114
+ const file = source.file;
115
+ const line = source.line;
116
+ const column = source.column;
117
+ if (typeof file !== "string" || file.length === 0) return void 0;
118
+ if (typeof line !== "number" || !Number.isInteger(line) || line < 1) return void 0;
119
+ if (typeof column !== "number" || !Number.isInteger(column) || column < 1) return void 0;
120
+ return { file, line, column };
121
+ };
122
+ var resolveMeta = (input) => {
123
+ if (!isRecord2(input)) return void 0;
124
+ const meta = input.meta;
125
+ if (!isRecord2(meta)) return void 0;
126
+ const out = {};
127
+ for (const key of Object.keys(meta).sort()) {
128
+ const value = meta[key];
129
+ if (isJsonValue(value)) {
130
+ out[key] = value;
131
+ }
132
+ }
133
+ return Object.keys(out).length > 0 ? out : void 0;
134
+ };
135
+ var MODULE_INTERNAL = /* @__PURE__ */ Symbol.for("logix.module.internal");
136
+ var resolveLogicUnits = (input) => {
137
+ if (!isRecord2(input)) return void 0;
138
+ const internal = input[MODULE_INTERNAL];
139
+ const mounted = internal?.mounted;
140
+ if (!Array.isArray(mounted)) return void 0;
141
+ const out = [];
142
+ for (const unit of mounted) {
143
+ if (!isRecord2(unit)) continue;
144
+ const kind = unit.kind;
145
+ const id = unit.id;
146
+ if (typeof kind !== "string" || kind.length === 0) continue;
147
+ if (typeof id !== "string" || id.length === 0) continue;
148
+ const derived = unit.derived === true ? true : void 0;
149
+ const name = typeof unit.name === "string" ? unit.name : void 0;
150
+ out.push({ kind, id, derived, name });
151
+ }
152
+ out.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : a.kind.localeCompare(b.kind));
153
+ return out.length > 0 ? out : void 0;
154
+ };
155
+ var digestOf = (base) => `manifest:025:${fnv1a32(stableStringify(base))}`;
156
+ var utf8ByteLength = (value) => {
157
+ const json = JSON.stringify(value);
158
+ if (typeof TextEncoder !== "undefined") {
159
+ return new TextEncoder().encode(json).length;
160
+ }
161
+ return json.length;
162
+ };
163
+ var applyMaxBytes = (manifest, maxBytes) => {
164
+ const originalBytes = utf8ByteLength(manifest);
165
+ if (originalBytes <= maxBytes) return manifest;
166
+ const dropped = [];
167
+ const truncatedArrays = [];
168
+ const baseMarker = () => ({
169
+ truncated: true,
170
+ maxBytes,
171
+ originalBytes,
172
+ dropped,
173
+ truncatedArrays
174
+ });
175
+ const withMarker = (next2) => {
176
+ const meta = {
177
+ __logix: baseMarker()
178
+ };
179
+ return { ...next2, meta };
180
+ };
181
+ let next = withMarker(manifest);
182
+ const dropField = (field) => {
183
+ if (next[field] !== void 0) {
184
+ dropped.push(String(field));
185
+ next = withMarker({ ...next, [field]: void 0 });
186
+ }
187
+ };
188
+ dropField("meta");
189
+ if (utf8ByteLength(next) <= maxBytes) return next;
190
+ dropField("source");
191
+ if (utf8ByteLength(next) <= maxBytes) return next;
192
+ dropField("staticIr");
193
+ if (utf8ByteLength(next) <= maxBytes) return next;
194
+ dropField("logicUnits");
195
+ if (utf8ByteLength(next) <= maxBytes) return next;
196
+ dropField("schemaKeys");
197
+ if (utf8ByteLength(next) <= maxBytes) return next;
198
+ while (utf8ByteLength(next) > maxBytes && next.actionKeys.length > 1) {
199
+ truncatedArrays.push("actionKeys");
200
+ next = withMarker({
201
+ ...next,
202
+ actionKeys: next.actionKeys.slice(0, Math.ceil(next.actionKeys.length / 2))
203
+ });
204
+ }
205
+ return next;
206
+ };
207
+ var extractManifest = (module, options) => {
208
+ const manifestVersion = "025";
209
+ const moduleId = resolveModuleId2(module);
210
+ const actionKeys = resolveActionKeys(module);
211
+ const schemaKeys = resolveSchemaKeys(module);
212
+ const logicUnits = resolveLogicUnits(module);
213
+ const source = resolveSource(module);
214
+ const meta = resolveMeta(module);
215
+ const staticIr = options?.includeStaticIr ? exportStaticIr2(module) : void 0;
216
+ const digestBase = {
217
+ manifestVersion,
218
+ moduleId,
219
+ actionKeys,
220
+ schemaKeys,
221
+ logicUnits,
222
+ staticIrDigest: staticIr?.digest
223
+ };
224
+ const digest = digestOf(digestBase);
225
+ const manifest = {
226
+ manifestVersion,
227
+ moduleId,
228
+ actionKeys,
229
+ schemaKeys,
230
+ logicUnits,
231
+ source,
232
+ meta,
233
+ staticIr,
234
+ digest
235
+ };
236
+ const maxBytes = options?.budgets?.maxBytes;
237
+ if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
238
+ return applyMaxBytes(manifest, maxBytes);
239
+ }
240
+ return manifest;
241
+ };
242
+
243
+ // ../logix-core/src/internal/observability/artifacts/registry.ts
244
+ var ARTIFACT_EXPORTERS = /* @__PURE__ */ Symbol.for("logix.module.trialRunArtifactExporters");
245
+ var registerTrialRunArtifactExporter = (tag, exporter) => {
246
+ if (!tag || typeof tag !== "object" && typeof tag !== "function") {
247
+ throw new Error("[Logix] registerTrialRunArtifactExporter: invalid module tag");
248
+ }
249
+ const current = tag[ARTIFACT_EXPORTERS] ?? [];
250
+ const next = Array.isArray(current) ? [...current, exporter] : [exporter];
251
+ tag[ARTIFACT_EXPORTERS] = next;
252
+ };
253
+ var getTrialRunArtifactExporters = (tag) => {
254
+ if (!tag || typeof tag !== "object" && typeof tag !== "function") {
255
+ return [];
256
+ }
257
+ const current = tag[ARTIFACT_EXPORTERS];
258
+ if (!Array.isArray(current)) return [];
259
+ return current.filter((x) => x && typeof x === "object");
260
+ };
261
+
262
+ // ../logix-core/src/internal/observability/trialRunModule.ts
263
+ import { Cause as Cause2, Effect as Effect4, Exit, Fiber, Layer as Layer4, Option } from "../effect.js";
264
+
265
+ // ../logix-core/src/internal/platform/BuildEnv.ts
266
+ import { ConfigProvider, Effect as Effect2, Layer as Layer2 } from "../effect.js";
267
+
268
+ // ../logix-core/src/internal/platform/ConstructionGuard.ts
269
+ import { Cause, Effect } from "../effect.js";
270
+
271
+ // ../logix-core/src/internal/platform/RuntimeHost.ts
272
+ import { Context, Layer } from "../effect.js";
273
+ var detectKind = () => {
274
+ const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
275
+ if (isBrowser) return "browser";
276
+ const isNode = typeof process !== "undefined" && typeof process?.versions?.node === "string";
277
+ if (isNode) return "node";
278
+ return "unknown";
279
+ };
280
+ var make = (kind) => ({
281
+ kind,
282
+ isNode: kind === "node",
283
+ isBrowser: kind === "browser"
284
+ });
285
+ var RuntimeHost = class extends Context.Tag("@logix/RuntimeHost")() {
286
+ };
287
+ var layer = (service) => Layer.succeed(RuntimeHost, service);
288
+ var defaultLayer = layer(make(detectKind()));
289
+
290
+ // ../logix-core/src/internal/platform/BuildEnv.ts
291
+ var toConfigProviderFromRecord = (record) => {
292
+ const map = /* @__PURE__ */ new Map();
293
+ for (const [k, v] of Object.entries(record ?? {})) {
294
+ if (!k) continue;
295
+ if (v === void 0) continue;
296
+ map.set(k, String(v));
297
+ }
298
+ return ConfigProvider.fromMap(map);
299
+ };
300
+ var layer2 = (options = {}) => {
301
+ const runtimeHost = options.runtimeHost ? layer(options.runtimeHost) : options.runtimeHostKind ? layer(make(options.runtimeHostKind)) : defaultLayer;
302
+ const configProvider = options.configProvider ? options.configProvider : toConfigProviderFromRecord(options.config);
303
+ const config = Layer2.setConfigProvider(configProvider);
304
+ return Layer2.mergeAll(runtimeHost, config);
305
+ };
306
+
307
+ // ../logix-core/src/internal/runtime/Runtime.ts
308
+ import { Layer as Layer3 } from "../effect.js";
309
+ var make2 = (rootImpl, options) => {
310
+ const appConfig = {
311
+ layer: options?.layer ?? Layer3.empty,
312
+ modules: [provide(rootImpl.module, rootImpl.layer)],
313
+ processes: rootImpl.processes ?? [],
314
+ onError: options?.onError
315
+ };
316
+ const app = makeApp(appConfig);
317
+ return app.makeRuntime();
318
+ };
319
+
320
+ // ../logix-core/src/internal/observability/artifacts/model.ts
321
+ var isArtifactKey = (input) => typeof input === "string" && /^@[^\s/]+\/[^\s@]+@v\d+$/.test(input);
322
+
323
+ // ../logix-core/src/internal/observability/artifacts/digest.ts
324
+ var utf8ByteLengthString = (text) => {
325
+ if (typeof TextEncoder !== "undefined") {
326
+ return new TextEncoder().encode(text).length;
327
+ }
328
+ return text.length;
329
+ };
330
+ var digestJsonValue = (value) => {
331
+ const stableJson = stableStringify(value);
332
+ const bytes = utf8ByteLengthString(stableJson);
333
+ return {
334
+ stableJson,
335
+ bytes,
336
+ digest: `artifact:031:${fnv1a32(stableJson)}`
337
+ };
338
+ };
339
+
340
+ // ../logix-core/src/internal/observability/artifacts/collect.ts
341
+ var toErrorSummaryWithCode = (cause, code, hint) => {
342
+ const base = toSerializableErrorSummary(cause).errorSummary;
343
+ return {
344
+ name: base.name,
345
+ message: base.message,
346
+ code,
347
+ hint: hint ?? base.hint
348
+ };
349
+ };
350
+ var defaultArtifactBudgetBytes = 50 * 1024;
351
+ var budgetOf = (budgets) => typeof budgets?.maxBytes === "number" && Number.isFinite(budgets.maxBytes) && budgets.maxBytes > 0 ? budgets.maxBytes : defaultArtifactBudgetBytes;
352
+ var makeConflictEnvelope = (artifactKey, exporterIds) => {
353
+ const ids = Array.from(new Set(exporterIds.map((s) => String(s)).filter((s) => s.length > 0))).sort(
354
+ (a, b) => a.localeCompare(b)
355
+ );
356
+ return {
357
+ artifactKey,
358
+ envelope: {
359
+ artifactKey,
360
+ ok: false,
361
+ error: {
362
+ name: "ArtifactKeyConflictError",
363
+ message: `[Logix] TrialRun artifact key conflict: ${artifactKey}`,
364
+ code: "ArtifactKeyConflict",
365
+ hint: ids.length > 0 ? `conflictingExporters=${ids.join(",")}` : void 0
366
+ }
367
+ }
368
+ };
369
+ };
370
+ var truncateJsonValue = (value, maxBytes) => {
371
+ const analyzed = digestJsonValue(value);
372
+ const json = analyzed.stableJson;
373
+ const bytes = analyzed.bytes;
374
+ if (bytes <= maxBytes) {
375
+ return { value, actualBytes: bytes, digest: analyzed.digest };
376
+ }
377
+ const previewChars = Math.min(json.length, Math.max(0, Math.min(256, maxBytes)));
378
+ const preview = json.slice(0, previewChars);
379
+ return {
380
+ value: {
381
+ _tag: "oversized",
382
+ bytes,
383
+ preview
384
+ },
385
+ actualBytes: bytes,
386
+ digest: analyzed.digest
387
+ };
388
+ };
389
+ var collectTrialRunArtifacts = (options) => {
390
+ const exportersSorted = Array.from(options.exporters).sort((a, b) => {
391
+ const ka = String(a?.artifactKey ?? "");
392
+ const kb = String(b?.artifactKey ?? "");
393
+ if (ka < kb) return -1;
394
+ if (ka > kb) return 1;
395
+ const ia = String(a?.exporterId ?? "");
396
+ const ib = String(b?.exporterId ?? "");
397
+ return ia.localeCompare(ib);
398
+ });
399
+ const conflicts = /* @__PURE__ */ new Map();
400
+ for (const ex of exportersSorted) {
401
+ const key = ex?.artifactKey;
402
+ const id = String(ex?.exporterId ?? "");
403
+ if (!isArtifactKey(key)) {
404
+ continue;
405
+ }
406
+ const current = conflicts.get(key);
407
+ if (current) current.push(id);
408
+ else conflicts.set(key, [id]);
409
+ }
410
+ const conflictKeys = /* @__PURE__ */ new Set();
411
+ for (const [k, ids] of conflicts) {
412
+ const unique = Array.from(new Set(ids));
413
+ if (unique.length > 1) {
414
+ conflictKeys.add(k);
415
+ }
416
+ }
417
+ const maxBytes = budgetOf(options.budgets);
418
+ const collected = [];
419
+ for (const exporter of exportersSorted) {
420
+ const artifactKey = exporter?.artifactKey;
421
+ if (!isArtifactKey(artifactKey)) {
422
+ continue;
423
+ }
424
+ if (conflictKeys.has(artifactKey)) {
425
+ continue;
426
+ }
427
+ try {
428
+ const value = exporter.export(options.ctx);
429
+ if (value === void 0) continue;
430
+ if (!isJsonValue(value)) {
431
+ collected.push({
432
+ artifactKey,
433
+ envelope: {
434
+ artifactKey,
435
+ ok: false,
436
+ error: toErrorSummaryWithCode(
437
+ new Error(`[Logix] Artifact exporter returned non-JsonValue: ${exporter.exporterId}`),
438
+ "ArtifactNonSerializable",
439
+ `artifactKey=${artifactKey} exporterId=${exporter.exporterId}`
440
+ )
441
+ }
442
+ });
443
+ continue;
444
+ }
445
+ const truncated = truncateJsonValue(value, maxBytes);
446
+ const envelope = {
447
+ artifactKey,
448
+ ok: true,
449
+ value: truncated.value,
450
+ digest: truncated.digest,
451
+ ...truncated.actualBytes > maxBytes ? {
452
+ truncated: true,
453
+ budgetBytes: maxBytes,
454
+ actualBytes: truncated.actualBytes
455
+ } : {
456
+ budgetBytes: maxBytes,
457
+ actualBytes: truncated.actualBytes
458
+ }
459
+ };
460
+ collected.push({ artifactKey, envelope });
461
+ } catch (e) {
462
+ collected.push({
463
+ artifactKey,
464
+ envelope: {
465
+ artifactKey,
466
+ ok: false,
467
+ error: toErrorSummaryWithCode(
468
+ e,
469
+ "ArtifactExportFailed",
470
+ `artifactKey=${artifactKey} exporterId=${exporter.exporterId}`
471
+ )
472
+ }
473
+ });
474
+ }
475
+ }
476
+ for (const conflictKey of Array.from(conflictKeys).sort((a, b) => a.localeCompare(b))) {
477
+ collected.push(makeConflictEnvelope(conflictKey, conflicts.get(conflictKey) ?? []));
478
+ }
479
+ if (collected.length === 0) return void 0;
480
+ collected.sort((a, b) => a.artifactKey.localeCompare(b.artifactKey));
481
+ return Object.fromEntries(collected.map((c) => [c.artifactKey, c.envelope]));
482
+ };
483
+
484
+ // ../logix-core/src/internal/observability/trialRunModule.ts
485
+ var defaultHost = () => {
486
+ if (typeof window !== "undefined" && typeof document !== "undefined") return "browser";
487
+ return "node";
488
+ };
489
+ var isRecord3 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
490
+ var resolveRootImpl = (root) => root?._tag === "ModuleImpl" ? root : root?.impl;
491
+ var utf8ByteLength2 = (value) => {
492
+ const json = JSON.stringify(value);
493
+ if (typeof TextEncoder !== "undefined") {
494
+ return new TextEncoder().encode(json).length;
495
+ }
496
+ return json.length;
497
+ };
498
+ var parseMissingConfigKeys = (message) => {
499
+ const out = [];
500
+ const patterns = [
501
+ /\bMissing (?:data|value) for (?:key|path) "?([A-Z0-9_./:-]+)"?/g,
502
+ /\bMissing (?:data|value) at ([A-Z0-9_./:-]+)\b/g,
503
+ /\bMissing configuration:? "?([A-Z0-9_./:-]+)"?/g,
504
+ /\bConfig\b.*\bmissing\b.*"?([A-Z0-9_./:-]+)"?/gi
505
+ ];
506
+ for (const re of patterns) {
507
+ let match;
508
+ while (match = re.exec(message)) {
509
+ const key = match[1];
510
+ if (typeof key === "string" && key.length > 0) out.push(key);
511
+ }
512
+ }
513
+ return Array.from(new Set(out)).sort((a, b) => a.localeCompare(b));
514
+ };
515
+ var parseMissingServiceIds = (message) => {
516
+ const out = [];
517
+ const re = /Service not found: ([^\s(]+)/g;
518
+ let match;
519
+ while (match = re.exec(message)) {
520
+ const id = match[1]?.replace(/[,:.;]+$/, "");
521
+ if (typeof id === "string" && id.length > 0) out.push(id);
522
+ }
523
+ return Array.from(new Set(out)).sort((a, b) => a.localeCompare(b));
524
+ };
525
+ var parseMissingDependencyFromCause = (cause) => {
526
+ const missingServices = [];
527
+ const missingConfigKeys = [];
528
+ const candidates = [...Array.from(Cause2.failures(cause)), ...Array.from(Cause2.defects(cause))];
529
+ for (const candidate of candidates) {
530
+ if (isRecord3(candidate) && candidate._tag === "ConstructionGuardError") {
531
+ const missingService = candidate.missingService;
532
+ if (typeof missingService === "string" && missingService.length > 0) {
533
+ missingServices.push(missingService);
534
+ }
535
+ }
536
+ if (isRecord3(candidate) && candidate._tag === "ConfigError" && candidate._op === "MissingData" && Array.isArray(candidate.path) && candidate.path.every((k) => typeof k === "string" && k.length > 0)) {
537
+ const key = candidate.path.join(".");
538
+ if (key.length > 0) missingConfigKeys.push(key);
539
+ }
540
+ }
541
+ const messages = [];
542
+ for (const candidate of candidates) {
543
+ if (candidate instanceof Error) {
544
+ messages.push(candidate.message);
545
+ continue;
546
+ }
547
+ if (typeof candidate === "string") {
548
+ messages.push(candidate);
549
+ continue;
550
+ }
551
+ if (isRecord3(candidate) && typeof candidate.message === "string") {
552
+ messages.push(String(candidate.message));
553
+ }
554
+ }
555
+ try {
556
+ messages.push(Cause2.pretty(cause, { renderErrorCause: true }));
557
+ } catch {
558
+ }
559
+ const merged = messages.filter((s) => s.length > 0).join("\n");
560
+ if (merged) {
561
+ missingServices.push(...parseMissingServiceIds(merged));
562
+ missingConfigKeys.push(...parseMissingConfigKeys(merged));
563
+ }
564
+ return {
565
+ missingServices: Array.from(new Set(missingServices)).sort((a, b) => a.localeCompare(b)),
566
+ missingConfigKeys: Array.from(new Set(missingConfigKeys)).sort((a, b) => a.localeCompare(b))
567
+ };
568
+ };
569
+ var buildEnvironmentIr = (params) => {
570
+ const providedConfigKeys = Object.keys(params.buildEnvConfig ?? {}).filter((k) => k.length > 0 && params.buildEnvConfig[k] !== void 0).sort((a, b) => a.localeCompare(b));
571
+ const missingServices = Array.from(new Set(params.missingServices ?? [])).sort((a, b) => a.localeCompare(b));
572
+ const missingConfigKeys = Array.from(new Set(params.missingConfigKeys ?? [])).sort((a, b) => a.localeCompare(b));
573
+ const runtimeServiceIds = params.runtimeServicesEvidence?.bindings?.map((b) => b.serviceId).filter((s) => typeof s === "string") ?? [];
574
+ const tagIds = Array.from(/* @__PURE__ */ new Set([...runtimeServiceIds, ...missingServices])).sort((a, b) => a.localeCompare(b));
575
+ const configKeys = Array.from(/* @__PURE__ */ new Set([...providedConfigKeys, ...missingConfigKeys])).sort(
576
+ (a, b) => a.localeCompare(b)
577
+ );
578
+ return {
579
+ tagIds,
580
+ configKeys,
581
+ missingServices,
582
+ missingConfigKeys,
583
+ kernelImplementationRef: params.kernelImplementationRef,
584
+ runtimeServicesEvidence: params.runtimeServicesEvidence
585
+ };
586
+ };
587
+ var toErrorSummaryWithCode2 = (cause, code, hint) => {
588
+ const base = toSerializableErrorSummary(cause).errorSummary;
589
+ return {
590
+ name: base.name,
591
+ message: base.message,
592
+ code,
593
+ hint: hint ?? base.hint
594
+ };
595
+ };
596
+ var makeTrialRunTimeoutError = () => Object.assign(new Error("[Logix] trialRunModule timed out"), {
597
+ name: "TrialRunTimeoutError"
598
+ });
599
+ var awaitFiberExitWithTimeout = (fiber, timeoutMs) => Effect4.gen(function* () {
600
+ const hasTimeout = typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0;
601
+ const start = hasTimeout ? Date.now() : 0;
602
+ while (true) {
603
+ const exitOpt = yield* Fiber.poll(fiber);
604
+ if (Option.isSome(exitOpt)) {
605
+ return exitOpt.value;
606
+ }
607
+ if (hasTimeout) {
608
+ const elapsedMs = Date.now() - start;
609
+ if (elapsedMs >= timeoutMs) {
610
+ yield* Fiber.interruptFork(fiber);
611
+ return Exit.fail(makeTrialRunTimeoutError());
612
+ }
613
+ }
614
+ yield* Effect4.promise(() => new Promise((r) => setTimeout(r, 1)));
615
+ }
616
+ });
617
+ var trialRunModule = (root, options) => Effect4.gen(function* () {
618
+ const rootImpl = resolveRootImpl(root);
619
+ const session = makeRunSession({
620
+ runId: options?.runId,
621
+ source: options?.source ?? { host: defaultHost(), label: "trial-run-module" },
622
+ startedAt: options?.startedAt
623
+ });
624
+ const collector = makeEvidenceCollector(session);
625
+ const convergeCollector = {
626
+ register: (ir) => {
627
+ collector.registerConvergeStaticIr(ir);
628
+ }
629
+ };
630
+ const sinksLayer = appendSinks([collector.debugSink]);
631
+ const resolvedDiagnosticsLevel = options?.diagnosticsLevel ?? "light";
632
+ const diagnosticsLayer = diagnosticsLevel(resolvedDiagnosticsLevel);
633
+ const convergeLayer = appendConvergeStaticIrCollectors([convergeCollector]);
634
+ const collectorLayer = evidenceCollectorLayer(collector);
635
+ const sessionLayer = runSessionLayer(session);
636
+ const buildEnvConfig = options?.buildEnv?.config;
637
+ const buildEnvLayer = layer2({
638
+ runtimeHostKind: options?.buildEnv?.hostKind,
639
+ config: buildEnvConfig,
640
+ configProvider: options?.buildEnv?.configProvider
641
+ });
642
+ const trialLayer = Layer4.mergeAll(
643
+ buildEnvLayer,
644
+ options?.layer ?? Layer4.empty,
645
+ sessionLayer,
646
+ collectorLayer,
647
+ diagnosticsLayer,
648
+ sinksLayer,
649
+ convergeLayer
650
+ );
651
+ const kernel = yield* makeProgramRunnerKernel(
652
+ (impl) => make2(impl, {
653
+ layer: trialLayer
654
+ // trial-run 默认不启用 devtools;diagnostics 由 diagnosticsLevel 控制。
655
+ }),
656
+ rootImpl
657
+ );
658
+ const identity = kernel.identity;
659
+ const bootFiber = kernel.runtime.runFork(rootImpl.module);
660
+ const bootExit = yield* awaitFiberExitWithTimeout(bootFiber, options?.trialRunTimeoutMs);
661
+ let kernelImplementationRef;
662
+ let runtimeServicesEvidence;
663
+ let instanceId;
664
+ if (Exit.isSuccess(bootExit)) {
665
+ const moduleRuntime = bootExit.value;
666
+ instanceId = typeof moduleRuntime?.instanceId === "string" && moduleRuntime.instanceId.length > 0 ? moduleRuntime.instanceId : void 0;
667
+ kernel.setInstanceId(instanceId);
668
+ try {
669
+ kernelImplementationRef = getKernelImplementationRef(moduleRuntime);
670
+ } catch {
671
+ kernelImplementationRef = void 0;
672
+ }
673
+ if (resolvedDiagnosticsLevel !== "off") {
674
+ try {
675
+ runtimeServicesEvidence = getRuntimeServicesEvidence(moduleRuntime);
676
+ } catch {
677
+ runtimeServicesEvidence = void 0;
678
+ }
679
+ }
680
+ } else {
681
+ const failure = Cause2.failureOption(bootExit.cause);
682
+ if (Option.isSome(failure)) {
683
+ const err = failure.value;
684
+ const instanceIdFromErr = typeof err?.instanceId === "string" ? err.instanceId : void 0;
685
+ if (instanceIdFromErr && instanceIdFromErr.length > 0) {
686
+ kernel.setInstanceId(instanceIdFromErr);
687
+ }
688
+ }
689
+ }
690
+ const closeExit = yield* Effect4.exit(
691
+ kernel.close({
692
+ timeoutMs: typeof options?.closeScopeTimeout === "number" && Number.isFinite(options.closeScopeTimeout) && options.closeScopeTimeout > 0 ? options.closeScopeTimeout : 1e3
693
+ })
694
+ );
695
+ const evidence = collector.exportEvidencePackage({
696
+ maxEvents: options?.maxEvents ?? 1e3
697
+ });
698
+ const manifest = (() => {
699
+ try {
700
+ return extractManifest(root, {
701
+ includeStaticIr: true,
702
+ budgets: { maxBytes: 2e5 }
703
+ });
704
+ } catch {
705
+ return void 0;
706
+ }
707
+ })();
708
+ const staticIr = (() => {
709
+ try {
710
+ return exportStaticIr2(root);
711
+ } catch {
712
+ return void 0;
713
+ }
714
+ })();
715
+ let ok = Exit.isSuccess(bootExit) && Exit.isSuccess(closeExit);
716
+ let error;
717
+ const depsFromBootFailure = Exit.isFailure(bootExit) ? parseMissingDependencyFromCause(bootExit.cause) : { missingServices: [], missingConfigKeys: [] };
718
+ const missingServices = depsFromBootFailure.missingServices;
719
+ const missingConfigKeys = depsFromBootFailure.missingConfigKeys;
720
+ const closeError = Exit.isFailure(closeExit) ? Option.getOrUndefined(Cause2.dieOption(closeExit.cause)) : void 0;
721
+ if (!Exit.isSuccess(bootExit)) {
722
+ const failure = Option.getOrUndefined(Cause2.failureOption(bootExit.cause));
723
+ const defect = Option.getOrUndefined(Cause2.dieOption(bootExit.cause));
724
+ const base = failure ?? defect ?? bootExit.cause;
725
+ if (missingServices.length > 0 || missingConfigKeys.length > 0) {
726
+ ok = false;
727
+ error = toErrorSummaryWithCode2(
728
+ base,
729
+ "MissingDependency",
730
+ missingServices.length > 0 ? "Build-time missing service: provide a Layer mock/implementation via options.layer, or move the dependency access to runtime." : "Build-time missing config: provide the missing key(s) in buildEnv.config, or add a default value to Config."
731
+ );
732
+ } else if (isRecord3(base) && (base.name === "TrialRunTimeoutError" || base._tag === "TrialRunTimeout")) {
733
+ ok = false;
734
+ error = toErrorSummaryWithCode2(
735
+ base,
736
+ "TrialRunTimeout",
737
+ "Trial run timed out: check for Layer/assembly phase blocking (Effect.never / unfinished acquire)."
738
+ );
739
+ } else {
740
+ ok = false;
741
+ error = toErrorSummaryWithCode2(base, "RuntimeFailure");
742
+ }
743
+ }
744
+ if (Exit.isFailure(closeExit)) {
745
+ const died = Option.getOrUndefined(Cause2.dieOption(closeExit.cause));
746
+ const failure = Option.getOrUndefined(Cause2.failureOption(closeExit.cause));
747
+ const base = died ?? failure ?? closeExit.cause;
748
+ const tag = isRecord3(base) ? base._tag : void 0;
749
+ if (tag === "DisposeTimeout") {
750
+ ok = false;
751
+ error = toErrorSummaryWithCode2(
752
+ base,
753
+ "DisposeTimeout",
754
+ "Dispose timed out: check for unclosed resource handles, fibers not interrupted, or event listeners not unregistered."
755
+ );
756
+ } else {
757
+ ok = false;
758
+ error = toErrorSummaryWithCode2(base, "RuntimeFailure");
759
+ }
760
+ }
761
+ const environment = buildEnvironmentIr({
762
+ kernelImplementationRef,
763
+ runtimeServicesEvidence,
764
+ buildEnvConfig,
765
+ missingServices,
766
+ missingConfigKeys
767
+ });
768
+ const moduleId = typeof rootImpl.module?.id === "string" && rootImpl.module.id.length > 0 ? String(rootImpl.module.id) : manifest?.moduleId ?? "unknown";
769
+ const artifacts = collectTrialRunArtifacts({
770
+ exporters: getTrialRunArtifactExporters(rootImpl.module),
771
+ ctx: {
772
+ moduleId,
773
+ manifest,
774
+ staticIr,
775
+ environment
776
+ }
777
+ });
778
+ let report = {
779
+ runId: session.runId,
780
+ ok,
781
+ manifest,
782
+ staticIr,
783
+ artifacts,
784
+ environment,
785
+ evidence,
786
+ error
787
+ };
788
+ const maxBytes = options?.budgets?.maxBytes;
789
+ if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
790
+ const originalBytes = utf8ByteLength2(report);
791
+ if (originalBytes > maxBytes) {
792
+ report = {
793
+ runId: session.runId,
794
+ ok: false,
795
+ environment,
796
+ error: {
797
+ message: `[Logix] TrialRunReport exceeded maxBytes (${originalBytes} > ${maxBytes})`,
798
+ code: "Oversized",
799
+ hint: "Reduce maxEvents or budgets.maxBytes, or split manifest/evidence artifacts in CI."
800
+ },
801
+ summary: {
802
+ __logix: {
803
+ truncated: true,
804
+ maxBytes,
805
+ originalBytes,
806
+ dropped: ["manifest", "staticIr", "artifacts", "evidence"]
807
+ }
808
+ }
809
+ };
810
+ }
811
+ }
812
+ return report;
813
+ });
814
+
815
+ // ../logix-core/src/internal/observability/trialRun.ts
816
+ import { Effect as Effect5, Layer as Layer5, Scope } from "../effect.js";
817
+ var defaultHost2 = () => {
818
+ if (typeof window !== "undefined" && typeof document !== "undefined") return "browser";
819
+ return "node";
820
+ };
821
+ var trialRun = (program, options) => Effect5.gen(function* () {
822
+ const session = makeRunSession({
823
+ runId: options?.runId,
824
+ source: options?.source ?? { host: defaultHost2(), label: "trial-run" },
825
+ startedAt: options?.startedAt
826
+ });
827
+ const collector = makeEvidenceCollector(session);
828
+ const convergeCollector = {
829
+ register: (ir) => {
830
+ collector.registerConvergeStaticIr(ir);
831
+ }
832
+ };
833
+ const sinksLayer = appendSinks([collector.debugSink]);
834
+ const diagnosticsLayer = diagnosticsLevel(options?.diagnosticsLevel ?? "light");
835
+ const convergeLayer = appendConvergeStaticIrCollectors([convergeCollector]);
836
+ const collectorLayer = evidenceCollectorLayer(collector);
837
+ const sessionLayer = runSessionLayer(session);
838
+ const overridesLayer = options?.runtimeServicesInstanceOverrides != null ? Layer5.succeed(
839
+ RuntimeServicesInstanceOverridesTag,
840
+ options.runtimeServicesInstanceOverrides
841
+ ) : Layer5.empty;
842
+ const trialLayer = Layer5.mergeAll(
843
+ options?.layer ?? Layer5.empty,
844
+ sessionLayer,
845
+ collectorLayer,
846
+ overridesLayer,
847
+ diagnosticsLayer,
848
+ sinksLayer,
849
+ convergeLayer
850
+ );
851
+ const scope = yield* Scope.make();
852
+ const exit = yield* Effect5.exit(program).pipe(Effect5.provideService(Scope.Scope, scope), Effect5.provide(trialLayer));
853
+ yield* Scope.close(scope, exit);
854
+ const evidence = collector.exportEvidencePackage({
855
+ maxEvents: options?.maxEvents
856
+ });
857
+ return { session, exit, evidence };
858
+ });
859
+
860
+ export {
861
+ exportStaticIr2 as exportStaticIr,
862
+ extractManifest,
863
+ registerTrialRunArtifactExporter,
864
+ trialRunModule,
865
+ trialRun
866
+ };
867
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9zdGF0aWNJci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL21hbmlmZXN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL3JlZ2lzdHJ5LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW5Nb2R1bGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQnVpbGRFbnYudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQ29uc3RydWN0aW9uR3VhcmQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vUnVudGltZUhvc3QudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9SdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL21vZGVsLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL2RpZ2VzdC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L2FydGlmYWN0cy9jb2xsZWN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHsgZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvaXIuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRlVHJhaXRQcm9ncmFtIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvbW9kZWwuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciBhcyBleHBvcnRTdGF0ZVRyYWl0U3RhdGljSXIgfSBmcm9tICcuLi9zdGF0ZS10cmFpdC9pci5qcydcblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVNb2R1bGVUYWcgPSAoaW5wdXQ6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKGlzTW9kdWxlSW1wbChpbnB1dCkpIHJldHVybiBpbnB1dC5tb2R1bGVcbiAgaWYgKGlzUmVjb3JkKGlucHV0KSAmJiAoaW5wdXQgYXMgYW55KS50YWcpIHJldHVybiAoaW5wdXQgYXMgYW55KS50YWdcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgZXhwb3J0U3RhdGljSXIgPSAobW9kdWxlOiB1bmtub3duKTogU3RhdGljSXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB0YWcgPSByZXNvbHZlTW9kdWxlVGFnKG1vZHVsZSlcbiAgaWYgKCF0YWcpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBwcm9ncmFtID0gZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSh0YWcpIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4gfCB1bmRlZmluZWRcbiAgaWYgKCFwcm9ncmFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGV4cG9ydFN0YXRlVHJhaXRTdGF0aWNJcih7XG4gICAgcHJvZ3JhbSxcbiAgICBtb2R1bGVJZDogcmVzb2x2ZU1vZHVsZUlkKG1vZHVsZSksXG4gIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanMnXG5pbXBvcnQgeyBzdGFibGVTdHJpbmdpZnksIGZudjFhMzIgfSBmcm9tICcuLi9kaWdlc3QuanMnXG5pbXBvcnQgeyBpc0pzb25WYWx1ZSwgdHlwZSBKc29uVmFsdWUgfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qcydcbmltcG9ydCB7IGV4cG9ydFN0YXRpY0lyIH0gZnJvbSAnLi9zdGF0aWNJci5qcydcblxuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdEJ1ZGdldHMge1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RNYW5pZmVzdE9wdGlvbnMge1xuICByZWFkb25seSBpbmNsdWRlU3RhdGljSXI/OiBib29sZWFuXG4gIHJlYWRvbmx5IGJ1ZGdldHM/OiBNYW5pZmVzdEJ1ZGdldHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdCB7XG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZ1xuICByZWFkb25seSBpZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlcml2ZWQ/OiBib29sZWFuXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdCB7XG4gIHJlYWRvbmx5IG1hbmlmZXN0VmVyc2lvbjogc3RyaW5nXG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgYWN0aW9uS2V5czogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IHNjaGVtYUtleXM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbG9naWNVbml0cz86IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+XG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG4gIHJlYWRvbmx5IG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+XG4gIHJlYWRvbmx5IHN0YXRpY0lyPzogUmV0dXJuVHlwZTx0eXBlb2YgZXhwb3J0U3RhdGljSXI+XG4gIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG59XG5cbmNvbnN0IGlzUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcblxuY29uc3QgaXNNb2R1bGVJbXBsID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+ID0+XG4gIGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5fdGFnID09PSAnTW9kdWxlSW1wbCcgJiYgaXNSZWNvcmQodmFsdWUubW9kdWxlKVxuXG5jb25zdCByZXNvbHZlTW9kdWxlSWQgPSAoaW5wdXQ6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoaXNNb2R1bGVJbXBsKGlucHV0KSkge1xuICAgIGNvbnN0IGlkID0gKGlucHV0Lm1vZHVsZSBhcyBhbnkpLmlkXG4gICAgcmV0dXJuIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCA/IGlkIDogJ3Vua25vd24nXG4gIH1cblxuICBpZiAoaXNSZWNvcmQoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSBpbnB1dC5pZFxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCA+IDApIHJldHVybiBpZFxuICAgIGNvbnN0IHRhZyA9IChpbnB1dCBhcyBhbnkpLnRhZ1xuICAgIGlmICh0YWcgJiYgKHR5cGVvZiB0YWcgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB0YWcgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBjb25zdCB0YWdJZCA9ICh0YWcgYXMgYW55KS5pZFxuICAgICAgaWYgKHR5cGVvZiB0YWdJZCA9PT0gJ3N0cmluZycgJiYgdGFnSWQubGVuZ3RoID4gMCkgcmV0dXJuIHRhZ0lkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICd1bmtub3duJ1xufVxuXG5jb25zdCByZXNvbHZlQWN0aW9uS2V5cyA9IChpbnB1dDogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHRhZyA9IGlzTW9kdWxlSW1wbChpbnB1dCkgPyAoaW5wdXQubW9kdWxlIGFzIGFueSkgOiAoaW5wdXQgYXMgYW55KT8udGFnXG4gIGNvbnN0IGFjdGlvbk1hcCA9IHRhZz8uc2hhcGU/LmFjdGlvbk1hcFxuICBpZiAoIWlzUmVjb3JkKGFjdGlvbk1hcCkpIHJldHVybiBbXVxuICByZXR1cm4gT2JqZWN0LmtleXMoYWN0aW9uTWFwKS5zb3J0KClcbn1cblxuY29uc3QgcmVzb2x2ZVNjaGVtYUtleXMgPSAoaW5wdXQ6IHVua25vd24pOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBzY2hlbWFzID0gKGlucHV0IGFzIGFueSkuc2NoZW1hc1xuICBpZiAoIWlzUmVjb3JkKHNjaGVtYXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWFzKS5zb3J0KClcbn1cblxuY29uc3QgcmVzb2x2ZVNvdXJjZSA9IChpbnB1dDogdW5rbm93bik6IE1vZHVsZU1hbmlmZXN0Wydzb3VyY2UnXSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNSZWNvcmQoaW5wdXQpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IGRldiA9IChpbnB1dCBhcyBhbnkpLmRldlxuICBjb25zdCBzb3VyY2UgPSBkZXY/LnNvdXJjZVxuICBpZiAoIWlzUmVjb3JkKHNvdXJjZSkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgZmlsZSA9IHNvdXJjZS5maWxlXG4gIGNvbnN0IGxpbmUgPSBzb3VyY2UubGluZVxuICBjb25zdCBjb2x1bW4gPSBzb3VyY2UuY29sdW1uXG4gIGlmICh0eXBlb2YgZmlsZSAhPT0gJ3N0cmluZycgfHwgZmlsZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHR5cGVvZiBsaW5lICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAxKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB7IGZpbGUsIGxpbmUsIGNvbHVtbiB9XG59XG5cbmNvbnN0IHJlc29sdmVNZXRhID0gKGlucHV0OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNSZWNvcmQoaW5wdXQpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG1ldGEgPSAoaW5wdXQgYXMgYW55KS5tZXRhXG4gIGlmICghaXNSZWNvcmQobWV0YSkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKS5zb3J0KCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGFba2V5XVxuICAgIGlmIChpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIG91dFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBNT0RVTEVfSU5URVJOQUwgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaW50ZXJuYWwnKVxuXG5jb25zdCByZXNvbHZlTG9naWNVbml0cyA9IChpbnB1dDogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgaW50ZXJuYWwgPSAoaW5wdXQgYXMgYW55KVtNT0RVTEVfSU5URVJOQUxdXG4gIGNvbnN0IG1vdW50ZWQgPSBpbnRlcm5hbD8ubW91bnRlZFxuICBpZiAoIUFycmF5LmlzQXJyYXkobW91bnRlZCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiA9IFtdXG4gIGZvciAoY29uc3QgdW5pdCBvZiBtb3VudGVkKSB7XG4gICAgaWYgKCFpc1JlY29yZCh1bml0KSkgY29udGludWVcbiAgICBjb25zdCBraW5kID0gdW5pdC5raW5kXG4gICAgY29uc3QgaWQgPSB1bml0LmlkXG4gICAgaWYgKHR5cGVvZiBraW5kICE9PSAnc3RyaW5nJyB8fCBraW5kLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICBjb25zdCBkZXJpdmVkID0gdW5pdC5kZXJpdmVkID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5pdC5uYW1lID09PSAnc3RyaW5nJyA/IHVuaXQubmFtZSA6IHVuZGVmaW5lZFxuICAgIG91dC5wdXNoKHsga2luZCwgaWQsIGRlcml2ZWQsIG5hbWUgfSlcbiAgfVxuXG4gIG91dC5zb3J0KChhLCBiKSA9PiAoYS5pZCA8IGIuaWQgPyAtMSA6IGEuaWQgPiBiLmlkID8gMSA6IGEua2luZC5sb2NhbGVDb21wYXJlKGIua2luZCkpKVxuICByZXR1cm4gb3V0Lmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWRcbn1cblxudHlwZSBEaWdlc3RCYXNlID0ge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBzY2hlbWFLZXlzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IGxvZ2ljVW5pdHM/OiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PlxuICByZWFkb25seSBzdGF0aWNJckRpZ2VzdD86IHN0cmluZ1xufVxuXG5jb25zdCBkaWdlc3RPZiA9IChiYXNlOiBEaWdlc3RCYXNlKTogc3RyaW5nID0+IGBtYW5pZmVzdDowMjU6JHtmbnYxYTMyKHN0YWJsZVN0cmluZ2lmeShiYXNlKSl9YFxuXG5jb25zdCB1dGY4Qnl0ZUxlbmd0aCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGpzb24pLmxlbmd0aFxuICB9XG4gIHJldHVybiBqc29uLmxlbmd0aFxufVxuXG5jb25zdCBhcHBseU1heEJ5dGVzID0gKG1hbmlmZXN0OiBNb2R1bGVNYW5pZmVzdCwgbWF4Qnl0ZXM6IG51bWJlcik6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxCeXRlcyA9IHV0ZjhCeXRlTGVuZ3RoKG1hbmlmZXN0KVxuICBpZiAob3JpZ2luYWxCeXRlcyA8PSBtYXhCeXRlcykgcmV0dXJuIG1hbmlmZXN0XG5cbiAgY29uc3QgZHJvcHBlZDogQXJyYXk8c3RyaW5nPiA9IFtdXG4gIGNvbnN0IHRydW5jYXRlZEFycmF5czogQXJyYXk8c3RyaW5nPiA9IFtdXG5cbiAgY29uc3QgYmFzZU1hcmtlciA9ICgpOiBKc29uVmFsdWUgPT4gKHtcbiAgICB0cnVuY2F0ZWQ6IHRydWUsXG4gICAgbWF4Qnl0ZXMsXG4gICAgb3JpZ2luYWxCeXRlcyxcbiAgICBkcm9wcGVkLFxuICAgIHRydW5jYXRlZEFycmF5cyxcbiAgfSlcblxuICBjb25zdCB3aXRoTWFya2VyID0gKG5leHQ6IE1vZHVsZU1hbmlmZXN0KTogTW9kdWxlTWFuaWZlc3QgPT4ge1xuICAgIGNvbnN0IG1ldGE6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7XG4gICAgICBfX2xvZ2l4OiBiYXNlTWFya2VyKCksXG4gICAgfVxuICAgIHJldHVybiB7IC4uLm5leHQsIG1ldGEgfVxuICB9XG5cbiAgbGV0IG5leHQ6IE1vZHVsZU1hbmlmZXN0ID0gd2l0aE1hcmtlcihtYW5pZmVzdClcblxuICBjb25zdCBkcm9wRmllbGQgPSAoZmllbGQ6IGtleW9mIE1vZHVsZU1hbmlmZXN0KTogdm9pZCA9PiB7XG4gICAgaWYgKChuZXh0IGFzIGFueSlbZmllbGRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRyb3BwZWQucHVzaChTdHJpbmcoZmllbGQpKVxuICAgICAgbmV4dCA9IHdpdGhNYXJrZXIoeyAuLi4obmV4dCBhcyBhbnkpLCBbZmllbGRdOiB1bmRlZmluZWQgfSlcbiAgICB9XG4gIH1cblxuICAvLyBEZXRlcm1pbmlzdGljIHRyaW1taW5nIG9yZGVyIChsZWFzdCB2YWx1YWJsZSBmaXJzdCkuXG4gIGRyb3BGaWVsZCgnbWV0YScpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoJ3NvdXJjZScpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoJ3N0YXRpY0lyJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnbG9naWNVbml0cycpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoJ3NjaGVtYUtleXMnKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgLy8gTGFzdCByZXNvcnQ6IHRydW5jYXRlIGFjdGlvbktleXMgKHN0aWxsIGRldGVybWluaXN0aWMsIGJ1dCBzaWduYWxzIHRydW5jYXRpb24pLlxuICB3aGlsZSAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPiBtYXhCeXRlcyAmJiBuZXh0LmFjdGlvbktleXMubGVuZ3RoID4gMSkge1xuICAgIHRydW5jYXRlZEFycmF5cy5wdXNoKCdhY3Rpb25LZXlzJylcbiAgICBuZXh0ID0gd2l0aE1hcmtlcih7XG4gICAgICAuLi5uZXh0LFxuICAgICAgYWN0aW9uS2V5czogbmV4dC5hY3Rpb25LZXlzLnNsaWNlKDAsIE1hdGguY2VpbChuZXh0LmFjdGlvbktleXMubGVuZ3RoIC8gMikpLFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gbmV4dFxufVxuXG5leHBvcnQgY29uc3QgZXh0cmFjdE1hbmlmZXN0ID0gKG1vZHVsZTogdW5rbm93biwgb3B0aW9ucz86IEV4dHJhY3RNYW5pZmVzdE9wdGlvbnMpOiBNb2R1bGVNYW5pZmVzdCA9PiB7XG4gIGNvbnN0IG1hbmlmZXN0VmVyc2lvbiA9ICcwMjUnXG4gIGNvbnN0IG1vZHVsZUlkID0gcmVzb2x2ZU1vZHVsZUlkKG1vZHVsZSlcbiAgY29uc3QgYWN0aW9uS2V5cyA9IHJlc29sdmVBY3Rpb25LZXlzKG1vZHVsZSlcblxuICBjb25zdCBzY2hlbWFLZXlzID0gcmVzb2x2ZVNjaGVtYUtleXMobW9kdWxlKVxuICBjb25zdCBsb2dpY1VuaXRzID0gcmVzb2x2ZUxvZ2ljVW5pdHMobW9kdWxlKVxuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlU291cmNlKG1vZHVsZSlcbiAgY29uc3QgbWV0YSA9IHJlc29sdmVNZXRhKG1vZHVsZSlcblxuICBjb25zdCBzdGF0aWNJciA9IG9wdGlvbnM/LmluY2x1ZGVTdGF0aWNJciA/IGV4cG9ydFN0YXRpY0lyKG1vZHVsZSkgOiB1bmRlZmluZWRcblxuICBjb25zdCBkaWdlc3RCYXNlOiBEaWdlc3RCYXNlID0ge1xuICAgIG1hbmlmZXN0VmVyc2lvbixcbiAgICBtb2R1bGVJZCxcbiAgICBhY3Rpb25LZXlzLFxuICAgIHNjaGVtYUtleXMsXG4gICAgbG9naWNVbml0cyxcbiAgICBzdGF0aWNJckRpZ2VzdDogc3RhdGljSXI/LmRpZ2VzdCxcbiAgfVxuXG4gIGNvbnN0IGRpZ2VzdCA9IGRpZ2VzdE9mKGRpZ2VzdEJhc2UpXG5cbiAgY29uc3QgbWFuaWZlc3Q6IE1vZHVsZU1hbmlmZXN0ID0ge1xuICAgIG1hbmlmZXN0VmVyc2lvbixcbiAgICBtb2R1bGVJZCxcbiAgICBhY3Rpb25LZXlzLFxuICAgIHNjaGVtYUtleXMsXG4gICAgbG9naWNVbml0cyxcbiAgICBzb3VyY2UsXG4gICAgbWV0YSxcbiAgICBzdGF0aWNJcixcbiAgICBkaWdlc3QsXG4gIH1cblxuICBjb25zdCBtYXhCeXRlcyA9IG9wdGlvbnM/LmJ1ZGdldHM/Lm1heEJ5dGVzXG4gIGlmICh0eXBlb2YgbWF4Qnl0ZXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShtYXhCeXRlcykgJiYgbWF4Qnl0ZXMgPiAwKSB7XG4gICAgcmV0dXJuIGFwcGx5TWF4Qnl0ZXMobWFuaWZlc3QsIG1heEJ5dGVzKVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIgfSBmcm9tICcuL2V4cG9ydGVyLmpzJ1xuXG5jb25zdCBBUlRJRkFDVF9FWFBPUlRFUlMgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUudHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVycycpXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9ICh0YWc6IHVua25vd24sIGV4cG9ydGVyOiBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIpOiB2b2lkID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbTG9naXhdIHJlZ2lzdGVyVHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVyOiBpbnZhbGlkIG1vZHVsZSB0YWcnKVxuICB9XG5cbiAgY29uc3QgY3VycmVudCA9ICgodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA/PyBbXSkgYXMgdW5rbm93blxuICBjb25zdCBuZXh0ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IFsuLi5jdXJyZW50LCBleHBvcnRlcl0gOiBbZXhwb3J0ZXJdXG4gIDsodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA9IG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgPSAodGFnOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXI+ID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBjdXJyZW50ID0gKHRhZyBhcyBhbnkpW0FSVElGQUNUX0VYUE9SVEVSU10gYXMgdW5rbm93blxuICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudCkpIHJldHVybiBbXVxuICByZXR1cm4gY3VycmVudC5maWx0ZXIoKHgpOiB4IGlzIFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9PiB4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0Jylcbn1cbiIsICJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBFeGl0LCBGaWJlciwgTGF5ZXIsIE9wdGlvbiB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0ICogYXMgQnVpbGRFbnYgZnJvbSAnLi4vcGxhdGZvcm0vQnVpbGRFbnYuanMnXG5pbXBvcnQgdHlwZSB7IEV2aWRlbmNlUGFja2FnZSwgRXZpZGVuY2VQYWNrYWdlU291cmNlIH0gZnJvbSAnLi9ldmlkZW5jZS5qcydcbmltcG9ydCB7IG1ha2VFdmlkZW5jZUNvbGxlY3RvciwgZXZpZGVuY2VDb2xsZWN0b3JMYXllciB9IGZyb20gJy4vZXZpZGVuY2VDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBtYWtlUnVuU2Vzc2lvbiwgcnVuU2Vzc2lvbkxheWVyLCB0eXBlIFJ1bklkIH0gZnJvbSAnLi9ydW5TZXNzaW9uLmpzJ1xuaW1wb3J0IHtcbiAgYXBwZW5kU2lua3MsXG4gIGRpYWdub3N0aWNzTGV2ZWwsXG4gIHR5cGUgRGlhZ25vc3RpY3NMZXZlbCxcbiAgdHlwZSBTaW5rIGFzIERlYnVnU2luayxcbn0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qcydcbmltcG9ydCB0eXBlIHsgS2VybmVsSW1wbGVtZW50YXRpb25SZWYgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvS2VybmVsUmVmLmpzJ1xuaW1wb3J0ICogYXMgS2VybmVsUmVmIGZyb20gJy4uL3J1bnRpbWUvY29yZS9LZXJuZWxSZWYuanMnXG5pbXBvcnQgKiBhcyBSdW50aW1lS2VybmVsIGZyb20gJy4uL3J1bnRpbWUvY29yZS9SdW50aW1lS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0NvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgbWFrZVByb2dyYW1SdW5uZXJLZXJuZWwgfSBmcm9tICcuLi9ydW50aW1lL1Byb2dyYW1SdW5uZXIua2VybmVsLmpzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hbmlmZXN0LCB0eXBlIE1vZHVsZU1hbmlmZXN0IH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9tYW5pZmVzdC5qcydcbmltcG9ydCB7IGV4cG9ydFN0YXRpY0lyIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9zdGF0aWNJci5qcydcbmltcG9ydCAqIGFzIFJ1bnRpbWUgZnJvbSAnLi4vcnVudGltZS9SdW50aW1lLmpzJ1xuaW1wb3J0IHsgY29sbGVjdFRyaWFsUnVuQXJ0aWZhY3RzIH0gZnJvbSAnLi9hcnRpZmFjdHMvY29sbGVjdC5qcydcbmltcG9ydCB0eXBlIHsgVHJpYWxSdW5BcnRpZmFjdHMgfSBmcm9tICcuL2FydGlmYWN0cy9tb2RlbC5qcydcbmltcG9ydCB7IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgfSBmcm9tICcuL2FydGlmYWN0cy9yZWdpc3RyeS5qcydcblxudHlwZSBSb290TGlrZTxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPiA9IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PiB8IHsgcmVhZG9ubHkgaW1wbDogTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+IH1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1blJlcG9ydEJ1ZGdldHMge1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFsUnVuUmVwb3J0IHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZ1xuICByZWFkb25seSBvazogYm9vbGVhblxuICByZWFkb25seSBtYW5pZmVzdD86IE1vZHVsZU1hbmlmZXN0XG4gIHJlYWRvbmx5IHN0YXRpY0lyPzogUmV0dXJuVHlwZTx0eXBlb2YgZXhwb3J0U3RhdGljSXI+XG4gIHJlYWRvbmx5IGFydGlmYWN0cz86IFRyaWFsUnVuQXJ0aWZhY3RzXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogRW52aXJvbm1lbnRJclxuICByZWFkb25seSBldmlkZW5jZT86IEV2aWRlbmNlUGFja2FnZVxuICByZWFkb25seSBzdW1tYXJ5PzogdW5rbm93blxuICByZWFkb25seSBlcnJvcj86IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SXIge1xuICByZWFkb25seSB0YWdJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBjb25maWdLZXlzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ1NlcnZpY2VzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ0NvbmZpZ0tleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZj86IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZVxuICByZWFkb25seSBub3Rlcz86IHVua25vd25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bk1vZHVsZU9wdGlvbnMge1xuICByZWFkb25seSBydW5JZD86IFJ1bklkXG4gIHJlYWRvbmx5IHNvdXJjZT86IEV2aWRlbmNlUGFja2FnZVNvdXJjZVxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT5cbiAgcmVhZG9ubHkgYnVpbGRFbnY/OiB7XG4gICAgcmVhZG9ubHkgY29uZmlnPzogUmVjb3JkPHN0cmluZywgQnVpbGRFbnYuQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD5cbiAgICByZWFkb25seSBob3N0S2luZD86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1sncnVudGltZUhvc3RLaW5kJ11cbiAgICByZWFkb25seSBjb25maWdQcm92aWRlcj86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1snY29uZmlnUHJvdmlkZXInXVxuICB9XG4gIHJlYWRvbmx5IHRyaWFsUnVuVGltZW91dE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IGNsb3NlU2NvcGVUaW1lb3V0PzogbnVtYmVyXG4gIHJlYWRvbmx5IGJ1ZGdldHM/OiBUcmlhbFJ1blJlcG9ydEJ1ZGdldHNcbn1cblxuY29uc3QgZGVmYXVsdEhvc3QgPSAoKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnYnJvd3NlcidcbiAgcmV0dXJuICdub2RlJ1xufVxuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHJlc29sdmVSb290SW1wbCA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihyb290OiBSb290TGlrZTxTaD4pOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gPT5cbiAgKChyb290IGFzIGFueSk/Ll90YWcgPT09ICdNb2R1bGVJbXBsJ1xuICAgID8gKHJvb3QgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KVxuICAgIDogKChyb290IGFzIGFueSk/LmltcGwgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KSkgc2F0aXNmaWVzIE1vZHVsZUltcGw8YW55LCBTaCwgYW55PlxuXG5jb25zdCB1dGY4Qnl0ZUxlbmd0aCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGpzb24pLmxlbmd0aFxuICB9XG4gIHJldHVybiBqc29uLmxlbmd0aFxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdDb25maWdLZXlzID0gKG1lc3NhZ2U6IHN0cmluZyk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEVmZmVjdCBDb25maWcgZXJyb3IgbWVzc2FnZXMgdmFyeTsga2VlcCBwYXJzaW5nIGNvbnNlcnZhdGl2ZSBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgY29uc3QgcGF0dGVybnM6IFJlYWRvbmx5QXJyYXk8UmVnRXhwPiA9IFtcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBmb3IgKD86a2V5fHBhdGgpIFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBhdCAoW0EtWjAtOV8uLzotXSspXFxiL2csXG4gICAgL1xcYk1pc3NpbmcgY29uZmlndXJhdGlvbjo/IFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiQ29uZmlnXFxiLipcXGJtaXNzaW5nXFxiLipcIj8oW0EtWjAtOV8uLzotXSspXCI/L2dpLFxuICBdXG5cbiAgZm9yIChjb25zdCByZSBvZiBwYXR0ZXJucykge1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAgIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKG1lc3NhZ2UpKSkge1xuICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV1cbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMCkgb3V0LnB1c2goa2V5KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQob3V0KSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdTZXJ2aWNlSWRzID0gKG1lc3NhZ2U6IHN0cmluZyk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXVxuICBjb25zdCByZSA9IC9TZXJ2aWNlIG5vdCBmb3VuZDogKFteXFxzKF0rKS9nXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICB3aGlsZSAoKG1hdGNoID0gcmUuZXhlYyhtZXNzYWdlKSkpIHtcbiAgICBjb25zdCBpZCA9IG1hdGNoWzFdPy5yZXBsYWNlKC9bLDouO10rJC8sICcnKVxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCA+IDApIG91dC5wdXNoKGlkKVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQob3V0KSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdEZXBlbmRlbmN5RnJvbUNhdXNlID0gKFxuICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4pOiB7XG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlczogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IG1pc3NpbmdDb25maWdLZXlzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn0gPT4ge1xuICBjb25zdCBtaXNzaW5nU2VydmljZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgbWlzc2luZ0NvbmZpZ0tleXM6IHN0cmluZ1tdID0gW11cblxuICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLkFycmF5LmZyb20oQ2F1c2UuZmFpbHVyZXMoY2F1c2UpKSwgLi4uQXJyYXkuZnJvbShDYXVzZS5kZWZlY3RzKGNhdXNlKSldXG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChpc1JlY29yZChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUgYXMgYW55KS5fdGFnID09PSAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcicpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdTZXJ2aWNlID0gKGNhbmRpZGF0ZSBhcyBhbnkpLm1pc3NpbmdTZXJ2aWNlXG4gICAgICBpZiAodHlwZW9mIG1pc3NpbmdTZXJ2aWNlID09PSAnc3RyaW5nJyAmJiBtaXNzaW5nU2VydmljZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1pc3NpbmdTZXJ2aWNlcy5wdXNoKG1pc3NpbmdTZXJ2aWNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGlzUmVjb3JkKGNhbmRpZGF0ZSkgJiZcbiAgICAgIChjYW5kaWRhdGUgYXMgYW55KS5fdGFnID09PSAnQ29uZmlnRXJyb3InICYmXG4gICAgICAoY2FuZGlkYXRlIGFzIGFueSkuX29wID09PSAnTWlzc2luZ0RhdGEnICYmXG4gICAgICBBcnJheS5pc0FycmF5KChjYW5kaWRhdGUgYXMgYW55KS5wYXRoKSAmJlxuICAgICAgKGNhbmRpZGF0ZSBhcyBhbnkpLnBhdGguZXZlcnkoKGs6IHVua25vd24pID0+IHR5cGVvZiBrID09PSAnc3RyaW5nJyAmJiBrLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICBjb25zdCBrZXkgPSAoY2FuZGlkYXRlIGFzIGFueSkucGF0aC5qb2luKCcuJylcbiAgICAgIGlmIChrZXkubGVuZ3RoID4gMCkgbWlzc2luZ0NvbmZpZ0tleXMucHVzaChrZXkpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgbWVzc2FnZXMucHVzaChjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZXMucHVzaChjYW5kaWRhdGUpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoaXNSZWNvcmQoY2FuZGlkYXRlKSAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyBhbnkpLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlcy5wdXNoKFN0cmluZygoY2FuZGlkYXRlIGFzIGFueSkubWVzc2FnZSkpXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBtZXNzYWdlcy5wdXNoKENhdXNlLnByZXR0eShjYXVzZSwgeyByZW5kZXJFcnJvckNhdXNlOiB0cnVlIH0pKVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmVcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZCA9IG1lc3NhZ2VzLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKS5qb2luKCdcXG4nKVxuXG4gIGlmIChtZXJnZWQpIHtcbiAgICBtaXNzaW5nU2VydmljZXMucHVzaCguLi5wYXJzZU1pc3NpbmdTZXJ2aWNlSWRzKG1lcmdlZCkpXG4gICAgbWlzc2luZ0NvbmZpZ0tleXMucHVzaCguLi5wYXJzZU1pc3NpbmdDb25maWdLZXlzKG1lcmdlZCkpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1pc3NpbmdTZXJ2aWNlczogQXJyYXkuZnJvbShuZXcgU2V0KG1pc3NpbmdTZXJ2aWNlcykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgbWlzc2luZ0NvbmZpZ0tleXM6IEFycmF5LmZyb20obmV3IFNldChtaXNzaW5nQ29uZmlnS2V5cykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gIH1cbn1cblxuY29uc3QgYnVpbGRFbnZpcm9ubWVudElyID0gKHBhcmFtczoge1xuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZj86IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZVxuICByZWFkb25seSBidWlsZEVudkNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52LkJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+XG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlcz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBtaXNzaW5nQ29uZmlnS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufSk6IEVudmlyb25tZW50SXIgPT4ge1xuICBjb25zdCBwcm92aWRlZENvbmZpZ0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbXMuYnVpbGRFbnZDb25maWcgPz8ge30pXG4gICAgLmZpbHRlcigoaykgPT4gay5sZW5ndGggPiAwICYmIChwYXJhbXMuYnVpbGRFbnZDb25maWcgYXMgYW55KVtrXSAhPT0gdW5kZWZpbmVkKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG5cbiAgY29uc3QgbWlzc2luZ1NlcnZpY2VzID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhcmFtcy5taXNzaW5nU2VydmljZXMgPz8gW10pKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gIGNvbnN0IG1pc3NpbmdDb25maWdLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhcmFtcy5taXNzaW5nQ29uZmlnS2V5cyA/PyBbXSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBjb25zdCBydW50aW1lU2VydmljZUlkcyA9XG4gICAgcGFyYW1zLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPy5iaW5kaW5ncz8ubWFwKChiKSA9PiBiLnNlcnZpY2VJZCkuZmlsdGVyKChzKSA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycpID8/IFtdXG5cbiAgY29uc3QgdGFnSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5ydW50aW1lU2VydmljZUlkcywgLi4ubWlzc2luZ1NlcnZpY2VzXSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBjb25zdCBjb25maWdLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5wcm92aWRlZENvbmZpZ0tleXMsIC4uLm1pc3NpbmdDb25maWdLZXlzXSkpLnNvcnQoKGEsIGIpID0+XG4gICAgYS5sb2NhbGVDb21wYXJlKGIpLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICB0YWdJZHMsXG4gICAgY29uZmlnS2V5cyxcbiAgICBtaXNzaW5nU2VydmljZXMsXG4gICAgbWlzc2luZ0NvbmZpZ0tleXMsXG4gICAga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IHBhcmFtcy5rZXJuZWxJbXBsZW1lbnRhdGlvblJlZixcbiAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZTogcGFyYW1zLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLFxuICB9XG59XG5cbmNvbnN0IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUgPSAoY2F1c2U6IHVua25vd24sIGNvZGU6IHN0cmluZywgaGludD86IHN0cmluZyk6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSA9PiB7XG4gIGNvbnN0IGJhc2UgPSB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeShjYXVzZSkuZXJyb3JTdW1tYXJ5XG4gIHJldHVybiB7XG4gICAgbmFtZTogYmFzZS5uYW1lLFxuICAgIG1lc3NhZ2U6IGJhc2UubWVzc2FnZSxcbiAgICBjb2RlLFxuICAgIGhpbnQ6IGhpbnQgPz8gYmFzZS5oaW50LFxuICB9XG59XG5cbmNvbnN0IG1ha2VUcmlhbFJ1blRpbWVvdXRFcnJvciA9ICgpOiBFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignW0xvZ2l4XSB0cmlhbFJ1bk1vZHVsZSB0aW1lZCBvdXQnKSwge1xuICAgIG5hbWU6ICdUcmlhbFJ1blRpbWVvdXRFcnJvcicsXG4gIH0pXG5cbmNvbnN0IGF3YWl0RmliZXJFeGl0V2l0aFRpbWVvdXQgPSA8QSwgRT4oXG4gIGZpYmVyOiBGaWJlci5GaWJlcjxBLCBFPixcbiAgdGltZW91dE1zOiBudW1iZXIgfCB1bmRlZmluZWQsXG4pOiBFZmZlY3QuRWZmZWN0PEV4aXQuRXhpdDxBLCBFIHwgRXJyb3I+LCBuZXZlciwgbmV2ZXI+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBoYXNUaW1lb3V0ID0gdHlwZW9mIHRpbWVvdXRNcyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRNcykgJiYgdGltZW91dE1zID4gMFxuICAgIGNvbnN0IHN0YXJ0ID0gaGFzVGltZW91dCA/IERhdGUubm93KCkgOiAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgZXhpdE9wdCA9IHlpZWxkKiBGaWJlci5wb2xsKGZpYmVyKVxuICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZXhpdE9wdCkpIHtcbiAgICAgICAgcmV0dXJuIGV4aXRPcHQudmFsdWUgYXMgRXhpdC5FeGl0PEEsIEUgfCBFcnJvcj5cbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1RpbWVvdXQpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZE1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0XG4gICAgICAgIGlmIChlbGFwc2VkTXMgPj0gdGltZW91dE1zKSB7XG4gICAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdEZvcmsoZmliZXIpXG4gICAgICAgICAgcmV0dXJuIEV4aXQuZmFpbChtYWtlVHJpYWxSdW5UaW1lb3V0RXJyb3IoKSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOT1RFOiB0aW1lciB5aWVsZCAobm90IFRlc3RDbG9jay1iYXNlZClcbiAgICAgIHlpZWxkKiBFZmZlY3QucHJvbWlzZSgoKSA9PiBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4gc2V0VGltZW91dChyLCAxKSkpXG4gICAgfVxuICB9KVxuXG5leHBvcnQgY29uc3QgdHJpYWxSdW5Nb2R1bGUgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4oXG4gIHJvb3Q6IFJvb3RMaWtlPFNoPixcbiAgb3B0aW9ucz86IFRyaWFsUnVuTW9kdWxlT3B0aW9ucyxcbik6IEVmZmVjdC5FZmZlY3Q8VHJpYWxSdW5SZXBvcnQsIG5ldmVyLCBuZXZlcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJvb3RJbXBsID0gcmVzb2x2ZVJvb3RJbXBsKHJvb3QpXG5cbiAgICBjb25zdCBzZXNzaW9uID0gbWFrZVJ1blNlc3Npb24oe1xuICAgICAgcnVuSWQ6IG9wdGlvbnM/LnJ1bklkLFxuICAgICAgc291cmNlOiBvcHRpb25zPy5zb3VyY2UgPz8geyBob3N0OiBkZWZhdWx0SG9zdCgpLCBsYWJlbDogJ3RyaWFsLXJ1bi1tb2R1bGUnIH0sXG4gICAgICBzdGFydGVkQXQ6IG9wdGlvbnM/LnN0YXJ0ZWRBdCxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdG9yID0gbWFrZUV2aWRlbmNlQ29sbGVjdG9yKHNlc3Npb24pXG5cbiAgICBjb25zdCBjb252ZXJnZUNvbGxlY3RvcjogQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvciA9IHtcbiAgICAgIHJlZ2lzdGVyOiAoaXIpID0+IHtcbiAgICAgICAgY29sbGVjdG9yLnJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcihpcilcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3Qgc2lua3NMYXllciA9IGFwcGVuZFNpbmtzKFtjb2xsZWN0b3IuZGVidWdTaW5rIGFzIHVua25vd24gYXMgRGVidWdTaW5rXSlcbiAgICBjb25zdCByZXNvbHZlZERpYWdub3N0aWNzTGV2ZWwgPSBvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsID8/ICdsaWdodCdcbiAgICBjb25zdCBkaWFnbm9zdGljc0xheWVyID0gZGlhZ25vc3RpY3NMZXZlbChyZXNvbHZlZERpYWdub3N0aWNzTGV2ZWwpXG4gICAgY29uc3QgY29udmVyZ2VMYXllciA9IGFwcGVuZENvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3JzKFtjb252ZXJnZUNvbGxlY3Rvcl0pXG4gICAgY29uc3QgY29sbGVjdG9yTGF5ZXIgPSBldmlkZW5jZUNvbGxlY3RvckxheWVyKGNvbGxlY3RvcilcbiAgICBjb25zdCBzZXNzaW9uTGF5ZXIgPSBydW5TZXNzaW9uTGF5ZXIoc2Vzc2lvbilcblxuICAgIGNvbnN0IGJ1aWxkRW52Q29uZmlnID0gb3B0aW9ucz8uYnVpbGRFbnY/LmNvbmZpZ1xuICAgIGNvbnN0IGJ1aWxkRW52TGF5ZXIgPSBCdWlsZEVudi5sYXllcih7XG4gICAgICBydW50aW1lSG9zdEtpbmQ6IG9wdGlvbnM/LmJ1aWxkRW52Py5ob3N0S2luZCxcbiAgICAgIGNvbmZpZzogYnVpbGRFbnZDb25maWcsXG4gICAgICBjb25maWdQcm92aWRlcjogb3B0aW9ucz8uYnVpbGRFbnY/LmNvbmZpZ1Byb3ZpZGVyLFxuICAgIH0pXG5cbiAgICBjb25zdCB0cmlhbExheWVyID0gTGF5ZXIubWVyZ2VBbGwoXG4gICAgICBidWlsZEVudkxheWVyLFxuICAgICAgb3B0aW9ucz8ubGF5ZXIgPz8gKExheWVyLmVtcHR5IGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pLFxuICAgICAgc2Vzc2lvbkxheWVyLFxuICAgICAgY29sbGVjdG9yTGF5ZXIsXG4gICAgICBkaWFnbm9zdGljc0xheWVyLFxuICAgICAgc2lua3NMYXllcixcbiAgICAgIGNvbnZlcmdlTGF5ZXIsXG4gICAgKSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuICAgIGNvbnN0IGtlcm5lbCA9IHlpZWxkKiBtYWtlUHJvZ3JhbVJ1bm5lcktlcm5lbChcbiAgICAgIChpbXBsKSA9PlxuICAgICAgICBSdW50aW1lLm1ha2UoaW1wbCwge1xuICAgICAgICAgIGxheWVyOiB0cmlhbExheWVyIGFzIGFueSxcbiAgICAgICAgICAvLyB0cmlhbC1ydW4gXHU5RUQ4XHU4QkE0XHU0RTBEXHU1NDJGXHU3NTI4IGRldnRvb2xzXHVGRjFCZGlhZ25vc3RpY3MgXHU3NTMxIGRpYWdub3N0aWNzTGV2ZWwgXHU2M0E3XHU1MjM2XHUzMDAyXG4gICAgICAgIH0gYXMgYW55KSxcbiAgICAgIHJvb3RJbXBsLFxuICAgIClcblxuICAgIGNvbnN0IGlkZW50aXR5ID0ga2VybmVsLmlkZW50aXR5XG5cbiAgICBjb25zdCBib290RmliZXIgPSBrZXJuZWwucnVudGltZS5ydW5Gb3JrKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpXG4gICAgY29uc3QgYm9vdEV4aXQgPSB5aWVsZCogYXdhaXRGaWJlckV4aXRXaXRoVGltZW91dChib290RmliZXIsIG9wdGlvbnM/LnRyaWFsUnVuVGltZW91dE1zKVxuXG4gICAgbGV0IGtlcm5lbEltcGxlbWVudGF0aW9uUmVmOiBLZXJuZWxJbXBsZW1lbnRhdGlvblJlZiB8IHVuZGVmaW5lZFxuICAgIGxldCBydW50aW1lU2VydmljZXNFdmlkZW5jZTogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZSB8IHVuZGVmaW5lZFxuICAgIGxldCBpbnN0YW5jZUlkOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAgIGlmIChFeGl0LmlzU3VjY2Vzcyhib290RXhpdCkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVJ1bnRpbWUgPSBib290RXhpdC52YWx1ZSBhcyBhbnlcbiAgICAgIGluc3RhbmNlSWQgPVxuICAgICAgICB0eXBlb2YgbW9kdWxlUnVudGltZT8uaW5zdGFuY2VJZCA9PT0gJ3N0cmluZycgJiYgbW9kdWxlUnVudGltZS5pbnN0YW5jZUlkLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IG1vZHVsZVJ1bnRpbWUuaW5zdGFuY2VJZFxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICBrZXJuZWwuc2V0SW5zdGFuY2VJZChpbnN0YW5jZUlkKVxuXG4gICAgICB0cnkge1xuICAgICAgICBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZiA9IEtlcm5lbFJlZi5nZXRLZXJuZWxJbXBsZW1lbnRhdGlvblJlZihtb2R1bGVSdW50aW1lKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZlZERpYWdub3N0aWNzTGV2ZWwgIT09ICdvZmYnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPSBSdW50aW1lS2VybmVsLmdldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlKG1vZHVsZVJ1bnRpbWUpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmFpbHVyZSA9IENhdXNlLmZhaWx1cmVPcHRpb24oYm9vdEV4aXQuY2F1c2UpXG4gICAgICBpZiAoT3B0aW9uLmlzU29tZShmYWlsdXJlKSkge1xuICAgICAgICBjb25zdCBlcnI6IGFueSA9IGZhaWx1cmUudmFsdWVcbiAgICAgICAgY29uc3QgaW5zdGFuY2VJZEZyb21FcnIgPSB0eXBlb2YgZXJyPy5pbnN0YW5jZUlkID09PSAnc3RyaW5nJyA/IGVyci5pbnN0YW5jZUlkIDogdW5kZWZpbmVkXG4gICAgICAgIGlmIChpbnN0YW5jZUlkRnJvbUVyciAmJiBpbnN0YW5jZUlkRnJvbUVyci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAga2VybmVsLnNldEluc3RhbmNlSWQoaW5zdGFuY2VJZEZyb21FcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjbG9zZUV4aXQgPSB5aWVsZCogRWZmZWN0LmV4aXQoXG4gICAgICBrZXJuZWwuY2xvc2Uoe1xuICAgICAgICB0aW1lb3V0TXM6XG4gICAgICAgICAgdHlwZW9mIG9wdGlvbnM/LmNsb3NlU2NvcGVUaW1lb3V0ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShvcHRpb25zLmNsb3NlU2NvcGVUaW1lb3V0KSAmJlxuICAgICAgICAgIG9wdGlvbnMuY2xvc2VTY29wZVRpbWVvdXQgPiAwXG4gICAgICAgICAgICA/IG9wdGlvbnMuY2xvc2VTY29wZVRpbWVvdXRcbiAgICAgICAgICAgIDogMTAwMCxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGNvbnN0IGV2aWRlbmNlID0gY29sbGVjdG9yLmV4cG9ydEV2aWRlbmNlUGFja2FnZSh7XG4gICAgICBtYXhFdmVudHM6IG9wdGlvbnM/Lm1heEV2ZW50cyA/PyAxMDAwLFxuICAgIH0pXG5cbiAgICBjb25zdCBtYW5pZmVzdCA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXh0cmFjdE1hbmlmZXN0KHJvb3QgYXMgYW55LCB7XG4gICAgICAgICAgaW5jbHVkZVN0YXRpY0lyOiB0cnVlLFxuICAgICAgICAgIGJ1ZGdldHM6IHsgbWF4Qnl0ZXM6IDIwMF8wMDAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgY29uc3Qgc3RhdGljSXIgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydFN0YXRpY0lyKHJvb3QgYXMgYW55KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KSgpXG5cbiAgICBsZXQgb2sgPSBFeGl0LmlzU3VjY2Vzcyhib290RXhpdCkgJiYgRXhpdC5pc1N1Y2Nlc3MoY2xvc2VFeGl0KVxuICAgIGxldCBlcnJvcjogU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IHwgdW5kZWZpbmVkXG5cbiAgICBjb25zdCBkZXBzRnJvbUJvb3RGYWlsdXJlID0gRXhpdC5pc0ZhaWx1cmUoYm9vdEV4aXQpXG4gICAgICA/IHBhcnNlTWlzc2luZ0RlcGVuZGVuY3lGcm9tQ2F1c2UoYm9vdEV4aXQuY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4pXG4gICAgICA6IHsgbWlzc2luZ1NlcnZpY2VzOiBbXSwgbWlzc2luZ0NvbmZpZ0tleXM6IFtdIH1cblxuICAgIGNvbnN0IG1pc3NpbmdTZXJ2aWNlcyA9IGRlcHNGcm9tQm9vdEZhaWx1cmUubWlzc2luZ1NlcnZpY2VzXG4gICAgY29uc3QgbWlzc2luZ0NvbmZpZ0tleXMgPSBkZXBzRnJvbUJvb3RGYWlsdXJlLm1pc3NpbmdDb25maWdLZXlzXG5cbiAgICBjb25zdCBjbG9zZUVycm9yID0gRXhpdC5pc0ZhaWx1cmUoY2xvc2VFeGl0KSA/IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5kaWVPcHRpb24oY2xvc2VFeGl0LmNhdXNlKSkgOiB1bmRlZmluZWRcblxuICAgIGlmICghRXhpdC5pc1N1Y2Nlc3MoYm9vdEV4aXQpKSB7XG4gICAgICBjb25zdCBmYWlsdXJlID0gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmZhaWx1cmVPcHRpb24oYm9vdEV4aXQuY2F1c2UpKVxuICAgICAgY29uc3QgZGVmZWN0ID0gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmRpZU9wdGlvbihib290RXhpdC5jYXVzZSkpXG4gICAgICBjb25zdCBiYXNlID0gZmFpbHVyZSA/PyBkZWZlY3QgPz8gYm9vdEV4aXQuY2F1c2VcblxuICAgICAgaWYgKG1pc3NpbmdTZXJ2aWNlcy5sZW5ndGggPiAwIHx8IG1pc3NpbmdDb25maWdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb2sgPSBmYWxzZVxuICAgICAgICBlcnJvciA9IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoXG4gICAgICAgICAgYmFzZSxcbiAgICAgICAgICAnTWlzc2luZ0RlcGVuZGVuY3knLFxuICAgICAgICAgIG1pc3NpbmdTZXJ2aWNlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/ICdCdWlsZC10aW1lIG1pc3Npbmcgc2VydmljZTogcHJvdmlkZSBhIExheWVyIG1vY2svaW1wbGVtZW50YXRpb24gdmlhIG9wdGlvbnMubGF5ZXIsIG9yIG1vdmUgdGhlIGRlcGVuZGVuY3kgYWNjZXNzIHRvIHJ1bnRpbWUuJ1xuICAgICAgICAgICAgOiAnQnVpbGQtdGltZSBtaXNzaW5nIGNvbmZpZzogcHJvdmlkZSB0aGUgbWlzc2luZyBrZXkocykgaW4gYnVpbGRFbnYuY29uZmlnLCBvciBhZGQgYSBkZWZhdWx0IHZhbHVlIHRvIENvbmZpZy4nLFxuICAgICAgICApXG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpc1JlY29yZChiYXNlKSAmJlxuICAgICAgICAoKGJhc2UgYXMgYW55KS5uYW1lID09PSAnVHJpYWxSdW5UaW1lb3V0RXJyb3InIHx8IChiYXNlIGFzIGFueSkuX3RhZyA9PT0gJ1RyaWFsUnVuVGltZW91dCcpXG4gICAgICApIHtcbiAgICAgICAgb2sgPSBmYWxzZVxuICAgICAgICBlcnJvciA9IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoXG4gICAgICAgICAgYmFzZSxcbiAgICAgICAgICAnVHJpYWxSdW5UaW1lb3V0JyxcbiAgICAgICAgICAnVHJpYWwgcnVuIHRpbWVkIG91dDogY2hlY2sgZm9yIExheWVyL2Fzc2VtYmx5IHBoYXNlIGJsb2NraW5nIChFZmZlY3QubmV2ZXIgLyB1bmZpbmlzaGVkIGFjcXVpcmUpLicsXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKGJhc2UsICdSdW50aW1lRmFpbHVyZScpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEV4aXQuaXNGYWlsdXJlKGNsb3NlRXhpdCkpIHtcbiAgICAgIGNvbnN0IGRpZWQgPSBPcHRpb24uZ2V0T3JVbmRlZmluZWQoQ2F1c2UuZGllT3B0aW9uKGNsb3NlRXhpdC5jYXVzZSkpXG4gICAgICBjb25zdCBmYWlsdXJlID0gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmZhaWx1cmVPcHRpb24oY2xvc2VFeGl0LmNhdXNlKSlcbiAgICAgIGNvbnN0IGJhc2UgPSBkaWVkID8/IGZhaWx1cmUgPz8gY2xvc2VFeGl0LmNhdXNlXG5cbiAgICAgIGNvbnN0IHRhZyA9IGlzUmVjb3JkKGJhc2UpID8gKGJhc2UgYXMgYW55KS5fdGFnIDogdW5kZWZpbmVkXG4gICAgICBpZiAodGFnID09PSAnRGlzcG9zZVRpbWVvdXQnKSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKFxuICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgJ0Rpc3Bvc2VUaW1lb3V0JyxcbiAgICAgICAgICAnRGlzcG9zZSB0aW1lZCBvdXQ6IGNoZWNrIGZvciB1bmNsb3NlZCByZXNvdXJjZSBoYW5kbGVzLCBmaWJlcnMgbm90IGludGVycnVwdGVkLCBvciBldmVudCBsaXN0ZW5lcnMgbm90IHVucmVnaXN0ZXJlZC4nLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvayA9IGZhbHNlXG4gICAgICAgIGVycm9yID0gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShiYXNlLCAnUnVudGltZUZhaWx1cmUnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gYnVpbGRFbnZpcm9ubWVudElyKHtcbiAgICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmLFxuICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UsXG4gICAgICBidWlsZEVudkNvbmZpZyxcbiAgICAgIG1pc3NpbmdTZXJ2aWNlcyxcbiAgICAgIG1pc3NpbmdDb25maWdLZXlzLFxuICAgIH0pXG5cbiAgICBjb25zdCBtb2R1bGVJZCA9XG4gICAgICB0eXBlb2YgKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpPy5pZCA9PT0gJ3N0cmluZycgJiYgKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpLmlkLmxlbmd0aCA+IDBcbiAgICAgICAgPyBTdHJpbmcoKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpLmlkKVxuICAgICAgICA6IChtYW5pZmVzdD8ubW9kdWxlSWQgPz8gJ3Vua25vd24nKVxuXG4gICAgY29uc3QgYXJ0aWZhY3RzID0gY29sbGVjdFRyaWFsUnVuQXJ0aWZhY3RzKHtcbiAgICAgIGV4cG9ydGVyczogZ2V0VHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVycyhyb290SW1wbC5tb2R1bGUgYXMgYW55KSxcbiAgICAgIGN0eDoge1xuICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgIHN0YXRpY0lyOiBzdGF0aWNJciBhcyBhbnksXG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgbGV0IHJlcG9ydDogVHJpYWxSdW5SZXBvcnQgPSB7XG4gICAgICBydW5JZDogc2Vzc2lvbi5ydW5JZCxcbiAgICAgIG9rLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBzdGF0aWNJcjogc3RhdGljSXIgYXMgYW55LFxuICAgICAgYXJ0aWZhY3RzLFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBldmlkZW5jZSxcbiAgICAgIGVycm9yLFxuICAgIH1cblxuICAgIGNvbnN0IG1heEJ5dGVzID0gb3B0aW9ucz8uYnVkZ2V0cz8ubWF4Qnl0ZXNcbiAgICBpZiAodHlwZW9mIG1heEJ5dGVzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUobWF4Qnl0ZXMpICYmIG1heEJ5dGVzID4gMCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxCeXRlcyA9IHV0ZjhCeXRlTGVuZ3RoKHJlcG9ydClcbiAgICAgIGlmIChvcmlnaW5hbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgcmVwb3J0ID0ge1xuICAgICAgICAgIHJ1bklkOiBzZXNzaW9uLnJ1bklkLFxuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgbWVzc2FnZTogYFtMb2dpeF0gVHJpYWxSdW5SZXBvcnQgZXhjZWVkZWQgbWF4Qnl0ZXMgKCR7b3JpZ2luYWxCeXRlc30gPiAke21heEJ5dGVzfSlgLFxuICAgICAgICAgICAgY29kZTogJ092ZXJzaXplZCcsXG4gICAgICAgICAgICBoaW50OiAnUmVkdWNlIG1heEV2ZW50cyBvciBidWRnZXRzLm1heEJ5dGVzLCBvciBzcGxpdCBtYW5pZmVzdC9ldmlkZW5jZSBhcnRpZmFjdHMgaW4gQ0kuJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIF9fbG9naXg6IHtcbiAgICAgICAgICAgICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgICAgICAgICAgICBtYXhCeXRlcyxcbiAgICAgICAgICAgICAgb3JpZ2luYWxCeXRlcyxcbiAgICAgICAgICAgICAgZHJvcHBlZDogWydtYW5pZmVzdCcsICdzdGF0aWNJcicsICdhcnRpZmFjdHMnLCAnZXZpZGVuY2UnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXBvcnRcbiAgfSlcbiIsICJpbXBvcnQgeyBDb25maWdQcm92aWRlciwgRWZmZWN0LCBMYXllciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCAqIGFzIENvbnN0cnVjdGlvbkd1YXJkIGZyb20gJy4vQ29uc3RydWN0aW9uR3VhcmQuanMnXG5pbXBvcnQge1xuICBSdW50aW1lSG9zdCxcbiAgdHlwZSBSdW50aW1lSG9zdEtpbmQsXG4gIHR5cGUgUnVudGltZUhvc3RTZXJ2aWNlLFxuICBkZWZhdWx0TGF5ZXIgYXMgZGVmYXVsdFJ1bnRpbWVIb3N0TGF5ZXIsXG4gIG1ha2UgYXMgbWFrZVJ1bnRpbWVIb3N0LFxuICBsYXllciBhcyBydW50aW1lSG9zdExheWVyLFxufSBmcm9tICcuL1J1bnRpbWVIb3N0LmpzJ1xuXG5leHBvcnQgdHlwZSBCdWlsZEVudkNvbmZpZ1ZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRW52T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHJ1bnRpbWVIb3N0PzogUnVudGltZUhvc3RTZXJ2aWNlXG4gIHJlYWRvbmx5IHJ1bnRpbWVIb3N0S2luZD86IFJ1bnRpbWVIb3N0S2luZFxuICAvKipcbiAgICogXHU2MjQxXHU1RTczIGtleS92YWx1ZSBcdTkxNERcdTdGNkVcdUZGMUFcdTc1MjhcdTRFOEUgTW9jayBGZWF0dXJlIEZsYWdzIC8gRW52IFZhcmlhYmxlc1x1RkYwOFx1NTAzQ1x1NEYxQVx1ODhBQlx1OEY2Q1x1NjIxMCBzdHJpbmdcdUZGMDlcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+XG4gIC8qKlxuICAgKiBcdTlBRDhcdTdFQTdcdTc1MjhcdTZDRDVcdUZGMUFcdTc2RjRcdTYzQTVcdTZDRThcdTUxNjUgQ29uZmlnUHJvdmlkZXJcdUZGMDhcdTRGMThcdTUxNDhcdTdFQTdcdTlBRDhcdTRFOEUgY29uZmlnXHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBjb25maWdQcm92aWRlcj86IENvbmZpZ1Byb3ZpZGVyLkNvbmZpZ1Byb3ZpZGVyXG59XG5cbmNvbnN0IHRvQ29uZmlnUHJvdmlkZXJGcm9tUmVjb3JkID0gKFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuKTogQ29uZmlnUHJvdmlkZXIuQ29uZmlnUHJvdmlkZXIgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCA/PyB7fSkpIHtcbiAgICBpZiAoIWspIGNvbnRpbnVlXG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICBtYXAuc2V0KGssIFN0cmluZyh2KSlcbiAgfVxuICByZXR1cm4gQ29uZmlnUHJvdmlkZXIuZnJvbU1hcChtYXApXG59XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChvcHRpb25zOiBCdWlsZEVudk9wdGlvbnMgPSB7fSk6IExheWVyLkxheWVyPFJ1bnRpbWVIb3N0LCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgY29uc3QgcnVudGltZUhvc3QgPSBvcHRpb25zLnJ1bnRpbWVIb3N0XG4gICAgPyBydW50aW1lSG9zdExheWVyKG9wdGlvbnMucnVudGltZUhvc3QpXG4gICAgOiBvcHRpb25zLnJ1bnRpbWVIb3N0S2luZFxuICAgICAgPyBydW50aW1lSG9zdExheWVyKG1ha2VSdW50aW1lSG9zdChvcHRpb25zLnJ1bnRpbWVIb3N0S2luZCkpXG4gICAgICA6IGRlZmF1bHRSdW50aW1lSG9zdExheWVyXG5cbiAgY29uc3QgY29uZmlnUHJvdmlkZXIgPSBvcHRpb25zLmNvbmZpZ1Byb3ZpZGVyID8gb3B0aW9ucy5jb25maWdQcm92aWRlciA6IHRvQ29uZmlnUHJvdmlkZXJGcm9tUmVjb3JkKG9wdGlvbnMuY29uZmlnKVxuXG4gIGNvbnN0IGNvbmZpZyA9IExheWVyLnNldENvbmZpZ1Byb3ZpZGVyKGNvbmZpZ1Byb3ZpZGVyKVxuXG4gIHJldHVybiBMYXllci5tZXJnZUFsbChydW50aW1lSG9zdCwgY29uZmlnKSBhcyBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPlxufVxuXG5leHBvcnQgY29uc3QgcnVuID0gPEEsIEU+KFxuICBidWlsZGVyOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFJ1bnRpbWVIb3N0PixcbiAgb3B0aW9uczogQnVpbGRFbnZPcHRpb25zID0ge30sXG4pOiBFZmZlY3QuRWZmZWN0PEEsIEUgfCBDb25zdHJ1Y3Rpb25HdWFyZC5Db25zdHJ1Y3Rpb25HdWFyZEVycm9yLCBuZXZlcj4gPT5cbiAgYnVpbGRlci5waXBlKEVmZmVjdC5wcm92aWRlKGxheWVyKG9wdGlvbnMpKSwgQ29uc3RydWN0aW9uR3VhcmQuZ3VhcmRCdWlsZFRpbWUpXG4iLCAiaW1wb3J0IHsgQ2F1c2UsIEVmZmVjdCB9IGZyb20gJ2VmZmVjdCdcblxuZXhwb3J0IGludGVyZmFjZSBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnOiAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcidcbiAgcmVhZG9ubHkga2luZDogJ21pc3Npbmdfc2VydmljZScgfCAndW5rbm93bl9kZWZlY3QnXG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VDb25zdHJ1Y3Rpb25HdWFyZEVycm9yID0gKG9wdGlvbnM6IHtcbiAgcmVhZG9ubHkga2luZDogQ29uc3RydWN0aW9uR3VhcmRFcnJvclsna2luZCddXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xuICByZWFkb25seSBtaXNzaW5nU2VydmljZT86IHN0cmluZ1xuICByZWFkb25seSBoaW50Pzogc3RyaW5nXG59KTogQ29uc3RydWN0aW9uR3VhcmRFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UpLCB7XG4gICAgX3RhZzogJ0NvbnN0cnVjdGlvbkd1YXJkRXJyb3InLFxuICAgIGtpbmQ6IG9wdGlvbnMua2luZCxcbiAgICBtaXNzaW5nU2VydmljZTogb3B0aW9ucy5taXNzaW5nU2VydmljZSxcbiAgICBoaW50OiBvcHRpb25zLmhpbnQsXG4gIH0pIGFzIENvbnN0cnVjdGlvbkd1YXJkRXJyb3JcblxuY29uc3QgZXh0cmFjdE1pc3NpbmdTZXJ2aWNlID0gKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbLi4uQXJyYXkuZnJvbShDYXVzZS5kZWZlY3RzKGNhdXNlKSksIC4uLkFycmF5LmZyb20oQ2F1c2UuZmFpbHVyZXMoY2F1c2UpKV1cblxuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvciA/IGNhbmRpZGF0ZS5tZXNzYWdlIDogdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ3N0cmluZycgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWRcblxuICAgIGlmICghbWVzc2FnZSkgY29udGludWVcblxuICAgIGNvbnN0IG1hdGNoID0gL1NlcnZpY2Ugbm90IGZvdW5kOiAoW15cXHMoXSspLy5leGVjKG1lc3NhZ2UpXG4gICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBtYXRjaFsxXVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIGd1YXJkQnVpbGRUaW1lXHVGRjFBXG4gKiAtIFx1NTcyOCBCdWlsZCBFbnYvUmVmbGVjdGlvbiBcdTk2MzZcdTZCQjVcdTYzNTVcdTgzQjcgXHUyMDFDXHU3RjNBXHU1OTMxIFNlcnZpY2VcdTIwMUQgXHU3Njg0XHU3RjNBXHU5Njc3XHU1RTc2XHU4RjZDXHU2MzYyXHU0RTNBXHU1M0VGXHU4ODRDXHU1MkE4XHU3Njg0XHU5NTE5XHU4QkVGXHVGRjFCXG4gKiAtIFx1NTE3Nlx1NEVENlx1NTkzMVx1OEQyNS9cdTdGM0FcdTk2NzdcdTRGRERcdTYzMDFcdTUzOUZcdTY4MzdcdUZGMDhcdTRFMERcdTU0MUVcdTYzODlcdTRFMUFcdTUyQTFcdTk1MTlcdThCRUZcdThCRURcdTRFNDlcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGd1YXJkQnVpbGRUaW1lID0gPEEsIEUsIFI+KFxuICBzZWxmOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+LFxuKTogRWZmZWN0LkVmZmVjdDxBLCBFIHwgQ29uc3RydWN0aW9uR3VhcmRFcnJvciwgUj4gPT5cbiAgc2VsZi5waXBlKFxuICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSk6IEVmZmVjdC5FZmZlY3Q8bmV2ZXIsIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgfCBFLCBuZXZlcj4gPT4ge1xuICAgICAgY29uc3QgbWlzc2luZyA9IGV4dHJhY3RNaXNzaW5nU2VydmljZShjYXVzZSlcbiAgICAgIGlmIChtaXNzaW5nKSB7XG4gICAgICAgIHJldHVybiBFZmZlY3QuZmFpbChcbiAgICAgICAgICBtYWtlQ29uc3RydWN0aW9uR3VhcmRFcnJvcih7XG4gICAgICAgICAgICBraW5kOiAnbWlzc2luZ19zZXJ2aWNlJyxcbiAgICAgICAgICAgIG1pc3NpbmdTZXJ2aWNlOiBtaXNzaW5nLFxuICAgICAgICAgICAgbWVzc2FnZTogYFtDb25zdHJ1Y3Rpb25HdWFyZEVycm9yXSBCdWlsZC10aW1lIGRlcGVuZGVuY3kgdmlvbGF0aW9uOiBzZXJ2aWNlIFwiJHttaXNzaW5nfVwiIGlzIG5vdCBhdmFpbGFibGUgaW4gQnVpbGQgRW52LmAsXG4gICAgICAgICAgICBoaW50OlxuICAgICAgICAgICAgICAnQnVpbGQtdGltZSAoUmVmbGVjdGlvbikgY2FuIG9ubHkgZGVwZW5kIG9uIGEgc21hbGwgc2V0IG9mIG1vY2thYmxlIHByaW1pdGl2ZXMgKGUuZy4gQ29uZmlnL1J1bnRpbWVIb3N0KS4gJyArXG4gICAgICAgICAgICAgICdNb3ZlIGJ1c2luZXNzIHNlcnZpY2UgYWNjZXNzIHRvIHJ1bnRpbWUgKGUuZy4gVHJhaXQgaGFuZGxlciAvIExvZ2ljIHJ1biBzZWN0aW9uKSBvciBpc29sYXRlIGl0IHZpYSBleHBsaWNpdCBpbmplY3Rpb24uJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIEVmZmVjdC5mYWlsQ2F1c2UoY2F1c2UpIGFzIEVmZmVjdC5FZmZlY3Q8bmV2ZXIsIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgfCBFPlxuICAgIH0pLFxuICApXG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgTGF5ZXIgfSBmcm9tICdlZmZlY3QnXG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVIb3N0S2luZCA9ICdub2RlJyB8ICdicm93c2VyJyB8ICd1bmtub3duJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVIb3N0U2VydmljZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFJ1bnRpbWVIb3N0S2luZFxuICByZWFkb25seSBpc05vZGU6IGJvb2xlYW5cbiAgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuXG59XG5cbmNvbnN0IGRldGVjdEtpbmQgPSAoKTogUnVudGltZUhvc3RLaW5kID0+IHtcbiAgY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG4gIGlmIChpc0Jyb3dzZXIpIHJldHVybiAnYnJvd3NlcidcblxuICBjb25zdCBpc05vZGUgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIChwcm9jZXNzIGFzIGFueSk/LnZlcnNpb25zPy5ub2RlID09PSAnc3RyaW5nJ1xuXG4gIGlmIChpc05vZGUpIHJldHVybiAnbm9kZSdcblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmV4cG9ydCBjb25zdCBtYWtlID0gKGtpbmQ6IFJ1bnRpbWVIb3N0S2luZCk6IFJ1bnRpbWVIb3N0U2VydmljZSA9PiAoe1xuICBraW5kLFxuICBpc05vZGU6IGtpbmQgPT09ICdub2RlJyxcbiAgaXNCcm93c2VyOiBraW5kID09PSAnYnJvd3NlcicsXG59KVxuXG5leHBvcnQgY2xhc3MgUnVudGltZUhvc3QgZXh0ZW5kcyBDb250ZXh0LlRhZygnQGxvZ2l4L1J1bnRpbWVIb3N0Jyk8UnVudGltZUhvc3QsIFJ1bnRpbWVIb3N0U2VydmljZT4oKSB7fVxuXG5leHBvcnQgY29uc3QgbGF5ZXIgPSAoc2VydmljZTogUnVudGltZUhvc3RTZXJ2aWNlKTogTGF5ZXIuTGF5ZXI8UnVudGltZUhvc3QsIG5ldmVyLCBuZXZlcj4gPT5cbiAgTGF5ZXIuc3VjY2VlZChSdW50aW1lSG9zdCwgc2VydmljZSlcblxuZXhwb3J0IGNvbnN0IG1vY2sgPSAoa2luZDogUnVudGltZUhvc3RLaW5kKTogTGF5ZXIuTGF5ZXI8UnVudGltZUhvc3QsIG5ldmVyLCBuZXZlcj4gPT4gbGF5ZXIobWFrZShraW5kKSlcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRMYXllcjogTGF5ZXIuTGF5ZXI8UnVudGltZUhvc3QsIG5ldmVyLCBuZXZlcj4gPSBsYXllcihtYWtlKGRldGVjdEtpbmQoKSkpXG4iLCAiaW1wb3J0IHsgRWZmZWN0LCBMYXllciwgTWFuYWdlZFJ1bnRpbWUgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgdHlwZSB7IEFueU1vZHVsZVNoYXBlLCBNb2R1bGVJbXBsIH0gZnJvbSAnLi9jb3JlL21vZHVsZS5qcydcbmltcG9ydCAqIGFzIEFwcFJ1bnRpbWVJbXBsIGZyb20gJy4vQXBwUnVudGltZS5qcydcblxuLyoqXG4gKiBSdW50aW1lIFx1OTE0RFx1N0Y2RVx1RkYxQVxuICogLSBsYXllclx1RkYxQVx1OTg5RFx1NTkxNlx1NzY4NFx1OTg3Nlx1NUM0MiBFbnZcdUZGMDhcdTU5ODIgQ29uZmlnIC8gXHU1RTczXHU1M0YwXHU2NzBEXHU1MkExXHVGRjA5XHVGRjBDXHU0RjFBXHU0RTBFIFJvb3QgTW9kdWxlSW1wbC5sYXllciBcdTU0MDhcdTVFNzZcdUZGMUJcbiAqIC0gb25FcnJvclx1RkYxQUFwcCBcdTdFQTdcdTk1MTlcdThCRUZcdTU5MDRcdTc0MDZcdTUxNjVcdTUzRTNcdUZGMENcdTc1MjhcdTRFOEVcdTU3MjggUnVudGltZSBcdTdFQTdcdTdFREZcdTRFMDBcdTRFMEFcdTYyQTVcdTY3MkFcdTYzNTVcdTgzQjdcdTk1MTlcdThCRUZcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+XG4gIHJlYWRvbmx5IG9uRXJyb3I/OiAoY2F1c2U6IGltcG9ydCgnZWZmZWN0JykuQ2F1c2UuQ2F1c2U8dW5rbm93bj4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cbn1cblxuLyoqXG4gKiBSdW50aW1lLm1ha2VcbiAqXG4gKiBcdTU3MjhcdTdFRDlcdTVCOUEgUm9vdCBNb2R1bGVJbXBsIFx1NzY4NFx1NTI0RFx1NjNEMFx1NEUwQlx1RkYwQ1x1Njc4NFx1OTAyMFx1NEUwMFx1OTg5N1x1NUU5NFx1NzUyOFx1N0VBNyBSdW50aW1lXHVGRjFBXG4gKlxuICogLSBcdTRGN0ZcdTc1MjggUm9vdEltcGwubW9kdWxlICsgUm9vdEltcGwubGF5ZXIgXHU0RjVDXHU0RTNBXHU1NTJGXHU0RTAwXHU3Njg0XHU1MTY4XHU1QzQwXHU2QTIxXHU1NzU3XHVGRjFCXG4gKiAtIFx1NUMwNiBSb290SW1wbC5wcm9jZXNzZXMgXHU0RjVDXHU0RTNBXHU5NTdGXHU2NzFGXHU4RkRCXHU3QTBCXHU1NzI4IFJ1bnRpbWUgU2NvcGUgXHU1MTg1XHU3RURGXHU0RTAwIGZvcmtcdUZGMUJcbiAqIC0gXHU1OTBEXHU3NTI4XHU3M0IwXHU2NzA5IEFwcFJ1bnRpbWUgXHU1QjlFXHU3M0IwXHU0RjVDXHU0RTNBXHU1RTk1XHU1QzQyXHU1QkI5XHU1NjY4XHVGRjBDXHU1QkY5XHU1OTE2XHU0RUM1XHU2NkI0XHU5NzMyIE1hbmFnZWRSdW50aW1lXHUzMDAyXG4gKlxuICogXHU4QkY0XHU2NjBFXHVGRjFBXG4gKiAtIFx1N0M3Qlx1NTc4Qlx1NUM0Mlx1OTc2Mlx1NEY3Rlx1NzUyOFx1NUJCRFx1NkNEQlx1NzY4NCBhbnkvbmV2ZXJcdUZGMENcdTRFRTVcdTkwN0ZcdTUxNERcdTU3MjhcdTZCNjRcdTU5MDRcdTVGMTVcdTUxNjVcdTU5MERcdTY3NDJcdTc2ODQgRW52IFx1NjNBOFx1NUJGQ1x1RkYxQlxuICogLSBcdTRFMUFcdTUyQTFcdTRFRTNcdTc4MDFcdTUzRUFcdTk3MDBcdTg5ODFcdTRGRERcdThCQzEgUm9vdEltcGwubGF5ZXIgXHU0RTBFIG9wdGlvbnMubGF5ZXIgXHU0RTAwXHU4RDc3XHU4MEZEXHU2Nzg0XHU5MDIwXHU1QjhDXHU2NTc0IEVudlx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgbWFrZSA9IChcbiAgcm9vdEltcGw6IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PixcbiAgb3B0aW9ucz86IFJ1bnRpbWVPcHRpb25zLFxuKTogTWFuYWdlZFJ1bnRpbWUuTWFuYWdlZFJ1bnRpbWU8YW55LCBuZXZlcj4gPT4ge1xuICBjb25zdCBhcHBDb25maWc6IEFwcFJ1bnRpbWVJbXBsLkxvZ2l4QXBwQ29uZmlnPGFueT4gPSB7XG4gICAgbGF5ZXI6IChvcHRpb25zPy5sYXllciA/PyBMYXllci5lbXB0eSkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+LFxuICAgIG1vZHVsZXM6IFtBcHBSdW50aW1lSW1wbC5wcm92aWRlKHJvb3RJbXBsLm1vZHVsZSwgcm9vdEltcGwubGF5ZXIgYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pXSxcbiAgICBwcm9jZXNzZXM6IHJvb3RJbXBsLnByb2Nlc3NlcyA/PyBbXSxcbiAgICBvbkVycm9yOiBvcHRpb25zPy5vbkVycm9yLFxuICB9XG5cbiAgY29uc3QgYXBwID0gQXBwUnVudGltZUltcGwubWFrZUFwcChhcHBDb25maWcpXG4gIHJldHVybiBhcHAubWFrZVJ1bnRpbWUoKSBhcyBNYW5hZ2VkUnVudGltZS5NYW5hZ2VkUnVudGltZTxhbnksIG5ldmVyPlxufVxuIiwgImltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAnLi4vanNvblZhbHVlLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi8uLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuXG5leHBvcnQgdHlwZSBBcnRpZmFjdEtleSA9IHN0cmluZ1xuXG5leHBvcnQgY29uc3QgYXJ0aWZhY3RLZXlTY2hlbWFQYXR0ZXJuID0gJ15AW15cXFxccy9dK1xcXFwvW15cXFxcc0BdK0B2XFxcXGQrJCcgYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IGlzQXJ0aWZhY3RLZXkgPSAoaW5wdXQ6IHVua25vd24pOiBpbnB1dCBpcyBBcnRpZmFjdEtleSA9PlxuICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIC9eQFteXFxzL10rXFwvW15cXHNAXStAdlxcZCskLy50ZXN0KGlucHV0KVxuXG50eXBlIEVudmVsb3BlQmFzZSA9IHtcbiAgcmVhZG9ubHkgYXJ0aWZhY3RLZXk6IEFydGlmYWN0S2V5XG4gIHJlYWRvbmx5IHRydW5jYXRlZD86IGJvb2xlYW5cbiAgcmVhZG9ubHkgYnVkZ2V0Qnl0ZXM/OiBudW1iZXJcbiAgcmVhZG9ubHkgYWN0dWFsQnl0ZXM/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlnZXN0Pzogc3RyaW5nXG4gIHJlYWRvbmx5IG5vdGVzPzogSnNvblZhbHVlXG59XG5cbmV4cG9ydCB0eXBlIEFydGlmYWN0RW52ZWxvcGUgPVxuICB8IChFbnZlbG9wZUJhc2UgJiB7XG4gICAgICByZWFkb25seSBvazogdHJ1ZVxuICAgICAgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgZXJyb3I/OiBuZXZlclxuICAgIH0pXG4gIHwgKEVudmVsb3BlQmFzZSAmIHtcbiAgICAgIHJlYWRvbmx5IG9rOiBmYWxzZVxuICAgICAgcmVhZG9ubHkgZXJyb3I6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICAgICAgcmVhZG9ubHkgdmFsdWU/OiBuZXZlclxuICAgIH0pXG5cbmV4cG9ydCB0eXBlIFRyaWFsUnVuQXJ0aWZhY3RzID0gUmVhZG9ubHk8UmVjb3JkPEFydGlmYWN0S2V5LCBBcnRpZmFjdEVudmVsb3BlPj5cbiIsICJpbXBvcnQgeyBmbnYxYTMyLCBzdGFibGVTdHJpbmdpZnkgfSBmcm9tICcuLi8uLi9kaWdlc3QuanMnXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJy4uL2pzb25WYWx1ZS5qcydcblxuZXhwb3J0IGludGVyZmFjZSBKc29uVmFsdWVEaWdlc3Qge1xuICByZWFkb25seSBzdGFibGVKc29uOiBzdHJpbmdcbiAgcmVhZG9ubHkgYnl0ZXM6IG51bWJlclxuICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xufVxuXG5jb25zdCB1dGY4Qnl0ZUxlbmd0aFN0cmluZyA9ICh0ZXh0OiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIFRleHRFbmNvZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIHRleHQubGVuZ3RoXG59XG5cbmV4cG9ydCBjb25zdCBkaWdlc3RKc29uVmFsdWUgPSAodmFsdWU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZURpZ2VzdCA9PiB7XG4gIGNvbnN0IHN0YWJsZUpzb24gPSBzdGFibGVTdHJpbmdpZnkodmFsdWUpXG4gIGNvbnN0IGJ5dGVzID0gdXRmOEJ5dGVMZW5ndGhTdHJpbmcoc3RhYmxlSnNvbilcbiAgcmV0dXJuIHtcbiAgICBzdGFibGVKc29uLFxuICAgIGJ5dGVzLFxuICAgIGRpZ2VzdDogYGFydGlmYWN0OjAzMToke2ZudjFhMzIoc3RhYmxlSnNvbil9YCxcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vcnVudGltZS9jb3JlL2Vycm9yU3VtbWFyeS5qcydcbmltcG9ydCB7IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vcnVudGltZS9jb3JlL2Vycm9yU3VtbWFyeS5qcydcbmltcG9ydCB7IGlzSnNvblZhbHVlLCB0eXBlIEpzb25WYWx1ZSB9IGZyb20gJy4uL2pzb25WYWx1ZS5qcydcbmltcG9ydCB0eXBlIHsgQXJ0aWZhY3RFbnZlbG9wZSwgQXJ0aWZhY3RLZXksIFRyaWFsUnVuQXJ0aWZhY3RzIH0gZnJvbSAnLi9tb2RlbC5qcydcbmltcG9ydCB7IGlzQXJ0aWZhY3RLZXkgfSBmcm9tICcuL21vZGVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIsIFRyaWFsUnVuQXJ0aWZhY3RJbnNwZWN0aW9uQ29udGV4dCB9IGZyb20gJy4vZXhwb3J0ZXIuanMnXG5pbXBvcnQgeyBkaWdlc3RKc29uVmFsdWUgfSBmcm9tICcuL2RpZ2VzdC5qcydcblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bkFydGlmYWN0c0J1ZGdldHMge1xuICAvKipcbiAgICogUGVyLWFydGlmYWN0IG1heGltdW0gc2VyaWFsaXplZCBieXRlcyAoVVRGLTgpLlxuICAgKiBEZWZhdWx0OiA1MEtCLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHNPcHRpb25zIHtcbiAgcmVhZG9ubHkgZXhwb3J0ZXJzOiBSZWFkb25seUFycmF5PFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcj5cbiAgcmVhZG9ubHkgY3R4OiBUcmlhbFJ1bkFydGlmYWN0SW5zcGVjdGlvbkNvbnRleHRcbiAgcmVhZG9ubHkgYnVkZ2V0cz86IFRyaWFsUnVuQXJ0aWZhY3RzQnVkZ2V0c1xufVxuXG5jb25zdCB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlID0gKGNhdXNlOiB1bmtub3duLCBjb2RlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpOiBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgPT4ge1xuICBjb25zdCBiYXNlID0gdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkoY2F1c2UpLmVycm9yU3VtbWFyeVxuICByZXR1cm4ge1xuICAgIG5hbWU6IGJhc2UubmFtZSxcbiAgICBtZXNzYWdlOiBiYXNlLm1lc3NhZ2UsXG4gICAgY29kZSxcbiAgICBoaW50OiBoaW50ID8/IGJhc2UuaGludCxcbiAgfVxufVxuXG5jb25zdCBkZWZhdWx0QXJ0aWZhY3RCdWRnZXRCeXRlcyA9IDUwICogMTAyNFxuXG5jb25zdCBidWRnZXRPZiA9IChidWRnZXRzOiBUcmlhbFJ1bkFydGlmYWN0c0J1ZGdldHMgfCB1bmRlZmluZWQpOiBudW1iZXIgPT5cbiAgdHlwZW9mIGJ1ZGdldHM/Lm1heEJ5dGVzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYnVkZ2V0cy5tYXhCeXRlcykgJiYgYnVkZ2V0cy5tYXhCeXRlcyA+IDBcbiAgICA/IGJ1ZGdldHMubWF4Qnl0ZXNcbiAgICA6IGRlZmF1bHRBcnRpZmFjdEJ1ZGdldEJ5dGVzXG5cbnR5cGUgQ29sbGVjdGVkID0ge1xuICByZWFkb25seSBhcnRpZmFjdEtleTogQXJ0aWZhY3RLZXlcbiAgcmVhZG9ubHkgZW52ZWxvcGU6IEFydGlmYWN0RW52ZWxvcGVcbn1cblxuY29uc3QgbWFrZUNvbmZsaWN0RW52ZWxvcGUgPSAoYXJ0aWZhY3RLZXk6IEFydGlmYWN0S2V5LCBleHBvcnRlcklkczogUmVhZG9ubHlBcnJheTxzdHJpbmc+KTogQ29sbGVjdGVkID0+IHtcbiAgY29uc3QgaWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KGV4cG9ydGVySWRzLm1hcCgocykgPT4gU3RyaW5nKHMpKS5maWx0ZXIoKHMpID0+IHMubGVuZ3RoID4gMCkpKS5zb3J0KChhLCBiKSA9PlxuICAgIGEubG9jYWxlQ29tcGFyZShiKSxcbiAgKVxuICByZXR1cm4ge1xuICAgIGFydGlmYWN0S2V5LFxuICAgIGVudmVsb3BlOiB7XG4gICAgICBhcnRpZmFjdEtleSxcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIG5hbWU6ICdBcnRpZmFjdEtleUNvbmZsaWN0RXJyb3InLFxuICAgICAgICBtZXNzYWdlOiBgW0xvZ2l4XSBUcmlhbFJ1biBhcnRpZmFjdCBrZXkgY29uZmxpY3Q6ICR7YXJ0aWZhY3RLZXl9YCxcbiAgICAgICAgY29kZTogJ0FydGlmYWN0S2V5Q29uZmxpY3QnLFxuICAgICAgICBoaW50OiBpZHMubGVuZ3RoID4gMCA/IGBjb25mbGljdGluZ0V4cG9ydGVycz0ke2lkcy5qb2luKCcsJyl9YCA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCB0cnVuY2F0ZUpzb25WYWx1ZSA9IChcbiAgdmFsdWU6IEpzb25WYWx1ZSxcbiAgbWF4Qnl0ZXM6IG51bWJlcixcbik6IHsgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZTsgcmVhZG9ubHkgYWN0dWFsQnl0ZXM6IG51bWJlcjsgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGFuYWx5emVkID0gZGlnZXN0SnNvblZhbHVlKHZhbHVlKVxuICBjb25zdCBqc29uID0gYW5hbHl6ZWQuc3RhYmxlSnNvblxuICBjb25zdCBieXRlcyA9IGFuYWx5emVkLmJ5dGVzXG4gIGlmIChieXRlcyA8PSBtYXhCeXRlcykge1xuICAgIHJldHVybiB7IHZhbHVlLCBhY3R1YWxCeXRlczogYnl0ZXMsIGRpZ2VzdDogYW5hbHl6ZWQuZGlnZXN0IH1cbiAgfVxuXG4gIGNvbnN0IHByZXZpZXdDaGFycyA9IE1hdGgubWluKGpzb24ubGVuZ3RoLCBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTYsIG1heEJ5dGVzKSkpXG4gIGNvbnN0IHByZXZpZXcgPSBqc29uLnNsaWNlKDAsIHByZXZpZXdDaGFycylcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZToge1xuICAgICAgX3RhZzogJ292ZXJzaXplZCcsXG4gICAgICBieXRlcyxcbiAgICAgIHByZXZpZXcsXG4gICAgfSxcbiAgICBhY3R1YWxCeXRlczogYnl0ZXMsXG4gICAgZGlnZXN0OiBhbmFseXplZC5kaWdlc3QsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbGxlY3RUcmlhbFJ1bkFydGlmYWN0cyA9IChvcHRpb25zOiBDb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHNPcHRpb25zKTogVHJpYWxSdW5BcnRpZmFjdHMgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBleHBvcnRlcnNTb3J0ZWQgPSBBcnJheS5mcm9tKG9wdGlvbnMuZXhwb3J0ZXJzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qga2EgPSBTdHJpbmcoYT8uYXJ0aWZhY3RLZXkgPz8gJycpXG4gICAgY29uc3Qga2IgPSBTdHJpbmcoYj8uYXJ0aWZhY3RLZXkgPz8gJycpXG4gICAgaWYgKGthIDwga2IpIHJldHVybiAtMVxuICAgIGlmIChrYSA+IGtiKSByZXR1cm4gMVxuICAgIGNvbnN0IGlhID0gU3RyaW5nKGE/LmV4cG9ydGVySWQgPz8gJycpXG4gICAgY29uc3QgaWIgPSBTdHJpbmcoYj8uZXhwb3J0ZXJJZCA/PyAnJylcbiAgICByZXR1cm4gaWEubG9jYWxlQ29tcGFyZShpYilcbiAgfSlcblxuICBjb25zdCBjb25mbGljdHMgPSBuZXcgTWFwPEFydGlmYWN0S2V5LCBBcnJheTxzdHJpbmc+PigpXG4gIGZvciAoY29uc3QgZXggb2YgZXhwb3J0ZXJzU29ydGVkKSB7XG4gICAgY29uc3Qga2V5ID0gZXg/LmFydGlmYWN0S2V5XG4gICAgY29uc3QgaWQgPSBTdHJpbmcoZXg/LmV4cG9ydGVySWQgPz8gJycpXG4gICAgaWYgKCFpc0FydGlmYWN0S2V5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSBjb25mbGljdHMuZ2V0KGtleSlcbiAgICBpZiAoY3VycmVudCkgY3VycmVudC5wdXNoKGlkKVxuICAgIGVsc2UgY29uZmxpY3RzLnNldChrZXksIFtpZF0pXG4gIH1cblxuICBjb25zdCBjb25mbGljdEtleXMgPSBuZXcgU2V0PEFydGlmYWN0S2V5PigpXG4gIGZvciAoY29uc3QgW2ssIGlkc10gb2YgY29uZmxpY3RzKSB7XG4gICAgY29uc3QgdW5pcXVlID0gQXJyYXkuZnJvbShuZXcgU2V0KGlkcykpXG4gICAgaWYgKHVuaXF1ZS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25mbGljdEtleXMuYWRkKGspXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF4Qnl0ZXMgPSBidWRnZXRPZihvcHRpb25zLmJ1ZGdldHMpXG4gIGNvbnN0IGNvbGxlY3RlZDogQXJyYXk8Q29sbGVjdGVkPiA9IFtdXG5cbiAgZm9yIChjb25zdCBleHBvcnRlciBvZiBleHBvcnRlcnNTb3J0ZWQpIHtcbiAgICBjb25zdCBhcnRpZmFjdEtleSA9IGV4cG9ydGVyPy5hcnRpZmFjdEtleVxuICAgIGlmICghaXNBcnRpZmFjdEtleShhcnRpZmFjdEtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChjb25mbGljdEtleXMuaGFzKGFydGlmYWN0S2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBleHBvcnRlci5leHBvcnQob3B0aW9ucy5jdHgpXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGlmICghaXNKc29uVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIGNvbGxlY3RlZC5wdXNoKHtcbiAgICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgICBlbnZlbG9wZToge1xuICAgICAgICAgICAgYXJ0aWZhY3RLZXksXG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICAgICAgbmV3IEVycm9yKGBbTG9naXhdIEFydGlmYWN0IGV4cG9ydGVyIHJldHVybmVkIG5vbi1Kc29uVmFsdWU6ICR7ZXhwb3J0ZXIuZXhwb3J0ZXJJZH1gKSxcbiAgICAgICAgICAgICAgJ0FydGlmYWN0Tm9uU2VyaWFsaXphYmxlJyxcbiAgICAgICAgICAgICAgYGFydGlmYWN0S2V5PSR7YXJ0aWZhY3RLZXl9IGV4cG9ydGVySWQ9JHtleHBvcnRlci5leHBvcnRlcklkfWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRydW5jYXRlZCA9IHRydW5jYXRlSnNvblZhbHVlKHZhbHVlLCBtYXhCeXRlcylcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBBcnRpZmFjdEVudmVsb3BlID0ge1xuICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIHZhbHVlOiB0cnVuY2F0ZWQudmFsdWUsXG4gICAgICAgIGRpZ2VzdDogdHJ1bmNhdGVkLmRpZ2VzdCxcbiAgICAgICAgLi4uKHRydW5jYXRlZC5hY3R1YWxCeXRlcyA+IG1heEJ5dGVzXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgYnVkZ2V0Qnl0ZXM6IG1heEJ5dGVzLFxuICAgICAgICAgICAgICBhY3R1YWxCeXRlczogdHJ1bmNhdGVkLmFjdHVhbEJ5dGVzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBidWRnZXRCeXRlczogbWF4Qnl0ZXMsXG4gICAgICAgICAgICAgIGFjdHVhbEJ5dGVzOiB0cnVuY2F0ZWQuYWN0dWFsQnl0ZXMsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH1cblxuICAgICAgY29sbGVjdGVkLnB1c2goeyBhcnRpZmFjdEtleSwgZW52ZWxvcGUgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb2xsZWN0ZWQucHVzaCh7XG4gICAgICAgIGFydGlmYWN0S2V5LFxuICAgICAgICBlbnZlbG9wZToge1xuICAgICAgICAgIGFydGlmYWN0S2V5LFxuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAnQXJ0aWZhY3RFeHBvcnRGYWlsZWQnLFxuICAgICAgICAgICAgYGFydGlmYWN0S2V5PSR7YXJ0aWZhY3RLZXl9IGV4cG9ydGVySWQ9JHtleHBvcnRlci5leHBvcnRlcklkfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBjb25mbGljdEtleSBvZiBBcnJheS5mcm9tKGNvbmZsaWN0S2V5cykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSkge1xuICAgIGNvbGxlY3RlZC5wdXNoKG1ha2VDb25mbGljdEVudmVsb3BlKGNvbmZsaWN0S2V5LCBjb25mbGljdHMuZ2V0KGNvbmZsaWN0S2V5KSA/PyBbXSkpXG4gIH1cblxuICBpZiAoY29sbGVjdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbGxlY3RlZC5zb3J0KChhLCBiKSA9PiBhLmFydGlmYWN0S2V5LmxvY2FsZUNvbXBhcmUoYi5hcnRpZmFjdEtleSkpXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhjb2xsZWN0ZWQubWFwKChjKSA9PiBbYy5hcnRpZmFjdEtleSwgYy5lbnZlbG9wZV0pKSBzYXRpc2ZpZXMgVHJpYWxSdW5BcnRpZmFjdHNcbn1cbiIsICJpbXBvcnQgeyBFZmZlY3QsIEV4aXQsIExheWVyLCBTY29wZSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgRXZpZGVuY2VQYWNrYWdlLCBFdmlkZW5jZVBhY2thZ2VTb3VyY2UgfSBmcm9tICcuL2V2aWRlbmNlLmpzJ1xuaW1wb3J0IHsgbWFrZUV2aWRlbmNlQ29sbGVjdG9yLCBldmlkZW5jZUNvbGxlY3RvckxheWVyIH0gZnJvbSAnLi9ldmlkZW5jZUNvbGxlY3Rvci5qcydcbmltcG9ydCB7IG1ha2VSdW5TZXNzaW9uLCBydW5TZXNzaW9uTGF5ZXIsIHR5cGUgUnVuU2Vzc2lvbiwgdHlwZSBSdW5JZCB9IGZyb20gJy4vcnVuU2Vzc2lvbi5qcydcbmltcG9ydCB7XG4gIGFwcGVuZFNpbmtzLFxuICBkaWFnbm9zdGljc0xldmVsLFxuICB0eXBlIERpYWdub3N0aWNzTGV2ZWwsXG4gIHR5cGUgU2luayBhcyBEZWJ1Z1NpbmssXG59IGZyb20gJy4uL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5pbXBvcnQgKiBhcyBSdW50aW1lS2VybmVsIGZyb20gJy4uL3J1bnRpbWUvY29yZS9SdW50aW1lS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0NvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi90cmlhbFJ1bk1vZHVsZS5qcydcblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bk9wdGlvbnMge1xuICByZWFkb25seSBydW5JZD86IFJ1bklkXG4gIHJlYWRvbmx5IHNvdXJjZT86IEV2aWRlbmNlUGFja2FnZVNvdXJjZVxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT5cbiAgcmVhZG9ubHkgcnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXM/OiBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFsUnVuUmVzdWx0PEEsIEU+IHtcbiAgcmVhZG9ubHkgc2Vzc2lvbjogUnVuU2Vzc2lvblxuICByZWFkb25seSBleGl0OiBFeGl0LkV4aXQ8QSwgRT5cbiAgcmVhZG9ubHkgZXZpZGVuY2U6IEV2aWRlbmNlUGFja2FnZVxufVxuXG5jb25zdCBkZWZhdWx0SG9zdCA9ICgpOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuICdicm93c2VyJ1xuICByZXR1cm4gJ25vZGUnXG59XG5cbmV4cG9ydCBjb25zdCB0cmlhbFJ1biA9IDxBLCBFLCBSPihcbiAgcHJvZ3JhbTogRWZmZWN0LkVmZmVjdDxBLCBFLCBSPixcbiAgb3B0aW9ucz86IFRyaWFsUnVuT3B0aW9ucyxcbik6IEVmZmVjdC5FZmZlY3Q8VHJpYWxSdW5SZXN1bHQ8QSwgRT4sIG5ldmVyLCBSPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IG1ha2VSdW5TZXNzaW9uKHtcbiAgICAgIHJ1bklkOiBvcHRpb25zPy5ydW5JZCxcbiAgICAgIHNvdXJjZTogb3B0aW9ucz8uc291cmNlID8/IHsgaG9zdDogZGVmYXVsdEhvc3QoKSwgbGFiZWw6ICd0cmlhbC1ydW4nIH0sXG4gICAgICBzdGFydGVkQXQ6IG9wdGlvbnM/LnN0YXJ0ZWRBdCxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdG9yID0gbWFrZUV2aWRlbmNlQ29sbGVjdG9yKHNlc3Npb24pXG5cbiAgICBjb25zdCBjb252ZXJnZUNvbGxlY3RvcjogQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvciA9IHtcbiAgICAgIHJlZ2lzdGVyOiAoaXIpID0+IHtcbiAgICAgICAgY29sbGVjdG9yLnJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcihpcilcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3Qgc2lua3NMYXllciA9IGFwcGVuZFNpbmtzKFtjb2xsZWN0b3IuZGVidWdTaW5rIGFzIHVua25vd24gYXMgRGVidWdTaW5rXSlcbiAgICBjb25zdCBkaWFnbm9zdGljc0xheWVyID0gZGlhZ25vc3RpY3NMZXZlbChvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsID8/ICdsaWdodCcpXG4gICAgY29uc3QgY29udmVyZ2VMYXllciA9IGFwcGVuZENvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3JzKFtjb252ZXJnZUNvbGxlY3Rvcl0pXG4gICAgY29uc3QgY29sbGVjdG9yTGF5ZXIgPSBldmlkZW5jZUNvbGxlY3RvckxheWVyKGNvbGxlY3RvcilcbiAgICBjb25zdCBzZXNzaW9uTGF5ZXIgPSBydW5TZXNzaW9uTGF5ZXIoc2Vzc2lvbilcblxuICAgIGNvbnN0IG92ZXJyaWRlc0xheWVyID1cbiAgICAgIG9wdGlvbnM/LnJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzICE9IG51bGxcbiAgICAgICAgPyAoTGF5ZXIuc3VjY2VlZChcbiAgICAgICAgICAgIFJ1bnRpbWVLZXJuZWwuUnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXNUYWcsXG4gICAgICAgICAgICBvcHRpb25zLnJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzLFxuICAgICAgICAgICkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+KVxuICAgICAgICA6IChMYXllci5lbXB0eSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4pXG5cbiAgICBjb25zdCB0cmlhbExheWVyID0gTGF5ZXIubWVyZ2VBbGwoXG4gICAgICBvcHRpb25zPy5sYXllciA/PyAoTGF5ZXIuZW1wdHkgYXMgdW5rbm93biBhcyBMYXllci5MYXllcjxhbnksIGFueSwgYW55PiksXG4gICAgICBzZXNzaW9uTGF5ZXIsXG4gICAgICBjb2xsZWN0b3JMYXllcixcbiAgICAgIG92ZXJyaWRlc0xheWVyLFxuICAgICAgZGlhZ25vc3RpY3NMYXllcixcbiAgICAgIHNpbmtzTGF5ZXIsXG4gICAgICBjb252ZXJnZUxheWVyLFxuICAgICkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgYW55PlxuXG4gICAgY29uc3Qgc2NvcGUgPSB5aWVsZCogU2NvcGUubWFrZSgpXG5cbiAgICBjb25zdCBleGl0ID0geWllbGQqIEVmZmVjdC5leGl0KHByb2dyYW0pLnBpcGUoRWZmZWN0LnByb3ZpZGVTZXJ2aWNlKFNjb3BlLlNjb3BlLCBzY29wZSksIEVmZmVjdC5wcm92aWRlKHRyaWFsTGF5ZXIpKVxuXG4gICAgeWllbGQqIFNjb3BlLmNsb3NlKHNjb3BlLCBleGl0KVxuXG4gICAgY29uc3QgZXZpZGVuY2UgPSBjb2xsZWN0b3IuZXhwb3J0RXZpZGVuY2VQYWNrYWdlKHtcbiAgICAgIG1heEV2ZW50czogb3B0aW9ucz8ubWF4RXZlbnRzLFxuICAgIH0pXG5cbiAgICByZXR1cm4geyBzZXNzaW9uLCBleGl0LCBldmlkZW5jZSB9IHNhdGlzZmllcyBUcmlhbFJ1blJlc3VsdDxBLCBFPlxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLElBQU0sV0FBVyxDQUFDLFVBQ2hCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU0sZUFBZSxDQUFDLFVBQ3BCLFNBQVMsS0FBSyxLQUFLLE1BQU0sU0FBUyxnQkFBZ0IsU0FBUyxNQUFNLE1BQU07QUFFekUsSUFBTSxrQkFBa0IsQ0FBQyxVQUEyQjtBQUNsRCxNQUFJLGFBQWEsS0FBSyxHQUFHO0FBQ3ZCLFVBQU0sS0FBTSxNQUFNLE9BQWU7QUFDakMsV0FBTyxPQUFPLE9BQU8sWUFBWSxHQUFHLFNBQVMsSUFBSSxLQUFLO0FBQUEsRUFDeEQ7QUFFQSxNQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ25CLFVBQU0sS0FBSyxNQUFNO0FBQ2pCLFFBQUksT0FBTyxPQUFPLFlBQVksR0FBRyxTQUFTLEVBQUcsUUFBTztBQUNwRCxVQUFNLE1BQU8sTUFBYztBQUMzQixRQUFJLFFBQVEsT0FBTyxRQUFRLFlBQVksT0FBTyxRQUFRLGFBQWE7QUFDakUsWUFBTSxRQUFTLElBQVk7QUFDM0IsVUFBSSxPQUFPLFVBQVUsWUFBWSxNQUFNLFNBQVMsRUFBRyxRQUFPO0FBQUEs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QUU1QyxRQUFNLGlCQUNKLFNBQVMsb0NBQW9DLE9BQ3hDRSxPQUFNO0FBQUEsSUFDUztBQUFBLElBQ2QsUUFBUTtBQUFBLEVBQ1YsSUFDQ0EsT0FBTTtBQUViLFFBQU0sYUFBYUEsT0FBTTtBQUFBLElBQ3ZCLFNBQVMsU0FBVUEsT0FBTTtBQUFBLElBQ3pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxRQUFRLE9BQU8sTUFBTSxLQUFLO0FBRWhDLFFBQU0sT0FBTyxPQUFPRCxRQUFPLEtBQUssT0FBTyxFQUFFLEtBQUtBLFFBQU8sZUFBZSxNQUFNLE9BQU8sS0FBSyxHQUFHQSxRQUFPLFFBQVEsVUFBVSxDQUFDO0FBRW5ILFNBQU8sTUFBTSxNQUFNLE9BQU8sSUFBSTtBQUU5QixRQUFNLFdBQVcsVUFBVSxzQkFBc0I7QUFBQSxJQUMvQyxXQUFXLFNBQVM7QUFBQSxFQUN0QixDQUFDO0FBRUQsU0FBTyxFQUFFLFNBQVMsTUFBTSxTQUFTO0FBQ25DLENBQUM7IiwKICAibmFtZXMiOiBbImV4cG9ydFN0YXRpY0lyIiwgImlzUmVjb3JkIiwgImlzTW9kdWxlSW1wbCIsICJyZXNvbHZlTW9kdWxlSWQiLCAibmV4dCIsICJleHBvcnRTdGF0aWNJciIsICJDYXVzZSIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiRWZmZWN0IiwgIkxheWVyIiwgImxheWVyIiwgIkxheWVyIiwgIkxheWVyIiwgIm1ha2UiLCAiTGF5ZXIiLCAiaXNSZWNvcmQiLCAidXRmOEJ5dGVMZW5ndGgiLCAiQ2F1c2UiLCAidG9FcnJvclN1bW1hcnlXaXRoQ29kZSIsICJFZmZlY3QiLCAibGF5ZXIiLCAiTGF5ZXIiLCAibWFrZSIsICJleHBvcnRTdGF0aWNJciIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiZGVmYXVsdEhvc3QiLCAiRWZmZWN0IiwgIkxheWVyIl0KfQo=