@logixjs/sandbox 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -1,395 +0,0 @@
1
- // @logixjs/core subpath bundles for @logixjs/sandbox
2
-
3
- import {
4
- fnv1a32,
5
- stableStringify
6
- } from "./chunk-S46P7MC6.js";
7
-
8
- // ../logix-core/src/internal/runtime/core/ReadQuery.ts
9
- function isReadQuery(input) {
10
- if (!input || typeof input !== "object" && typeof input !== "function") return false;
11
- const maybe = input;
12
- return typeof maybe.selectorId === "string" && typeof maybe.select === "function" && Array.isArray(maybe.reads);
13
- }
14
- var normalizeReads = (reads) => {
15
- const unique = [];
16
- const seen = /* @__PURE__ */ new Set();
17
- for (const r of reads) {
18
- const key = typeof r === "number" ? `n:${r}` : `s:${r}`;
19
- if (seen.has(key)) continue;
20
- seen.add(key);
21
- unique.push(r);
22
- }
23
- return unique.slice().sort((a, b) => String(a).localeCompare(String(b)));
24
- };
25
- var toHash32Number = (hex) => Number.parseInt(hex, 16);
26
- var makeReadsDigest = (reads) => {
27
- const normalized = normalizeReads(reads);
28
- return {
29
- count: normalized.length,
30
- hash: toHash32Number(fnv1a32(stableStringify(normalized)))
31
- };
32
- };
33
- var computeSelectorId = (value) => `rq_${fnv1a32(stableStringify(value))}`;
34
- var nextUnstableSelectorSeq = 0;
35
- var unstableSelectorIdByFn = /* @__PURE__ */ new WeakMap();
36
- var computeUnstableSelectorId = (selector) => {
37
- const existing = unstableSelectorIdByFn.get(selector);
38
- if (existing) return existing;
39
- nextUnstableSelectorSeq += 1;
40
- const selectorId = `rq_u${nextUnstableSelectorSeq}`;
41
- unstableSelectorIdByFn.set(selector, selectorId);
42
- return selectorId;
43
- };
44
- var unwrapParens = (input) => {
45
- const trimmed = input.trim();
46
- if (trimmed.startsWith("(") && trimmed.endsWith(")")) {
47
- const inner = trimmed.slice(1, -1).trim();
48
- if (!inner.startsWith("(") || !inner.endsWith(")")) {
49
- return inner;
50
- }
51
- }
52
- return trimmed;
53
- };
54
- var extractArrow = (source) => {
55
- const idx = source.indexOf("=>");
56
- if (idx < 0) return void 0;
57
- const left = source.slice(0, idx).trim();
58
- const right = source.slice(idx + 2).trim();
59
- const paramRaw = unwrapParens(left);
60
- if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(paramRaw)) return void 0;
61
- if (right.startsWith("{")) {
62
- const m = right.match(/^\{\s*return\s+(.+?);?\s*\}\s*$/s);
63
- if (!m) return void 0;
64
- return { param: paramRaw, body: m[1]?.trim() ?? "" };
65
- }
66
- return { param: paramRaw, body: right };
67
- };
68
- var extractFunctionReturn = (source) => {
69
- const trimmed = source.trim();
70
- const m = trimmed.match(
71
- /^function\s*(?:[A-Za-z_$][A-Za-z0-9_$]*\s*)?\(\s*([A-Za-z_$][A-Za-z0-9_$]*)\s*\)\s*\{\s*return\s+(.+?);?\s*\}\s*$/s
72
- );
73
- if (!m) return void 0;
74
- const param = m[1]?.trim() ?? "";
75
- if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(param)) return void 0;
76
- const body = m[2]?.trim() ?? "";
77
- if (body.length === 0) return void 0;
78
- return { param, body };
79
- };
80
- var tryParseSelectorSource = (source) => {
81
- const arrowOrFn = extractArrow(source) ?? extractFunctionReturn(source);
82
- if (!arrowOrFn) return void 0;
83
- const expr = unwrapParens(arrowOrFn.body).trim().replace(/;$/, "").trim();
84
- {
85
- const re = new RegExp(`^${arrowOrFn.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
86
- const m = expr.match(re);
87
- if (m) {
88
- return { kind: "path", path: m[1] };
89
- }
90
- }
91
- if (expr.startsWith("{") && expr.endsWith("}")) {
92
- const inner = expr.slice(1, -1).trim();
93
- if (inner.length === 0) return { kind: "struct", entries: [] };
94
- const parts = inner.split(",").map((p) => p.trim()).filter((p) => p.length > 0);
95
- const entries = [];
96
- for (const part of parts) {
97
- const idx = part.indexOf(":");
98
- if (idx < 0) return void 0;
99
- const key = part.slice(0, idx).trim();
100
- const value = part.slice(idx + 1).trim();
101
- if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) return void 0;
102
- const re = new RegExp(`^${arrowOrFn.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
103
- const m = value.match(re);
104
- if (!m) return void 0;
105
- entries.push([key, m[1]]);
106
- }
107
- entries.sort((a, b) => a[0].localeCompare(b[0]));
108
- return { kind: "struct", entries };
109
- }
110
- return void 0;
111
- };
112
- var READ_QUERY_TEMPLATE_CACHE_MAX = 2048;
113
- var readQueryTemplateByFn = /* @__PURE__ */ new WeakMap();
114
- var readQueryTemplateBySource = /* @__PURE__ */ new Map();
115
- var lruGet = (map, key) => {
116
- const value = map.get(key);
117
- if (value === void 0) return void 0;
118
- map.delete(key);
119
- map.set(key, value);
120
- return value;
121
- };
122
- var lruSet = (map, key, value, maxSize) => {
123
- if (map.has(key)) map.delete(key);
124
- map.set(key, value);
125
- if (map.size <= maxSize) return;
126
- const oldestKey = map.keys().next().value;
127
- if (oldestKey !== void 0) {
128
- map.delete(oldestKey);
129
- }
130
- };
131
- var safeToString = (fn) => {
132
- try {
133
- return fn.toString();
134
- } catch {
135
- return "";
136
- }
137
- };
138
- var make = (spec) => spec;
139
- var compile = (input) => {
140
- if (isReadQuery(input)) {
141
- const reads = normalizeReads(input.reads);
142
- const readsDigest = reads.length > 0 ? makeReadsDigest(reads) : void 0;
143
- const equalsKind = input.equalsKind;
144
- const staticIr2 = {
145
- selectorId: input.selectorId,
146
- debugKey: input.debugKey,
147
- lane: "static",
148
- producer: "manual",
149
- reads,
150
- readsDigest,
151
- equalsKind
152
- };
153
- return {
154
- ...input,
155
- reads,
156
- lane: "static",
157
- producer: "manual",
158
- readsDigest,
159
- staticIr: staticIr2
160
- };
161
- }
162
- const selector = input;
163
- const debugKey = (typeof selector?.debugKey === "string" && selector.debugKey.length > 0 ? selector.debugKey : void 0) ?? (typeof selector.name === "string" && selector.name.length > 0 ? selector.name : void 0);
164
- const declaredReads = Array.isArray(selector?.fieldPaths) ? selector.fieldPaths.filter((x) => typeof x === "string") : void 0;
165
- if (declaredReads && declaredReads.length > 0) {
166
- const reads = normalizeReads(declaredReads);
167
- const readsDigest = makeReadsDigest(reads);
168
- const selectorId2 = computeSelectorId({ kind: "reads", reads });
169
- const staticIr2 = {
170
- selectorId: selectorId2,
171
- debugKey,
172
- lane: "static",
173
- producer: "jit",
174
- reads,
175
- readsDigest,
176
- equalsKind: "objectIs"
177
- };
178
- return {
179
- selectorId: selectorId2,
180
- debugKey,
181
- reads,
182
- select: selector,
183
- equalsKind: "objectIs",
184
- lane: "static",
185
- producer: "jit",
186
- readsDigest,
187
- staticIr: staticIr2
188
- };
189
- }
190
- const cachedByFn = readQueryTemplateByFn.get(selector);
191
- if (cachedByFn) {
192
- const staticIr2 = {
193
- selectorId: cachedByFn.selectorId,
194
- debugKey,
195
- lane: "static",
196
- producer: "jit",
197
- reads: cachedByFn.reads,
198
- readsDigest: cachedByFn.readsDigest,
199
- equalsKind: cachedByFn.equalsKind
200
- };
201
- return {
202
- selectorId: cachedByFn.selectorId,
203
- debugKey,
204
- reads: cachedByFn.reads,
205
- select: selector,
206
- equalsKind: cachedByFn.equalsKind,
207
- lane: "static",
208
- producer: "jit",
209
- readsDigest: cachedByFn.readsDigest,
210
- staticIr: staticIr2
211
- };
212
- }
213
- const srcTrimmed = safeToString(selector).trim();
214
- const cachedBySource = srcTrimmed.length > 0 ? lruGet(readQueryTemplateBySource, srcTrimmed) : void 0;
215
- if (cachedBySource) {
216
- readQueryTemplateByFn.set(selector, cachedBySource);
217
- const staticIr2 = {
218
- selectorId: cachedBySource.selectorId,
219
- debugKey,
220
- lane: "static",
221
- producer: "jit",
222
- reads: cachedBySource.reads,
223
- readsDigest: cachedBySource.readsDigest,
224
- equalsKind: cachedBySource.equalsKind
225
- };
226
- return {
227
- selectorId: cachedBySource.selectorId,
228
- debugKey,
229
- reads: cachedBySource.reads,
230
- select: selector,
231
- equalsKind: cachedBySource.equalsKind,
232
- lane: "static",
233
- producer: "jit",
234
- readsDigest: cachedBySource.readsDigest,
235
- staticIr: staticIr2
236
- };
237
- }
238
- const parsed = srcTrimmed.length > 0 ? tryParseSelectorSource(srcTrimmed) : void 0;
239
- if (parsed?.kind === "path") {
240
- const reads = [parsed.path];
241
- const readsDigest = makeReadsDigest(reads);
242
- const selectorId2 = computeSelectorId({ kind: "path", path: parsed.path });
243
- const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "objectIs" };
244
- readQueryTemplateByFn.set(selector, template);
245
- lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
246
- const staticIr2 = {
247
- selectorId: selectorId2,
248
- debugKey,
249
- lane: "static",
250
- producer: "jit",
251
- reads,
252
- readsDigest,
253
- equalsKind: "objectIs"
254
- };
255
- return {
256
- selectorId: selectorId2,
257
- debugKey,
258
- reads,
259
- select: selector,
260
- equalsKind: "objectIs",
261
- lane: "static",
262
- producer: "jit",
263
- readsDigest,
264
- staticIr: staticIr2
265
- };
266
- }
267
- if (parsed?.kind === "struct") {
268
- const reads = normalizeReads(parsed.entries.map(([, path]) => path));
269
- const readsDigest = makeReadsDigest(reads);
270
- const selectorId2 = computeSelectorId({ kind: "struct", entries: parsed.entries });
271
- const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "shallowStruct" };
272
- readQueryTemplateByFn.set(selector, template);
273
- lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
274
- const staticIr2 = {
275
- selectorId: selectorId2,
276
- debugKey,
277
- lane: "static",
278
- producer: "jit",
279
- reads,
280
- readsDigest,
281
- equalsKind: "shallowStruct"
282
- };
283
- return {
284
- selectorId: selectorId2,
285
- debugKey,
286
- reads,
287
- select: selector,
288
- equalsKind: "shallowStruct",
289
- lane: "static",
290
- producer: "jit",
291
- readsDigest,
292
- staticIr: staticIr2
293
- };
294
- }
295
- const baseFallbackReason = srcTrimmed.includes("=>") || srcTrimmed.startsWith("function") ? "unsupportedSyntax" : "missingDeps";
296
- const lowDiscriminabilitySource = srcTrimmed.length === 0 || srcTrimmed.includes("[native code]");
297
- const fallbackReason = !debugKey || lowDiscriminabilitySource ? "unstableSelectorId" : baseFallbackReason;
298
- const selectorId = fallbackReason === "unstableSelectorId" ? computeUnstableSelectorId(selector) : computeSelectorId({ kind: "dynamic", debugKey, src: srcTrimmed });
299
- const staticIr = {
300
- selectorId,
301
- debugKey,
302
- lane: "dynamic",
303
- producer: "dynamic",
304
- fallbackReason,
305
- equalsKind: "objectIs"
306
- };
307
- return {
308
- selectorId,
309
- debugKey,
310
- reads: [],
311
- select: selector,
312
- equalsKind: "objectIs",
313
- lane: "dynamic",
314
- producer: "dynamic",
315
- fallbackReason,
316
- staticIr
317
- };
318
- };
319
- var filterNonEmpty = (values) => {
320
- if (!values || values.length === 0) return void 0;
321
- const next = values.map((v) => v.trim()).filter((v) => v.length > 0);
322
- return next.length > 0 ? next : void 0;
323
- };
324
- var makeStrictGateDiagnostic = (args) => {
325
- const severity = args.config.mode === "warn" ? "warning" : "error";
326
- return {
327
- type: "diagnostic",
328
- moduleId: args.details.moduleId,
329
- instanceId: args.details.instanceId,
330
- txnSeq: args.details.txnSeq,
331
- code: "read_query::strict_gate",
332
- severity,
333
- message: `ReadQuery strict gate violated: selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`,
334
- hint: "Fix: make the selector statically compilable (AOT/JIT) or pass an explicit ReadQuery; or disable/narrow the gate via RuntimeOptions.readQuery.strictGate.requireStatic / denyFallbackReasons.",
335
- kind: "read_query:strict_gate",
336
- trigger: {
337
- kind: "read_query",
338
- name: "strict_gate",
339
- details: args.details
340
- }
341
- };
342
- };
343
- var makeStrictGateError = (args) => Object.assign(
344
- new Error(
345
- `[ReadQueryStrictGateError] selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`
346
- ),
347
- {
348
- _tag: "ReadQueryStrictGateError",
349
- details: args.details
350
- }
351
- );
352
- var evaluateStrictGate = (args) => {
353
- if (args.config.mode === "off") {
354
- return { verdict: "PASS" };
355
- }
356
- if (args.compiled.lane !== "dynamic") {
357
- return { verdict: "PASS" };
358
- }
359
- const fallbackReason = args.compiled.fallbackReason ?? "missingDeps";
360
- const denyFallbackReasons = args.config.denyFallbackReasons;
361
- const denied = !!denyFallbackReasons?.includes(fallbackReason);
362
- const selectorIds = filterNonEmpty(args.config.requireStatic?.selectorIds);
363
- const modules = filterNonEmpty(args.config.requireStatic?.modules);
364
- const hasCoverageFilter = !!selectorIds || !!modules;
365
- const matchedSelectorId = !!selectorIds?.includes(args.compiled.selectorId);
366
- const matchedModule = !!modules?.includes(args.moduleId);
367
- const coveredByRequireStatic = !hasCoverageFilter || matchedSelectorId || matchedModule;
368
- if (!denied && !coveredByRequireStatic) {
369
- return { verdict: "PASS" };
370
- }
371
- const rule = denied ? "denyFallbackReason" : !hasCoverageFilter ? "requireStatic:global" : matchedSelectorId ? "requireStatic:selectorId" : "requireStatic:module";
372
- const details = {
373
- moduleId: args.moduleId,
374
- instanceId: args.instanceId,
375
- txnSeq: args.txnSeq,
376
- selectorId: args.compiled.selectorId,
377
- debugKey: args.compiled.debugKey,
378
- fallbackReason,
379
- rule
380
- };
381
- const diagnostic = makeStrictGateDiagnostic({ config: args.config, details });
382
- if (args.config.mode === "warn") {
383
- return { verdict: "WARN", diagnostic, details };
384
- }
385
- const error = makeStrictGateError({ details });
386
- return { verdict: "FAIL", diagnostic, error, details };
387
- };
388
-
389
- export {
390
- isReadQuery,
391
- make,
392
- compile,
393
- evaluateStrictGate
394
- };
395
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1JlYWRRdWVyeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBEZWJ1Z1NpbmsgZnJvbSAnLi9EZWJ1Z1NpbmsuanMnXG5cbmV4cG9ydCB0eXBlIFJlYWRMYW5lID0gJ3N0YXRpYycgfCAnZHluYW1pYydcblxuZXhwb3J0IHR5cGUgUmVhZFByb2R1Y2VyID0gJ2FvdCcgfCAnaml0JyB8ICdtYW51YWwnIHwgJ2R5bmFtaWMnXG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID0gJ21pc3NpbmdEZXBzJyB8ICd1bnN1cHBvcnRlZFN5bnRheCcgfCAndW5zdGFibGVTZWxlY3RvcklkJ1xuXG5leHBvcnQgdHlwZSBFcXVhbHNLaW5kID0gJ29iamVjdElzJyB8ICdzaGFsbG93U3RydWN0JyB8ICdjdXN0b20nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHNEaWdlc3Qge1xuICByZWFkb25seSBjb3VudDogbnVtYmVyXG4gIHJlYWRvbmx5IGhhc2g6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0YXRpY0lyIHtcbiAgcmVhZG9ubHkgc2VsZWN0b3JJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlYnVnS2V5Pzogc3RyaW5nXG4gIHJlYWRvbmx5IGxhbmU6IFJlYWRMYW5lXG4gIHJlYWRvbmx5IHByb2R1Y2VyOiBSZWFkUHJvZHVjZXJcbiAgcmVhZG9ubHkgcmVhZHM/OiBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlcj5cbiAgcmVhZG9ubHkgcmVhZHNEaWdlc3Q/OiBSZWFkc0RpZ2VzdFxuICByZWFkb25seSBmYWxsYmFja1JlYXNvbj86IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uXG4gIHJlYWRvbmx5IGVxdWFsc0tpbmQ6IEVxdWFsc0tpbmRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnk8UywgVj4ge1xuICByZWFkb25seSBzZWxlY3RvcklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGVidWdLZXk/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVtYmVyPlxuICByZWFkb25seSBzZWxlY3Q6IChzdGF0ZTogUykgPT4gVlxuICByZWFkb25seSBlcXVhbHNLaW5kOiBFcXVhbHNLaW5kXG4gIHJlYWRvbmx5IGVxdWFscz86IChwcmV2aW91czogViwgbmV4dDogVikgPT4gYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeUNvbXBpbGVkPFMsIFY+IGV4dGVuZHMgUmVhZFF1ZXJ5PFMsIFY+IHtcbiAgcmVhZG9ubHkgbGFuZTogUmVhZExhbmVcbiAgcmVhZG9ubHkgcHJvZHVjZXI6IFJlYWRQcm9kdWNlclxuICByZWFkb25seSByZWFkc0RpZ2VzdD86IFJlYWRzRGlnZXN0XG4gIHJlYWRvbmx5IGZhbGxiYWNrUmVhc29uPzogUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb25cbiAgcmVhZG9ubHkgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyXG59XG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUlucHV0PFMsIFY+ID0gKChzdGF0ZTogUykgPT4gVikgfCBSZWFkUXVlcnk8UywgVj5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5PFMsIFY+KGlucHV0OiBSZWFkUXVlcnlJbnB1dDxTLCBWPik6IGlucHV0IGlzIFJlYWRRdWVyeTxTLCBWPlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PiB7XG4gIGlmICghaW5wdXQgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGlucHV0ICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IG1heWJlID0gaW5wdXQgYXMgYW55XG4gIHJldHVybiB0eXBlb2YgbWF5YmUuc2VsZWN0b3JJZCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIG1heWJlLnNlbGVjdCA9PT0gJ2Z1bmN0aW9uJyAmJiBBcnJheS5pc0FycmF5KG1heWJlLnJlYWRzKVxufVxuXG5jb25zdCBub3JtYWxpemVSZWFkcyA9IChyZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0+IHtcbiAgY29uc3QgdW5pcXVlOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW11cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3QgciBvZiByZWFkcykge1xuICAgIGNvbnN0IGtleSA9IHR5cGVvZiByID09PSAnbnVtYmVyJyA/IGBuOiR7cn1gIDogYHM6JHtyfWBcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWVcbiAgICBzZWVuLmFkZChrZXkpXG4gICAgdW5pcXVlLnB1c2gocilcbiAgfVxuICByZXR1cm4gdW5pcXVlLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gU3RyaW5nKGEpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIpKSlcbn1cblxuY29uc3QgdG9IYXNoMzJOdW1iZXIgPSAoaGV4OiBzdHJpbmcpOiBudW1iZXIgPT4gTnVtYmVyLnBhcnNlSW50KGhleCwgMTYpXG5cbmNvbnN0IG1ha2VSZWFkc0RpZ2VzdCA9IChyZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUmVhZHNEaWdlc3QgPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUmVhZHMocmVhZHMpXG4gIHJldHVybiB7XG4gICAgY291bnQ6IG5vcm1hbGl6ZWQubGVuZ3RoLFxuICAgIGhhc2g6IHRvSGFzaDMyTnVtYmVyKGZudjFhMzIoc3RhYmxlU3RyaW5naWZ5KG5vcm1hbGl6ZWQpKSksXG4gIH1cbn1cblxuY29uc3QgY29tcHV0ZVNlbGVjdG9ySWQgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gYHJxXyR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkodmFsdWUpKX1gXG5cbmxldCBuZXh0VW5zdGFibGVTZWxlY3RvclNlcSA9IDBcbmNvbnN0IHVuc3RhYmxlU2VsZWN0b3JJZEJ5Rm4gPSBuZXcgV2Vha01hcDxGdW5jdGlvbiwgc3RyaW5nPigpXG5cbmNvbnN0IGNvbXB1dGVVbnN0YWJsZVNlbGVjdG9ySWQgPSAoc2VsZWN0b3I6IEZ1bmN0aW9uKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSB1bnN0YWJsZVNlbGVjdG9ySWRCeUZuLmdldChzZWxlY3RvcilcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcbiAgbmV4dFVuc3RhYmxlU2VsZWN0b3JTZXEgKz0gMVxuICBjb25zdCBzZWxlY3RvcklkID0gYHJxX3Uke25leHRVbnN0YWJsZVNlbGVjdG9yU2VxfWBcbiAgdW5zdGFibGVTZWxlY3RvcklkQnlGbi5zZXQoc2VsZWN0b3IsIHNlbGVjdG9ySWQpXG4gIHJldHVybiBzZWxlY3RvcklkXG59XG5cbmNvbnN0IHVud3JhcFBhcmVucyA9IChpbnB1dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHJpbW1lZCA9IGlucHV0LnRyaW0oKVxuICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCcoJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnKScpKSB7XG4gICAgY29uc3QgaW5uZXIgPSB0cmltbWVkLnNsaWNlKDEsIC0xKS50cmltKClcbiAgICAvLyBPbmx5IHVud3JhcCB0aGUgb3V0ZXJtb3N0IHBhaXIgb2YgcGFyZW50aGVzZXMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IGJyZWFraW5nIHN5bnRheC5cbiAgICBpZiAoIWlubmVyLnN0YXJ0c1dpdGgoJygnKSB8fCAhaW5uZXIuZW5kc1dpdGgoJyknKSkge1xuICAgICAgcmV0dXJuIGlubmVyXG4gICAgfVxuICB9XG4gIHJldHVybiB0cmltbWVkXG59XG5cbmNvbnN0IGV4dHJhY3RBcnJvdyA9IChzb3VyY2U6IHN0cmluZyk6IHsgcmVhZG9ubHkgcGFyYW06IHN0cmluZzsgcmVhZG9ubHkgYm9keTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBpZHggPSBzb3VyY2UuaW5kZXhPZignPT4nKVxuICBpZiAoaWR4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBsZWZ0ID0gc291cmNlLnNsaWNlKDAsIGlkeCkudHJpbSgpXG4gIGNvbnN0IHJpZ2h0ID0gc291cmNlLnNsaWNlKGlkeCArIDIpLnRyaW0oKVxuXG4gIGNvbnN0IHBhcmFtUmF3ID0gdW53cmFwUGFyZW5zKGxlZnQpXG4gIGlmICghL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokLy50ZXN0KHBhcmFtUmF3KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIC8vIGJsb2NrIGJvZHk6IHsgcmV0dXJuIGV4cHIgfVxuICBpZiAocmlnaHQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgY29uc3QgbSA9IHJpZ2h0Lm1hdGNoKC9eXFx7XFxzKnJldHVyblxccysoLis/KTs/XFxzKlxcfVxccyokL3MpXG4gICAgaWYgKCFtKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHsgcGFyYW06IHBhcmFtUmF3LCBib2R5OiBtWzFdPy50cmltKCkgPz8gJycgfVxuICB9XG5cbiAgcmV0dXJuIHsgcGFyYW06IHBhcmFtUmF3LCBib2R5OiByaWdodCB9XG59XG5cbmNvbnN0IGV4dHJhY3RGdW5jdGlvblJldHVybiA9IChzb3VyY2U6IHN0cmluZyk6IHsgcmVhZG9ubHkgcGFyYW06IHN0cmluZzsgcmVhZG9ubHkgYm9keTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB0cmltbWVkID0gc291cmNlLnRyaW0oKVxuICBjb25zdCBtID0gdHJpbW1lZC5tYXRjaChcbiAgICAvXmZ1bmN0aW9uXFxzKig/OltBLVphLXpfJF1bQS1aYS16MC05XyRdKlxccyopP1xcKFxccyooW0EtWmEtel8kXVtBLVphLXowLTlfJF0qKVxccypcXClcXHMqXFx7XFxzKnJldHVyblxccysoLis/KTs/XFxzKlxcfVxccyokL3MsXG4gIClcbiAgaWYgKCFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgcGFyYW0gPSBtWzFdPy50cmltKCkgPz8gJydcbiAgaWYgKCEvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQvLnRlc3QocGFyYW0pKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgYm9keSA9IG1bMl0/LnRyaW0oKSA/PyAnJ1xuICBpZiAoYm9keS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4geyBwYXJhbSwgYm9keSB9XG59XG5cbnR5cGUgUGFyc2VkU2VsZWN0b3IgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3BhdGgnOyByZWFkb25seSBwYXRoOiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3N0cnVjdCc7IHJlYWRvbmx5IGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gfVxuXG5jb25zdCB0cnlQYXJzZVNlbGVjdG9yU291cmNlID0gKHNvdXJjZTogc3RyaW5nKTogUGFyc2VkU2VsZWN0b3IgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBhcnJvd09yRm4gPSBleHRyYWN0QXJyb3coc291cmNlKSA/PyBleHRyYWN0RnVuY3Rpb25SZXR1cm4oc291cmNlKVxuICBpZiAoIWFycm93T3JGbikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGV4cHIgPSB1bndyYXBQYXJlbnMoYXJyb3dPckZuLmJvZHkpLnRyaW0oKS5yZXBsYWNlKC87JC8sICcnKS50cmltKClcblxuICAvLyBwYXRoOiBzLmEuYlxuICB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBeJHthcnJvd09yRm4ucGFyYW19XFxcXC4oW0EtWmEtejAtOV8kXSsoPzpcXFxcLltBLVphLXowLTlfJF0rKSopJGApXG4gICAgY29uc3QgbSA9IGV4cHIubWF0Y2gocmUpXG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdwYXRoJywgcGF0aDogbVsxXSB9XG4gICAgfVxuICB9XG5cbiAgLy8gc3RydWN0OiAoeyBhOiBzLmEsIGI6IHMuYiB9KVxuICBpZiAoZXhwci5zdGFydHNXaXRoKCd7JykgJiYgZXhwci5lbmRzV2l0aCgnfScpKSB7XG4gICAgY29uc3QgaW5uZXIgPSBleHByLnNsaWNlKDEsIC0xKS50cmltKClcbiAgICBpZiAoaW5uZXIubGVuZ3RoID09PSAwKSByZXR1cm4geyBraW5kOiAnc3RydWN0JywgZW50cmllczogW10gfVxuXG4gICAgY29uc3QgcGFydHMgPSBpbm5lclxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoKHApID0+IHAudHJpbSgpKVxuICAgICAgLmZpbHRlcigocCkgPT4gcC5sZW5ndGggPiAwKVxuXG4gICAgY29uc3QgZW50cmllczogQXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCBpZHggPSBwYXJ0LmluZGV4T2YoJzonKVxuICAgICAgaWYgKGlkeCA8IDApIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGtleSA9IHBhcnQuc2xpY2UoMCwgaWR4KS50cmltKClcbiAgICAgIGNvbnN0IHZhbHVlID0gcGFydC5zbGljZShpZHggKyAxKS50cmltKClcblxuICAgICAgaWYgKCEvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQvLnRlc3Qoa2V5KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYF4ke2Fycm93T3JGbi5wYXJhbX1cXFxcLihbQS1aYS16MC05XyRdKyg/OlxcXFwuW0EtWmEtejAtOV8kXSspKikkYClcbiAgICAgIGNvbnN0IG0gPSB2YWx1ZS5tYXRjaChyZSlcbiAgICAgIGlmICghbSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgZW50cmllcy5wdXNoKFtrZXksIG1bMV1dIGFzIGNvbnN0KVxuICAgIH1cblxuICAgIC8vIFNvcnQgZW50cmllcyB0byBlbnN1cmUgYSBzdGFibGUgc2VsZWN0b3JJZC5cbiAgICBlbnRyaWVzLnNvcnQoKGEsIGIpID0+IGFbMF0ubG9jYWxlQ29tcGFyZShiWzBdKSlcbiAgICByZXR1cm4geyBraW5kOiAnc3RydWN0JywgZW50cmllcyB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbnR5cGUgUmVhZFF1ZXJ5U3RhdGljVGVtcGxhdGUgPSB7XG4gIHJlYWRvbmx5IHNlbGVjdG9ySWQ6IHN0cmluZ1xuICByZWFkb25seSByZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+XG4gIHJlYWRvbmx5IHJlYWRzRGlnZXN0OiBSZWFkc0RpZ2VzdFxuICByZWFkb25seSBlcXVhbHNLaW5kOiBFcXVhbHNLaW5kXG59XG5cbmNvbnN0IFJFQURfUVVFUllfVEVNUExBVEVfQ0FDSEVfTUFYID0gMjA0OFxuY29uc3QgcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuID0gbmV3IFdlYWtNYXA8RnVuY3Rpb24sIFJlYWRRdWVyeVN0YXRpY1RlbXBsYXRlPigpXG5jb25zdCByZWFkUXVlcnlUZW1wbGF0ZUJ5U291cmNlID0gbmV3IE1hcDxzdHJpbmcsIFJlYWRRdWVyeVN0YXRpY1RlbXBsYXRlPigpXG5cbmNvbnN0IGxydUdldCA9IDxLLCBWPihtYXA6IE1hcDxLLCBWPiwga2V5OiBLKTogViB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gbWFwLmdldChrZXkpXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gIG1hcC5kZWxldGUoa2V5KVxuICBtYXAuc2V0KGtleSwgdmFsdWUpXG4gIHJldHVybiB2YWx1ZVxufVxuXG5jb25zdCBscnVTZXQgPSA8SywgVj4obWFwOiBNYXA8SywgVj4sIGtleTogSywgdmFsdWU6IFYsIG1heFNpemU6IG51bWJlcikgPT4ge1xuICBpZiAobWFwLmhhcyhrZXkpKSBtYXAuZGVsZXRlKGtleSlcbiAgbWFwLnNldChrZXksIHZhbHVlKVxuICBpZiAobWFwLnNpemUgPD0gbWF4U2l6ZSkgcmV0dXJuXG4gIGNvbnN0IG9sZGVzdEtleSA9IG1hcC5rZXlzKCkubmV4dCgpLnZhbHVlIGFzIEsgfCB1bmRlZmluZWRcbiAgaWYgKG9sZGVzdEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWFwLmRlbGV0ZShvbGRlc3RLZXkpXG4gIH1cbn1cblxuY29uc3Qgc2FmZVRvU3RyaW5nID0gKGZuOiBGdW5jdGlvbik6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuLnRvU3RyaW5nKClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICcnXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1ha2UgPSA8UywgVj4oc3BlYzogUmVhZFF1ZXJ5PFMsIFY+KTogUmVhZFF1ZXJ5PFMsIFY+ID0+IHNwZWNcblxuZXhwb3J0IGNvbnN0IGNvbXBpbGUgPSA8UywgVj4oaW5wdXQ6IFJlYWRRdWVyeUlucHV0PFMsIFY+KTogUmVhZFF1ZXJ5Q29tcGlsZWQ8UywgVj4gPT4ge1xuICBpZiAoaXNSZWFkUXVlcnkoaW5wdXQpKSB7XG4gICAgY29uc3QgcmVhZHMgPSBub3JtYWxpemVSZWFkcyhpbnB1dC5yZWFkcylcbiAgICBjb25zdCByZWFkc0RpZ2VzdCA9IHJlYWRzLmxlbmd0aCA+IDAgPyBtYWtlUmVhZHNEaWdlc3QocmVhZHMpIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBlcXVhbHNLaW5kID0gaW5wdXQuZXF1YWxzS2luZFxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQ6IGlucHV0LnNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleTogaW5wdXQuZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnbWFudWFsJyxcbiAgICAgIHJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5pbnB1dCxcbiAgICAgIHJlYWRzLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ21hbnVhbCcsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIHN0YXRpY0lyLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlbGVjdG9yID0gaW5wdXRcbiAgY29uc3QgZGVidWdLZXkgPVxuICAgICh0eXBlb2YgKHNlbGVjdG9yIGFzIGFueSk/LmRlYnVnS2V5ID09PSAnc3RyaW5nJyAmJiAoc2VsZWN0b3IgYXMgYW55KS5kZWJ1Z0tleS5sZW5ndGggPiAwXG4gICAgICA/IChzZWxlY3RvciBhcyBhbnkpLmRlYnVnS2V5XG4gICAgICA6IHVuZGVmaW5lZCkgPz9cbiAgICAodHlwZW9mIChzZWxlY3RvciBhcyBhbnkpLm5hbWUgPT09ICdzdHJpbmcnICYmIChzZWxlY3RvciBhcyBhbnkpLm5hbWUubGVuZ3RoID4gMFxuICAgICAgPyAoc2VsZWN0b3IgYXMgYW55KS5uYW1lXG4gICAgICA6IHVuZGVmaW5lZClcblxuICBjb25zdCBkZWNsYXJlZFJlYWRzOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQgPSBBcnJheS5pc0FycmF5KChzZWxlY3RvciBhcyBhbnkpPy5maWVsZFBhdGhzKVxuICAgID8gKChzZWxlY3RvciBhcyBhbnkpLmZpZWxkUGF0aHMgYXMgUmVhZG9ubHlBcnJheTx1bmtub3duPikuZmlsdGVyKCh4KTogeCBpcyBzdHJpbmcgPT4gdHlwZW9mIHggPT09ICdzdHJpbmcnKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKGRlY2xhcmVkUmVhZHMgJiYgZGVjbGFyZWRSZWFkcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcmVhZHMgPSBub3JtYWxpemVSZWFkcyhkZWNsYXJlZFJlYWRzKVxuICAgIGNvbnN0IHJlYWRzRGlnZXN0ID0gbWFrZVJlYWRzRGlnZXN0KHJlYWRzKVxuICAgIGNvbnN0IHNlbGVjdG9ySWQgPSBjb21wdXRlU2VsZWN0b3JJZCh7IGtpbmQ6ICdyZWFkcycsIHJlYWRzIH0pXG5cbiAgICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICByZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBjYWNoZWRCeUZuID0gcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuLmdldChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uKVxuICBpZiAoY2FjaGVkQnlGbikge1xuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5Rm4uc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkczogY2FjaGVkQnlGbi5yZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0OiBjYWNoZWRCeUZuLnJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogY2FjaGVkQnlGbi5lcXVhbHNLaW5kLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkOiBjYWNoZWRCeUZuLnNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIHJlYWRzOiBjYWNoZWRCeUZuLnJlYWRzLFxuICAgICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgICBlcXVhbHNLaW5kOiBjYWNoZWRCeUZuLmVxdWFsc0tpbmQsXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzRGlnZXN0OiBjYWNoZWRCeUZuLnJlYWRzRGlnZXN0LFxuICAgICAgc3RhdGljSXIsXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3JjVHJpbW1lZCA9IHNhZmVUb1N0cmluZyhzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uKS50cmltKClcbiAgY29uc3QgY2FjaGVkQnlTb3VyY2UgPSBzcmNUcmltbWVkLmxlbmd0aCA+IDAgPyBscnVHZXQocmVhZFF1ZXJ5VGVtcGxhdGVCeVNvdXJjZSwgc3JjVHJpbW1lZCkgOiB1bmRlZmluZWRcbiAgaWYgKGNhY2hlZEJ5U291cmNlKSB7XG4gICAgcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuLnNldChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uLCBjYWNoZWRCeVNvdXJjZSlcbiAgICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgICBzZWxlY3RvcklkOiBjYWNoZWRCeVNvdXJjZS5zZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzOiBjYWNoZWRCeVNvdXJjZS5yZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0OiBjYWNoZWRCeVNvdXJjZS5yZWFkc0RpZ2VzdCxcbiAgICAgIGVxdWFsc0tpbmQ6IGNhY2hlZEJ5U291cmNlLmVxdWFsc0tpbmQsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5U291cmNlLnNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIHJlYWRzOiBjYWNoZWRCeVNvdXJjZS5yZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogY2FjaGVkQnlTb3VyY2UuZXF1YWxzS2luZCxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5U291cmNlLnJlYWRzRGlnZXN0LFxuICAgICAgc3RhdGljSXIsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gc3JjVHJpbW1lZC5sZW5ndGggPiAwID8gdHJ5UGFyc2VTZWxlY3RvclNvdXJjZShzcmNUcmltbWVkKSA6IHVuZGVmaW5lZFxuXG4gIGlmIChwYXJzZWQ/LmtpbmQgPT09ICdwYXRoJykge1xuICAgIGNvbnN0IHJlYWRzID0gW3BhcnNlZC5wYXRoXVxuICAgIGNvbnN0IHJlYWRzRGlnZXN0ID0gbWFrZVJlYWRzRGlnZXN0KHJlYWRzKVxuICAgIGNvbnN0IHNlbGVjdG9ySWQgPSBjb21wdXRlU2VsZWN0b3JJZCh7IGtpbmQ6ICdwYXRoJywgcGF0aDogcGFyc2VkLnBhdGggfSlcbiAgICBjb25zdCB0ZW1wbGF0ZTogUmVhZFF1ZXJ5U3RhdGljVGVtcGxhdGUgPSB7IHNlbGVjdG9ySWQsIHJlYWRzLCByZWFkc0RpZ2VzdCwgZXF1YWxzS2luZDogJ29iamVjdElzJyB9XG4gICAgcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuLnNldChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uLCB0ZW1wbGF0ZSlcbiAgICBscnVTZXQocmVhZFF1ZXJ5VGVtcGxhdGVCeVNvdXJjZSwgc3JjVHJpbW1lZCwgdGVtcGxhdGUsIFJFQURfUVVFUllfVEVNUExBVEVfQ0FDSEVfTUFYKVxuXG4gICAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgICAgc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHMsXG4gICAgICBzZWxlY3Q6IHNlbGVjdG9yIGFzIGFueSxcbiAgICAgIGVxdWFsc0tpbmQ6ICdvYmplY3RJcycsXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgc3RhdGljSXIsXG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcnNlZD8ua2luZCA9PT0gJ3N0cnVjdCcpIHtcbiAgICBjb25zdCByZWFkcyA9IG5vcm1hbGl6ZVJlYWRzKHBhcnNlZC5lbnRyaWVzLm1hcCgoWywgcGF0aF0pID0+IHBhdGgpKVxuICAgIGNvbnN0IHJlYWRzRGlnZXN0ID0gbWFrZVJlYWRzRGlnZXN0KHJlYWRzKVxuICAgIGNvbnN0IHNlbGVjdG9ySWQgPSBjb21wdXRlU2VsZWN0b3JJZCh7IGtpbmQ6ICdzdHJ1Y3QnLCBlbnRyaWVzOiBwYXJzZWQuZW50cmllcyB9KVxuICAgIGNvbnN0IHRlbXBsYXRlOiBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZSA9IHsgc2VsZWN0b3JJZCwgcmVhZHMsIHJlYWRzRGlnZXN0LCBlcXVhbHNLaW5kOiAnc2hhbGxvd1N0cnVjdCcgfVxuICAgIHJlYWRRdWVyeVRlbXBsYXRlQnlGbi5zZXQoc2VsZWN0b3IgYXMgdW5rbm93biBhcyBGdW5jdGlvbiwgdGVtcGxhdGUpXG4gICAgbHJ1U2V0KHJlYWRRdWVyeVRlbXBsYXRlQnlTb3VyY2UsIHNyY1RyaW1tZWQsIHRlbXBsYXRlLCBSRUFEX1FVRVJZX1RFTVBMQVRFX0NBQ0hFX01BWClcblxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHMsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIGVxdWFsc0tpbmQ6ICdzaGFsbG93U3RydWN0JyxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHMsXG4gICAgICBzZWxlY3Q6IHNlbGVjdG9yIGFzIGFueSxcbiAgICAgIGVxdWFsc0tpbmQ6ICdzaGFsbG93U3RydWN0JyxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICAvLyBEeW5hbWljIGxhbmUgZmFsbGJhY2sgKG5vIHN0YWJsZSByZWFkcyAvIHVuc3VwcG9ydGVkIHN1YnNldClcbiAgY29uc3QgYmFzZUZhbGxiYWNrUmVhc29uOiBSZWFkUXVlcnlGYWxsYmFja1JlYXNvbiA9XG4gICAgc3JjVHJpbW1lZC5pbmNsdWRlcygnPT4nKSB8fCBzcmNUcmltbWVkLnN0YXJ0c1dpdGgoJ2Z1bmN0aW9uJykgPyAndW5zdXBwb3J0ZWRTeW50YXgnIDogJ21pc3NpbmdEZXBzJ1xuXG4gIGNvbnN0IGxvd0Rpc2NyaW1pbmFiaWxpdHlTb3VyY2UgPSBzcmNUcmltbWVkLmxlbmd0aCA9PT0gMCB8fCBzcmNUcmltbWVkLmluY2x1ZGVzKCdbbmF0aXZlIGNvZGVdJylcbiAgY29uc3QgZmFsbGJhY2tSZWFzb246IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID1cbiAgICAhZGVidWdLZXkgfHwgbG93RGlzY3JpbWluYWJpbGl0eVNvdXJjZSA/ICd1bnN0YWJsZVNlbGVjdG9ySWQnIDogYmFzZUZhbGxiYWNrUmVhc29uXG5cbiAgY29uc3Qgc2VsZWN0b3JJZCA9XG4gICAgZmFsbGJhY2tSZWFzb24gPT09ICd1bnN0YWJsZVNlbGVjdG9ySWQnXG4gICAgICA/IGNvbXB1dGVVbnN0YWJsZVNlbGVjdG9ySWQoc2VsZWN0b3IgYXMgdW5rbm93biBhcyBGdW5jdGlvbilcbiAgICAgIDogY29tcHV0ZVNlbGVjdG9ySWQoeyBraW5kOiAnZHluYW1pYycsIGRlYnVnS2V5LCBzcmM6IHNyY1RyaW1tZWQgfSlcbiAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgIHNlbGVjdG9ySWQsXG4gICAgZGVidWdLZXksXG4gICAgbGFuZTogJ2R5bmFtaWMnLFxuICAgIHByb2R1Y2VyOiAnZHluYW1pYycsXG4gICAgZmFsbGJhY2tSZWFzb24sXG4gICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VsZWN0b3JJZCxcbiAgICBkZWJ1Z0tleSxcbiAgICByZWFkczogW10sXG4gICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgICBsYW5lOiAnZHluYW1pYycsXG4gICAgcHJvZHVjZXI6ICdkeW5hbWljJyxcbiAgICBmYWxsYmFja1JlYXNvbixcbiAgICBzdGF0aWNJcixcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0cmljdEdhdGVDb25maWcge1xuICByZWFkb25seSBtb2RlOiAnb2ZmJyB8ICd3YXJuJyB8ICdlcnJvcidcbiAgcmVhZG9ubHkgcmVxdWlyZVN0YXRpYz86IHtcbiAgICByZWFkb25seSBzZWxlY3Rvcklkcz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICAgIHJlYWRvbmx5IG1vZHVsZXM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgfVxuICByZWFkb25seSBkZW55RmFsbGJhY2tSZWFzb25zPzogUmVhZG9ubHlBcnJheTxSZWFkUXVlcnlGYWxsYmFja1JlYXNvbj5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlscyB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHR4blNlcTogbnVtYmVyXG4gIHJlYWRvbmx5IHNlbGVjdG9ySWQ6IHN0cmluZ1xuICByZWFkb25seSBkZWJ1Z0tleT86IHN0cmluZ1xuICByZWFkb25seSBmYWxsYmFja1JlYXNvbjogUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb25cbiAgcmVhZG9ubHkgcnVsZTogJ2RlbnlGYWxsYmFja1JlYXNvbicgfCAncmVxdWlyZVN0YXRpYzpnbG9iYWwnIHwgJ3JlcXVpcmVTdGF0aWM6c2VsZWN0b3JJZCcgfCAncmVxdWlyZVN0YXRpYzptb2R1bGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnOiAnUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yJ1xuICByZWFkb25seSBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1xufVxuXG5leHBvcnQgdHlwZSBSZWFkUXVlcnlTdHJpY3RHYXRlRGlhZ25vc3RpY0V2ZW50ID0gRXh0cmFjdDxEZWJ1Z1NpbmsuRXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogJ2RpYWdub3N0aWMnIH0+XG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeVN0cmljdEdhdGVEZWNpc2lvbiA9XG4gIHwgeyByZWFkb25seSB2ZXJkaWN0OiAnUEFTUycgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHZlcmRpY3Q6ICdXQVJOJ1xuICAgICAgcmVhZG9ubHkgZGlhZ25vc3RpYzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZURpYWdub3N0aWNFdmVudFxuICAgICAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdmVyZGljdDogJ0ZBSUwnXG4gICAgICByZWFkb25seSBkaWFnbm9zdGljOiBSZWFkUXVlcnlTdHJpY3RHYXRlRGlhZ25vc3RpY0V2ZW50XG4gICAgICByZWFkb25seSBlcnJvcjogUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yXG4gICAgICByZWFkb25seSBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1xuICAgIH1cblxuY29uc3QgZmlsdGVyTm9uRW1wdHkgPSAodmFsdWVzOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQpOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXZhbHVlcyB8fCB2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG5leHQgPSB2YWx1ZXMubWFwKCh2KSA9PiB2LnRyaW0oKSkuZmlsdGVyKCh2KSA9PiB2Lmxlbmd0aCA+IDApXG4gIHJldHVybiBuZXh0Lmxlbmd0aCA+IDAgPyBuZXh0IDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IG1ha2VTdHJpY3RHYXRlRGlhZ25vc3RpYyA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IGNvbmZpZzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZUNvbmZpZ1xuICByZWFkb25seSBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1xufSk6IFJlYWRRdWVyeVN0cmljdEdhdGVEaWFnbm9zdGljRXZlbnQgPT4ge1xuICBjb25zdCBzZXZlcml0eSA9IGFyZ3MuY29uZmlnLm1vZGUgPT09ICd3YXJuJyA/ICgnd2FybmluZycgYXMgY29uc3QpIDogKCdlcnJvcicgYXMgY29uc3QpXG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnZGlhZ25vc3RpYycsXG4gICAgbW9kdWxlSWQ6IGFyZ3MuZGV0YWlscy5tb2R1bGVJZCxcbiAgICBpbnN0YW5jZUlkOiBhcmdzLmRldGFpbHMuaW5zdGFuY2VJZCxcbiAgICB0eG5TZXE6IGFyZ3MuZGV0YWlscy50eG5TZXEsXG4gICAgY29kZTogJ3JlYWRfcXVlcnk6OnN0cmljdF9nYXRlJyxcbiAgICBzZXZlcml0eSxcbiAgICBtZXNzYWdlOiBgUmVhZFF1ZXJ5IHN0cmljdCBnYXRlIHZpb2xhdGVkOiBzZWxlY3RvciBlbnRlcmVkIGR5bmFtaWMgbGFuZSAoc2VsZWN0b3JJZD0ke2FyZ3MuZGV0YWlscy5zZWxlY3RvcklkfSwgcmVhc29uPSR7YXJncy5kZXRhaWxzLmZhbGxiYWNrUmVhc29ufSkuYCxcbiAgICBoaW50OlxuICAgICAgJ0ZpeDogbWFrZSB0aGUgc2VsZWN0b3Igc3RhdGljYWxseSBjb21waWxhYmxlIChBT1QvSklUKSBvciBwYXNzIGFuIGV4cGxpY2l0IFJlYWRRdWVyeTsgJyArXG4gICAgICAnb3IgZGlzYWJsZS9uYXJyb3cgdGhlIGdhdGUgdmlhIFJ1bnRpbWVPcHRpb25zLnJlYWRRdWVyeS5zdHJpY3RHYXRlLnJlcXVpcmVTdGF0aWMgLyBkZW55RmFsbGJhY2tSZWFzb25zLicsXG4gICAga2luZDogJ3JlYWRfcXVlcnk6c3RyaWN0X2dhdGUnLFxuICAgIHRyaWdnZXI6IHtcbiAgICAgIGtpbmQ6ICdyZWFkX3F1ZXJ5JyxcbiAgICAgIG5hbWU6ICdzdHJpY3RfZ2F0ZScsXG4gICAgICBkZXRhaWxzOiBhcmdzLmRldGFpbHMsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBtYWtlU3RyaWN0R2F0ZUVycm9yID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbn0pOiBSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3IgPT5cbiAgT2JqZWN0LmFzc2lnbihcbiAgICBuZXcgRXJyb3IoXG4gICAgICBgW1JlYWRRdWVyeVN0cmljdEdhdGVFcnJvcl0gc2VsZWN0b3IgZW50ZXJlZCBkeW5hbWljIGxhbmUgKHNlbGVjdG9ySWQ9JHthcmdzLmRldGFpbHMuc2VsZWN0b3JJZH0sIHJlYXNvbj0ke2FyZ3MuZGV0YWlscy5mYWxsYmFja1JlYXNvbn0pLmAsXG4gICAgKSxcbiAgICB7XG4gICAgICBfdGFnOiAnUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yJyBhcyBjb25zdCxcbiAgICAgIGRldGFpbHM6IGFyZ3MuZGV0YWlscyxcbiAgICB9LFxuICApIGFzIFJlYWRRdWVyeVN0cmljdEdhdGVFcnJvclxuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVTdHJpY3RHYXRlID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgY29uZmlnOiBSZWFkUXVlcnlTdHJpY3RHYXRlQ29uZmlnXG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHR4blNlcTogbnVtYmVyXG4gIHJlYWRvbmx5IGNvbXBpbGVkOiBSZWFkUXVlcnlDb21waWxlZDxhbnksIGFueT5cbn0pOiBSZWFkUXVlcnlTdHJpY3RHYXRlRGVjaXNpb24gPT4ge1xuICBpZiAoYXJncy5jb25maWcubW9kZSA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4geyB2ZXJkaWN0OiAnUEFTUycgfVxuICB9XG5cbiAgaWYgKGFyZ3MuY29tcGlsZWQubGFuZSAhPT0gJ2R5bmFtaWMnKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogJ1BBU1MnIH1cbiAgfVxuXG4gIGNvbnN0IGZhbGxiYWNrUmVhc29uID0gKGFyZ3MuY29tcGlsZWQuZmFsbGJhY2tSZWFzb24gPz8gJ21pc3NpbmdEZXBzJykgYXMgUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb25cblxuICBjb25zdCBkZW55RmFsbGJhY2tSZWFzb25zID0gYXJncy5jb25maWcuZGVueUZhbGxiYWNrUmVhc29uc1xuICBjb25zdCBkZW5pZWQgPSAhIWRlbnlGYWxsYmFja1JlYXNvbnM/LmluY2x1ZGVzKGZhbGxiYWNrUmVhc29uKVxuXG4gIGNvbnN0IHNlbGVjdG9ySWRzID0gZmlsdGVyTm9uRW1wdHkoYXJncy5jb25maWcucmVxdWlyZVN0YXRpYz8uc2VsZWN0b3JJZHMpXG4gIGNvbnN0IG1vZHVsZXMgPSBmaWx0ZXJOb25FbXB0eShhcmdzLmNvbmZpZy5yZXF1aXJlU3RhdGljPy5tb2R1bGVzKVxuICBjb25zdCBoYXNDb3ZlcmFnZUZpbHRlciA9ICEhc2VsZWN0b3JJZHMgfHwgISFtb2R1bGVzXG5cbiAgY29uc3QgbWF0Y2hlZFNlbGVjdG9ySWQgPSAhIXNlbGVjdG9ySWRzPy5pbmNsdWRlcyhhcmdzLmNvbXBpbGVkLnNlbGVjdG9ySWQpXG4gIGNvbnN0IG1hdGNoZWRNb2R1bGUgPSAhIW1vZHVsZXM/LmluY2x1ZGVzKGFyZ3MubW9kdWxlSWQpXG4gIGNvbnN0IGNvdmVyZWRCeVJlcXVpcmVTdGF0aWMgPSAhaGFzQ292ZXJhZ2VGaWx0ZXIgfHwgbWF0Y2hlZFNlbGVjdG9ySWQgfHwgbWF0Y2hlZE1vZHVsZVxuXG4gIGlmICghZGVuaWVkICYmICFjb3ZlcmVkQnlSZXF1aXJlU3RhdGljKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogJ1BBU1MnIH1cbiAgfVxuXG4gIGNvbnN0IHJ1bGU6IFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzWydydWxlJ10gPSBkZW5pZWRcbiAgICA/ICdkZW55RmFsbGJhY2tSZWFzb24nXG4gICAgOiAhaGFzQ292ZXJhZ2VGaWx0ZXJcbiAgICAgID8gJ3JlcXVpcmVTdGF0aWM6Z2xvYmFsJ1xuICAgICAgOiBtYXRjaGVkU2VsZWN0b3JJZFxuICAgICAgICA/ICdyZXF1aXJlU3RhdGljOnNlbGVjdG9ySWQnXG4gICAgICAgIDogJ3JlcXVpcmVTdGF0aWM6bW9kdWxlJ1xuXG4gIGNvbnN0IGRldGFpbHM6IFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzID0ge1xuICAgIG1vZHVsZUlkOiBhcmdzLm1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQ6IGFyZ3MuaW5zdGFuY2VJZCxcbiAgICB0eG5TZXE6IGFyZ3MudHhuU2VxLFxuICAgIHNlbGVjdG9ySWQ6IGFyZ3MuY29tcGlsZWQuc2VsZWN0b3JJZCxcbiAgICBkZWJ1Z0tleTogYXJncy5jb21waWxlZC5kZWJ1Z0tleSxcbiAgICBmYWxsYmFja1JlYXNvbixcbiAgICBydWxlLFxuICB9XG5cbiAgY29uc3QgZGlhZ25vc3RpYyA9IG1ha2VTdHJpY3RHYXRlRGlhZ25vc3RpYyh7IGNvbmZpZzogYXJncy5jb25maWcsIGRldGFpbHMgfSlcblxuICBpZiAoYXJncy5jb25maWcubW9kZSA9PT0gJ3dhcm4nKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogJ1dBUk4nLCBkaWFnbm9zdGljLCBkZXRhaWxzIH1cbiAgfVxuXG4gIGNvbnN0IGVycm9yID0gbWFrZVN0cmljdEdhdGVFcnJvcih7IGRldGFpbHMgfSlcbiAgcmV0dXJuIHsgdmVyZGljdDogJ0ZBSUwnLCBkaWFnbm9zdGljLCBlcnJvciwgZGV0YWlscyB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztBQWdETyxTQUFTLFlBQVksT0FBOEM7QUFDeEUsTUFBSSxDQUFDLFNBQVUsT0FBTyxVQUFVLFlBQVksT0FBTyxVQUFVLFdBQWEsUUFBTztBQUNqRixRQUFNLFFBQVE7QUFDZCxTQUFPLE9BQU8sTUFBTSxlQUFlLFlBQVksT0FBTyxNQUFNLFdBQVcsY0FBYyxNQUFNLFFBQVEsTUFBTSxLQUFLO0FBQ2hIO0FBRUEsSUFBTSxpQkFBaUIsQ0FBQyxVQUEwRTtBQUNoRyxRQUFNLFNBQWlDLENBQUM7QUFDeEMsUUFBTSxPQUFPLG9CQUFJLElBQVk7QUFDN0IsYUFBVyxLQUFLLE9BQU87QUFDckIsVUFBTSxNQUFNLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUNyRCxRQUFJLEtBQUssSUFBSSxHQUFHLEVBQUc7QUFDbkIsU0FBSyxJQUFJLEdBQUc7QUFDWixX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