@logixjs/sandbox 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -0,0 +1,373 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ build,
5
+ install
6
+ } from "./chunk-YTD6A35P.js";
7
+ import {
8
+ registerModuleProgram
9
+ } from "./chunk-ST353BOX.js";
10
+ import {
11
+ fnv1a32,
12
+ stableStringify
13
+ } from "./chunk-QGIM3FQK.js";
14
+ import {
15
+ Module
16
+ } from "./chunk-JMA7GY7Z.js";
17
+ import {
18
+ attachLogicUnitMeta
19
+ } from "./chunk-TXJCYO56.js";
20
+ import {
21
+ mutateWithPatchPaths
22
+ } from "./chunk-ZHNYE2YH.js";
23
+ import {
24
+ getBoundInternals,
25
+ setModuleTraitsProgram
26
+ } from "./chunk-6FKWRVP4.js";
27
+ import {
28
+ currentDiagnosticsLevel,
29
+ record
30
+ } from "./chunk-CVZPRIDB.js";
31
+
32
+ // ../logix-core/src/ModuleTag.ts
33
+ import { Effect, FiberRef } from "../effect.js";
34
+
35
+ // ../logix-core/src/internal/runtime/core/ModuleTraits.ts
36
+ var ModuleTraitsConflictError = class extends Error {
37
+ constructor(moduleId, conflicts) {
38
+ super(
39
+ [
40
+ `[ModuleTraitsConflictError] Conflicting traitIds found (moduleId=${moduleId}).`,
41
+ ...conflicts.map(
42
+ (c) => c.kind === "duplicate_traitId" ? `- duplicate ${c.traitId}: ${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : c.kind === "missing_requires" ? `- missing requires for ${c.traitId}: ${(c.missing ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : `- excludes violation for ${c.traitId}: present=${(c.present ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}`
43
+ )
44
+ ].join("\n")
45
+ );
46
+ this.moduleId = moduleId;
47
+ this.conflicts = conflicts;
48
+ this._tag = "ModuleTraitsConflictError";
49
+ }
50
+ };
51
+ var toProvenanceKey = (p) => `${p.originType}:${p.originId}:${p.originIdKind}:${p.originLabel}:${p.path ?? ""}`;
52
+ var compareProvenance = (a, b) => {
53
+ const type = a.originType.localeCompare(b.originType);
54
+ if (type !== 0) return type;
55
+ const id = a.originId.localeCompare(b.originId);
56
+ if (id !== 0) return id;
57
+ const kind = a.originIdKind.localeCompare(b.originIdKind);
58
+ if (kind !== 0) return kind;
59
+ const label = a.originLabel.localeCompare(b.originLabel);
60
+ if (label !== 0) return label;
61
+ return String(a.path ?? "").localeCompare(String(b.path ?? ""));
62
+ };
63
+ var originTypeOrder = (t) => t === "module" ? 0 : 1;
64
+ var compareTraitIdByProvenance = (a, b) => {
65
+ const ta = originTypeOrder(a.provenance.originType) - originTypeOrder(b.provenance.originType);
66
+ if (ta !== 0) return ta;
67
+ const oa = a.provenance.originId.localeCompare(b.provenance.originId);
68
+ if (oa !== 0) return oa;
69
+ return a.traitId.localeCompare(b.traitId);
70
+ };
71
+ var extractStringArray = (value) => {
72
+ if (!Array.isArray(value)) return [];
73
+ const out = [];
74
+ for (const v of value) {
75
+ if (typeof v !== "string") continue;
76
+ const s = v.trim();
77
+ if (!s) continue;
78
+ out.push(s);
79
+ }
80
+ return out;
81
+ };
82
+ var getTraitRequires = (value) => {
83
+ if (!value || typeof value !== "object") return [];
84
+ const direct = extractStringArray(value.requires);
85
+ return direct;
86
+ };
87
+ var getTraitExcludes = (value) => {
88
+ if (!value || typeof value !== "object") return [];
89
+ const direct = extractStringArray(value.excludes);
90
+ return direct;
91
+ };
92
+ var getTraitName = (traitId, value) => {
93
+ if (value && typeof value === "object") {
94
+ const n = value.name;
95
+ if (typeof n === "string" && n.trim().length > 0) return n.trim();
96
+ }
97
+ return traitId;
98
+ };
99
+ var getTraitDescription = (value) => {
100
+ if (value && typeof value === "object") {
101
+ const d = value.description;
102
+ if (typeof d === "string" && d.trim().length > 0) return d.trim();
103
+ }
104
+ return void 0;
105
+ };
106
+ var finalizeTraitContributions = (args) => {
107
+ const traitById = /* @__PURE__ */ new Map();
108
+ const duplicateSources = /* @__PURE__ */ new Map();
109
+ const contributions = [...args.contributions].sort(
110
+ (a, b) => compareProvenance(a.provenance, b.provenance)
111
+ );
112
+ for (const c of contributions) {
113
+ const traits2 = c.traits;
114
+ if (!traits2 || typeof traits2 !== "object") continue;
115
+ for (const traitId of Object.keys(traits2).sort((a, b) => a.localeCompare(b))) {
116
+ const value = traits2[traitId];
117
+ if (value === void 0) continue;
118
+ const prev = traitById.get(traitId);
119
+ if (!prev) {
120
+ traitById.set(traitId, { value, provenance: c.provenance });
121
+ continue;
122
+ }
123
+ const sources = duplicateSources.get(traitId) ?? [prev.provenance];
124
+ sources.push(c.provenance);
125
+ duplicateSources.set(traitId, sources);
126
+ }
127
+ }
128
+ const conflicts = [];
129
+ const registerConflict = (conflict) => {
130
+ const unique = /* @__PURE__ */ new Map();
131
+ for (const s of conflict.sources) {
132
+ unique.set(toProvenanceKey(s), s);
133
+ }
134
+ conflicts.push({
135
+ ...conflict,
136
+ sources: Array.from(unique.values()).sort(compareProvenance)
137
+ });
138
+ };
139
+ for (const traitId of Array.from(duplicateSources.keys()).sort((a, b) => a.localeCompare(b))) {
140
+ registerConflict({
141
+ kind: "duplicate_traitId",
142
+ traitId,
143
+ sources: duplicateSources.get(traitId) ?? []
144
+ });
145
+ }
146
+ const merged = {};
147
+ const provenanceIndex = {};
148
+ const traits = [];
149
+ const entries = [];
150
+ for (const traitId of traitById.keys()) {
151
+ const entry = traitById.get(traitId);
152
+ if (!entry) continue;
153
+ entries.push({ traitId, value: entry.value, provenance: entry.provenance });
154
+ }
155
+ const ids = entries.slice().sort(compareTraitIdByProvenance).map((e) => e.traitId);
156
+ for (const traitId of ids) {
157
+ const entry = traitById.get(traitId);
158
+ if (!entry) continue;
159
+ merged[traitId] = entry.value;
160
+ provenanceIndex[traitId] = entry.provenance;
161
+ traits.push({
162
+ traitId,
163
+ name: getTraitName(traitId, entry.value),
164
+ description: getTraitDescription(entry.value)
165
+ });
166
+ }
167
+ const present = new Set(ids);
168
+ for (const traitId of ids) {
169
+ const entry = traitById.get(traitId);
170
+ if (!entry) continue;
171
+ const requires = getTraitRequires(entry.value);
172
+ if (requires.length > 0) {
173
+ const missing = requires.filter((r) => !present.has(r));
174
+ if (missing.length > 0) {
175
+ registerConflict({
176
+ kind: "missing_requires",
177
+ traitId,
178
+ missing: Array.from(new Set(missing)).sort((a, b) => a.localeCompare(b)),
179
+ sources: [entry.provenance]
180
+ });
181
+ }
182
+ }
183
+ const excludes = getTraitExcludes(entry.value);
184
+ if (excludes.length > 0) {
185
+ const presentExcluded = excludes.filter((e) => present.has(e));
186
+ if (presentExcluded.length > 0) {
187
+ const otherSources = [];
188
+ for (const otherId of presentExcluded) {
189
+ const other = traitById.get(otherId);
190
+ if (other) otherSources.push(other.provenance);
191
+ }
192
+ registerConflict({
193
+ kind: "excludes_violation",
194
+ traitId,
195
+ present: Array.from(new Set(presentExcluded)).sort((a, b) => a.localeCompare(b)),
196
+ sources: [entry.provenance, ...otherSources]
197
+ });
198
+ }
199
+ }
200
+ }
201
+ if (conflicts.length > 0) {
202
+ const kindOrder = {
203
+ duplicate_traitId: 0,
204
+ missing_requires: 1,
205
+ excludes_violation: 2
206
+ };
207
+ conflicts.sort((a, b) => {
208
+ const k = kindOrder[a.kind] - kindOrder[b.kind];
209
+ if (k !== 0) return k;
210
+ return a.traitId.localeCompare(b.traitId);
211
+ });
212
+ throw new ModuleTraitsConflictError(args.moduleId, conflicts);
213
+ }
214
+ const digestBase = {
215
+ moduleId: args.moduleId,
216
+ traits,
217
+ provenanceIndex
218
+ };
219
+ const digest = `mtraits:023:${fnv1a32(stableStringify(digestBase))}`;
220
+ return {
221
+ merged,
222
+ snapshot: {
223
+ moduleId: args.moduleId,
224
+ digest,
225
+ traits,
226
+ provenanceIndex
227
+ }
228
+ };
229
+ };
230
+
231
+ // ../logix-core/src/ModuleTag.ts
232
+ var Reducer = {
233
+ mutate: (mutator) => (state, action, sink) => {
234
+ const { nextState, patchPaths } = mutateWithPatchPaths(
235
+ state,
236
+ (draft) => {
237
+ mutator(draft, action);
238
+ }
239
+ );
240
+ if (sink) {
241
+ for (const path of patchPaths) {
242
+ sink(path);
243
+ }
244
+ }
245
+ return nextState;
246
+ }
247
+ };
248
+ var makeImpl = (id, def) => Module(id, def);
249
+ var make = (id, def) => {
250
+ const moduleTag = makeImpl(id, def);
251
+ const stateSchema = def.state;
252
+ const moduleTraitsSpec = def.traits;
253
+ const baseProgram = moduleTraitsSpec ? build(stateSchema, moduleTraitsSpec) : void 0;
254
+ if (baseProgram) {
255
+ setModuleTraitsProgram(moduleTag, baseProgram);
256
+ registerModuleProgram(id, baseProgram);
257
+ }
258
+ const makeModuleTraitsContributionLogic = (traits) => {
259
+ const logic = moduleTag.logic(($) => ({
260
+ setup: Effect.sync(() => {
261
+ if (!traits || typeof traits !== "object") return;
262
+ const internals = getBoundInternals($);
263
+ internals.traits.registerModuleTraitsContribution({
264
+ traits,
265
+ provenance: {
266
+ originType: "module",
267
+ originId: id,
268
+ originIdKind: "explicit",
269
+ originLabel: `module:${id}`
270
+ }
271
+ });
272
+ }),
273
+ run: Effect.void
274
+ }));
275
+ attachLogicUnitMeta(logic, {
276
+ id: "__logix_internal:traits:module_contrib",
277
+ kind: "internal",
278
+ name: "traits:module_contrib",
279
+ moduleId: id
280
+ });
281
+ return logic;
282
+ };
283
+ const makeFinalizeTraitsLogic = () => {
284
+ const logic = moduleTag.logic(($) => ({
285
+ setup: Effect.gen(function* () {
286
+ const internals = getBoundInternals($);
287
+ const diagnosticsLevel = yield* FiberRef.get(currentDiagnosticsLevel);
288
+ const contributions = internals.traits.getModuleTraitsContributions();
289
+ let merged;
290
+ let snapshot;
291
+ try {
292
+ ;
293
+ ({ merged, snapshot } = finalizeTraitContributions({
294
+ moduleId: id,
295
+ contributions
296
+ }));
297
+ } catch (cause) {
298
+ if (diagnosticsLevel !== "off" && cause && typeof cause === "object" && cause._tag === "ModuleTraitsConflictError") {
299
+ const conflicts = Array.isArray(cause.conflicts) ? cause.conflicts : [];
300
+ const traitIds = conflicts.map((c) => c && typeof c === "object" ? c.traitId : void 0).filter((t) => typeof t === "string" && t.length > 0).slice(0, 20);
301
+ const data = diagnosticsLevel === "full" ? {
302
+ conflictCount: conflicts.length,
303
+ conflicts
304
+ } : {
305
+ conflictCount: conflicts.length,
306
+ traitIds
307
+ };
308
+ yield* record({
309
+ type: "trace:module:traits:conflict",
310
+ moduleId: id,
311
+ instanceId: internals.instanceId,
312
+ data
313
+ });
314
+ }
315
+ throw cause;
316
+ }
317
+ internals.traits.setModuleTraitsSnapshot(snapshot);
318
+ internals.traits.freezeModuleTraits();
319
+ if (diagnosticsLevel !== "off") {
320
+ const data = diagnosticsLevel === "full" ? {
321
+ digest: snapshot.digest,
322
+ count: snapshot.traits.length,
323
+ traits: snapshot.traits,
324
+ provenanceIndex: snapshot.provenanceIndex
325
+ } : {
326
+ digest: snapshot.digest,
327
+ count: snapshot.traits.length
328
+ };
329
+ yield* record({
330
+ type: "trace:module:traits",
331
+ moduleId: id,
332
+ instanceId: internals.instanceId,
333
+ data
334
+ });
335
+ }
336
+ if (Object.keys(merged).length === 0) {
337
+ return;
338
+ }
339
+ const onlyModuleLevel = contributions.length === 1 && contributions[0]?.provenance?.originType === "module";
340
+ const program = onlyModuleLevel && baseProgram ? baseProgram : build(stateSchema, merged);
341
+ setModuleTraitsProgram(moduleTag, program);
342
+ registerModuleProgram(id, program);
343
+ yield* install($, program);
344
+ }),
345
+ run: Effect.void
346
+ }));
347
+ attachLogicUnitMeta(logic, {
348
+ id: "__logix_internal:traits:finalize",
349
+ kind: "internal",
350
+ name: "traits:finalize",
351
+ moduleId: id
352
+ });
353
+ return logic;
354
+ };
355
+ const originalImplement = moduleTag.implement;
356
+ moduleTag.implement = ((config) => {
357
+ const userLogics = config.logics ?? [];
358
+ const moduleLevel = def.traits ? [makeModuleTraitsContributionLogic(def.traits)] : [];
359
+ const finalize = makeFinalizeTraitsLogic();
360
+ const mergedLogics = [...moduleLevel, ...userLogics, finalize];
361
+ return originalImplement({
362
+ ...config,
363
+ logics: mergedLogics
364
+ });
365
+ });
366
+ return moduleTag;
367
+ };
368
+
369
+ export {
370
+ Reducer,
371
+ make
372
+ };
373
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvTW9kdWxlVGFnLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9Nb2R1bGVUcmFpdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXJSZWYsIExheWVyLCBTY2hlbWEgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCAqIGFzIExvZ2ljIGZyb20gXCIuL0xvZ2ljLmpzXCJcbmltcG9ydCAqIGFzIE1vZHVsZUZhY3RvcnkgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9Nb2R1bGVGYWN0b3J5LmpzXCJcbmltcG9ydCB7IG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy5qc1wiXG5pbXBvcnQge1xuICBnZXRCb3VuZEludGVybmFscyxcbiAgc2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSxcbn0gZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL3J1bnRpbWVJbnRlcm5hbHNBY2Nlc3Nvci5qc1wiXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvRGVidWdTaW5rLmpzXCJcbmltcG9ydCAqIGFzIExvZ2ljVW5pdE1ldGEgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljVW5pdE1ldGEuanNcIlxuaW1wb3J0IHR5cGUge1xuICBBY3Rpb25zRnJvbU1hcCxcbiAgQW55TW9kdWxlU2hhcGUsXG4gIEFueVNjaGVtYSxcbiAgQm91bmRBcGksXG4gIEFjdGlvbk9mLFxuICBNb2R1bGVJbXBsLFxuICBNb2R1bGVMb2dpYyxcbiAgTW9kdWxlU2hhcGUsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIE1vZHVsZVRhZyxcbiAgTW9kdWxlSGFuZGxlLFxuICBNb2R1bGVIYW5kbGVVbmlvbixcbiAgU3RhdGVDaGFuZ2VXaXRoTWV0YSxcbiAgU3RhdGVDb21taXRNZXRhLFxuICBTdGF0ZUNvbW1pdE1vZGUsXG4gIFN0YXRlQ29tbWl0UHJpb3JpdHksXG4gIFJlZHVjZXJzRnJvbU1hcCxcbiAgU3RhdGVPZixcbn0gZnJvbSBcIi4vaW50ZXJuYWwvbW9kdWxlLmpzXCJcbmltcG9ydCAqIGFzIFN0YXRlVHJhaXQgZnJvbSBcIi4vc3RhdGUtdHJhaXQuanNcIlxuaW1wb3J0IHR5cGUgeyBTdGF0ZVRyYWl0UHJvZ3JhbSB9IGZyb20gXCIuL3N0YXRlLXRyYWl0LmpzXCJcbmltcG9ydCAqIGFzIE1vZHVsZVRyYWl0c1JlZ2lzdHJ5IGZyb20gXCIuL2ludGVybmFsL2RlYnVnL01vZHVsZVRyYWl0c1JlZ2lzdHJ5LmpzXCJcbmltcG9ydCAqIGFzIE1vZHVsZVRyYWl0cyBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvTW9kdWxlVHJhaXRzLmpzXCJcblxuLyoqXG4gKiBNb2R1bGVUYWcgLyBNb2R1bGVSdW50aW1lIC8gTW9kdWxlSW1wbCBcdTdCNDlcdTY4MzhcdTVGQzNcdTdDN0JcdTU3OEJcdTVCOUFcdTRFNDlcdTc2ODRcdTUxNkNcdTVGMDBcdTUxRkFcdTUzRTNcdTMwMDJcbiAqXG4gKiBcdTRFMEUgLmNvZGV4L3NraWxscy9wcm9qZWN0LWd1aWRlL3JlZmVyZW5jZXMvcnVudGltZS1sb2dpeC9sb2dpeC1jb3JlL2FwaS8wMi1tb2R1bGUtYW5kLWxvZ2ljLWFwaS5tZCBcdTRGRERcdTYzMDFcdTVCRjlcdTlGNTBcdTMwMDJcbiAqIFx1NTE3N1x1NEY1M1x1N0M3Qlx1NTc4Qlx1NUI5QVx1NEU0OVx1OTZDNlx1NEUyRFx1NTcyOCBpbnRlcm5hbC9tb2R1bGUudHMgXHU0RTJEXHVGRjBDXHU2NzJDXHU2QTIxXHU1NzU3XHU4RDFGXHU4RDIzXHU3RUM0XHU1NDA4XHU1REU1XHU1MzgyXHU1QjlFXHU3M0IwXHUzMDAyXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQW55U2NoZW1hLFxuICBBbnlNb2R1bGVTaGFwZSxcbiAgTW9kdWxlU2hhcGUsXG4gIE1vZHVsZUxvZ2ljLFxuICBNb2R1bGVJbXBsLFxuICBNb2R1bGVSdW50aW1lLFxuICBNb2R1bGVUYWcsXG4gIE1vZHVsZUhhbmRsZSxcbiAgTW9kdWxlSGFuZGxlVW5pb24sXG4gIFN0YXRlT2YsXG4gIEFjdGlvbnNGcm9tTWFwLFxuICBSZWR1Y2Vyc0Zyb21NYXAsXG4gIEJvdW5kQXBpLFxuICBBY3Rpb25PZixcbiAgU3RhdGVDb21taXRNb2RlLFxuICBTdGF0ZUNvbW1pdFByaW9yaXR5LFxuICBTdGF0ZUNvbW1pdE1ldGEsXG4gIFN0YXRlQ2hhbmdlV2l0aE1ldGEsXG59IGZyb20gXCIuL2ludGVybmFsL21vZHVsZS5qc1wiXG5cbi8qKlxuICogUmVkdWNlciBcdTVFMkVcdTUyQTlcdTVERTVcdTUxNzdcdUZGMUFcbiAqIC0gYFJlZHVjZXIubXV0YXRlYCBcdTYzRDBcdTRGOUJcdTRFMEUgYCQuc3RhdGUubXV0YXRlYCBcdTRFMDBcdTgxRjRcdTc2ODQgbXV0YXRpdmUgXHU5OENFXHU2ODNDXHU1MTk5XHU2Q0Q1XHVGRjFCXG4gKiAtIFx1OTAxQVx1OEZDN1x1NTE4NVx1OTBFOFx1NTdGQVx1NEU4RSBtdXRhdGl2ZSBcdTc2ODRcdTRFMERcdTUzRUZcdTUzRDhcdTY2RjRcdTY1QjBcdUZGMENcdTVDMDZcdTMwMENcdTVDMzFcdTU3MzBcdTRGRUVcdTY1MzkgZHJhZnRcdTMwMERcdTY2MjBcdTVDMDRcdTRFM0FcdTdFQUYgYChzdGF0ZSwgYWN0aW9uKSA9PiBzdGF0ZWAgXHU1MUZEXHU2NTcwXHUzMDAyXG4gKlxuICogXHU3NTI4XHU2Q0Q1XHU3OTNBXHU0RjhCXHVGRjFBXG4gKlxuICogICBjb25zdCBDb3VudGVyID0gTG9naXguTW9kdWxlVGFnLm1ha2UoXCJDb3VudGVyXCIsIHtcbiAqICAgICBzdGF0ZTogQ291bnRlclN0YXRlLFxuICogICAgIGFjdGlvbnM6IENvdW50ZXJBY3Rpb25zLFxuICogICAgIHJlZHVjZXJzOiB7XG4gKiAgICAgICBpbmM6IExvZ2l4Lk1vZHVsZVRhZy5SZWR1Y2VyLm11dGF0ZSgoZHJhZnQsIF9hY3Rpb24pID0+IHtcbiAqICAgICAgICAgZHJhZnQuY291bnQgKz0gMVxuICogICAgICAgfSksXG4gKiAgICAgfSxcbiAqICAgfSlcbiAqXG4gKiAgIHlpZWxkKiAkLnJlZHVjZXIoXG4gKiAgICAgXCJzZXRWYWx1ZVwiLFxuICogICAgIExvZ2l4Lk1vZHVsZVRhZy5SZWR1Y2VyLm11dGF0ZSgoZHJhZnQsIGFjdGlvbikgPT4ge1xuICogICAgICAgZHJhZnQudmFsdWUgPSBhY3Rpb24ucGF5bG9hZFxuICogICAgIH0pLFxuICogICApXG4gKi9cbmV4cG9ydCBjb25zdCBSZWR1Y2VyID0ge1xuICBtdXRhdGU6IDxTLCBBPihcbiAgICBtdXRhdG9yOiAoZHJhZnQ6IExvZ2ljLkRyYWZ0PFM+LCBhY3Rpb246IEEpID0+IHZvaWRcbiAgKTogKChzdGF0ZTogUywgYWN0aW9uOiBBLCBzaW5rPzogKHBhdGg6IHN0cmluZykgPT4gdm9pZCkgPT4gUykgPT5cbiAgICAoc3RhdGUsIGFjdGlvbiwgc2luaykgPT4ge1xuICAgICAgY29uc3QgeyBuZXh0U3RhdGUsIHBhdGNoUGF0aHMgfSA9IG11dGF0ZVdpdGhQYXRjaFBhdGhzKFxuICAgICAgICBzdGF0ZSBhcyBTLFxuICAgICAgICAoZHJhZnQpID0+IHtcbiAgICAgICAgICBtdXRhdG9yKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PFM+LCBhY3Rpb24pXG4gICAgICAgIH0sXG4gICAgICApXG5cbiAgICAgIGlmIChzaW5rKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgc2luayhwYXRoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0U3RhdGVcbiAgICB9LFxufVxuXG4vKipcbiAqIFx1N0I4MFx1NTMxNlx1NzY4NCBTaGFwZSBcdTVCOUFcdTRFNDlcdTUyQTlcdTYyNEJcdUZGMENcdTRFMTNcdTRFM0EgQWN0aW9uIE1hcCBcdThCQkVcdThCQTFcdTMwMDJcbiAqIEBleGFtcGxlIHR5cGUgTXlTaGFwZSA9IFNoYXBlPHR5cGVvZiBNeVN0YXRlLCB0eXBlb2YgTXlBY3Rpb25NYXA+XG4gKi9cbmV4cG9ydCB0eXBlIFNoYXBlPFxuICBTIGV4dGVuZHMgQW55U2NoZW1hLFxuICBNIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgQW55U2NoZW1hPlxuPiA9IE1vZHVsZVNoYXBlPFMsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8TT4+LCBNPlxuXG5jb25zdCBtYWtlSW1wbCA9IDxcbiAgSWQgZXh0ZW5kcyBzdHJpbmcsXG4gIFNTY2hlbWEgZXh0ZW5kcyBBbnlTY2hlbWEsXG4gIEFNYXAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBBbnlTY2hlbWE+XG4+KFxuICBpZDogSWQsXG4gIGRlZjoge1xuICAgIHJlYWRvbmx5IHN0YXRlOiBTU2NoZW1hXG4gICAgcmVhZG9ubHkgYWN0aW9uczogQU1hcFxuICAgIHJlYWRvbmx5IHJlZHVjZXJzPzogUmVkdWNlcnNGcm9tTWFwPFNTY2hlbWEsIEFNYXA+XG4gIH1cbik6IE1vZHVsZVRhZzxcbiAgSWQsXG4gIE1vZHVsZVNoYXBlPFNTY2hlbWEsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QU1hcD4+LCBBTWFwPlxuPiA9PiBNb2R1bGVGYWN0b3J5Lk1vZHVsZShpZCwgZGVmKSBhcyBNb2R1bGVUYWc8XG4gIElkLFxuICBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD5cbj5cblxuLyoqXG4gKiBNb2R1bGVUYWcubWFrZVx1RkYxQVxuICogLSBcdTRFRTVcdTdFRDlcdTVCOUEgaWQgXHU0RTBFIHN0YXRlL2FjdGlvbnMvcmVkdWNlcnMgXHU1QjlBXHU0RTQ5XHU0RTAwXHU0RTJBXHU5ODg2XHU1N0RGXHU2QTIxXHU1NzU3IFRhZ1x1RkYxQlxuICogLSBcdThGRDRcdTU2REVcdTc2ODQgTW9kdWxlVGFnIFx1NjVFMlx1NjYyRiBDb250ZXh0LlRhZ1x1RkYwQ1x1NTNDOFx1NjQzQVx1NUUyNiBTaGFwZSBcdTRFMEVcdTVERTVcdTUzODJcdTgwRkRcdTUyOUJcdTMwMDJcbiAqXG4gKiBcdThCRjRcdTY2MEVcdUZGMUEwMjIgXHU4RDc3XHU2NUU3IGBNb2R1bGVgXHVGRjA4VGFnIGlkZW50aXR5XHVGRjA5XHU2NkY0XHU1NDBEXHU0RTNBIGBNb2R1bGVUYWdgXHVGRjFCXHU5ODg2XHU1N0RGXHU1QjlBXHU0RTQ5XHU1QkY5XHU4QzYxXHU4QkY3XHU0RjdGXHU3NTI4IGBMb2dpeC5Nb2R1bGVgXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlID0gPFxuICBJZCBleHRlbmRzIHN0cmluZyxcbiAgU1NjaGVtYSBleHRlbmRzIEFueVNjaGVtYSxcbiAgQU1hcCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFueVNjaGVtYT5cbj4oXG4gIGlkOiBJZCxcbiAgZGVmOiB7XG4gICAgcmVhZG9ubHkgc3RhdGU6IFNTY2hlbWFcbiAgICByZWFkb25seSBhY3Rpb25zOiBBTWFwXG4gICAgcmVhZG9ubHkgcmVkdWNlcnM/OiBSZWR1Y2Vyc0Zyb21NYXA8U1NjaGVtYSwgQU1hcD5cbiAgICAvKipcbiAgICAgKiB0cmFpdHNcdUZGMUFcbiAgICAgKiAtIFx1NzUyOFx1NEU4RVx1NjMwMlx1OEY3RCBTdGF0ZVRyYWl0U3BlY1x1RkYwOFx1OEJFNlx1ODlDMSBzcGVjcy8wMDAtbW9kdWxlLXRyYWl0cy1ydW50aW1lXHVGRjA5XHUzMDAyXG4gICAgICogLSBcdTVGNTNcdTUyNERcdTVCOUVcdTczQjBcdTRGMUFcdTU3MjggTW9kdWxlVGFnLm1ha2UgXHU5NjM2XHU2QkI1IGJ1aWxkIFByb2dyYW1cdUZGMENcdTVFNzZcdTU3MjggYE1vZHVsZVRhZy5pbXBsZW1lbnRgIFx1NkNFOFx1NTE2NVx1NEUwMFx1NkJCNSBzZXR1cC1vbmx5IExvZ2ljIFx1Njc2NVx1OEMwM1x1NzUyOCBgU3RhdGVUcmFpdC5pbnN0YWxsYFx1MzAwMlxuICAgICAqICAgXHVGRjA4XHU2Q0U4XHVGRjFBXHU4MkU1XHU0RjdGXHU3NTI4IGBNb2R1bGVUYWcubGl2ZWAgXHU3NkY0XHU1MUZBIExheWVyIFx1NEUxNFx1NUUwQ1x1NjcxQlx1NTQyRlx1NzUyOCB0cmFpdHMgXHU4ODRDXHU0RTNBXHVGRjBDXHU4QkY3XHU2NjNFXHU1RjBGXHU1NzI4IGxvZ2ljcyBcdTRFMkRcdThDMDNcdTc1MjggYFN0YXRlVHJhaXQuaW5zdGFsbGBcdUZGMENcdTYyMTZcdTY1MzlcdTc1MjggYE1vZHVsZVRhZy5pbXBsZW1lbnRgXHUzMDAyXHVGRjA5XG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJhaXRzPzogdW5rbm93blxuICB9XG4pOiBNb2R1bGVUYWc8XG4gIElkLFxuICBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD5cbj4gPT4ge1xuICBjb25zdCBtb2R1bGVUYWcgPSBtYWtlSW1wbChpZCwgZGVmKVxuXG4gIHR5cGUgU2ggPSBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD5cblxuICBjb25zdCBzdGF0ZVNjaGVtYSA9IGRlZi5zdGF0ZSBhcyBTY2hlbWEuU2NoZW1hPGFueSwgYW55PlxuICBjb25zdCBtb2R1bGVUcmFpdHNTcGVjID0gZGVmLnRyYWl0cyBhcyBTdGF0ZVRyYWl0LlN0YXRlVHJhaXRTcGVjPGFueT4gfCB1bmRlZmluZWRcbiAgY29uc3QgYmFzZVByb2dyYW06IFN0YXRlVHJhaXRQcm9ncmFtPGFueT4gfCB1bmRlZmluZWQgPSBtb2R1bGVUcmFpdHNTcGVjXG4gICAgPyBTdGF0ZVRyYWl0LmJ1aWxkKHN0YXRlU2NoZW1hIGFzIGFueSwgbW9kdWxlVHJhaXRzU3BlYyBhcyBhbnkpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoYmFzZVByb2dyYW0pIHtcbiAgICAvLyBcdTRGOUIgVHJhaXRMaWZlY3ljbGUvRGVidWcvRGV2dG9vbHMgXHU4QkZCXHU1M0Q2XHVGRjA4XHU1QjlBXHU0RTQ5XHU0RkE3XHU5NjkwXHU4NUNGXHU2OUZEXHU0RjREXHVGRjA5XHUzMDAyXG4gICAgc2V0TW9kdWxlVHJhaXRzUHJvZ3JhbShtb2R1bGVUYWcgYXMgYW55LCBiYXNlUHJvZ3JhbSlcbiAgICBNb2R1bGVUcmFpdHNSZWdpc3RyeS5yZWdpc3Rlck1vZHVsZVByb2dyYW0oaWQsIGJhc2VQcm9ncmFtIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4pXG4gIH1cblxuICAvLyAwMjNcdUZGMUF0cmFpdHMgXHU3Njg0XHUyMDFDXHU1OEYwXHU2NjBFXHU1MTY1XHU1M0UzL1x1NTQwOFx1NUU3Nlx1NTE2NVx1NTNFM1x1MjAxRFx1N0VERlx1NEUwMFx1NjUzNlx1NjU1Qlx1NTIzMCBzZXR1cCBcdTk2MzZcdTZCQjVcdUZGMUFcbiAgLy8gLSBtb2R1bGUtbGV2ZWwgdHJhaXRzIFx1NTE0OFx1NEY1Q1x1NEUzQSBjb250cmlidXRpb24gXHU2Q0U4XHU1MThDXHVGRjFCXG4gIC8vIC0gbG9naWMtbGV2ZWwgXHU5MDFBXHU4RkM3ICQudHJhaXRzLmRlY2xhcmUgXHU2Q0U4XHU1MThDXHVGRjFCXG4gIC8vIC0gXHU2NzAwXHU1NDBFXHU0RTAwXHU2QjIxXHU2MDI3IGZpbmFsaXplIFx1MjE5MiBmcmVlemUgXHUyMTkyIGJ1aWxkL2luc3RhbGxcdTMwMDJcblxuICBjb25zdCBtYWtlTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uTG9naWMgPSAoXG4gICAgdHJhaXRzOiB1bmtub3duLFxuICApOiBNb2R1bGVMb2dpYzxTaCwgbmV2ZXIsIG5ldmVyPiA9PiB7XG4gICAgY29uc3QgbG9naWMgPSBtb2R1bGVUYWcubG9naWMoKCQpID0+ICh7XG4gICAgICBzZXR1cDogRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgICBpZiAoIXRyYWl0cyB8fCB0eXBlb2YgdHJhaXRzICE9PSBcIm9iamVjdFwiKSByZXR1cm5cbiAgICAgICAgLy8gbW9kdWxlLWxldmVsIHByb3ZlbmFuY2VcdUZGMUFcdTRFRTUgbW9kdWxlSWQgXHU0RjVDXHU0RTNBXHU3QTMzXHU1QjlBXHU5NTFBXHU3MEI5XG4gICAgICAgIC8vXHVGRjA4XHU1QkY5XHU5RjUwIDAyMyBkYXRhLW1vZGVsXHVGRjFBb3JpZ2luVHlwZT1tb2R1bGUsIG9yaWdpbklkPW1vZHVsZUlkXHVGRjA5XHUzMDAyXG4gICAgICAgIC8vIFx1NkNFOFx1NjEwRlx1RkYxQXRyYWl0c1NwZWMgXHU0RUNEXHU1OTBEXHU3NTI4IFN0YXRlVHJhaXRTcGVjIFx1N0VEM1x1Njc4NFx1RkYwQ1x1NEUwRFx1NUYxNVx1NTE2NVx1N0IyQ1x1NEU4Q1x1NTk1NyBJUlx1MzAwMlxuICAgICAgICBjb25zdCBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscygkIGFzIGFueSlcbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5yZWdpc3Rlck1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbih7XG4gICAgICAgICAgdHJhaXRzLFxuICAgICAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAgICAgIG9yaWdpblR5cGU6IFwibW9kdWxlXCIsXG4gICAgICAgICAgICBvcmlnaW5JZDogaWQsXG4gICAgICAgICAgICBvcmlnaW5JZEtpbmQ6IFwiZXhwbGljaXRcIixcbiAgICAgICAgICAgIG9yaWdpbkxhYmVsOiBgbW9kdWxlOiR7aWR9YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICBydW46IEVmZmVjdC52b2lkLFxuICAgIH0pKSBhcyBNb2R1bGVMb2dpYzxTaCwgbmV2ZXIsIG5ldmVyPlxuXG4gICAgTG9naWNVbml0TWV0YS5hdHRhY2hMb2dpY1VuaXRNZXRhKGxvZ2ljIGFzIGFueSwge1xuICAgICAgaWQ6IFwiX19sb2dpeF9pbnRlcm5hbDp0cmFpdHM6bW9kdWxlX2NvbnRyaWJcIixcbiAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgIG5hbWU6IFwidHJhaXRzOm1vZHVsZV9jb250cmliXCIsXG4gICAgICBtb2R1bGVJZDogaWQsXG4gICAgfSlcbiAgICByZXR1cm4gbG9naWNcbiAgfVxuXG4gIGNvbnN0IG1ha2VGaW5hbGl6ZVRyYWl0c0xvZ2ljID0gKCk6IE1vZHVsZUxvZ2ljPFNoLCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgICBjb25zdCBsb2dpYyA9IG1vZHVsZVRhZy5sb2dpYygoJCkgPT4gKHtcbiAgICAgIHNldHVwOiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGludGVybmFscyA9IGdldEJvdW5kSW50ZXJuYWxzKCQgYXMgYW55KVxuICAgICAgICBjb25zdCBkaWFnbm9zdGljc0xldmVsID0geWllbGQqIEZpYmVyUmVmLmdldChEZWJ1Zy5jdXJyZW50RGlhZ25vc3RpY3NMZXZlbClcblxuICAgICAgICBjb25zdCBjb250cmlidXRpb25zID0gaW50ZXJuYWxzLnRyYWl0cy5nZXRNb2R1bGVUcmFpdHNDb250cmlidXRpb25zKClcbiAgICAgICAgbGV0IG1lcmdlZDogTW9kdWxlVHJhaXRzLlRyYWl0U3BlY1xuICAgICAgICBsZXQgc25hcHNob3Q6IE1vZHVsZVRyYWl0cy5Nb2R1bGVUcmFpdHNTbmFwc2hvdFxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgOyh7IG1lcmdlZCwgc25hcHNob3QgfSA9IE1vZHVsZVRyYWl0cy5maW5hbGl6ZVRyYWl0Q29udHJpYnV0aW9ucyh7XG4gICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICBjb250cmlidXRpb25zLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRpYWdub3N0aWNzTGV2ZWwgIT09IFwib2ZmXCIgJiZcbiAgICAgICAgICAgIGNhdXNlICYmXG4gICAgICAgICAgICB0eXBlb2YgY2F1c2UgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIChjYXVzZSBhcyBhbnkpLl90YWcgPT09IFwiTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBjb25mbGljdHMgPSBBcnJheS5pc0FycmF5KChjYXVzZSBhcyBhbnkpLmNvbmZsaWN0cylcbiAgICAgICAgICAgICAgPyAoKGNhdXNlIGFzIGFueSkuY29uZmxpY3RzIGFzIFJlYWRvbmx5QXJyYXk8dW5rbm93bj4pXG4gICAgICAgICAgICAgIDogW11cbiAgICAgICAgICAgIGNvbnN0IHRyYWl0SWRzID0gY29uZmxpY3RzXG4gICAgICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gKGMgJiYgdHlwZW9mIGMgPT09IFwib2JqZWN0XCIgPyAoYyBhcyBhbnkpLnRyYWl0SWQgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgICAuZmlsdGVyKCh0KTogdCBpcyBzdHJpbmcgPT4gdHlwZW9mIHQgPT09IFwic3RyaW5nXCIgJiYgdC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAuc2xpY2UoMCwgMjApXG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPVxuICAgICAgICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSBcImZ1bGxcIlxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBjb25mbGljdENvdW50OiBjb25mbGljdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBjb25mbGljdHMsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0Q291bnQ6IGNvbmZsaWN0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHRyYWl0SWRzLFxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0cmFjZTptb2R1bGU6dHJhaXRzOmNvbmZsaWN0XCIsXG4gICAgICAgICAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaW50ZXJuYWxzLmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBjYXVzZVxuICAgICAgICB9XG5cbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5zZXRNb2R1bGVUcmFpdHNTbmFwc2hvdChzbmFwc2hvdClcbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5mcmVlemVNb2R1bGVUcmFpdHMoKVxuXG4gICAgICAgIGlmIChkaWFnbm9zdGljc0xldmVsICE9PSBcIm9mZlwiKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9XG4gICAgICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSBcImZ1bGxcIlxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIGRpZ2VzdDogc25hcHNob3QuZGlnZXN0LFxuICAgICAgICAgICAgICAgICAgY291bnQ6IHNuYXBzaG90LnRyYWl0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICB0cmFpdHM6IHNuYXBzaG90LnRyYWl0cyxcbiAgICAgICAgICAgICAgICAgIHByb3ZlbmFuY2VJbmRleDogc25hcHNob3QucHJvdmVuYW5jZUluZGV4LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBkaWdlc3Q6IHNuYXBzaG90LmRpZ2VzdCxcbiAgICAgICAgICAgICAgICAgIGNvdW50OiBzbmFwc2hvdC50cmFpdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgICAgdHlwZTogXCJ0cmFjZTptb2R1bGU6dHJhaXRzXCIsXG4gICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICBpbnN0YW5jZUlkOiBpbnRlcm5hbHMuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWVyZ2VkKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9ubHlNb2R1bGVMZXZlbCA9XG4gICAgICAgICAgY29udHJpYnV0aW9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICBjb250cmlidXRpb25zWzBdPy5wcm92ZW5hbmNlPy5vcmlnaW5UeXBlID09PSBcIm1vZHVsZVwiXG5cbiAgICAgICAgLy8gXHU1N0ZBXHU0RThFXHU2NzAwXHU3RUM4XHU1NDA4XHU1RTc2XHU1NDBFXHU3Njg0IFNwZWMgXHU2Nzg0XHU5MDIwXHU0RTAwXHU2QjIxXHU2MDI3IFByb2dyYW1cdUZGMENcdTVFNzZcdTU3MjhcdTUyMURcdTU5Q0JcdTUzMTZcdTk2MzZcdTZCQjVcdTVCODlcdTg4QzVcdTMwMDJcbiAgICAgICAgLy8gLSBcdTgyRTVcdTUzRUFcdTY3MDkgbW9kdWxlLWxldmVsIGNvbnRyaWJ1dGlvblx1RkYwQ1x1NTIxOVx1NTkwRFx1NzUyOCBNb2R1bGVUYWcubWFrZSBcdTk2MzZcdTZCQjVcdTk4ODRcdTY3ODRcdTVFRkFcdTc2ODQgcHJvZ3JhbVx1RkYwOFx1NEZCRlx1NEU4RSBEZWJ1Zy9UcmFpdExpZmVjeWNsZVx1RkYwOVx1MzAwMlxuICAgICAgICBjb25zdCBwcm9ncmFtID1cbiAgICAgICAgICBvbmx5TW9kdWxlTGV2ZWwgJiYgYmFzZVByb2dyYW1cbiAgICAgICAgICAgID8gYmFzZVByb2dyYW1cbiAgICAgICAgICAgIDogU3RhdGVUcmFpdC5idWlsZChzdGF0ZVNjaGVtYSBhcyBhbnksIG1lcmdlZCBhcyBhbnkpXG5cbiAgICAgICAgLy8gXHU0RjlCIFRyYWl0TGlmZWN5Y2xlL0RlYnVnL0RldnRvb2xzIFx1OEJGQlx1NTNENlx1RkYwOFx1NUI5QVx1NEU0OVx1NEZBN1x1OTY5MFx1ODVDRlx1NjlGRFx1NEY0RFx1RkYwOVx1MzAwMlxuICAgICAgICBzZXRNb2R1bGVUcmFpdHNQcm9ncmFtKG1vZHVsZVRhZyBhcyBhbnksIHByb2dyYW0pXG4gICAgICAgIE1vZHVsZVRyYWl0c1JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxlUHJvZ3JhbShpZCwgcHJvZ3JhbSBhcyBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+KVxuXG4gICAgICAgIHlpZWxkKiBTdGF0ZVRyYWl0Lmluc3RhbGwoJCBhcyB1bmtub3duIGFzIEJvdW5kQXBpPGFueSwgYW55PiwgcHJvZ3JhbSlcbiAgICAgIH0pLFxuICAgICAgcnVuOiBFZmZlY3Qudm9pZCxcbiAgICB9KSkgYXMgTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj5cblxuICAgIExvZ2ljVW5pdE1ldGEuYXR0YWNoTG9naWNVbml0TWV0YShsb2dpYyBhcyBhbnksIHtcbiAgICAgIGlkOiBcIl9fbG9naXhfaW50ZXJuYWw6dHJhaXRzOmZpbmFsaXplXCIsXG4gICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICBuYW1lOiBcInRyYWl0czpmaW5hbGl6ZVwiLFxuICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgIH0pXG5cbiAgICByZXR1cm4gbG9naWNcbiAgfVxuXG4gIC8vIFx1NTMwNVx1ODhDNSBpbXBsZW1lbnRcdUZGMUFcdTU3MjhcdTVCOUVcdTczQjBcdTVDNDJcdTZDRThcdTUxNjVcdUZGMDgxXHVGRjA5bW9kdWxlLWxldmVsIGNvbnRyaWJ1dGlvbiBsb2dpY1x1RkYwOFx1NTNFRlx1OTAwOVx1RkYwOVx1RkYwODJcdUZGMDlmaW5hbGl6ZStpbnN0YWxsIGxvZ2ljXHVGRjA4XHU1RkM1XHU5MDA5XHVGRjA5XHUzMDAyXG4gIGNvbnN0IG9yaWdpbmFsSW1wbGVtZW50ID0gbW9kdWxlVGFnLmltcGxlbWVudFxuICA7KG1vZHVsZVRhZyBhcyBhbnkpLmltcGxlbWVudCA9ICg8UiA9IG5ldmVyPihjb25maWc6IHtcbiAgICBpbml0aWFsOiBTdGF0ZU9mPHR5cGVvZiBtb2R1bGVUYWcuc2hhcGU+XG4gICAgbG9naWNzPzogQXJyYXk8TW9kdWxlTG9naWM8dHlwZW9mIG1vZHVsZVRhZy5zaGFwZSwgUiwgYW55Pj5cbiAgICBpbXBvcnRzPzogUmVhZG9ubHlBcnJheTxcbiAgICAgIExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+IHwgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+XG4gICAgPlxuICAgIHByb2Nlc3Nlcz86IFJlYWRvbmx5QXJyYXk8RWZmZWN0LkVmZmVjdDx2b2lkLCBhbnksIGFueT4+XG4gIH0pID0+IHtcbiAgICBjb25zdCB1c2VyTG9naWNzID0gKGNvbmZpZy5sb2dpY3MgPz8gW10pIGFzIEFycmF5PE1vZHVsZUxvZ2ljPFxuICAgICAgdHlwZW9mIG1vZHVsZVRhZy5zaGFwZSxcbiAgICAgIFIsXG4gICAgICBhbnlcbiAgICA+PlxuXG4gICAgY29uc3QgbW9kdWxlTGV2ZWwgPVxuICAgICAgZGVmLnRyYWl0cyA/IFttYWtlTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uTG9naWMoZGVmLnRyYWl0cykgYXMgYW55XSA6IFtdXG5cbiAgICBjb25zdCBmaW5hbGl6ZSA9IG1ha2VGaW5hbGl6ZVRyYWl0c0xvZ2ljKCkgYXMgTW9kdWxlTG9naWM8XG4gICAgICB0eXBlb2YgbW9kdWxlVGFnLnNoYXBlLFxuICAgICAgUixcbiAgICAgIGFueVxuICAgID5cblxuICAgIGNvbnN0IG1lcmdlZExvZ2ljcyA9IFsuLi5tb2R1bGVMZXZlbCwgLi4udXNlckxvZ2ljcywgZmluYWxpemVdXG5cbiAgICByZXR1cm4gb3JpZ2luYWxJbXBsZW1lbnQ8Uj4oe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgbG9naWNzOiBtZXJnZWRMb2dpY3MsXG4gICAgfSlcbiAgfSkgYXMgdHlwZW9mIG1vZHVsZVRhZy5pbXBsZW1lbnRcblxuICByZXR1cm4gbW9kdWxlVGFnXG59XG4iLCAiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSBcIi4uLy4uL2RpZ2VzdC5qc1wiXG5cbmV4cG9ydCB0eXBlIFRyYWl0SWQgPSBzdHJpbmdcblxuZXhwb3J0IHR5cGUgVHJhaXRPcmlnaW5UeXBlID0gXCJtb2R1bGVcIiB8IFwibG9naWNVbml0XCJcbmV4cG9ydCB0eXBlIFRyYWl0T3JpZ2luSWRLaW5kID0gXCJleHBsaWNpdFwiIHwgXCJkZXJpdmVkXCJcblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdFByb3ZlbmFuY2Uge1xuICByZWFkb25seSBvcmlnaW5UeXBlOiBUcmFpdE9yaWdpblR5cGVcbiAgcmVhZG9ubHkgb3JpZ2luSWQ6IHN0cmluZ1xuICByZWFkb25seSBvcmlnaW5JZEtpbmQ6IFRyYWl0T3JpZ2luSWRLaW5kXG4gIC8qKlxuICAgKiBcdTdFRDkgRGV2dG9vbHMvXHU5NTE5XHU4QkVGXHU0RkUxXHU2MDZGXHU1QzU1XHU3OTNBXHU3Njg0XHU1M0VGXHU4QkZCXHU2ODA3XHU3QjdFXHVGRjA4XHU0RjhCXHU1OTgyIFwibG9naWNVbml0OlByb2ZpbGUjMVwiXHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5MYWJlbDogc3RyaW5nXG4gIC8qKlxuICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTU4RjBcdTY2MEVcdTRGNERcdTdGNkVcdTY0NThcdTg5ODFcdUZGMDhcdTRGOEJcdTU5ODJcdTY1ODdcdTRFRjZcdThERUZcdTVGODQvXHU4QzAzXHU3NTI4XHU3MEI5XHVGRjA5XHVGRjBDXHU0RUM1XHU3NTI4XHU0RThFXHU1QjlBXHU0RjREXHVGRjBDXHU0RTBEXHU1M0MyXHU0RTBFXHU4QkVEXHU0RTQ5XHU4OEMxXHU1MUIzXHUzMDAyXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nXG59XG5cbi8qKlxuICogVHJhaXRTcGVjXHVGRjFBXG4gKiAtIFx1NEY1Q1x1NEUzQVx1MjAxQ3RyYWl0cyBcdTU4RjBcdTY2MEVcdTIwMURcdTc2ODRcdTY3MDBcdTVDMEZcdTVGNjJcdTYwMDFcdUZGMUFcdTRFMDBcdTdFQzRcdTRFRTUgdHJhaXRJZCBcdTRFM0Ega2V5IFx1NzY4NFx1NThGMFx1NjYwRVx1NUJGOVx1OEM2MVx1RkYxQlxuICogLSBcdTUxNzdcdTRGNTMgdmFsdWUgXHU1RjYyXHU2MDAxXHU3NTMxXHU1MTc3XHU0RjUzIHRyYWl0IFx1N0NGQlx1N0VERlx1RkYwOFx1NTk4MiBTdGF0ZVRyYWl0U3BlY1x1RkYwOVx1NTFCM1x1NUI5QVx1RkYxQlxuICogLSBcdThGRDlcdTkxQ0NcdTRFMERcdTdFQTZcdTY3NUYgdmFsdWUgXHU3Njg0XHU1M0VGXHU1RThGXHU1MjE3XHU1MzE2XHU2MDI3XHVGRjA4XHU4RkQwXHU4ODRDXHU2NzFGIGluc3RhbGwgXHU1M0VGXHU4MEZEXHU0RjlEXHU4RDU2XHU1MUZEXHU2NTcwXHVGRjA5XHVGRjBDXHU0RjQ2IFNuYXBzaG90L1x1OEJDMVx1NjM2RVx1NUJGQ1x1NTFGQVx1NUZDNVx1OTg3Qlx1NTNFQVx1NTNENlx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1NUI1MFx1OTZDNlx1MzAwMlxuICovXG5leHBvcnQgdHlwZSBUcmFpdFNwZWMgPSBvYmplY3RcblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnRyaWJ1dGlvbiB7XG4gIHJlYWRvbmx5IHRyYWl0czogVHJhaXRTcGVjXG4gIHJlYWRvbmx5IHByb3ZlbmFuY2U6IFRyYWl0UHJvdmVuYW5jZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVRyYWl0SXRlbSB7XG4gIHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWRcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFRyYWl0Q29uZmxpY3RLaW5kID1cbiAgfCBcImR1cGxpY2F0ZV90cmFpdElkXCJcbiAgfCBcIm1pc3NpbmdfcmVxdWlyZXNcIlxuICB8IFwiZXhjbHVkZXNfdmlvbGF0aW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbmZsaWN0IHtcbiAgcmVhZG9ubHkga2luZDogVHJhaXRDb25mbGljdEtpbmRcbiAgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZFxuICByZWFkb25seSBzb3VyY2VzOiBSZWFkb25seUFycmF5PFRyYWl0UHJvdmVuYW5jZT5cbiAgcmVhZG9ubHkgbWlzc2luZz86IFJlYWRvbmx5QXJyYXk8VHJhaXRJZD5cbiAgcmVhZG9ubHkgcHJlc2VudD86IFJlYWRvbmx5QXJyYXk8VHJhaXRJZD5cbn1cblxuZXhwb3J0IGNsYXNzIE1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWcgPSBcIk1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3JcIlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgY29uZmxpY3RzOiBSZWFkb25seUFycmF5PFRyYWl0Q29uZmxpY3Q+LFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIFtcbiAgICAgICAgYFtNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yXSBDb25mbGljdGluZyB0cmFpdElkcyBmb3VuZCAobW9kdWxlSWQ9JHttb2R1bGVJZH0pLmAsXG4gICAgICAgIC4uLmNvbmZsaWN0cy5tYXAoXG4gICAgICAgICAgKGMpID0+XG4gICAgICAgICAgICBjLmtpbmQgPT09IFwiZHVwbGljYXRlX3RyYWl0SWRcIlxuICAgICAgICAgICAgICA/IGAtIGR1cGxpY2F0ZSAke2MudHJhaXRJZH06ICR7Yy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBgJHtzLm9yaWdpblR5cGV9OiR7cy5vcmlnaW5JZH1gKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICAgICAgIDogYy5raW5kID09PSBcIm1pc3NpbmdfcmVxdWlyZXNcIlxuICAgICAgICAgICAgICAgID8gYC0gbWlzc2luZyByZXF1aXJlcyBmb3IgJHtjLnRyYWl0SWR9OiAkeyhjLm1pc3NpbmcgPz8gW10pLmpvaW4oXCIsIFwiKX07IHNvdXJjZXM9JHtjLnNvdXJjZXNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgocykgPT4gYCR7cy5vcmlnaW5UeXBlfToke3Mub3JpZ2luSWR9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICAgICAgICAgOiBgLSBleGNsdWRlcyB2aW9sYXRpb24gZm9yICR7Yy50cmFpdElkfTogcHJlc2VudD0keyhjLnByZXNlbnQgPz8gW10pLmpvaW4oXCIsIFwiKX07IHNvdXJjZXM9JHtjLnNvdXJjZXNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgocykgPT4gYCR7cy5vcmlnaW5UeXBlfToke3Mub3JpZ2luSWR9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICApLFxuICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVRyYWl0c1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xuICByZWFkb25seSB0cmFpdHM6IFJlYWRvbmx5QXJyYXk8TW9kdWxlVHJhaXRJdGVtPlxuICByZWFkb25seSBwcm92ZW5hbmNlSW5kZXg6IFJlY29yZDxUcmFpdElkLCBUcmFpdFByb3ZlbmFuY2U+XG59XG5cbmNvbnN0IHRvUHJvdmVuYW5jZUtleSA9IChwOiBUcmFpdFByb3ZlbmFuY2UpOiBzdHJpbmcgPT5cbiAgYCR7cC5vcmlnaW5UeXBlfToke3Aub3JpZ2luSWR9OiR7cC5vcmlnaW5JZEtpbmR9OiR7cC5vcmlnaW5MYWJlbH06JHtwLnBhdGggPz8gXCJcIn1gXG5cbmNvbnN0IGNvbXBhcmVQcm92ZW5hbmNlID0gKGE6IFRyYWl0UHJvdmVuYW5jZSwgYjogVHJhaXRQcm92ZW5hbmNlKTogbnVtYmVyID0+IHtcbiAgY29uc3QgdHlwZSA9IGEub3JpZ2luVHlwZS5sb2NhbGVDb21wYXJlKGIub3JpZ2luVHlwZSlcbiAgaWYgKHR5cGUgIT09IDApIHJldHVybiB0eXBlXG4gIGNvbnN0IGlkID0gYS5vcmlnaW5JZC5sb2NhbGVDb21wYXJlKGIub3JpZ2luSWQpXG4gIGlmIChpZCAhPT0gMCkgcmV0dXJuIGlkXG4gIGNvbnN0IGtpbmQgPSBhLm9yaWdpbklkS2luZC5sb2NhbGVDb21wYXJlKGIub3JpZ2luSWRLaW5kKVxuICBpZiAoa2luZCAhPT0gMCkgcmV0dXJuIGtpbmRcbiAgY29uc3QgbGFiZWwgPSBhLm9yaWdpbkxhYmVsLmxvY2FsZUNvbXBhcmUoYi5vcmlnaW5MYWJlbClcbiAgaWYgKGxhYmVsICE9PSAwKSByZXR1cm4gbGFiZWxcbiAgcmV0dXJuIFN0cmluZyhhLnBhdGggPz8gXCJcIikubG9jYWxlQ29tcGFyZShTdHJpbmcoYi5wYXRoID8/IFwiXCIpKVxufVxuXG5jb25zdCBvcmlnaW5UeXBlT3JkZXIgPSAodDogVHJhaXRPcmlnaW5UeXBlKTogbnVtYmVyID0+XG4gIHQgPT09IFwibW9kdWxlXCIgPyAwIDogMVxuXG5jb25zdCBjb21wYXJlVHJhaXRJZEJ5UHJvdmVuYW5jZSA9IChcbiAgYTogeyByZWFkb25seSB0cmFpdElkOiBUcmFpdElkOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfSxcbiAgYjogeyByZWFkb25seSB0cmFpdElkOiBUcmFpdElkOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfSxcbik6IG51bWJlciA9PiB7XG4gIGNvbnN0IHRhID0gb3JpZ2luVHlwZU9yZGVyKGEucHJvdmVuYW5jZS5vcmlnaW5UeXBlKSAtIG9yaWdpblR5cGVPcmRlcihiLnByb3ZlbmFuY2Uub3JpZ2luVHlwZSlcbiAgaWYgKHRhICE9PSAwKSByZXR1cm4gdGFcbiAgY29uc3Qgb2EgPSBhLnByb3ZlbmFuY2Uub3JpZ2luSWQubG9jYWxlQ29tcGFyZShiLnByb3ZlbmFuY2Uub3JpZ2luSWQpXG4gIGlmIChvYSAhPT0gMCkgcmV0dXJuIG9hXG4gIHJldHVybiBhLnRyYWl0SWQubG9jYWxlQ29tcGFyZShiLnRyYWl0SWQpXG59XG5cbmNvbnN0IGV4dHJhY3RTdHJpbmdBcnJheSA9ICh2YWx1ZTogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXVxuICBjb25zdCBvdXQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBmb3IgKGNvbnN0IHYgb2YgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIGNvbnRpbnVlXG4gICAgY29uc3QgcyA9IHYudHJpbSgpXG4gICAgaWYgKCFzKSBjb250aW51ZVxuICAgIG91dC5wdXNoKHMpXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBnZXRUcmFpdFJlcXVpcmVzID0gKHZhbHVlOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxUcmFpdElkPiA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLnJlcXVpcmVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0RXhjbHVkZXMgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PFRyYWl0SWQ+ID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBbXVxuICBjb25zdCBkaXJlY3QgPSBleHRyYWN0U3RyaW5nQXJyYXkoKHZhbHVlIGFzIGFueSkuZXhjbHVkZXMpXG4gIHJldHVybiBkaXJlY3Rcbn1cblxuY29uc3QgZ2V0VHJhaXROYW1lID0gKHRyYWl0SWQ6IFRyYWl0SWQsIHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG4gPSAodmFsdWUgYXMgYW55KS5uYW1lXG4gICAgaWYgKHR5cGVvZiBuID09PSBcInN0cmluZ1wiICYmIG4udHJpbSgpLmxlbmd0aCA+IDApIHJldHVybiBuLnRyaW0oKVxuICB9XG4gIHJldHVybiB0cmFpdElkXG59XG5cbmNvbnN0IGdldFRyYWl0RGVzY3JpcHRpb24gPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgZCA9ICh2YWx1ZSBhcyBhbnkpLmRlc2NyaXB0aW9uXG4gICAgaWYgKHR5cGVvZiBkID09PSBcInN0cmluZ1wiICYmIGQudHJpbSgpLmxlbmd0aCA+IDApIHJldHVybiBkLnRyaW0oKVxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IGZpbmFsaXplVHJhaXRDb250cmlidXRpb25zID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBjb250cmlidXRpb25zOiBSZWFkb25seUFycmF5PFRyYWl0Q29udHJpYnV0aW9uPlxufSk6IHsgcmVhZG9ubHkgbWVyZ2VkOiBUcmFpdFNwZWM7IHJlYWRvbmx5IHNuYXBzaG90OiBNb2R1bGVUcmFpdHNTbmFwc2hvdCB9ID0+IHtcbiAgY29uc3QgdHJhaXRCeUlkID0gbmV3IE1hcDxcbiAgICBUcmFpdElkLFxuICAgIHsgcmVhZG9ubHkgdmFsdWU6IHVua25vd247IHJlYWRvbmx5IHByb3ZlbmFuY2U6IFRyYWl0UHJvdmVuYW5jZSB9XG4gID4oKVxuXG4gIGNvbnN0IGR1cGxpY2F0ZVNvdXJjZXMgPSBuZXcgTWFwPFRyYWl0SWQsIEFycmF5PFRyYWl0UHJvdmVuYW5jZT4+KClcblxuICBjb25zdCBjb250cmlidXRpb25zID0gWy4uLmFyZ3MuY29udHJpYnV0aW9uc10uc29ydCgoYSwgYikgPT5cbiAgICBjb21wYXJlUHJvdmVuYW5jZShhLnByb3ZlbmFuY2UsIGIucHJvdmVuYW5jZSksXG4gIClcblxuICBmb3IgKGNvbnN0IGMgb2YgY29udHJpYnV0aW9ucykge1xuICAgIGNvbnN0IHRyYWl0cyA9IGMudHJhaXRzXG4gICAgaWYgKCF0cmFpdHMgfHwgdHlwZW9mIHRyYWl0cyAhPT0gXCJvYmplY3RcIikgY29udGludWVcbiAgICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgT2JqZWN0LmtleXModHJhaXRzKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9ICh0cmFpdHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3RyYWl0SWRdXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgY29uc3QgcHJldiA9IHRyYWl0QnlJZC5nZXQodHJhaXRJZClcbiAgICAgIGlmICghcHJldikge1xuICAgICAgICB0cmFpdEJ5SWQuc2V0KHRyYWl0SWQsIHsgdmFsdWUsIHByb3ZlbmFuY2U6IGMucHJvdmVuYW5jZSB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VzID0gZHVwbGljYXRlU291cmNlcy5nZXQodHJhaXRJZCkgPz8gW3ByZXYucHJvdmVuYW5jZV1cbiAgICAgIHNvdXJjZXMucHVzaChjLnByb3ZlbmFuY2UpXG4gICAgICBkdXBsaWNhdGVTb3VyY2VzLnNldCh0cmFpdElkLCBzb3VyY2VzKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmZsaWN0czogQXJyYXk8VHJhaXRDb25mbGljdD4gPSBbXVxuICBjb25zdCByZWdpc3RlckNvbmZsaWN0ID0gKGNvbmZsaWN0OiBUcmFpdENvbmZsaWN0KSA9PiB7XG4gICAgY29uc3QgdW5pcXVlID0gbmV3IE1hcDxzdHJpbmcsIFRyYWl0UHJvdmVuYW5jZT4oKVxuICAgIGZvciAoY29uc3QgcyBvZiBjb25mbGljdC5zb3VyY2VzKSB7XG4gICAgICB1bmlxdWUuc2V0KHRvUHJvdmVuYW5jZUtleShzKSwgcylcbiAgICB9XG4gICAgY29uZmxpY3RzLnB1c2goe1xuICAgICAgLi4uY29uZmxpY3QsXG4gICAgICBzb3VyY2VzOiBBcnJheS5mcm9tKHVuaXF1ZS52YWx1ZXMoKSkuc29ydChjb21wYXJlUHJvdmVuYW5jZSksXG4gICAgfSlcbiAgfVxuXG4gIC8vIDEpIGR1cGxpY2F0ZSB0cmFpdElkIGNvbmZsaWN0c1xuICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgQXJyYXkuZnJvbShkdXBsaWNhdGVTb3VyY2VzLmtleXMoKSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSkge1xuICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAga2luZDogXCJkdXBsaWNhdGVfdHJhaXRJZFwiLFxuICAgICAgdHJhaXRJZCxcbiAgICAgIHNvdXJjZXM6IGR1cGxpY2F0ZVNvdXJjZXMuZ2V0KHRyYWl0SWQpID8/IFtdLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgY29uc3QgcHJvdmVuYW5jZUluZGV4OiBSZWNvcmQ8c3RyaW5nLCBUcmFpdFByb3ZlbmFuY2U+ID0ge31cbiAgY29uc3QgdHJhaXRzOiBBcnJheTxNb2R1bGVUcmFpdEl0ZW0+ID0gW11cblxuICBjb25zdCBlbnRyaWVzOiBBcnJheTx7IHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWQ7IHJlYWRvbmx5IHZhbHVlOiB1bmtub3duOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfT4gPSBbXVxuICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgdHJhaXRCeUlkLmtleXMoKSkge1xuICAgIGNvbnN0IGVudHJ5ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG4gICAgZW50cmllcy5wdXNoKHsgdHJhaXRJZCwgdmFsdWU6IGVudHJ5LnZhbHVlLCBwcm92ZW5hbmNlOiBlbnRyeS5wcm92ZW5hbmNlIH0pXG4gIH1cblxuICBjb25zdCBpZHMgPSBlbnRyaWVzXG4gICAgLnNsaWNlKClcbiAgICAuc29ydChjb21wYXJlVHJhaXRJZEJ5UHJvdmVuYW5jZSlcbiAgICAubWFwKChlKSA9PiBlLnRyYWl0SWQpXG5cbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIGlkcykge1xuICAgIGNvbnN0IGVudHJ5ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG4gICAgbWVyZ2VkW3RyYWl0SWRdID0gZW50cnkudmFsdWVcbiAgICBwcm92ZW5hbmNlSW5kZXhbdHJhaXRJZF0gPSBlbnRyeS5wcm92ZW5hbmNlXG4gICAgdHJhaXRzLnB1c2goe1xuICAgICAgdHJhaXRJZCxcbiAgICAgIG5hbWU6IGdldFRyYWl0TmFtZSh0cmFpdElkLCBlbnRyeS52YWx1ZSksXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0VHJhaXREZXNjcmlwdGlvbihlbnRyeS52YWx1ZSksXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIpIGNvbnNpc3RlbmN5IGNoZWNrcyAoRlItMDA3KTogcmVxdWlyZXMgLyBleGNsdWRlc1xuICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChpZHMpXG5cbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIGlkcykge1xuICAgIGNvbnN0IGVudHJ5ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCByZXF1aXJlcyA9IGdldFRyYWl0UmVxdWlyZXMoZW50cnkudmFsdWUpXG4gICAgaWYgKHJlcXVpcmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlcy5maWx0ZXIoKHIpID0+ICFwcmVzZW50LmhhcyhyKSlcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnaXN0ZXJDb25mbGljdCh7XG4gICAgICAgICAga2luZDogXCJtaXNzaW5nX3JlcXVpcmVzXCIsXG4gICAgICAgICAgdHJhaXRJZCxcbiAgICAgICAgICBtaXNzaW5nOiBBcnJheS5mcm9tKG5ldyBTZXQobWlzc2luZykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgICAgICAgc291cmNlczogW2VudHJ5LnByb3ZlbmFuY2VdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4Y2x1ZGVzID0gZ2V0VHJhaXRFeGNsdWRlcyhlbnRyeS52YWx1ZSlcbiAgICBpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJlc2VudEV4Y2x1ZGVkID0gZXhjbHVkZXMuZmlsdGVyKChlKSA9PiBwcmVzZW50LmhhcyhlKSlcbiAgICAgIGlmIChwcmVzZW50RXhjbHVkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBvdGhlclNvdXJjZXM6IEFycmF5PFRyYWl0UHJvdmVuYW5jZT4gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IG90aGVySWQgb2YgcHJlc2VudEV4Y2x1ZGVkKSB7XG4gICAgICAgICAgY29uc3Qgb3RoZXIgPSB0cmFpdEJ5SWQuZ2V0KG90aGVySWQpXG4gICAgICAgICAgaWYgKG90aGVyKSBvdGhlclNvdXJjZXMucHVzaChvdGhlci5wcm92ZW5hbmNlKVxuICAgICAgICB9XG4gICAgICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAgICAgIGtpbmQ6IFwiZXhjbHVkZXNfdmlvbGF0aW9uXCIsXG4gICAgICAgICAgdHJhaXRJZCxcbiAgICAgICAgICBwcmVzZW50OiBBcnJheS5mcm9tKG5ldyBTZXQocHJlc2VudEV4Y2x1ZGVkKSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSxcbiAgICAgICAgICBzb3VyY2VzOiBbZW50cnkucHJvdmVuYW5jZSwgLi4ub3RoZXJTb3VyY2VzXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmxpY3RzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBraW5kT3JkZXI6IFJlY29yZDxUcmFpdENvbmZsaWN0S2luZCwgbnVtYmVyPiA9IHtcbiAgICAgIGR1cGxpY2F0ZV90cmFpdElkOiAwLFxuICAgICAgbWlzc2luZ19yZXF1aXJlczogMSxcbiAgICAgIGV4Y2x1ZGVzX3Zpb2xhdGlvbjogMixcbiAgICB9XG4gICAgY29uZmxpY3RzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGsgPSBraW5kT3JkZXJbYS5raW5kXSAtIGtpbmRPcmRlcltiLmtpbmRdXG4gICAgICBpZiAoayAhPT0gMCkgcmV0dXJuIGtcbiAgICAgIHJldHVybiBhLnRyYWl0SWQubG9jYWxlQ29tcGFyZShiLnRyYWl0SWQpXG4gICAgfSlcbiAgICB0aHJvdyBuZXcgTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvcihhcmdzLm1vZHVsZUlkLCBjb25mbGljdHMpXG4gIH1cblxuICBjb25zdCBkaWdlc3RCYXNlID0ge1xuICAgIG1vZHVsZUlkOiBhcmdzLm1vZHVsZUlkLFxuICAgIHRyYWl0cyxcbiAgICBwcm92ZW5hbmNlSW5kZXgsXG4gIH0gYXMgY29uc3RcblxuICBjb25zdCBkaWdlc3QgPSBgbXRyYWl0czowMjM6JHtmbnYxYTMyKHN0YWJsZVN0cmluZ2lmeShkaWdlc3RCYXNlKSl9YFxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VkLFxuICAgIHNuYXBzaG90OiB7XG4gICAgICBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCxcbiAgICAgIGRpZ2VzdCxcbiAgICAgIHRyYWl0cyxcbiAgICAgIHByb3ZlbmFuY2VJbmRleCxcbiAgICB9LFxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsUUFBUSxnQkFBK0I7OztBQ3FEekMsSUFBTSw0QkFBTixjQUF3QyxNQUFNO0FBQUEsRUFHbkQsWUFDVyxVQUNBLFdBQ1Q7QUFDQTtBQUFBLE1BQ0U7QUFBQSxRQUNFLG9FQUFvRSxRQUFRO0FBQUEsUUFDNUUsR0FBRyxVQUFVO0FBQUEsVUFDWCxDQUFDLE1BQ0Ms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