@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,907 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ exportStaticIr
5
+ } from "./chunk-QGIM3FQK.js";
6
+ import {
7
+ installSourceRefresh
8
+ } from "./chunk-SYEHKMLP.js";
9
+ import {
10
+ getAtPath
11
+ } from "./chunk-PHV4HYHB.js";
12
+ import {
13
+ compareFieldPath,
14
+ getFieldPathId,
15
+ makeFieldPathIdRegistry,
16
+ normalizeFieldPath
17
+ } from "./chunk-5XOBKSOT.js";
18
+ import {
19
+ getBoundInternals
20
+ } from "./chunk-6FKWRVP4.js";
21
+
22
+ // ../logix-core/src/internal/state-trait/meta.ts
23
+ var uniqSortedStrings = (input) => {
24
+ const set = /* @__PURE__ */ new Set();
25
+ for (const item of input) {
26
+ const v = item.trim();
27
+ if (!v) continue;
28
+ set.add(v);
29
+ }
30
+ return Array.from(set).sort((a, b) => a.localeCompare(b));
31
+ };
32
+ var isPlainRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
33
+ var sanitizeJsonValue = (input, depth) => {
34
+ if (input === null) return null;
35
+ if (typeof input === "string") return input;
36
+ if (typeof input === "boolean") return input;
37
+ if (typeof input === "number") {
38
+ return Number.isFinite(input) ? input : void 0;
39
+ }
40
+ if (depth >= 6) return void 0;
41
+ if (Array.isArray(input)) {
42
+ const out = [];
43
+ for (const item of input) {
44
+ const v = sanitizeJsonValue(item, depth + 1);
45
+ if (v !== void 0) out.push(v);
46
+ }
47
+ return out;
48
+ }
49
+ if (isPlainRecord(input)) {
50
+ const keys = Object.keys(input).sort();
51
+ const out = {};
52
+ for (const key of keys) {
53
+ const v = sanitizeJsonValue(input[key], depth + 1);
54
+ if (v !== void 0) out[key] = v;
55
+ }
56
+ return out;
57
+ }
58
+ return void 0;
59
+ };
60
+ var sanitize = (input) => {
61
+ if (input === null || input === void 0) return void 0;
62
+ if (typeof input !== "object" || Array.isArray(input)) return void 0;
63
+ const record = input;
64
+ const out = {};
65
+ const pickString = (key) => {
66
+ const value = record[key];
67
+ if (typeof value !== "string") return;
68
+ const trimmed = value.trim();
69
+ if (!trimmed) return;
70
+ out[key] = trimmed;
71
+ };
72
+ pickString("label");
73
+ pickString("description");
74
+ pickString("group");
75
+ pickString("docsUrl");
76
+ pickString("cacheGroup");
77
+ const canonical = record.canonical;
78
+ if (typeof canonical === "boolean") {
79
+ out.canonical = canonical;
80
+ }
81
+ const tagsRaw = record.tags;
82
+ if (typeof tagsRaw === "string") {
83
+ const tags = uniqSortedStrings([tagsRaw]);
84
+ if (tags.length > 0) out.tags = tags;
85
+ } else if (Array.isArray(tagsRaw)) {
86
+ const tags = uniqSortedStrings(tagsRaw.filter((x) => typeof x === "string"));
87
+ if (tags.length > 0) out.tags = tags;
88
+ }
89
+ const annotations = {};
90
+ const annotationKeys = Object.keys(record).filter((k) => k.startsWith("x-")).sort((a, b) => a.localeCompare(b));
91
+ for (const key of annotationKeys) {
92
+ const v = sanitizeJsonValue(record[key], 0);
93
+ if (v !== void 0) annotations[key] = v;
94
+ }
95
+ const annotationsRaw = record.annotations;
96
+ if (isPlainRecord(annotationsRaw)) {
97
+ const keys = Object.keys(annotationsRaw).filter((k) => k.startsWith("x-")).sort((a, b) => a.localeCompare(b));
98
+ for (const key of keys) {
99
+ const v = sanitizeJsonValue(annotationsRaw[key], 0);
100
+ if (v !== void 0) annotations[key] = v;
101
+ }
102
+ }
103
+ if (Object.keys(annotations).length > 0) out.annotations = annotations;
104
+ return Object.keys(out).length > 0 ? out : void 0;
105
+ };
106
+ var stableStringify = (meta) => {
107
+ const out = {};
108
+ const keys = Object.keys(meta).sort();
109
+ for (const k of keys) {
110
+ out[k] = meta[k];
111
+ }
112
+ return JSON.stringify(out);
113
+ };
114
+ var equals = (a, b) => {
115
+ if (a === b) return true;
116
+ if (!a || !b) return false;
117
+ return stableStringify(a) === stableStringify(b);
118
+ };
119
+ var mergeCanonical = (current, incoming) => {
120
+ const existing = current.meta;
121
+ if (!existing) {
122
+ return {
123
+ meta: incoming.meta,
124
+ origin: incoming.origin,
125
+ conflicts: current.conflicts
126
+ };
127
+ }
128
+ if (equals(existing, incoming.meta)) {
129
+ return current;
130
+ }
131
+ const conflicts = [
132
+ ...current.conflicts ?? []
133
+ ];
134
+ const push = (conflict) => {
135
+ const exists = conflicts.some(
136
+ (c) => c.origin === conflict.origin && equals(c.meta, conflict.meta)
137
+ );
138
+ if (!exists) conflicts.push(conflict);
139
+ };
140
+ const existingCanonical = existing.canonical === true;
141
+ const incomingCanonical = incoming.meta.canonical === true;
142
+ if (!existingCanonical && incomingCanonical) {
143
+ push({
144
+ origin: current.origin ?? "unknown",
145
+ meta: existing
146
+ });
147
+ return {
148
+ meta: incoming.meta,
149
+ origin: incoming.origin,
150
+ conflicts
151
+ };
152
+ }
153
+ push({
154
+ origin: incoming.origin,
155
+ meta: incoming.meta
156
+ });
157
+ return {
158
+ meta: existing,
159
+ origin: current.origin ?? incoming.origin,
160
+ conflicts
161
+ };
162
+ };
163
+
164
+ // ../logix-core/src/internal/state-trait/model.ts
165
+ var normalizeSpec = (spec) => {
166
+ const entries = [];
167
+ const isNode = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitNode";
168
+ const isList = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitList";
169
+ const joinPath = (prefix, suffix) => {
170
+ if (!prefix) return suffix;
171
+ if (!suffix) return prefix;
172
+ return `${prefix}.${suffix}`;
173
+ };
174
+ const prefixDeps = (deps, prefix) => {
175
+ if (!deps || deps.length === 0) return [];
176
+ return deps.map((d) => prefix ? joinPath(prefix, d) : d);
177
+ };
178
+ const normalizeEntry = (entry, fieldPath, depPrefix) => {
179
+ if (entry.kind === "computed") {
180
+ const meta = entry.meta;
181
+ const rawDeps = meta.deps;
182
+ const deps = rawDeps !== void 0 ? prefixDeps(rawDeps, depPrefix) : void 0;
183
+ return {
184
+ ...entry,
185
+ fieldPath,
186
+ meta: { ...meta, deps }
187
+ };
188
+ }
189
+ if (entry.kind === "source") {
190
+ const meta = entry.meta;
191
+ const rawDeps = meta.deps;
192
+ const deps = rawDeps !== void 0 ? prefixDeps(rawDeps, depPrefix) : void 0;
193
+ return {
194
+ ...entry,
195
+ fieldPath,
196
+ meta: { ...meta, deps, _fieldPath: fieldPath }
197
+ };
198
+ }
199
+ if (entry.kind === "link") {
200
+ const meta = entry.meta;
201
+ const from2 = prefixDeps([meta.from], depPrefix)[0] ?? meta.from;
202
+ return {
203
+ ...entry,
204
+ fieldPath,
205
+ meta: { ...meta, from: from2 }
206
+ };
207
+ }
208
+ return {
209
+ ...entry,
210
+ fieldPath
211
+ };
212
+ };
213
+ const expandNode = (scopeId, joinPrefix, node2, options) => {
214
+ const addEntry = (relativeTarget, raw) => {
215
+ const rel = raw.fieldPath ?? relativeTarget;
216
+ const fieldPath = joinPrefix ? joinPath(joinPrefix, String(rel)) : String(rel);
217
+ entries.push(normalizeEntry(raw, fieldPath, joinPrefix));
218
+ };
219
+ const expandMaybeRecord = (value) => {
220
+ if (!value) return;
221
+ if (typeof value.kind === "string") {
222
+ addEntry("", value);
223
+ return;
224
+ }
225
+ const record = value;
226
+ for (const key in record) {
227
+ if (!Object.prototype.hasOwnProperty.call(record, key)) continue;
228
+ const entry = record[key];
229
+ if (!entry) continue;
230
+ addEntry(key, entry);
231
+ }
232
+ };
233
+ expandMaybeRecord(node2.computed);
234
+ expandMaybeRecord(node2.source);
235
+ expandMaybeRecord(node2.link);
236
+ if (node2.check) {
237
+ const rules = {};
238
+ const checkDepsPrefix = options?.checkDepsPrefix ?? (joinPrefix.endsWith("[]") ? joinPrefix : "");
239
+ const prefixCheckDeps = (deps) => {
240
+ if (!deps || deps.length === 0) return [];
241
+ return deps.map(
242
+ (d) => d === "" ? scopeId : checkDepsPrefix ? joinPath(checkDepsPrefix, d) : d
243
+ );
244
+ };
245
+ for (const name of Object.keys(node2.check)) {
246
+ const rule = node2.check[name];
247
+ if (typeof rule === "function") {
248
+ rules[name] = rule;
249
+ continue;
250
+ }
251
+ if (rule && typeof rule === "object") {
252
+ const meta = sanitize(rule.meta);
253
+ rules[name] = {
254
+ ...rule,
255
+ deps: prefixCheckDeps(rule.deps),
256
+ meta
257
+ };
258
+ continue;
259
+ }
260
+ }
261
+ entries.push({
262
+ fieldPath: scopeId,
263
+ kind: "check",
264
+ meta: {
265
+ rules,
266
+ writeback: { kind: "errors" }
267
+ }
268
+ });
269
+ }
270
+ };
271
+ for (const key in spec) {
272
+ if (!Object.prototype.hasOwnProperty.call(spec, key)) continue;
273
+ const raw = spec[key];
274
+ if (!raw) continue;
275
+ if (isList(raw)) {
276
+ const listPath = key;
277
+ if (raw.item) {
278
+ expandNode(`${listPath}[]`, `${listPath}[]`, raw.item);
279
+ }
280
+ if (raw.list) {
281
+ expandNode(listPath, listPath, raw.list, {
282
+ checkDepsPrefix: `${listPath}[]`
283
+ });
284
+ }
285
+ continue;
286
+ }
287
+ if (isNode(raw)) {
288
+ if (key === "$root") {
289
+ expandNode("$root", "", raw);
290
+ } else {
291
+ expandNode(key, key, raw);
292
+ }
293
+ continue;
294
+ }
295
+ const entry = raw;
296
+ const fieldPath = entry.fieldPath ?? key;
297
+ entries.push(normalizeEntry(entry, String(fieldPath), ""));
298
+ }
299
+ return entries;
300
+ };
301
+ var collectNodeMeta = (spec) => {
302
+ const out = /* @__PURE__ */ new Map();
303
+ const isNode = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitNode";
304
+ const isList = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitList";
305
+ const add = (scopeId, node2) => {
306
+ const meta = sanitize(node2.meta);
307
+ if (meta) out.set(scopeId, meta);
308
+ };
309
+ for (const key in spec) {
310
+ if (!Object.prototype.hasOwnProperty.call(spec, key)) continue;
311
+ const raw = spec[key];
312
+ if (!raw) continue;
313
+ if (isList(raw)) {
314
+ const listPath = key;
315
+ if (raw.item) add(`${listPath}[]`, raw.item);
316
+ if (raw.list) add(listPath, raw.list);
317
+ continue;
318
+ }
319
+ if (isNode(raw)) {
320
+ if (key === "$root") add("$root", raw);
321
+ else add(key, raw);
322
+ continue;
323
+ }
324
+ }
325
+ return out;
326
+ };
327
+
328
+ // ../logix-core/src/internal/state-trait/build.ts
329
+ var nowPerf = () => typeof globalThis.performance !== "undefined" && typeof globalThis.performance.now === "function" ? globalThis.performance.now() : Date.now();
330
+ var getConvergeWriterDeps = (entry) => {
331
+ if (entry.kind === "computed") {
332
+ return entry.meta?.deps ?? [];
333
+ }
334
+ return [entry.meta.from];
335
+ };
336
+ var computeConvergeTopoOrder = (writers) => {
337
+ const writerByPath = /* @__PURE__ */ new Map();
338
+ for (const entry of writers) {
339
+ const existing = writerByPath.get(entry.fieldPath);
340
+ if (existing) {
341
+ return {
342
+ order: [],
343
+ configError: {
344
+ code: "MULTIPLE_WRITERS",
345
+ message: `[StateTrait.converge] Multiple writers for field "${entry.fieldPath}" (${existing.kind} + ${entry.kind}).`,
346
+ fields: [entry.fieldPath]
347
+ }
348
+ };
349
+ }
350
+ writerByPath.set(entry.fieldPath, entry);
351
+ }
352
+ const nodes = /* @__PURE__ */ new Set();
353
+ for (const entry of writers) {
354
+ nodes.add(entry.fieldPath);
355
+ }
356
+ const indegree = /* @__PURE__ */ new Map();
357
+ const forward = /* @__PURE__ */ new Map();
358
+ for (const node2 of nodes) {
359
+ indegree.set(node2, 0);
360
+ forward.set(node2, []);
361
+ }
362
+ for (const entry of writers) {
363
+ const to = entry.fieldPath;
364
+ const deps = getConvergeWriterDeps(entry);
365
+ for (const dep of deps) {
366
+ if (!nodes.has(dep)) continue;
367
+ forward.get(dep).push(to);
368
+ indegree.set(to, (indegree.get(to) ?? 0) + 1);
369
+ }
370
+ }
371
+ const queue = [];
372
+ for (const [node2, deg] of indegree.entries()) {
373
+ if (deg === 0) queue.push(node2);
374
+ }
375
+ const order = [];
376
+ while (queue.length) {
377
+ const n = queue.shift();
378
+ order.push(n);
379
+ const outs = forward.get(n);
380
+ for (const to of outs) {
381
+ const next = (indegree.get(to) ?? 0) - 1;
382
+ indegree.set(to, next);
383
+ if (next === 0) queue.push(to);
384
+ }
385
+ }
386
+ if (order.length !== nodes.size) {
387
+ const remaining = Array.from(nodes).filter((n) => !order.includes(n));
388
+ return {
389
+ order: [],
390
+ configError: {
391
+ code: "CYCLE_DETECTED",
392
+ message: `[StateTrait.converge] Cycle detected in computed/link graph: ${remaining.join(", ")}`,
393
+ fields: remaining
394
+ }
395
+ };
396
+ }
397
+ return { order };
398
+ };
399
+ var buildConvergeIr = (entries) => {
400
+ const startedAt = nowPerf();
401
+ const generation = 0;
402
+ const writers = entries.filter(
403
+ (e) => e.kind === "computed" || e.kind === "link"
404
+ );
405
+ const writersKey = writers.map((entry) => `${entry.kind}:${entry.fieldPath}`).sort().join("|");
406
+ const depsKey = writers.map((entry) => {
407
+ const deps = getConvergeWriterDeps(entry).slice().sort().join(",");
408
+ return `${entry.kind}:${entry.fieldPath}=>${deps}`;
409
+ }).sort().join("|");
410
+ const writerByPath = /* @__PURE__ */ new Map();
411
+ for (const entry of writers) {
412
+ writerByPath.set(entry.fieldPath, entry);
413
+ }
414
+ const topo = writers.length > 0 ? computeConvergeTopoOrder(writers) : { order: [] };
415
+ const stepsById = topo.configError ? [] : topo.order.map((path) => writerByPath.get(path));
416
+ const fieldPathTable = /* @__PURE__ */ new Map();
417
+ const addPath = (path) => {
418
+ for (let i = 1; i <= path.length; i++) {
419
+ const prefix = path.slice(0, i);
420
+ const key = JSON.stringify(prefix);
421
+ if (!fieldPathTable.has(key)) fieldPathTable.set(key, prefix);
422
+ }
423
+ };
424
+ for (const entry of writers) {
425
+ const out = normalizeFieldPath(entry.fieldPath);
426
+ if (out) addPath(out);
427
+ for (const dep of getConvergeWriterDeps(entry)) {
428
+ const depPath = normalizeFieldPath(dep);
429
+ if (depPath) addPath(depPath);
430
+ }
431
+ }
432
+ const fieldPaths = Array.from(fieldPathTable.values()).sort(compareFieldPath);
433
+ const fieldPathIdRegistry = makeFieldPathIdRegistry(fieldPaths);
434
+ const stepOutFieldPathIdByStepId = [];
435
+ const stepDepsFieldPathIdsByStepId = [];
436
+ for (const entry of stepsById) {
437
+ const out = normalizeFieldPath(entry.fieldPath);
438
+ const outId = out != null ? getFieldPathId(fieldPathIdRegistry, out) : void 0;
439
+ if (outId == null) {
440
+ throw new Error(
441
+ `[StateTrait.build] Failed to map converge output fieldPath "${entry.fieldPath}" to FieldPathId.`
442
+ );
443
+ }
444
+ const depIds = [];
445
+ for (const dep of getConvergeWriterDeps(entry)) {
446
+ const depPath = normalizeFieldPath(dep);
447
+ if (!depPath) continue;
448
+ const depId = getFieldPathId(fieldPathIdRegistry, depPath);
449
+ if (depId != null) depIds.push(depId);
450
+ }
451
+ stepOutFieldPathIdByStepId.push(outId);
452
+ stepDepsFieldPathIdsByStepId.push(depIds);
453
+ }
454
+ const topoOrder = stepsById.map((_, i) => i);
455
+ const buildDurationMs = Math.max(0, nowPerf() - startedAt);
456
+ return {
457
+ generation,
458
+ writersKey,
459
+ depsKey,
460
+ fieldPaths,
461
+ fieldPathIdRegistry,
462
+ ...topo.configError ? { configError: topo.configError } : null,
463
+ stepsById,
464
+ stepOutFieldPathIdByStepId,
465
+ stepDepsFieldPathIdsByStepId,
466
+ topoOrder,
467
+ buildDurationMs
468
+ };
469
+ };
470
+ var toFieldTrait = (entry) => {
471
+ const deps = [];
472
+ if (entry.kind === "computed") {
473
+ const meta = entry.meta;
474
+ const list2 = meta.deps;
475
+ if (list2) deps.push(...list2);
476
+ } else if (entry.kind === "source") {
477
+ const meta = entry.meta;
478
+ const list2 = meta.deps;
479
+ if (list2) deps.push(...list2);
480
+ } else if (entry.kind === "link") {
481
+ deps.push(entry.meta.from);
482
+ } else if (entry.kind === "check") {
483
+ const meta = entry.meta;
484
+ const rules = meta?.rules ?? {};
485
+ for (const name of Object.keys(rules)) {
486
+ const rule = rules[name];
487
+ if (rule && typeof rule === "object") {
488
+ const list2 = rule.deps;
489
+ if (list2) deps.push(...list2);
490
+ }
491
+ }
492
+ }
493
+ return {
494
+ fieldId: entry.fieldPath,
495
+ kind: entry.kind,
496
+ // meta 在运行时保持与 Entry.meta 一致,便于 install 直接复用。
497
+ meta: entry.meta,
498
+ deps
499
+ };
500
+ };
501
+ var buildGraph = (entries, nodeMetaByFieldPath) => {
502
+ const fieldMap = /* @__PURE__ */ new Map();
503
+ const nodes = [];
504
+ const edges = [];
505
+ const resourcesById = /* @__PURE__ */ new Map();
506
+ const planSteps = [];
507
+ const ensureField = (fieldPath) => {
508
+ let field = fieldMap.get(fieldPath);
509
+ if (!field) {
510
+ field = {
511
+ id: fieldPath,
512
+ path: fieldPath,
513
+ traits: []
514
+ };
515
+ fieldMap.set(fieldPath, field);
516
+ }
517
+ return field;
518
+ };
519
+ for (const entry of entries) {
520
+ const fieldPath = entry.fieldPath;
521
+ const field = ensureField(fieldPath);
522
+ const trait = toFieldTrait(entry);
523
+ field.traits.push(trait);
524
+ if (entry.kind === "computed") {
525
+ const stepId = `computed:${fieldPath}`;
526
+ planSteps.push({
527
+ id: stepId,
528
+ kind: "computed-update",
529
+ targetFieldPath: fieldPath
530
+ // 说明:当前版本不静态分析 computed 依赖字段,sourceFieldPaths 留空。
531
+ });
532
+ const deps = entry.meta.deps;
533
+ if (deps) {
534
+ for (const dep of deps) {
535
+ ensureField(dep);
536
+ edges.push({
537
+ id: `computed:${dep}->${fieldPath}`,
538
+ from: dep,
539
+ to: fieldPath,
540
+ kind: "computed"
541
+ });
542
+ }
543
+ }
544
+ } else if (entry.kind === "link") {
545
+ const from2 = entry.meta.from;
546
+ ensureField(from2);
547
+ const edgeId = `link:${from2}->${fieldPath}`;
548
+ edges.push({
549
+ id: edgeId,
550
+ from: from2,
551
+ to: fieldPath,
552
+ kind: "link"
553
+ });
554
+ planSteps.push({
555
+ id: `link:${fieldPath}`,
556
+ kind: "link-propagate",
557
+ targetFieldPath: fieldPath,
558
+ sourceFieldPaths: [from2],
559
+ debugInfo: {
560
+ graphEdgeId: edgeId
561
+ }
562
+ });
563
+ } else if (entry.kind === "source") {
564
+ const resourceId = entry.meta.resource;
565
+ const resourceMeta = sanitize(entry.meta.meta);
566
+ const existing = resourcesById.get(resourceId);
567
+ if (existing) {
568
+ const ownerFields = [...existing.ownerFields, fieldPath];
569
+ let meta = existing.meta;
570
+ let metaOrigin = existing.metaOrigin;
571
+ let metaConflicts = existing.metaConflicts;
572
+ if (resourceMeta) {
573
+ const merged = mergeCanonical(
574
+ { meta, origin: metaOrigin, conflicts: metaConflicts },
575
+ { origin: fieldPath, meta: resourceMeta }
576
+ );
577
+ meta = merged.meta;
578
+ metaOrigin = merged.origin;
579
+ metaConflicts = merged.conflicts;
580
+ }
581
+ resourcesById.set(resourceId, {
582
+ ...existing,
583
+ ownerFields,
584
+ meta,
585
+ metaOrigin,
586
+ metaConflicts
587
+ });
588
+ } else {
589
+ resourcesById.set(resourceId, {
590
+ resourceId,
591
+ // 暂时使用简单的标识字符串,后续可根据 key 规则进一步结构化。
592
+ keySelector: `StateTrait.source@${fieldPath}`,
593
+ ownerFields: [fieldPath],
594
+ meta: resourceMeta,
595
+ metaOrigin: resourceMeta ? fieldPath : void 0
596
+ });
597
+ }
598
+ planSteps.push({
599
+ id: `source:${fieldPath}`,
600
+ kind: "source-refresh",
601
+ targetFieldPath: fieldPath,
602
+ resourceId,
603
+ keySelectorId: `StateTrait.source@${fieldPath}`
604
+ });
605
+ const deps = entry.meta.deps;
606
+ if (deps) {
607
+ for (const dep of deps) {
608
+ ensureField(dep);
609
+ edges.push({
610
+ id: `source-dep:${dep}->${fieldPath}`,
611
+ from: dep,
612
+ to: fieldPath,
613
+ kind: "source-dep"
614
+ });
615
+ }
616
+ }
617
+ } else if (entry.kind === "check") {
618
+ planSteps.push({
619
+ id: `check:${fieldPath}`,
620
+ kind: "check-validate",
621
+ targetFieldPath: fieldPath
622
+ });
623
+ if (trait.deps.length > 0) {
624
+ for (const dep of trait.deps) {
625
+ ensureField(dep);
626
+ edges.push({
627
+ id: `check-dep:${dep}->${fieldPath}`,
628
+ from: dep,
629
+ to: fieldPath,
630
+ kind: "check-dep"
631
+ });
632
+ }
633
+ }
634
+ }
635
+ }
636
+ for (const field of fieldMap.values()) {
637
+ nodes.push({
638
+ id: field.id,
639
+ field,
640
+ traits: field.traits,
641
+ meta: nodeMetaByFieldPath.get(field.id)
642
+ });
643
+ }
644
+ const graph = {
645
+ _tag: "StateTraitGraph",
646
+ nodes,
647
+ edges,
648
+ resources: Array.from(resourcesById.values())
649
+ };
650
+ const plan = {
651
+ _tag: "StateTraitPlan",
652
+ steps: planSteps
653
+ };
654
+ return { graph, plan };
655
+ };
656
+ var assertNoLinkCycles = (edges) => {
657
+ const adjacency = /* @__PURE__ */ new Map();
658
+ for (const edge of edges) {
659
+ if (edge.kind !== "link") continue;
660
+ const list2 = adjacency.get(edge.from) ?? [];
661
+ list2.push(edge.to);
662
+ adjacency.set(edge.from, list2);
663
+ }
664
+ const visited = /* @__PURE__ */ new Set();
665
+ const stack = /* @__PURE__ */ new Set();
666
+ const dfs = (node2) => {
667
+ if (stack.has(node2)) {
668
+ throw new Error(
669
+ `[StateTrait.build] link cycle detected at field "${node2}". Please check link traits for circular dependencies.`
670
+ );
671
+ }
672
+ if (visited.has(node2)) return;
673
+ visited.add(node2);
674
+ stack.add(node2);
675
+ const nexts = adjacency.get(node2);
676
+ if (nexts) {
677
+ for (const to of nexts) {
678
+ dfs(to);
679
+ }
680
+ }
681
+ stack.delete(node2);
682
+ };
683
+ for (const node2 of adjacency.keys()) {
684
+ if (!visited.has(node2)) {
685
+ dfs(node2);
686
+ }
687
+ }
688
+ };
689
+ var collectSchemaPaths = (entries) => {
690
+ const byKey = /* @__PURE__ */ new Map();
691
+ const add = (ref) => {
692
+ if (!ref.path) return;
693
+ const k = `${ref.kind}|${ref.entryKind}|${ref.entryFieldPath}|${ref.ruleName ?? ""}|${ref.path}`;
694
+ byKey.set(k, ref);
695
+ };
696
+ const getCheckWritebackPath = (entry) => {
697
+ const wb = entry.meta?.writeback;
698
+ const p = wb && typeof wb === "object" ? wb.path : void 0;
699
+ const writebackPath = typeof p === "string" && p.startsWith("errors.") ? p : void 0;
700
+ if (writebackPath) return writebackPath;
701
+ const fieldPath = entry.fieldPath;
702
+ if (fieldPath.endsWith("[]")) {
703
+ return `errors.${fieldPath.slice(0, -2)}`;
704
+ }
705
+ return `errors.${fieldPath}`;
706
+ };
707
+ for (const entry of entries) {
708
+ add({
709
+ kind: "fieldPath",
710
+ entryKind: entry.kind,
711
+ entryFieldPath: entry.fieldPath,
712
+ path: entry.fieldPath
713
+ });
714
+ if (entry.kind === "computed" || entry.kind === "source") {
715
+ const deps = entry.meta?.deps ?? [];
716
+ for (const dep of deps) {
717
+ add({
718
+ kind: "dep",
719
+ entryKind: entry.kind,
720
+ entryFieldPath: entry.fieldPath,
721
+ path: dep
722
+ });
723
+ }
724
+ }
725
+ if (entry.kind === "link") {
726
+ add({
727
+ kind: "link_from",
728
+ entryKind: "link",
729
+ entryFieldPath: entry.fieldPath,
730
+ path: entry.meta.from
731
+ });
732
+ }
733
+ if (entry.kind === "check") {
734
+ add({
735
+ kind: "check_writeback",
736
+ entryKind: "check",
737
+ entryFieldPath: entry.fieldPath,
738
+ path: getCheckWritebackPath(entry)
739
+ });
740
+ const rules = entry.meta?.rules ?? {};
741
+ for (const name of Object.keys(rules)) {
742
+ const rule = rules[name];
743
+ if (!rule || typeof rule !== "object") continue;
744
+ const deps = rule.deps ?? [];
745
+ for (const dep of deps) {
746
+ add({
747
+ kind: "dep",
748
+ entryKind: "check",
749
+ entryFieldPath: entry.fieldPath,
750
+ ruleName: name,
751
+ path: dep
752
+ });
753
+ }
754
+ }
755
+ }
756
+ }
757
+ return Array.from(byKey.entries()).sort((a, b) => a[0].localeCompare(b[0])).map(([, v]) => v);
758
+ };
759
+ var build = (stateSchema, spec) => {
760
+ const entries = normalizeSpec(spec);
761
+ const nodeMetaByFieldPath = collectNodeMeta(spec);
762
+ for (const entry of entries) {
763
+ if (entry.kind === "computed") {
764
+ const deps = entry.meta.deps;
765
+ if (deps === void 0) {
766
+ throw new Error(
767
+ `[StateTrait.build] Missing explicit deps for computed "${entry.fieldPath}". Please use StateTrait.computed({ deps: [...], get: ... }).`
768
+ );
769
+ }
770
+ }
771
+ if (entry.kind === "source") {
772
+ const deps = entry.meta.deps;
773
+ if (deps === void 0) {
774
+ throw new Error(
775
+ `[StateTrait.build] Missing explicit deps for source "${entry.fieldPath}". Please provide meta.deps for StateTrait.source({ deps: [...], ... }).`
776
+ );
777
+ }
778
+ }
779
+ if (entry.kind === "check") {
780
+ const rules = entry.meta?.rules ?? {};
781
+ for (const name of Object.keys(rules)) {
782
+ const rule = rules[name];
783
+ if (typeof rule === "function" || !rule || typeof rule !== "object") {
784
+ throw new Error(
785
+ `[StateTrait.build] Missing explicit deps for check "${entry.fieldPath}" rule "${name}". Please use { deps: [...], validate: ... } form.`
786
+ );
787
+ }
788
+ if (rule.deps === void 0) {
789
+ throw new Error(
790
+ `[StateTrait.build] Missing explicit deps for check "${entry.fieldPath}" rule "${name}". Please provide deps: [...].`
791
+ );
792
+ }
793
+ }
794
+ }
795
+ }
796
+ const { graph, plan } = buildGraph(entries, nodeMetaByFieldPath);
797
+ assertNoLinkCycles(graph.edges);
798
+ return {
799
+ stateSchema,
800
+ spec,
801
+ entries,
802
+ graph,
803
+ plan,
804
+ convergeIr: buildConvergeIr(entries),
805
+ schemaPaths: collectSchemaPaths(entries)
806
+ };
807
+ };
808
+
809
+ // ../logix-core/src/internal/state-trait/install.ts
810
+ import { Effect } from "../effect.js";
811
+ var buildEntryIndex = (entries) => {
812
+ const index = /* @__PURE__ */ new Map();
813
+ for (const entry of entries) {
814
+ const list2 = index.get(entry.fieldPath) ?? [];
815
+ list2.push(entry);
816
+ index.set(entry.fieldPath, list2);
817
+ }
818
+ return index;
819
+ };
820
+ var install = (bound, program) => {
821
+ try {
822
+ const internals = getBoundInternals(bound);
823
+ internals.traits.registerStateTraitProgram(program, {
824
+ bumpReason: "logic_installed"
825
+ });
826
+ } catch {
827
+ }
828
+ const entryIndex = buildEntryIndex(program.entries);
829
+ const installStep = (step) => {
830
+ if (!step.targetFieldPath) {
831
+ return Effect.void;
832
+ }
833
+ if (step.kind !== "source-refresh") {
834
+ return Effect.void;
835
+ }
836
+ const candidates = entryIndex.get(step.targetFieldPath);
837
+ if (!candidates || candidates.length === 0) {
838
+ return Effect.void;
839
+ }
840
+ const entry = candidates.find((e) => e.kind === "source");
841
+ if (!entry) {
842
+ return Effect.void;
843
+ }
844
+ return installSourceRefresh(
845
+ bound,
846
+ step,
847
+ entry
848
+ );
849
+ };
850
+ return Effect.forEach(program.plan.steps, (step) => installStep(step)).pipe(Effect.asVoid);
851
+ };
852
+
853
+ // ../logix-core/src/StateTrait.ts
854
+ var $root = "$root";
855
+ var from = (_schema) => (spec) => spec;
856
+ var node = (spec) => ({
857
+ _tag: "StateTraitNode",
858
+ ...spec
859
+ });
860
+ var list = (spec) => ({
861
+ _tag: "StateTraitList",
862
+ ...spec
863
+ });
864
+ var computed = (input) => {
865
+ const derive = (state) => {
866
+ const args = input.deps.map(
867
+ (dep) => getAtPath(state, dep)
868
+ );
869
+ return input.get(...args);
870
+ };
871
+ return {
872
+ fieldPath: void 0,
873
+ kind: "computed",
874
+ meta: { deps: input.deps, derive, equals: input.equals }
875
+ };
876
+ };
877
+ var source = (meta) => ({
878
+ fieldPath: void 0,
879
+ kind: "source",
880
+ meta
881
+ });
882
+ var link = (meta) => ({
883
+ fieldPath: void 0,
884
+ kind: "link",
885
+ meta
886
+ });
887
+ var build2 = (stateSchema, spec) => build(stateSchema, spec);
888
+ var install2 = (bound, program) => install(bound, program);
889
+ var exportStaticIr2 = (program, moduleId, options) => exportStaticIr({
890
+ program,
891
+ moduleId,
892
+ version: options?.version
893
+ });
894
+
895
+ export {
896
+ $root,
897
+ from,
898
+ node,
899
+ list,
900
+ computed,
901
+ source,
902
+ link,
903
+ build2 as build,
904
+ install2 as install,
905
+ exportStaticIr2 as exportStaticIr
906
+ };
907
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc3RhdGUtdHJhaXQvbWV0YS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS10cmFpdC9tb2RlbC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS10cmFpdC9idWlsZC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS10cmFpdC9pbnN0YWxsLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL1N0YXRlVHJhaXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB0eXBlIFRyYWl0TWV0YSA9IFJlYWRvbmx5PHtcbiAgcmVhZG9ubHkgbGFiZWw/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdGFncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBncm91cD86IHN0cmluZ1xuICByZWFkb25seSBkb2NzVXJsPzogc3RyaW5nXG4gIHJlYWRvbmx5IGNhY2hlR3JvdXA/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFx1NjI2OVx1NUM1NVx1NkNFOFx1ODlFM1x1NEY0RFx1RkYxQVx1NEVDNVx1NjNBNVx1NTNENyBgeC0qYCBrZXlcdUZGMDhcdTc1MjhcdTRFOEUgUGhhbnRvbSBTb3VyY2UgLyBEcmlmdCBEZXRlY3Rpb24gXHU3QjQ5XHU4MEZEXHU1MjlCXHU3Njg0XHU5NTFBXHU3MEI5XHVGRjA5XHUzMDAyXG4gICAqXG4gICAqIFx1N0VBNlx1Njc1Rlx1RkYxQVxuICAgKiAtIFx1NUZDNVx1OTg3Qlx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1RkYwOEpTT04gXHU1MDNDXHVGRjA5XHVGRjFCXG4gICAqIC0gXHU1RkM1XHU5ODdCIFNsaW1cdUZGMDhcdTVFRkFcdThCQUVcdTUzRUFcdTY1M0VcdTVDMTFcdTkxQ0ZcdTUxNzNcdTk1MkVcdTYzRDBcdTc5M0FcdUZGMENcdTRFMERcdTg5ODFcdTU4NUVcdTU5MjdcdTVCRjlcdThDNjFcdUZGMDlcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IGFubm90YXRpb25zPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgSnNvblZhbHVlPj5cbiAgLyoqXG4gICAqIFx1OEJFRFx1NEU0OVx1NjNEMFx1NzkzQVx1RkYxQVx1NUY1M1x1NTQwQ1x1NEUwMFx1NUI5RVx1NEY1M1x1RkYwOFx1NEY4Qlx1NTk4Mlx1NTQwQ1x1NEUwMCByZXNvdXJjZUlkXHVGRjA5XHU1MUZBXHU3M0IwXHU1OTFBXHU1OTA0IG1ldGEgXHU1OEYwXHU2NjBFXHU0RTE0XHU0RTBEXHU0RTAwXHU4MUY0XHU2NUY2XHVGRjBDXG4gICAqIGNhbm9uaWNhbD10cnVlIFx1NzY4NFx1NThGMFx1NjYwRVx1NEYxOFx1NTE0OFx1NjIxMFx1NEUzQVx1MjAxQ1x1NUM1NVx1NzkzQVx1NzUyOCBjYW5vbmljYWxcdTIwMURcdUZGMUJcdTUxNzZcdTRFRDZcdTU4RjBcdTY2MEVcdTRGMUFcdThCQjBcdTVGNTVcdTRFM0EgY29uZmxpY3RzXHUzMDAyXG4gICAqL1xuICByZWFkb25seSBjYW5vbmljYWw/OiBib29sZWFuXG59PlxuXG5leHBvcnQgdHlwZSBUcmFpdE1ldGFDb25mbGljdCA9IFJlYWRvbmx5PHtcbiAgcmVhZG9ubHkgb3JpZ2luOiBzdHJpbmdcbiAgcmVhZG9ubHkgbWV0YTogVHJhaXRNZXRhXG59PlxuXG5leHBvcnQgdHlwZSBKc29uUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGxcbmV4cG9ydCB0eXBlIEpzb25WYWx1ZSA9XG4gIHwgSnNvblByaW1pdGl2ZVxuICB8IFJlYWRvbmx5QXJyYXk8SnNvblZhbHVlPlxuICB8IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIH1cblxuY29uc3QgdW5pcVNvcnRlZFN0cmluZ3MgPSAoaW5wdXQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPik6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dCkge1xuICAgIGNvbnN0IHYgPSBpdGVtLnRyaW0oKVxuICAgIGlmICghdikgY29udGludWVcbiAgICBzZXQuYWRkKHYpXG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oc2V0KS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG59XG5cbmNvbnN0IGlzUGxhaW5SZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHNhbml0aXplSnNvblZhbHVlID0gKFxuICBpbnB1dDogdW5rbm93bixcbiAgZGVwdGg6IG51bWJlcixcbik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gaW5wdXRcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJib29sZWFuXCIpIHJldHVybiBpbnB1dFxuICBpZiAodHlwZW9mIGlucHV0ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShpbnB1dCkgPyBpbnB1dCA6IHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKGRlcHRoID49IDYpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBjb25zdCBvdXQ6IEFycmF5PEpzb25WYWx1ZT4gPSBbXVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dCkge1xuICAgICAgY29uc3QgdiA9IHNhbml0aXplSnNvblZhbHVlKGl0ZW0sIGRlcHRoICsgMSlcbiAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIG91dC5wdXNoKHYpXG4gICAgfVxuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIGlmIChpc1BsYWluUmVjb3JkKGlucHV0KSkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbnB1dCkuc29ydCgpXG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0ge31cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCB2ID0gc2FuaXRpemVKc29uVmFsdWUoaW5wdXRba2V5XSwgZGVwdGggKyAxKVxuICAgICAgaWYgKHYgIT09IHVuZGVmaW5lZCkgb3V0W2tleV0gPSB2XG4gICAgfVxuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IHNhbml0aXplID0gKGlucHV0OiB1bmtub3duKTogVHJhaXRNZXRhIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuXG4gIGNvbnN0IHBpY2tTdHJpbmcgPSAoa2V5OiBrZXlvZiBUcmFpdE1ldGEpOiB2b2lkID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFtrZXkgYXMgc3RyaW5nXVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVyblxuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgICBpZiAoIXRyaW1tZWQpIHJldHVyblxuICAgIG91dFtrZXldID0gdHJpbW1lZFxuICB9XG5cbiAgcGlja1N0cmluZyhcImxhYmVsXCIpXG4gIHBpY2tTdHJpbmcoXCJkZXNjcmlwdGlvblwiKVxuICBwaWNrU3RyaW5nKFwiZ3JvdXBcIilcbiAgcGlja1N0cmluZyhcImRvY3NVcmxcIilcbiAgcGlja1N0cmluZyhcImNhY2hlR3JvdXBcIilcblxuICBjb25zdCBjYW5vbmljYWwgPSByZWNvcmQuY2Fub25pY2FsXG4gIGlmICh0eXBlb2YgY2Fub25pY2FsID09PSBcImJvb2xlYW5cIikge1xuICAgIG91dC5jYW5vbmljYWwgPSBjYW5vbmljYWxcbiAgfVxuXG4gIGNvbnN0IHRhZ3NSYXcgPSByZWNvcmQudGFnc1xuICBpZiAodHlwZW9mIHRhZ3NSYXcgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0YWdzID0gdW5pcVNvcnRlZFN0cmluZ3MoW3RhZ3NSYXddKVxuICAgIGlmICh0YWdzLmxlbmd0aCA+IDApIG91dC50YWdzID0gdGFnc1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGFnc1JhdykpIHtcbiAgICBjb25zdCB0YWdzID0gdW5pcVNvcnRlZFN0cmluZ3ModGFnc1Jhdy5maWx0ZXIoKHgpOiB4IGlzIHN0cmluZyA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIikpXG4gICAgaWYgKHRhZ3MubGVuZ3RoID4gMCkgb3V0LnRhZ3MgPSB0YWdzXG4gIH1cblxuICBjb25zdCBhbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHt9XG5cbiAgLy8gbGVnYWN5OiBhbGxvdyBwYXNzaW5nIGB4LSpgIGtleXMgYXQgdGhlIHRvcC1sZXZlbCAodW50eXBlZCBpbnB1dCksIHRoZW4gbm9ybWFsaXplIGludG8gYGFubm90YXRpb25zYC5cbiAgY29uc3QgYW5ub3RhdGlvbktleXMgPSBPYmplY3Qua2V5cyhyZWNvcmQpXG4gICAgLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKFwieC1cIikpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgZm9yIChjb25zdCBrZXkgb2YgYW5ub3RhdGlvbktleXMpIHtcbiAgICBjb25zdCB2ID0gc2FuaXRpemVKc29uVmFsdWUocmVjb3JkW2tleV0sIDApXG4gICAgaWYgKHYgIT09IHVuZGVmaW5lZCkgYW5ub3RhdGlvbnNba2V5XSA9IHZcbiAgfVxuXG4gIC8vIHByZWZlcnJlZDogdHlwZWQgYGFubm90YXRpb25zYCBmaWVsZCAob25seSBhY2NlcHRzIGB4LSpgIGtleXMpLlxuICBjb25zdCBhbm5vdGF0aW9uc1JhdyA9IHJlY29yZC5hbm5vdGF0aW9uc1xuICBpZiAoaXNQbGFpblJlY29yZChhbm5vdGF0aW9uc1JhdykpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYW5ub3RhdGlvbnNSYXcpXG4gICAgICAuZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoXCJ4LVwiKSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgdiA9IHNhbml0aXplSnNvblZhbHVlKGFubm90YXRpb25zUmF3W2tleV0sIDApXG4gICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSBhbm5vdGF0aW9uc1trZXldID0gdlxuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhhbm5vdGF0aW9ucykubGVuZ3RoID4gMCkgb3V0LmFubm90YXRpb25zID0gYW5ub3RhdGlvbnNcblxuICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPiAwID8gKG91dCBhcyBUcmFpdE1ldGEpIDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IHN0YWJsZVN0cmluZ2lmeSA9IChtZXRhOiBUcmFpdE1ldGEpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG1ldGEpLnNvcnQoKVxuICBmb3IgKGNvbnN0IGsgb2Yga2V5cykge1xuICAgIG91dFtrXSA9IChtZXRhIGFzIGFueSlba11cbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3V0KVxufVxuXG5leHBvcnQgY29uc3QgZXF1YWxzID0gKGE6IFRyYWl0TWV0YSB8IHVuZGVmaW5lZCwgYjogVHJhaXRNZXRhIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZVxuICBpZiAoIWEgfHwgIWIpIHJldHVybiBmYWxzZVxuICByZXR1cm4gc3RhYmxlU3RyaW5naWZ5KGEpID09PSBzdGFibGVTdHJpbmdpZnkoYilcbn1cblxuZXhwb3J0IHR5cGUgQ2Fub25pY2FsTWVyZ2VJbnB1dCA9IFJlYWRvbmx5PHtcbiAgcmVhZG9ubHkgbWV0YT86IFRyYWl0TWV0YVxuICByZWFkb25seSBvcmlnaW4/OiBzdHJpbmdcbiAgcmVhZG9ubHkgY29uZmxpY3RzPzogUmVhZG9ubHlBcnJheTxUcmFpdE1ldGFDb25mbGljdD5cbn0+XG5cbmV4cG9ydCB0eXBlIENhbm9uaWNhbE1lcmdlUmVzdWx0ID0gUmVhZG9ubHk8e1xuICByZWFkb25seSBtZXRhPzogVHJhaXRNZXRhXG4gIHJlYWRvbmx5IG9yaWdpbj86IHN0cmluZ1xuICByZWFkb25seSBjb25mbGljdHM/OiBSZWFkb25seUFycmF5PFRyYWl0TWV0YUNvbmZsaWN0PlxufT5cblxuZXhwb3J0IGNvbnN0IG1lcmdlQ2Fub25pY2FsID0gKFxuICBjdXJyZW50OiBDYW5vbmljYWxNZXJnZUlucHV0LFxuICBpbmNvbWluZzogUmVhZG9ubHk8eyByZWFkb25seSBvcmlnaW46IHN0cmluZzsgcmVhZG9ubHkgbWV0YTogVHJhaXRNZXRhIH0+LFxuKTogQ2Fub25pY2FsTWVyZ2VSZXN1bHQgPT4ge1xuICBjb25zdCBleGlzdGluZyA9IGN1cnJlbnQubWV0YVxuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGE6IGluY29taW5nLm1ldGEsXG4gICAgICBvcmlnaW46IGluY29taW5nLm9yaWdpbixcbiAgICAgIGNvbmZsaWN0czogY3VycmVudC5jb25mbGljdHMsXG4gICAgfVxuICB9XG5cbiAgaWYgKGVxdWFscyhleGlzdGluZywgaW5jb21pbmcubWV0YSkpIHtcbiAgICByZXR1cm4gY3VycmVudFxuICB9XG5cbiAgY29uc3QgY29uZmxpY3RzOiBBcnJheTxUcmFpdE1ldGFDb25mbGljdD4gPSBbXG4gICAgLi4uKChjdXJyZW50LmNvbmZsaWN0cyA/PyBbXSkgYXMgUmVhZG9ubHlBcnJheTxUcmFpdE1ldGFDb25mbGljdD4pLFxuICBdXG5cbiAgY29uc3QgcHVzaCA9IChjb25mbGljdDogVHJhaXRNZXRhQ29uZmxpY3QpOiB2b2lkID0+IHtcbiAgICBjb25zdCBleGlzdHMgPSBjb25mbGljdHMuc29tZShcbiAgICAgIChjKSA9PiBjLm9yaWdpbiA9PT0gY29uZmxpY3Qub3JpZ2luICYmIGVxdWFscyhjLm1ldGEsIGNvbmZsaWN0Lm1ldGEpLFxuICAgIClcbiAgICBpZiAoIWV4aXN0cykgY29uZmxpY3RzLnB1c2goY29uZmxpY3QpXG4gIH1cblxuICBjb25zdCBleGlzdGluZ0Nhbm9uaWNhbCA9IGV4aXN0aW5nLmNhbm9uaWNhbCA9PT0gdHJ1ZVxuICBjb25zdCBpbmNvbWluZ0Nhbm9uaWNhbCA9IGluY29taW5nLm1ldGEuY2Fub25pY2FsID09PSB0cnVlXG5cbiAgaWYgKCFleGlzdGluZ0Nhbm9uaWNhbCAmJiBpbmNvbWluZ0Nhbm9uaWNhbCkge1xuICAgIHB1c2goe1xuICAgICAgb3JpZ2luOiBjdXJyZW50Lm9yaWdpbiA/PyBcInVua25vd25cIixcbiAgICAgIG1ldGE6IGV4aXN0aW5nLFxuICAgIH0pXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGE6IGluY29taW5nLm1ldGEsXG4gICAgICBvcmlnaW46IGluY29taW5nLm9yaWdpbixcbiAgICAgIGNvbmZsaWN0cyxcbiAgICB9XG4gIH1cblxuICBwdXNoKHtcbiAgICBvcmlnaW46IGluY29taW5nLm9yaWdpbixcbiAgICBtZXRhOiBpbmNvbWluZy5tZXRhLFxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgbWV0YTogZXhpc3RpbmcsXG4gICAgb3JpZ2luOiBjdXJyZW50Lm9yaWdpbiA/PyBpbmNvbWluZy5vcmlnaW4sXG4gICAgY29uZmxpY3RzLFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTY2hlbWEgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB0eXBlIHsgU3RhdGVBdFBhdGgsIFN0YXRlRmllbGRQYXRoIH0gZnJvbSBcIi4vZmllbGQtcGF0aC5qc1wiXG5pbXBvcnQgdHlwZSB7IERpcnR5QWxsUmVhc29uIH0gZnJvbSBcIi4uL2ZpZWxkLXBhdGguanNcIlxuaW1wb3J0ICogYXMgTWV0YSBmcm9tIFwiLi9tZXRhLmpzXCJcbmltcG9ydCB0eXBlIHsgQ29udmVyZ2VTdGF0aWNJclJlZ2lzdHJ5IH0gZnJvbSBcIi4vY29udmVyZ2UtaXIuanNcIlxuXG4vLyBTdGF0ZVRyYWl0IGNvcmUgbW9kZWxcdTMwMDJcbi8vIFx1NTE3N1x1NEY1M1x1NUI1N1x1NkJCNVx1OEJFRFx1NEU0OVx1NEUwRSBkYXRhLW1vZGVsLm1kIC8gcmVmZXJlbmNlcy9zdGF0ZS10cmFpdC1jb3JlLm1kIFx1NEZERFx1NjMwMVx1NUJGOVx1OUY1MFx1MzAwMlxuXG4vKipcbiAqIFN0YXRlVHJhaXRTcGVjPFM+XHVGRjFBXG4gKiAtIE1vZHVsZSBcdTU2RkVcdTdFQjhcdTRFMkQgdHJhaXRzIFx1NjlGRFx1NEY0RFx1NzY4NFx1NjgwN1x1NTFDNlx1NUY2Mlx1NjAwMVx1RkYxQlxuICogLSBrZXkgXHU1M0Q3IFN0YXRlRmllbGRQYXRoPFM+IFx1N0VBNlx1Njc1Rlx1RkYwQ3ZhbHVlIFx1NEUzQVx1NUJGOVx1NUU5NCBzY29wZSBcdTc2ODRcdTU4RjBcdTY2MEVcdUZGMDhFbnRyeSAvIE5vZGUgLyBMaXN0XHVGRjA5XHUzMDAyXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRTcGVjPFM+ID0gUyBleHRlbmRzIG9iamVjdFxuICA/IHtcbiAgICAgIFtQYXRoIGluIFN0YXRlRmllbGRQYXRoPFM+IHwgXCIkcm9vdFwiXT86IFN0YXRlVHJhaXRTcGVjVmFsdWU8UywgUGF0aD5cbiAgICB9XG4gIDogbmV2ZXJcblxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdEtpbmQgPSBcImNvbXB1dGVkXCIgfCBcInNvdXJjZVwiIHwgXCJsaW5rXCIgfCBcImNoZWNrXCJcblxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlZE1ldGE8UywgUD4ge1xuICAvKipcbiAgICogXHU2NjNFXHU1RjBGXHU0RjlEXHU4RDU2XHU1QjU3XHU2QkI1XHU4REVGXHU1Rjg0XHU5NkM2XHU1NDA4XHVGRjA4XHU1RkM1XHU5ODdCXHVGRjA5XHVGRjFBXG4gICAqXG4gICAqIC0gZGVwcyBcdTY2MkZcdTU1MkZcdTRFMDBcdTRGOURcdThENTZcdTRFOEJcdTVCOUVcdTZFOTBcdUZGMUFHcmFwaC9SZXZlcnNlQ2xvc3VyZS9cdTU4OUVcdTkxQ0ZcdThDMDNcdTVFQTYvXHU2MDI3XHU4MEZEXHU0RjE4XHU1MzE2XHU5MEZEXHU1M0VBXHU4QkE0IGRlcHNcdUZGMUJcbiAgICogLSBEU0wgXHU0RkE3IGBTdGF0ZVRyYWl0LmNvbXB1dGVkKHsgZGVwcywgZ2V0IH0pYCBcdTc2ODQgYGdldGAgXHU5MUM3XHU3NTI4IGRlcHMtYXMtYXJnc1x1RkYwQ1x1NEUwRFx1NjZCNFx1OTczMiBgKHN0YXRlKSA9PiAuLi5gXHVGRjFCXG4gICAqIC0gYnVpbGQgXHU5NjM2XHU2QkI1XHU0RjFBXHU1QzA2IGBnZXQoLi4uZGVwc1ZhbHVlcylgIFx1OTY0RFx1ODlFM1x1NEUzQSBgZGVyaXZlKHN0YXRlKWAgXHU0RjlCXHU4RkQwXHU4ODRDXHU2NUY2XHU2MjY3XHU4ODRDXHVGRjBDXHU0RjQ2XHU0RjlEXHU4RDU2XHU4QkZCXHU5NkM2XHU0RUNEXHU0RUU1IGRlcHMgXHU0RTNBXHU1MUM2XHVGRjFCXG4gICAqIC0gZGV2LW1vZGUgXHU0RTBCXHU4MkU1IGBkZXJpdmUoc3RhdGUpYCBcdTc2ODRcdTVCOUVcdTk2NDVcdThCRkJcdTUzRDZcdTRFMEUgZGVwcyBcdTRFMERcdTRFMDBcdTgxRjRcdUZGMENcdTRGMUFcdTRFQTdcdTc1MUYgYGRlcHNfbWlzbWF0Y2hgIFx1OEJDQVx1NjVBRFx1NTQ0QVx1OEI2Nlx1MzAwMlxuICAgKlxuICAgKiAtIFx1NUJGOVx1NEU4RSBSb290IFx1ODlDNFx1NTIxOVx1RkYxQWRlcHMgXHU0RTNBIFN0YXRlRmllbGRQYXRoPFN0YXRlPlx1RkYxQlxuICAgKiAtIFx1NUJGOVx1NEU4RSBsaXN0Lml0ZW0gc2NvcGVcdUZGMUFkZXBzIFx1NEUzQSBTdGF0ZUZpZWxkUGF0aDxJdGVtPlx1RkYwOFx1NzZGOFx1NUJGOVx1OERFRlx1NUY4NFx1RkYwQ2J1aWxkIFx1OTYzNlx1NkJCNVx1NEYxQVx1NTI0RFx1N0YwMFx1NTMxNlx1RkYwOVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwczogUmVhZG9ubHlBcnJheTxTdGF0ZUZpZWxkUGF0aDxTPj5cbiAgcmVhZG9ubHkgZGVyaXZlOiAoc3RhdGU6IFJlYWRvbmx5PFM+KSA9PiBTdGF0ZUF0UGF0aDxTLCBQPlxuICAvKipcbiAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU3QjQ5XHU0RUY3XHU1MjI0XHU1QjlBXHVGRjA4XHU3NTI4XHU0RThFXHU4REYzXHU4RkM3XHU2NUUwXHU1M0Q4XHU1MzE2XHU1MTk5XHU1NkRFXHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBlcXVhbHM/OiAocHJldjogU3RhdGVBdFBhdGg8UywgUD4sIG5leHQ6IFN0YXRlQXRQYXRoPFMsIFA+KSA9PiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlTWV0YTxTLCBQPiB7XG4gIHJlYWRvbmx5IGRlcHM6IFJlYWRvbmx5QXJyYXk8U3RhdGVGaWVsZFBhdGg8Uz4+XG4gIC8qKlxuICAgKiBcdTkwM0JcdThGOTFcdThENDRcdTZFOTBcdTY4MDdcdThCQzZcdUZGMDhcdTU5ODIgXCJ1c2VyL3Byb2ZpbGVcIlx1RkYwOVx1MzAwMlxuICAgKlxuICAgKiAtIFN0YXRlVHJhaXQuc291cmNlIERTTCBcdTRFMkRcdTc2ODQgYHJlc291cmNlYCBcdTVCNTdcdTZCQjVcdTU3MjggYnVpbGQgXHU5NjM2XHU2QkI1XHU0RjFBXHU4NDNEXHU1NzI4XHU2QjY0XHU1OTA0XHVGRjFCXG4gICAqIC0gZGF0YS1tb2RlbC5tZCBcdTRFMkRcdThCQjBcdTRFM0EgcmVzb3VyY2VJZFx1RkYwQ1x1OEZEOVx1OTFDQ1x1NkNCRlx1NzUyOCBEU0wgXHU1NDdEXHU1NDBEXHU5MDdGXHU1MTREXHU2REY3XHU2REM2XHUzMDAyXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZTogc3RyaW5nXG4gIC8qKlxuICAgKiBcdTRFQ0VcdTVCOENcdTY1NzQgU3RhdGUgXHU4QkExXHU3Qjk3XHU4QkJGXHU5NUVFXHU4QkU1XHU4RDQ0XHU2RTkwXHU2MjQwXHU5NzAwIGtleSBcdTc2ODRcdTg5QzRcdTUyMTlcdTMwMDJcbiAgICpcbiAgICogLSBcdTUxNDFcdThCQjhcdThGRDRcdTU2REUgdW5kZWZpbmVkXHVGRjFBXHU4ODY4XHU3OTNBXHU4QkU1XHU4RDQ0XHU2RTkwXHU1NzI4XHU1RjUzXHU1MjREIHN0YXRlIFx1NEUwQlx1NjcyQVx1NkZDMFx1NkQzQlx1RkYwOFx1NUU5NFx1NTZERVx1NjUzNlx1NEUzQSBpZGxlXHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBrZXk6IChzdGF0ZTogUmVhZG9ubHk8Uz4pID0+IHVua25vd25cbiAgcmVhZG9ubHkgdHJpZ2dlcnM/OiBSZWFkb25seUFycmF5PFwib25Nb3VudFwiIHwgXCJvblZhbHVlQ2hhbmdlXCIgfCBcIm1hbnVhbFwiPlxuICByZWFkb25seSBkZWJvdW5jZU1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5PzogXCJzd2l0Y2hcIiB8IFwiZXhoYXVzdC10cmFpbGluZ1wiXG4gIC8qKlxuICAgKiBcdTc1MjhcdTRFOEUgRGV2dG9vbHMvXHU2NTg3XHU2ODYzXHU3Njg0XHU1M0VGXHU1RThGXHU1MjE3XHU1MzE2XHU1MTQzXHU0RkUxXHU2MDZGXHVGRjA4XHU3NjdEXHU1NDBEXHU1MzU1XHU1QjU3XHU2QkI1XHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBtZXRhPzogTWV0YS5UcmFpdE1ldGFcbiAgLyoqXG4gICAqIFx1OTg4NFx1NzU1OVx1RkYxQVx1NTcyOCBidWlsZCBcdTk2MzZcdTZCQjVcdTUzRUZcdTU4NkJcdTUxNDVcdThCRTUgVHJhaXQgXHU2MjQwXHU1NzI4XHU1QjU3XHU2QkI1XHU4REVGXHU1Rjg0XHVGRjBDXHU0RkJGXHU0RThFXHU4QzAzXHU4QkQ1XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBfZmllbGRQYXRoPzogUFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtNZXRhPFM+IHtcbiAgLyoqXG4gICAqIFx1NkU5MFx1NUI1N1x1NkJCNVx1OERFRlx1NUY4NFx1RkYwQ1x1NTQwQ1x1NjgzN1x1NTNENyBTdGF0ZUZpZWxkUGF0aDxTPiBcdTdFQTZcdTY3NUZcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IGZyb206IFN0YXRlRmllbGRQYXRoPFM+XG59XG5cbmV4cG9ydCB0eXBlIENoZWNrUnVsZTxJbnB1dCA9IHVua25vd24sIEN0eCA9IHVua25vd24+ID1cbiAge1xuICAgIHJlYWRvbmx5IGRlcHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICAgIC8qKlxuICAgICAqIHZhbGlkYXRlT25cdUZGMUFcbiAgICAgKiAtIFx1NEVDNVx1NUY3MVx1NTRDRFx1ODFFQVx1NTJBOFx1NjgyMVx1OUE4Q1x1OTYzNlx1NkJCNVx1RkYwOG9uQ2hhbmdlL29uQmx1clx1RkYwOVx1RkYxQnN1Ym1pdC9tYW51YWwgXHU1OUNCXHU3RUM4XHU2MjY3XHU4ODRDXHVGRjFCXG4gICAgICogLSBcdTRFM0FcdTdBN0FcdTY1NzBcdTdFQzRcdTg4NjhcdTc5M0FcdTc5ODFcdTc1MjhcdTgxRUFcdTUyQThcdTY4MjFcdTlBOENcdUZGMDhcdTRFQzUgc3VibWl0L21hbnVhbCBcdTYyNjdcdTg4NENcdUZGMDlcdTMwMDJcbiAgICAgKi9cbiAgICByZWFkb25seSB2YWxpZGF0ZU9uPzogUmVhZG9ubHlBcnJheTxcIm9uQ2hhbmdlXCIgfCBcIm9uQmx1clwiPlxuICAgIHJlYWRvbmx5IHZhbGlkYXRlOiAoaW5wdXQ6IElucHV0LCBjdHg6IEN0eCkgPT4gdW5rbm93blxuICAgIHJlYWRvbmx5IG1ldGE/OiBNZXRhLlRyYWl0TWV0YVxuICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tNZXRhPElucHV0ID0gdW5rbm93biwgQ3R4ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogXHU1NDdEXHU1NDBEXHU4OUM0XHU1MjE5XHU5NkM2XHU1NDA4XHVGRjA4XHU4QkIwXHU1RjU1XHU3NTI4XHU0RThFXHU3ODZFXHU1QjlBXHU2MDI3XHU1NDA4XHU1RTc2XHU0RTBFXHU4QkNBXHU2NUFEXHU1QzU1XHU3OTNBXHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBydWxlczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hlY2tSdWxlPElucHV0LCBDdHg+Pj5cbiAgLyoqXG4gICAqIFx1OTUxOVx1OEJFRlx1NjgxMVx1NTE5OVx1NTZERVx1RkYwOFBoYXNlIDJcdUZGMUFcdTRFQzVcdTU2RkFcdTUzMTZcdTdFRDNcdTY3ODRcdUZGMUJcdTUxNzdcdTRGNTNcdTUxOTlcdTU2REVcdThCRURcdTRFNDlcdTU3MjhcdTU0MEVcdTdFRUQgUGhhc2UgXHU1QjlFXHU3M0IwXHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSB3cml0ZWJhY2s/OiB7XG4gICAgcmVhZG9ubHkga2luZDogXCJlcnJvcnNcIlxuICAgIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmdcbiAgfVxufVxuXG4vKipcbiAqIFN0YXRlVHJhaXRFbnRyeTxTLCBQPlx1RkYxQVxuICogLSBcdTg4NjhcdTc5M0FcdTY3RDBcdTRFMkFcdTVCNTdcdTZCQjVcdThERUZcdTVGODQgUCBcdTRFMEFcdTc2ODRcdTRFMDBcdTk4NzkgVHJhaXQgXHU5MTREXHU3RjZFXHVGRjFCXG4gKiAtIGtpbmQgXHU0RTBFIG1ldGEgXHU2MjEwXHU1QkY5XHU1MUZBXHU3M0IwXHVGRjBDXHU3NTI4XHU0RThFXHU1NzI4IGJ1aWxkL2luc3RhbGwgXHU5NjM2XHU2QkI1XHU1MjA2XHU2RDNFXHU4ODRDXHU0RTNBXHUzMDAyXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRFbnRyeTxcbiAgUyA9IHVua25vd24sXG4gIFAgZXh0ZW5kcyBzdHJpbmcgPSBTdGF0ZUZpZWxkUGF0aDxTPlxuPiA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgZmllbGRQYXRoOiBQXG4gICAgICByZWFkb25seSBraW5kOiBcImNvbXB1dGVkXCJcbiAgICAgIHJlYWRvbmx5IG1ldGE6IENvbXB1dGVkTWV0YTxTLCBQPlxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSBmaWVsZFBhdGg6IFBcbiAgICAgIHJlYWRvbmx5IGtpbmQ6IFwic291cmNlXCJcbiAgICAgIHJlYWRvbmx5IG1ldGE6IFNvdXJjZU1ldGE8UywgUD5cbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgZmllbGRQYXRoOiBQXG4gICAgICByZWFkb25seSBraW5kOiBcImxpbmtcIlxuICAgICAgcmVhZG9ubHkgbWV0YTogTGlua01ldGE8Uz5cbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgZmllbGRQYXRoOiBQXG4gICAgICByZWFkb25seSBraW5kOiBcImNoZWNrXCJcbiAgICAgIHJlYWRvbmx5IG1ldGE6IENoZWNrTWV0YTx1bmtub3duLCB1bmtub3duPlxuICAgIH1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVRyYWl0Tm9kZTxJbnB1dCA9IHVua25vd24sIEN0eCA9IHVua25vd24+IHtcbiAgcmVhZG9ubHkgX3RhZzogXCJTdGF0ZVRyYWl0Tm9kZVwiXG4gIHJlYWRvbmx5IGNvbXB1dGVkPzpcbiAgICB8IFN0YXRlVHJhaXRFbnRyeTxJbnB1dCwgYW55PlxuICAgIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU3RhdGVUcmFpdEVudHJ5PElucHV0LCBhbnk+Pj5cbiAgcmVhZG9ubHkgc291cmNlPzpcbiAgICB8IFN0YXRlVHJhaXRFbnRyeTxJbnB1dCwgYW55PlxuICAgIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU3RhdGVUcmFpdEVudHJ5PElucHV0LCBhbnk+Pj5cbiAgcmVhZG9ubHkgbGluaz86XG4gICAgfCBTdGF0ZVRyYWl0RW50cnk8SW5wdXQsIGFueT5cbiAgICB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFN0YXRlVHJhaXRFbnRyeTxJbnB1dCwgYW55Pj4+XG4gIHJlYWRvbmx5IGNoZWNrPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hlY2tSdWxlPElucHV0LCBDdHg+Pj5cbiAgcmVhZG9ubHkgbWV0YT86IE1ldGEuVHJhaXRNZXRhXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUcmFpdExpc3Q8SXRlbSA9IHVua25vd24+IHtcbiAgcmVhZG9ubHkgX3RhZzogXCJTdGF0ZVRyYWl0TGlzdFwiXG4gIHJlYWRvbmx5IGl0ZW0/OiBTdGF0ZVRyYWl0Tm9kZTxJdGVtLCBhbnk+XG4gIHJlYWRvbmx5IGxpc3Q/OiBTdGF0ZVRyYWl0Tm9kZTxSZWFkb25seUFycmF5PEl0ZW0+LCBhbnk+XG4gIHJlYWRvbmx5IGlkZW50aXR5SGludD86IHtcbiAgICByZWFkb25seSB0cmFja0J5Pzogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdFNwZWNWYWx1ZTxTLCBQIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgU3RhdGVUcmFpdEVudHJ5PFMsIFA+XG4gIHwgU3RhdGVUcmFpdE5vZGU8YW55LCBhbnk+XG4gIHwgU3RhdGVUcmFpdExpc3Q8YW55PlxuXG4vKipcbiAqIFN0YXRlVHJhaXRGaWVsZFx1RkYxQVxuICogLSBcdTg4NjhcdTc5M0EgU3RhdGUgXHU0RTJEXHU3Njg0XHU0RTAwXHU0RTJBXHU1QjU3XHU2QkI1XHU4MjgyXHU3MEI5XHVGRjA4XHU0RTBEXHU4QkJBXHU2NjJGXHU1NDI2XHU2MzAyIFRyYWl0XHVGRjA5XHVGRjFCXG4gKiAtIFx1NzUzMSBidWlsZCBcdTk2MzZcdTZCQjVcdTRFQ0UgU3RhdGVUcmFpdFNwZWMgXHU1RjUyXHU0RTAwXHU1MzE2XHU4MDBDXHU2NzY1XHUzMDAyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUcmFpdEZpZWxkIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICByZWFkb25seSBwYXRoOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdmFsdWVUeXBlPzogc3RyaW5nXG4gIHJlYWRvbmx5IHRyYWl0czogUmVhZG9ubHlBcnJheTxTdGF0ZVRyYWl0RmllbGRUcmFpdD5cbn1cblxuLyoqXG4gKiBTdGF0ZVRyYWl0RmllbGRUcmFpdFx1RkYxQVxuICogLSBcdTY3RDBcdTRFMkFcdTVCNTdcdTZCQjVcdTRFMEFcdTc2ODRcdTRFMDBcdTk4NzkgVHJhaXRcdUZGMDhjb21wdXRlZCAvIHNvdXJjZSAvIGxpbmtcdUZGMDlcdTc2ODRcdTdFRDNcdTY3ODRcdTUzMTZcdTYzQ0ZcdThGRjBcdUZGMUJcbiAqIC0gbWV0YSBcdTRFMEUgU3RhdGVUcmFpdEVudHJ5Lm1ldGEgXHU1QkY5XHU5RjUwXHVGRjBDZGVwcyBcdTg4NjhcdTc5M0FcdThCRTUgVHJhaXQgXHU2MjQwXHU0RjlEXHU4RDU2XHU3Njg0XHU1QjU3XHU2QkI1XHU4REVGXHU1Rjg0XHU5NkM2XHU1NDA4XHUzMDAyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUcmFpdEZpZWxkVHJhaXQge1xuICByZWFkb25seSBmaWVsZElkOiBzdHJpbmdcbiAgcmVhZG9ubHkga2luZDogU3RhdGVUcmFpdEtpbmRcbiAgcmVhZG9ubHkgbWV0YTpcbiAgICB8IENvbXB1dGVkTWV0YTx1bmtub3duLCBzdHJpbmc+XG4gICAgfCBTb3VyY2VNZXRhPHVua25vd24sIHN0cmluZz5cbiAgICB8IExpbmtNZXRhPHVua25vd24+XG4gICAgfCBDaGVja01ldGE8dW5rbm93biwgdW5rbm93bj5cbiAgcmVhZG9ubHkgZGVwczogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG59XG5cbi8qKlxuICogU3RhdGVUcmFpdFJlc291cmNlXHVGRjFBXG4gKiAtIFx1NjNDRlx1OEZGMCBzb3VyY2UgXHU1NzhCIFRyYWl0IFx1NjI0MFx1NEY5RFx1OEQ1Nlx1NzY4NFx1OTAzQlx1OEY5MVx1OEQ0NFx1NkU5MFx1NTE0M1x1NEZFMVx1NjA2Rlx1RkYxQlxuICogLSBSZXNvdXJjZVNwZWMgXHU3Njg0XHU1MTc3XHU0RjUzXHU1QjlFXHU3M0IwXHU3NTMxIFJlc291cmNlIFx1NTQ3RFx1NTQwRFx1N0E3QVx1OTVGNFx1OEQxRlx1OEQyM1x1RkYwQ1x1OEZEOVx1OTFDQ1x1NTNFQVx1NEZERFx1NzU1OSBUcmFpdCBcdTg5QzZcdTg5RDJcdTc2ODRcdTRGOURcdThENTZcdTRGRTFcdTYwNkZcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVRyYWl0UmVzb3VyY2Uge1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkga2V5U2VsZWN0b3I6IHN0cmluZ1xuICByZWFkb25seSBrZXlFeGFtcGxlPzogdW5rbm93blxuICByZWFkb25seSBvd25lckZpZWxkczogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IG1ldGE/OiBNZXRhLlRyYWl0TWV0YVxuICByZWFkb25seSBtZXRhT3JpZ2luPzogc3RyaW5nXG4gIHJlYWRvbmx5IG1ldGFDb25mbGljdHM/OiBSZWFkb25seUFycmF5PE1ldGEuVHJhaXRNZXRhQ29uZmxpY3Q+XG59XG5cbi8qKlxuICogR3JhcGggTm9kZSAvIEVkZ2VcdUZGMUFcbiAqIC0gXHU4MjgyXHU3MEI5XHU5MDFBXHU1RTM4XHU1QkY5XHU1RTk0XHU0RTAwXHU0RTJBXHU1QjU3XHU2QkI1XHVGRjFCXG4gKiAtIFx1OEZCOVx1ODg2OFx1NzkzQVx1NUI1N1x1NkJCNVx1NEU0Qlx1OTVGNFx1NjIxNlx1NUI1N1x1NkJCNVx1NEUwRVx1OEQ0NFx1NkU5MFx1NEU0Qlx1OTVGNFx1NzY4NFx1NEY5RFx1OEQ1Nlx1NTE3M1x1N0NGQlx1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHJhaXRHcmFwaE5vZGUge1xuICByZWFkb25seSBpZDogc3RyaW5nXG4gIHJlYWRvbmx5IGZpZWxkOiBTdGF0ZVRyYWl0RmllbGRcbiAgcmVhZG9ubHkgdHJhaXRzOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRGaWVsZFRyYWl0PlxuICByZWFkb25seSBtZXRhPzogTWV0YS5UcmFpdE1ldGFcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVRyYWl0R3JhcGhFZGdlIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICByZWFkb25seSBmcm9tOiBzdHJpbmdcbiAgcmVhZG9ubHkgdG86IHN0cmluZ1xuICByZWFkb25seSBraW5kOiBcImNvbXB1dGVkXCIgfCBcImxpbmtcIiB8IFwic291cmNlLWRlcFwiIHwgXCJjaGVjay1kZXBcIlxufVxuXG4vKipcbiAqIFN0YXRlVHJhaXRHcmFwaFx1RkYxQVxuICogLSBTdGF0ZVRyYWl0IFx1NUYxNVx1NjRDRVx1NzY4NFx1N0VEM1x1Njc4NFx1ODlDNlx1NTZGRVx1RkYwQ1x1NEUwMFx1NUYyMFx1NTMwNVx1NTQyQlx1ODI4Mlx1NzBCOVx1NEUwRVx1NEY5RFx1OEQ1Nlx1OEZCOVx1NzY4NFx1NTZGRVx1RkYxQlxuICogLSBcdTRGOUIgRGV2dG9vbHMgLyBTdHVkaW8gXHU0RTBFIFJ1bnRpbWUgXHU1MDVBXHU3RUQzXHU2Nzg0XHU1MjA2XHU2NzkwXHU0RTBFXHU1M0VGXHU4OUM2XHU1MzE2XHU0RjdGXHU3NTI4XHUzMDAyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUcmFpdEdyYXBoIHtcbiAgcmVhZG9ubHkgX3RhZzogXCJTdGF0ZVRyYWl0R3JhcGhcIlxuICByZWFkb25seSBub2RlczogUmVhZG9ubHlBcnJheTxTdGF0ZVRyYWl0R3JhcGhOb2RlPlxuICByZWFkb25seSBlZGdlczogUmVhZG9ubHlBcnJheTxTdGF0ZVRyYWl0R3JhcGhFZGdlPlxuICByZWFkb25seSByZXNvdXJjZXM6IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdFJlc291cmNlPlxuICByZWFkb25seSBtZXRhPzoge1xuICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZ1xuICB9XG59XG5cbi8qKlxuICogU3RhdGVUcmFpdFBsYW5TdGVwXHVGRjFBXG4gKiAtIFN0YXRlVHJhaXQuaW5zdGFsbCAvIFJ1bnRpbWUgXHU2MjY3XHU4ODRDXHU2NUY2XHU3Njg0XHU2NzAwXHU1QzBGXHU2MzA3XHU0RUU0XHU1MzU1XHU1MTQzXHVGRjFCXG4gKiAtIFx1NzUzMSBHcmFwaCBcdTYzQThcdTVCRkNcdTgwMENcdTY3NjVcdUZGMENcdTc1MjhcdTRFOEVcdTU3MjhcdThGRDBcdTg4NENcdTY1RjZcdTVCODlcdTg4QzUgd2F0Y2hlciBcdTYyMTZcdTg5RTZcdTUzRDFcdTU5MTZcdTkwRThcdThDMDNcdTc1MjhcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVRyYWl0UGxhblN0ZXAge1xuICByZWFkb25seSBpZDogc3RyaW5nXG4gIHJlYWRvbmx5IGtpbmQ6IFwiY29tcHV0ZWQtdXBkYXRlXCIgfCBcImxpbmstcHJvcGFnYXRlXCIgfCBcInNvdXJjZS1yZWZyZXNoXCIgfCBcImNoZWNrLXZhbGlkYXRlXCJcbiAgcmVhZG9ubHkgdGFyZ2V0RmllbGRQYXRoPzogc3RyaW5nXG4gIHJlYWRvbmx5IHNvdXJjZUZpZWxkUGF0aHM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZD86IHN0cmluZ1xuICByZWFkb25seSBrZXlTZWxlY3RvcklkPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRlYnVnSW5mbz86IHtcbiAgICByZWFkb25seSBncmFwaE5vZGVJZD86IHN0cmluZ1xuICAgIHJlYWRvbmx5IGdyYXBoRWRnZUlkPzogc3RyaW5nXG4gIH1cbn1cblxuLyoqXG4gKiBTdGF0ZVRyYWl0UGxhblx1RkYxQVxuICogLSBcdTZDNDdcdTYwM0JcdTY3RDBcdTZBMjFcdTU3NTdcdTYyNDBcdTY3MDkgVHJhaXQgXHU4ODRDXHU0RTNBXHU3Njg0XHU2MjY3XHU4ODRDXHU4QkExXHU1MjEyXHVGRjFCXG4gKiAtIGluc3RhbGwgXHU5NjM2XHU2QkI1XHU2MzA5IFBsYW4gXHU1QzA2XHU4ODRDXHU0RTNBXHU2MzAyXHU4RjdEXHU1MjMwIEJvdW5kIEFQSSAvIEVmZmVjdE9wIFx1N0JBMVx1OTA1M1x1NEUwQVx1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHJhaXRQbGFuIHtcbiAgcmVhZG9ubHkgX3RhZzogXCJTdGF0ZVRyYWl0UGxhblwiXG4gIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gIHJlYWRvbmx5IHN0ZXBzOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRQbGFuU3RlcD5cbiAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG59XG5cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRTY2hlbWFQYXRoS2luZCA9XG4gIHwgXCJmaWVsZFBhdGhcIlxuICB8IFwiZGVwXCJcbiAgfCBcImxpbmtfZnJvbVwiXG4gIHwgXCJjaGVja193cml0ZWJhY2tcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHJhaXRTY2hlbWFQYXRoUmVmIHtcbiAgcmVhZG9ubHkga2luZDogU3RhdGVUcmFpdFNjaGVtYVBhdGhLaW5kXG4gIHJlYWRvbmx5IGVudHJ5S2luZDogU3RhdGVUcmFpdEtpbmRcbiAgcmVhZG9ubHkgZW50cnlGaWVsZFBhdGg6IHN0cmluZ1xuICByZWFkb25seSBwYXRoOiBzdHJpbmdcbiAgcmVhZG9ubHkgcnVsZU5hbWU/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBTdGF0ZVRyYWl0UHJvZ3JhbTxTPlx1RkYxQVxuICogLSBTdGF0ZVRyYWl0IFx1NUYxNVx1NjRDRVx1NzY4NCBQcm9ncmFtIFx1OEY5M1x1NTFGQVx1RkYwQ1x1NjYyRiBSdW50aW1lIC8gRGV2dG9vbHMgXHU3Njg0XHU3RURGXHU0RTAwXHU1MTY1XHU1M0UzXHVGRjFCXG4gKiAtIHN0YXRlU2NoZW1hIFx1NEUwRSBzcGVjIFx1NEZERFx1NzU1OVx1NTM5Rlx1NTlDQlx1OEY5M1x1NTE2NVx1RkYwQ2dyYXBoL3BsYW4gXHU0RTNBXHU1MTg1XHU5MEU4IElSXHUzMDAyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUcmFpdFByb2dyYW08Uz4ge1xuICByZWFkb25seSBzdGF0ZVNjaGVtYTogU2NoZW1hLlNjaGVtYTxTLCBhbnk+XG4gIHJlYWRvbmx5IHNwZWM6IFN0YXRlVHJhaXRTcGVjPFM+XG4gIC8qKlxuICAgKiBQcm9ncmFtLmVudHJpZXNcdUZGMUFcbiAgICogLSBidWlsZCBcdTk2MzZcdTZCQjVcdTRFQ0Ugc3BlY1x1RkYwOFx1NTQyQiBub2RlL2xpc3QvJHJvb3RcdUZGMDlcdTVGNTJcdTRFMDBcdTUzMTZcdTVGOTdcdTUyMzBcdTc2ODRcdTY3MDBcdTVDMEZcdTg5QzRcdTUyMTlcdTk2QzZcdTU0MDhcdUZGMUJcbiAgICogLSBQaGFzZSAyIFx1NTE0OFx1NEZERFx1OEJDMVx1MjAxQ1x1NTNFRlx1OEJGQlx1NTNFRlx1OEJDQVx1NjVBRFx1NzY4NFx1N0VEM1x1Njc4NFx1MjAxRFx1RkYwQ1x1NTQwRVx1N0VFRCBQaGFzZSBcdTYyNERcdTYzQTVcdTUxNjVcdTYyNjdcdTg4NENcdTRFMEVcdTY1MzZcdTY1NUJcdThCRURcdTRFNDlcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEVudHJ5PGFueSwgc3RyaW5nPj5cbiAgcmVhZG9ubHkgZ3JhcGg6IFN0YXRlVHJhaXRHcmFwaFxuICByZWFkb25seSBwbGFuOiBTdGF0ZVRyYWl0UGxhblxuICByZWFkb25seSBjb252ZXJnZUlyPzogQ29udmVyZ2VTdGF0aWNJclJlZ2lzdHJ5XG4gIC8qKlxuICAgKiBzY2hlbWFQYXRoc1x1RkYxQVxuICAgKiAtIGJ1aWxkIFx1OTYzNlx1NkJCNVx1NEVDRSBlbnRyaWVzIFx1NkM0N1x1NjAzQlx1NTFGQVx1NzY4NFx1MjAxQ1x1OTcwMFx1ODk4MVx1NUI1OFx1NTcyOFx1NEU4RSBzdGF0ZVNjaGVtYSBcdTc2ODRcdThERUZcdTVGODRcdTVGMTVcdTc1MjhcdTIwMURcdUZGMUJcdTRFQzVcdTc1MjhcdTRFOEUgZGV2IFx1OEJDQVx1NjVBRFx1RkYwOFx1NEY4Qlx1NTk4MiBzY2hlbWFfbWlzbWF0Y2hcdUZGMDlcdTMwMDJcbiAgICogLSBkaWFnbm9zdGljcz1vZmYgXHU2NUY2XHU1M0VGXHU1QjhDXHU1MTY4XHU4REYzXHU4RkM3XHU2ODIxXHU5QThDXHU0RUU1XHU0RkREXHU2MzAxXHU4RkQxXHU5NkY2XHU2MjEwXHU2NzJDXHUzMDAyXG4gICAqL1xuICByZWFkb25seSBzY2hlbWFQYXRocz86IFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdFNjaGVtYVBhdGhSZWY+XG59XG5cbi8qKlxuICogXHU0RUNFIFN0YXRlVHJhaXRTcGVjIFx1Njc4NFx1NUVGQVx1NUY1Mlx1NEUwMFx1NTMxNlx1NzY4NCBlbnRyeSBcdTUyMTdcdTg4NjhcdTMwMDJcbiAqXG4gKiAtIFBoYXNlIDJcdUZGMUFcdTY1MkZcdTYzMDEgbm9kZS9saXN0LyRyb290IFx1NzY4NFx1N0VEM1x1Njc4NFx1NUM1NVx1NUYwMFx1RkYwQ1x1NUU3Nlx1NTcyOFx1NUZDNVx1ODk4MVx1NjVGNlx1ODg2NVx1NTE2OC9cdTUyNERcdTdGMDBcdTUzMTYgZmllbGRQYXRoIFx1NEUwRSBkZXBzXHVGRjFCXG4gKiAtIFx1NTQwRVx1N0VFRCBQaGFzZSBcdTUzRUZcdTU3MjhcdTZCNjRcdTU5MDRcdTYyNjlcdTVDNTVcdTY4MjFcdTlBOENcdTkwM0JcdThGOTFcdUZGMDhcdTRGOEJcdTU5ODJcdTY4QzBcdTZENEJcdTkxQ0RcdTU5MERcdTVCOUFcdTRFNDlcdTMwMDFcdTg5ODZcdTc2RDZcdTY3M0FcdTUyMzZcdTdCNDlcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVNwZWMgPSA8Uz4oXG4gIHNwZWM6IFN0YXRlVHJhaXRTcGVjPFM+LFxuKTogUmVhZG9ubHlBcnJheTxTdGF0ZVRyYWl0RW50cnk8YW55LCBzdHJpbmc+PiA9PiB7XG4gIGNvbnN0IGVudHJpZXM6IEFycmF5PFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4+ID0gW11cblxuICBjb25zdCBpc05vZGUgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdGF0ZVRyYWl0Tm9kZTxhbnksIGFueT4gPT5cbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIGFueSkuX3RhZyA9PT0gXCJTdGF0ZVRyYWl0Tm9kZVwiXG5cbiAgY29uc3QgaXNMaXN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RhdGVUcmFpdExpc3Q8YW55PiA9PlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgYW55KS5fdGFnID09PSBcIlN0YXRlVHJhaXRMaXN0XCJcblxuICBjb25zdCBqb2luUGF0aCA9IChwcmVmaXg6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGlmICghcHJlZml4KSByZXR1cm4gc3VmZml4XG4gICAgaWYgKCFzdWZmaXgpIHJldHVybiBwcmVmaXhcbiAgICByZXR1cm4gYCR7cHJlZml4fS4ke3N1ZmZpeH1gXG4gIH1cblxuICBjb25zdCBwcmVmaXhEZXBzID0gKFxuICAgIGRlcHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgICBpZiAoIWRlcHMgfHwgZGVwcy5sZW5ndGggPT09IDApIHJldHVybiBbXVxuICAgIHJldHVybiBkZXBzLm1hcCgoZCkgPT4gKHByZWZpeCA/IGpvaW5QYXRoKHByZWZpeCwgZCkgOiBkKSlcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZUVudHJ5ID0gKFxuICAgIGVudHJ5OiBTdGF0ZVRyYWl0RW50cnk8YW55LCBzdHJpbmc+LFxuICAgIGZpZWxkUGF0aDogc3RyaW5nLFxuICAgIGRlcFByZWZpeDogc3RyaW5nLFxuICApOiBTdGF0ZVRyYWl0RW50cnk8YW55LCBzdHJpbmc+ID0+IHtcbiAgICBpZiAoZW50cnkua2luZCA9PT0gXCJjb21wdXRlZFwiKSB7XG4gICAgICBjb25zdCBtZXRhID0gZW50cnkubWV0YSBhcyBhbnlcbiAgICAgIGNvbnN0IHJhd0RlcHMgPSBtZXRhLmRlcHMgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkXG4gICAgICBjb25zdCBkZXBzID1cbiAgICAgICAgcmF3RGVwcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBwcmVmaXhEZXBzKHJhd0RlcHMsIGRlcFByZWZpeClcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGVudHJ5IGFzIGFueSksXG4gICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgbWV0YTogeyAuLi5tZXRhLCBkZXBzIH0sXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnRyeS5raW5kID09PSBcInNvdXJjZVwiKSB7XG4gICAgICBjb25zdCBtZXRhID0gZW50cnkubWV0YSBhcyBhbnlcbiAgICAgIGNvbnN0IHJhd0RlcHMgPSBtZXRhLmRlcHMgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkXG4gICAgICBjb25zdCBkZXBzID1cbiAgICAgICAgcmF3RGVwcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBwcmVmaXhEZXBzKHJhd0RlcHMsIGRlcFByZWZpeClcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGVudHJ5IGFzIGFueSksXG4gICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgbWV0YTogeyAuLi5tZXRhLCBkZXBzLCBfZmllbGRQYXRoOiBmaWVsZFBhdGggfSxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVudHJ5LmtpbmQgPT09IFwibGlua1wiKSB7XG4gICAgICBjb25zdCBtZXRhID0gZW50cnkubWV0YSBhcyBhbnlcbiAgICAgIGNvbnN0IGZyb20gPSBwcmVmaXhEZXBzKFttZXRhLmZyb20gYXMgc3RyaW5nXSwgZGVwUHJlZml4KVswXSA/PyBtZXRhLmZyb21cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLihlbnRyeSBhcyBhbnkpLFxuICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgIG1ldGE6IHsgLi4ubWV0YSwgZnJvbSB9LFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBjaGVja1x1RkYxQVBoYXNlIDIgXHU0RUM1XHU4QzAzXHU2NTc0IGZpZWxkUGF0aFx1RkYwQ2RlcHMgXHU0RUNEXHU3NTMxIG1ldGEucnVsZXMgXHU1NzI4IGJ1aWxkIFx1OTYzNlx1NkJCNVx1NkM0N1x1NjAzQlx1MzAwMlxuICAgIHJldHVybiB7XG4gICAgICAuLi4oZW50cnkgYXMgYW55KSxcbiAgICAgIGZpZWxkUGF0aCxcbiAgICB9XG4gIH1cblxuICBjb25zdCBleHBhbmROb2RlID0gKFxuICAgIHNjb3BlSWQ6IHN0cmluZyxcbiAgICBqb2luUHJlZml4OiBzdHJpbmcsXG4gICAgbm9kZTogU3RhdGVUcmFpdE5vZGU8YW55LCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICAvKipcbiAgICAgICAqIGNoZWNrIGRlcHMgXHU1MjREXHU3RjAwXHVGRjFBXHU3NTI4XHU0RThFIGxpc3Qtc2NvcGUgY2hlY2sgXHU3Njg0XHU5RUQ4XHU4QkE0XHU4QkVEXHU0RTQ5XHVGRjA4ZGVwcyBcdTc2RjhcdTVCRjlcdTIwMUNcdTg4NENcdTUxNDNcdTdEMjBcdTIwMURcdTgwMENcdTk3NUUgbGlzdCBcdTY4MzlcdUZGMDlcdTMwMDJcbiAgICAgICAqXG4gICAgICAgKiAtIGl0ZW0gc2NvcGVcdUZGMUFkZXBzUHJlZml4ID0gYCR7bGlzdFBhdGh9W11gXHVGRjA4XHU0RTBFIGpvaW5QcmVmaXggXHU0RTAwXHU4MUY0XHVGRjA5XHVGRjFCXG4gICAgICAgKiAtIGxpc3Qgc2NvcGVcdUZGMUFmaWVsZFBhdGggPSBgJHtsaXN0UGF0aH1gXHVGRjBDXHU0RjQ2IGRlcHNQcmVmaXggXHU1RTk0XHU0RTNBIGAke2xpc3RQYXRofVtdYFx1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSBjaGVja0RlcHNQcmVmaXg/OiBzdHJpbmdcbiAgICB9LFxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBhZGRFbnRyeSA9IChyZWxhdGl2ZVRhcmdldDogc3RyaW5nLCByYXc6IFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4pOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHJlbCA9IChyYXcgYXMgYW55KS5maWVsZFBhdGggPz8gcmVsYXRpdmVUYXJnZXRcbiAgICAgIGNvbnN0IGZpZWxkUGF0aCA9IGpvaW5QcmVmaXggPyBqb2luUGF0aChqb2luUHJlZml4LCBTdHJpbmcocmVsKSkgOiBTdHJpbmcocmVsKVxuICAgICAgZW50cmllcy5wdXNoKG5vcm1hbGl6ZUVudHJ5KHJhdywgZmllbGRQYXRoLCBqb2luUHJlZml4KSlcbiAgICB9XG5cbiAgICBjb25zdCBleHBhbmRNYXliZVJlY29yZCA9IChcbiAgICAgIHZhbHVlOlxuICAgICAgICB8IFN0YXRlVHJhaXRFbnRyeTxhbnksIGFueT5cbiAgICAgICAgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTdGF0ZVRyYWl0RW50cnk8YW55LCBhbnk+Pj5cbiAgICAgICAgfCB1bmRlZmluZWQsXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm5cbiAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSkua2luZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBhZGRFbnRyeShcIlwiLCB2YWx1ZSBhcyBhbnkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgcmVjb3JkID0gdmFsdWUgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU3RhdGVUcmFpdEVudHJ5PGFueSwgYW55Pj4+XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiByZWNvcmQpIHtcbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVjb3JkLCBrZXkpKSBjb250aW51ZVxuICAgICAgICBjb25zdCBlbnRyeSA9IHJlY29yZFtrZXldXG4gICAgICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG4gICAgICAgIGFkZEVudHJ5KGtleSwgZW50cnkgYXMgYW55KVxuICAgICAgfVxuICAgIH1cblxuICAgIGV4cGFuZE1heWJlUmVjb3JkKG5vZGUuY29tcHV0ZWQpXG4gICAgZXhwYW5kTWF5YmVSZWNvcmQobm9kZS5zb3VyY2UpXG4gICAgZXhwYW5kTWF5YmVSZWNvcmQobm9kZS5saW5rKVxuXG4gICAgaWYgKG5vZGUuY2hlY2spIHtcbiAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBDaGVja1J1bGU8YW55LCBhbnk+PiA9IHt9XG4gICAgICBjb25zdCBjaGVja0RlcHNQcmVmaXggPVxuICAgICAgICBvcHRpb25zPy5jaGVja0RlcHNQcmVmaXggPz8gKGpvaW5QcmVmaXguZW5kc1dpdGgoXCJbXVwiKSA/IGpvaW5QcmVmaXggOiBcIlwiKVxuXG4gICAgICBjb25zdCBwcmVmaXhDaGVja0RlcHMgPSAoXG4gICAgICAgIGRlcHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgICAgICk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gICAgICAgIGlmICghZGVwcyB8fCBkZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdXG4gICAgICAgIHJldHVybiBkZXBzLm1hcCgoZCkgPT5cbiAgICAgICAgICBkID09PSBcIlwiID8gc2NvcGVJZCA6IChjaGVja0RlcHNQcmVmaXggPyBqb2luUGF0aChjaGVja0RlcHNQcmVmaXgsIGQpIDogZCksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhub2RlLmNoZWNrKSkge1xuICAgICAgICBjb25zdCBydWxlID0gKG5vZGUuY2hlY2sgYXMgYW55KVtuYW1lXSBhcyBDaGVja1J1bGU8YW55LCBhbnk+XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcnVsZXNbbmFtZV0gPSBydWxlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVsZSAmJiB0eXBlb2YgcnVsZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGNvbnN0IG1ldGEgPSBNZXRhLnNhbml0aXplKChydWxlIGFzIGFueSkubWV0YSlcbiAgICAgICAgICBydWxlc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIC4uLnJ1bGUsXG4gICAgICAgICAgICBkZXBzOiBwcmVmaXhDaGVja0RlcHMocnVsZS5kZXBzKSxcbiAgICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gXHU5NzVFXHU2Q0Q1XHU4RjkzXHU1MTY1XHVGRjFBXHU1RkZEXHU3NTY1XHVGRjA4XHU1NDBFXHU3RUVEIFBoYXNlIFx1NUMwNlx1NTcyOCBidWlsZCBcdTk2MzZcdTZCQjVcdTYzRDBcdTUzNDdcdTRFM0FcdTkxNERcdTdGNkVcdTk1MTlcdThCRUZcdUZGMDlcdTMwMDJcbiAgICAgIH1cblxuICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgZmllbGRQYXRoOiBzY29wZUlkLFxuICAgICAgICBraW5kOiBcImNoZWNrXCIsXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICBydWxlcyxcbiAgICAgICAgICB3cml0ZWJhY2s6IHsga2luZDogXCJlcnJvcnNcIiB9LFxuICAgICAgICB9LFxuICAgICAgfSBhcyBTdGF0ZVRyYWl0RW50cnk8YW55LCBhbnk+KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IGluIHNwZWMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBrZXkpKSBjb250aW51ZVxuICAgIGNvbnN0IHJhdyA9IHNwZWNba2V5IGFzIGtleW9mIHR5cGVvZiBzcGVjXSBhcyBTdGF0ZVRyYWl0U3BlY1ZhbHVlPFMsIGFueT4gfCB1bmRlZmluZWRcbiAgICBpZiAoIXJhdykgY29udGludWVcblxuICAgIGlmIChpc0xpc3QocmF3KSkge1xuICAgICAgY29uc3QgbGlzdFBhdGggPSBrZXlcbiAgICAgIGlmIChyYXcuaXRlbSkge1xuICAgICAgICBleHBhbmROb2RlKGAke2xpc3RQYXRofVtdYCwgYCR7bGlzdFBhdGh9W11gLCByYXcuaXRlbSlcbiAgICAgIH1cbiAgICAgIGlmIChyYXcubGlzdCkge1xuICAgICAgICBleHBhbmROb2RlKGxpc3RQYXRoLCBsaXN0UGF0aCwgcmF3Lmxpc3QsIHtcbiAgICAgICAgICBjaGVja0RlcHNQcmVmaXg6IGAke2xpc3RQYXRofVtdYCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGlzTm9kZShyYXcpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcIiRyb290XCIpIHtcbiAgICAgICAgZXhwYW5kTm9kZShcIiRyb290XCIsIFwiXCIsIHJhdylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cGFuZE5vZGUoa2V5LCBrZXksIHJhdylcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgZW50cnkgPSByYXcgYXMgYW55IGFzIFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz5cbiAgICBjb25zdCBmaWVsZFBhdGggPSAoZW50cnkgYXMgYW55KS5maWVsZFBhdGggPz8ga2V5XG4gICAgZW50cmllcy5wdXNoKG5vcm1hbGl6ZUVudHJ5KGVudHJ5LCBTdHJpbmcoZmllbGRQYXRoKSwgXCJcIikpXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xufVxuXG4vKipcbiAqIGNvbGxlY3ROb2RlTWV0YVx1RkYxQVxuICogLSBcdTRFQ0UgU3RhdGVUcmFpdFNwZWMgXHU0RTJEXHU2M0QwXHU1M0Q2IFN0YXRlVHJhaXROb2RlLm1ldGFcdUZGMDhcdTc2N0RcdTU0MERcdTUzNTVcdTVCNTdcdTZCQjVcdUZGMDlcdUZGMENcdTRGOUIgRGV2dG9vbHMgXHU4RkRCXHU4ODRDXHU3RUQzXHU2Nzg0XHU1QzU1XHU3OTNBXHVGRjFCXG4gKiAtIG1ldGEgXHU0RUM1XHU3NTI4XHU0RThFXHU4QkNBXHU2NUFEXHU0RTBFXHU1QzU1XHU3OTNBXHVGRjBDXHU0RTBEXHU1M0MyXHU0RTBFXHU4RkQwXHU4ODRDXHU2NUY2XHU4QkVEXHU0RTQ5XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBjb2xsZWN0Tm9kZU1ldGEgPSA8Uz4oXG4gIHNwZWM6IFN0YXRlVHJhaXRTcGVjPFM+LFxuKTogUmVhZG9ubHlNYXA8c3RyaW5nLCBNZXRhLlRyYWl0TWV0YT4gPT4ge1xuICBjb25zdCBvdXQgPSBuZXcgTWFwPHN0cmluZywgTWV0YS5UcmFpdE1ldGE+KClcblxuICBjb25zdCBpc05vZGUgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdGF0ZVRyYWl0Tm9kZTxhbnksIGFueT4gPT5cbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIGFueSkuX3RhZyA9PT0gXCJTdGF0ZVRyYWl0Tm9kZVwiXG5cbiAgY29uc3QgaXNMaXN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RhdGVUcmFpdExpc3Q8YW55PiA9PlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgYW55KS5fdGFnID09PSBcIlN0YXRlVHJhaXRMaXN0XCJcblxuICBjb25zdCBhZGQgPSAoc2NvcGVJZDogc3RyaW5nLCBub2RlOiBTdGF0ZVRyYWl0Tm9kZTxhbnksIGFueT4pOiB2b2lkID0+IHtcbiAgICBjb25zdCBtZXRhID0gTWV0YS5zYW5pdGl6ZShub2RlLm1ldGEpXG4gICAgaWYgKG1ldGEpIG91dC5zZXQoc2NvcGVJZCwgbWV0YSlcbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IGluIHNwZWMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBrZXkpKSBjb250aW51ZVxuICAgIGNvbnN0IHJhdyA9IHNwZWNba2V5IGFzIGtleW9mIHR5cGVvZiBzcGVjXSBhcyBTdGF0ZVRyYWl0U3BlY1ZhbHVlPFMsIGFueT4gfCB1bmRlZmluZWRcbiAgICBpZiAoIXJhdykgY29udGludWVcblxuICAgIGlmIChpc0xpc3QocmF3KSkge1xuICAgICAgY29uc3QgbGlzdFBhdGggPSBrZXlcbiAgICAgIGlmIChyYXcuaXRlbSkgYWRkKGAke2xpc3RQYXRofVtdYCwgcmF3Lml0ZW0pXG4gICAgICBpZiAocmF3Lmxpc3QpIGFkZChsaXN0UGF0aCwgcmF3Lmxpc3QpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChpc05vZGUocmF3KSkge1xuICAgICAgaWYgKGtleSA9PT0gXCIkcm9vdFwiKSBhZGQoXCIkcm9vdFwiLCByYXcpXG4gICAgICBlbHNlIGFkZChrZXksIHJhdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG4vLyAtLS0tIENvbnZlcmdlICgwMTMpIGV2aWRlbmNlIG1vZGVsIC0tLS1cblxuZXhwb3J0IHR5cGUgVHJhaXRDb252ZXJnZVJlcXVlc3RlZE1vZGUgPSBcImF1dG9cIiB8IFwiZnVsbFwiIHwgXCJkaXJ0eVwiXG5leHBvcnQgdHlwZSBUcmFpdENvbnZlcmdlRXhlY3V0ZWRNb2RlID0gXCJmdWxsXCIgfCBcImRpcnR5XCJcbmV4cG9ydCB0eXBlIFRyYWl0Q29udmVyZ2VPdXRjb21lID0gXCJDb252ZXJnZWRcIiB8IFwiTm9vcFwiIHwgXCJEZWdyYWRlZFwiXG5cbmV4cG9ydCB0eXBlIFRyYWl0Q29udmVyZ2VDb25maWdTY29wZSA9XG4gIHwgXCJwcm92aWRlclwiXG4gIHwgXCJydW50aW1lX21vZHVsZVwiXG4gIHwgXCJydW50aW1lX2RlZmF1bHRcIlxuICB8IFwiYnVpbHRpblwiXG5cbmV4cG9ydCB0eXBlIFRyYWl0Q29udmVyZ2VSZWFzb24gPVxuICB8IFwiY29sZF9zdGFydFwiXG4gIHwgXCJjYWNoZV9oaXRcIlxuICB8IFwiY2FjaGVfbWlzc1wiXG4gIHwgXCJidWRnZXRfY3V0b2ZmXCJcbiAgfCBcIm5lYXJfZnVsbFwiXG4gIHwgXCJ1bmtub3duX3dyaXRlXCJcbiAgfCBcImRpcnR5X2FsbFwiXG4gIHwgXCJnZW5lcmF0aW9uX2J1bXBlZFwiXG4gIHwgXCJsb3dfaGl0X3JhdGVfcHJvdGVjdGlvblwiXG4gIHwgXCJtb2R1bGVfb3ZlcnJpZGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0Q29udmVyZ2VTdGVwU3RhdHMge1xuICByZWFkb25seSB0b3RhbFN0ZXBzOiBudW1iZXJcbiAgcmVhZG9ubHkgZXhlY3V0ZWRTdGVwczogbnVtYmVyXG4gIHJlYWRvbmx5IHNraXBwZWRTdGVwczogbnVtYmVyXG4gIHJlYWRvbmx5IGNoYW5nZWRTdGVwczogbnVtYmVyXG4gIHJlYWRvbmx5IGFmZmVjdGVkU3RlcHM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnZlcmdlRGlydHlTdW1tYXJ5IHtcbiAgcmVhZG9ubHkgZGlydHlBbGw6IGJvb2xlYW5cbiAgcmVhZG9ubHkgcmVhc29uPzogRGlydHlBbGxSZWFzb25cbiAgcmVhZG9ubHkgcm9vdENvdW50PzogbnVtYmVyXG4gIHJlYWRvbmx5IHJvb3RJZHM/OiBSZWFkb25seUFycmF5PG51bWJlcj5cbiAgcmVhZG9ubHkgcm9vdElkc1RydW5jYXRlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnZlcmdlUGxhbkNhY2hlRXZpZGVuY2Uge1xuICByZWFkb25seSBjYXBhY2l0eTogbnVtYmVyXG4gIHJlYWRvbmx5IHNpemU6IG51bWJlclxuICByZWFkb25seSBoaXRzOiBudW1iZXJcbiAgcmVhZG9ubHkgbWlzc2VzOiBudW1iZXJcbiAgcmVhZG9ubHkgZXZpY3RzOiBudW1iZXJcbiAgcmVhZG9ubHkgaGl0OiBib29sZWFuXG4gIHJlYWRvbmx5IGtleVNpemU/OiBudW1iZXJcbiAgcmVhZG9ubHkgbWlzc1JlYXNvbj86IFwiY29sZF9zdGFydFwiIHwgXCJnZW5lcmF0aW9uX2J1bXBlZFwiIHwgXCJub3RfY2FjaGVkXCIgfCBcInVua25vd25cIlxuICByZWFkb25seSBkaXNhYmxlZD86IGJvb2xlYW5cbiAgcmVhZG9ubHkgZGlzYWJsZVJlYXNvbj86IFwibG93X2hpdF9yYXRlXCIgfCBcImdlbmVyYXRpb25fdGhyYXNoXCIgfCBcIm1hbnVhbF9vdmVycmlkZVwiIHwgXCJ1bmtub3duXCJcbn1cblxuZXhwb3J0IHR5cGUgVHJhaXRDb252ZXJnZUdlbmVyYXRpb25CdW1wUmVhc29uID1cbiAgfCBcIndyaXRlcnNfY2hhbmdlZFwiXG4gIHwgXCJkZXBzX2NoYW5nZWRcIlxuICB8IFwibG9naWNfaW5zdGFsbGVkXCJcbiAgfCBcImxvZ2ljX3VuaW5zdGFsbGVkXCJcbiAgfCBcImltcG9ydHNfY2hhbmdlZFwiXG4gIHwgXCJ1bmtub3duXCJcblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnZlcmdlR2VuZXJhdGlvbkV2aWRlbmNlIHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGlvbjogbnVtYmVyXG4gIHJlYWRvbmx5IGdlbmVyYXRpb25CdW1wQ291bnQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgbGFzdEJ1bXBSZWFzb24/OiBUcmFpdENvbnZlcmdlR2VuZXJhdGlvbkJ1bXBSZWFzb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnZlcmdlU3RhdGljSXJFdmlkZW5jZSB7XG4gIHJlYWRvbmx5IGZpZWxkUGF0aENvdW50OiBudW1iZXJcbiAgcmVhZG9ubHkgc3RlcENvdW50OiBudW1iZXJcbiAgcmVhZG9ubHkgYnVpbGREdXJhdGlvbk1zPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRDb252ZXJnZUhvdHNwb3Qge1xuICByZWFkb25seSBraW5kPzogc3RyaW5nXG4gIHJlYWRvbmx5IHN0ZXBJZDogbnVtYmVyXG4gIHJlYWRvbmx5IG91dEZpZWxkUGF0aElkPzogbnVtYmVyXG4gIHJlYWRvbmx5IGR1cmF0aW9uTXM6IG51bWJlclxuICByZWFkb25seSBjaGFuZ2VkOiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRDb252ZXJnZURlY2lzaW9uU3VtbWFyeSB7XG4gIHJlYWRvbmx5IHJlcXVlc3RlZE1vZGU6IFRyYWl0Q29udmVyZ2VSZXF1ZXN0ZWRNb2RlXG4gIHJlYWRvbmx5IGV4ZWN1dGVkTW9kZTogVHJhaXRDb252ZXJnZUV4ZWN1dGVkTW9kZVxuICByZWFkb25seSBvdXRjb21lOiBUcmFpdENvbnZlcmdlT3V0Y29tZVxuICByZWFkb25seSBjb25maWdTY29wZTogVHJhaXRDb252ZXJnZUNvbmZpZ1Njb3BlXG4gIHJlYWRvbmx5IHN0YXRpY0lyRGlnZXN0OiBzdHJpbmdcbiAgcmVhZG9ubHkgZXhlY3V0aW9uQnVkZ2V0TXM6IG51bWJlclxuICByZWFkb25seSBleGVjdXRpb25EdXJhdGlvbk1zOiBudW1iZXJcbiAgcmVhZG9ubHkgZGVjaXNpb25CdWRnZXRNcz86IG51bWJlclxuICByZWFkb25seSBkZWNpc2lvbkR1cmF0aW9uTXM/OiBudW1iZXJcbiAgcmVhZG9ubHkgcmVhc29uczogUmVhZG9ubHlBcnJheTxUcmFpdENvbnZlcmdlUmVhc29uPlxuICByZWFkb25seSBzdGVwU3RhdHM6IFRyYWl0Q29udmVyZ2VTdGVwU3RhdHNcbiAgcmVhZG9ubHkgZGlydHk/OiBUcmFpdENvbnZlcmdlRGlydHlTdW1tYXJ5XG4gIHJlYWRvbmx5IGNhY2hlPzogVHJhaXRDb252ZXJnZVBsYW5DYWNoZUV2aWRlbmNlXG4gIHJlYWRvbmx5IGdlbmVyYXRpb24/OiBUcmFpdENvbnZlcmdlR2VuZXJhdGlvbkV2aWRlbmNlXG4gIHJlYWRvbmx5IHN0YXRpY0lyPzogVHJhaXRDb252ZXJnZVN0YXRpY0lyRXZpZGVuY2VcbiAgcmVhZG9ubHkgdGhyZXNob2xkcz86IHsgcmVhZG9ubHkgZmxvb3JSYXRpbz86IG51bWJlciB9XG4gIHJlYWRvbmx5IHRvcDM/OiBSZWFkb25seUFycmF5PFRyYWl0Q29udmVyZ2VIb3RzcG90PlxufVxuIiwgImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQge1xuICB0eXBlIFN0YXRlVHJhaXRQcm9ncmFtLFxuICB0eXBlIFN0YXRlVHJhaXRTcGVjLFxuICB0eXBlIFN0YXRlVHJhaXRFbnRyeSxcbiAgdHlwZSBTdGF0ZVRyYWl0R3JhcGgsXG4gIHR5cGUgU3RhdGVUcmFpdEdyYXBoRWRnZSxcbiAgdHlwZSBTdGF0ZVRyYWl0R3JhcGhOb2RlLFxuICB0eXBlIFN0YXRlVHJhaXRGaWVsZCxcbiAgdHlwZSBTdGF0ZVRyYWl0RmllbGRUcmFpdCxcbiAgdHlwZSBTdGF0ZVRyYWl0UGxhbixcbiAgdHlwZSBTdGF0ZVRyYWl0UGxhblN0ZXAsXG4gIHR5cGUgU3RhdGVUcmFpdFJlc291cmNlLFxuICB0eXBlIFN0YXRlVHJhaXRTY2hlbWFQYXRoUmVmLFxuICBjb2xsZWN0Tm9kZU1ldGEsXG4gIG5vcm1hbGl6ZVNwZWMsXG59IGZyb20gXCIuL21vZGVsLmpzXCJcbmltcG9ydCAqIGFzIE1ldGEgZnJvbSBcIi4vbWV0YS5qc1wiXG5pbXBvcnQge1xuICBjb21wYXJlRmllbGRQYXRoLFxuICBnZXRGaWVsZFBhdGhJZCxcbiAgbWFrZUZpZWxkUGF0aElkUmVnaXN0cnksXG4gIG5vcm1hbGl6ZUZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRQYXRoSWQsXG59IGZyb20gXCIuLi9maWVsZC1wYXRoLmpzXCJcbmltcG9ydCB0eXBlIHsgQ29udmVyZ2VTdGF0aWNJclJlZ2lzdHJ5IH0gZnJvbSBcIi4vY29udmVyZ2UtaXIuanNcIlxuXG5jb25zdCBub3dQZXJmID0gKCk6IG51bWJlciA9PlxuICB0eXBlb2YgZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB0eXBlb2YgZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3cgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3coKVxuICAgIDogRGF0ZS5ub3coKVxuXG50eXBlIENvbnZlcmdlV3JpdGVyID0gRXh0cmFjdDxcbiAgU3RhdGVUcmFpdEVudHJ5PGFueSwgc3RyaW5nPixcbiAgeyByZWFkb25seSBraW5kOiBcImNvbXB1dGVkXCIgfCBcImxpbmtcIiB9XG4+XG5cbmNvbnN0IGdldENvbnZlcmdlV3JpdGVyRGVwcyA9IChlbnRyeTogQ29udmVyZ2VXcml0ZXIpOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBpZiAoZW50cnkua2luZCA9PT0gXCJjb21wdXRlZFwiKSB7XG4gICAgcmV0dXJuICgoZW50cnkubWV0YSBhcyBhbnkpPy5kZXBzID8/IFtdKSBhcyBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgfVxuICByZXR1cm4gW2VudHJ5Lm1ldGEuZnJvbSBhcyBzdHJpbmddXG59XG5cbmNvbnN0IGNvbXB1dGVDb252ZXJnZVRvcG9PcmRlciA9IChcbiAgd3JpdGVyczogUmVhZG9ubHlBcnJheTxDb252ZXJnZVdyaXRlcj4sXG4pOiB7IHJlYWRvbmx5IG9yZGVyOiBSZWFkb25seUFycmF5PHN0cmluZz47IHJlYWRvbmx5IGNvbmZpZ0Vycm9yPzogQ29udmVyZ2VTdGF0aWNJclJlZ2lzdHJ5W1wiY29uZmlnRXJyb3JcIl0gfSA9PiB7XG4gIGNvbnN0IHdyaXRlckJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBDb252ZXJnZVdyaXRlcj4oKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHdyaXRlcnMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHdyaXRlckJ5UGF0aC5nZXQoZW50cnkuZmllbGRQYXRoKVxuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3JkZXI6IFtdLFxuICAgICAgICBjb25maWdFcnJvcjoge1xuICAgICAgICAgIGNvZGU6IFwiTVVMVElQTEVfV1JJVEVSU1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBbU3RhdGVUcmFpdC5jb252ZXJnZV0gTXVsdGlwbGUgd3JpdGVycyBmb3IgZmllbGQgXCIke2VudHJ5LmZpZWxkUGF0aH1cIiAoJHtleGlzdGluZy5raW5kfSArICR7ZW50cnkua2luZH0pLmAsXG4gICAgICAgICAgZmllbGRzOiBbZW50cnkuZmllbGRQYXRoXSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgd3JpdGVyQnlQYXRoLnNldChlbnRyeS5maWVsZFBhdGgsIGVudHJ5KVxuICB9XG5cbiAgY29uc3Qgbm9kZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHdyaXRlcnMpIHtcbiAgICBub2Rlcy5hZGQoZW50cnkuZmllbGRQYXRoKVxuICB9XG5cbiAgY29uc3QgaW5kZWdyZWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpXG4gIGNvbnN0IGZvcndhcmQgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8c3RyaW5nPj4oKVxuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgIGluZGVncmVlLnNldChub2RlLCAwKVxuICAgIGZvcndhcmQuc2V0KG5vZGUsIFtdKVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiB3cml0ZXJzKSB7XG4gICAgY29uc3QgdG8gPSBlbnRyeS5maWVsZFBhdGhcbiAgICBjb25zdCBkZXBzID0gZ2V0Q29udmVyZ2VXcml0ZXJEZXBzKGVudHJ5KVxuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgIGlmICghbm9kZXMuaGFzKGRlcCkpIGNvbnRpbnVlXG4gICAgICBmb3J3YXJkLmdldChkZXApIS5wdXNoKHRvKVxuICAgICAgaW5kZWdyZWUuc2V0KHRvLCAoaW5kZWdyZWUuZ2V0KHRvKSA/PyAwKSArIDEpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcXVldWU6IEFycmF5PHN0cmluZz4gPSBbXVxuICBmb3IgKGNvbnN0IFtub2RlLCBkZWddIG9mIGluZGVncmVlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZWcgPT09IDApIHF1ZXVlLnB1c2gobm9kZSlcbiAgfVxuXG4gIGNvbnN0IG9yZGVyOiBBcnJheTxzdHJpbmc+ID0gW11cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IG4gPSBxdWV1ZS5zaGlmdCgpIVxuICAgIG9yZGVyLnB1c2gobilcbiAgICBjb25zdCBvdXRzID0gZm9yd2FyZC5nZXQobikhXG4gICAgZm9yIChjb25zdCB0byBvZiBvdXRzKSB7XG4gICAgICBjb25zdCBuZXh0ID0gKGluZGVncmVlLmdldCh0bykgPz8gMCkgLSAxXG4gICAgICBpbmRlZ3JlZS5zZXQodG8sIG5leHQpXG4gICAgICBpZiAobmV4dCA9PT0gMCkgcXVldWUucHVzaCh0bylcbiAgICB9XG4gIH1cblxuICBpZiAob3JkZXIubGVuZ3RoICE9PSBub2Rlcy5zaXplKSB7XG4gICAgY29uc3QgcmVtYWluaW5nID0gQXJyYXkuZnJvbShub2RlcykuZmlsdGVyKChuKSA9PiAhb3JkZXIuaW5jbHVkZXMobikpXG4gICAgcmV0dXJuIHtcbiAgICAgIG9yZGVyOiBbXSxcbiAgICAgIGNvbmZpZ0Vycm9yOiB7XG4gICAgICAgIGNvZGU6IFwiQ1lDTEVfREVURUNURURcIixcbiAgICAgICAgbWVzc2FnZTogYFtTdGF0ZVRyYWl0LmNvbnZlcmdlXSBDeWNsZSBkZXRlY3RlZCBpbiBjb21wdXRlZC9saW5rIGdyYXBoOiAke3JlbWFpbmluZy5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgZmllbGRzOiByZW1haW5pbmcsXG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IG9yZGVyIH1cbn1cblxuY29uc3QgYnVpbGRDb252ZXJnZUlyID0gKFxuICBlbnRyaWVzOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4+LFxuKTogQ29udmVyZ2VTdGF0aWNJclJlZ2lzdHJ5ID0+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gbm93UGVyZigpXG4gIGNvbnN0IGdlbmVyYXRpb24gPSAwXG5cbiAgY29uc3Qgd3JpdGVycyA9IGVudHJpZXMuZmlsdGVyKFxuICAgIChlKTogZSBpcyBDb252ZXJnZVdyaXRlciA9PiBlLmtpbmQgPT09IFwiY29tcHV0ZWRcIiB8fCBlLmtpbmQgPT09IFwibGlua1wiLFxuICApXG5cbiAgY29uc3Qgd3JpdGVyc0tleSA9IHdyaXRlcnNcbiAgICAubWFwKChlbnRyeSkgPT4gYCR7ZW50cnkua2luZH06JHtlbnRyeS5maWVsZFBhdGh9YClcbiAgICAuc29ydCgpXG4gICAgLmpvaW4oXCJ8XCIpXG5cbiAgY29uc3QgZGVwc0tleSA9IHdyaXRlcnNcbiAgICAubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgZGVwcyA9IGdldENvbnZlcmdlV3JpdGVyRGVwcyhlbnRyeSkuc2xpY2UoKS5zb3J0KCkuam9pbihcIixcIilcbiAgICAgIHJldHVybiBgJHtlbnRyeS5raW5kfToke2VudHJ5LmZpZWxkUGF0aH09PiR7ZGVwc31gXG4gICAgfSlcbiAgICAuc29ydCgpXG4gICAgLmpvaW4oXCJ8XCIpXG5cbiAgY29uc3Qgd3JpdGVyQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIENvbnZlcmdlV3JpdGVyPigpXG4gIGZvciAoY29uc3QgZW50cnkgb2Ygd3JpdGVycykge1xuICAgIHdyaXRlckJ5UGF0aC5zZXQoZW50cnkuZmllbGRQYXRoLCBlbnRyeSlcbiAgfVxuXG4gIGNvbnN0IHRvcG8gPSB3cml0ZXJzLmxlbmd0aCA+IDAgPyBjb21wdXRlQ29udmVyZ2VUb3BvT3JkZXIod3JpdGVycykgOiB7IG9yZGVyOiBbXSBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfVxuICBjb25zdCBzdGVwc0J5SWQ6IEFycmF5PENvbnZlcmdlV3JpdGVyPiA9IHRvcG8uY29uZmlnRXJyb3JcbiAgICA/IFtdXG4gICAgOiB0b3BvLm9yZGVyLm1hcCgocGF0aCkgPT4gd3JpdGVyQnlQYXRoLmdldChwYXRoKSEpXG5cbiAgY29uc3QgZmllbGRQYXRoVGFibGUgPSBuZXcgTWFwPHN0cmluZywgRmllbGRQYXRoPigpXG4gIGNvbnN0IGFkZFBhdGggPSAocGF0aDogRmllbGRQYXRoKTogdm9pZCA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJlZml4ID0gcGF0aC5zbGljZSgwLCBpKVxuICAgICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkocHJlZml4KVxuICAgICAgaWYgKCFmaWVsZFBhdGhUYWJsZS5oYXMoa2V5KSkgZmllbGRQYXRoVGFibGUuc2V0KGtleSwgcHJlZml4KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2Ygd3JpdGVycykge1xuICAgIGNvbnN0IG91dCA9IG5vcm1hbGl6ZUZpZWxkUGF0aChlbnRyeS5maWVsZFBhdGgpXG4gICAgaWYgKG91dCkgYWRkUGF0aChvdXQpXG4gICAgZm9yIChjb25zdCBkZXAgb2YgZ2V0Q29udmVyZ2VXcml0ZXJEZXBzKGVudHJ5KSkge1xuICAgICAgY29uc3QgZGVwUGF0aCA9IG5vcm1hbGl6ZUZpZWxkUGF0aChkZXApXG4gICAgICBpZiAoZGVwUGF0aCkgYWRkUGF0aChkZXBQYXRoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpZWxkUGF0aHMgPSBBcnJheS5mcm9tKGZpZWxkUGF0aFRhYmxlLnZhbHVlcygpKS5zb3J0KGNvbXBhcmVGaWVsZFBhdGgpXG4gIGNvbnN0IGZpZWxkUGF0aElkUmVnaXN0cnkgPSBtYWtlRmllbGRQYXRoSWRSZWdpc3RyeShmaWVsZFBhdGhzKVxuXG4gIGNvbnN0IHN0ZXBPdXRGaWVsZFBhdGhJZEJ5U3RlcElkOiBBcnJheTxGaWVsZFBhdGhJZD4gPSBbXVxuICBjb25zdCBzdGVwRGVwc0ZpZWxkUGF0aElkc0J5U3RlcElkOiBBcnJheTxSZWFkb25seUFycmF5PEZpZWxkUGF0aElkPj4gPSBbXVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2Ygc3RlcHNCeUlkKSB7XG4gICAgY29uc3Qgb3V0ID0gbm9ybWFsaXplRmllbGRQYXRoKGVudHJ5LmZpZWxkUGF0aClcbiAgICBjb25zdCBvdXRJZCA9XG4gICAgICBvdXQgIT0gbnVsbCA/IGdldEZpZWxkUGF0aElkKGZpZWxkUGF0aElkUmVnaXN0cnksIG91dCkgOiB1bmRlZmluZWRcbiAgICBpZiAob3V0SWQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgW1N0YXRlVHJhaXQuYnVpbGRdIEZhaWxlZCB0byBtYXAgY29udmVyZ2Ugb3V0cHV0IGZpZWxkUGF0aCBcIiR7ZW50cnkuZmllbGRQYXRofVwiIHRvIEZpZWxkUGF0aElkLmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgZGVwSWRzOiBBcnJheTxGaWVsZFBhdGhJZD4gPSBbXVxuICAgIGZvciAoY29uc3QgZGVwIG9mIGdldENvbnZlcmdlV3JpdGVyRGVwcyhlbnRyeSkpIHtcbiAgICAgIGNvbnN0IGRlcFBhdGggPSBub3JtYWxpemVGaWVsZFBhdGgoZGVwKVxuICAgICAgaWYgKCFkZXBQYXRoKSBjb250aW51ZVxuICAgICAgY29uc3QgZGVwSWQgPSBnZXRGaWVsZFBhdGhJZChmaWVsZFBhdGhJZFJlZ2lzdHJ5LCBkZXBQYXRoKVxuICAgICAgaWYgKGRlcElkICE9IG51bGwpIGRlcElkcy5wdXNoKGRlcElkKVxuICAgIH1cblxuICAgIHN0ZXBPdXRGaWVsZFBhdGhJZEJ5U3RlcElkLnB1c2gob3V0SWQpXG4gICAgc3RlcERlcHNGaWVsZFBhdGhJZHNCeVN0ZXBJZC5wdXNoKGRlcElkcylcbiAgfVxuXG4gIGNvbnN0IHRvcG9PcmRlciA9IHN0ZXBzQnlJZC5tYXAoKF8sIGkpID0+IGkpXG4gIGNvbnN0IGJ1aWxkRHVyYXRpb25NcyA9IE1hdGgubWF4KDAsIG5vd1BlcmYoKSAtIHN0YXJ0ZWRBdClcblxuICByZXR1cm4ge1xuICAgIGdlbmVyYXRpb24sXG4gICAgd3JpdGVyc0tleSxcbiAgICBkZXBzS2V5LFxuICAgIGZpZWxkUGF0aHMsXG4gICAgZmllbGRQYXRoSWRSZWdpc3RyeSxcbiAgICAuLi4odG9wby5jb25maWdFcnJvciA/IHsgY29uZmlnRXJyb3I6IHRvcG8uY29uZmlnRXJyb3IgfSA6IG51bGwpLFxuICAgIHN0ZXBzQnlJZCxcbiAgICBzdGVwT3V0RmllbGRQYXRoSWRCeVN0ZXBJZCxcbiAgICBzdGVwRGVwc0ZpZWxkUGF0aElkc0J5U3RlcElkLFxuICAgIHRvcG9PcmRlcixcbiAgICBidWlsZER1cmF0aW9uTXMsXG4gIH1cbn1cblxuLyoqXG4gKiBcdTY4MzlcdTYzNkUgU3RhdGVUcmFpdEVudHJ5IFx1Njc4NFx1OTAyMFx1NjgwN1x1NTFDNlx1NTMxNlx1NzY4NCBGaWVsZFRyYWl0XHUzMDAyXG4gKlxuICogLSBcdTc2RUVcdTUyNERcdTRFQzVcdTVCRjkgbGluay9zb3VyY2UgXHU1ODZCXHU1MTQ1IGRlcHMgXHU0RkUxXHU2MDZGXHVGRjBDY29tcHV0ZWQgXHU3Njg0XHU0RjlEXHU4RDU2XHU2NjgyXHU0RTBEXHU5NzU5XHU2MDAxXHU1MjA2XHU2NzkwXHVGRjFCXG4gKiAtIFx1NTQwRVx1N0VFRFx1ODJFNVx1NUYxNVx1NTE2NVx1NjYzRVx1NUYwRlx1NEY5RFx1OEQ1Nlx1NThGMFx1NjYwRVx1RkYwQ1x1NTNFRlx1NEVFNVx1NTcyOFx1NkI2NFx1NTkwNFx1NjI2OVx1NUM1NVx1MzAwMlxuICovXG5jb25zdCB0b0ZpZWxkVHJhaXQgPSAoXG4gIGVudHJ5OiBTdGF0ZVRyYWl0RW50cnk8YW55LCBzdHJpbmc+LFxuKTogU3RhdGVUcmFpdEZpZWxkVHJhaXQgPT4ge1xuICBjb25zdCBkZXBzOiBBcnJheTxzdHJpbmc+ID0gW11cblxuICBpZiAoZW50cnkua2luZCA9PT0gXCJjb21wdXRlZFwiKSB7XG4gICAgY29uc3QgbWV0YSA9IGVudHJ5Lm1ldGEgYXMgYW55XG4gICAgY29uc3QgbGlzdCA9IG1ldGEuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgICBpZiAobGlzdCkgZGVwcy5wdXNoKC4uLmxpc3QpXG4gIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gXCJzb3VyY2VcIikge1xuICAgIGNvbnN0IG1ldGEgPSBlbnRyeS5tZXRhIGFzIGFueVxuICAgIGNvbnN0IGxpc3QgPSBtZXRhLmRlcHMgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkXG4gICAgaWYgKGxpc3QpIGRlcHMucHVzaCguLi5saXN0KVxuICB9IGVsc2UgaWYgKGVudHJ5LmtpbmQgPT09IFwibGlua1wiKSB7XG4gICAgZGVwcy5wdXNoKGVudHJ5Lm1ldGEuZnJvbSBhcyBzdHJpbmcpXG4gIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gXCJjaGVja1wiKSB7XG4gICAgY29uc3QgbWV0YSA9IGVudHJ5Lm1ldGEgYXMgYW55XG4gICAgY29uc3QgcnVsZXMgPSAobWV0YT8ucnVsZXMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMocnVsZXMpKSB7XG4gICAgICBjb25zdCBydWxlID0gcnVsZXNbbmFtZV1cbiAgICAgIGlmIChydWxlICYmIHR5cGVvZiBydWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBydWxlLmRlcHMgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkXG4gICAgICAgIGlmIChsaXN0KSBkZXBzLnB1c2goLi4ubGlzdClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZpZWxkSWQ6IGVudHJ5LmZpZWxkUGF0aCxcbiAgICBraW5kOiBlbnRyeS5raW5kLFxuICAgIC8vIG1ldGEgXHU1NzI4XHU4RkQwXHU4ODRDXHU2NUY2XHU0RkREXHU2MzAxXHU0RTBFIEVudHJ5Lm1ldGEgXHU0RTAwXHU4MUY0XHVGRjBDXHU0RkJGXHU0RThFIGluc3RhbGwgXHU3NkY0XHU2M0E1XHU1OTBEXHU3NTI4XHUzMDAyXG4gICAgbWV0YTogZW50cnkubWV0YSBhcyBhbnksXG4gICAgZGVwcyxcbiAgfVxufVxuXG4vKipcbiAqIFx1NEVDRVx1NUY1Mlx1NEUwMFx1NTMxNlx1NzY4NCBFbnRyeSBcdTUyMTdcdTg4NjhcdTY3ODRcdTVFRkEgRmllbGQgLyBOb2RlIC8gRWRnZSAvIFJlc291cmNlIFx1OTZDNlx1NTQwOFx1MzAwMlxuICovXG5jb25zdCBidWlsZEdyYXBoID0gKFxuICBlbnRyaWVzOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4+LFxuICBub2RlTWV0YUJ5RmllbGRQYXRoOiBSZWFkb25seU1hcDxzdHJpbmcsIE1ldGEuVHJhaXRNZXRhPixcbik6IHtcbiAgcmVhZG9ubHkgZ3JhcGg6IFN0YXRlVHJhaXRHcmFwaFxuICByZWFkb25seSBwbGFuOiBTdGF0ZVRyYWl0UGxhblxufSA9PiB7XG4gIGNvbnN0IGZpZWxkTWFwID0gbmV3IE1hcDxzdHJpbmcsIFN0YXRlVHJhaXRGaWVsZD4oKVxuICBjb25zdCBub2RlczogQXJyYXk8U3RhdGVUcmFpdEdyYXBoTm9kZT4gPSBbXVxuICBjb25zdCBlZGdlczogQXJyYXk8U3RhdGVUcmFpdEdyYXBoRWRnZT4gPSBbXVxuICBjb25zdCByZXNvdXJjZXNCeUlkID0gbmV3IE1hcDxzdHJpbmcsIFN0YXRlVHJhaXRSZXNvdXJjZT4oKVxuICBjb25zdCBwbGFuU3RlcHM6IEFycmF5PFN0YXRlVHJhaXRQbGFuU3RlcD4gPSBbXVxuXG4gIGNvbnN0IGVuc3VyZUZpZWxkID0gKGZpZWxkUGF0aDogc3RyaW5nKTogU3RhdGVUcmFpdEZpZWxkID0+IHtcbiAgICBsZXQgZmllbGQgPSBmaWVsZE1hcC5nZXQoZmllbGRQYXRoKVxuICAgIGlmICghZmllbGQpIHtcbiAgICAgIGZpZWxkID0ge1xuICAgICAgICBpZDogZmllbGRQYXRoLFxuICAgICAgICBwYXRoOiBmaWVsZFBhdGgsXG4gICAgICAgIHRyYWl0czogW10sXG4gICAgICB9XG4gICAgICBmaWVsZE1hcC5zZXQoZmllbGRQYXRoLCBmaWVsZClcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkXG4gIH1cblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmaWVsZFBhdGggPSBlbnRyeS5maWVsZFBhdGhcbiAgICBjb25zdCBmaWVsZCA9IGVuc3VyZUZpZWxkKGZpZWxkUGF0aClcbiAgICBjb25zdCB0cmFpdCA9IHRvRmllbGRUcmFpdChlbnRyeSlcblxuICAgIDsoZmllbGQudHJhaXRzIGFzIEFycmF5PFN0YXRlVHJhaXRGaWVsZFRyYWl0PikucHVzaCh0cmFpdClcblxuICAgIC8vIFx1OTQ4OFx1NUJGOVx1NEUwRFx1NTQwQyBraW5kIFx1Njc4NFx1NUVGQSBHcmFwaCBcdThGQjlcdTRFMEUgUGxhbiBcdTZCNjVcdTlBQTRcdTMwMDJcbiAgICBpZiAoZW50cnkua2luZCA9PT0gXCJjb21wdXRlZFwiKSB7XG4gICAgICBjb25zdCBzdGVwSWQgPSBgY29tcHV0ZWQ6JHtmaWVsZFBhdGh9YFxuICAgICAgcGxhblN0ZXBzLnB1c2goe1xuICAgICAgICBpZDogc3RlcElkLFxuICAgICAgICBraW5kOiBcImNvbXB1dGVkLXVwZGF0ZVwiLFxuICAgICAgICB0YXJnZXRGaWVsZFBhdGg6IGZpZWxkUGF0aCxcbiAgICAgICAgLy8gXHU4QkY0XHU2NjBFXHVGRjFBXHU1RjUzXHU1MjREXHU3MjQ4XHU2NzJDXHU0RTBEXHU5NzU5XHU2MDAxXHU1MjA2XHU2NzkwIGNvbXB1dGVkIFx1NEY5RFx1OEQ1Nlx1NUI1N1x1NkJCNVx1RkYwQ3NvdXJjZUZpZWxkUGF0aHMgXHU3NTU5XHU3QTdBXHUzMDAyXG4gICAgICB9KVxuICAgICAgLy8gXHU4MkU1XHU2NjNFXHU1RjBGXHU1OEYwXHU2NjBFIGRlcHNcdUZGMENcdTUyMTlcdTg4NjVcdTUxNDUgR3JhcGggXHU4RkI5XHVGRjA4XHU3NTI4XHU0RThFXHU4QkNBXHU2NUFEL1x1NTNDRFx1NTQxMVx1OTVFRFx1NTMwNVx1OEJBMVx1N0I5N1x1RkYwOVx1MzAwMlxuICAgICAgY29uc3QgZGVwcyA9IChlbnRyeS5tZXRhIGFzIGFueSkuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgICAgIGlmIChkZXBzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgICBlbnN1cmVGaWVsZChkZXApXG4gICAgICAgICAgZWRnZXMucHVzaCh7XG4gICAgICAgICAgICBpZDogYGNvbXB1dGVkOiR7ZGVwfS0+JHtmaWVsZFBhdGh9YCxcbiAgICAgICAgICAgIGZyb206IGRlcCxcbiAgICAgICAgICAgIHRvOiBmaWVsZFBhdGgsXG4gICAgICAgICAgICBraW5kOiBcImNvbXB1dGVkXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gXCJsaW5rXCIpIHtcbiAgICAgIGNvbnN0IGZyb20gPSBlbnRyeS5tZXRhLmZyb20gYXMgc3RyaW5nXG4gICAgICBlbnN1cmVGaWVsZChmcm9tKVxuXG4gICAgICBjb25zdCBlZGdlSWQgPSBgbGluazoke2Zyb219LT4ke2ZpZWxkUGF0aH1gXG4gICAgICBlZGdlcy5wdXNoKHtcbiAgICAgICAgaWQ6IGVkZ2VJZCxcbiAgICAgICAgZnJvbSxcbiAgICAgICAgdG86IGZpZWxkUGF0aCxcbiAgICAgICAga2luZDogXCJsaW5rXCIsXG4gICAgICB9KVxuXG4gICAgICBwbGFuU3RlcHMucHVzaCh7XG4gICAgICAgIGlkOiBgbGluazoke2ZpZWxkUGF0aH1gLFxuICAgICAgICBraW5kOiBcImxpbmstcHJvcGFnYXRlXCIsXG4gICAgICAgIHRhcmdldEZpZWxkUGF0aDogZmllbGRQYXRoLFxuICAgICAgICBzb3VyY2VGaWVsZFBhdGhzOiBbZnJvbV0sXG4gICAgICAgIGRlYnVnSW5mbzoge1xuICAgICAgICAgIGdyYXBoRWRnZUlkOiBlZGdlSWQsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gXCJzb3VyY2VcIikge1xuICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IGVudHJ5Lm1ldGEucmVzb3VyY2VcbiAgICAgIGNvbnN0IHJlc291cmNlTWV0YSA9IE1ldGEuc2FuaXRpemUoKGVudHJ5Lm1ldGEgYXMgYW55KS5tZXRhKVxuXG4gICAgICBjb25zdCBleGlzdGluZyA9IHJlc291cmNlc0J5SWQuZ2V0KHJlc291cmNlSWQpXG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgY29uc3Qgb3duZXJGaWVsZHMgPSBbLi4uZXhpc3Rpbmcub3duZXJGaWVsZHMsIGZpZWxkUGF0aF1cbiAgICAgICAgbGV0IG1ldGEgPSBleGlzdGluZy5tZXRhXG4gICAgICAgIGxldCBtZXRhT3JpZ2luID0gZXhpc3RpbmcubWV0YU9yaWdpblxuICAgICAgICBsZXQgbWV0YUNvbmZsaWN0cyA9IGV4aXN0aW5nLm1ldGFDb25mbGljdHNcblxuICAgICAgICBpZiAocmVzb3VyY2VNZXRhKSB7XG4gICAgICAgICAgY29uc3QgbWVyZ2VkID0gTWV0YS5tZXJnZUNhbm9uaWNhbChcbiAgICAgICAgICAgIHsgbWV0YSwgb3JpZ2luOiBtZXRhT3JpZ2luLCBjb25mbGljdHM6IG1ldGFDb25mbGljdHMgfSxcbiAgICAgICAgICAgIHsgb3JpZ2luOiBmaWVsZFBhdGgsIG1ldGE6IHJlc291cmNlTWV0YSB9LFxuICAgICAgICAgIClcbiAgICAgICAgICBtZXRhID0gbWVyZ2VkLm1ldGFcbiAgICAgICAgICBtZXRhT3JpZ2luID0gbWVyZ2VkLm9yaWdpblxuICAgICAgICAgIG1ldGFDb25mbGljdHMgPSBtZXJnZWQuY29uZmxpY3RzXG4gICAgICAgIH1cblxuICAgICAgICByZXNvdXJjZXNCeUlkLnNldChyZXNvdXJjZUlkLCB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgb3duZXJGaWVsZHMsXG4gICAgICAgICAgbWV0YSxcbiAgICAgICAgICBtZXRhT3JpZ2luLFxuICAgICAgICAgIG1ldGFDb25mbGljdHMsXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvdXJjZXNCeUlkLnNldChyZXNvdXJjZUlkLCB7XG4gICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAvLyBcdTY2ODJcdTY1RjZcdTRGN0ZcdTc1MjhcdTdCODBcdTUzNTVcdTc2ODRcdTY4MDdcdThCQzZcdTVCNTdcdTdCMjZcdTRFMzJcdUZGMENcdTU0MEVcdTdFRURcdTUzRUZcdTY4MzlcdTYzNkUga2V5IFx1ODlDNFx1NTIxOVx1OEZEQlx1NEUwMFx1NkI2NVx1N0VEM1x1Njc4NFx1NTMxNlx1MzAwMlxuICAgICAgICAgIGtleVNlbGVjdG9yOiBgU3RhdGVUcmFpdC5zb3VyY2VAJHtmaWVsZFBhdGh9YCxcbiAgICAgICAgICBvd25lckZpZWxkczogW2ZpZWxkUGF0aF0sXG4gICAgICAgICAgbWV0YTogcmVzb3VyY2VNZXRhLFxuICAgICAgICAgIG1ldGFPcmlnaW46IHJlc291cmNlTWV0YSA/IGZpZWxkUGF0aCA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgcGxhblN0ZXBzLnB1c2goe1xuICAgICAgICBpZDogYHNvdXJjZToke2ZpZWxkUGF0aH1gLFxuICAgICAgICBraW5kOiBcInNvdXJjZS1yZWZyZXNoXCIsXG4gICAgICAgIHRhcmdldEZpZWxkUGF0aDogZmllbGRQYXRoLFxuICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICBrZXlTZWxlY3RvcklkOiBgU3RhdGVUcmFpdC5zb3VyY2VAJHtmaWVsZFBhdGh9YCxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGRlcHMgPSAoZW50cnkubWV0YSBhcyBhbnkpLmRlcHMgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZGVwcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBkZXBzKSB7XG4gICAgICAgICAgZW5zdXJlRmllbGQoZGVwKVxuICAgICAgICAgIGVkZ2VzLnB1c2goe1xuICAgICAgICAgICAgaWQ6IGBzb3VyY2UtZGVwOiR7ZGVwfS0+JHtmaWVsZFBhdGh9YCxcbiAgICAgICAgICAgIGZyb206IGRlcCxcbiAgICAgICAgICAgIHRvOiBmaWVsZFBhdGgsXG4gICAgICAgICAgICBraW5kOiBcInNvdXJjZS1kZXBcIixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbnRyeS5raW5kID09PSBcImNoZWNrXCIpIHtcbiAgICAgIHBsYW5TdGVwcy5wdXNoKHtcbiAgICAgICAgaWQ6IGBjaGVjazoke2ZpZWxkUGF0aH1gLFxuICAgICAgICBraW5kOiBcImNoZWNrLXZhbGlkYXRlXCIsXG4gICAgICAgIHRhcmdldEZpZWxkUGF0aDogZmllbGRQYXRoLFxuICAgICAgfSlcblxuICAgICAgLy8gXHU4MkU1XHU4OUM0XHU1MjE5XHU2NjNFXHU1RjBGXHU1OEYwXHU2NjBFIGRlcHNcdUZGMENcdTUyMTlcdTg4NjVcdTUxNDUgR3JhcGggXHU4RkI5XHVGRjA4XHU3NTI4XHU0RThFIFJldmVyc2VDbG9zdXJlIHNjb3BlZCB2YWxpZGF0ZVx1RkYwOVx1MzAwMlxuICAgICAgaWYgKHRyYWl0LmRlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiB0cmFpdC5kZXBzKSB7XG4gICAgICAgICAgZW5zdXJlRmllbGQoZGVwKVxuICAgICAgICAgIGVkZ2VzLnB1c2goe1xuICAgICAgICAgICAgaWQ6IGBjaGVjay1kZXA6JHtkZXB9LT4ke2ZpZWxkUGF0aH1gLFxuICAgICAgICAgICAgZnJvbTogZGVwLFxuICAgICAgICAgICAgdG86IGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtpbmQ6IFwiY2hlY2stZGVwXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRNYXAudmFsdWVzKCkpIHtcbiAgICBub2Rlcy5wdXNoKHtcbiAgICAgIGlkOiBmaWVsZC5pZCxcbiAgICAgIGZpZWxkLFxuICAgICAgdHJhaXRzOiBmaWVsZC50cmFpdHMsXG4gICAgICBtZXRhOiBub2RlTWV0YUJ5RmllbGRQYXRoLmdldChmaWVsZC5pZCksXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGdyYXBoOiBTdGF0ZVRyYWl0R3JhcGggPSB7XG4gICAgX3RhZzogXCJTdGF0ZVRyYWl0R3JhcGhcIixcbiAgICBub2RlcyxcbiAgICBlZGdlcyxcbiAgICByZXNvdXJjZXM6IEFycmF5LmZyb20ocmVzb3VyY2VzQnlJZC52YWx1ZXMoKSksXG4gIH1cblxuICBjb25zdCBwbGFuOiBTdGF0ZVRyYWl0UGxhbiA9IHtcbiAgICBfdGFnOiBcIlN0YXRlVHJhaXRQbGFuXCIsXG4gICAgc3RlcHM6IHBsYW5TdGVwcyxcbiAgfVxuXG4gIHJldHVybiB7IGdyYXBoLCBwbGFuIH1cbn1cblxuLyoqXG4gKiBcdTk0ODhcdTVCRjkgbGluayBcdThGQjlcdThGREJcdTg4NENcdTdCODBcdTUzNTVcdTc2ODRcdTczQUZcdThERUZcdTY4QzBcdTZENEJcdTMwMDJcbiAqXG4gKiAtIFx1NEVDNVx1ODAwM1x1ODY1MSBraW5kID0gXCJsaW5rXCIgXHU3Njg0XHU4RkI5XHVGRjBDY29tcHV0ZWQvc291cmNlIFx1OTk5Nlx1NzI0OFx1NEUwRFx1NTNDMlx1NEUwRVx1NzNBRlx1NjhDMFx1NkQ0Qlx1RkYxQlxuICogLSBcdTgyRTVcdTUzRDFcdTczQjBcdTczQUZcdThERUZcdUZGMENcdTYyOUJcdTUxRkFcdTVFMjZcdTY3MDlcdThERUZcdTVGODRcdTRGRTFcdTYwNkZcdTc2ODRcdTk1MTlcdThCRUZcdUZGMENcdTkwN0ZcdTUxNERcdTU3MjhcdThGRDBcdTg4NENcdTY1RjZcdThGREJcdTUxNjVcdTY1RTBcdTk2NTBcdTY2RjRcdTY1QjBcdTMwMDJcbiAqL1xuY29uc3QgYXNzZXJ0Tm9MaW5rQ3ljbGVzID0gKGVkZ2VzOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRHcmFwaEVkZ2U+KTogdm9pZCA9PiB7XG4gIGNvbnN0IGFkamFjZW5jeSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKVxuXG4gIGZvciAoY29uc3QgZWRnZSBvZiBlZGdlcykge1xuICAgIGlmIChlZGdlLmtpbmQgIT09IFwibGlua1wiKSBjb250aW51ZVxuICAgIGNvbnN0IGxpc3QgPSBhZGphY2VuY3kuZ2V0KGVkZ2UuZnJvbSkgPz8gW11cbiAgICBsaXN0LnB1c2goZWRnZS50bylcbiAgICBhZGphY2VuY3kuc2V0KGVkZ2UuZnJvbSwgbGlzdClcbiAgfVxuXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBjb25zdCBzdGFjayA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgY29uc3QgZGZzID0gKG5vZGU6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChzdGFjay5oYXMobm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtTdGF0ZVRyYWl0LmJ1aWxkXSBsaW5rIGN5Y2xlIGRldGVjdGVkIGF0IGZpZWxkIFwiJHtub2RlfVwiLiBgICtcbiAgICAgICAgICBcIlBsZWFzZSBjaGVjayBsaW5rIHRyYWl0cyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlwiLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAodmlzaXRlZC5oYXMobm9kZSkpIHJldHVyblxuICAgIHZpc2l0ZWQuYWRkKG5vZGUpXG4gICAgc3RhY2suYWRkKG5vZGUpXG5cbiAgICBjb25zdCBuZXh0cyA9IGFkamFjZW5jeS5nZXQobm9kZSlcbiAgICBpZiAobmV4dHMpIHtcbiAgICAgIGZvciAoY29uc3QgdG8gb2YgbmV4dHMpIHtcbiAgICAgICAgZGZzKHRvKVxuICAgICAgfVxuICAgIH1cblxuICAgIHN0YWNrLmRlbGV0ZShub2RlKVxuICB9XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIGFkamFjZW5jeS5rZXlzKCkpIHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG5vZGUpKSB7XG4gICAgICBkZnMobm9kZSlcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgY29sbGVjdFNjaGVtYVBhdGhzID0gKFxuICBlbnRyaWVzOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4+LFxuKTogUmVhZG9ubHlBcnJheTxTdGF0ZVRyYWl0U2NoZW1hUGF0aFJlZj4gPT4ge1xuICBjb25zdCBieUtleSA9IG5ldyBNYXA8c3RyaW5nLCBTdGF0ZVRyYWl0U2NoZW1hUGF0aFJlZj4oKVxuXG4gIGNvbnN0IGFkZCA9IChyZWY6IFN0YXRlVHJhaXRTY2hlbWFQYXRoUmVmKTogdm9pZCA9PiB7XG4gICAgaWYgKCFyZWYucGF0aCkgcmV0dXJuXG4gICAgY29uc3QgayA9IGAke3JlZi5raW5kfXwke3JlZi5lbnRyeUtpbmR9fCR7cmVmLmVudHJ5RmllbGRQYXRofXwke3JlZi5ydWxlTmFtZSA/PyBcIlwifXwke3JlZi5wYXRofWBcbiAgICBieUtleS5zZXQoaywgcmVmKVxuICB9XG5cbiAgY29uc3QgZ2V0Q2hlY2tXcml0ZWJhY2tQYXRoID0gKFxuICAgIGVudHJ5OiBFeHRyYWN0PFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4sIHsgcmVhZG9ubHkga2luZDogXCJjaGVja1wiIH0+LFxuICApOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHdiID0gKGVudHJ5Lm1ldGEgYXMgYW55KT8ud3JpdGViYWNrXG4gICAgY29uc3QgcCA9IHdiICYmIHR5cGVvZiB3YiA9PT0gXCJvYmplY3RcIiA/ICh3YiBhcyBhbnkpLnBhdGggOiB1bmRlZmluZWRcbiAgICBjb25zdCB3cml0ZWJhY2tQYXRoID1cbiAgICAgIHR5cGVvZiBwID09PSBcInN0cmluZ1wiICYmIHAuc3RhcnRzV2l0aChcImVycm9ycy5cIikgPyBwIDogdW5kZWZpbmVkXG5cbiAgICBpZiAod3JpdGViYWNrUGF0aCkgcmV0dXJuIHdyaXRlYmFja1BhdGhcblxuICAgIGNvbnN0IGZpZWxkUGF0aCA9IGVudHJ5LmZpZWxkUGF0aFxuICAgIGlmIChmaWVsZFBhdGguZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgcmV0dXJuIGBlcnJvcnMuJHtmaWVsZFBhdGguc2xpY2UoMCwgLTIpfWBcbiAgICB9XG4gICAgcmV0dXJuIGBlcnJvcnMuJHtmaWVsZFBhdGh9YFxuICB9XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgYWRkKHtcbiAgICAgIGtpbmQ6IFwiZmllbGRQYXRoXCIsXG4gICAgICBlbnRyeUtpbmQ6IGVudHJ5LmtpbmQsXG4gICAgICBlbnRyeUZpZWxkUGF0aDogZW50cnkuZmllbGRQYXRoLFxuICAgICAgcGF0aDogZW50cnkuZmllbGRQYXRoLFxuICAgIH0pXG5cbiAgICBpZiAoZW50cnkua2luZCA9PT0gXCJjb21wdXRlZFwiIHx8IGVudHJ5LmtpbmQgPT09IFwic291cmNlXCIpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSAoKGVudHJ5Lm1ldGEgYXMgYW55KT8uZGVwcyA/PyBbXSkgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiBkZXBzKSB7XG4gICAgICAgIGFkZCh7XG4gICAgICAgICAga2luZDogXCJkZXBcIixcbiAgICAgICAgICBlbnRyeUtpbmQ6IGVudHJ5LmtpbmQsXG4gICAgICAgICAgZW50cnlGaWVsZFBhdGg6IGVudHJ5LmZpZWxkUGF0aCxcbiAgICAgICAgICBwYXRoOiBkZXAsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LmtpbmQgPT09IFwibGlua1wiKSB7XG4gICAgICBhZGQoe1xuICAgICAgICBraW5kOiBcImxpbmtfZnJvbVwiLFxuICAgICAgICBlbnRyeUtpbmQ6IFwibGlua1wiLFxuICAgICAgICBlbnRyeUZpZWxkUGF0aDogZW50cnkuZmllbGRQYXRoLFxuICAgICAgICBwYXRoOiBlbnRyeS5tZXRhLmZyb20gYXMgc3RyaW5nLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoZW50cnkua2luZCA9PT0gXCJjaGVja1wiKSB7XG4gICAgICBhZGQoe1xuICAgICAgICBraW5kOiBcImNoZWNrX3dyaXRlYmFja1wiLFxuICAgICAgICBlbnRyeUtpbmQ6IFwiY2hlY2tcIixcbiAgICAgICAgZW50cnlGaWVsZFBhdGg6IGVudHJ5LmZpZWxkUGF0aCxcbiAgICAgICAgcGF0aDogZ2V0Q2hlY2tXcml0ZWJhY2tQYXRoKGVudHJ5KSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHJ1bGVzID0gKChlbnRyeS5tZXRhIGFzIGFueSk/LnJ1bGVzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMocnVsZXMpKSB7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSBydWxlc1tuYW1lXVxuICAgICAgICBpZiAoIXJ1bGUgfHwgdHlwZW9mIHJ1bGUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IGRlcHMgPSAocnVsZS5kZXBzID8/IFtdKSBhcyBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgICAgIGFkZCh7XG4gICAgICAgICAgICBraW5kOiBcImRlcFwiLFxuICAgICAgICAgICAgZW50cnlLaW5kOiBcImNoZWNrXCIsXG4gICAgICAgICAgICBlbnRyeUZpZWxkUGF0aDogZW50cnkuZmllbGRQYXRoLFxuICAgICAgICAgICAgcnVsZU5hbWU6IG5hbWUsXG4gICAgICAgICAgICBwYXRoOiBkZXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKGJ5S2V5LmVudHJpZXMoKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKVxuICAgIC5tYXAoKFssIHZdKSA9PiB2KVxufVxuXG4vKipcbiAqIFx1NjgzOVx1NjM2RVx1N0VEOVx1NUI5QVx1NzY4NCBzdGF0ZVNjaGVtYSBcdTRFMEUgdHJhaXRzIHNwZWMgXHU2Nzg0XHU5MDIwIFN0YXRlVHJhaXRQcm9ncmFtXHUzMDAyXG4gKlxuICogLSBcdTdFQUZcdTUxRkRcdTY1NzBcdUZGMUFcdTRFMERcdTRGOURcdThENTZcdTU5MTZcdTkwRTggRW52IC8gXHU1MTY4XHU1QzQwXHU3MkI2XHU2MDAxXHVGRjFCXG4gKiAtIFx1NUY1M1x1NTI0RFx1NUI5RVx1NzNCMFx1ODA1QVx1NzEyNlx1NEU4RVx1RkYxQVxuICogICAtIFx1NEVDRSBTcGVjIFx1NUY1Mlx1NEUwMFx1NTMxNlx1NTFGQSBFbnRyeSBcdTUyMTdcdTg4NjhcdUZGMUJcbiAqICAgLSBcdTU3RkFcdTRFOEUgRW50cnkgXHU2Nzg0XHU1RUZBXHU4RjdCXHU5MUNGXHU3MjQ4IEdyYXBoIC8gUGxhblx1RkYxQlxuICogICAtIFx1NUJGOSBsaW5rIFx1OEZCOVx1NTA1QVx1NTdGQVx1NjcyQ1x1NzNBRlx1OERFRlx1NjhDMFx1NkQ0Qlx1MzAwMlxuICpcbiAqIFx1NTQwRVx1N0VFRFx1ODJFNVx1OTcwMFx1ODk4MVx1NjZGNFx1N0NCRVx1N0VDNlx1NzY4NFx1NEY5RFx1OEQ1Nlx1NTIwNlx1Njc5MFx1RkYwOFx1NEY4Qlx1NTk4Mlx1NUJGOSBjb21wdXRlZC9rZXkgXHU1MDVBXHU5NzU5XHU2MDAxXHU4OUUzXHU2NzkwXHVGRjA5XHVGRjBDXG4gKiBcdTUzRUZcdTRFRTVcdTU3MjhcdTY3MkNcdTZBMjFcdTU3NTdcdTUxODVcdTZGMTRcdThGREJcdTVCOUVcdTczQjBcdUZGMENcdTgwMENcdTRFMERcdTVGNzFcdTU0Q0RcdTVCRjlcdTU5MTYgQVBJXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZCA9IDxTIGV4dGVuZHMgb2JqZWN0PihcbiAgc3RhdGVTY2hlbWE6IFNjaGVtYS5TY2hlbWE8UywgYW55PixcbiAgc3BlYzogU3RhdGVUcmFpdFNwZWM8Uz4sXG4pOiBTdGF0ZVRyYWl0UHJvZ3JhbTxTPiA9PiB7XG4gIGNvbnN0IGVudHJpZXMgPSBub3JtYWxpemVTcGVjKHNwZWMpIGFzIFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEVudHJ5PFMsIHN0cmluZz4+XG4gIGNvbnN0IG5vZGVNZXRhQnlGaWVsZFBhdGggPSBjb2xsZWN0Tm9kZU1ldGEoc3BlYylcblxuICAvLyBQaGFzZSA0XHVGRjA4VVMyXHVGRjA5XHVGRjFBXHU1RjNBXHU1MjM2XHU2NjNFXHU1RjBGIGRlcHNcdUZGMDhHcmFwaC9kaWFnbm9zdGljcy9yZXBsYXkgXHU1M0VBXHU4QkE0IGRlcHMgXHU0RjVDXHU0RTNBXHU0RjlEXHU4RDU2XHU0RThCXHU1QjlFXHU2RTkwXHVGRjA5XHUzMDAyXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmIChlbnRyeS5raW5kID09PSBcImNvbXB1dGVkXCIpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSAoZW50cnkubWV0YSBhcyBhbnkpLmRlcHMgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZGVwcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgW1N0YXRlVHJhaXQuYnVpbGRdIE1pc3NpbmcgZXhwbGljaXQgZGVwcyBmb3IgY29tcHV0ZWQgXCIke2VudHJ5LmZpZWxkUGF0aH1cIi4gYCArXG4gICAgICAgICAgICBcIlBsZWFzZSB1c2UgU3RhdGVUcmFpdC5jb21wdXRlZCh7IGRlcHM6IFsuLi5dLCBnZXQ6IC4uLiB9KS5cIixcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW50cnkua2luZCA9PT0gXCJzb3VyY2VcIikge1xuICAgICAgY29uc3QgZGVwcyA9IChlbnRyeS5tZXRhIGFzIGFueSkuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgICAgIGlmIChkZXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBbU3RhdGVUcmFpdC5idWlsZF0gTWlzc2luZyBleHBsaWNpdCBkZXBzIGZvciBzb3VyY2UgXCIke2VudHJ5LmZpZWxkUGF0aH1cIi4gYCArXG4gICAgICAgICAgICBcIlBsZWFzZSBwcm92aWRlIG1ldGEuZGVwcyBmb3IgU3RhdGVUcmFpdC5zb3VyY2UoeyBkZXBzOiBbLi4uXSwgLi4uIH0pLlwiLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnRyeS5raW5kID09PSBcImNoZWNrXCIpIHtcbiAgICAgIGNvbnN0IHJ1bGVzID0gKChlbnRyeS5tZXRhIGFzIGFueSk/LnJ1bGVzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMocnVsZXMpKSB7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSBydWxlc1tuYW1lXVxuICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT09IFwiZnVuY3Rpb25cIiB8fCAhcnVsZSB8fCB0eXBlb2YgcnVsZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbU3RhdGVUcmFpdC5idWlsZF0gTWlzc2luZyBleHBsaWNpdCBkZXBzIGZvciBjaGVjayBcIiR7ZW50cnkuZmllbGRQYXRofVwiIHJ1bGUgXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICBcIlBsZWFzZSB1c2UgeyBkZXBzOiBbLi4uXSwgdmFsaWRhdGU6IC4uLiB9IGZvcm0uXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmICgocnVsZSBhcyBhbnkpLmRlcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbU3RhdGVUcmFpdC5idWlsZF0gTWlzc2luZyBleHBsaWNpdCBkZXBzIGZvciBjaGVjayBcIiR7ZW50cnkuZmllbGRQYXRofVwiIHJ1bGUgXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICBcIlBsZWFzZSBwcm92aWRlIGRlcHM6IFsuLi5dLlwiLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHsgZ3JhcGgsIHBsYW4gfSA9IGJ1aWxkR3JhcGgoZW50cmllcywgbm9kZU1ldGFCeUZpZWxkUGF0aClcblxuICAvLyBcdTk0ODhcdTVCRjkgbGluayBcdThGQjlcdThGREJcdTg4NENcdTRFMDBcdTZCMjFcdTczQUZcdThERUZcdTY4QzBcdTZENEJcdUZGMENcdTkwN0ZcdTUxNERcdTY2MEVcdTY2M0VcdTc2ODRcdTkxNERcdTdGNkVcdTk1MTlcdThCRUZcdTMwMDJcbiAgYXNzZXJ0Tm9MaW5rQ3ljbGVzKGdyYXBoLmVkZ2VzKVxuXG4gIHJldHVybiB7XG4gICAgc3RhdGVTY2hlbWEsXG4gICAgc3BlYyxcbiAgICBlbnRyaWVzOiBlbnRyaWVzIGFzIFJlYWRvbmx5QXJyYXk8U3RhdGVUcmFpdEVudHJ5PGFueSwgc3RyaW5nPj4sXG4gICAgZ3JhcGgsXG4gICAgcGxhbixcbiAgICBjb252ZXJnZUlyOiBidWlsZENvbnZlcmdlSXIoZW50cmllcyBhcyBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRFbnRyeTxhbnksIHN0cmluZz4+KSxcbiAgICBzY2hlbWFQYXRoczogY29sbGVjdFNjaGVtYVBhdGhzKGVudHJpZXMgYXMgUmVhZG9ubHlBcnJheTxTdGF0ZVRyYWl0RW50cnk8YW55LCBzdHJpbmc+PiksXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB0eXBlIHsgQm91bmRBcGkgfSBmcm9tIFwiLi4vcnVudGltZS9jb3JlL21vZHVsZS5qc1wiXG5pbXBvcnQgeyBnZXRCb3VuZEludGVybmFscyB9IGZyb20gXCIuLi9ydW50aW1lL2NvcmUvcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzXCJcbmltcG9ydCAqIGFzIFNvdXJjZVJ1bnRpbWUgZnJvbSBcIi4vc291cmNlLmpzXCJcbmltcG9ydCB0eXBlIHtcbiAgU3RhdGVUcmFpdFByb2dyYW0sXG4gIFN0YXRlVHJhaXRQbGFuU3RlcCxcbiAgU3RhdGVUcmFpdEVudHJ5LFxuICBUcmFpdENvbnZlcmdlR2VuZXJhdGlvbkJ1bXBSZWFzb24sXG59IGZyb20gXCIuL21vZGVsLmpzXCJcblxuY29uc3QgYnVpbGRFbnRyeUluZGV4ID0gPFM+KFxuICBlbnRyaWVzOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRFbnRyeTxTLCBzdHJpbmc+Pixcbik6IE1hcDxzdHJpbmcsIEFycmF5PFN0YXRlVHJhaXRFbnRyeTxTLCBzdHJpbmc+Pj4gPT4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxTdGF0ZVRyYWl0RW50cnk8Uywgc3RyaW5nPj4+KClcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbGlzdCA9IGluZGV4LmdldChlbnRyeS5maWVsZFBhdGgpID8/IFtdXG4gICAgbGlzdC5wdXNoKGVudHJ5KVxuICAgIGluZGV4LnNldChlbnRyeS5maWVsZFBhdGgsIGxpc3QpXG4gIH1cbiAgcmV0dXJuIGluZGV4XG59XG5cbi8qKlxuICogXHU1NzI4XHU3RUQ5XHU1QjlBIEJvdW5kIEFQSSBcdTRFMEFcdTVCODlcdTg4QzUgU3RhdGVUcmFpdFByb2dyYW0gXHU2M0NGXHU4RkYwXHU3Njg0XHU4ODRDXHU0RTNBXHUzMDAyXG4gKlxuICogLSBQaGFzZSAyIFx1NjcwMFx1NUMwRlx1NUI5RVx1NzNCMFx1RkYxQVxuICogICAtIFx1NEUzQSBjb21wdXRlZCBcdTVCNTdcdTZCQjVcdTZDRThcdTUxOEMgd2F0Y2hlclx1RkYxQVx1NUY1MyBTdGF0ZSBcdTUzRDhcdTUzMTZcdTY1RjZcdTkxQ0RcdTdCOTdcdTc2RUVcdTY4MDdcdTVCNTdcdTZCQjVcdUZGMUJcbiAqICAgLSBcdTRFM0EgbGluayBcdTVCNTdcdTZCQjVcdTZDRThcdTUxOEMgd2F0Y2hlclx1RkYxQVx1NUY1M1x1NkU5MFx1NUI1N1x1NkJCNVx1NTNEOFx1NTMxNlx1NjVGNlx1NTQwQ1x1NkI2NVx1NzZFRVx1NjgwN1x1NUI1N1x1NkJCNVx1RkYxQlxuICogICAtIFx1NEUzQSBzb3VyY2UgXHU1QjU3XHU2QkI1XHU5ODg0XHU3NTU5XHU1MjM3XHU2NUIwXHU1MTY1XHU1M0UzXHVGRjA4XHU2NjgyXHU0RTBEXHU4OUU2XHU1M0QxXHU1OTE2XHU5MEU4XHU4QzAzXHU3NTI4XHVGRjA5XHUzMDAyXG4gKlxuICogXHU4QkY0XHU2NjBFXHVGRjFBXG4gKiAtIFx1NjI0MFx1NjcwOSB3YXRjaGVyIFx1OTBGRFx1OTAxQVx1OEZDNyBCb3VuZCBBUEkgYCRgIFx1NUI4OVx1ODhDNVx1RkYwQ1x1NEUwRFx1NzZGNFx1NjNBNVx1NEY5RFx1OEQ1NiBNb2R1bGVSdW50aW1lXHVGRjFCXG4gKiAtIFx1NkJDRlx1NEUyQSBQbGFuU3RlcCBcdTVCRjlcdTVFOTRcdTRFMDBcdTRFMkFcdTk1N0ZcdTc1MUZcdTU0N0RcdTU0NjhcdTY3MUYgRWZmZWN0XHVGRjBDXHU5MDFBXHU4RkM3IGZvcmtTY29wZWQgXHU2MzAyXHU4RjdEXHU1MjMwIFJ1bnRpbWUgU2NvcGVcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbGwgPSA8Uz4oXG4gIGJvdW5kOiBCb3VuZEFwaTxhbnksIGFueT4sXG4gIHByb2dyYW06IFN0YXRlVHJhaXRQcm9ncmFtPFM+LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PiB7XG4gIC8vIFx1NEYxOFx1NTE0OFx1NUMwNiBQcm9ncmFtIFx1NkNFOFx1NTE4Q1x1NTIzMCBSdW50aW1lXHVGRjA4XHU2NTM2XHU2NTVCXHU1RjE1XHU2NENFXHU1NzI4XHU0RThCXHU1MkExXHU2M0QwXHU0RUE0XHU1MjREXHU3RURGXHU0RTAwXHU2MjY3XHU4ODRDIGNvbXB1dGVkL2xpbmsvY2hlY2tcdUZGMDlcdTMwMDJcbiAgdHJ5IHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscyhib3VuZCBhcyBhbnkpXG4gICAgOyhpbnRlcm5hbHMudHJhaXRzLnJlZ2lzdGVyU3RhdGVUcmFpdFByb2dyYW0gYXMgYW55KShwcm9ncmFtLCB7XG4gICAgICBidW1wUmVhc29uOiBcImxvZ2ljX2luc3RhbGxlZFwiIGFzIFRyYWl0Q29udmVyZ2VHZW5lcmF0aW9uQnVtcFJlYXNvbixcbiAgICB9KVxuICB9IGNhdGNoIHtcbiAgICAvLyBuby1vcCBmb3IgbGVnYWN5L21vY2tlZCBib3VuZFxuICB9XG5cbiAgY29uc3QgZW50cnlJbmRleCA9IGJ1aWxkRW50cnlJbmRleChwcm9ncmFtLmVudHJpZXMgYXMgYW55KVxuXG4gIGNvbnN0IGluc3RhbGxTdGVwID0gKFxuICAgIHN0ZXA6IFN0YXRlVHJhaXRQbGFuU3RlcCxcbiAgKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PiB7XG4gICAgaWYgKCFzdGVwLnRhcmdldEZpZWxkUGF0aCkge1xuICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgfVxuXG4gICAgaWYgKHN0ZXAua2luZCAhPT0gXCJzb3VyY2UtcmVmcmVzaFwiKSB7XG4gICAgICAvLyBjb21wdXRlZC9saW5rL2NoZWNrIFx1NURGMlx1NzUzMSBSdW50aW1lIFx1NTE4NVx1NjgzOFx1NTcyOFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1NTE4NVx1NTkwNFx1NzQwNlx1RkYxQmluc3RhbGwgXHU5NjM2XHU2QkI1XHU0RUM1XHU0RkREXHU3NTU5IHNvdXJjZS5yZWZyZXNoIFx1NTE2NVx1NTNFM1x1MzAwMlxuICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgfVxuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGVudHJ5SW5kZXguZ2V0KHN0ZXAudGFyZ2V0RmllbGRQYXRoKVxuICAgIGlmICghY2FuZGlkYXRlcyB8fCBjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gUGxhbiBcdTRFMkRcdTVGMTVcdTc1MjhcdTRFODZcdTRFMERcdTVCNThcdTU3MjhcdTc2ODQgU3BlY1x1RkYxQVx1ODlDNlx1NEUzQVx1Njc4NFx1NUVGQVx1OTYzNlx1NkJCNVx1NzY4NCBidWdcdUZGMENcdThGRDlcdTkxQ0NcdTc2RjRcdTYzQTVcdTVGRkRcdTc1NjVcdThCRTVcdTZCNjVcdTlBQTRcdTMwMDJcbiAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5ID0gY2FuZGlkYXRlcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwic291cmNlXCIpXG5cbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG5cbiAgICByZXR1cm4gU291cmNlUnVudGltZS5pbnN0YWxsU291cmNlUmVmcmVzaChcbiAgICAgIGJvdW5kLFxuICAgICAgc3RlcCxcbiAgICAgIGVudHJ5IGFzIGFueSxcbiAgICApXG4gIH1cblxuICByZXR1cm4gRWZmZWN0LmZvckVhY2gocHJvZ3JhbS5wbGFuLnN0ZXBzLCAoc3RlcCkgPT4gaW5zdGFsbFN0ZXAoc3RlcCkpLnBpcGUoRWZmZWN0LmFzVm9pZClcbn1cbiIsICIvLyBTdGF0ZVRyYWl0IFx1NTQ3RFx1NTQwRFx1N0E3QVx1OTVGNFx1NkEyMVx1NTc1N1x1RkYwOEBsb2dpeC9jb3JlL1N0YXRlVHJhaXRcdUZGMDlcdUZGMUFcbi8vIC0gXHU2M0QwXHU0RjlCIHRyYWl0cyBzcGVjIFx1NzY4NCBEU0xcdUZGMDhmcm9tL25vZGUvbGlzdC9jb21wdXRlZC9zb3VyY2UvbGlua1x1RkYwOVx1RkYxQlxuLy8gLSBidWlsZFx1RkYxQVx1NUY1Mlx1NEUwMFx1NTMxNiBzcGVjIFx1NUU3Nlx1NzUxRlx1NjIxMCBQcm9ncmFtL0dyYXBoL1BsYW5cdUZGMUJcbi8vIC0gaW5zdGFsbFx1RkYxQVx1NUMwNiBQcm9ncmFtIFx1NUI4OVx1ODhDNVx1NTIzMFx1OEZEMFx1ODg0Q1x1NjVGNlx1RkYwOFx1NkNFOFx1NTE4QyBzb3VyY2UucmVmcmVzaCBcdTdCNDlcdTUxNjVcdTUzRTNcdUZGMENcdTVFNzZcdTU3MjhcdTRFOEJcdTUyQTFcdTdBOTdcdTUzRTNcdTYyNjdcdTg4NEMgY29udmVyZ2UvdmFsaWRhdGVcdUZGMDlcdTMwMDJcblxuaW1wb3J0IHR5cGUgeyBTY2hlbWEgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHR5cGUgeyBCb3VuZEFwaSB9IGZyb20gXCIuL0JvdW5kLmpzXCJcbmltcG9ydCAqIGFzIE1vZGVsIGZyb20gXCIuL2ludGVybmFsL3N0YXRlLXRyYWl0L21vZGVsLmpzXCJcbmltcG9ydCAqIGFzIEZpZWxkUGF0aCBmcm9tIFwiLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9maWVsZC1wYXRoLmpzXCJcbmltcG9ydCAqIGFzIFJvd0lkIGZyb20gXCIuL2ludGVybmFsL3N0YXRlLXRyYWl0L3Jvd2lkLmpzXCJcbmltcG9ydCAqIGFzIEludGVybmFsQnVpbGQgZnJvbSBcIi4vaW50ZXJuYWwvc3RhdGUtdHJhaXQvYnVpbGQuanNcIlxuaW1wb3J0ICogYXMgSW50ZXJuYWxJbnN0YWxsIGZyb20gXCIuL2ludGVybmFsL3N0YXRlLXRyYWl0L2luc3RhbGwuanNcIlxuaW1wb3J0ICogYXMgSW50ZXJuYWxJciBmcm9tIFwiLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9pci5qc1wiXG5cbi8vIFx1NUJGOVx1NTkxNlx1NjZCNFx1OTczMlx1NzY4NFx1NjgzOFx1NUZDM1x1N0M3Qlx1NTc4Qlx1NTIyQlx1NTQwRFx1MzAwMlxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdFNwZWM8Uz4gPSBNb2RlbC5TdGF0ZVRyYWl0U3BlYzxTPlxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdEVudHJ5PFMgPSB1bmtub3duLCBQIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIE1vZGVsLlN0YXRlVHJhaXRFbnRyeTxTLCBQPlxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdFByb2dyYW08Uz4gPSBNb2RlbC5TdGF0ZVRyYWl0UHJvZ3JhbTxTPlxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdEdyYXBoID0gTW9kZWwuU3RhdGVUcmFpdEdyYXBoXG5leHBvcnQgdHlwZSBTdGF0ZVRyYWl0UGxhbiA9IE1vZGVsLlN0YXRlVHJhaXRQbGFuXG5leHBvcnQgdHlwZSBTdGF0ZVRyYWl0Tm9kZTxJbnB1dCA9IHVua25vd24sIEN0eCA9IHVua25vd24+ID0gTW9kZWwuU3RhdGVUcmFpdE5vZGU8SW5wdXQsIEN0eD5cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRMaXN0PEl0ZW0gPSB1bmtub3duPiA9IE1vZGVsLlN0YXRlVHJhaXRMaXN0PEl0ZW0+XG5leHBvcnQgdHlwZSBDaGVja1J1bGU8SW5wdXQgPSB1bmtub3duLCBDdHggPSB1bmtub3duPiA9IE1vZGVsLkNoZWNrUnVsZTxJbnB1dCwgQ3R4PlxuXG5leHBvcnQgdHlwZSBTdGF0ZUZpZWxkUGF0aDxTPiA9IEZpZWxkUGF0aC5TdGF0ZUZpZWxkUGF0aDxTPlxuZXhwb3J0IHR5cGUgU3RhdGVBdFBhdGg8UywgUD4gPSBGaWVsZFBhdGguU3RhdGVBdFBhdGg8UywgUD5cblxuZXhwb3J0IGNvbnN0ICRyb290ID0gXCIkcm9vdFwiIGFzIGNvbnN0XG5cbnR5cGUgRGVwc0FyZ3M8UyBleHRlbmRzIG9iamVjdCwgRGVwcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8U3RhdGVGaWVsZFBhdGg8Uz4+PiA9IHtcbiAgcmVhZG9ubHkgW0sgaW4ga2V5b2YgRGVwc106IFN0YXRlQXRQYXRoPFMsIERlcHNbS10+XG59XG5cbi8qKlxuICogU3RhdGVUcmFpdC5mcm9tXHVGRjFBXG4gKiAtIFx1NjgzOVx1NjM2RSBTdGF0ZSBTY2hlbWEgXHU2NTM2XHU3QTg0XHU1M0VGXHU3NTI4XHU1QjU3XHU2QkI1XHU4REVGXHU1Rjg0XHVGRjBDXHU1RTc2XHU0RTNBIHRyYWl0cyBzcGVjIFx1NjNEMFx1NEY5Qlx1N0M3Qlx1NTc4Qlx1N0VBNlx1Njc1Rlx1RkYxQlxuICogLSBcdThGRDBcdTg4NENcdTY1RjZcdTRFQzVcdThGRDRcdTU2REVcdTUzOUZcdTU5Q0Igc3BlYyBcdTVCRjlcdThDNjFcdUZGMENcdTUxNzdcdTRGNTNcdTVGNTJcdTRFMDBcdTUzMTZcdTc1MzEgaW50ZXJuYWwgXHU1QzQyXHU1OTA0XHU3NDA2XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBmcm9tID0gPFMgZXh0ZW5kcyBvYmplY3QsIEk+KFxuICBfc2NoZW1hOiBTY2hlbWEuU2NoZW1hPFMsIEk+LFxuKSA9PlxuKHNwZWM6IFN0YXRlVHJhaXRTcGVjPFM+KTogU3RhdGVUcmFpdFNwZWM8Uz4gPT5cbiAgc3BlY1xuXG5leHBvcnQgY29uc3Qgbm9kZSA9IDxJbnB1dCA9IHVua25vd24sIEN0eCA9IHVua25vd24+KFxuICBzcGVjOiBPbWl0PE1vZGVsLlN0YXRlVHJhaXROb2RlPElucHV0LCBDdHg+LCBcIl90YWdcIj4sXG4pOiBNb2RlbC5TdGF0ZVRyYWl0Tm9kZTxJbnB1dCwgQ3R4PiA9PiAoe1xuICBfdGFnOiBcIlN0YXRlVHJhaXROb2RlXCIsXG4gIC4uLnNwZWMsXG59KVxuXG5leHBvcnQgY29uc3QgbGlzdCA9IDxJdGVtID0gdW5rbm93bj4oXG4gIHNwZWM6IE9taXQ8TW9kZWwuU3RhdGVUcmFpdExpc3Q8SXRlbT4sIFwiX3RhZ1wiPixcbik6IE1vZGVsLlN0YXRlVHJhaXRMaXN0PEl0ZW0+ID0+ICh7XG4gIF90YWc6IFwiU3RhdGVUcmFpdExpc3RcIixcbiAgLi4uc3BlYyxcbn0pXG5cbi8qKlxuICogU3RhdGVUcmFpdC5jb21wdXRlZFx1RkYxQVxuICogLSBcdTRFM0FcdTY3RDBcdTRFMkFcdTVCNTdcdTZCQjVcdTU4RjBcdTY2MEUgY29tcHV0ZWQgXHU4MEZEXHU1MjlCXHVGRjFCXG4gKiAtIFx1OTAxQVx1OEZDN1x1NjYzRVx1NUYwRiBkZXBzIFx1NEY1Q1x1NEUzQVx1NTUyRlx1NEUwMFx1NEY5RFx1OEQ1Nlx1NEU4Qlx1NUI5RVx1NkU5MFx1RkYwOFx1NzUyOFx1NEU4RVx1OEJDQVx1NjVBRC9cdTUzQ0RcdTU0MTFcdTk1RURcdTUzMDUvXHU1NDBFXHU3RUVEXHU1ODlFXHU5MUNGXHU4QzAzXHU1RUE2XHVGRjA5XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wdXRlZCA9IDxcbiAgUyBleHRlbmRzIG9iamVjdCxcbiAgUCBleHRlbmRzIFN0YXRlRmllbGRQYXRoPFM+LFxuICBjb25zdCBEZXBzIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxTdGF0ZUZpZWxkUGF0aDxTPj4sXG4+KFxuICBpbnB1dDoge1xuICAgIHJlYWRvbmx5IGRlcHM6IERlcHNcbiAgICByZWFkb25seSBnZXQ6ICguLi5kZXBzVmFsdWVzOiBEZXBzQXJnczxTLCBEZXBzPikgPT4gU3RhdGVBdFBhdGg8UywgUD5cbiAgICByZWFkb25seSBlcXVhbHM/OiAocHJldjogU3RhdGVBdFBhdGg8UywgUD4sIG5leHQ6IFN0YXRlQXRQYXRoPFMsIFA+KSA9PiBib29sZWFuXG4gIH0sXG4pOiBTdGF0ZVRyYWl0RW50cnk8UywgUD4gPT4ge1xuICBjb25zdCBkZXJpdmUgPSAoc3RhdGU6IFJlYWRvbmx5PFM+KTogU3RhdGVBdFBhdGg8UywgUD4gPT4ge1xuICAgIGNvbnN0IGFyZ3MgPSAoaW5wdXQuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4pLm1hcCgoZGVwKSA9PlxuICAgICAgUm93SWQuZ2V0QXRQYXRoKHN0YXRlIGFzIGFueSwgZGVwKSxcbiAgICApXG4gICAgcmV0dXJuIChpbnB1dC5nZXQgYXMgYW55KSguLi5hcmdzKVxuICB9XG4gIHJldHVybiB7XG4gICAgZmllbGRQYXRoOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBQLFxuICAgIGtpbmQ6IFwiY29tcHV0ZWRcIixcbiAgICBtZXRhOiB7IGRlcHM6IGlucHV0LmRlcHMsIGRlcml2ZSwgZXF1YWxzOiBpbnB1dC5lcXVhbHMgfSxcbiAgfSBhcyBTdGF0ZVRyYWl0RW50cnk8UywgUD5cbn1cblxuLyoqXG4gKiBTdGF0ZVRyYWl0LnNvdXJjZVx1RkYxQVxuICogLSBcdTRFM0FcdTY3RDBcdTRFMkFcdTVCNTdcdTZCQjVcdTU4RjBcdTY2MEVcdTU5MTZcdTkwRThcdThENDRcdTZFOTBcdTY3NjVcdTZFOTBcdUZGMDhSZXNvdXJjZSAvIFF1ZXJ5IFx1OTZDNlx1NjIxMFx1NTcyOFx1NTQwRVx1N0VFRCBQaGFzZSBcdTRFMkRcdTVCOUVcdTczQjBcdUZGMDlcdUZGMUJcbiAqIC0gXHU1MTg1XHU2ODM4XHU4RDFGXHU4RDIzIGtleUhhc2ggZ2F0ZSAvIGNvbmN1cnJlbmN5IC8gUmVwbGF5TW9kZSBcdTg4NENcdTRFM0FcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHNvdXJjZSA9IDxTIGV4dGVuZHMgb2JqZWN0LCBQIGV4dGVuZHMgU3RhdGVGaWVsZFBhdGg8Uz4+KG1ldGE6IHtcbiAgcmVzb3VyY2U6IHN0cmluZ1xuICBkZXBzOiBSZWFkb25seUFycmF5PFN0YXRlRmllbGRQYXRoPFM+PlxuICBrZXk6IChzdGF0ZTogUmVhZG9ubHk8Uz4pID0+IHVua25vd25cbiAgdHJpZ2dlcnM/OiBSZWFkb25seUFycmF5PFwib25Nb3VudFwiIHwgXCJvblZhbHVlQ2hhbmdlXCIgfCBcIm1hbnVhbFwiPlxuICBkZWJvdW5jZU1zPzogbnVtYmVyXG4gIGNvbmN1cnJlbmN5PzogXCJzd2l0Y2hcIiB8IFwiZXhoYXVzdC10cmFpbGluZ1wiXG4gIC8qKlxuICAgKiBcdTc1MjhcdTRFOEUgRGV2dG9vbHMvXHU2NTg3XHU2ODYzXHU3Njg0XHU1M0VGXHU1RThGXHU1MjE3XHU1MzE2XHU1MTQzXHU0RkUxXHU2MDZGXHVGRjA4XHU3NjdEXHU1NDBEXHU1MzU1XHU1QjU3XHU2QkI1XHU0RjFBXHU1NzI4IGJ1aWxkIFx1OTYzNlx1NkJCNVx1ODhBQlx1NjNEMFx1NTNENlx1RkYwOVx1MzAwMlxuICAgKi9cbiAgbWV0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG59KTogU3RhdGVUcmFpdEVudHJ5PFMsIFA+ID0+XG4gICh7XG4gICAgZmllbGRQYXRoOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBQLFxuICAgIGtpbmQ6IFwic291cmNlXCIsXG4gICAgbWV0YSxcbiAgfSBhcyBTdGF0ZVRyYWl0RW50cnk8UywgUD4pXG5cbi8qKlxuICogU3RhdGVUcmFpdC5saW5rXHVGRjFBXG4gKiAtIFx1NEUzQVx1NzZFRVx1NjgwN1x1NUI1N1x1NkJCNVx1NThGMFx1NjYwRVx1NEVDRVx1NTE3Nlx1NEVENlx1NUI1N1x1NkJCNVx1ODA1NFx1NTJBOFx1NzY4NFx1ODBGRFx1NTI5Qlx1RkYxQlxuICogLSBtZXRhLmZyb20gXHU1NDBDXHU2ODM3XHU1M0Q3IFN0YXRlRmllbGRQYXRoPFM+IFx1N0VBNlx1Njc1Rlx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgbGluayA9IDxTIGV4dGVuZHMgb2JqZWN0LCBQIGV4dGVuZHMgU3RhdGVGaWVsZFBhdGg8Uz4+KG1ldGE6IHtcbiAgZnJvbTogU3RhdGVGaWVsZFBhdGg8Uz5cbn0pOiBTdGF0ZVRyYWl0RW50cnk8UywgUD4gPT5cbiAgKHtcbiAgICBmaWVsZFBhdGg6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFAsXG4gICAga2luZDogXCJsaW5rXCIsXG4gICAgbWV0YSxcbiAgfSBhcyBTdGF0ZVRyYWl0RW50cnk8UywgUD4pXG5cbi8qKlxuICogU3RhdGVUcmFpdC5idWlsZFx1RkYxQVxuICogLSBcdTVDMDYgU3BlYyBcdTVGNTJcdTRFMDBcdTUzMTZcdTRFM0FcdTUzRUZcdTYyNjdcdTg4NEMgUHJvZ3JhbVx1RkYwOFx1NTQyQiBHcmFwaC9QbGFuXHVGRjA5XHVGRjFCXG4gKiAtIERTTCBcdTVDNDJcdTRFMEUgYnVpbGQgXHU1QzQyXHU3Njg0XHU3RUE2XHU2NzVGXHU0RUU1IGJ1aWxkIFx1NEUzQVx1NjcwMFx1N0VDOFx1ODhDMVx1NTFCM1x1RkYwOFx1NEY4Qlx1NTk4Mlx1NUYzQVx1NTIzNlx1NjYzRVx1NUYwRiBkZXBzXHVGRjA5XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZCA9IDxTIGV4dGVuZHMgb2JqZWN0PihcbiAgc3RhdGVTY2hlbWE6IFNjaGVtYS5TY2hlbWE8UywgYW55PixcbiAgc3BlYzogU3RhdGVUcmFpdFNwZWM8Uz4sXG4pOiBTdGF0ZVRyYWl0UHJvZ3JhbTxTPiA9PiBJbnRlcm5hbEJ1aWxkLmJ1aWxkKHN0YXRlU2NoZW1hLCBzcGVjKVxuXG4vKipcbiAqIFN0YXRlVHJhaXQuaW5zdGFsbFx1RkYxQVxuICogLSBcdTU3MjhcdTdFRDlcdTVCOUEgQm91bmQgQVBJIFx1NEUwQVx1NUI4OVx1ODhDNSBQcm9ncmFtIFx1NjNDRlx1OEZGMFx1NzY4NFx1ODg0Q1x1NEUzQVx1RkYwOGNvbXB1dGVkL2xpbmsvc291cmNlL2NoZWNrIFx1N0I0OVx1RkYwOVx1RkYxQlxuICogLSBcdTZCQ0ZcdTRFMkEgUGxhblN0ZXAgXHU1QkY5XHU1RTk0XHU0RTAwXHU0RTJBXHU5NTdGXHU3NTFGXHU1NDdEXHU1NDY4XHU2NzFGIEVmZmVjdFx1RkYwQ1x1NUU3Nlx1NjMwMlx1OEY3RFx1NTIzMCBSdW50aW1lIFNjb3BlXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YWxsID0gPFMgZXh0ZW5kcyBvYmplY3Q+KFxuICBib3VuZDogQm91bmRBcGk8YW55LCBhbnk+LFxuICBwcm9ncmFtOiBTdGF0ZVRyYWl0UHJvZ3JhbTxTPixcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT4gSW50ZXJuYWxJbnN0YWxsLmluc3RhbGwoYm91bmQsIHByb2dyYW0pXG5cbi8qKlxuICogU3RhdGVUcmFpdC5leHBvcnRTdGF0aWNJclx1RkYxQVxuICogLSBcdTVCRkNcdTUxRkFcdTY3MDBcdTVDMEYgU3RhdGljIElSXHVGRjA4XHU1QkY5XHU5RjUwIDAwOSBcdTc2ODQgY2Fub25pY2FsIEZpZWxkUGF0aCBcdTdFQTZcdTY3NUZcdUZGMDlcdUZGMENcdTRGOUIgRGV2dG9vbHMvXHU1QkY5XHU5RjUwXHU1QjlFXHU5QThDXHU1QkE0XHU2RDg4XHU4RDM5XHVGRjFCXG4gKiAtIFx1OEZENFx1NTZERVx1NTAzQ1x1NUZDNVx1OTg3Qlx1NTNFRiBKU09OLnN0cmluZ2lmeVx1RkYwOFx1NzUyOFx1NEU4RVx1OEJDMVx1NjM2RVx1NTMwNS9cdTU2REVcdTY1M0VcdTk0RkVcdThERUZcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IHR5cGUgU3RhdGljSXIgPSBJbnRlcm5hbElyLlN0YXRpY0lyXG5cbmV4cG9ydCBjb25zdCBleHBvcnRTdGF0aWNJciA9IChcbiAgcHJvZ3JhbTogU3RhdGVUcmFpdFByb2dyYW08YW55PixcbiAgbW9kdWxlSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nXG4gIH0sXG4pOiBTdGF0aWNJciA9PlxuICBJbnRlcm5hbElyLmV4cG9ydFN0YXRpY0lyKHtcbiAgICBwcm9ncmFtLFxuICAgIG1vZHVsZUlkLFxuICAgIHZlcnNpb246IG9wdGlvbnM/LnZlcnNpb24sXG4gIH0pXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNBLElBQU0sb0JBQW9CLENBQUMsVUFBd0Q7QUFDakYsUUFBTSxNQUFNLG9CQUFJLElBQVk7QUFDNUIsYUFBVyxRQUFRLE9BQU87QUFDeEIsVUFBTSxJQUFJLEtBQUssS0FBSztBQUNwQixRQUFJLENBQUMsRUFBRztBQUNSLFFBQUksSUFBSSxDQUFDO0FBQUEsRUFDWDtBQUNBLFNBQU8sTUFBTSxLQUFLLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDMUQ7QUFFQSxJQUFNLGdCQUFnQixDQUFDLFVBQ3JCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU0sb0JBQW9CLENBQ3hCLE9BQ0EsVUFD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QU0sT0FBTztBQUFBLEVBQ3pEO0FBQ0Y7QUFPTyxJQUFNLFNBQVMsQ0FBZ0QsVUFZbkU7QUFBQSxFQUNDLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOO0FBQ0Y7QUFPSyxJQUFNLE9BQU8sQ0FBZ0QsVUFHakU7QUFBQSxFQUNDLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOO0FBQ0Y7QUFPSyxJQUFNQyxTQUFRLENBQ25CLGFBQ0EsU0FDdUMsTUFBTSxhQUFhLElBQUk7QUFPekQsSUFBTUMsV0FBVSxDQUNyQixPQUNBLFlBQ29ELFFBQVEsT0FBTyxPQUFPO0FBU3JFLElBQU1DLGtCQUFpQixDQUM1QixTQUNBLFVBQ0EsWUFJVyxlQUFlO0FBQUEsRUFDeEI7QUFBQSxFQUNBO0FBQUEsRUFDQSxTQUFTLFNBQVM7QUFDcEIsQ0FBQzsiLAogICJuYW1lcyI6IFsiZnJvbSIsICJub2RlIiwgIm5vZGUiLCAibGlzdCIsICJmcm9tIiwgImxpc3QiLCAiYnVpbGQiLCAiaW5zdGFsbCIsICJleHBvcnRTdGF0aWNJciJdCn0K