@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
@@ -1,995 +0,0 @@
1
- // @logixjs/core subpath bundles for @logixjs/sandbox
2
-
3
- import {
4
- makeApp,
5
- makeProgramRunnerKernel,
6
- provide
7
- } from "./chunk-EJDFUZ4B.js";
8
- import {
9
- evidenceCollectorLayer,
10
- makeEvidenceCollector
11
- } from "./chunk-4LRLOTMA.js";
12
- import {
13
- RuntimeServicesInstanceOverridesTag,
14
- getKernelImplementationRef,
15
- getRuntimeServicesEvidence
16
- } from "./chunk-HNEDTEGQ.js";
17
- import {
18
- isActionToken
19
- } from "./chunk-DOBF6YTQ.js";
20
- import {
21
- exportStaticIr
22
- } from "./chunk-ON2LY6HJ.js";
23
- import {
24
- appendConvergeStaticIrCollectors
25
- } from "./chunk-2LZ43SWS.js";
26
- import {
27
- getModuleTraitsProgram
28
- } from "./chunk-UCFEP3BH.js";
29
- import {
30
- appendSinks,
31
- diagnosticsLevel,
32
- toSerializableErrorSummary
33
- } from "./chunk-UKYAF3NL.js";
34
- import {
35
- fnv1a32,
36
- stableStringify
37
- } from "./chunk-S46P7MC6.js";
38
- import {
39
- makeRunSession,
40
- runSessionLayer
41
- } from "./chunk-3LX3KIQQ.js";
42
- import {
43
- isJsonValue
44
- } from "./chunk-TOQ6SJ6O.js";
45
-
46
- // ../logix-core/src/internal/reflection/staticIr.ts
47
- var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
48
- var isModuleImpl = (value) => isRecord(value) && value._tag === "ModuleImpl" && isRecord(value.module);
49
- var resolveModuleId = (input) => {
50
- if (isModuleImpl(input)) {
51
- const id = input.module.id;
52
- return typeof id === "string" && id.length > 0 ? id : "unknown";
53
- }
54
- if (isRecord(input)) {
55
- const id = input.id;
56
- if (typeof id === "string" && id.length > 0) return id;
57
- const tag = input.tag;
58
- if (tag && (typeof tag === "object" || typeof tag === "function")) {
59
- const tagId = tag.id;
60
- if (typeof tagId === "string" && tagId.length > 0) return tagId;
61
- }
62
- }
63
- return "unknown";
64
- };
65
- var resolveModuleTag = (input) => {
66
- if (isModuleImpl(input)) return input.module;
67
- if (isRecord(input) && input.tag) return input.tag;
68
- return void 0;
69
- };
70
- var exportStaticIr2 = (module) => {
71
- const tag = resolveModuleTag(module);
72
- if (!tag) return void 0;
73
- const program = getModuleTraitsProgram(tag);
74
- if (!program) return void 0;
75
- return exportStaticIr({
76
- program,
77
- moduleId: resolveModuleId(module)
78
- });
79
- };
80
-
81
- // ../logix-core/src/internal/reflection/manifest.ts
82
- import { Schema } from "../effect.js";
83
- var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
84
- var isModuleImpl2 = (value) => isRecord2(value) && value._tag === "ModuleImpl" && isRecord2(value.module);
85
- var resolveModuleId2 = (input) => {
86
- if (isModuleImpl2(input)) {
87
- const id = input.module.id;
88
- return typeof id === "string" && id.length > 0 ? id : "unknown";
89
- }
90
- if (isRecord2(input)) {
91
- const id = input.id;
92
- if (typeof id === "string" && id.length > 0) return id;
93
- const tag = input.tag;
94
- if (tag && (typeof tag === "object" || typeof tag === "function")) {
95
- const tagId = tag.id;
96
- if (typeof tagId === "string" && tagId.length > 0) return tagId;
97
- }
98
- }
99
- return "unknown";
100
- };
101
- var resolveActionKeys = (input) => {
102
- const tag = isModuleImpl2(input) ? input.module : input?.tag;
103
- const actionMap = tag?.shape?.actionMap;
104
- if (!isRecord2(actionMap)) return [];
105
- return Object.keys(actionMap).sort();
106
- };
107
- var resolveDevSource = (input) => {
108
- if (!isRecord2(input)) return void 0;
109
- const file = input.file;
110
- const line = input.line;
111
- const column = input.column;
112
- if (typeof file !== "string" || file.length === 0) return void 0;
113
- if (typeof line !== "number" || !Number.isInteger(line) || line < 1) return void 0;
114
- if (typeof column !== "number" || !Number.isInteger(column) || column < 1) return void 0;
115
- return { file, line, column };
116
- };
117
- var resolveTokenSource = (token) => {
118
- if (!token || typeof token !== "object" && typeof token !== "function") return void 0;
119
- return resolveDevSource(token.source);
120
- };
121
- var resolveActions = (input) => {
122
- const tag = isModuleImpl2(input) ? input.module : input?.tag;
123
- const actionMap = tag?.shape?.actionMap;
124
- if (!isRecord2(actionMap)) return [];
125
- const moduleSource = resolveSource(input);
126
- const reducers = isRecord2(tag?.reducers) ? tag.reducers : void 0;
127
- const actionTags = Object.keys(actionMap).sort();
128
- const out = [];
129
- for (const actionTag of actionTags) {
130
- const token = actionMap[actionTag];
131
- const source = resolveTokenSource(token) ?? moduleSource;
132
- const payloadKind = isActionToken(token) && Schema.isSchema(token.schema) ? token.schema === Schema.Void ? "void" : "nonVoid" : "unknown";
133
- const primaryReducer = reducers && typeof reducers[actionTag] === "function" ? { kind: "declared" } : void 0;
134
- out.push({
135
- actionTag,
136
- payload: { kind: payloadKind },
137
- ...primaryReducer ? { primaryReducer } : {},
138
- ...source ? { source } : {}
139
- });
140
- }
141
- return out;
142
- };
143
- var MODULE_DECLARED_EFFECTS = /* @__PURE__ */ Symbol.for("logix.module.effects.declared");
144
- var resolveEffects = (input) => {
145
- const tag = isModuleImpl2(input) ? input.module : input?.tag;
146
- const actionMap = tag?.shape?.actionMap;
147
- if (!isRecord2(actionMap)) return void 0;
148
- const effectsRaw = tag?.[MODULE_DECLARED_EFFECTS];
149
- if (!isRecord2(effectsRaw)) return void 0;
150
- const source = resolveSource(input);
151
- const logicUnitId = "__logix_internal:effects:declared";
152
- const handlerIds = /* @__PURE__ */ new WeakMap();
153
- let nextHandlerSeq = 0;
154
- const out = [];
155
- for (const actionTag of Object.keys(effectsRaw).sort()) {
156
- if (!(actionTag in actionMap)) continue;
157
- const handlers = effectsRaw[actionTag];
158
- if (!Array.isArray(handlers)) continue;
159
- for (const handler of handlers) {
160
- if (typeof handler !== "function") continue;
161
- let handlerId = handlerIds.get(handler);
162
- if (!handlerId) {
163
- nextHandlerSeq += 1;
164
- handlerId = `h${nextHandlerSeq}`;
165
- handlerIds.set(handler, handlerId);
166
- }
167
- const sourceKey = `${logicUnitId}::${handlerId}`;
168
- out.push({
169
- actionTag,
170
- sourceKey,
171
- kind: "declared",
172
- ...source ? { source } : {}
173
- });
174
- }
175
- }
176
- const seen = /* @__PURE__ */ new Set();
177
- const deduped = [];
178
- for (const item of out) {
179
- const key = `${item.actionTag}\0${item.sourceKey}`;
180
- if (seen.has(key)) continue;
181
- seen.add(key);
182
- deduped.push(item);
183
- }
184
- deduped.sort(
185
- (a, b) => a.actionTag < b.actionTag ? -1 : a.actionTag > b.actionTag ? 1 : a.sourceKey.localeCompare(b.sourceKey)
186
- );
187
- return deduped.length > 0 ? deduped : void 0;
188
- };
189
- var resolveSchemaKeys = (input) => {
190
- if (!isRecord2(input)) return void 0;
191
- const schemas = input.schemas;
192
- if (!isRecord2(schemas)) return void 0;
193
- return Object.keys(schemas).sort();
194
- };
195
- var resolveSource = (input) => {
196
- if (!isRecord2(input)) return void 0;
197
- const dev = input.dev;
198
- return resolveDevSource(dev?.source);
199
- };
200
- var resolveMeta = (input) => {
201
- if (!isRecord2(input)) return void 0;
202
- const meta = input.meta;
203
- if (!isRecord2(meta)) return void 0;
204
- const out = {};
205
- for (const key of Object.keys(meta).sort()) {
206
- const value = meta[key];
207
- if (isJsonValue(value)) {
208
- out[key] = value;
209
- }
210
- }
211
- return Object.keys(out).length > 0 ? out : void 0;
212
- };
213
- var MODULE_INTERNAL = /* @__PURE__ */ Symbol.for("logix.module.internal");
214
- var resolveLogicUnits = (input) => {
215
- if (!isRecord2(input)) return void 0;
216
- const internal = input[MODULE_INTERNAL];
217
- const mounted = internal?.mounted;
218
- if (!Array.isArray(mounted)) return void 0;
219
- const out = [];
220
- for (const unit of mounted) {
221
- if (!isRecord2(unit)) continue;
222
- const kind = unit.kind;
223
- const id = unit.id;
224
- if (typeof kind !== "string" || kind.length === 0) continue;
225
- if (typeof id !== "string" || id.length === 0) continue;
226
- const derived = unit.derived === true ? true : void 0;
227
- const name = typeof unit.name === "string" ? unit.name : void 0;
228
- out.push({ kind, id, derived, name });
229
- }
230
- out.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : a.kind.localeCompare(b.kind));
231
- return out.length > 0 ? out : void 0;
232
- };
233
- var digestOf = (base) => `manifest:067:${fnv1a32(stableStringify(base))}`;
234
- var utf8ByteLength = (value) => {
235
- const json = JSON.stringify(value);
236
- if (typeof TextEncoder !== "undefined") {
237
- return new TextEncoder().encode(json).length;
238
- }
239
- return json.length;
240
- };
241
- var applyMaxBytes = (manifest, maxBytes) => {
242
- const originalBytes = utf8ByteLength(manifest);
243
- if (originalBytes <= maxBytes) return manifest;
244
- const dropped = [];
245
- const truncatedArrays = [];
246
- const baseMarker = () => ({
247
- truncated: true,
248
- maxBytes,
249
- originalBytes,
250
- dropped,
251
- truncatedArrays
252
- });
253
- const withMarker = (next2) => {
254
- const meta = {
255
- __logix: baseMarker()
256
- };
257
- return { ...next2, meta };
258
- };
259
- let next = withMarker(manifest);
260
- const markTruncatedArray = (name) => {
261
- if (!truncatedArrays.includes(name)) {
262
- truncatedArrays.push(name);
263
- }
264
- };
265
- const dropField = (field) => {
266
- if (next[field] !== void 0) {
267
- dropped.push(String(field));
268
- next = withMarker({ ...next, [field]: void 0 });
269
- }
270
- };
271
- dropField("meta");
272
- if (utf8ByteLength(next) <= maxBytes) return next;
273
- dropField("source");
274
- if (utf8ByteLength(next) <= maxBytes) return next;
275
- dropField("staticIr");
276
- if (utf8ByteLength(next) <= maxBytes) return next;
277
- dropField("logicUnits");
278
- if (utf8ByteLength(next) <= maxBytes) return next;
279
- dropField("schemaKeys");
280
- if (utf8ByteLength(next) <= maxBytes) return next;
281
- dropField("effects");
282
- if (utf8ByteLength(next) <= maxBytes) return next;
283
- const truncateActionsToFit = () => {
284
- const total = next.actions.length;
285
- if (total <= 1) return;
286
- let lo = 1;
287
- let hi = total;
288
- let best = 1;
289
- while (lo <= hi) {
290
- const mid = Math.floor((lo + hi) / 2);
291
- const candidate = withMarker({
292
- ...next,
293
- actions: next.actions.slice(0, mid),
294
- actionKeys: next.actionKeys.slice(0, mid)
295
- });
296
- if (utf8ByteLength(candidate) <= maxBytes) {
297
- best = mid;
298
- lo = mid + 1;
299
- } else {
300
- hi = mid - 1;
301
- }
302
- }
303
- if (best < total) {
304
- markTruncatedArray("actions");
305
- markTruncatedArray("actionKeys");
306
- next = withMarker({
307
- ...next,
308
- actions: next.actions.slice(0, best),
309
- actionKeys: next.actionKeys.slice(0, best)
310
- });
311
- }
312
- };
313
- while (utf8ByteLength(next) > maxBytes) {
314
- const beforeLen = next.actions.length;
315
- truncateActionsToFit();
316
- if (next.actions.length === beforeLen) {
317
- break;
318
- }
319
- }
320
- return next;
321
- };
322
- var extractManifest = (module, options) => {
323
- const manifestVersion = "067";
324
- const moduleId = resolveModuleId2(module);
325
- const actionKeys = resolveActionKeys(module);
326
- const actions = resolveActions(module);
327
- const effects = resolveEffects(module);
328
- const schemaKeys = resolveSchemaKeys(module);
329
- const logicUnits = resolveLogicUnits(module);
330
- const source = resolveSource(module);
331
- const meta = resolveMeta(module);
332
- const staticIr = options?.includeStaticIr ? exportStaticIr2(module) : void 0;
333
- const digestBase = {
334
- manifestVersion,
335
- moduleId,
336
- actionKeys,
337
- actions,
338
- effects,
339
- schemaKeys,
340
- logicUnits,
341
- staticIrDigest: staticIr?.digest
342
- };
343
- const digest = digestOf(digestBase);
344
- const manifest = {
345
- manifestVersion,
346
- moduleId,
347
- actionKeys,
348
- actions,
349
- effects,
350
- schemaKeys,
351
- logicUnits,
352
- source,
353
- meta,
354
- staticIr,
355
- digest
356
- };
357
- const maxBytes = options?.budgets?.maxBytes;
358
- if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
359
- return applyMaxBytes(manifest, maxBytes);
360
- }
361
- return manifest;
362
- };
363
-
364
- // ../logix-core/src/internal/observability/artifacts/registry.ts
365
- var ARTIFACT_EXPORTERS = /* @__PURE__ */ Symbol.for("logix.module.trialRunArtifactExporters");
366
- var registerTrialRunArtifactExporter = (tag, exporter) => {
367
- if (!tag || typeof tag !== "object" && typeof tag !== "function") {
368
- throw new Error("[Logix] registerTrialRunArtifactExporter: invalid module tag");
369
- }
370
- const current = tag[ARTIFACT_EXPORTERS] ?? [];
371
- const next = Array.isArray(current) ? [...current, exporter] : [exporter];
372
- tag[ARTIFACT_EXPORTERS] = next;
373
- };
374
- var getTrialRunArtifactExporters = (tag) => {
375
- if (!tag || typeof tag !== "object" && typeof tag !== "function") {
376
- return [];
377
- }
378
- const current = tag[ARTIFACT_EXPORTERS];
379
- if (!Array.isArray(current)) return [];
380
- return current.filter((x) => x && typeof x === "object");
381
- };
382
-
383
- // ../logix-core/src/internal/observability/trialRunModule.ts
384
- import { Cause as Cause2, Effect as Effect4, Exit, Fiber, Layer as Layer4, Option } from "../effect.js";
385
-
386
- // ../logix-core/src/internal/platform/BuildEnv.ts
387
- import { ConfigProvider, Effect as Effect2, Layer as Layer2 } from "../effect.js";
388
-
389
- // ../logix-core/src/internal/platform/ConstructionGuard.ts
390
- import { Cause, Effect } from "../effect.js";
391
-
392
- // ../logix-core/src/internal/platform/RuntimeHost.ts
393
- import { Context, Layer } from "../effect.js";
394
- var detectKind = () => {
395
- const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
396
- if (isBrowser) return "browser";
397
- const isNode = typeof process !== "undefined" && typeof process?.versions?.node === "string";
398
- if (isNode) return "node";
399
- return "unknown";
400
- };
401
- var make = (kind) => ({
402
- kind,
403
- isNode: kind === "node",
404
- isBrowser: kind === "browser"
405
- });
406
- var RuntimeHost = class extends Context.Tag("@logixjs/RuntimeHost")() {
407
- };
408
- var layer = (service) => Layer.succeed(RuntimeHost, service);
409
- var defaultLayer = layer(make(detectKind()));
410
-
411
- // ../logix-core/src/internal/platform/BuildEnv.ts
412
- var toConfigProviderFromRecord = (record) => {
413
- const map = /* @__PURE__ */ new Map();
414
- for (const [k, v] of Object.entries(record ?? {})) {
415
- if (!k) continue;
416
- if (v === void 0) continue;
417
- map.set(k, String(v));
418
- }
419
- return ConfigProvider.fromMap(map);
420
- };
421
- var layer2 = (options = {}) => {
422
- const runtimeHost = options.runtimeHost ? layer(options.runtimeHost) : options.runtimeHostKind ? layer(make(options.runtimeHostKind)) : defaultLayer;
423
- const configProvider = options.configProvider ? options.configProvider : toConfigProviderFromRecord(options.config);
424
- const config = Layer2.setConfigProvider(configProvider);
425
- return Layer2.mergeAll(runtimeHost, config);
426
- };
427
-
428
- // ../logix-core/src/internal/runtime/Runtime.ts
429
- import { Layer as Layer3 } from "../effect.js";
430
- var make2 = (rootImpl, options) => {
431
- const appConfig = {
432
- layer: options?.layer ?? Layer3.empty,
433
- modules: [provide(rootImpl.module, rootImpl.layer)],
434
- processes: rootImpl.processes ?? [],
435
- onError: options?.onError
436
- };
437
- const app = makeApp(appConfig);
438
- return app.makeRuntime();
439
- };
440
-
441
- // ../logix-core/src/internal/observability/artifacts/model.ts
442
- var isArtifactKey = (input) => typeof input === "string" && /^@[^\s/]+\/[^\s@]+@v\d+$/.test(input);
443
-
444
- // ../logix-core/src/internal/observability/artifacts/digest.ts
445
- var utf8ByteLengthString = (text) => {
446
- if (typeof TextEncoder !== "undefined") {
447
- return new TextEncoder().encode(text).length;
448
- }
449
- return text.length;
450
- };
451
- var digestJsonValue = (value) => {
452
- const stableJson = stableStringify(value);
453
- const bytes = utf8ByteLengthString(stableJson);
454
- return {
455
- stableJson,
456
- bytes,
457
- digest: `artifact:031:${fnv1a32(stableJson)}`
458
- };
459
- };
460
-
461
- // ../logix-core/src/internal/observability/artifacts/collect.ts
462
- var toErrorSummaryWithCode = (cause, code, hint) => {
463
- const base = toSerializableErrorSummary(cause).errorSummary;
464
- return {
465
- name: base.name,
466
- message: base.message,
467
- code,
468
- hint: hint ?? base.hint
469
- };
470
- };
471
- var defaultArtifactBudgetBytes = 50 * 1024;
472
- var budgetOf = (budgets) => typeof budgets?.maxBytes === "number" && Number.isFinite(budgets.maxBytes) && budgets.maxBytes > 0 ? budgets.maxBytes : defaultArtifactBudgetBytes;
473
- var makeConflictEnvelope = (artifactKey, exporterIds) => {
474
- const ids = Array.from(new Set(exporterIds.map((s) => String(s)).filter((s) => s.length > 0))).sort(
475
- (a, b) => a.localeCompare(b)
476
- );
477
- return {
478
- artifactKey,
479
- envelope: {
480
- artifactKey,
481
- ok: false,
482
- error: {
483
- name: "ArtifactKeyConflictError",
484
- message: `[Logix] TrialRun artifact key conflict: ${artifactKey}`,
485
- code: "ArtifactKeyConflict",
486
- hint: ids.length > 0 ? `conflictingExporters=${ids.join(",")}` : void 0
487
- }
488
- }
489
- };
490
- };
491
- var truncateJsonValue = (value, maxBytes) => {
492
- const analyzed = digestJsonValue(value);
493
- const json = analyzed.stableJson;
494
- const bytes = analyzed.bytes;
495
- if (bytes <= maxBytes) {
496
- return { value, actualBytes: bytes, digest: analyzed.digest };
497
- }
498
- const previewChars = Math.min(json.length, Math.max(0, Math.min(256, maxBytes)));
499
- const preview = json.slice(0, previewChars);
500
- return {
501
- value: {
502
- _tag: "oversized",
503
- bytes,
504
- preview
505
- },
506
- actualBytes: bytes,
507
- digest: analyzed.digest
508
- };
509
- };
510
- var collectTrialRunArtifacts = (options) => {
511
- const exportersSorted = Array.from(options.exporters).sort((a, b) => {
512
- const ka = String(a?.artifactKey ?? "");
513
- const kb = String(b?.artifactKey ?? "");
514
- if (ka < kb) return -1;
515
- if (ka > kb) return 1;
516
- const ia = String(a?.exporterId ?? "");
517
- const ib = String(b?.exporterId ?? "");
518
- return ia.localeCompare(ib);
519
- });
520
- const conflicts = /* @__PURE__ */ new Map();
521
- for (const ex of exportersSorted) {
522
- const key = ex?.artifactKey;
523
- const id = String(ex?.exporterId ?? "");
524
- if (!isArtifactKey(key)) {
525
- continue;
526
- }
527
- const current = conflicts.get(key);
528
- if (current) current.push(id);
529
- else conflicts.set(key, [id]);
530
- }
531
- const conflictKeys = /* @__PURE__ */ new Set();
532
- for (const [k, ids] of conflicts) {
533
- const unique = Array.from(new Set(ids));
534
- if (unique.length > 1) {
535
- conflictKeys.add(k);
536
- }
537
- }
538
- const maxBytes = budgetOf(options.budgets);
539
- const collected = [];
540
- for (const exporter of exportersSorted) {
541
- const artifactKey = exporter?.artifactKey;
542
- if (!isArtifactKey(artifactKey)) {
543
- continue;
544
- }
545
- if (conflictKeys.has(artifactKey)) {
546
- continue;
547
- }
548
- try {
549
- const value = exporter.export(options.ctx);
550
- if (value === void 0) continue;
551
- if (!isJsonValue(value)) {
552
- collected.push({
553
- artifactKey,
554
- envelope: {
555
- artifactKey,
556
- ok: false,
557
- error: toErrorSummaryWithCode(
558
- new Error(`[Logix] Artifact exporter returned non-JsonValue: ${exporter.exporterId}`),
559
- "ArtifactNonSerializable",
560
- `artifactKey=${artifactKey} exporterId=${exporter.exporterId}`
561
- )
562
- }
563
- });
564
- continue;
565
- }
566
- const truncated = truncateJsonValue(value, maxBytes);
567
- const envelope = {
568
- artifactKey,
569
- ok: true,
570
- value: truncated.value,
571
- digest: truncated.digest,
572
- ...truncated.actualBytes > maxBytes ? {
573
- truncated: true,
574
- budgetBytes: maxBytes,
575
- actualBytes: truncated.actualBytes
576
- } : {
577
- budgetBytes: maxBytes,
578
- actualBytes: truncated.actualBytes
579
- }
580
- };
581
- collected.push({ artifactKey, envelope });
582
- } catch (e) {
583
- collected.push({
584
- artifactKey,
585
- envelope: {
586
- artifactKey,
587
- ok: false,
588
- error: toErrorSummaryWithCode(
589
- e,
590
- "ArtifactExportFailed",
591
- `artifactKey=${artifactKey} exporterId=${exporter.exporterId}`
592
- )
593
- }
594
- });
595
- }
596
- }
597
- for (const conflictKey of Array.from(conflictKeys).sort((a, b) => a.localeCompare(b))) {
598
- collected.push(makeConflictEnvelope(conflictKey, conflicts.get(conflictKey) ?? []));
599
- }
600
- if (collected.length === 0) return void 0;
601
- collected.sort((a, b) => a.artifactKey.localeCompare(b.artifactKey));
602
- return Object.fromEntries(collected.map((c) => [c.artifactKey, c.envelope]));
603
- };
604
-
605
- // ../logix-core/src/internal/observability/trialRunModule.ts
606
- var defaultHost = () => {
607
- if (typeof window !== "undefined" && typeof document !== "undefined") return "browser";
608
- return "node";
609
- };
610
- var isRecord3 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
611
- var resolveRootImpl = (root) => root?._tag === "ModuleImpl" ? root : root?.impl;
612
- var utf8ByteLength2 = (value) => {
613
- const json = JSON.stringify(value);
614
- if (typeof TextEncoder !== "undefined") {
615
- return new TextEncoder().encode(json).length;
616
- }
617
- return json.length;
618
- };
619
- var parseMissingConfigKeys = (message) => {
620
- const out = [];
621
- const patterns = [
622
- /\bMissing (?:data|value) for (?:key|path) "?([A-Z0-9_./:-]+)"?/g,
623
- /\bMissing (?:data|value) at ([A-Z0-9_./:-]+)\b/g,
624
- /\bMissing configuration:? "?([A-Z0-9_./:-]+)"?/g,
625
- /\bConfig\b.*\bmissing\b.*"?([A-Z0-9_./:-]+)"?/gi
626
- ];
627
- for (const re of patterns) {
628
- let match;
629
- while (match = re.exec(message)) {
630
- const key = match[1];
631
- if (typeof key === "string" && key.length > 0) out.push(key);
632
- }
633
- }
634
- return Array.from(new Set(out)).sort((a, b) => a.localeCompare(b));
635
- };
636
- var parseMissingServiceIds = (message) => {
637
- const out = [];
638
- const re = /Service not found: ([^\s(]+)/g;
639
- let match;
640
- while (match = re.exec(message)) {
641
- const id = match[1]?.replace(/[,:.;]+$/, "");
642
- if (typeof id === "string" && id.length > 0) out.push(id);
643
- }
644
- return Array.from(new Set(out)).sort((a, b) => a.localeCompare(b));
645
- };
646
- var parseMissingDependencyFromCause = (cause) => {
647
- const missingServices = [];
648
- const missingConfigKeys = [];
649
- const candidates = [...Array.from(Cause2.failures(cause)), ...Array.from(Cause2.defects(cause))];
650
- for (const candidate of candidates) {
651
- if (isRecord3(candidate) && candidate._tag === "ConstructionGuardError") {
652
- const missingService = candidate.missingService;
653
- if (typeof missingService === "string" && missingService.length > 0) {
654
- missingServices.push(missingService);
655
- }
656
- }
657
- if (isRecord3(candidate) && candidate._tag === "ConfigError" && candidate._op === "MissingData" && Array.isArray(candidate.path) && candidate.path.every((k) => typeof k === "string" && k.length > 0)) {
658
- const key = candidate.path.join(".");
659
- if (key.length > 0) missingConfigKeys.push(key);
660
- }
661
- }
662
- const messages = [];
663
- for (const candidate of candidates) {
664
- if (candidate instanceof Error) {
665
- messages.push(candidate.message);
666
- continue;
667
- }
668
- if (typeof candidate === "string") {
669
- messages.push(candidate);
670
- continue;
671
- }
672
- if (isRecord3(candidate) && typeof candidate.message === "string") {
673
- messages.push(String(candidate.message));
674
- }
675
- }
676
- try {
677
- messages.push(Cause2.pretty(cause, { renderErrorCause: true }));
678
- } catch {
679
- }
680
- const merged = messages.filter((s) => s.length > 0).join("\n");
681
- if (merged) {
682
- missingServices.push(...parseMissingServiceIds(merged));
683
- missingConfigKeys.push(...parseMissingConfigKeys(merged));
684
- }
685
- return {
686
- missingServices: Array.from(new Set(missingServices)).sort((a, b) => a.localeCompare(b)),
687
- missingConfigKeys: Array.from(new Set(missingConfigKeys)).sort((a, b) => a.localeCompare(b))
688
- };
689
- };
690
- var buildEnvironmentIr = (params) => {
691
- const providedConfigKeys = Object.keys(params.buildEnvConfig ?? {}).filter((k) => k.length > 0 && params.buildEnvConfig[k] !== void 0).sort((a, b) => a.localeCompare(b));
692
- const missingServices = Array.from(new Set(params.missingServices ?? [])).sort((a, b) => a.localeCompare(b));
693
- const missingConfigKeys = Array.from(new Set(params.missingConfigKeys ?? [])).sort((a, b) => a.localeCompare(b));
694
- const runtimeServiceIds = params.runtimeServicesEvidence?.bindings?.map((b) => b.serviceId).filter((s) => typeof s === "string") ?? [];
695
- const tagIds = Array.from(/* @__PURE__ */ new Set([...runtimeServiceIds, ...missingServices])).sort((a, b) => a.localeCompare(b));
696
- const configKeys = Array.from(/* @__PURE__ */ new Set([...providedConfigKeys, ...missingConfigKeys])).sort(
697
- (a, b) => a.localeCompare(b)
698
- );
699
- return {
700
- tagIds,
701
- configKeys,
702
- missingServices,
703
- missingConfigKeys,
704
- kernelImplementationRef: params.kernelImplementationRef,
705
- runtimeServicesEvidence: params.runtimeServicesEvidence
706
- };
707
- };
708
- var toErrorSummaryWithCode2 = (cause, code, hint) => {
709
- const base = toSerializableErrorSummary(cause).errorSummary;
710
- return {
711
- name: base.name,
712
- message: base.message,
713
- code,
714
- hint: hint ?? base.hint
715
- };
716
- };
717
- var makeTrialRunTimeoutError = () => Object.assign(new Error("[Logix] trialRunModule timed out"), {
718
- name: "TrialRunTimeoutError"
719
- });
720
- var awaitFiberExitWithTimeout = (fiber, timeoutMs) => Effect4.gen(function* () {
721
- const hasTimeout = typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0;
722
- const start = hasTimeout ? Date.now() : 0;
723
- while (true) {
724
- const exitOpt = yield* Fiber.poll(fiber);
725
- if (Option.isSome(exitOpt)) {
726
- return exitOpt.value;
727
- }
728
- if (hasTimeout) {
729
- const elapsedMs = Date.now() - start;
730
- if (elapsedMs >= timeoutMs) {
731
- yield* Fiber.interruptFork(fiber);
732
- return Exit.fail(makeTrialRunTimeoutError());
733
- }
734
- }
735
- yield* Effect4.promise(() => new Promise((r) => setTimeout(r, 1)));
736
- }
737
- });
738
- var trialRunModule = (root, options) => Effect4.gen(function* () {
739
- const rootImpl = resolveRootImpl(root);
740
- const session = makeRunSession({
741
- runId: options?.runId,
742
- source: options?.source ?? { host: defaultHost(), label: "trial-run-module" },
743
- startedAt: options?.startedAt
744
- });
745
- const collector = makeEvidenceCollector(session);
746
- const convergeCollector = {
747
- register: (ir) => {
748
- collector.registerConvergeStaticIr(ir);
749
- }
750
- };
751
- const sinksLayer = appendSinks([collector.debugSink]);
752
- const resolvedDiagnosticsLevel = options?.diagnosticsLevel ?? "light";
753
- const diagnosticsLayer = diagnosticsLevel(resolvedDiagnosticsLevel);
754
- const convergeLayer = appendConvergeStaticIrCollectors([convergeCollector]);
755
- const collectorLayer = evidenceCollectorLayer(collector);
756
- const sessionLayer = runSessionLayer(session);
757
- const buildEnvConfig = options?.buildEnv?.config;
758
- const buildEnvLayer = layer2({
759
- runtimeHostKind: options?.buildEnv?.hostKind,
760
- config: buildEnvConfig,
761
- configProvider: options?.buildEnv?.configProvider
762
- });
763
- const trialLayer = Layer4.mergeAll(
764
- buildEnvLayer,
765
- options?.layer ?? Layer4.empty,
766
- sessionLayer,
767
- collectorLayer,
768
- diagnosticsLayer,
769
- sinksLayer,
770
- convergeLayer
771
- );
772
- const kernel = yield* makeProgramRunnerKernel(
773
- (impl) => make2(impl, {
774
- layer: trialLayer
775
- // trial-run does not enable devtools by default; diagnostics is controlled by diagnosticsLevel.
776
- }),
777
- rootImpl
778
- );
779
- const identity = kernel.identity;
780
- const bootFiber = kernel.runtime.runFork(rootImpl.module);
781
- const bootExit = yield* awaitFiberExitWithTimeout(bootFiber, options?.trialRunTimeoutMs);
782
- let kernelImplementationRef;
783
- let runtimeServicesEvidence;
784
- let instanceId;
785
- if (Exit.isSuccess(bootExit)) {
786
- const moduleRuntime = bootExit.value;
787
- instanceId = typeof moduleRuntime?.instanceId === "string" && moduleRuntime.instanceId.length > 0 ? moduleRuntime.instanceId : void 0;
788
- kernel.setInstanceId(instanceId);
789
- try {
790
- kernelImplementationRef = getKernelImplementationRef(moduleRuntime);
791
- } catch {
792
- kernelImplementationRef = void 0;
793
- }
794
- if (resolvedDiagnosticsLevel !== "off") {
795
- try {
796
- runtimeServicesEvidence = getRuntimeServicesEvidence(moduleRuntime);
797
- } catch {
798
- runtimeServicesEvidence = void 0;
799
- }
800
- }
801
- } else {
802
- const failure = Cause2.failureOption(bootExit.cause);
803
- if (Option.isSome(failure)) {
804
- const err = failure.value;
805
- const instanceIdFromErr = typeof err?.instanceId === "string" ? err.instanceId : void 0;
806
- if (instanceIdFromErr && instanceIdFromErr.length > 0) {
807
- kernel.setInstanceId(instanceIdFromErr);
808
- }
809
- }
810
- }
811
- const closeExit = yield* Effect4.exit(
812
- kernel.close({
813
- timeoutMs: typeof options?.closeScopeTimeout === "number" && Number.isFinite(options.closeScopeTimeout) && options.closeScopeTimeout > 0 ? options.closeScopeTimeout : 1e3
814
- })
815
- );
816
- const evidence = collector.exportEvidencePackage({
817
- maxEvents: options?.maxEvents ?? 1e3
818
- });
819
- const manifest = (() => {
820
- try {
821
- return extractManifest(root, {
822
- includeStaticIr: true,
823
- budgets: { maxBytes: 2e5 }
824
- });
825
- } catch {
826
- return void 0;
827
- }
828
- })();
829
- const staticIr = (() => {
830
- try {
831
- return exportStaticIr2(root);
832
- } catch {
833
- return void 0;
834
- }
835
- })();
836
- let ok = Exit.isSuccess(bootExit) && Exit.isSuccess(closeExit);
837
- let error;
838
- let summary;
839
- const depsFromBootFailure = Exit.isFailure(bootExit) ? parseMissingDependencyFromCause(bootExit.cause) : { missingServices: [], missingConfigKeys: [] };
840
- const missingServices = depsFromBootFailure.missingServices;
841
- const missingConfigKeys = depsFromBootFailure.missingConfigKeys;
842
- const closeError = Exit.isFailure(closeExit) ? Option.getOrUndefined(Cause2.dieOption(closeExit.cause)) : void 0;
843
- if (!Exit.isSuccess(bootExit)) {
844
- const failure = Option.getOrUndefined(Cause2.failureOption(bootExit.cause));
845
- const defect = Option.getOrUndefined(Cause2.dieOption(bootExit.cause));
846
- const base = failure ?? defect ?? bootExit.cause;
847
- if (missingServices.length > 0 || missingConfigKeys.length > 0) {
848
- ok = false;
849
- error = toErrorSummaryWithCode2(
850
- base,
851
- "MissingDependency",
852
- 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."
853
- );
854
- } else if (isRecord3(base) && (base.name === "TrialRunTimeoutError" || base._tag === "TrialRunTimeout")) {
855
- ok = false;
856
- error = toErrorSummaryWithCode2(
857
- base,
858
- "TrialRunTimeout",
859
- "Trial run timed out: check for Layer/assembly phase blocking (Effect.never / unfinished acquire)."
860
- );
861
- } else {
862
- ok = false;
863
- error = toErrorSummaryWithCode2(base, "RuntimeFailure");
864
- }
865
- }
866
- if (Exit.isFailure(closeExit)) {
867
- const died = Option.getOrUndefined(Cause2.dieOption(closeExit.cause));
868
- const failure = Option.getOrUndefined(Cause2.failureOption(closeExit.cause));
869
- const base = died ?? failure ?? closeExit.cause;
870
- const closeErrorSummary = (() => {
871
- const tag = isRecord3(base) ? base._tag : void 0;
872
- if (tag === "DisposeTimeout") {
873
- return toErrorSummaryWithCode2(
874
- base,
875
- "DisposeTimeout",
876
- "Dispose timed out: check for unclosed resource handles, fibers not interrupted, or event listeners not unregistered."
877
- );
878
- }
879
- return toErrorSummaryWithCode2(base, "RuntimeFailure");
880
- })();
881
- ok = false;
882
- if (!error) {
883
- error = closeErrorSummary;
884
- } else {
885
- summary = { __logix: { closeError: closeErrorSummary } };
886
- }
887
- }
888
- const environment = buildEnvironmentIr({
889
- kernelImplementationRef,
890
- runtimeServicesEvidence,
891
- buildEnvConfig,
892
- missingServices,
893
- missingConfigKeys
894
- });
895
- const moduleId = typeof rootImpl.module?.id === "string" && rootImpl.module.id.length > 0 ? String(rootImpl.module.id) : manifest?.moduleId ?? "unknown";
896
- const artifacts = collectTrialRunArtifacts({
897
- exporters: getTrialRunArtifactExporters(rootImpl.module),
898
- ctx: {
899
- moduleId,
900
- manifest,
901
- staticIr,
902
- environment
903
- }
904
- });
905
- let report = {
906
- runId: session.runId,
907
- ok,
908
- manifest,
909
- staticIr,
910
- artifacts,
911
- environment,
912
- evidence,
913
- summary,
914
- error
915
- };
916
- const maxBytes = options?.budgets?.maxBytes;
917
- if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
918
- const originalBytes = utf8ByteLength2(report);
919
- if (originalBytes > maxBytes) {
920
- report = {
921
- runId: session.runId,
922
- ok: false,
923
- environment,
924
- error: {
925
- message: `[Logix] TrialRunReport exceeded maxBytes (${originalBytes} > ${maxBytes})`,
926
- code: "Oversized",
927
- hint: "Reduce maxEvents or budgets.maxBytes, or split manifest/evidence artifacts in CI."
928
- },
929
- summary: {
930
- __logix: {
931
- truncated: true,
932
- maxBytes,
933
- originalBytes,
934
- dropped: ["manifest", "staticIr", "artifacts", "evidence"]
935
- }
936
- }
937
- };
938
- }
939
- }
940
- return report;
941
- });
942
-
943
- // ../logix-core/src/internal/observability/trialRun.ts
944
- import { Effect as Effect5, Layer as Layer5, Scope } from "../effect.js";
945
- var defaultHost2 = () => {
946
- if (typeof window !== "undefined" && typeof document !== "undefined") return "browser";
947
- return "node";
948
- };
949
- var trialRun = (program, options) => Effect5.gen(function* () {
950
- const session = makeRunSession({
951
- runId: options?.runId,
952
- source: options?.source ?? { host: defaultHost2(), label: "trial-run" },
953
- startedAt: options?.startedAt
954
- });
955
- const collector = makeEvidenceCollector(session);
956
- const convergeCollector = {
957
- register: (ir) => {
958
- collector.registerConvergeStaticIr(ir);
959
- }
960
- };
961
- const sinksLayer = appendSinks([collector.debugSink]);
962
- const diagnosticsLayer = diagnosticsLevel(options?.diagnosticsLevel ?? "light");
963
- const convergeLayer = appendConvergeStaticIrCollectors([convergeCollector]);
964
- const collectorLayer = evidenceCollectorLayer(collector);
965
- const sessionLayer = runSessionLayer(session);
966
- const overridesLayer = options?.runtimeServicesInstanceOverrides != null ? Layer5.succeed(
967
- RuntimeServicesInstanceOverridesTag,
968
- options.runtimeServicesInstanceOverrides
969
- ) : Layer5.empty;
970
- const trialLayer = Layer5.mergeAll(
971
- options?.layer ?? Layer5.empty,
972
- sessionLayer,
973
- collectorLayer,
974
- overridesLayer,
975
- diagnosticsLayer,
976
- sinksLayer,
977
- convergeLayer
978
- );
979
- const scope = yield* Scope.make();
980
- const exit = yield* Effect5.exit(program).pipe(Effect5.provideService(Scope.Scope, scope), Effect5.provide(trialLayer));
981
- yield* Scope.close(scope, exit);
982
- const evidence = collector.exportEvidencePackage({
983
- maxEvents: options?.maxEvents
984
- });
985
- return { session, exit, evidence };
986
- });
987
-
988
- export {
989
- exportStaticIr2 as exportStaticIr,
990
- extractManifest,
991
- registerTrialRunArtifactExporter,
992
- trialRunModule,
993
- trialRun
994
- };
995
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9zdGF0aWNJci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL21hbmlmZXN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL3JlZ2lzdHJ5LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW5Nb2R1bGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQnVpbGRFbnYudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQ29uc3RydWN0aW9uR3VhcmQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vUnVudGltZUhvc3QudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9SdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL21vZGVsLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL2RpZ2VzdC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L2FydGlmYWN0cy9jb2xsZWN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHsgZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvaXIuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRlVHJhaXRQcm9ncmFtIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvbW9kZWwuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciBhcyBleHBvcnRTdGF0ZVRyYWl0U3RhdGljSXIgfSBmcm9tICcuLi9zdGF0ZS10cmFpdC9pci5qcydcblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVNb2R1bGVUYWcgPSAoaW5wdXQ6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKGlzTW9kdWxlSW1wbChpbnB1dCkpIHJldHVybiBpbnB1dC5tb2R1bGVcbiAgaWYgKGlzUmVjb3JkKGlucHV0KSAmJiAoaW5wdXQgYXMgYW55KS50YWcpIHJldHVybiAoaW5wdXQgYXMgYW55KS50YWdcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgZXhwb3J0U3RhdGljSXIgPSAobW9kdWxlOiB1bmtub3duKTogU3RhdGljSXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB0YWcgPSByZXNvbHZlTW9kdWxlVGFnKG1vZHVsZSlcbiAgaWYgKCF0YWcpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBwcm9ncmFtID0gZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSh0YWcpIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4gfCB1bmRlZmluZWRcbiAgaWYgKCFwcm9ncmFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGV4cG9ydFN0YXRlVHJhaXRTdGF0aWNJcih7XG4gICAgcHJvZ3JhbSxcbiAgICBtb2R1bGVJZDogcmVzb2x2ZU1vZHVsZUlkKG1vZHVsZSksXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanMnXG5pbXBvcnQgKiBhcyBBY3Rpb24gZnJvbSAnLi4vYWN0aW9uLmpzJ1xuaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5LCBmbnYxYTMyIH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciB9IGZyb20gJy4vc3RhdGljSXIuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3RCdWRnZXRzIHtcbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0TWFuaWZlc3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgaW5jbHVkZVN0YXRpY0lyPzogYm9vbGVhblxuICByZWFkb25seSBidWRnZXRzPzogTWFuaWZlc3RCdWRnZXRzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQge1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICByZWFkb25seSBkZXJpdmVkPzogYm9vbGVhblxuICByZWFkb25seSBuYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RBY3Rpb24ge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBwYXlsb2FkOiB7XG4gICAgcmVhZG9ubHkga2luZDogJ3ZvaWQnIHwgJ25vblZvaWQnIHwgJ3Vua25vd24nXG4gIH1cbiAgcmVhZG9ubHkgcHJpbWFyeVJlZHVjZXI/OiB7XG4gICAgcmVhZG9ubHkga2luZDogJ2RlY2xhcmVkJyB8ICdyZWdpc3RlcmVkJ1xuICB9XG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RFZmZlY3Qge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBzb3VyY2VLZXk6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiAnZGVjbGFyZWQnIHwgJ3JlZ2lzdGVyZWQnXG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3Qge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc291cmNlPzoge1xuICAgIHJlYWRvbmx5IGZpbGU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGxpbmU6IG51bWJlclxuICAgIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyXG4gIH1cbiAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT5cbiAgcmVhZG9ubHkgc3RhdGljSXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBleHBvcnRTdGF0aWNJcj5cbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25LZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgdGFnID0gaXNNb2R1bGVJbXBsKGlucHV0KSA/IChpbnB1dC5tb2R1bGUgYXMgYW55KSA6IChpbnB1dCBhcyBhbnkpPy50YWdcbiAgY29uc3QgYWN0aW9uTWFwID0gdGFnPy5zaGFwZT8uYWN0aW9uTWFwXG4gIGlmICghaXNSZWNvcmQoYWN0aW9uTWFwKSkgcmV0dXJuIFtdXG4gIHJldHVybiBPYmplY3Qua2V5cyhhY3Rpb25NYXApLnNvcnQoKVxufVxuXG50eXBlIERldlNvdXJjZSA9IE1vZHVsZU1hbmlmZXN0Wydzb3VyY2UnXVxuXG5jb25zdCByZXNvbHZlRGV2U291cmNlID0gKGlucHV0OiB1bmtub3duKTogRGV2U291cmNlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgZmlsZSA9IChpbnB1dCBhcyBhbnkpLmZpbGVcbiAgY29uc3QgbGluZSA9IChpbnB1dCBhcyBhbnkpLmxpbmVcbiAgY29uc3QgY29sdW1uID0gKGlucHV0IGFzIGFueSkuY29sdW1uXG4gIGlmICh0eXBlb2YgZmlsZSAhPT0gJ3N0cmluZycgfHwgZmlsZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHR5cGVvZiBsaW5lICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAxKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB7IGZpbGUsIGxpbmUsIGNvbHVtbiB9XG59XG5cbmNvbnN0IHJlc29sdmVUb2tlblNvdXJjZSA9ICh0b2tlbjogdW5rbm93bik6IERldlNvdXJjZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghdG9rZW4gfHwgKHR5cGVvZiB0b2tlbiAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHRva2VuICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gcmVzb2x2ZURldlNvdXJjZSgodG9rZW4gYXMgYW55KS5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25zID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEFjdGlvbj4gPT4ge1xuICBjb25zdCB0YWcgPSBpc01vZHVsZUltcGwoaW5wdXQpID8gKGlucHV0Lm1vZHVsZSBhcyBhbnkpIDogKGlucHV0IGFzIGFueSk/LnRhZ1xuICBjb25zdCBhY3Rpb25NYXAgPSB0YWc/LnNoYXBlPy5hY3Rpb25NYXBcbiAgaWYgKCFpc1JlY29yZChhY3Rpb25NYXApKSByZXR1cm4gW11cblxuICBjb25zdCBtb2R1bGVTb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuICBjb25zdCByZWR1Y2VycyA9IGlzUmVjb3JkKHRhZz8ucmVkdWNlcnMpID8gKHRhZy5yZWR1Y2VycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiB1bmRlZmluZWRcblxuICBjb25zdCBhY3Rpb25UYWdzID0gT2JqZWN0LmtleXMoYWN0aW9uTWFwKS5zb3J0KClcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPiA9IFtdXG4gIGZvciAoY29uc3QgYWN0aW9uVGFnIG9mIGFjdGlvblRhZ3MpIHtcbiAgICBjb25zdCB0b2tlbiA9IGFjdGlvbk1hcFthY3Rpb25UYWddXG4gICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVRva2VuU291cmNlKHRva2VuKSA/PyBtb2R1bGVTb3VyY2VcbiAgICBjb25zdCBwYXlsb2FkS2luZCA9XG4gICAgICBBY3Rpb24uaXNBY3Rpb25Ub2tlbih0b2tlbikgJiYgU2NoZW1hLmlzU2NoZW1hKCh0b2tlbiBhcyBBY3Rpb24uQW55QWN0aW9uVG9rZW4pLnNjaGVtYSlcbiAgICAgICAgPyAodG9rZW4gYXMgQWN0aW9uLkFueUFjdGlvblRva2VuKS5zY2hlbWEgPT09IFNjaGVtYS5Wb2lkXG4gICAgICAgICAgPyAndm9pZCdcbiAgICAgICAgICA6ICdub25Wb2lkJ1xuICAgICAgICA6ICd1bmtub3duJ1xuXG4gICAgY29uc3QgcHJpbWFyeVJlZHVjZXIgPVxuICAgICAgcmVkdWNlcnMgJiYgdHlwZW9mIHJlZHVjZXJzW2FjdGlvblRhZ10gPT09ICdmdW5jdGlvbicgPyAoeyBraW5kOiAnZGVjbGFyZWQnIH0gYXMgY29uc3QpIDogdW5kZWZpbmVkXG5cbiAgICBvdXQucHVzaCh7XG4gICAgICBhY3Rpb25UYWcsXG4gICAgICBwYXlsb2FkOiB7IGtpbmQ6IHBheWxvYWRLaW5kIH0sXG4gICAgICAuLi4ocHJpbWFyeVJlZHVjZXIgPyB7IHByaW1hcnlSZWR1Y2VyIH0gOiB7fSksXG4gICAgICAuLi4oc291cmNlID8geyBzb3VyY2UgfSA6IHt9KSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBNT0RVTEVfREVDTEFSRURfRUZGRUNUUyA9IFN5bWJvbC5mb3IoJ2xvZ2l4Lm1vZHVsZS5lZmZlY3RzLmRlY2xhcmVkJylcblxuY29uc3QgcmVzb2x2ZUVmZmVjdHMgPSAoaW5wdXQ6IHVua25vd24pOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0RWZmZWN0PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHRhZyA9IGlzTW9kdWxlSW1wbChpbnB1dCkgPyAoaW5wdXQubW9kdWxlIGFzIGFueSkgOiAoaW5wdXQgYXMgYW55KT8udGFnXG4gIGNvbnN0IGFjdGlvbk1hcCA9IHRhZz8uc2hhcGU/LmFjdGlvbk1hcFxuICBpZiAoIWlzUmVjb3JkKGFjdGlvbk1hcCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBlZmZlY3RzUmF3ID0gKHRhZyBhcyBhbnkpPy5bTU9EVUxFX0RFQ0xBUkVEX0VGRkVDVFNdXG4gIGlmICghaXNSZWNvcmQoZWZmZWN0c1JhdykpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuXG4gIGNvbnN0IGxvZ2ljVW5pdElkID0gJ19fbG9naXhfaW50ZXJuYWw6ZWZmZWN0czpkZWNsYXJlZCdcbiAgY29uc3QgaGFuZGxlcklkcyA9IG5ldyBXZWFrTWFwPCguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBzdHJpbmc+KClcbiAgbGV0IG5leHRIYW5kbGVyU2VxID0gMFxuXG4gIGNvbnN0IG91dDogQXJyYXk8TW9kdWxlTWFuaWZlc3RFZmZlY3Q+ID0gW11cblxuICBmb3IgKGNvbnN0IGFjdGlvblRhZyBvZiBPYmplY3Qua2V5cyhlZmZlY3RzUmF3KS5zb3J0KCkpIHtcbiAgICBpZiAoIShhY3Rpb25UYWcgaW4gYWN0aW9uTWFwKSkgY29udGludWVcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKGVmZmVjdHNSYXcgYXMgYW55KVthY3Rpb25UYWddXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkgY29udGludWVcblxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nKSBjb250aW51ZVxuXG4gICAgICBsZXQgaGFuZGxlcklkID0gaGFuZGxlcklkcy5nZXQoaGFuZGxlcilcbiAgICAgIGlmICghaGFuZGxlcklkKSB7XG4gICAgICAgIG5leHRIYW5kbGVyU2VxICs9IDFcbiAgICAgICAgaGFuZGxlcklkID0gYGgke25leHRIYW5kbGVyU2VxfWBcbiAgICAgICAgaGFuZGxlcklkcy5zZXQoaGFuZGxlciwgaGFuZGxlcklkKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VLZXkgPSBgJHtsb2dpY1VuaXRJZH06OiR7aGFuZGxlcklkfWBcblxuICAgICAgb3V0LnB1c2goe1xuICAgICAgICBhY3Rpb25UYWcsXG4gICAgICAgIHNvdXJjZUtleSxcbiAgICAgICAga2luZDogJ2RlY2xhcmVkJyxcbiAgICAgICAgLi4uKHNvdXJjZSA/IHsgc291cmNlIH0gOiB7fSksXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuICBjb25zdCBkZWR1cGVkOiBBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD4gPSBbXVxuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb3V0KSB7XG4gICAgY29uc3Qga2V5ID0gYCR7aXRlbS5hY3Rpb25UYWd9XFx1MDAwMCR7aXRlbS5zb3VyY2VLZXl9YFxuICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKGtleSlcbiAgICBkZWR1cGVkLnB1c2goaXRlbSlcbiAgfVxuXG4gIGRlZHVwZWQuc29ydCgoYSwgYikgPT5cbiAgICBhLmFjdGlvblRhZyA8IGIuYWN0aW9uVGFnID8gLTEgOiBhLmFjdGlvblRhZyA+IGIuYWN0aW9uVGFnID8gMSA6IGEuc291cmNlS2V5LmxvY2FsZUNvbXBhcmUoYi5zb3VyY2VLZXkpLFxuICApXG4gIHJldHVybiBkZWR1cGVkLmxlbmd0aCA+IDAgPyBkZWR1cGVkIDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IHJlc29sdmVTY2hlbWFLZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2NoZW1hcyA9IChpbnB1dCBhcyBhbnkpLnNjaGVtYXNcbiAgaWYgKCFpc1JlY29yZChzY2hlbWFzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hcykuc29ydCgpXG59XG5cbmNvbnN0IHJlc29sdmVTb3VyY2UgPSAoaW5wdXQ6IHVua25vd24pOiBNb2R1bGVNYW5pZmVzdFsnc291cmNlJ10gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBkZXYgPSAoaW5wdXQgYXMgYW55KS5kZXZcbiAgcmV0dXJuIHJlc29sdmVEZXZTb3VyY2UoZGV2Py5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVNZXRhID0gKGlucHV0OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNSZWNvcmQoaW5wdXQpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG1ldGEgPSAoaW5wdXQgYXMgYW55KS5tZXRhXG4gIGlmICghaXNSZWNvcmQobWV0YSkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKS5zb3J0KCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGFba2V5XVxuICAgIGlmIChpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIG91dFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBNT0RVTEVfSU5URVJOQUwgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaW50ZXJuYWwnKVxuXG5jb25zdCByZXNvbHZlTG9naWNVbml0cyA9IChpbnB1dDogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgaW50ZXJuYWwgPSAoaW5wdXQgYXMgYW55KVtNT0RVTEVfSU5URVJOQUxdXG4gIGNvbnN0IG1vdW50ZWQgPSBpbnRlcm5hbD8ubW91bnRlZFxuICBpZiAoIUFycmF5LmlzQXJyYXkobW91bnRlZCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiA9IFtdXG4gIGZvciAoY29uc3QgdW5pdCBvZiBtb3VudGVkKSB7XG4gICAgaWYgKCFpc1JlY29yZCh1bml0KSkgY29udGludWVcbiAgICBjb25zdCBraW5kID0gdW5pdC5raW5kXG4gICAgY29uc3QgaWQgPSB1bml0LmlkXG4gICAgaWYgKHR5cGVvZiBraW5kICE9PSAnc3RyaW5nJyB8fCBraW5kLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICBjb25zdCBkZXJpdmVkID0gdW5pdC5kZXJpdmVkID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5pdC5uYW1lID09PSAnc3RyaW5nJyA/IHVuaXQubmFtZSA6IHVuZGVmaW5lZFxuICAgIG91dC5wdXNoKHsga2luZCwgaWQsIGRlcml2ZWQsIG5hbWUgfSlcbiAgfVxuXG4gIG91dC5zb3J0KChhLCBiKSA9PiAoYS5pZCA8IGIuaWQgPyAtMSA6IGEuaWQgPiBiLmlkID8gMSA6IGEua2luZC5sb2NhbGVDb21wYXJlKGIua2luZCkpKVxuICByZXR1cm4gb3V0Lmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWRcbn1cblxudHlwZSBEaWdlc3RCYXNlID0ge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc3RhdGljSXJEaWdlc3Q/OiBzdHJpbmdcbn1cblxuY29uc3QgZGlnZXN0T2YgPSAoYmFzZTogRGlnZXN0QmFzZSk6IHN0cmluZyA9PiBgbWFuaWZlc3Q6MDY3OiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoYmFzZSkpfWBcblxuY29uc3QgdXRmOEJ5dGVMZW5ndGggPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKS5sZW5ndGhcbiAgfVxuICByZXR1cm4ganNvbi5sZW5ndGhcbn1cblxuY29uc3QgYXBwbHlNYXhCeXRlcyA9IChtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QsIG1heEJ5dGVzOiBudW1iZXIpOiBNb2R1bGVNYW5pZmVzdCA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsQnl0ZXMgPSB1dGY4Qnl0ZUxlbmd0aChtYW5pZmVzdClcbiAgaWYgKG9yaWdpbmFsQnl0ZXMgPD0gbWF4Qnl0ZXMpIHJldHVybiBtYW5pZmVzdFxuXG4gIGNvbnN0IGRyb3BwZWQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBjb25zdCB0cnVuY2F0ZWRBcnJheXM6IEFycmF5PHN0cmluZz4gPSBbXVxuXG4gIGNvbnN0IGJhc2VNYXJrZXIgPSAoKTogSnNvblZhbHVlID0+ICh7XG4gICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgIG1heEJ5dGVzLFxuICAgIG9yaWdpbmFsQnl0ZXMsXG4gICAgZHJvcHBlZCxcbiAgICB0cnVuY2F0ZWRBcnJheXMsXG4gIH0pXG5cbiAgY29uc3Qgd2l0aE1hcmtlciA9IChuZXh0OiBNb2R1bGVNYW5pZmVzdCk6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0ge1xuICAgICAgX19sb2dpeDogYmFzZU1hcmtlcigpLFxuICAgIH1cbiAgICByZXR1cm4geyAuLi5uZXh0LCBtZXRhIH1cbiAgfVxuXG4gIGxldCBuZXh0OiBNb2R1bGVNYW5pZmVzdCA9IHdpdGhNYXJrZXIobWFuaWZlc3QpXG5cbiAgY29uc3QgbWFya1RydW5jYXRlZEFycmF5ID0gKG5hbWU6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICghdHJ1bmNhdGVkQXJyYXlzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICB0cnVuY2F0ZWRBcnJheXMucHVzaChuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRyb3BGaWVsZCA9IChmaWVsZDoga2V5b2YgTW9kdWxlTWFuaWZlc3QpOiB2b2lkID0+IHtcbiAgICBpZiAoKG5leHQgYXMgYW55KVtmaWVsZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZHJvcHBlZC5wdXNoKFN0cmluZyhmaWVsZCkpXG4gICAgICBuZXh0ID0gd2l0aE1hcmtlcih7IC4uLihuZXh0IGFzIGFueSksIFtmaWVsZF06IHVuZGVmaW5lZCB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIERldGVybWluaXN0aWMgdHJpbW1pbmcgb3JkZXIgKGxlYXN0IHZhbHVhYmxlIGZpcnN0KS5cbiAgZHJvcEZpZWxkKCdtZXRhJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc291cmNlJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc3RhdGljSXInKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgZHJvcEZpZWxkKCdsb2dpY1VuaXRzJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc2NoZW1hS2V5cycpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoJ2VmZmVjdHMnKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgLy8gTGFzdCByZXNvcnQ6IGRldGVybWluaXN0aWNhbGx5IHRydW5jYXRlIHRhaWwgaXRlbXMgKHN0YWJsZSBvcmRlcjogYWN0aW9uc1tdIHNvcnRlZCBieSBhY3Rpb25UYWcpLlxuICBjb25zdCB0cnVuY2F0ZUFjdGlvbnNUb0ZpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0b3RhbCA9IG5leHQuYWN0aW9ucy5sZW5ndGhcbiAgICBpZiAodG90YWwgPD0gMSkgcmV0dXJuXG5cbiAgICAvLyBGaW5kIHRoZSBsYXJnZXN0IHByZWZpeCB0aGF0IGZpdHMuXG4gICAgbGV0IGxvID0gMVxuICAgIGxldCBoaSA9IHRvdGFsXG4gICAgbGV0IGJlc3QgPSAxXG5cbiAgICB3aGlsZSAobG8gPD0gaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvICsgaGkpIC8gMilcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgbWlkKSxcbiAgICAgICAgYWN0aW9uS2V5czogbmV4dC5hY3Rpb25LZXlzLnNsaWNlKDAsIG1pZCksXG4gICAgICB9KVxuICAgICAgaWYgKHV0ZjhCeXRlTGVuZ3RoKGNhbmRpZGF0ZSkgPD0gbWF4Qnl0ZXMpIHtcbiAgICAgICAgYmVzdCA9IG1pZFxuICAgICAgICBsbyA9IG1pZCArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpID0gbWlkIC0gMVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiZXN0IDwgdG90YWwpIHtcbiAgICAgIG1hcmtUcnVuY2F0ZWRBcnJheSgnYWN0aW9ucycpXG4gICAgICBtYXJrVHJ1bmNhdGVkQXJyYXkoJ2FjdGlvbktleXMnKVxuICAgICAgbmV4dCA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgYmVzdCksXG4gICAgICAgIGFjdGlvbktleXM6IG5leHQuYWN0aW9uS2V5cy5zbGljZSgwLCBiZXN0KSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpID4gbWF4Qnl0ZXMpIHtcbiAgICBjb25zdCBiZWZvcmVMZW4gPSBuZXh0LmFjdGlvbnMubGVuZ3RoXG4gICAgdHJ1bmNhdGVBY3Rpb25zVG9GaXQoKVxuICAgIGlmIChuZXh0LmFjdGlvbnMubGVuZ3RoID09PSBiZWZvcmVMZW4pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RNYW5pZmVzdCA9IChtb2R1bGU6IHVua25vd24sIG9wdGlvbnM/OiBFeHRyYWN0TWFuaWZlc3RPcHRpb25zKTogTW9kdWxlTWFuaWZlc3QgPT4ge1xuICBjb25zdCBtYW5pZmVzdFZlcnNpb24gPSAnMDY3J1xuICBjb25zdCBtb2R1bGVJZCA9IHJlc29sdmVNb2R1bGVJZChtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbktleXMgPSByZXNvbHZlQWN0aW9uS2V5cyhtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbnMgPSByZXNvbHZlQWN0aW9ucyhtb2R1bGUpXG4gIGNvbnN0IGVmZmVjdHMgPSByZXNvbHZlRWZmZWN0cyhtb2R1bGUpXG5cbiAgY29uc3Qgc2NoZW1hS2V5cyA9IHJlc29sdmVTY2hlbWFLZXlzKG1vZHVsZSlcbiAgY29uc3QgbG9naWNVbml0cyA9IHJlc29sdmVMb2dpY1VuaXRzKG1vZHVsZSlcbiAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVNvdXJjZShtb2R1bGUpXG4gIGNvbnN0IG1ldGEgPSByZXNvbHZlTWV0YShtb2R1bGUpXG5cbiAgY29uc3Qgc3RhdGljSXIgPSBvcHRpb25zPy5pbmNsdWRlU3RhdGljSXIgPyBleHBvcnRTdGF0aWNJcihtb2R1bGUpIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZGlnZXN0QmFzZTogRGlnZXN0QmFzZSA9IHtcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kdWxlSWQsXG4gICAgYWN0aW9uS2V5cyxcbiAgICBhY3Rpb25zLFxuICAgIGVmZmVjdHMsXG4gICAgc2NoZW1hS2V5cyxcbiAgICBsb2dpY1VuaXRzLFxuICAgIHN0YXRpY0lyRGlnZXN0OiBzdGF0aWNJcj8uZGlnZXN0LFxuICB9XG5cbiAgY29uc3QgZGlnZXN0ID0gZGlnZXN0T2YoZGlnZXN0QmFzZSlcblxuICBjb25zdCBtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QgPSB7XG4gICAgbWFuaWZlc3RWZXJzaW9uLFxuICAgIG1vZHVsZUlkLFxuICAgIGFjdGlvbktleXMsXG4gICAgYWN0aW9ucyxcbiAgICBlZmZlY3RzLFxuICAgIHNjaGVtYUtleXMsXG4gICAgbG9naWNVbml0cyxcbiAgICBzb3VyY2UsXG4gICAgbWV0YSxcbiAgICBzdGF0aWNJcixcbiAgICBkaWdlc3QsXG4gIH1cblxuICBjb25zdCBtYXhCeXRlcyA9IG9wdGlvbnM/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/LmNvbmZpZ1Byb3ZpZGVyLFxuICAgIH0pXG5cbiAgICBjb25zdCB0cmlhbExheWVyID0gTGF5ZXIubWVyZ2VBbGwoXG4gICAgICBidWlsZEVudkxheWVyLFxuICAgICAgb3B0aW9ucz8ubGF5ZXIgPz8gKExheWVyLmVtcHR5IGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pLFxuICAgICAgc2Vzc2lvbkxheWVyLFxuICAgICAgY29sbGVjdG9yTGF5ZXIsXG4gICAgICBkaWFnbm9zdGljc0xheWVyLFxuICAgICAgc2lua3NMYXllcixcbiAgICAgIGNvbnZlcmdlTGF5ZXIsXG4gICAgKSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuICAgIGNvbnN0IGtlcm5lbCA9IHlpZWxkKiBtYWtlUHJvZ3JhbVJ1bm5lcktlcm5lbChcbiAgICAgIChpbXBsKSA9PlxuICAgICAgICBSdW50aW1lLm1ha2UoaW1wbCwge1xuICAgICAgICAgIGxheWVyOiB0cmlhbExheWVyIGFzIGFueSxcbiAgICAgICAgICAvLyB0cmlhbC1ydW4gZG9lcyBub3QgZW5hYmxlIGRldnRvb2xzIGJ5IGRlZmF1bHQ7IGRpYWdub3N0aWNzIGlzIGNvbnRyb2xsZWQgYnkgZGlhZ25vc3RpY3NMZXZlbC5cbiAgICAgICAgfSBhcyBhbnkpLFxuICAgICAgcm9vdEltcGwsXG4gICAgKVxuXG4gICAgY29uc3QgaWRlbnRpdHkgPSBrZXJuZWwuaWRlbnRpdHlcblxuICAgIGNvbnN0IGJvb3RGaWJlciA9IGtlcm5lbC5ydW50aW1lLnJ1bkZvcmsocm9vdEltcGwubW9kdWxlIGFzIGFueSlcbiAgICBjb25zdCBib290RXhpdCA9IHlpZWxkKiBhd2FpdEZpYmVyRXhpdFdpdGhUaW1lb3V0KGJvb3RGaWJlciwgb3B0aW9ucz8udHJpYWxSdW5UaW1lb3V0TXMpXG5cbiAgICBsZXQga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmIHwgdW5kZWZpbmVkXG4gICAgbGV0IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlIHwgdW5kZWZpbmVkXG4gICAgbGV0IGluc3RhbmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gICAgaWYgKEV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSkge1xuICAgICAgY29uc3QgbW9kdWxlUnVudGltZSA9IGJvb3RFeGl0LnZhbHVlIGFzIGFueVxuICAgICAgaW5zdGFuY2VJZCA9XG4gICAgICAgIHR5cGVvZiBtb2R1bGVSdW50aW1lPy5pbnN0YW5jZUlkID09PSAnc3RyaW5nJyAmJiBtb2R1bGVSdW50aW1lLmluc3RhbmNlSWQubGVuZ3RoID4gMFxuICAgICAgICAgID8gbW9kdWxlUnVudGltZS5pbnN0YW5jZUlkXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIGtlcm5lbC5zZXRJbnN0YW5jZUlkKGluc3RhbmNlSWQpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmID0gS2VybmVsUmVmLmdldEtlcm5lbEltcGxlbWVudGF0aW9uUmVmKG1vZHVsZVJ1bnRpbWUpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYgPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmVkRGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSA9IFJ1bnRpbWVLZXJuZWwuZ2V0UnVudGltZVNlcnZpY2VzRXZpZGVuY2UobW9kdWxlUnVudGltZSlcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmYWlsdXJlID0gQ2F1c2UuZmFpbHVyZU9wdGlvbihib290RXhpdC5jYXVzZSlcbiAgICAgIGlmIChPcHRpb24uaXNTb21lKGZhaWx1cmUpKSB7XG4gICAgICAgIGNvbnN0IGVycjogYW55ID0gZmFpbHVyZS52YWx1ZVxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkRnJvbUVyciA9IHR5cGVvZiBlcnI/Lmluc3RhbmNlSWQgPT09ICdzdHJpbmcnID8gZXJyLmluc3RhbmNlSWQgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKGluc3RhbmNlSWRGcm9tRXJyICYmIGluc3RhbmNlSWRGcm9tRXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBrZXJuZWwuc2V0SW5zdGFuY2VJZChpbnN0YW5jZUlkRnJvbUVycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNsb3NlRXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChcbiAgICAgIGtlcm5lbC5jbG9zZSh7XG4gICAgICAgIHRpbWVvdXRNczpcbiAgICAgICAgICB0eXBlb2Ygb3B0aW9ucz8uY2xvc2VTY29wZVRpbWVvdXQgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG9wdGlvbnMuY2xvc2VTY29wZVRpbWVvdXQpICYmXG4gICAgICAgICAgb3B0aW9ucy5jbG9zZVNjb3BlVGltZW91dCA+IDBcbiAgICAgICAgICAgID8gb3B0aW9ucy5jbG9zZVNjb3BlVGltZW91dFxuICAgICAgICAgICAgOiAxMDAwLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgZXZpZGVuY2UgPSBjb2xsZWN0b3IuZXhwb3J0RXZpZGVuY2VQYWNrYWdlKHtcbiAgICAgIG1heEV2ZW50czogb3B0aW9ucz8ubWF4RXZlbnRzID8/IDEwMDAsXG4gICAgfSlcblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBleHRyYWN0TWFuaWZlc3Qocm9vdCBhcyBhbnksIHtcbiAgICAgICAgICBpbmNsdWRlU3RhdGljSXI6IHRydWUsXG4gICAgICAgICAgYnVkZ2V0czogeyBtYXhCeXRlczogMjAwXzAwMCB9LFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KSgpXG5cbiAgICBjb25zdCBzdGF0aWNJciA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhwb3J0U3RhdGljSXIocm9vdCBhcyBhbnkpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0pKClcblxuICAgIGxldCBvayA9IEV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSAmJiBFeGl0LmlzU3VjY2VzcyhjbG9zZUV4aXQpXG4gICAgbGV0IGVycm9yOiBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfCB1bmRlZmluZWRcbiAgICBsZXQgc3VtbWFyeTogdW5rbm93biB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGVwc0Zyb21Cb290RmFpbHVyZSA9IEV4aXQuaXNGYWlsdXJlKGJvb3RFeGl0KVxuICAgICAgPyBwYXJzZU1pc3NpbmdEZXBlbmRlbmN5RnJvbUNhdXNlKGJvb3RFeGl0LmNhdXNlIGFzIENhdXNlLkNhdXNlPHVua25vd24+KVxuICAgICAgOiB7IG1pc3NpbmdTZXJ2aWNlczogW10sIG1pc3NpbmdDb25maWdLZXlzOiBbXSB9XG5cbiAgICBjb25zdCBtaXNzaW5nU2VydmljZXMgPSBkZXBzRnJvbUJvb3RGYWlsdXJlLm1pc3NpbmdTZXJ2aWNlc1xuICAgIGNvbnN0IG1pc3NpbmdDb25maWdLZXlzID0gZGVwc0Zyb21Cb290RmFpbHVyZS5taXNzaW5nQ29uZmlnS2V5c1xuXG4gICAgY29uc3QgY2xvc2VFcnJvciA9IEV4aXQuaXNGYWlsdXJlKGNsb3NlRXhpdCkgPyBPcHRpb24uZ2V0T3JVbmRlZmluZWQoQ2F1c2UuZGllT3B0aW9uKGNsb3NlRXhpdC5jYXVzZSkpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIUV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSkge1xuICAgICAgY29uc3QgZmFpbHVyZSA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5mYWlsdXJlT3B0aW9uKGJvb3RFeGl0LmNhdXNlKSlcbiAgICAgIGNvbnN0IGRlZmVjdCA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5kaWVPcHRpb24oYm9vdEV4aXQuY2F1c2UpKVxuICAgICAgY29uc3QgYmFzZSA9IGZhaWx1cmUgPz8gZGVmZWN0ID8/IGJvb3RFeGl0LmNhdXNlXG5cbiAgICAgIGlmIChtaXNzaW5nU2VydmljZXMubGVuZ3RoID4gMCB8fCBtaXNzaW5nQ29uZmlnS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKFxuICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgJ01pc3NpbmdEZXBlbmRlbmN5JyxcbiAgICAgICAgICBtaXNzaW5nU2VydmljZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyAnQnVpbGQtdGltZSBtaXNzaW5nIHNlcnZpY2U6IHByb3ZpZGUgYSBMYXllciBtb2NrL2ltcGxlbWVudGF0aW9uIHZpYSBvcHRpb25zLmxheWVyLCBvciBtb3ZlIHRoZSBkZXBlbmRlbmN5IGFjY2VzcyB0byBydW50aW1lLidcbiAgICAgICAgICAgIDogJ0J1aWxkLXRpbWUgbWlzc2luZyBjb25maWc6IHByb3ZpZGUgdGhlIG1pc3Npbmcga2V5KHMpIGluIGJ1aWxkRW52LmNvbmZpZywgb3IgYWRkIGEgZGVmYXVsdCB2YWx1ZSB0byBDb25maWcuJyxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNSZWNvcmQoYmFzZSkgJiZcbiAgICAgICAgKChiYXNlIGFzIGFueSkubmFtZSA9PT0gJ1RyaWFsUnVuVGltZW91dEVycm9yJyB8fCAoYmFzZSBhcyBhbnkpLl90YWcgPT09ICdUcmlhbFJ1blRpbWVvdXQnKVxuICAgICAgKSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKFxuICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgJ1RyaWFsUnVuVGltZW91dCcsXG4gICAgICAgICAgJ1RyaWFsIHJ1biB0aW1lZCBvdXQ6IGNoZWNrIGZvciBMYXllci9hc3NlbWJseSBwaGFzZSBibG9ja2luZyAoRWZmZWN0Lm5ldmVyIC8gdW5maW5pc2hlZCBhY3F1aXJlKS4nLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvayA9IGZhbHNlXG4gICAgICAgIGVycm9yID0gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShiYXNlLCAnUnVudGltZUZhaWx1cmUnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChFeGl0LmlzRmFpbHVyZShjbG9zZUV4aXQpKSB7XG4gICAgICBjb25zdCBkaWVkID0gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmRpZU9wdGlvbihjbG9zZUV4aXQuY2F1c2UpKVxuICAgICAgY29uc3QgZmFpbHVyZSA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5mYWlsdXJlT3B0aW9uKGNsb3NlRXhpdC5jYXVzZSkpXG4gICAgICBjb25zdCBiYXNlID0gZGllZCA/PyBmYWlsdXJlID8/IGNsb3NlRXhpdC5jYXVzZVxuXG4gICAgICBjb25zdCBjbG9zZUVycm9yU3VtbWFyeSA9ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGlzUmVjb3JkKGJhc2UpID8gKGJhc2UgYXMgYW55KS5fdGFnIDogdW5kZWZpbmVkXG4gICAgICAgIGlmICh0YWcgPT09ICdEaXNwb3NlVGltZW91dCcpIHtcbiAgICAgICAgICByZXR1cm4gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgICAnRGlzcG9zZVRpbWVvdXQnLFxuICAgICAgICAgICAgJ0Rpc3Bvc2UgdGltZWQgb3V0OiBjaGVjayBmb3IgdW5jbG9zZWQgcmVzb3VyY2UgaGFuZGxlcywgZmliZXJzIG5vdCBpbnRlcnJ1cHRlZCwgb3IgZXZlbnQgbGlzdGVuZXJzIG5vdCB1bnJlZ2lzdGVyZWQuJyxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoYmFzZSwgJ1J1bnRpbWVGYWlsdXJlJylcbiAgICAgIH0pKClcblxuICAgICAgb2sgPSBmYWxzZVxuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAvLyBJZiBib290IHN1Y2NlZWRlZCBidXQgZGlzcG9zZSBmYWlsZWQsIHRoZSBjbG9zZSBlcnJvciBpcyB0aGUgcHJpbWFyeSBmYWlsdXJlLlxuICAgICAgICBlcnJvciA9IGNsb3NlRXJyb3JTdW1tYXJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgcHJpbWFyeSBib290IGZhaWx1cmUgKGUuZy4gVHJpYWxSdW5UaW1lb3V0KSBidXQga2VlcCBkaXNwb3NlIGZhaWx1cmUgZXZpZGVuY2UuXG4gICAgICAgIHN1bW1hcnkgPSB7IF9fbG9naXg6IHsgY2xvc2VFcnJvcjogY2xvc2VFcnJvclN1bW1hcnkgfSB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBidWlsZEVudmlyb25tZW50SXIoe1xuICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYsXG4gICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSxcbiAgICAgIGJ1aWxkRW52Q29uZmlnLFxuICAgICAgbWlzc2luZ1NlcnZpY2VzLFxuICAgICAgbWlzc2luZ0NvbmZpZ0tleXMsXG4gICAgfSlcblxuICAgIGNvbnN0IG1vZHVsZUlkID1cbiAgICAgIHR5cGVvZiAocm9vdEltcGwubW9kdWxlIGFzIGFueSk/LmlkID09PSAnc3RyaW5nJyAmJiAocm9vdEltcGwubW9kdWxlIGFzIGFueSkuaWQubGVuZ3RoID4gMFxuICAgICAgICA/IFN0cmluZygocm9vdEltcGwubW9kdWxlIGFzIGFueSkuaWQpXG4gICAgICAgIDogKG1hbmlmZXN0Py5tb2R1bGVJZCA/PyAndW5rbm93bicpXG5cbiAgICBjb25zdCBhcnRpZmFjdHMgPSBjb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHMoe1xuICAgICAgZXhwb3J0ZXJzOiBnZXRUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXJzKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpLFxuICAgICAgY3R4OiB7XG4gICAgICAgIG1vZHVsZUlkLFxuICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgc3RhdGljSXI6IHN0YXRpY0lyIGFzIGFueSxcbiAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBsZXQgcmVwb3J0OiBUcmlhbFJ1blJlcG9ydCA9IHtcbiAgICAgIHJ1bklkOiBzZXNzaW9uLnJ1bklkLFxuICAgICAgb2ssXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHN0YXRpY0lyOiBzdGF0aWNJciBhcyBhbnksXG4gICAgICBhcnRpZmFjdHMsXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGV2aWRlbmNlLFxuICAgICAgc3VtbWFyeSxcbiAgICAgIGVycm9yLFxuICAgIH1cblxuICAgIGNvbnN0IG1heEJ5dGVzID0gb3B0aW9ucz8uYnVkZ2V0cz8ubWF4Qnl0ZXNcbiAgICBpZiAodHlwZW9mIG1heEJ5dGVzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUobWF4Qnl0ZXMpICYmIG1heEJ5dGVzID4gMCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxCeXRlcyA9IHV0ZjhCeXRlTGVuZ3RoKHJlcG9ydClcbiAgICAgIGlmIChvcmlnaW5hbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgcmVwb3J0ID0ge1xuICAgICAgICAgIHJ1bklkOiBzZXNzaW9uLnJ1bklkLFxuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgbWVzc2FnZTogYFtMb2dpeF0gVHJpYWxSdW5SZXBvcnQgZXhjZWVkZWQgbWF4Qnl0ZXMgKCR7b3JpZ2luYWxCeXRlc30gPiAke21heEJ5dGVzfSlgLFxuICAgICAgICAgICAgY29kZTogJ092ZXJzaXplZCcsXG4gICAgICAgICAgICBoaW50OiAnUmVkdWNlIG1heEV2ZW50cyBvciBidWRnZXRzLm1heEJ5dGVzLCBvciBzcGxpdCBtYW5pZmVzdC9ldmlkZW5jZSBhcnRpZmFjdHMgaW4gQ0kuJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIF9fbG9naXg6IHtcbiAgICAgICAgICAgICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgICAgICAgICAgICBtYXhCeXRlcyxcbiAgICAgICAgICAgICAgb3JpZ2luYWxCeXRlcyxcbiAgICAgICAgICAgICAgZHJvcHBlZDogWydtYW5pZmVzdCcsICdzdGF0aWNJcicsICdhcnRpZmFjdHMnLCAnZXZpZGVuY2UnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXBvcnRcbiAgfSlcbiIsICJpbXBvcnQgeyBDb25maWdQcm92aWRlciwgRWZmZWN0LCBMYXllciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCAqIGFzIENvbnN0cnVjdGlvbkd1YXJkIGZyb20gJy4vQ29uc3RydWN0aW9uR3VhcmQuanMnXG5pbXBvcnQge1xuICBSdW50aW1lSG9zdCxcbiAgdHlwZSBSdW50aW1lSG9zdEtpbmQsXG4gIHR5cGUgUnVudGltZUhvc3RTZXJ2aWNlLFxuICBkZWZhdWx0TGF5ZXIgYXMgZGVmYXVsdFJ1bnRpbWVIb3N0TGF5ZXIsXG4gIG1ha2UgYXMgbWFrZVJ1bnRpbWVIb3N0LFxuICBsYXllciBhcyBydW50aW1lSG9zdExheWVyLFxufSBmcm9tICcuL1J1bnRpbWVIb3N0LmpzJ1xuXG5leHBvcnQgdHlwZSBCdWlsZEVudkNvbmZpZ1ZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRW52T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHJ1bnRpbWVIb3N0PzogUnVudGltZUhvc3RTZXJ2aWNlXG4gIHJlYWRvbmx5IHJ1bnRpbWVIb3N0S2luZD86IFJ1bnRpbWVIb3N0S2luZFxuICAvKipcbiAgICogRmxhdCBrZXkvdmFsdWUgY29uZmlnIGZvciBtb2NraW5nIGZlYXR1cmUgZmxhZ3MgLyBlbnYgdmFyaWFibGVzICh2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gc3RyaW5nKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+XG4gIC8qKlxuICAgKiBBZHZhbmNlZDogaW5qZWN0IGEgQ29uZmlnUHJvdmlkZXIgZGlyZWN0bHkgKGhpZ2hlciBwcmlvcml0eSB0aGFuIGNvbmZpZykuXG4gICAqL1xuICByZWFkb25seSBjb25maWdQcm92aWRlcj86IENvbmZpZ1Byb3ZpZGVyLkNvbmZpZ1Byb3ZpZGVyXG59XG5cbmNvbnN0IHRvQ29uZmlnUHJvdmlkZXJGcm9tUmVjb3JkID0gKFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuKTogQ29uZmlnUHJvdmlkZXIuQ29uZmlnUHJvdmlkZXIgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCA/PyB7fSkpIHtcbiAgICBpZiAoIWspIGNvbnRpbnVlXG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICBtYXAuc2V0KGssIFN0cmluZyh2KSlcbiAgfVxuICByZXR1cm4gQ29uZmlnUHJvdmlkZXIuZnJvbU1hcChtYXApXG59XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChvcHRpb25zOiBCdWlsZEVudk9wdGlvbnMgPSB7fSk6IExheWVyLkxheWVyPFJ1bnRpbWVIb3N0LCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgY29uc3QgcnVudGltZUhvc3QgPSBvcHRpb25zLnJ1bnRpbWVIb3N0XG4gICAgPyBydW50aW1lSG9zdExheWVyKG9wdGlvbnMucnVudGltZUhvc3QpXG4gICAgOiBvcHRpb25zLnJ1bnRpbWVIb3N0S2luZFxuICAgICAgPyBydW50aW1lSG9zdExheWVyKG1ha2VSdW50aW1lSG9zdChvcHRpb25zLnJ1bnRpbWVIb3N0S2luZCkpXG4gICAgICA6IGRlZmF1bHRSdW50aW1lSG9zdExheWVyXG5cbiAgY29uc3QgY29uZmlnUHJvdmlkZXIgPSBvcHRpb25zLmNvbmZpZ1Byb3ZpZGVyID8gb3B0aW9ucy5jb25maWdQcm92aWRlciA6IHRvQ29uZmlnUHJvdmlkZXJGcm9tUmVjb3JkKG9wdGlvbnMuY29uZmlnKVxuXG4gIGNvbnN0IGNvbmZpZyA9IExheWVyLnNldENvbmZpZ1Byb3ZpZGVyKGNvbmZpZ1Byb3ZpZGVyKVxuXG4gIHJldHVybiBMYXllci5tZXJnZUFsbChydW50aW1lSG9zdCwgY29uZmlnKSBhcyBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPlxufVxuXG5leHBvcnQgY29uc3QgcnVuID0gPEEsIEU+KFxuICBidWlsZGVyOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFJ1bnRpbWVIb3N0PixcbiAgb3B0aW9uczogQnVpbGRFbnZPcHRpb25zID0ge30sXG4pOiBFZmZlY3QuRWZmZWN0PEEsIEUgfCBDb25zdHJ1Y3Rpb25HdWFyZC5Db25zdHJ1Y3Rpb25HdWFyZEVycm9yLCBuZXZlcj4gPT5cbiAgYnVpbGRlci5waXBlKEVmZmVjdC5wcm92aWRlKGxheWVyKG9wdGlvbnMpKSwgQ29uc3RydWN0aW9uR3VhcmQuZ3VhcmRCdWlsZFRpbWUpXG4iLCAiaW1wb3J0IHsgQ2F1c2UsIEVmZmVjdCB9IGZyb20gJ2VmZmVjdCdcblxuZXhwb3J0IGludGVyZmFjZSBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnOiAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcidcbiAgcmVhZG9ubHkga2luZDogJ21pc3Npbmdfc2VydmljZScgfCAndW5rbm93bl9kZWZlY3QnXG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VDb25zdHJ1Y3Rpb25HdWFyZEVycm9yID0gKG9wdGlvbnM6IHtcbiAgcmVhZG9ubHkga2luZDogQ29uc3RydWN0aW9uR3VhcmRFcnJvclsna2luZCddXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xuICByZWFkb25seSBtaXNzaW5nU2VydmljZT86IHN0cmluZ1xuICByZWFkb25seSBoaW50Pzogc3RyaW5nXG59KTogQ29uc3RydWN0aW9uR3VhcmRFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UpLCB7XG4gICAgX3RhZzogJ0NvbnN0cnVjdGlvbkd1YXJkRXJyb3InLFxuICAgIGtpbmQ6IG9wdGlvbnMua2luZCxcbiAgICBtaXNzaW5nU2VydmljZTogb3B0aW9ucy5taXNzaW5nU2VydmljZSxcbiAgICBoaW50OiBvcHRpb25zLmhpbnQsXG4gIH0pIGFzIENvbnN0cnVjdGlvbkd1YXJkRXJyb3JcblxuY29uc3QgZXh0cmFjdE1pc3NpbmdTZXJ2aWNlID0gKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbLi4uQXJyYXkuZnJvbShDYXVzZS5kZWZlY3RzKGNhdXNlKSksIC4uLkFycmF5LmZyb20oQ2F1c2UuZmFpbHVyZXMoY2F1c2UpKV1cblxuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvciA/IGNhbmRpZGF0ZS5tZXNzYWdlIDogdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ3N0cmluZycgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWRcblxuICAgIGlmICghbWVzc2FnZSkgY29udGludWVcblxuICAgIGNvbnN0IG1hdGNoID0gL1NlcnZpY2Ugbm90IGZvdW5kOiAoW15cXHMoXSspLy5leGVjKG1lc3NhZ2UpXG4gICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBtYXRjaFsxXVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIGd1YXJkQnVpbGRUaW1lXHVGRjFBXG4gKiAtIER1cmluZyBCdWlsZCBFbnYvUmVmbGVjdGlvbiwgY2F0Y2ggXCJtaXNzaW5nIHNlcnZpY2VcIiBkZWZlY3RzIGFuZCBjb252ZXJ0IHRoZW0gaW50byBhY3Rpb25hYmxlIGVycm9ycy5cbiAqIC0gUHJlc2VydmUgb3RoZXIgZmFpbHVyZXMvZGVmZWN0cyBhcy1pcyAoZG8gbm90IHN3YWxsb3cgYnVzaW5lc3MgZXJyb3Igc2VtYW50aWNzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGd1YXJkQnVpbGRUaW1lID0gPEEsIEUsIFI+KFxuICBzZWxmOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+LFxuKTogRWZmZWN0LkVmZmVjdDxBLCBFIHwgQ29uc3RydWN0aW9uR3VhcmRFcnJvciwgUj4gPT5cbiAgc2VsZi5waXBlKFxuICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSk6IEVmZmVjdC5FZmZlY3Q8bmV2ZXIsIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgfCBFLCBuZXZlcj4gPT4ge1xuICAgICAgY29uc3QgbWlzc2luZyA9IGV4dHJhY3RNaXNzaW5nU2VydmljZShjYXVzZSlcbiAgICAgIGlmIChtaXNzaW5nKSB7XG4gICAgICAgIHJldHVybiBFZmZlY3QuZmFpbChcbiAgICAgICAgICBtYWtlQ29uc3RydWN0aW9uR3VhcmRFcnJvcih7XG4gICAgICAgICAgICBraW5kOiAnbWlzc2luZ19zZXJ2aWNlJyxcbiAgICAgICAgICAgIG1pc3NpbmdTZXJ2aWNlOiBtaXNzaW5nLFxuICAgICAgICAgICAgbWVzc2FnZTogYFtDb25zdHJ1Y3Rpb25HdWFyZEVycm9yXSBCdWlsZC10aW1lIGRlcGVuZGVuY3kgdmlvbGF0aW9uOiBzZXJ2aWNlIFwiJHttaXNzaW5nfVwiIGlzIG5vdCBhdmFpbGFibGUgaW4gQnVpbGQgRW52LmAsXG4gICAgICAgICAgICBoaW50OlxuICAgICAgICAgICAgICAnQnVpbGQtdGltZSAoUmVmbGVjdGlvbikgY2FuIG9ubHkgZGVwZW5kIG9uIGEgc21hbGwgc2V0IG9mIG1vY2thYmxlIHByaW1pdGl2ZXMgKGUuZy4gQ29uZmlnL1J1bnRpbWVIb3N0KS4gJyArXG4gICAgICAgICAgICAgICdNb3ZlIGJ1c2luZXNzIHNlcnZpY2UgYWNjZXNzIHRvIHJ1bnRpbWUgKGUuZy4gVHJhaXQgaGFuZGxlciAvIExvZ2ljIHJ1biBzZWN0aW9uKSBvciBpc29sYXRlIGl0IHZpYSBleHBsaWNpdCBpbmplY3Rpb24uJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIEVmZmVjdC5mYWlsQ2F1c2UoY2F1c2UpIGFzIEVmZmVjdC5FZmZlY3Q8bmV2ZXIsIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgfCBFPlxuICAgIH0pLFxuICApXG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgTGF5ZXIgfSBmcm9tICdlZmZlY3QnXG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVIb3N0S2luZCA9ICdub2RlJyB8ICdicm93c2VyJyB8ICd1bmtub3duJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVIb3N0U2VydmljZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFJ1bnRpbWVIb3N0S2luZFxuICByZWFkb25seSBpc05vZGU6IGJvb2xlYW5cbiAgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuXG59XG5cbmNvbnN0IGRldGVjdEtpbmQgPSAoKTogUnVudGltZUhvc3RLaW5kID0+IHtcbiAgY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG4gIGlmIChpc0Jyb3dzZXIpIHJldHVybiAnYnJvd3NlcidcblxuICBjb25zdCBpc05vZGUgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIChwcm9jZXNzIGFzIGFueSk/LnZlcnNpb25zPy5ub2RlID09PSAnc3RyaW5nJ1xuXG4gIGlmIChpc05vZGUpIHJldHVybiAnbm9kZSdcblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmV4cG9ydCBjb25zdCBtYWtlID0gKGtpbmQ6IFJ1bnRpbWVIb3N0S2luZCk6IFJ1bnRpbWVIb3N0U2VydmljZSA9PiAoe1xuICBraW5kLFxuICBpc05vZGU6IGtpbmQgPT09ICdub2RlJyxcbiAgaXNCcm93c2VyOiBraW5kID09PSAnYnJvd3NlcicsXG59KVxuXG5leHBvcnQgY2xhc3MgUnVudGltZUhvc3QgZXh0ZW5kcyBDb250ZXh0LlRhZygnQGxvZ2l4anMvUnVudGltZUhvc3QnKTxSdW50aW1lSG9zdCwgUnVudGltZUhvc3RTZXJ2aWNlPigpIHt9XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChzZXJ2aWNlOiBSdW50aW1lSG9zdFNlcnZpY2UpOiBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKFJ1bnRpbWVIb3N0LCBzZXJ2aWNlKVxuXG5leHBvcnQgY29uc3QgbW9jayA9IChraW5kOiBSdW50aW1lSG9zdEtpbmQpOiBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPiA9PiBsYXllcihtYWtlKGtpbmQpKVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdExheWVyOiBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPiA9IGxheWVyKG1ha2UoZGV0ZWN0S2luZCgpKSlcbiIsICJpbXBvcnQgeyBFZmZlY3QsIExheWVyLCBNYW5hZ2VkUnVudGltZSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0ICogYXMgQXBwUnVudGltZUltcGwgZnJvbSAnLi9BcHBSdW50aW1lLmpzJ1xuXG4vKipcbiAqIFJ1bnRpbWUgb3B0aW9uczpcbiAqIC0gbGF5ZXI6IGV4dHJhIHRvcC1sZXZlbCBFbnYgKGUuZy4gQ29uZmlnIC8gcGxhdGZvcm0gc2VydmljZXMpIG1lcmdlZCB3aXRoIFJvb3QgTW9kdWxlSW1wbC5sYXllci5cbiAqIC0gb25FcnJvcjogYXBwLWxldmVsIGVycm9yIGhhbmRsZXIgZW50cnlwb2ludCB1c2VkIHRvIHJlcG9ydCB1bmNhdWdodCBlcnJvcnMgYXQgdGhlIFJ1bnRpbWUgbGV2ZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZU9wdGlvbnMge1xuICByZWFkb25seSBsYXllcj86IExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPlxuICByZWFkb25seSBvbkVycm9yPzogKGNhdXNlOiBpbXBvcnQoJ2VmZmVjdCcpLkNhdXNlLkNhdXNlPHVua25vd24+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG59XG5cbi8qKlxuICogUnVudGltZS5tYWtlXG4gKlxuICogQnVpbGQgYW4gYXBwbGljYXRpb24tbGV2ZWwgUnVudGltZSBnaXZlbiBhIHJvb3QgTW9kdWxlSW1wbDpcbiAqXG4gKiAtIFVzZSBSb290SW1wbC5tb2R1bGUgKyBSb290SW1wbC5sYXllciBhcyB0aGUgc2luZ2xlIGdsb2JhbCBtb2R1bGUuXG4gKiAtIEZvcmsgUm9vdEltcGwucHJvY2Vzc2VzIGFzIGxvbmctbGl2ZWQgcHJvY2Vzc2VzIHdpdGhpbiB0aGUgUnVudGltZSBzY29wZS5cbiAqIC0gUmV1c2UgdGhlIGV4aXN0aW5nIEFwcFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gYXMgdGhlIHVuZGVybHlpbmcgY29udGFpbmVyIGFuZCBleHBvc2Ugb25seSBNYW5hZ2VkUnVudGltZS5cbiAqXG4gKiBOb3RlczpcbiAqIC0gVXNlcyBicm9hZCBhbnkvbmV2ZXIgYXQgdGhlIHR5cGUgbGV2ZWwgdG8gYXZvaWQgY29tcGxleCBFbnYgaW5mZXJlbmNlIGhlcmUuXG4gKiAtIEJ1c2luZXNzIGNvZGUgb25seSBuZWVkcyB0byBlbnN1cmUgUm9vdEltcGwubGF5ZXIgYW5kIG9wdGlvbnMubGF5ZXIgdG9nZXRoZXIgY2FuIHByb3ZpZGUgdGhlIGZ1bGwgRW52LlxuICovXG5leHBvcnQgY29uc3QgbWFrZSA9IChcbiAgcm9vdEltcGw6IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PixcbiAgb3B0aW9ucz86IFJ1bnRpbWVPcHRpb25zLFxuKTogTWFuYWdlZFJ1bnRpbWUuTWFuYWdlZFJ1bnRpbWU8YW55LCBuZXZlcj4gPT4ge1xuICBjb25zdCBhcHBDb25maWc6IEFwcFJ1bnRpbWVJbXBsLkxvZ2l4QXBwQ29uZmlnPGFueT4gPSB7XG4gICAgbGF5ZXI6IChvcHRpb25zPy5sYXllciA/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/PyAoTGF5ZXIuZW1wdHkgYXMgdW5rbm93biBhcyBMYXllci5MYXllcjxhbnksIGFueSwgYW55PiksXG4gICAgICBzZXNzaW9uTGF5ZXIsXG4gICAgICBjb2xsZWN0b3JMYXllcixcbiAgICAgIG92ZXJyaWRlc0xheWVyLFxuICAgICAgZGlhZ25vc3RpY3NMYXllcixcbiAgICAgIHNpbmtzTGF5ZXIsXG4gICAgICBjb252ZXJnZUxheWVyLFxuICAgICkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgYW55PlxuXG4gICAgY29uc3Qgc2NvcGUgPSB5aWVsZCogU2NvcGUubWFrZSgpXG5cbiAgICBjb25zdCBleGl0ID0geWllbGQqIEVmZmVjdC5leGl0KHByb2dyYW0pLnBpcGUoRWZmZWN0LnByb3ZpZGVTZXJ2aWNlKFNjb3BlLlNjb3BlLCBzY29wZSksIEVmZmVjdC5wcm92aWRlKHRyaWFsTGF5ZXIpKVxuXG4gICAgeWllbGQqIFNjb3BlLmNsb3NlKHNjb3BlLCBleGl0KVxuXG4gICAgY29uc3QgZXZpZGVuY2UgPSBjb2xsZWN0b3IuZXhwb3J0RXZpZGVuY2VQYWNrYWdlKHtcbiAgICAgIG1heEV2ZW50czogb3B0aW9ucz8ubWF4RXZlbnRzLFxuICAgIH0pXG5cbiAgICByZXR1cm4geyBzZXNzaW9uLCBleGl0LCBldmlkZW5jZSB9IHNhdGlzZmllcyBUcmlhbFJ1blJlc3VsdDxBLCBFPlxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLElBQU0sV0FBVyxDQUFDLFVBQ2hCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU0sZUFBZSxDQUFDLFVBQ3BCLFNBQVMsS0FBSyxLQUFLLE1BQU0sU0FBUyxnQkFBZ0IsU0FBUyxNQUFNLE1BQU07QUFFekUsSUFBTSxrQkFBa0IsQ0FBQyxVQUEyQjtBQUNsRCxNQUFJLGFBQWEsS0FBSyxHQUFHO0FBQ3ZCLFVBQU0sS0FBTSxNQUFNLE9BQWU7QUFDakMsV0FBTyxPQUFPLE9BQU8sWUFBWSxHQUFHLFNBQVMsSUFBSSxLQUFLO0FBQUEsRUFDeEQ7QUFFQSxNQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ25CLFVBQU0sS0FBSyxNQUFNO0FBQ2pCLFFBQUksT0FBTyxPQUFPLFlBQVksR0FBRyxTQUFTLEVBQUcsUUFBTztBQUNwRCxVQUFNLE1BQU8sTUFBYztBQUMzQixRQUFJLFFBQVEsT0FBTyxRQUFRLFlBQVksT0FBTyxRQUFRLGFBQWE7QUFDakUsWUFBTSxRQUFTLElBQVk7QUFDM0IsVUFBSSxPQUFPLFVBQVUsWUFBWSxNQUFNLFNBQVMsRUFBRyxRQUFPO0FBQUEsSUFDNUQ7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRUEsSUFBTSxtQkFBbUIsQ0FBQyxVQUE0QjtBQUNwRCxNQUFJLGFBQWEsS0FBSyxFQUFHLFFB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QUEsRUFDRjtBQUVBLFFBQU0sYUFBYSxZQUFZLENBQUMsVUFBVSxTQUFpQyxDQUFDO0FBQzVFLFFBQU0sbUJBQW1CLGlCQUFpQixTQUFTLG9CQUFvQixPQUFPO0FBQzlFLFFBQU0sZ0JBQWdCLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDO0FBQzFFLFFBQU0saUJBQWlCLHVCQUF1QixTQUFTO0FBQ3ZELFFBQU0sZUFBZSxnQkFBZ0IsT0FBTztBQUU1QyxRQUFNLGlCQUNKLFNBQVMsb0NBQW9DLE9BQ3hDRSxPQUFNO0FBQUEsSUFDUztBQUFBLElBQ2QsUUFBUTtBQUFBLEVBQ1YsSUFDQ0EsT0FBTTtBQUViLFFBQU0sYUFBYUEsT0FBTTtBQUFBLElBQ3ZCLFNBQVMsU0FBVUEsT0FBTTtBQUFBLElBQ3pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxRQUFRLE9BQU8sTUFBTSxLQUFLO0FBRWhDLFFBQU0sT0FBTyxPQUFPRCxRQUFPLEtBQUssT0FBTyxFQUFFLEtBQUtBLFFBQU8sZUFBZSxNQUFNLE9BQU8sS0FBSyxHQUFHQSxRQUFPLFFBQVEsVUFBVSxDQUFDO0FBRW5ILFNBQU8sTUFBTSxNQUFNLE9BQU8sSUFBSTtBQUU5QixRQUFNLFdBQVcsVUFBVSxzQkFBc0I7QUFBQSxJQUMvQyxXQUFXLFNBQVM7QUFBQSxFQUN0QixDQUFDO0FBRUQsU0FBTyxFQUFFLFNBQVMsTUFBTSxTQUFTO0FBQ25DLENBQUM7IiwKICAibmFtZXMiOiBbImV4cG9ydFN0YXRpY0lyIiwgImlzUmVjb3JkIiwgImlzTW9kdWxlSW1wbCIsICJyZXNvbHZlTW9kdWxlSWQiLCAibmV4dCIsICJleHBvcnRTdGF0aWNJciIsICJDYXVzZSIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiRWZmZWN0IiwgIkxheWVyIiwgImxheWVyIiwgIkxheWVyIiwgIkxheWVyIiwgIm1ha2UiLCAiTGF5ZXIiLCAiaXNSZWNvcmQiLCAidXRmOEJ5dGVMZW5ndGgiLCAiQ2F1c2UiLCAidG9FcnJvclN1bW1hcnlXaXRoQ29kZSIsICJFZmZlY3QiLCAibGF5ZXIiLCAiTGF5ZXIiLCAibWFrZSIsICJleHBvcnRTdGF0aWNJciIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiZGVmYXVsdEhvc3QiLCAiRWZmZWN0IiwgIkxheWVyIl0KfQo=