@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-F5CLVIS6.js";
7
+ import {
8
+ registerModuleProgram
9
+ } from "./chunk-BVE33AN6.js";
10
+ import {
11
+ fnv1a32,
12
+ stableStringify
13
+ } from "./chunk-QGIM3FQK.js";
14
+ import {
15
+ Module
16
+ } from "./chunk-FNLXHWIU.js";
17
+ import {
18
+ attachLogicUnitMeta
19
+ } from "./chunk-HGUFQ2QC.js";
20
+ import {
21
+ mutateWithPatchPaths
22
+ } from "./chunk-OKTBUTCH.js";
23
+ import {
24
+ getBoundInternals,
25
+ setModuleTraitsProgram
26
+ } from "./chunk-6FKWRVP4.js";
27
+ import {
28
+ currentDiagnosticsLevel,
29
+ record
30
+ } from "./chunk-4KIYG5E4.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,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvTW9kdWxlVGFnLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9Nb2R1bGVUcmFpdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXJSZWYsIExheWVyLCBTY2hlbWEgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCAqIGFzIExvZ2ljIGZyb20gXCIuL0xvZ2ljLmpzXCJcbmltcG9ydCAqIGFzIE1vZHVsZUZhY3RvcnkgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9Nb2R1bGVGYWN0b3J5LmpzXCJcbmltcG9ydCB7IG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy5qc1wiXG5pbXBvcnQge1xuICBnZXRCb3VuZEludGVybmFscyxcbiAgc2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSxcbn0gZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL3J1bnRpbWVJbnRlcm5hbHNBY2Nlc3Nvci5qc1wiXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvRGVidWdTaW5rLmpzXCJcbmltcG9ydCAqIGFzIExvZ2ljVW5pdE1ldGEgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljVW5pdE1ldGEuanNcIlxuaW1wb3J0IHR5cGUge1xuICBBY3Rpb25zRnJvbU1hcCxcbiAgQW55TW9kdWxlU2hhcGUsXG4gIEFueVNjaGVtYSxcbiAgQm91bmRBcGksXG4gIEFjdGlvbk9mLFxuICBNb2R1bGVJbXBsLFxuICBNb2R1bGVMb2dpYyxcbiAgTW9kdWxlU2hhcGUsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIE1vZHVsZVRhZyxcbiAgTW9kdWxlSGFuZGxlLFxuICBNb2R1bGVIYW5kbGVVbmlvbixcbiAgU3RhdGVDaGFuZ2VXaXRoTWV0YSxcbiAgU3RhdGVDb21taXRNZXRhLFxuICBTdGF0ZUNvbW1pdE1vZGUsXG4gIFN0YXRlQ29tbWl0UHJpb3JpdHksXG4gIFJlZHVjZXJzRnJvbU1hcCxcbiAgU3RhdGVPZixcbn0gZnJvbSBcIi4vaW50ZXJuYWwvbW9kdWxlLmpzXCJcbmltcG9ydCAqIGFzIFN0YXRlVHJhaXQgZnJvbSBcIi4vU3RhdGVUcmFpdC5qc1wiXG5pbXBvcnQgdHlwZSB7IFN0YXRlVHJhaXRQcm9ncmFtIH0gZnJvbSBcIi4vU3RhdGVUcmFpdC5qc1wiXG5pbXBvcnQgKiBhcyBNb2R1bGVUcmFpdHNSZWdpc3RyeSBmcm9tIFwiLi9pbnRlcm5hbC9kZWJ1Zy9Nb2R1bGVUcmFpdHNSZWdpc3RyeS5qc1wiXG5pbXBvcnQgKiBhcyBNb2R1bGVUcmFpdHMgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL01vZHVsZVRyYWl0cy5qc1wiXG5cbi8qKlxuICogTW9kdWxlVGFnIC8gTW9kdWxlUnVudGltZSAvIE1vZHVsZUltcGwgXHU3QjQ5XHU2ODM4XHU1RkMzXHU3QzdCXHU1NzhCXHU1QjlBXHU0RTQ5XHU3Njg0XHU1MTZDXHU1RjAwXHU1MUZBXHU1M0UzXHUzMDAyXG4gKlxuICogXHU0RTBFIC5jb2RleC9za2lsbHMvcHJvamVjdC1ndWlkZS9yZWZlcmVuY2VzL3J1bnRpbWUtbG9naXgvbG9naXgtY29yZS9hcGkvMDItbW9kdWxlLWFuZC1sb2dpYy1hcGkubWQgXHU0RkREXHU2MzAxXHU1QkY5XHU5RjUwXHUzMDAyXG4gKiBcdTUxNzdcdTRGNTNcdTdDN0JcdTU3OEJcdTVCOUFcdTRFNDlcdTk2QzZcdTRFMkRcdTU3MjggaW50ZXJuYWwvbW9kdWxlLnRzIFx1NEUyRFx1RkYwQ1x1NjcyQ1x1NkEyMVx1NTc1N1x1OEQxRlx1OEQyM1x1N0VDNFx1NTQwOFx1NURFNVx1NTM4Mlx1NUI5RVx1NzNCMFx1MzAwMlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEFueVNjaGVtYSxcbiAgQW55TW9kdWxlU2hhcGUsXG4gIE1vZHVsZVNoYXBlLFxuICBNb2R1bGVMb2dpYyxcbiAgTW9kdWxlSW1wbCxcbiAgTW9kdWxlUnVudGltZSxcbiAgTW9kdWxlVGFnLFxuICBNb2R1bGVIYW5kbGUsXG4gIE1vZHVsZUhhbmRsZVVuaW9uLFxuICBTdGF0ZU9mLFxuICBBY3Rpb25zRnJvbU1hcCxcbiAgUmVkdWNlcnNGcm9tTWFwLFxuICBCb3VuZEFwaSxcbiAgQWN0aW9uT2YsXG4gIFN0YXRlQ29tbWl0TW9kZSxcbiAgU3RhdGVDb21taXRQcmlvcml0eSxcbiAgU3RhdGVDb21taXRNZXRhLFxuICBTdGF0ZUNoYW5nZVdpdGhNZXRhLFxufSBmcm9tIFwiLi9pbnRlcm5hbC9tb2R1bGUuanNcIlxuXG4vKipcbiAqIFJlZHVjZXIgXHU1RTJFXHU1MkE5XHU1REU1XHU1MTc3XHVGRjFBXG4gKiAtIGBSZWR1Y2VyLm11dGF0ZWAgXHU2M0QwXHU0RjlCXHU0RTBFIGAkLnN0YXRlLm11dGF0ZWAgXHU0RTAwXHU4MUY0XHU3Njg0IG11dGF0aXZlIFx1OThDRVx1NjgzQ1x1NTE5OVx1NkNENVx1RkYxQlxuICogLSBcdTkwMUFcdThGQzdcdTUxODVcdTkwRThcdTU3RkFcdTRFOEUgbXV0YXRpdmUgXHU3Njg0XHU0RTBEXHU1M0VGXHU1M0Q4XHU2NkY0XHU2NUIwXHVGRjBDXHU1QzA2XHUzMDBDXHU1QzMxXHU1NzMwXHU0RkVFXHU2NTM5IGRyYWZ0XHUzMDBEXHU2NjIwXHU1QzA0XHU0RTNBXHU3RUFGIGAoc3RhdGUsIGFjdGlvbikgPT4gc3RhdGVgIFx1NTFGRFx1NjU3MFx1MzAwMlxuICpcbiAqIFx1NzUyOFx1NkNENVx1NzkzQVx1NEY4Qlx1RkYxQVxuICpcbiAqICAgY29uc3QgQ291bnRlciA9IExvZ2l4Lk1vZHVsZVRhZy5tYWtlKFwiQ291bnRlclwiLCB7XG4gKiAgICAgc3RhdGU6IENvdW50ZXJTdGF0ZSxcbiAqICAgICBhY3Rpb25zOiBDb3VudGVyQWN0aW9ucyxcbiAqICAgICByZWR1Y2Vyczoge1xuICogICAgICAgaW5jOiBMb2dpeC5Nb2R1bGVUYWcuUmVkdWNlci5tdXRhdGUoKGRyYWZ0LCBfYWN0aW9uKSA9PiB7XG4gKiAgICAgICAgIGRyYWZ0LmNvdW50ICs9IDFcbiAqICAgICAgIH0pLFxuICogICAgIH0sXG4gKiAgIH0pXG4gKlxuICogICB5aWVsZCogJC5yZWR1Y2VyKFxuICogICAgIFwic2V0VmFsdWVcIixcbiAqICAgICBMb2dpeC5Nb2R1bGVUYWcuUmVkdWNlci5tdXRhdGUoKGRyYWZ0LCBhY3Rpb24pID0+IHtcbiAqICAgICAgIGRyYWZ0LnZhbHVlID0gYWN0aW9uLnBheWxvYWRcbiAqICAgICB9KSxcbiAqICAgKVxuICovXG5leHBvcnQgY29uc3QgUmVkdWNlciA9IHtcbiAgbXV0YXRlOiA8UywgQT4oXG4gICAgbXV0YXRvcjogKGRyYWZ0OiBMb2dpYy5EcmFmdDxTPiwgYWN0aW9uOiBBKSA9PiB2b2lkXG4gICk6ICgoc3RhdGU6IFMsIGFjdGlvbjogQSwgc2luaz86IChwYXRoOiBzdHJpbmcpID0+IHZvaWQpID0+IFMpID0+XG4gICAgKHN0YXRlLCBhY3Rpb24sIHNpbmspID0+IHtcbiAgICAgIGNvbnN0IHsgbmV4dFN0YXRlLCBwYXRjaFBhdGhzIH0gPSBtdXRhdGVXaXRoUGF0Y2hQYXRocyhcbiAgICAgICAgc3RhdGUgYXMgUyxcbiAgICAgICAgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgbXV0YXRvcihkcmFmdCBhcyBMb2dpYy5EcmFmdDxTPiwgYWN0aW9uKVxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBpZiAoc2luaykge1xuICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0Y2hQYXRocykge1xuICAgICAgICAgIHNpbmsocGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dFN0YXRlXG4gICAgfSxcbn1cblxuLyoqXG4gKiBcdTdCODBcdTUzMTZcdTc2ODQgU2hhcGUgXHU1QjlBXHU0RTQ5XHU1MkE5XHU2MjRCXHVGRjBDXHU0RTEzXHU0RTNBIEFjdGlvbiBNYXAgXHU4QkJFXHU4QkExXHUzMDAyXG4gKiBAZXhhbXBsZSB0eXBlIE15U2hhcGUgPSBTaGFwZTx0eXBlb2YgTXlTdGF0ZSwgdHlwZW9mIE15QWN0aW9uTWFwPlxuICovXG5leHBvcnQgdHlwZSBTaGFwZTxcbiAgUyBleHRlbmRzIEFueVNjaGVtYSxcbiAgTSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFueVNjaGVtYT5cbj4gPSBNb2R1bGVTaGFwZTxTLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPE0+PiwgTT5cblxuY29uc3QgbWFrZUltcGwgPSA8XG4gIElkIGV4dGVuZHMgc3RyaW5nLFxuICBTU2NoZW1hIGV4dGVuZHMgQW55U2NoZW1hLFxuICBBTWFwIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgQW55U2NoZW1hPlxuPihcbiAgaWQ6IElkLFxuICBkZWY6IHtcbiAgICByZWFkb25seSBzdGF0ZTogU1NjaGVtYVxuICAgIHJlYWRvbmx5IGFjdGlvbnM6IEFNYXBcbiAgICByZWFkb25seSByZWR1Y2Vycz86IFJlZHVjZXJzRnJvbU1hcDxTU2NoZW1hLCBBTWFwPlxuICB9XG4pOiBNb2R1bGVUYWc8XG4gIElkLFxuICBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD5cbj4gPT4gTW9kdWxlRmFjdG9yeS5Nb2R1bGUoaWQsIGRlZikgYXMgTW9kdWxlVGFnPFxuICBJZCxcbiAgTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+XG4+XG5cbi8qKlxuICogTW9kdWxlVGFnLm1ha2VcdUZGMUFcbiAqIC0gXHU0RUU1XHU3RUQ5XHU1QjlBIGlkIFx1NEUwRSBzdGF0ZS9hY3Rpb25zL3JlZHVjZXJzIFx1NUI5QVx1NEU0OVx1NEUwMFx1NEUyQVx1OTg4Nlx1NTdERlx1NkEyMVx1NTc1NyBUYWdcdUZGMUJcbiAqIC0gXHU4RkQ0XHU1NkRFXHU3Njg0IE1vZHVsZVRhZyBcdTY1RTJcdTY2MkYgQ29udGV4dC5UYWdcdUZGMENcdTUzQzhcdTY0M0FcdTVFMjYgU2hhcGUgXHU0RTBFXHU1REU1XHU1MzgyXHU4MEZEXHU1MjlCXHUzMDAyXG4gKlxuICogXHU4QkY0XHU2NjBFXHVGRjFBMDIyIFx1OEQ3N1x1NjVFNyBgTW9kdWxlYFx1RkYwOFRhZyBpZGVudGl0eVx1RkYwOVx1NjZGNFx1NTQwRFx1NEUzQSBgTW9kdWxlVGFnYFx1RkYxQlx1OTg4Nlx1NTdERlx1NUI5QVx1NEU0OVx1NUJGOVx1OEM2MVx1OEJGN1x1NEY3Rlx1NzUyOCBgTG9naXguTW9kdWxlYFx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgbWFrZSA9IDxcbiAgSWQgZXh0ZW5kcyBzdHJpbmcsXG4gIFNTY2hlbWEgZXh0ZW5kcyBBbnlTY2hlbWEsXG4gIEFNYXAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBBbnlTY2hlbWE+XG4+KFxuICBpZDogSWQsXG4gIGRlZjoge1xuICAgIHJlYWRvbmx5IHN0YXRlOiBTU2NoZW1hXG4gICAgcmVhZG9ubHkgYWN0aW9uczogQU1hcFxuICAgIHJlYWRvbmx5IHJlZHVjZXJzPzogUmVkdWNlcnNGcm9tTWFwPFNTY2hlbWEsIEFNYXA+XG4gICAgLyoqXG4gICAgICogdHJhaXRzXHVGRjFBXG4gICAgICogLSBcdTc1MjhcdTRFOEVcdTYzMDJcdThGN0QgU3RhdGVUcmFpdFNwZWNcdUZGMDhcdThCRTZcdTg5QzEgc3BlY3MvMDAwLW1vZHVsZS10cmFpdHMtcnVudGltZVx1RkYwOVx1MzAwMlxuICAgICAqIC0gXHU1RjUzXHU1MjREXHU1QjlFXHU3M0IwXHU0RjFBXHU1NzI4IE1vZHVsZVRhZy5tYWtlIFx1OTYzNlx1NkJCNSBidWlsZCBQcm9ncmFtXHVGRjBDXHU1RTc2XHU1NzI4IGBNb2R1bGVUYWcuaW1wbGVtZW50YCBcdTZDRThcdTUxNjVcdTRFMDBcdTZCQjUgc2V0dXAtb25seSBMb2dpYyBcdTY3NjVcdThDMDNcdTc1MjggYFN0YXRlVHJhaXQuaW5zdGFsbGBcdTMwMDJcbiAgICAgKiAgIFx1RkYwOFx1NkNFOFx1RkYxQVx1ODJFNVx1NEY3Rlx1NzUyOCBgTW9kdWxlVGFnLmxpdmVgIFx1NzZGNFx1NTFGQSBMYXllciBcdTRFMTRcdTVFMENcdTY3MUJcdTU0MkZcdTc1MjggdHJhaXRzIFx1ODg0Q1x1NEUzQVx1RkYwQ1x1OEJGN1x1NjYzRVx1NUYwRlx1NTcyOCBsb2dpY3MgXHU0RTJEXHU4QzAzXHU3NTI4IGBTdGF0ZVRyYWl0Lmluc3RhbGxgXHVGRjBDXHU2MjE2XHU2NTM5XHU3NTI4IGBNb2R1bGVUYWcuaW1wbGVtZW50YFx1MzAwMlx1RkYwOVxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRyYWl0cz86IHVua25vd25cbiAgfVxuKTogTW9kdWxlVGFnPFxuICBJZCxcbiAgTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+XG4+ID0+IHtcbiAgY29uc3QgbW9kdWxlVGFnID0gbWFrZUltcGwoaWQsIGRlZilcblxuICB0eXBlIFNoID0gTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+XG5cbiAgY29uc3Qgc3RhdGVTY2hlbWEgPSBkZWYuc3RhdGUgYXMgU2NoZW1hLlNjaGVtYTxhbnksIGFueT5cbiAgY29uc3QgbW9kdWxlVHJhaXRzU3BlYyA9IGRlZi50cmFpdHMgYXMgU3RhdGVUcmFpdC5TdGF0ZVRyYWl0U3BlYzxhbnk+IHwgdW5kZWZpbmVkXG4gIGNvbnN0IGJhc2VQcm9ncmFtOiBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+IHwgdW5kZWZpbmVkID0gbW9kdWxlVHJhaXRzU3BlY1xuICAgID8gU3RhdGVUcmFpdC5idWlsZChzdGF0ZVNjaGVtYSBhcyBhbnksIG1vZHVsZVRyYWl0c1NwZWMgYXMgYW55KVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKGJhc2VQcm9ncmFtKSB7XG4gICAgLy8gXHU0RjlCIFRyYWl0TGlmZWN5Y2xlL0RlYnVnL0RldnRvb2xzIFx1OEJGQlx1NTNENlx1RkYwOFx1NUI5QVx1NEU0OVx1NEZBN1x1OTY5MFx1ODVDRlx1NjlGRFx1NEY0RFx1RkYwOVx1MzAwMlxuICAgIHNldE1vZHVsZVRyYWl0c1Byb2dyYW0obW9kdWxlVGFnIGFzIGFueSwgYmFzZVByb2dyYW0pXG4gICAgTW9kdWxlVHJhaXRzUmVnaXN0cnkucmVnaXN0ZXJNb2R1bGVQcm9ncmFtKGlkLCBiYXNlUHJvZ3JhbSBhcyBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+KVxuICB9XG5cbiAgLy8gMDIzXHVGRjFBdHJhaXRzIFx1NzY4NFx1MjAxQ1x1NThGMFx1NjYwRVx1NTE2NVx1NTNFMy9cdTU0MDhcdTVFNzZcdTUxNjVcdTUzRTNcdTIwMURcdTdFREZcdTRFMDBcdTY1MzZcdTY1NUJcdTUyMzAgc2V0dXAgXHU5NjM2XHU2QkI1XHVGRjFBXG4gIC8vIC0gbW9kdWxlLWxldmVsIHRyYWl0cyBcdTUxNDhcdTRGNUNcdTRFM0EgY29udHJpYnV0aW9uIFx1NkNFOFx1NTE4Q1x1RkYxQlxuICAvLyAtIGxvZ2ljLWxldmVsIFx1OTAxQVx1OEZDNyAkLnRyYWl0cy5kZWNsYXJlIFx1NkNFOFx1NTE4Q1x1RkYxQlxuICAvLyAtIFx1NjcwMFx1NTQwRVx1NEUwMFx1NkIyMVx1NjAyNyBmaW5hbGl6ZSBcdTIxOTIgZnJlZXplIFx1MjE5MiBidWlsZC9pbnN0YWxsXHUzMDAyXG5cbiAgY29uc3QgbWFrZU1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbkxvZ2ljID0gKFxuICAgIHRyYWl0czogdW5rbm93bixcbiAgKTogTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj4gPT4ge1xuICAgIGNvbnN0IGxvZ2ljID0gbW9kdWxlVGFnLmxvZ2ljKCgkKSA9PiAoe1xuICAgICAgc2V0dXA6IEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgICAgaWYgKCF0cmFpdHMgfHwgdHlwZW9mIHRyYWl0cyAhPT0gXCJvYmplY3RcIikgcmV0dXJuXG4gICAgICAgIC8vIG1vZHVsZS1sZXZlbCBwcm92ZW5hbmNlXHVGRjFBXHU0RUU1IG1vZHVsZUlkIFx1NEY1Q1x1NEUzQVx1N0EzM1x1NUI5QVx1OTUxQVx1NzBCOVxuICAgICAgICAvL1x1RkYwOFx1NUJGOVx1OUY1MCAwMjMgZGF0YS1tb2RlbFx1RkYxQW9yaWdpblR5cGU9bW9kdWxlLCBvcmlnaW5JZD1tb2R1bGVJZFx1RkYwOVx1MzAwMlxuICAgICAgICAvLyBcdTZDRThcdTYxMEZcdUZGMUF0cmFpdHNTcGVjIFx1NEVDRFx1NTkwRFx1NzUyOCBTdGF0ZVRyYWl0U3BlYyBcdTdFRDNcdTY3ODRcdUZGMENcdTRFMERcdTVGMTVcdTUxNjVcdTdCMkNcdTRFOENcdTU5NTcgSVJcdTMwMDJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoJCBhcyBhbnkpXG4gICAgICAgIGludGVybmFscy50cmFpdHMucmVnaXN0ZXJNb2R1bGVUcmFpdHNDb250cmlidXRpb24oe1xuICAgICAgICAgIHRyYWl0cyxcbiAgICAgICAgICBwcm92ZW5hbmNlOiB7XG4gICAgICAgICAgICBvcmlnaW5UeXBlOiBcIm1vZHVsZVwiLFxuICAgICAgICAgICAgb3JpZ2luSWQ6IGlkLFxuICAgICAgICAgICAgb3JpZ2luSWRLaW5kOiBcImV4cGxpY2l0XCIsXG4gICAgICAgICAgICBvcmlnaW5MYWJlbDogYG1vZHVsZToke2lkfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgICAgcnVuOiBFZmZlY3Qudm9pZCxcbiAgICB9KSkgYXMgTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj5cblxuICAgIExvZ2ljVW5pdE1ldGEuYXR0YWNoTG9naWNVbml0TWV0YShsb2dpYyBhcyBhbnksIHtcbiAgICAgIGlkOiBcIl9fbG9naXhfaW50ZXJuYWw6dHJhaXRzOm1vZHVsZV9jb250cmliXCIsXG4gICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICBuYW1lOiBcInRyYWl0czptb2R1bGVfY29udHJpYlwiLFxuICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgIH0pXG4gICAgcmV0dXJuIGxvZ2ljXG4gIH1cblxuICBjb25zdCBtYWtlRmluYWxpemVUcmFpdHNMb2dpYyA9ICgpOiBNb2R1bGVMb2dpYzxTaCwgbmV2ZXIsIG5ldmVyPiA9PiB7XG4gICAgY29uc3QgbG9naWMgPSBtb2R1bGVUYWcubG9naWMoKCQpID0+ICh7XG4gICAgICBzZXR1cDogRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscygkIGFzIGFueSlcbiAgICAgICAgY29uc3QgZGlhZ25vc3RpY3NMZXZlbCA9IHlpZWxkKiBGaWJlclJlZi5nZXQoRGVidWcuY3VycmVudERpYWdub3N0aWNzTGV2ZWwpXG5cbiAgICAgICAgY29uc3QgY29udHJpYnV0aW9ucyA9IGludGVybmFscy50cmFpdHMuZ2V0TW9kdWxlVHJhaXRzQ29udHJpYnV0aW9ucygpXG4gICAgICAgIGxldCBtZXJnZWQ6IE1vZHVsZVRyYWl0cy5UcmFpdFNwZWNcbiAgICAgICAgbGV0IHNuYXBzaG90OiBNb2R1bGVUcmFpdHMuTW9kdWxlVHJhaXRzU25hcHNob3RcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIDsoeyBtZXJnZWQsIHNuYXBzaG90IH0gPSBNb2R1bGVUcmFpdHMuZmluYWxpemVUcmFpdENvbnRyaWJ1dGlvbnMoe1xuICAgICAgICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgICAgICAgICAgY29udHJpYnV0aW9ucyxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkaWFnbm9zdGljc0xldmVsICE9PSBcIm9mZlwiICYmXG4gICAgICAgICAgICBjYXVzZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhdXNlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAoY2F1c2UgYXMgYW55KS5fdGFnID09PSBcIk1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3JcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgY29uZmxpY3RzID0gQXJyYXkuaXNBcnJheSgoY2F1c2UgYXMgYW55KS5jb25mbGljdHMpXG4gICAgICAgICAgICAgID8gKChjYXVzZSBhcyBhbnkpLmNvbmZsaWN0cyBhcyBSZWFkb25seUFycmF5PHVua25vd24+KVxuICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgICBjb25zdCB0cmFpdElkcyA9IGNvbmZsaWN0c1xuICAgICAgICAgICAgICAubWFwKChjOiBhbnkpID0+IChjICYmIHR5cGVvZiBjID09PSBcIm9iamVjdFwiID8gKGMgYXMgYW55KS50cmFpdElkIDogdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigodCk6IHQgaXMgc3RyaW5nID0+IHR5cGVvZiB0ID09PSBcInN0cmluZ1wiICYmIHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgLnNsaWNlKDAsIDIwKVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhID1cbiAgICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJmdWxsXCJcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RDb3VudDogY29uZmxpY3RzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RzLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBjb25mbGljdENvdW50OiBjb25mbGljdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB0cmFpdElkcyxcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidHJhY2U6bW9kdWxlOnRyYWl0czpjb25mbGljdFwiLFxuICAgICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGludGVybmFscy5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgY2F1c2VcbiAgICAgICAgfVxuXG4gICAgICAgIGludGVybmFscy50cmFpdHMuc2V0TW9kdWxlVHJhaXRzU25hcHNob3Qoc25hcHNob3QpXG4gICAgICAgIGludGVybmFscy50cmFpdHMuZnJlZXplTW9kdWxlVHJhaXRzKClcblxuICAgICAgICBpZiAoZGlhZ25vc3RpY3NMZXZlbCAhPT0gXCJvZmZcIikge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPVxuICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJmdWxsXCJcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBkaWdlc3Q6IHNuYXBzaG90LmRpZ2VzdCxcbiAgICAgICAgICAgICAgICAgIGNvdW50OiBzbmFwc2hvdC50cmFpdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgdHJhaXRzOiBzbmFwc2hvdC50cmFpdHMsXG4gICAgICAgICAgICAgICAgICBwcm92ZW5hbmNlSW5kZXg6IHNuYXBzaG90LnByb3ZlbmFuY2VJbmRleCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgZGlnZXN0OiBzbmFwc2hvdC5kaWdlc3QsXG4gICAgICAgICAgICAgICAgICBjb3VudDogc25hcHNob3QudHJhaXRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgICAgIHR5cGU6IFwidHJhY2U6bW9kdWxlOnRyYWl0c1wiLFxuICAgICAgICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZDogaW50ZXJuYWxzLmluc3RhbmNlSWQsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgIH0gYXMgYW55KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1lcmdlZCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbmx5TW9kdWxlTGV2ZWwgPVxuICAgICAgICAgIGNvbnRyaWJ1dGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgY29udHJpYnV0aW9uc1swXT8ucHJvdmVuYW5jZT8ub3JpZ2luVHlwZSA9PT0gXCJtb2R1bGVcIlxuXG4gICAgICAgIC8vIFx1NTdGQVx1NEU4RVx1NjcwMFx1N0VDOFx1NTQwOFx1NUU3Nlx1NTQwRVx1NzY4NCBTcGVjIFx1Njc4NFx1OTAyMFx1NEUwMFx1NkIyMVx1NjAyNyBQcm9ncmFtXHVGRjBDXHU1RTc2XHU1NzI4XHU1MjFEXHU1OUNCXHU1MzE2XHU5NjM2XHU2QkI1XHU1Qjg5XHU4OEM1XHUzMDAyXG4gICAgICAgIC8vIC0gXHU4MkU1XHU1M0VBXHU2NzA5IG1vZHVsZS1sZXZlbCBjb250cmlidXRpb25cdUZGMENcdTUyMTlcdTU5MERcdTc1MjggTW9kdWxlVGFnLm1ha2UgXHU5NjM2XHU2QkI1XHU5ODg0XHU2Nzg0XHU1RUZBXHU3Njg0IHByb2dyYW1cdUZGMDhcdTRGQkZcdTRFOEUgRGVidWcvVHJhaXRMaWZlY3ljbGVcdUZGMDlcdTMwMDJcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9XG4gICAgICAgICAgb25seU1vZHVsZUxldmVsICYmIGJhc2VQcm9ncmFtXG4gICAgICAgICAgICA/IGJhc2VQcm9ncmFtXG4gICAgICAgICAgICA6IFN0YXRlVHJhaXQuYnVpbGQoc3RhdGVTY2hlbWEgYXMgYW55LCBtZXJnZWQgYXMgYW55KVxuXG4gICAgICAgIC8vIFx1NEY5QiBUcmFpdExpZmVjeWNsZS9EZWJ1Zy9EZXZ0b29scyBcdThCRkJcdTUzRDZcdUZGMDhcdTVCOUFcdTRFNDlcdTRGQTdcdTk2OTBcdTg1Q0ZcdTY5RkRcdTRGNERcdUZGMDlcdTMwMDJcbiAgICAgICAgc2V0TW9kdWxlVHJhaXRzUHJvZ3JhbShtb2R1bGVUYWcgYXMgYW55LCBwcm9ncmFtKVxuICAgICAgICBNb2R1bGVUcmFpdHNSZWdpc3RyeS5yZWdpc3Rlck1vZHVsZVByb2dyYW0oaWQsIHByb2dyYW0gYXMgU3RhdGVUcmFpdFByb2dyYW08YW55PilcblxuICAgICAgICB5aWVsZCogU3RhdGVUcmFpdC5pbnN0YWxsKCQgYXMgdW5rbm93biBhcyBCb3VuZEFwaTxhbnksIGFueT4sIHByb2dyYW0pXG4gICAgICB9KSxcbiAgICAgIHJ1bjogRWZmZWN0LnZvaWQsXG4gICAgfSkpIGFzIE1vZHVsZUxvZ2ljPFNoLCBuZXZlciwgbmV2ZXI+XG5cbiAgICBMb2dpY1VuaXRNZXRhLmF0dGFjaExvZ2ljVW5pdE1ldGEobG9naWMgYXMgYW55LCB7XG4gICAgICBpZDogXCJfX2xvZ2l4X2ludGVybmFsOnRyYWl0czpmaW5hbGl6ZVwiLFxuICAgICAga2luZDogXCJpbnRlcm5hbFwiLFxuICAgICAgbmFtZTogXCJ0cmFpdHM6ZmluYWxpemVcIixcbiAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGxvZ2ljXG4gIH1cblxuICAvLyBcdTUzMDVcdTg4QzUgaW1wbGVtZW50XHVGRjFBXHU1NzI4XHU1QjlFXHU3M0IwXHU1QzQyXHU2Q0U4XHU1MTY1XHVGRjA4MVx1RkYwOW1vZHVsZS1sZXZlbCBjb250cmlidXRpb24gbG9naWNcdUZGMDhcdTUzRUZcdTkwMDlcdUZGMDlcdUZGMDgyXHVGRjA5ZmluYWxpemUraW5zdGFsbCBsb2dpY1x1RkYwOFx1NUZDNVx1OTAwOVx1RkYwOVx1MzAwMlxuICBjb25zdCBvcmlnaW5hbEltcGxlbWVudCA9IG1vZHVsZVRhZy5pbXBsZW1lbnRcbiAgOyhtb2R1bGVUYWcgYXMgYW55KS5pbXBsZW1lbnQgPSAoPFIgPSBuZXZlcj4oY29uZmlnOiB7XG4gICAgaW5pdGlhbDogU3RhdGVPZjx0eXBlb2YgbW9kdWxlVGFnLnNoYXBlPlxuICAgIGxvZ2ljcz86IEFycmF5PE1vZHVsZUxvZ2ljPHR5cGVvZiBtb2R1bGVUYWcuc2hhcGUsIFIsIGFueT4+XG4gICAgaW1wb3J0cz86IFJlYWRvbmx5QXJyYXk8XG4gICAgICBMYXllci5MYXllcjxhbnksIGFueSwgYW55PiB8IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PlxuICAgID5cbiAgICBwcm9jZXNzZXM/OiBSZWFkb25seUFycmF5PEVmZmVjdC5FZmZlY3Q8dm9pZCwgYW55LCBhbnk+PlxuICB9KSA9PiB7XG4gICAgY29uc3QgdXNlckxvZ2ljcyA9IChjb25maWcubG9naWNzID8/IFtdKSBhcyBBcnJheTxNb2R1bGVMb2dpYzxcbiAgICAgIHR5cGVvZiBtb2R1bGVUYWcuc2hhcGUsXG4gICAgICBSLFxuICAgICAgYW55XG4gICAgPj5cblxuICAgIGNvbnN0IG1vZHVsZUxldmVsID1cbiAgICAgIGRlZi50cmFpdHMgPyBbbWFrZU1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbkxvZ2ljKGRlZi50cmFpdHMpIGFzIGFueV0gOiBbXVxuXG4gICAgY29uc3QgZmluYWxpemUgPSBtYWtlRmluYWxpemVUcmFpdHNMb2dpYygpIGFzIE1vZHVsZUxvZ2ljPFxuICAgICAgdHlwZW9mIG1vZHVsZVRhZy5zaGFwZSxcbiAgICAgIFIsXG4gICAgICBhbnlcbiAgICA+XG5cbiAgICBjb25zdCBtZXJnZWRMb2dpY3MgPSBbLi4ubW9kdWxlTGV2ZWwsIC4uLnVzZXJMb2dpY3MsIGZpbmFsaXplXVxuXG4gICAgcmV0dXJuIG9yaWdpbmFsSW1wbGVtZW50PFI+KHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGxvZ2ljczogbWVyZ2VkTG9naWNzLFxuICAgIH0pXG4gIH0pIGFzIHR5cGVvZiBtb2R1bGVUYWcuaW1wbGVtZW50XG5cbiAgcmV0dXJuIG1vZHVsZVRhZ1xufVxuIiwgImltcG9ydCB7IGZudjFhMzIsIHN0YWJsZVN0cmluZ2lmeSB9IGZyb20gXCIuLi8uLi9kaWdlc3QuanNcIlxuXG5leHBvcnQgdHlwZSBUcmFpdElkID0gc3RyaW5nXG5cbmV4cG9ydCB0eXBlIFRyYWl0T3JpZ2luVHlwZSA9IFwibW9kdWxlXCIgfCBcImxvZ2ljVW5pdFwiXG5leHBvcnQgdHlwZSBUcmFpdE9yaWdpbklkS2luZCA9IFwiZXhwbGljaXRcIiB8IFwiZGVyaXZlZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRQcm92ZW5hbmNlIHtcbiAgcmVhZG9ubHkgb3JpZ2luVHlwZTogVHJhaXRPcmlnaW5UeXBlXG4gIHJlYWRvbmx5IG9yaWdpbklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgb3JpZ2luSWRLaW5kOiBUcmFpdE9yaWdpbklkS2luZFxuICAvKipcbiAgICogXHU3RUQ5IERldnRvb2xzL1x1OTUxOVx1OEJFRlx1NEZFMVx1NjA2Rlx1NUM1NVx1NzkzQVx1NzY4NFx1NTNFRlx1OEJGQlx1NjgwN1x1N0I3RVx1RkYwOFx1NEY4Qlx1NTk4MiBcImxvZ2ljVW5pdDpQcm9maWxlIzFcIlx1RkYwOVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luTGFiZWw6IHN0cmluZ1xuICAvKipcbiAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU1OEYwXHU2NjBFXHU0RjREXHU3RjZFXHU2NDU4XHU4OTgxXHVGRjA4XHU0RjhCXHU1OTgyXHU2NTg3XHU0RUY2XHU4REVGXHU1Rjg0L1x1OEMwM1x1NzUyOFx1NzBCOVx1RkYwOVx1RkYwQ1x1NEVDNVx1NzUyOFx1NEU4RVx1NUI5QVx1NEY0RFx1RkYwQ1x1NEUwRFx1NTNDMlx1NEUwRVx1OEJFRFx1NEU0OVx1ODhDMVx1NTFCM1x1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZ1xufVxuXG4vKipcbiAqIFRyYWl0U3BlY1x1RkYxQVxuICogLSBcdTRGNUNcdTRFM0FcdTIwMUN0cmFpdHMgXHU1OEYwXHU2NjBFXHUyMDFEXHU3Njg0XHU2NzAwXHU1QzBGXHU1RjYyXHU2MDAxXHVGRjFBXHU0RTAwXHU3RUM0XHU0RUU1IHRyYWl0SWQgXHU0RTNBIGtleSBcdTc2ODRcdTU4RjBcdTY2MEVcdTVCRjlcdThDNjFcdUZGMUJcbiAqIC0gXHU1MTc3XHU0RjUzIHZhbHVlIFx1NUY2Mlx1NjAwMVx1NzUzMVx1NTE3N1x1NEY1MyB0cmFpdCBcdTdDRkJcdTdFREZcdUZGMDhcdTU5ODIgU3RhdGVUcmFpdFNwZWNcdUZGMDlcdTUxQjNcdTVCOUFcdUZGMUJcbiAqIC0gXHU4RkQ5XHU5MUNDXHU0RTBEXHU3RUE2XHU2NzVGIHZhbHVlIFx1NzY4NFx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1NjAyN1x1RkYwOFx1OEZEMFx1ODg0Q1x1NjcxRiBpbnN0YWxsIFx1NTNFRlx1ODBGRFx1NEY5RFx1OEQ1Nlx1NTFGRFx1NjU3MFx1RkYwOVx1RkYwQ1x1NEY0NiBTbmFwc2hvdC9cdThCQzFcdTYzNkVcdTVCRkNcdTUxRkFcdTVGQzVcdTk4N0JcdTUzRUFcdTUzRDZcdTUzRUZcdTVFOEZcdTUyMTdcdTUzMTZcdTVCNTBcdTk2QzZcdTMwMDJcbiAqL1xuZXhwb3J0IHR5cGUgVHJhaXRTcGVjID0gb2JqZWN0XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRDb250cmlidXRpb24ge1xuICByZWFkb25seSB0cmFpdHM6IFRyYWl0U3BlY1xuICByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVUcmFpdEl0ZW0ge1xuICByZWFkb25seSB0cmFpdElkOiBUcmFpdElkXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBUcmFpdENvbmZsaWN0S2luZCA9XG4gIHwgXCJkdXBsaWNhdGVfdHJhaXRJZFwiXG4gIHwgXCJtaXNzaW5nX3JlcXVpcmVzXCJcbiAgfCBcImV4Y2x1ZGVzX3Zpb2xhdGlvblwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRDb25mbGljdCB7XG4gIHJlYWRvbmx5IGtpbmQ6IFRyYWl0Q29uZmxpY3RLaW5kXG4gIHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWRcbiAgcmVhZG9ubHkgc291cmNlczogUmVhZG9ubHlBcnJheTxUcmFpdFByb3ZlbmFuY2U+XG4gIHJlYWRvbmx5IG1pc3Npbmc/OiBSZWFkb25seUFycmF5PFRyYWl0SWQ+XG4gIHJlYWRvbmx5IHByZXNlbnQ/OiBSZWFkb25seUFycmF5PFRyYWl0SWQ+XG59XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnID0gXCJNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yXCJcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nLFxuICAgIHJlYWRvbmx5IGNvbmZsaWN0czogUmVhZG9ubHlBcnJheTxUcmFpdENvbmZsaWN0PixcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBbXG4gICAgICAgIGBbTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvcl0gQ29uZmxpY3RpbmcgdHJhaXRJZHMgZm91bmQgKG1vZHVsZUlkPSR7bW9kdWxlSWR9KS5gLFxuICAgICAgICAuLi5jb25mbGljdHMubWFwKFxuICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgYy5raW5kID09PSBcImR1cGxpY2F0ZV90cmFpdElkXCJcbiAgICAgICAgICAgICAgPyBgLSBkdXBsaWNhdGUgJHtjLnRyYWl0SWR9OiAke2Muc291cmNlc1xuICAgICAgICAgICAgICAgICAgLm1hcCgocykgPT4gYCR7cy5vcmlnaW5UeXBlfToke3Mub3JpZ2luSWR9YClcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICAgICA6IGMua2luZCA9PT0gXCJtaXNzaW5nX3JlcXVpcmVzXCJcbiAgICAgICAgICAgICAgICA/IGAtIG1pc3NpbmcgcmVxdWlyZXMgZm9yICR7Yy50cmFpdElkfTogJHsoYy5taXNzaW5nID8/IFtdKS5qb2luKFwiLCBcIil9OyBzb3VyY2VzPSR7Yy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IGAke3Mub3JpZ2luVHlwZX06JHtzLm9yaWdpbklkfWApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICAgICAgIDogYC0gZXhjbHVkZXMgdmlvbGF0aW9uIGZvciAke2MudHJhaXRJZH06IHByZXNlbnQ9JHsoYy5wcmVzZW50ID8/IFtdKS5qb2luKFwiLCBcIil9OyBzb3VyY2VzPSR7Yy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IGAke3Mub3JpZ2luVHlwZX06JHtzLm9yaWdpbklkfWApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgKSxcbiAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVUcmFpdHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHJhaXRzOiBSZWFkb25seUFycmF5PE1vZHVsZVRyYWl0SXRlbT5cbiAgcmVhZG9ubHkgcHJvdmVuYW5jZUluZGV4OiBSZWNvcmQ8VHJhaXRJZCwgVHJhaXRQcm92ZW5hbmNlPlxufVxuXG5jb25zdCB0b1Byb3ZlbmFuY2VLZXkgPSAocDogVHJhaXRQcm92ZW5hbmNlKTogc3RyaW5nID0+XG4gIGAke3Aub3JpZ2luVHlwZX06JHtwLm9yaWdpbklkfToke3Aub3JpZ2luSWRLaW5kfToke3Aub3JpZ2luTGFiZWx9OiR7cC5wYXRoID8/IFwiXCJ9YFxuXG5jb25zdCBjb21wYXJlUHJvdmVuYW5jZSA9IChhOiBUcmFpdFByb3ZlbmFuY2UsIGI6IFRyYWl0UHJvdmVuYW5jZSk6IG51bWJlciA9PiB7XG4gIGNvbnN0IHR5cGUgPSBhLm9yaWdpblR5cGUubG9jYWxlQ29tcGFyZShiLm9yaWdpblR5cGUpXG4gIGlmICh0eXBlICE9PSAwKSByZXR1cm4gdHlwZVxuICBjb25zdCBpZCA9IGEub3JpZ2luSWQubG9jYWxlQ29tcGFyZShiLm9yaWdpbklkKVxuICBpZiAoaWQgIT09IDApIHJldHVybiBpZFxuICBjb25zdCBraW5kID0gYS5vcmlnaW5JZEtpbmQubG9jYWxlQ29tcGFyZShiLm9yaWdpbklkS2luZClcbiAgaWYgKGtpbmQgIT09IDApIHJldHVybiBraW5kXG4gIGNvbnN0IGxhYmVsID0gYS5vcmlnaW5MYWJlbC5sb2NhbGVDb21wYXJlKGIub3JpZ2luTGFiZWwpXG4gIGlmIChsYWJlbCAhPT0gMCkgcmV0dXJuIGxhYmVsXG4gIHJldHVybiBTdHJpbmcoYS5wYXRoID8/IFwiXCIpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIucGF0aCA/PyBcIlwiKSlcbn1cblxuY29uc3Qgb3JpZ2luVHlwZU9yZGVyID0gKHQ6IFRyYWl0T3JpZ2luVHlwZSk6IG51bWJlciA9PlxuICB0ID09PSBcIm1vZHVsZVwiID8gMCA6IDFcblxuY29uc3QgY29tcGFyZVRyYWl0SWRCeVByb3ZlbmFuY2UgPSAoXG4gIGE6IHsgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZDsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0sXG4gIGI6IHsgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZDsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0sXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCB0YSA9IG9yaWdpblR5cGVPcmRlcihhLnByb3ZlbmFuY2Uub3JpZ2luVHlwZSkgLSBvcmlnaW5UeXBlT3JkZXIoYi5wcm92ZW5hbmNlLm9yaWdpblR5cGUpXG4gIGlmICh0YSAhPT0gMCkgcmV0dXJuIHRhXG4gIGNvbnN0IG9hID0gYS5wcm92ZW5hbmNlLm9yaWdpbklkLmxvY2FsZUNvbXBhcmUoYi5wcm92ZW5hbmNlLm9yaWdpbklkKVxuICBpZiAob2EgIT09IDApIHJldHVybiBvYVxuICByZXR1cm4gYS50cmFpdElkLmxvY2FsZUNvbXBhcmUoYi50cmFpdElkKVxufVxuXG5jb25zdCBleHRyYWN0U3RyaW5nQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW11cbiAgY29uc3Qgb3V0OiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSBcInN0cmluZ1wiKSBjb250aW51ZVxuICAgIGNvbnN0IHMgPSB2LnRyaW0oKVxuICAgIGlmICghcykgY29udGludWVcbiAgICBvdXQucHVzaChzKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuY29uc3QgZ2V0VHJhaXRSZXF1aXJlcyA9ICh2YWx1ZTogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8VHJhaXRJZD4gPT4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIFtdXG4gIGNvbnN0IGRpcmVjdCA9IGV4dHJhY3RTdHJpbmdBcnJheSgodmFsdWUgYXMgYW55KS5yZXF1aXJlcylcbiAgcmV0dXJuIGRpcmVjdFxufVxuXG5jb25zdCBnZXRUcmFpdEV4Y2x1ZGVzID0gKHZhbHVlOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxUcmFpdElkPiA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLmV4Y2x1ZGVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0TmFtZSA9ICh0cmFpdElkOiBUcmFpdElkLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBuID0gKHZhbHVlIGFzIGFueSkubmFtZVxuICAgIGlmICh0eXBlb2YgbiA9PT0gXCJzdHJpbmdcIiAmJiBuLnRyaW0oKS5sZW5ndGggPiAwKSByZXR1cm4gbi50cmltKClcbiAgfVxuICByZXR1cm4gdHJhaXRJZFxufVxuXG5jb25zdCBnZXRUcmFpdERlc2NyaXB0aW9uID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGQgPSAodmFsdWUgYXMgYW55KS5kZXNjcmlwdGlvblxuICAgIGlmICh0eXBlb2YgZCA9PT0gXCJzdHJpbmdcIiAmJiBkLnRyaW0oKS5sZW5ndGggPiAwKSByZXR1cm4gZC50cmltKClcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBmaW5hbGl6ZVRyYWl0Q29udHJpYnV0aW9ucyA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgY29udHJpYnV0aW9uczogUmVhZG9ubHlBcnJheTxUcmFpdENvbnRyaWJ1dGlvbj5cbn0pOiB7IHJlYWRvbmx5IG1lcmdlZDogVHJhaXRTcGVjOyByZWFkb25seSBzbmFwc2hvdDogTW9kdWxlVHJhaXRzU25hcHNob3QgfSA9PiB7XG4gIGNvbnN0IHRyYWl0QnlJZCA9IG5ldyBNYXA8XG4gICAgVHJhaXRJZCxcbiAgICB7IHJlYWRvbmx5IHZhbHVlOiB1bmtub3duOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfVxuICA+KClcblxuICBjb25zdCBkdXBsaWNhdGVTb3VyY2VzID0gbmV3IE1hcDxUcmFpdElkLCBBcnJheTxUcmFpdFByb3ZlbmFuY2U+PigpXG5cbiAgY29uc3QgY29udHJpYnV0aW9ucyA9IFsuLi5hcmdzLmNvbnRyaWJ1dGlvbnNdLnNvcnQoKGEsIGIpID0+XG4gICAgY29tcGFyZVByb3ZlbmFuY2UoYS5wcm92ZW5hbmNlLCBiLnByb3ZlbmFuY2UpLFxuICApXG5cbiAgZm9yIChjb25zdCBjIG9mIGNvbnRyaWJ1dGlvbnMpIHtcbiAgICBjb25zdCB0cmFpdHMgPSBjLnRyYWl0c1xuICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlXG4gICAgZm9yIChjb25zdCB0cmFpdElkIG9mIE9iamVjdC5rZXlzKHRyYWl0cykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSAodHJhaXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVt0cmFpdElkXVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHByZXYgPSB0cmFpdEJ5SWQuZ2V0KHRyYWl0SWQpXG4gICAgICBpZiAoIXByZXYpIHtcbiAgICAgICAgdHJhaXRCeUlkLnNldCh0cmFpdElkLCB7IHZhbHVlLCBwcm92ZW5hbmNlOiBjLnByb3ZlbmFuY2UgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlcyA9IGR1cGxpY2F0ZVNvdXJjZXMuZ2V0KHRyYWl0SWQpID8/IFtwcmV2LnByb3ZlbmFuY2VdXG4gICAgICBzb3VyY2VzLnB1c2goYy5wcm92ZW5hbmNlKVxuICAgICAgZHVwbGljYXRlU291cmNlcy5zZXQodHJhaXRJZCwgc291cmNlcylcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25mbGljdHM6IEFycmF5PFRyYWl0Q29uZmxpY3Q+ID0gW11cbiAgY29uc3QgcmVnaXN0ZXJDb25mbGljdCA9IChjb25mbGljdDogVHJhaXRDb25mbGljdCkgPT4ge1xuICAgIGNvbnN0IHVuaXF1ZSA9IG5ldyBNYXA8c3RyaW5nLCBUcmFpdFByb3ZlbmFuY2U+KClcbiAgICBmb3IgKGNvbnN0IHMgb2YgY29uZmxpY3Quc291cmNlcykge1xuICAgICAgdW5pcXVlLnNldCh0b1Byb3ZlbmFuY2VLZXkocyksIHMpXG4gICAgfVxuICAgIGNvbmZsaWN0cy5wdXNoKHtcbiAgICAgIC4uLmNvbmZsaWN0LFxuICAgICAgc291cmNlczogQXJyYXkuZnJvbSh1bmlxdWUudmFsdWVzKCkpLnNvcnQoY29tcGFyZVByb3ZlbmFuY2UpLFxuICAgIH0pXG4gIH1cblxuICAvLyAxKSBkdXBsaWNhdGUgdHJhaXRJZCBjb25mbGljdHNcbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIEFycmF5LmZyb20oZHVwbGljYXRlU291cmNlcy5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSkpIHtcbiAgICByZWdpc3RlckNvbmZsaWN0KHtcbiAgICAgIGtpbmQ6IFwiZHVwbGljYXRlX3RyYWl0SWRcIixcbiAgICAgIHRyYWl0SWQsXG4gICAgICBzb3VyY2VzOiBkdXBsaWNhdGVTb3VyY2VzLmdldCh0cmFpdElkKSA/PyBbXSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGNvbnN0IHByb3ZlbmFuY2VJbmRleDogUmVjb3JkPHN0cmluZywgVHJhaXRQcm92ZW5hbmNlPiA9IHt9XG4gIGNvbnN0IHRyYWl0czogQXJyYXk8TW9kdWxlVHJhaXRJdGVtPiA9IFtdXG5cbiAgY29uc3QgZW50cmllczogQXJyYXk8eyByZWFkb25seSB0cmFpdElkOiBUcmFpdElkOyByZWFkb25seSB2YWx1ZTogdW5rbm93bjsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0+ID0gW11cbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIHRyYWl0QnlJZC5rZXlzKCkpIHtcbiAgICBjb25zdCBlbnRyeSA9IHRyYWl0QnlJZC5nZXQodHJhaXRJZClcbiAgICBpZiAoIWVudHJ5KSBjb250aW51ZVxuICAgIGVudHJpZXMucHVzaCh7IHRyYWl0SWQsIHZhbHVlOiBlbnRyeS52YWx1ZSwgcHJvdmVuYW5jZTogZW50cnkucHJvdmVuYW5jZSB9KVxuICB9XG5cbiAgY29uc3QgaWRzID0gZW50cmllc1xuICAgIC5zbGljZSgpXG4gICAgLnNvcnQoY29tcGFyZVRyYWl0SWRCeVByb3ZlbmFuY2UpXG4gICAgLm1hcCgoZSkgPT4gZS50cmFpdElkKVxuXG4gIGZvciAoY29uc3QgdHJhaXRJZCBvZiBpZHMpIHtcbiAgICBjb25zdCBlbnRyeSA9IHRyYWl0QnlJZC5nZXQodHJhaXRJZClcbiAgICBpZiAoIWVudHJ5KSBjb250aW51ZVxuICAgIG1lcmdlZFt0cmFpdElkXSA9IGVudHJ5LnZhbHVlXG4gICAgcHJvdmVuYW5jZUluZGV4W3RyYWl0SWRdID0gZW50cnkucHJvdmVuYW5jZVxuICAgIHRyYWl0cy5wdXNoKHtcbiAgICAgIHRyYWl0SWQsXG4gICAgICBuYW1lOiBnZXRUcmFpdE5hbWUodHJhaXRJZCwgZW50cnkudmFsdWUpLFxuICAgICAgZGVzY3JpcHRpb246IGdldFRyYWl0RGVzY3JpcHRpb24oZW50cnkudmFsdWUpLFxuICAgIH0pXG4gIH1cblxuICAvLyAyKSBjb25zaXN0ZW5jeSBjaGVja3MgKEZSLTAwNyk6IHJlcXVpcmVzIC8gZXhjbHVkZXNcbiAgY29uc3QgcHJlc2VudCA9IG5ldyBTZXQoaWRzKVxuXG4gIGZvciAoY29uc3QgdHJhaXRJZCBvZiBpZHMpIHtcbiAgICBjb25zdCBlbnRyeSA9IHRyYWl0QnlJZC5nZXQodHJhaXRJZClcbiAgICBpZiAoIWVudHJ5KSBjb250aW51ZVxuXG4gICAgY29uc3QgcmVxdWlyZXMgPSBnZXRUcmFpdFJlcXVpcmVzKGVudHJ5LnZhbHVlKVxuICAgIGlmIChyZXF1aXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtaXNzaW5nID0gcmVxdWlyZXMuZmlsdGVyKChyKSA9PiAhcHJlc2VudC5oYXMocikpXG4gICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAgICAgIGtpbmQ6IFwibWlzc2luZ19yZXF1aXJlc1wiLFxuICAgICAgICAgIHRyYWl0SWQsXG4gICAgICAgICAgbWlzc2luZzogQXJyYXkuZnJvbShuZXcgU2V0KG1pc3NpbmcpKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgICAgICAgIHNvdXJjZXM6IFtlbnRyeS5wcm92ZW5hbmNlXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleGNsdWRlcyA9IGdldFRyYWl0RXhjbHVkZXMoZW50cnkudmFsdWUpXG4gICAgaWYgKGV4Y2x1ZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHByZXNlbnRFeGNsdWRlZCA9IGV4Y2x1ZGVzLmZpbHRlcigoZSkgPT4gcHJlc2VudC5oYXMoZSkpXG4gICAgICBpZiAocHJlc2VudEV4Y2x1ZGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgb3RoZXJTb3VyY2VzOiBBcnJheTxUcmFpdFByb3ZlbmFuY2U+ID0gW11cbiAgICAgICAgZm9yIChjb25zdCBvdGhlcklkIG9mIHByZXNlbnRFeGNsdWRlZCkge1xuICAgICAgICAgIGNvbnN0IG90aGVyID0gdHJhaXRCeUlkLmdldChvdGhlcklkKVxuICAgICAgICAgIGlmIChvdGhlcikgb3RoZXJTb3VyY2VzLnB1c2gob3RoZXIucHJvdmVuYW5jZSlcbiAgICAgICAgfVxuICAgICAgICByZWdpc3RlckNvbmZsaWN0KHtcbiAgICAgICAgICBraW5kOiBcImV4Y2x1ZGVzX3Zpb2xhdGlvblwiLFxuICAgICAgICAgIHRyYWl0SWQsXG4gICAgICAgICAgcHJlc2VudDogQXJyYXkuZnJvbShuZXcgU2V0KHByZXNlbnRFeGNsdWRlZCkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgICAgICAgc291cmNlczogW2VudHJ5LnByb3ZlbmFuY2UsIC4uLm90aGVyU291cmNlc10sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZsaWN0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qga2luZE9yZGVyOiBSZWNvcmQ8VHJhaXRDb25mbGljdEtpbmQsIG51bWJlcj4gPSB7XG4gICAgICBkdXBsaWNhdGVfdHJhaXRJZDogMCxcbiAgICAgIG1pc3NpbmdfcmVxdWlyZXM6IDEsXG4gICAgICBleGNsdWRlc192aW9sYXRpb246IDIsXG4gICAgfVxuICAgIGNvbmZsaWN0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBrID0ga2luZE9yZGVyW2Eua2luZF0gLSBraW5kT3JkZXJbYi5raW5kXVxuICAgICAgaWYgKGsgIT09IDApIHJldHVybiBrXG4gICAgICByZXR1cm4gYS50cmFpdElkLmxvY2FsZUNvbXBhcmUoYi50cmFpdElkKVxuICAgIH0pXG4gICAgdGhyb3cgbmV3IE1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3IoYXJncy5tb2R1bGVJZCwgY29uZmxpY3RzKVxuICB9XG5cbiAgY29uc3QgZGlnZXN0QmFzZSA9IHtcbiAgICBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCxcbiAgICB0cmFpdHMsXG4gICAgcHJvdmVuYW5jZUluZGV4LFxuICB9IGFzIGNvbnN0XG5cbiAgY29uc3QgZGlnZXN0ID0gYG10cmFpdHM6MDIzOiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoZGlnZXN0QmFzZSkpfWBcblxuICByZXR1cm4ge1xuICAgIG1lcmdlZCxcbiAgICBzbmFwc2hvdDoge1xuICAgICAgbW9kdWxlSWQ6IGFyZ3MubW9kdWxlSWQsXG4gICAgICBkaWdlc3QsXG4gICAgICB0cmFpdHMsXG4gICAgICBwcm92ZW5hbmNlSW5kZXgsXG4gICAgfSxcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTLFFBQVEsZ0JBQStCOzs7QUNxRHpDLElBQU0sNEJBQU4sY0FBd0MsTUFBTTtBQUFBLEVBR25ELFlBQ1csVUFDQSxXQUNUO0FBQ0E7QUFBQSxNQUNFO0FBQUEsUUFDRSxvRUFBb0UsUUFBUTtBQUFBLFFBQzVFLEdBQUcsVUFBVTtBQUFBLFVBQ1gsQ0FBQyxNQUNDLEVBQUUsU0FBUyxzQkFDUCxlQUFlLEVBQUUsT0FBTyxLQUFLLEVBQUUsUUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLFVBQVUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUMxQyxLQUFLLElBQUksQ0FBQyxLQUNiLEVBQUUsU0FBUyxxQkFDVCwwQkFBMEIsRUFBRSxPQUFPLE1BQU0sRUFBRSxXQUFXLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFDaEYsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLFVBQVUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUMxQyxLQUFLLElBQUksQ0FBQyxLQUNiLDRCQUE0QixFQUFFLE9BQU8sY0FBYyxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUMxRixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsVUFBVSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQzFDLEtBQUssSUFBSSxDQUFDO0FBQUEsUUFDdkI7QUFBQSxNQUNGLEVBQUUsS0FBSyxJQUFJO0FBQUEsSUFDYjtBQXJCUztBQUNBO0FBSlgsU0FBUyxPQUFPO0FBQUEsRUF5QmhCO0FBQ0Y7QUFTQSxJQUFNLGtCQUFrQixDQUFDLE1BQ3ZCLEdBQUcsRUFBRSxVQUFVLElBQUksRUFBRSxRQUFRLElBQUksRUFBRSxZQUFZLElBQUksRUFBRSxXQUFXLElBQUksRUFBRSxRQUFRLEVBQUU7QUFFbEYsSUFBTSxvQkFBb0IsQ0FBQyxHQUFvQixNQUErQjtBQUM1RSxRQUFNLE9BQU8sRUFBRSxXQUFXLGNBQWMsRUFBRSxVQUFVO0FBQ3BELE1BQUksU0FBUyxFQUFHLFFBQU87QUFDdkIsUUFBTSxLQUFLLEVBQUUsU0FBUyxjQUFjLEVBQUUsUUFBUTtBQUM5QyxNQUFJLE9BQU8sRUFBRyxRQUFPO0FBQ3JCLFFBQU0sT0FBTyxFQUFFLGFBQWEsY0FBYyxFQUFFLFlBQVk7QUFDeEQsTUFBSSxTQUFTLEVBQUcsUUFBTztBQUN2QixRQUFNLFFBQVEsRUFBRSxZQUFZLGNBQWMsRUFBRSxXQUFXO0FBQ3ZELE1BQUksVUFBVSxFQUFHLFFBQU87QUFDeEIsU0FBTyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsY0FBYyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDaEU7QUFFQSxJQUFNLGtCQUFrQixDQUFDLE1BQ3ZCLE1BQU0sV0FBVyxJQUFJO0FBRXZCLElBQU0sNkJBQTZCLENBQ2pDLEdBQ0EsTUFDVztBQUNYLFFBQU0sS0FBSyxnQkFBZ0IsRUFBRSxXQUFXLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxXQUFXLFVBQVU7QUFDN0YsTUFBSSxPQUFPLEVBQUcsUUFBTztBQUNyQixRQUFNLEtBQUssRUFBRSxXQUFXLFNBQVMsY0FBYyxFQUFFLFdBQVcsUUFBUTtBQUNwRSxNQUFJLE9BQU8sRUFBRyxRQUFPO0FBQ3JCLFNBQU8sRUFBRSxRQUFRLGNBQWMsRUFBRSxPQUFPO0FBQzFDO0FBRUEsSUFBTSxxQkFBcUIsQ0FBQyxVQUEwQztBQUNwRSxNQUFJLENBQUMsTUFBTSxRQUFRLEtBQUssRUFBRyxRQUFPLENBQUM7QUFDbkMsUUFBTSxNQUFxQixDQUFDO0FBQzVCLGFBQVcsS0FBSyxPQUFPO0FBQ3JCLFFBQUksT0FBTyxNQUFNLFNBQVU7QUFDM0IsVUFBTSxJQUFJLEVBQUUsS0FBSztBQUNqQixRQUFJLENBQUMsRUFBRztBQUNSLFFBQUksS0FBSyxDQUFDO0FBQUEsRUFDWjtBQUNBLFNBQU87QUFDVDtBQUVBLElBQU0sbUJBQW1CLENBQUMsVUFBMkM7QUFDbkUsTUFBSSxDQUFDLFNBQVMsT0FBTyxVQUFVLFNBQVUsUUFBTyxDQUFDO0FBQ2pELFFBQU0sU0FBUyxtQkFBb0IsTUFBYyxRQUFRO0FBQ3pELFNBQU87QUFDVDtBQUVBLElBQU0sbUJBQW1CLENBQUMsVUFBMkM7QUFDbkUsTUFBSSxDQUFDLFNBQVMsT0FBTyxVQUFVLFNBQVUsUUFBTyxDQUFDO0FBQ2pELFFBQU0sU0FBUyxtQkFBb0IsTUFBYyxRQUFRO0FBQ3pELFNBQU87QUFDVDtBQUVBLElBQU0sZUFBZSxDQUFDLFNBQWtCLFVBQTJCO0FBQ2pFLE1BQUksU0FBUyxPQUFPLFVBQVUsVUFBVTtBQUN0QyxVQUFNLElBQUssTUFBYztBQUN6QixRQUFJLE9BQU8sTUFBTSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRyxRQUFPLEVBQUUsS0FBSztBQUFBLEVBQ2xFO0FBQ0EsU0FBTztBQUNUO0FBRUEsSUFBTSxzQkFBc0IsQ0FBQyxVQUF1QztBQUNsRSxNQUFJLFNBQVMsT0FBTyxVQUFVLFVBQVU7QUFDdEMsVUFBTSxJQUFLLE1BQWM7QUFDekIsUUFBSSxPQUFPLE1BQU0sWUFBWSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUcsUUFBTyxFQUFFLEtBQUs7QUFBQSxFQUNsRTtBQUNBLFNBQU87QUFDVDtBQUVPLElBQU0sNkJBQTZCLENBQUMsU0FHb0M7QUFDN0UsUUFBTSxZQUFZLG9CQUFJLElBR3BCO0FBRUYsUUFBTSxtQkFBbUIsb0JBQUksSUFBcUM7QUFFbEUsUUFBTSxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssYUFBYSxFQUFFO0FBQUEsSUFBSyxDQUFDLEdBQUcsTUFDckQsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFVBQVU7QUFBQSxFQUM5QztBQUVBLGFBQVcsS0FBSyxlQUFlO0FBQzdCLFVBQU1BLFVBQVMsRUFBRTtBQUNqQixRQUFJLENBQUNBLFdBQVUsT0FBT0EsWUFBVyxTQUFVO0FBQzNDLGVBQVcsV0FBVyxPQUFPLEtBQUtBLE9BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUMsR0FBRztBQUM1RSxZQUFNLFFBQVNBLFFBQW1DLE9BQU87QUFDekQsVUFBSSxVQUFVLE9BQVc7QUFFekIsWUFBTSxPQUFPLFVBQVUsSUFBSSxPQUFPO0FBQ2xDLFVBQUksQ0FBQyxNQUFNO0FBQ1Qsa0JBQVUsSUFBSSxTQUFTLEVBQUUsT0FBTyxZQUFZLEVBQUUsV0FBVyxDQUFDO0FBQzFEO0FBQUEsTUFDRjtBQUVBLFlBQU0sVUFBVSxpQkFBaUIsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLFVBQVU7QUFDakUsY0FBUSxLQUFLLEVBQUUsVUFBVTtBQUN6Qix1QkFBaUIsSUFBSSxTQUFTLE9BQU87QUFBQSxJQUN2QztBQUFBLEVBQ0Y7QUFFQSxRQUFNLFlBQWtDLENBQUM7QUFDekMsUUFBTSxtQkFBbUIsQ0FBQyxhQUE0QjtBQUNwRCxVQUFNLFNBQVMsb0JBQUksSUFBNkI7QUFDaEQsZUFBVyxLQUFLLFNBQVMsU0FBUztBQUNoQyxhQUFPLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDO0FBQUEsSUFDbEM7QUFDQSxjQUFVLEtBQUs7QUFBQSxNQUNiLEdBQUc7QUFBQSxNQUNILFNBQVMsTUFBTSxLQUFLLE9BQU8sT0FBTyxDQUFDLEVBQUUsS0FBSyxpQkFBaUI7QUFBQSxJQUM3RCxDQUFDO0FBQUEsRUFDSDtBQUdBLGFBQVcsV0FBVyxNQUFNLEtBQUssaUJBQWlCLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxHQUFHO0FBQzVGLHFCQUFpQjtBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ047QUFBQSxNQUNBLFNBQVMsaUJBQWlCLElBQUksT0FBTyxLQUFLLENBQUM7QUFBQSxJQUM3QyxDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sU0FBa0MsQ0FBQztBQUN6QyxRQUFNLGtCQUFtRCxDQUFDO0FBQzFELFFBQU0sU0FBaUMsQ0FBQztBQUV4QyxRQUFNLFVBQStHLENBQUM7QUFDdEgsYUFBVyxXQUFXLFVBQVUsS0FBSyxHQUFHO0FBQ3RDLFVBQU0sUUFBUSxVQUFVLElBQUksT0FBTztBQUNuQyxRQUFJLENBQUMsTUFBTztBQUNaLFlBQVEsS0FBSyxFQUFFLFNBQVMsT0FBTyxNQUFNLE9BQU8sWUFBWSxNQUFNLFdBQVcsQ0FBQztBQUFBLEVBQzVFO0FBRUEsUUFBTSxNQUFNLFFBQ1QsTUFBTSxFQUNOLEtBQUssMEJBQTBCLEVBQy9CLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTztBQUV2QixhQUFXLFdBQVcsS0FBSztBQUN6QixVQUFNLFFBQVEsVUFBVSxJQUFJLE9BQU87QUFDbkMsUUFBSSxDQUFDLE1BQU87QUFDWixXQUFPLE9BQU8sSUFBSSxNQUFNO0FBQ3hCLG9CQUFnQixPQUFPLElBQUksTUFBTTtBQUNqQyxXQUFPLEtBQUs7QUFBQSxNQUNWO0FBQUEsTUFDQSxNQUFNLGFBQWEsU0FBUyxNQUFNLEtBQUs7QUFBQSxNQUN2QyxhQUFhLG9CQUFvQixNQUFNLEtBQUs7QUFBQSxJQUM5QyxDQUFDO0FBQUEsRUFDSDtBQUdBLFFBQU0sVUFBVSxJQUFJLElBQUksR0FBRztBQUUzQixhQUFXLFdBQVcsS0FBSztBQUN6QixVQUFNLFFBQVEsVUFBVSxJQUFJLE9BQU87QUFDbkMsUUFBSSxDQUFDLE1BQU87QUFFWixVQUFNLFdBQVcsaUJBQWlCLE1BQU0sS0FBSztBQUM3QyxRQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3ZCLFlBQU0sVUFBVSxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztBQUN0RCxVQUFJLFFBQVEsU0FBUyxHQUFHO0FBQ3RCLHlCQUFpQjtBQUFBLFVBQ2YsTUFBTTtBQUFBLFVBQ047QUFBQSxVQUNBLFNBQVMsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFBQSxVQUN2RSxTQUFTLENBQUMsTUFBTSxVQUFVO0FBQUEsUUFDNUIsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBRUEsVUFBTSxXQUFXLGlCQUFpQixNQUFNLEtBQUs7QUFDN0MsUUFBSSxTQUFTLFNBQVMsR0FBRztBQUN2QixZQUFNLGtCQUFrQixTQUFTLE9BQU8sQ0FBQyxNQUFNLFFBQVEsSUFBSSxDQUFDLENBQUM7QUFDN0QsVUFBSSxnQkFBZ0IsU0FBUyxHQUFHO0FBQzlCLGNBQU0sZUFBdUMsQ0FBQztBQUM5QyxtQkFBVyxXQUFXLGlCQUFpQjtBQUNyQyxnQkFBTSxRQUFRLFVBQVUsSUFBSSxPQUFPO0FBQ25DLGNBQUksTUFBTyxjQUFhLEtBQUssTUFBTSxVQUFVO0FBQUEsUUFDL0M7QUFDQSx5QkFBaUI7QUFBQSxVQUNmLE1BQU07QUFBQSxVQUNOO0FBQUEsVUFDQSxTQUFTLE1BQU0sS0FBSyxJQUFJLElBQUksZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQUEsVUFDL0UsU0FBUyxDQUFDLE1BQU0sWUFBWSxHQUFHLFlBQVk7QUFBQSxRQUM3QyxDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxVQUFVLFNBQVMsR0FBRztBQUN4QixVQUFNLFlBQStDO0FBQUEsTUFDbkQsbUJBQW1CO0FBQUEsTUFDbkIsa0JBQWtCO0FBQUEsTUFDbEIsb0JBQW9CO0FBQUEsSUFDdEI7QUFDQSxjQUFVLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDdkIsWUFBTSxJQUFJLFVBQVUsRUFBRSxJQUFJLElBQUksVUFBVSxFQUFFLElBQUk7QUFDOUMsVUFBSSxNQUFNLEVBQUcsUUFBTztBQUNwQixhQUFPLEVBQUUsUUFBUSxjQUFjLEVBQUUsT0FBTztBQUFBLElBQzFDLENBQUM7QUFDRCxVQUFNLElBQUksMEJBQTBCLEtBQUssVUFBVSxTQUFTO0FBQUEsRUFDOUQ7QUFFQSxRQUFNLGFBQWE7QUFBQSxJQUNqQixVQUFVLEtBQUs7QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFNBQVMsZUFBZSxRQUFRLGdCQUFnQixVQUFVLENBQUMsQ0FBQztBQUVsRSxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsVUFBVSxLQUFLO0FBQUEsTUFDZjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjs7O0FEak9PLElBQU0sVUFBVTtBQUFBLEVBQ3JCLFFBQVEsQ0FDTixZQUVBLENBQUMsT0FBTyxRQUFRLFNBQVM7QUFDdkIsVUFBTSxFQUFFLFdBQVcsV0FBVyxJQUFJO0FBQUEsTUFDaEM7QUFBQSxNQUNBLENBQUMsVUFBVTtBQUNULGdCQUFRLE9BQXlCLE1BQU07QUFBQSxNQUN6QztBQUFBLElBQ0Y7QUFFQSxRQUFJLE1BQU07QUFDUixpQkFBVyxRQUFRLFlBQVk7QUFDN0IsYUFBSyxJQUFJO0FBQUEsTUFDWDtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUNKO0FBV0EsSUFBTSxXQUFXLENBS2YsSUFDQSxRQVFpQixPQUFPLElBQUksR0FBRztBQVkxQixJQUFNLE9BQU8sQ0FLbEIsSUFDQSxRQWVHO0FBQ0gsUUFBTSxZQUFZLFNBQVMsSUFBSSxHQUFHO0FBSWxDLFFBQU0sY0FBYyxJQUFJO0FBQ3hCLFFBQU0sbUJBQW1CLElBQUk7QUFDN0IsUUFBTSxjQUFrRCxtQkFDekMsTUFBTSxhQUFvQixnQkFBdUIsSUFDNUQ7QUFFSixNQUFJLGFBQWE7QUFFZiwyQkFBdUIsV0FBa0IsV0FBVztBQUNwRCxJQUFxQixzQkFBc0IsSUFBSSxXQUFxQztBQUFBLEVBQ3RGO0FBT0EsUUFBTSxvQ0FBb0MsQ0FDeEMsV0FDa0M7QUFDbEMsVUFBTSxRQUFRLFVBQVUsTUFBTSxDQUFDLE9BQU87QUFBQSxNQUNwQyxPQUFPLE9BQU8sS0FBSyxNQUFNO0FBQ3ZCLFlBQUksQ0FBQyxVQUFVLE9BQU8sV0FBVyxTQUFVO0FBSTNDLGNBQU0sWUFBWSxrQkFBa0IsQ0FBUTtBQUM1QyxrQkFBVSxPQUFPLGlDQUFpQztBQUFBLFVBQ2hEO0FBQUEsVUFDQSxZQUFZO0FBQUEsWUFDVixZQUFZO0FBQUEsWUFDWixVQUFVO0FBQUEsWUFDVixjQUFjO0FBQUEsWUFDZCxhQUFhLFVBQVUsRUFBRTtBQUFBLFVBQzNCO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSCxDQUFDO0FBQUEsTUFDRCxLQUFLLE9BQU87QUFBQSxJQUNkLEVBQUU7QUFFRixJQUFjLG9CQUFvQixPQUFjO0FBQUEsTUFDOUMsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLElBQ1osQ0FBQztBQUNELFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSwwQkFBMEIsTUFBcUM7QUFDbkUsVUFBTSxRQUFRLFVBQVUsTUFBTSxDQUFDLE9BQU87QUFBQSxNQUNwQyxPQUFPLE9BQU8sSUFBSSxhQUFhO0FBQzdCLGNBQU0sWUFBWSxrQkFBa0IsQ0FBUTtBQUM1QyxjQUFNLG1CQUFtQixPQUFPLFNBQVMsSUFBVSx1QkFBdUI7QUFFMUUsY0FBTSxnQkFBZ0IsVUFBVSxPQUFPLDZCQUE2QjtBQUNwRSxZQUFJO0FBQ0osWUFBSTtBQUVKLFlBQUk7QUFDRjtBQUFDLFdBQUMsRUFBRSxRQUFRLFNBQVMsSUFBaUIsMkJBQTJCO0FBQUEsWUFDL0QsVUFBVTtBQUFBLFlBQ1Y7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNILFNBQVMsT0FBTztBQUNkLGNBQ0UscUJBQXFCLFNBQ3JCLFNBQ0EsT0FBTyxVQUFVLFlBQ2hCLE1BQWMsU0FBUyw2QkFDeEI7QUFDQSxrQkFBTSxZQUFZLE1BQU0sUUFBUyxNQUFjLFNBQVMsSUFDbEQsTUFBYyxZQUNoQixDQUFDO0FBQ0wsa0JBQU0sV0FBVyxVQUNkLElBQUksQ0FBQyxNQUFZLEtBQUssT0FBTyxNQUFNLFdBQVksRUFBVSxVQUFVLE1BQVUsRUFDN0UsT0FBTyxDQUFDLE1BQW1CLE9BQU8sTUFBTSxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQ2hFLE1BQU0sR0FBRyxFQUFFO0FBRWQsa0JBQU0sT0FDSixxQkFBcUIsU0FDakI7QUFBQSxjQUNFLGVBQWUsVUFBVTtBQUFBLGNBQ3pCO0FBQUEsWUFDRixJQUNBO0FBQUEsY0FDRSxlQUFlLFVBQVU7QUFBQSxjQUN6QjtBQUFBLFlBQ0Y7QUFFTixtQkFBYSxPQUFPO0FBQUEsY0FDbEIsTUFBTTtBQUFBLGNBQ04sVUFBVTtBQUFBLGNBQ1YsWUFBWSxVQUFVO0FBQUEsY0FDdEI7QUFBQSxZQUNGLENBQVE7QUFBQSxVQUNWO0FBRUEsZ0JBQU07QUFBQSxRQUNSO0FBRUEsa0JBQVUsT0FBTyx3QkFBd0IsUUFBUTtBQUNqRCxrQkFBVSxPQUFPLG1CQUFtQjtBQUVwQyxZQUFJLHFCQUFxQixPQUFPO0FBQzlCLGdCQUFNLE9BQ0oscUJBQXFCLFNBQ2pCO0FBQUEsWUFDRSxRQUFRLFNBQVM7QUFBQSxZQUNqQixPQUFPLFNBQVMsT0FBTztBQUFBLFlBQ3ZCLFFBQVEsU0FBUztBQUFBLFlBQ2pCLGlCQUFpQixTQUFTO0FBQUEsVUFDNUIsSUFDQTtBQUFBLFlBQ0UsUUFBUSxTQUFTO0FBQUEsWUFDakIsT0FBTyxTQUFTLE9BQU87QUFBQSxVQUN6QjtBQUVOLGlCQUFhLE9BQU87QUFBQSxZQUNsQixNQUFNO0FBQUEsWUFDTixVQUFVO0FBQUEsWUFDVixZQUFZLFVBQVU7QUFBQSxZQUN0QjtBQUFBLFVBQ0YsQ0FBUTtBQUFBLFFBQ1Y7QUFFQSxZQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUUsV0FBVyxHQUFHO0FBQ3BDO0FBQUEsUUFDRjtBQUVBLGNBQU0sa0JBQ0osY0FBYyxXQUFXLEtBQ3pCLGNBQWMsQ0FBQyxHQUFHLFlBQVksZUFBZTtBQUkvQyxjQUFNLFVBQ0osbUJBQW1CLGNBQ2YsY0FDVyxNQUFNLGFBQW9CLE1BQWE7QUFHeEQsK0JBQXVCLFdBQWtCLE9BQU87QUFDaEQsUUFBcUIsc0JBQXNCLElBQUksT0FBaUM7QUFFaEYsZUFBa0IsUUFBUSxHQUFvQyxPQUFPO0FBQUEsTUFDdkUsQ0FBQztBQUFBLE1BQ0QsS0FBSyxPQUFPO0FBQUEsSUFDZCxFQUFFO0FBRUYsSUFBYyxvQkFBb0IsT0FBYztBQUFBLE1BQzlDLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxJQUNaLENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDVDtBQUdBLFFBQU0sb0JBQW9CLFVBQVU7QUFDbkMsRUFBQyxVQUFrQixhQUFhLENBQVksV0FPdkM7QUFDSixVQUFNLGFBQWMsT0FBTyxVQUFVLENBQUM7QUFNdEMsVUFBTSxjQUNKLElBQUksU0FBUyxDQUFDLGtDQUFrQyxJQUFJLE1BQU0sQ0FBUSxJQUFJLENBQUM7QUFFekUsVUFBTSxXQUFXLHdCQUF3QjtBQU16QyxVQUFNLGVBQWUsQ0FBQyxHQUFHLGFBQWEsR0FBRyxZQUFZLFFBQVE7QUFFN0QsV0FBTyxrQkFBcUI7QUFBQSxNQUMxQixHQUFHO0FBQUEsTUFDSCxRQUFRO0FBQUEsSUFDVixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsidHJhaXRzIl0KfQo=