@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,959 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ currentLinkId,
5
+ projectJsonValue
6
+ } from "./chunk-S6ZZHV6G.js";
7
+
8
+ // ../logix-core/src/internal/runtime/core/DebugSink.ts
9
+ import { Cause as Cause2, Effect, FiberRef, Layer, Logger } from "../effect.js";
10
+
11
+ // ../logix-core/src/internal/runtime/core/errorSummary.ts
12
+ import { Cause } from "../effect.js";
13
+ var truncate = (value, maxLen) => {
14
+ if (value.length <= maxLen) return { value, truncated: false };
15
+ return { value: value.slice(0, maxLen), truncated: true };
16
+ };
17
+ var safeStringify = (value) => {
18
+ try {
19
+ return { ok: true, json: JSON.stringify(value) };
20
+ } catch {
21
+ return { ok: false };
22
+ }
23
+ };
24
+ var getMessageFromUnknown = (cause) => {
25
+ if (typeof cause === "string") return cause;
26
+ if (typeof cause === "number" || typeof cause === "boolean" || typeof cause === "bigint") return String(cause);
27
+ if (cause instanceof Error) return cause.message || cause.name || "Error";
28
+ if (cause && typeof cause === "object" && "message" in cause && typeof cause.message === "string") {
29
+ return cause.message;
30
+ }
31
+ try {
32
+ const pretty = Cause.pretty(cause, { renderErrorCause: true });
33
+ if (typeof pretty === "string" && pretty.length > 0) return pretty;
34
+ } catch {
35
+ }
36
+ return "Unknown error";
37
+ };
38
+ var toSerializableErrorSummary = (cause, options) => {
39
+ const maxMessageLength = options?.maxMessageLength ?? 256;
40
+ const messageRaw = getMessageFromUnknown(cause);
41
+ const { value: message, truncated } = truncate(messageRaw, maxMessageLength);
42
+ const summary = {
43
+ message
44
+ };
45
+ if (cause instanceof Error) {
46
+ if (cause.name && cause.name !== "Error") summary.name = cause.name;
47
+ const anyCause = cause;
48
+ if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
49
+ else if (typeof anyCause.code === "number" && Number.isFinite(anyCause.code)) summary.code = String(anyCause.code);
50
+ if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
51
+ return {
52
+ errorSummary: summary,
53
+ downgrade: truncated ? "oversized" : void 0
54
+ };
55
+ }
56
+ if (cause && typeof cause === "object") {
57
+ const anyCause = cause;
58
+ if (typeof anyCause.name === "string" && anyCause.name.length > 0) summary.name = anyCause.name;
59
+ if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
60
+ if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
61
+ }
62
+ const stringifyResult = safeStringify(cause);
63
+ if (!stringifyResult.ok) {
64
+ return {
65
+ errorSummary: summary,
66
+ downgrade: "non_serializable"
67
+ };
68
+ }
69
+ if (truncated) {
70
+ return {
71
+ errorSummary: summary,
72
+ downgrade: "oversized"
73
+ };
74
+ }
75
+ if (message === "Unknown error") {
76
+ return {
77
+ errorSummary: summary,
78
+ downgrade: "unknown"
79
+ };
80
+ }
81
+ return { errorSummary: summary };
82
+ };
83
+
84
+ // ../logix-core/src/internal/runtime/core/DebugSink.ts
85
+ var currentDebugSinks = FiberRef.unsafeMake([]);
86
+ var currentRuntimeLabel = FiberRef.unsafeMake(void 0);
87
+ var currentTxnId = FiberRef.unsafeMake(void 0);
88
+ var currentOpSeq = FiberRef.unsafeMake(void 0);
89
+ var currentDiagnosticsLevel = FiberRef.unsafeMake("off");
90
+ var diagnosticsLevel = (level) => Layer.fiberRefLocallyScopedWith(currentDiagnosticsLevel, () => level);
91
+ var currentTraitConvergeDiagnosticsSampling = FiberRef.unsafeMake({
92
+ sampleEveryN: 32,
93
+ topK: 3
94
+ });
95
+ var traitConvergeDiagnosticsSampling = (config) => Layer.fiberRefLocallyScopedWith(currentTraitConvergeDiagnosticsSampling, () => config);
96
+ var appendSinks = (sinks) => Layer.fiberRefLocallyScopedWith(currentDebugSinks, (current) => [...current, ...sinks]);
97
+ var nextGlobalEventSeq = 0;
98
+ var clearRuntimeDebugEventSeq = () => {
99
+ nextGlobalEventSeq = 0;
100
+ };
101
+ var nextEventSeq = () => {
102
+ nextGlobalEventSeq += 1;
103
+ return nextGlobalEventSeq;
104
+ };
105
+ var makeEventId = (instanceId, eventSeq) => `${instanceId}::e${eventSeq}`;
106
+ var mergeDowngrade = (current, next) => {
107
+ if (!current) return next;
108
+ if (!next) return current;
109
+ if (current === "non_serializable" || next === "non_serializable") return "non_serializable";
110
+ if (current === "oversized" || next === "oversized") return "oversized";
111
+ return "unknown";
112
+ };
113
+ var browserLifecycleSeen = /* @__PURE__ */ new Set();
114
+ var browserDiagnosticSeen = /* @__PURE__ */ new Set();
115
+ var lastTxnByInstance = /* @__PURE__ */ new Map();
116
+ var pendingTxnAlignmentByInstance = /* @__PURE__ */ new Map();
117
+ var enqueuePendingTxnAlignment = (instanceId, ref) => {
118
+ const list = pendingTxnAlignmentByInstance.get(instanceId);
119
+ if (!list) {
120
+ pendingTxnAlignmentByInstance.set(instanceId, [ref]);
121
+ return;
122
+ }
123
+ list.push(ref);
124
+ if (list.length > 64) {
125
+ list.shift();
126
+ }
127
+ };
128
+ var backfillPendingTxnAlignment = (instanceId, txn) => {
129
+ const pending = pendingTxnAlignmentByInstance.get(instanceId);
130
+ if (!pending || pending.length === 0) {
131
+ pendingTxnAlignmentByInstance.delete(instanceId);
132
+ return;
133
+ }
134
+ for (const ref of pending) {
135
+ const anyRef = ref;
136
+ if (anyRef.txnId == null) {
137
+ anyRef.txnId = txn.txnId;
138
+ }
139
+ if (typeof anyRef.txnSeq !== "number" || anyRef.txnSeq <= 0) {
140
+ anyRef.txnSeq = txn.txnSeq;
141
+ }
142
+ }
143
+ pendingTxnAlignmentByInstance.delete(instanceId);
144
+ };
145
+ var lifecycleErrorLog = (event) => {
146
+ const moduleId = event.moduleId ?? "unknown";
147
+ const causePretty = (() => {
148
+ try {
149
+ return Cause2.pretty(event.cause, {
150
+ renderErrorCause: true
151
+ });
152
+ } catch {
153
+ try {
154
+ return JSON.stringify(event.cause, null, 2);
155
+ } catch {
156
+ return String(event.cause);
157
+ }
158
+ }
159
+ })();
160
+ const message = `[Logix][module=${moduleId}] lifecycle:error
161
+ ${causePretty}`;
162
+ return Effect.logError(message).pipe(
163
+ Effect.annotateLogs({
164
+ "logix.moduleId": moduleId,
165
+ "logix.event": "lifecycle:error",
166
+ "logix.cause": causePretty
167
+ })
168
+ );
169
+ };
170
+ var diagnosticLog = (event) => {
171
+ const moduleId = event.moduleId ?? "unknown";
172
+ const header = `[Logix][module=${moduleId}] diagnostic(${event.severity})`;
173
+ const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
174
+ hint: ${event.hint}` : ""}`;
175
+ const msg = `${header}
176
+ ${detail}`;
177
+ const base = event.severity === "warning" ? Effect.logWarning(msg) : event.severity === "info" ? Effect.logInfo(msg) : Effect.logError(msg);
178
+ const annotations = {
179
+ "logix.moduleId": moduleId,
180
+ "logix.event": `diagnostic(${event.severity})`,
181
+ "logix.diagnostic.code": event.code,
182
+ "logix.diagnostic.message": event.message
183
+ };
184
+ if (event.hint) {
185
+ annotations["logix.diagnostic.hint"] = event.hint;
186
+ }
187
+ if (event.actionTag) {
188
+ annotations["logix.diagnostic.actionTag"] = event.actionTag;
189
+ }
190
+ return base.pipe(Effect.annotateLogs(annotations));
191
+ };
192
+ var noopLayer = Layer.locallyScoped(currentDebugSinks, []);
193
+ var errorOnlySink = {
194
+ record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" && event.severity !== "info" ? diagnosticLog(event) : Effect.void
195
+ };
196
+ var errorOnlyLayer = Layer.locallyScoped(currentDebugSinks, [errorOnlySink]);
197
+ var consoleSink = {
198
+ record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event })
199
+ };
200
+ var consoleLayer = Layer.locallyScoped(currentDebugSinks, [consoleSink]);
201
+ var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
202
+ var renderBrowserConsoleEvent = (event) => {
203
+ if (typeof event.type === "string" && event.type.startsWith("trace:")) {
204
+ const moduleId = event.moduleId ?? "unknown";
205
+ const type = event.type;
206
+ return Effect.sync(() => {
207
+ console.groupCollapsed(
208
+ "%c[Logix]%c trace %c" + moduleId + "%c " + String(type),
209
+ "color:#6b7280;font-weight:bold",
210
+ // tag
211
+ "color:#3b82f6",
212
+ // label
213
+ "color:#9ca3af",
214
+ // module id
215
+ "color:#6b7280"
216
+ // type
217
+ );
218
+ console.log(event);
219
+ console.groupEnd();
220
+ });
221
+ }
222
+ if (event.type === "lifecycle:error") {
223
+ const moduleId = event.moduleId ?? "unknown";
224
+ const causePretty = (() => {
225
+ try {
226
+ return Cause2.pretty(event.cause, { renderErrorCause: true });
227
+ } catch {
228
+ try {
229
+ return JSON.stringify(event.cause, null, 2);
230
+ } catch {
231
+ return String(event.cause);
232
+ }
233
+ }
234
+ })();
235
+ const key = `${moduleId}|${causePretty}`;
236
+ if (browserLifecycleSeen.has(key)) {
237
+ return Effect.void;
238
+ }
239
+ browserLifecycleSeen.add(key);
240
+ return Effect.sync(() => {
241
+ console.groupCollapsed(
242
+ "%c[Logix]%c lifecycle:error %c" + moduleId,
243
+ "color:#ef4444;font-weight:bold",
244
+ // tag
245
+ "color:#ef4444",
246
+ // label
247
+ "color:#9ca3af"
248
+ // module id
249
+ );
250
+ console.error(causePretty);
251
+ console.groupEnd();
252
+ });
253
+ }
254
+ if (event.type === "diagnostic") {
255
+ const moduleId = event.moduleId ?? "unknown";
256
+ const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
257
+ hint: ${event.hint}` : ""}`;
258
+ const color = event.severity === "warning" ? "color:#d97706" : event.severity === "info" ? "color:#3b82f6" : "color:#ef4444";
259
+ const label = event.severity === "warning" ? "diagnostic(warning)" : event.severity === "info" ? "diagnostic(info)" : "diagnostic(error)";
260
+ const key = `${moduleId}|${event.code}|${event.message}`;
261
+ if (browserDiagnosticSeen.has(key)) {
262
+ return Effect.void;
263
+ }
264
+ browserDiagnosticSeen.add(key);
265
+ return Effect.sync(() => {
266
+ console.groupCollapsed(
267
+ "%c[Logix]%c " + label + "%c module=" + moduleId,
268
+ "color:#6b7280;font-weight:bold",
269
+ color,
270
+ "color:#9ca3af"
271
+ );
272
+ console.log(detail);
273
+ console.groupEnd();
274
+ });
275
+ }
276
+ return Effect.void;
277
+ };
278
+ var browserConsoleSink = {
279
+ record: (event) => {
280
+ if (!isBrowser) {
281
+ return event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event });
282
+ }
283
+ return renderBrowserConsoleEvent(event);
284
+ }
285
+ };
286
+ var browserConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserConsoleSink]);
287
+ var browserPrettyLoggerLayer = Logger.replace(
288
+ Logger.defaultLogger,
289
+ Logger.prettyLogger({ mode: "browser", colors: true })
290
+ );
291
+ var record = (event) => Effect.gen(function* () {
292
+ const sinks = yield* FiberRef.get(currentDebugSinks);
293
+ if (sinks.length === 0) {
294
+ if (isBrowser) {
295
+ if (event.type === "lifecycle:error" || event.type === "diagnostic") {
296
+ yield* renderBrowserConsoleEvent(event);
297
+ return;
298
+ }
299
+ yield* Effect.void;
300
+ return;
301
+ }
302
+ if (event.type === "lifecycle:error") {
303
+ yield* lifecycleErrorLog(event);
304
+ return;
305
+ }
306
+ if (event.type === "diagnostic") {
307
+ yield* diagnosticLog(event);
308
+ return;
309
+ }
310
+ yield* Effect.void;
311
+ return;
312
+ }
313
+ const enriched = event;
314
+ const diagnosticsLevel2 = yield* FiberRef.get(currentDiagnosticsLevel);
315
+ let now;
316
+ const getNow = () => {
317
+ if (now === void 0) now = Date.now();
318
+ return now;
319
+ };
320
+ if (enriched.timestamp === void 0 && (diagnosticsLevel2 !== "off" || enriched.type === "lifecycle:error" || enriched.type === "diagnostic")) {
321
+ ;
322
+ enriched.timestamp = getNow();
323
+ }
324
+ if (diagnosticsLevel2 !== "off" && enriched.runtimeLabel === void 0) {
325
+ const runtimeLabel = yield* FiberRef.get(currentRuntimeLabel);
326
+ if (runtimeLabel) {
327
+ ;
328
+ enriched.runtimeLabel = runtimeLabel;
329
+ }
330
+ }
331
+ if (enriched.type === "diagnostic" && enriched.txnId === void 0) {
332
+ const txnId = yield* FiberRef.get(currentTxnId);
333
+ if (txnId) {
334
+ ;
335
+ enriched.txnId = txnId;
336
+ }
337
+ }
338
+ if (diagnosticsLevel2 !== "off" && enriched.type === "trace:effectop" && enriched.linkId === void 0) {
339
+ const linkId = yield* FiberRef.get(currentLinkId);
340
+ if (linkId) {
341
+ ;
342
+ enriched.linkId = linkId;
343
+ }
344
+ }
345
+ if (sinks.length === 1) {
346
+ yield* sinks[0].record(enriched);
347
+ return;
348
+ }
349
+ yield* Effect.forEach(sinks, (sink) => sink.record(enriched), { discard: true });
350
+ });
351
+ var toRuntimeDebugEventRef = (event, options) => {
352
+ const diagnosticsLevel2 = options?.diagnosticsLevel ?? "full";
353
+ if (diagnosticsLevel2 === "off") {
354
+ return void 0;
355
+ }
356
+ const isLightLike = diagnosticsLevel2 === "light" || diagnosticsLevel2 === "sampled";
357
+ const timestamp = typeof event.timestamp === "number" && Number.isFinite(event.timestamp) ? event.timestamp : Date.now();
358
+ const moduleIdRaw = event.moduleId;
359
+ const moduleId = typeof moduleIdRaw === "string" && moduleIdRaw.length > 0 ? moduleIdRaw : "unknown";
360
+ const instanceIdRaw = event.instanceId;
361
+ const instanceId = typeof instanceIdRaw === "string" && instanceIdRaw.length > 0 ? instanceIdRaw : "unknown";
362
+ const runtimeLabelRaw = event.runtimeLabel;
363
+ const runtimeLabel = typeof runtimeLabelRaw === "string" && runtimeLabelRaw.length > 0 ? runtimeLabelRaw : void 0;
364
+ const txnSeqRaw = event.txnSeq;
365
+ const txnSeq = typeof txnSeqRaw === "number" && Number.isFinite(txnSeqRaw) && txnSeqRaw >= 0 ? Math.floor(txnSeqRaw) : 0;
366
+ const txnIdRaw = event.txnId;
367
+ const txnId = typeof txnIdRaw === "string" && txnIdRaw.length > 0 ? txnIdRaw : txnSeq > 0 ? `${instanceId}::t${txnSeq}` : void 0;
368
+ const linkId = (() => {
369
+ const linkIdRaw = event.linkId;
370
+ if (typeof linkIdRaw === "string" && linkIdRaw.length > 0) return linkIdRaw;
371
+ if (typeof event.type !== "string" || !event.type.startsWith("trace:")) {
372
+ return void 0;
373
+ }
374
+ const data = event.data;
375
+ const meta = data?.meta;
376
+ const linkIdFromMeta = meta?.linkId;
377
+ if (typeof linkIdFromMeta === "string" && linkIdFromMeta.length > 0) return linkIdFromMeta;
378
+ return void 0;
379
+ })();
380
+ const eventSeqRaw = options?.eventSeq;
381
+ const eventSeq = typeof eventSeqRaw === "number" && Number.isFinite(eventSeqRaw) && eventSeqRaw > 0 ? Math.floor(eventSeqRaw) : nextEventSeq();
382
+ const eventId = makeEventId(instanceId, eventSeq);
383
+ const base = {
384
+ eventId,
385
+ eventSeq,
386
+ moduleId,
387
+ instanceId,
388
+ runtimeLabel,
389
+ txnSeq,
390
+ txnId,
391
+ linkId,
392
+ timestamp
393
+ };
394
+ let downgrade;
395
+ const withDowngrade = (ref) => {
396
+ if (!downgrade) return ref;
397
+ return { ...ref, downgrade: { reason: downgrade } };
398
+ };
399
+ switch (event.type) {
400
+ case "module:init":
401
+ return withDowngrade({
402
+ ...base,
403
+ kind: "lifecycle",
404
+ label: "module:init"
405
+ });
406
+ case "module:destroy":
407
+ return withDowngrade({
408
+ ...base,
409
+ kind: "lifecycle",
410
+ label: "module:destroy"
411
+ });
412
+ case "lifecycle:phase": {
413
+ const e = event;
414
+ const metaInput = isLightLike ? { type: "lifecycle:phase", phase: e.phase, name: e.name } : { type: "lifecycle:phase", phase: e.phase, name: e.name, payload: e.payload };
415
+ const metaProjection = projectJsonValue(metaInput);
416
+ options?.onMetaProjection?.({
417
+ stats: metaProjection.stats,
418
+ downgrade: metaProjection.downgrade
419
+ });
420
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
421
+ return withDowngrade({
422
+ ...base,
423
+ kind: "lifecycle",
424
+ label: e.name,
425
+ meta: metaProjection.value
426
+ });
427
+ }
428
+ case "action:dispatch": {
429
+ const action = event.action;
430
+ const tag = action?._tag ?? action?.type ?? "action:dispatch";
431
+ const label = String(tag);
432
+ const metaInput = isLightLike ? { actionTag: label } : { action };
433
+ const metaProjection = projectJsonValue(metaInput);
434
+ options?.onMetaProjection?.({
435
+ stats: metaProjection.stats,
436
+ downgrade: metaProjection.downgrade
437
+ });
438
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
439
+ return withDowngrade({
440
+ ...base,
441
+ kind: "action",
442
+ label,
443
+ meta: metaProjection.value
444
+ });
445
+ }
446
+ case "state:update": {
447
+ const e = event;
448
+ const metaInput = isLightLike ? {
449
+ state: e.state,
450
+ dirtySet: e.dirtySet,
451
+ patchCount: e.patchCount,
452
+ commitMode: e.commitMode,
453
+ priority: e.priority,
454
+ originKind: e.originKind,
455
+ originName: e.originName
456
+ } : {
457
+ state: e.state,
458
+ dirtySet: e.dirtySet,
459
+ patchCount: e.patchCount,
460
+ commitMode: e.commitMode,
461
+ priority: e.priority,
462
+ originKind: e.originKind,
463
+ originName: e.originName,
464
+ traitSummary: e.traitSummary,
465
+ replayEvent: e.replayEvent
466
+ };
467
+ const metaProjection = projectJsonValue(metaInput);
468
+ options?.onMetaProjection?.({
469
+ stats: metaProjection.stats,
470
+ downgrade: metaProjection.downgrade
471
+ });
472
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
473
+ if (txnId) {
474
+ lastTxnByInstance.set(instanceId, { txnId, txnSeq });
475
+ backfillPendingTxnAlignment(instanceId, { txnId, txnSeq });
476
+ }
477
+ return withDowngrade({
478
+ ...base,
479
+ kind: "state",
480
+ label: "state:update",
481
+ meta: metaProjection.value
482
+ });
483
+ }
484
+ case "process:start":
485
+ case "process:stop":
486
+ case "process:restart":
487
+ case "process:trigger":
488
+ case "process:dispatch":
489
+ case "process:error": {
490
+ const e = event;
491
+ const ts2 = typeof e.timestampMs === "number" && Number.isFinite(e.timestampMs) ? e.timestampMs : timestamp;
492
+ const metaInput = {
493
+ identity: e.identity,
494
+ severity: e.severity,
495
+ eventSeq: e.eventSeq,
496
+ timestampMs: e.timestampMs,
497
+ trigger: e.trigger,
498
+ dispatch: e.dispatch,
499
+ error: e.error
500
+ };
501
+ const metaProjection = projectJsonValue(metaInput);
502
+ options?.onMetaProjection?.({
503
+ stats: metaProjection.stats,
504
+ downgrade: metaProjection.downgrade
505
+ });
506
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
507
+ const errorSummary = e.type === "process:error" || e.type === "process:restart" ? e.error : void 0;
508
+ return withDowngrade({
509
+ ...base,
510
+ timestamp: ts2,
511
+ kind: "process",
512
+ label: e.type,
513
+ meta: metaProjection.value,
514
+ errorSummary
515
+ });
516
+ }
517
+ case "lifecycle:error": {
518
+ const e = event;
519
+ const summary = toSerializableErrorSummary(e.cause);
520
+ downgrade = mergeDowngrade(downgrade, summary.downgrade);
521
+ const metaInput = isLightLike ? { type: "lifecycle:error", phase: e.phase, name: e.hook } : {
522
+ type: "lifecycle:error",
523
+ phase: e.phase,
524
+ name: e.hook,
525
+ hook: e.hook,
526
+ taskId: e.taskId,
527
+ origin: e.origin,
528
+ txnSeq: e.txnSeq,
529
+ opSeq: e.opSeq
530
+ };
531
+ const metaProjection = projectJsonValue(metaInput);
532
+ options?.onMetaProjection?.({
533
+ stats: metaProjection.stats,
534
+ downgrade: metaProjection.downgrade
535
+ });
536
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
537
+ return withDowngrade({
538
+ ...base,
539
+ kind: "lifecycle",
540
+ label: "lifecycle:error",
541
+ meta: metaProjection.value,
542
+ errorSummary: summary.errorSummary
543
+ });
544
+ }
545
+ case "diagnostic": {
546
+ const e = event;
547
+ const metaInput = {
548
+ code: e.code,
549
+ severity: e.severity,
550
+ message: e.message,
551
+ hint: e.hint,
552
+ actionTag: e.actionTag,
553
+ kind: e.kind,
554
+ trigger: e.trigger
555
+ };
556
+ const metaProjection = projectJsonValue(metaInput);
557
+ options?.onMetaProjection?.({
558
+ stats: metaProjection.stats,
559
+ downgrade: metaProjection.downgrade
560
+ });
561
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
562
+ return withDowngrade({
563
+ ...base,
564
+ kind: "diagnostic",
565
+ label: e.code,
566
+ meta: metaProjection.value
567
+ });
568
+ }
569
+ default: {
570
+ if (typeof event.type !== "string" || !event.type.startsWith("trace:")) {
571
+ return void 0;
572
+ }
573
+ if (event.type === "trace:txn-lane") {
574
+ const data = event.data;
575
+ const evidence = data?.evidence ?? data;
576
+ const metaProjection2 = projectJsonValue(evidence);
577
+ options?.onMetaProjection?.({
578
+ stats: metaProjection2.stats,
579
+ downgrade: metaProjection2.downgrade
580
+ });
581
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
582
+ const label = typeof evidence?.kind === "string" && evidence.kind.length > 0 ? String(evidence.kind) : "txn-lane";
583
+ return withDowngrade({
584
+ ...base,
585
+ kind: "txn-lane",
586
+ label,
587
+ meta: metaProjection2.value
588
+ });
589
+ }
590
+ if (event.type === "trace:react-render" || event.type === "trace:react-selector") {
591
+ const data = event.data;
592
+ const metaProjection2 = projectJsonValue(
593
+ isLightLike ? {
594
+ componentLabel: data?.componentLabel,
595
+ selectorKey: data?.selectorKey,
596
+ fieldPaths: data?.fieldPaths,
597
+ selectorId: data?.selectorId,
598
+ lane: data?.lane,
599
+ producer: data?.producer,
600
+ fallbackReason: data?.fallbackReason,
601
+ readsDigest: data?.readsDigest,
602
+ equalsKind: data?.equalsKind,
603
+ strictModePhase: data?.strictModePhase
604
+ } : {
605
+ componentLabel: data?.componentLabel,
606
+ selectorKey: data?.selectorKey,
607
+ fieldPaths: data?.fieldPaths,
608
+ selectorId: data?.selectorId,
609
+ lane: data?.lane,
610
+ producer: data?.producer,
611
+ fallbackReason: data?.fallbackReason,
612
+ readsDigest: data?.readsDigest,
613
+ equalsKind: data?.equalsKind,
614
+ strictModePhase: data?.strictModePhase,
615
+ meta: data?.meta
616
+ }
617
+ );
618
+ options?.onMetaProjection?.({
619
+ stats: metaProjection2.stats,
620
+ downgrade: metaProjection2.downgrade
621
+ });
622
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
623
+ const label = typeof data?.componentLabel === "string" && data.componentLabel.length > 0 ? data.componentLabel : event.type === "trace:react-selector" ? "react-selector" : "react-render";
624
+ const last = lastTxnByInstance.get(instanceId);
625
+ const txnSeqFromMeta = typeof data?.meta?.txnSeq === "number" && Number.isFinite(data.meta.txnSeq) && data.meta.txnSeq >= 0 ? Math.floor(data.meta.txnSeq) : void 0;
626
+ const txnIdFromMeta = typeof data?.meta?.txnId === "string" && data.meta.txnId.length > 0 ? data.meta.txnId : void 0;
627
+ const txnIdAligned = txnIdFromMeta ?? base.txnId ?? last?.txnId;
628
+ const txnSeqAligned = txnSeqFromMeta ?? (base.txnSeq > 0 ? base.txnSeq : last?.txnSeq ?? base.txnSeq);
629
+ const ref = withDowngrade({
630
+ ...base,
631
+ txnId: txnIdAligned,
632
+ txnSeq: txnSeqAligned,
633
+ kind: event.type === "trace:react-selector" ? "react-selector" : "react-render",
634
+ label,
635
+ meta: metaProjection2.value
636
+ });
637
+ if (instanceId !== "unknown" && (ref.txnId == null || ref.txnSeq <= 0)) {
638
+ enqueuePendingTxnAlignment(instanceId, ref);
639
+ }
640
+ return ref;
641
+ }
642
+ if (event.type === "trace:selector:eval") {
643
+ const data = event.data;
644
+ const metaInput = {
645
+ selectorId: data?.selectorId,
646
+ lane: data?.lane,
647
+ producer: data?.producer,
648
+ fallbackReason: data?.fallbackReason,
649
+ readsDigest: data?.readsDigest,
650
+ equalsKind: data?.equalsKind,
651
+ changed: data?.changed,
652
+ evalMs: data?.evalMs
653
+ };
654
+ const metaProjection2 = projectJsonValue(metaInput);
655
+ options?.onMetaProjection?.({
656
+ stats: metaProjection2.stats,
657
+ downgrade: metaProjection2.downgrade
658
+ });
659
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
660
+ return withDowngrade({
661
+ ...base,
662
+ kind: "devtools",
663
+ label: event.type,
664
+ meta: metaProjection2.value
665
+ });
666
+ }
667
+ if (event.type === "trace:exec-vm") {
668
+ const data = event.data;
669
+ const metaInput = {
670
+ version: data?.version,
671
+ stage: data?.stage,
672
+ hit: data?.hit,
673
+ reasonCode: data?.reasonCode ?? data?.reason,
674
+ reasonDetail: data?.reasonDetail,
675
+ execIrVersion: data?.execIrVersion,
676
+ execIrHash: data?.execIrHash,
677
+ serviceId: data?.serviceId,
678
+ implId: data?.implId
679
+ };
680
+ const metaProjection2 = projectJsonValue(metaInput);
681
+ options?.onMetaProjection?.({
682
+ stats: metaProjection2.stats,
683
+ downgrade: metaProjection2.downgrade
684
+ });
685
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
686
+ return withDowngrade({
687
+ ...base,
688
+ kind: "devtools",
689
+ label: event.type,
690
+ meta: metaProjection2.value
691
+ });
692
+ }
693
+ if (event.type === "trace:trait:converge") {
694
+ const resolveDirtyRootPaths = (args) => {
695
+ const resolve = options?.resolveConvergeStaticIr;
696
+ if (!resolve) return void 0;
697
+ const digest = args.staticIrDigest;
698
+ if (typeof digest !== "string" || digest.length === 0) return void 0;
699
+ const rootIds = args.rootIds;
700
+ if (!Array.isArray(rootIds) || rootIds.length === 0) return void 0;
701
+ const ir = resolve(digest);
702
+ const fieldPaths = ir?.fieldPaths;
703
+ if (!Array.isArray(fieldPaths) || fieldPaths.length === 0) return void 0;
704
+ const out = [];
705
+ for (const id of rootIds) {
706
+ if (typeof id !== "number" || !Number.isFinite(id)) continue;
707
+ const idx = Math.floor(id);
708
+ if (idx < 0 || idx >= fieldPaths.length) continue;
709
+ const path = fieldPaths[idx];
710
+ if (Array.isArray(path)) {
711
+ out.push(path);
712
+ }
713
+ }
714
+ return out.length > 0 ? out : void 0;
715
+ };
716
+ const enrichDirtyRootPaths = (value) => {
717
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
718
+ const anyValue = value;
719
+ const dirty = anyValue.dirty;
720
+ if (!dirty || typeof dirty !== "object" || Array.isArray(dirty)) return value;
721
+ const dirtyRootPaths = resolveDirtyRootPaths({
722
+ staticIrDigest: anyValue.staticIrDigest,
723
+ rootIds: dirty?.rootIds
724
+ });
725
+ if (!dirtyRootPaths) return value;
726
+ return {
727
+ ...anyValue,
728
+ dirty: {
729
+ ...dirty,
730
+ rootPaths: dirtyRootPaths
731
+ }
732
+ };
733
+ };
734
+ const stripHeavyLight = (value) => {
735
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
736
+ const anyValue = value;
737
+ const dirty = anyValue.dirty;
738
+ const dirtyRootPaths = resolveDirtyRootPaths({
739
+ staticIrDigest: anyValue.staticIrDigest,
740
+ rootIds: dirty?.rootIds
741
+ });
742
+ const dirtySlim = dirty && typeof dirty === "object" && !Array.isArray(dirty) ? {
743
+ dirtyAll: dirty.dirtyAll,
744
+ ...typeof dirty.reason === "string" ? { reason: dirty.reason } : null,
745
+ ...Array.isArray(dirty.rootIds) ? { rootIds: dirty.rootIds } : null,
746
+ ...typeof dirty.rootIdsTruncated === "boolean" ? { rootIdsTruncated: dirty.rootIdsTruncated } : null,
747
+ ...dirtyRootPaths ? { rootPaths: dirtyRootPaths } : null
748
+ } : void 0;
749
+ const { top3, dirtyRoots, ...rest } = anyValue;
750
+ return dirtySlim ? { ...rest, dirty: dirtySlim } : rest;
751
+ };
752
+ const stripHeavySampled = (value) => {
753
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
754
+ const anyValue = value;
755
+ const dirty = anyValue.dirty;
756
+ const dirtySlim = dirty && typeof dirty === "object" && !Array.isArray(dirty) ? {
757
+ dirtyAll: dirty.dirtyAll,
758
+ ...typeof dirty.reason === "string" ? { reason: dirty.reason } : null
759
+ } : void 0;
760
+ const { dirtyRoots, ...rest } = anyValue;
761
+ return dirtySlim ? { ...rest, dirty: dirtySlim } : rest;
762
+ };
763
+ const data = event.data;
764
+ const metaInput = diagnosticsLevel2 === "light" ? stripHeavyLight(data) : diagnosticsLevel2 === "sampled" ? stripHeavySampled(data) : enrichDirtyRootPaths(data);
765
+ const metaProjection2 = projectJsonValue(metaInput);
766
+ options?.onMetaProjection?.({
767
+ stats: metaProjection2.stats,
768
+ downgrade: metaProjection2.downgrade
769
+ });
770
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
771
+ return withDowngrade({
772
+ ...base,
773
+ kind: "trait:converge",
774
+ label: "trait:converge",
775
+ meta: metaProjection2.value
776
+ });
777
+ }
778
+ if (event.type === "trace:trait:check") {
779
+ const stripHeavy = (value) => {
780
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
781
+ const anyValue = value;
782
+ const degraded = anyValue.degraded;
783
+ const degradedSlim = degraded && typeof degraded === "object" && !Array.isArray(degraded) ? { kind: degraded.kind } : void 0;
784
+ const { degraded: _degraded, ...rest } = anyValue;
785
+ return degradedSlim ? { ...rest, degraded: degradedSlim } : rest;
786
+ };
787
+ const data = event.data;
788
+ const metaInput = isLightLike ? stripHeavy(data) : data;
789
+ const metaProjection2 = projectJsonValue(metaInput);
790
+ options?.onMetaProjection?.({
791
+ stats: metaProjection2.stats,
792
+ downgrade: metaProjection2.downgrade
793
+ });
794
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
795
+ return withDowngrade({
796
+ ...base,
797
+ kind: "trait:check",
798
+ label: "trait:check",
799
+ meta: metaProjection2.value
800
+ });
801
+ }
802
+ if (event.type === "trace:trait:validate") {
803
+ const data = event.data;
804
+ const metaProjection2 = projectJsonValue(data);
805
+ options?.onMetaProjection?.({
806
+ stats: metaProjection2.stats,
807
+ downgrade: metaProjection2.downgrade
808
+ });
809
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
810
+ return withDowngrade({
811
+ ...base,
812
+ kind: "trait:validate",
813
+ label: "trait:validate",
814
+ meta: metaProjection2.value
815
+ });
816
+ }
817
+ if (event.type === "trace:module:traits") {
818
+ const data = event.data;
819
+ const metaInput = isLightLike ? {
820
+ digest: data?.digest,
821
+ count: data?.count
822
+ } : {
823
+ digest: data?.digest,
824
+ count: data?.count,
825
+ traits: data?.traits,
826
+ provenanceIndex: data?.provenanceIndex
827
+ };
828
+ const metaProjection2 = projectJsonValue(metaInput);
829
+ options?.onMetaProjection?.({
830
+ stats: metaProjection2.stats,
831
+ downgrade: metaProjection2.downgrade
832
+ });
833
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
834
+ return withDowngrade({
835
+ ...base,
836
+ kind: "devtools",
837
+ label: event.type,
838
+ meta: metaProjection2.value
839
+ });
840
+ }
841
+ if (event.type === "trace:module:traits:conflict") {
842
+ const data = event.data;
843
+ const metaInput = isLightLike ? {
844
+ conflictCount: data?.conflictCount,
845
+ traitIds: data?.traitIds
846
+ } : {
847
+ conflictCount: data?.conflictCount,
848
+ conflicts: data?.conflicts
849
+ };
850
+ const metaProjection2 = projectJsonValue(metaInput);
851
+ options?.onMetaProjection?.({
852
+ stats: metaProjection2.stats,
853
+ downgrade: metaProjection2.downgrade
854
+ });
855
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
856
+ return withDowngrade({
857
+ ...base,
858
+ kind: "devtools",
859
+ label: event.type,
860
+ meta: metaProjection2.value
861
+ });
862
+ }
863
+ if (event.type === "trace:module:descriptor") {
864
+ const data = event.data;
865
+ const metaInput = isLightLike ? {
866
+ id: data?.id,
867
+ traits: data?.traits,
868
+ source: data?.source
869
+ } : { data };
870
+ const metaProjection2 = projectJsonValue(metaInput);
871
+ options?.onMetaProjection?.({
872
+ stats: metaProjection2.stats,
873
+ downgrade: metaProjection2.downgrade
874
+ });
875
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
876
+ return withDowngrade({
877
+ ...base,
878
+ kind: "devtools",
879
+ label: event.type,
880
+ meta: metaProjection2.value
881
+ });
882
+ }
883
+ if (event.type === "trace:effectop") {
884
+ const data = event.data;
885
+ const opMeta = data?.meta;
886
+ const opKind = data?.kind ?? "service";
887
+ const label = typeof data?.name === "string" ? data.name : "effectop";
888
+ const moduleId2 = typeof opMeta?.moduleId === "string" ? opMeta.moduleId : moduleId;
889
+ const txnId2 = typeof opMeta?.txnId === "string" && opMeta.txnId.length > 0 ? opMeta.txnId : base.txnId;
890
+ const txnSeq2 = typeof opMeta?.txnSeq === "number" && Number.isFinite(opMeta.txnSeq) && opMeta.txnSeq >= 0 ? Math.floor(opMeta.txnSeq) : base.txnSeq;
891
+ const metaInput = isLightLike ? {
892
+ id: data?.id,
893
+ kind: data?.kind,
894
+ name: data?.name,
895
+ meta: opMeta
896
+ } : {
897
+ id: data?.id,
898
+ kind: data?.kind,
899
+ name: data?.name,
900
+ payload: data?.payload,
901
+ meta: opMeta
902
+ };
903
+ const metaProjection2 = projectJsonValue(metaInput);
904
+ options?.onMetaProjection?.({
905
+ stats: metaProjection2.stats,
906
+ downgrade: metaProjection2.downgrade
907
+ });
908
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
909
+ return withDowngrade({
910
+ ...base,
911
+ moduleId: moduleId2,
912
+ txnId: txnId2,
913
+ txnSeq: txnSeq2,
914
+ kind: opKind,
915
+ label,
916
+ meta: metaProjection2.value
917
+ });
918
+ }
919
+ const metaProjection = projectJsonValue(
920
+ isLightLike ? {
921
+ data: void 0
922
+ } : {
923
+ data: event.data
924
+ }
925
+ );
926
+ options?.onMetaProjection?.({
927
+ stats: metaProjection.stats,
928
+ downgrade: metaProjection.downgrade
929
+ });
930
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
931
+ return withDowngrade({
932
+ ...base,
933
+ kind: "devtools",
934
+ label: event.type,
935
+ meta: metaProjection.value
936
+ });
937
+ }
938
+ }
939
+ };
940
+
941
+ export {
942
+ toSerializableErrorSummary,
943
+ currentDebugSinks,
944
+ currentRuntimeLabel,
945
+ currentTxnId,
946
+ currentOpSeq,
947
+ currentDiagnosticsLevel,
948
+ diagnosticsLevel,
949
+ currentTraitConvergeDiagnosticsSampling,
950
+ traitConvergeDiagnosticsSampling,
951
+ appendSinks,
952
+ clearRuntimeDebugEventSeq,
953
+ noopLayer,
954
+ errorOnlyLayer,
955
+ browserConsoleLayer,
956
+ record,
957
+ toRuntimeDebugEventRef
958
+ };
959
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0RlYnVnU2luay50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBGaWJlclJlZiwgTGF5ZXIsIExvZ2dlciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB7XG4gIHByb2plY3RKc29uVmFsdWUsXG4gIHR5cGUgRG93bmdyYWRlUmVhc29uIGFzIEpzb25Eb3duZ3JhZGVSZWFzb24sXG4gIHR5cGUgSnNvblZhbHVlLFxuICB0eXBlIEpzb25WYWx1ZVByb2plY3Rpb25TdGF0cyxcbn0gZnJvbSAnLi4vLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgdHlwZSAqIGFzIFJlcGxheUxvZyBmcm9tICcuL1JlcGxheUxvZy5qcydcbmltcG9ydCB7XG4gIHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5LFxuICB0eXBlIERvd25ncmFkZVJlYXNvbiBhcyBFcnJvckRvd25ncmFkZVJlYXNvbixcbiAgdHlwZSBTZXJpYWxpemFibGVFcnJvclN1bW1hcnksXG59IGZyb20gJy4vZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0ICogYXMgRWZmZWN0T3BDb3JlIGZyb20gJy4vRWZmZWN0T3BDb3JlLmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBQcm9jZXNzUHJvdG9jb2wgZnJvbSAnLi9wcm9jZXNzL3Byb3RvY29sLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyRXhwb3J0IH0gZnJvbSAnLi4vLi4vc3RhdGUtdHJhaXQvY29udmVyZ2UtaXIuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJpZ2dlclJlZiB7XG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZ1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRldGFpbHM/OiB1bmtub3duXG59XG5cbnR5cGUgVHJhY2VFdmVudFR5cGUgPSBgdHJhY2U6JHtzdHJpbmd9YFxudHlwZSBHZW5lcmljVHJhY2VFdmVudFR5cGUgPSBFeGNsdWRlPFxuICBUcmFjZUV2ZW50VHlwZSxcbiAgJ3RyYWNlOnRyYWl0OmNvbnZlcmdlJyB8ICd0cmFjZTp0cmFpdDpjaGVjaycgfCAndHJhY2U6dHJhaXQ6dmFsaWRhdGUnXG4+XG5cbi8qKlxuICogUmVwbGF5RXZlbnRSZWZcdUZGMUFcbiAqIC0gRGVidWcgXHU0RThCXHU0RUY2XHU0RkE3XHU1RjE1XHU3NTI4XHU3Njg0XHUyMDFDXHU1NkRFXHU2NTNFXHU0RThCXHU0RUY2XHUyMDFEXHU3RUQzXHU2Nzg0XHVGRjFCXG4gKiAtIFx1NTdGQVx1NEU4RSBSZXBsYXlMb2cuRXZlbnRcdUZGMENcdTVFNzZcdTg4NjVcdTlGNTAgdHhuL3RyaWdnZXIgXHU3QjQ5XHU1MTczXHU4MDU0XHU1QjU3XHU2QkI1XHU0RUU1XHU0RkJGXHU0RThFXHU1NzI4IERldnRvb2xzIFx1NEUyRFx1NTA1QVx1ODA1QVx1NTQwOFx1NEUwRVx1ODlFM1x1OTFDQVx1MzAwMlxuICovXG5leHBvcnQgdHlwZSBSZXBsYXlFdmVudFJlZiA9IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCAmIHtcbiAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHJpZ2dlcj86IFRyaWdnZXJSZWZcbn1cblxuZXhwb3J0IHR5cGUgRXZlbnQgPVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdtb2R1bGU6aW5pdCdcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnbW9kdWxlOmRlc3Ryb3knXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2xpZmVjeWNsZTpwaGFzZSdcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBwaGFzZTogJ2luaXQnIHwgJ3J1bicgfCAnZGVzdHJveScgfCAncGxhdGZvcm0nXG4gICAgICByZWFkb25seSBuYW1lOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHBheWxvYWQ/OiB1bmtub3duXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnYWN0aW9uOmRpc3BhdGNoJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGFjdGlvbjogdW5rbm93blxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3N0YXRlOnVwZGF0ZSdcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBzdGF0ZTogdW5rbm93blxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTY3MkNcdTZCMjFcdTYzRDBcdTRFQTRcdTgwNUFcdTU0MDhcdTc2ODRcdTVGNzFcdTU0Q0RcdTU3REZcdUZGMDhcdTVCNTdcdTZCQjVcdTdFQTcgZGlydHktc2V0XHVGRjA5XHUzMDAyXG4gICAgICAgKiAtIFx1NzUzMSBSdW50aW1lIFx1NTcyOCBjb21taXQgXHU3MEI5XHU1ODZCXHU1MTQ1XHVGRjFCXG4gICAgICAgKiAtIFx1NUZDNVx1OTg3Qlx1NEZERFx1NjMwMSBTbGltIFx1NEUxNFx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1RkYxQlxuICAgICAgICogLSBcdTUzRUZcdTg4QUIgRGV2dG9vbHMgXHU3NTI4XHU0RThFIGV4cGxhaW4gXHUyMDFDXHU0RTNBXHU0RjU1XHU4OUU2XHU1M0QxIGNvbnZlcmdlL3ZhbGlkYXRlL1x1NEUzQVx1NEY1NVx1OTAwMFx1NTMxNiBmdWxsXHUyMDFEXHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IGRpcnR5U2V0PzogdW5rbm93blxuICAgICAgLyoqXG4gICAgICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTY3MkNcdTZCMjFcdTYzRDBcdTRFQTRcdTgwNUFcdTU0MDhcdTc2ODQgUGF0Y2ggXHU2NTcwXHU5MUNGXHVGRjA4XHU2NzY1XHU4MUVBIFN0YXRlVHJhbnNhY3Rpb25cdUZGMDlcdUZGMUJcbiAgICAgICAqIC0gXHU0RUM1XHU1NzI4XHU0RThCXHU1MkExXHU4REVGXHU1Rjg0XHU0RTBCXHU3NTMxIFJ1bnRpbWUgXHU1ODZCXHU1MTQ1XHVGRjFCXG4gICAgICAgKiAtIERldnRvb2xzIFx1NTNFRlx1NzUyOFx1NEY1Q1x1NEU4Qlx1NTJBMVx1Njk4Mlx1ODk4MVx1NEZFMVx1NjA2Rlx1NzY4NFx1OEY3Qlx1OTFDRlx1NjMwN1x1NjgwN1x1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSBwYXRjaENvdW50PzogbnVtYmVyXG4gICAgICAvKipcbiAgICAgICAqIFx1NTNFRlx1OTAwOVx1RkYxQVx1NjNEMFx1NEVBNFx1NkEyMVx1NUYwRlx1RkYwOFx1NjY2RVx1OTAxQS9cdTYyNzlcdTU5MDRcdTc0MDYvXHU0RjRFXHU0RjE4XHU1MTQ4XHU3RUE3XHU3QjQ5XHVGRjA5XHUzMDAyXG4gICAgICAgKiAtIFx1NzUzMSBSdW50aW1lIFx1NTg2Qlx1NTE0NVx1RkYxQlxuICAgICAgICogLSBcdTlFRDhcdThCQTRcdTUwM0NcdTc1MzFcdThDMDNcdTc1MjhcdTY1QjlcdTUxQjNcdTVCOUFcdUZGMDhcdTkwMUFcdTVFMzhcdTRFM0EgXCJub3JtYWxcIlx1RkYwOVx1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSBjb21taXRNb2RlPzogc3RyaW5nXG4gICAgICAvKipcbiAgICAgICAqIFx1NTNFRlx1OTAwOVx1RkYxQVx1NUJGOVx1NTkxNlx1NTNFRlx1ODlDMVx1NjAyN1x1NEYxOFx1NTE0OFx1N0VBN1x1RkYwOG5vcm1hbC9sb3dcdUZGMDlcdTMwMDJcbiAgICAgICAqIC0gXHU3NTMxIFJ1bnRpbWUgXHU1ODZCXHU1MTQ1XHVGRjFCXG4gICAgICAgKiAtIFx1NEUzQlx1ODk4MVx1NzUyOFx1NEU4RSBSZWFjdCBcdTU5MTZcdTkwRThcdThCQTJcdTk2MDVcdThDMDNcdTVFQTZcdUZGMDhcdTkwN0ZcdTUxNERcdTk3NUVcdTVGQzVcdTg5ODEgcmVuZGVyXHVGRjA5XHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHByaW9yaXR5Pzogc3RyaW5nXG4gICAgICAvKipcbiAgICAgICAqIFx1NTNFRlx1OTAwOVx1RkYxQVx1ODlFNlx1NTNEMVx1NjcyQ1x1NkIyMVx1NzJCNlx1NjAwMVx1NjNEMFx1NEVBNFx1NzY4NFx1NEU4Qlx1NTJBMVx1Njc2NVx1NkU5MFx1NzlDRFx1N0M3Qlx1RkYwOG9yaWdpbi5raW5kXHVGRjA5XHVGRjFBXG4gICAgICAgKiAtIFx1NEY4Qlx1NTk4MiBcImFjdGlvblwiIC8gXCJzb3VyY2UtcmVmcmVzaFwiIC8gXCJzZXJ2aWNlLWNhbGxiYWNrXCIgLyBcImRldnRvb2xzXCJcdUZGMUJcbiAgICAgICAqIC0gXHU0RUM1XHU1NzI4XHU1N0ZBXHU0RThFIFN0YXRlVHJhbnNhY3Rpb24gXHU3Njg0XHU4REVGXHU1Rjg0XHU0RTBCXHU3NTMxIFJ1bnRpbWUgXHU1ODZCXHU1MTQ1XHVGRjFCXG4gICAgICAgKiAtIERldnRvb2xzIFx1NTNFRlx1NjM2RVx1NkI2NFx1NTMzQVx1NTIwNlx1NEUxQVx1NTJBMVx1NEU4Qlx1NTJBMVx1NEUwRSBEZXZ0b29scyB0aW1lLXRyYXZlbCBcdTY0Q0RcdTRGNUNcdTMwMDJcbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgb3JpZ2luS2luZD86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTg5RTZcdTUzRDFcdTY3MkNcdTZCMjFcdTcyQjZcdTYwMDFcdTYzRDBcdTRFQTRcdTc2ODRcdTRFOEJcdTUyQTFcdTY3NjVcdTZFOTBcdTU0MERcdTc5RjBcdUZGMDhvcmlnaW4ubmFtZVx1RkYwOVx1RkYxQVxuICAgICAgICogLSBcdTRGOEJcdTU5ODIgYWN0aW9uIGRpc3BhdGNoIC8gZmllbGRQYXRoIC8gdGFzazpzdWNjZXNzL3Rhc2s6ZmFpbHVyZSBcdTdCNDlcdUZGMUJcbiAgICAgICAqIC0gXHU0RUM1XHU1NzI4XHU1N0ZBXHU0RThFIFN0YXRlVHJhbnNhY3Rpb24gXHU3Njg0XHU4REVGXHU1Rjg0XHU0RTBCXHU3NTMxIFJ1bnRpbWUgXHU1ODZCXHU1MTQ1XHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IG9yaWdpbk5hbWU/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogXHU5ODg0XHU3NTU5XHVGRjFBVHJhaXQgXHU2NTM2XHU2NTVCXHU2NDU4XHU4OTgxXHVGRjA4XHU3NTI4XHU0RThFIERldnRvb2xzIFx1NUM1NVx1NzkzQVx1N0E5N1x1NTNFM1x1N0VBN1x1N0VERlx1OEJBMS9Ub3BOIFx1NjIxMFx1NjcyQy9cdTk2NERcdTdFQTdcdTUzOUZcdTU2RTBcdTdCNDlcdUZGMDlcdTMwMDJcbiAgICAgICAqIC0gUGhhc2UgMlx1RkYxQVx1NEVDNVx1NTZGQVx1NTMxNlx1NUI1N1x1NkJCNVx1NEY0RFx1RkYwQ1x1NEUwRFx1OTUwMVx1NkI3Qlx1N0VEM1x1Njc4NFx1RkYxQlxuICAgICAgICogLSBcdTU0MEVcdTdFRUQgUGhhc2UgXHU0RjFBXHU0RTBFIFRyYWl0L1JlcGxheSBcdTRFOEJcdTRFRjZcdTZBMjFcdTU3OEJcdTVCRjlcdTlGNTBcdTRFM0FcdTUzRUZcdTg5RTNcdTkxQ0FcdTdFRDNcdTY3ODRcdTMwMDJcbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgdHJhaXRTdW1tYXJ5PzogdW5rbm93blxuICAgICAgLyoqXG4gICAgICAgKiBcdTk4ODRcdTc1NTlcdUZGMUFcdTY3MkNcdTZCMjFcdTRFOEJcdTUyQTFcdTUxNzNcdTgwNTRcdTc2ODRcdTU2REVcdTY1M0VcdTRFOEJcdTRFRjZcdUZGMDhSZXBsYXlMb2cgXHU0RkE3XHU3Njg0IHJlLWVtaXQgXHU0RThCXHU1QjlFXHU2RTkwXHVGRjA5XHUzMDAyXG4gICAgICAgKiAtIFBoYXNlIDJcdUZGMUFcdTRFQzVcdTU2RkFcdTUzMTZcdTVCNTdcdTZCQjVcdTRGNERcdUZGMUJcbiAgICAgICAqIC0gXHU1NDBFXHU3RUVEIFBoYXNlIFx1NEYxQVx1NEUwRSBSZXBsYXlMb2cuRXZlbnQgXHU3RUQzXHU2Nzg0XHU1QkY5XHU5RjUwXHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHJlcGxheUV2ZW50PzogUmVwbGF5RXZlbnRSZWZcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6XG4gICAgICAgIHwgJ3Byb2Nlc3M6c3RhcnQnXG4gICAgICAgIHwgJ3Byb2Nlc3M6c3RvcCdcbiAgICAgICAgfCAncHJvY2VzczpyZXN0YXJ0J1xuICAgICAgICB8ICdwcm9jZXNzOnRyaWdnZXInXG4gICAgICAgIHwgJ3Byb2Nlc3M6ZGlzcGF0Y2gnXG4gICAgICAgIHwgJ3Byb2Nlc3M6ZXJyb3InXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaWRlbnRpdHk6IFByb2Nlc3NQcm90b2NvbC5Qcm9jZXNzSW5zdGFuY2VJZGVudGl0eVxuICAgICAgcmVhZG9ubHkgc2V2ZXJpdHk6ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdlcnJvcidcbiAgICAgIHJlYWRvbmx5IGV2ZW50U2VxOiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcE1zOiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHRyaWdnZXI/OiBQcm9jZXNzUHJvdG9jb2wuUHJvY2Vzc1RyaWdnZXJcbiAgICAgIHJlYWRvbmx5IGRpc3BhdGNoPzoge1xuICAgICAgICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gICAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICAgICAgICByZWFkb25seSBhY3Rpb25JZDogc3RyaW5nXG4gICAgICB9XG4gICAgICByZWFkb25seSBlcnJvcj86IFByb2Nlc3NQcm90b2NvbC5TZXJpYWxpemFibGVFcnJvclN1bW1hcnlcbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdsaWZlY3ljbGU6ZXJyb3InXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgY2F1c2U6IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHBoYXNlPzogJ2luaXQnIHwgJ3J1bicgfCAnZGVzdHJveScgfCAncGxhdGZvcm0nXG4gICAgICByZWFkb25seSBob29rPzogJ2luaXRSZXF1aXJlZCcgfCAnc3RhcnQnIHwgJ2Rlc3Ryb3knIHwgJ3N1c3BlbmQnIHwgJ3Jlc3VtZScgfCAncmVzZXQnIHwgJ3Vua25vd24nXG4gICAgICByZWFkb25seSB0YXNrSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IG9wU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSBvcmlnaW4/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2RpYWdub3N0aWMnXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgY29kZTogc3RyaW5nXG4gICAgICByZWFkb25seSBzZXZlcml0eTogJ2Vycm9yJyB8ICd3YXJuaW5nJyB8ICdpbmZvJ1xuICAgICAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nXG4gICAgICByZWFkb25seSBoaW50Pzogc3RyaW5nXG4gICAgICByZWFkb25seSBhY3Rpb25UYWc/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGtpbmQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRyaWdnZXI/OiBUcmlnZ2VyUmVmXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgLyoqXG4gICAqIHRyYWNlOiogXHU0RThCXHU0RUY2XHVGRjFBXG4gICAqIC0gXHU0RjVDXHU0RTNBXHU4RkQwXHU4ODRDXHU2NUY2IHRyYWNlIC8gUGxheWdyb3VuZCAvIEFsaWdubWVudCBMYWIgXHU3Njg0XHU2MjY5XHU1QzU1XHU5NEE5XHU1QjUwXHVGRjFCXG4gICAqIC0gXHU1RjUzXHU1MjREXHU1M0VBXHU3RUE2XHU1QjlBIHR5cGUgXHU1MjREXHU3RjAwXHU0RTBFIG1vZHVsZUlkXHVGRjBDXHU1MTc3XHU0RjUzIHBheWxvYWQgXHU3RUQzXHU2Nzg0XHU3NTMxXHU0RTBBXHU1QzQyXHU3RUE2XHU1QjlBXHVGRjA4XHU0RjhCXHU1OTgyIGRhdGEgXHU1MTg1XHU2MzAyIHNwYW5JZC9hdHRyaWJ1dGVzIFx1N0I0OVx1RkYwOVx1MzAwMlxuICAgKi9cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAndHJhY2U6dHJhaXQ6Y29udmVyZ2UnXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgZGF0YTogSnNvblZhbHVlXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAndHJhY2U6dHJhaXQ6Y2hlY2snXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgZGF0YTogSnNvblZhbHVlXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAndHJhY2U6dHJhaXQ6dmFsaWRhdGUnXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgZGF0YTogSnNvblZhbHVlXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiBHZW5lcmljVHJhY2VFdmVudFR5cGVcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBkYXRhPzogdW5rbm93blxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luayB7XG4gIHJlYWRvbmx5IHJlY29yZDogKGV2ZW50OiBFdmVudCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPlxufVxuZXhwb3J0IGNvbnN0IGN1cnJlbnREZWJ1Z1NpbmtzID0gRmliZXJSZWYudW5zYWZlTWFrZTxSZWFkb25seUFycmF5PFNpbms+PihbXSlcbmV4cG9ydCBjb25zdCBjdXJyZW50UnVudGltZUxhYmVsID0gRmliZXJSZWYudW5zYWZlTWFrZTxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbmV4cG9ydCBjb25zdCBjdXJyZW50VHhuSWQgPSBGaWJlclJlZi51bnNhZmVNYWtlPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuZXhwb3J0IGNvbnN0IGN1cnJlbnRPcFNlcSA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG5leHBvcnQgdHlwZSBEaWFnbm9zdGljc0xldmVsID0gJ29mZicgfCAnbGlnaHQnIHwgJ3NhbXBsZWQnIHwgJ2Z1bGwnXG5leHBvcnQgY29uc3QgY3VycmVudERpYWdub3N0aWNzTGV2ZWwgPSBGaWJlclJlZi51bnNhZmVNYWtlPERpYWdub3N0aWNzTGV2ZWw+KCdvZmYnKVxuXG5leHBvcnQgY29uc3QgZGlhZ25vc3RpY3NMZXZlbCA9IChsZXZlbDogRGlhZ25vc3RpY3NMZXZlbCk6IExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5maWJlclJlZkxvY2FsbHlTY29wZWRXaXRoKGN1cnJlbnREaWFnbm9zdGljc0xldmVsIGFzIGFueSwgKCkgPT4gbGV2ZWwpIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPlxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIFx1NkJDRlx1OTY5NCBOIFx1NEUyQSB0eG4gXHU5MUM3XHU2ODM3XHU0RTAwXHU2QjIxXHVGRjA4XHU3ODZFXHU1QjlBXHU2MDI3XHVGRjBDXHU1N0ZBXHU0RThFXHU3QTMzXHU1QjlBIHR4blNlcVx1RkYwOVx1MzAwMlxuICAgKiAtIDFcdUZGMUFcdTZCQ0ZcdTZCMjFcdTkwRkRcdTkxQzdcdTY4MzdcdUZGMDhcdTdCNDlcdTRFRjcgZnVsbCBcdTc2ODRcdThCQTFcdTY1RjZcdTdDOTJcdTVFQTZcdUZGMENcdTRGNDYgcGF5bG9hZCBcdTRFQ0RcdTRGRERcdTYzMDEgc2xpbVx1RkYwOVxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlRXZlcnlOOiBudW1iZXJcbiAgLyoqXG4gICAqIFx1OEY5M1x1NTFGQVx1NzY4NCBUb3BLIGhvdHNwb3RzIFx1NjU3MFx1OTFDRlx1NEUwQVx1OTY1MFx1RkYwOFx1NUVGQVx1OEJBRSBcdTIyNjQzXHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSB0b3BLOiBudW1iZXJcbn1cblxuZXhwb3J0IGNvbnN0IGN1cnJlbnRUcmFpdENvbnZlcmdlRGlhZ25vc3RpY3NTYW1wbGluZyA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8VHJhaXRDb252ZXJnZURpYWdub3N0aWNzU2FtcGxpbmdDb25maWc+KHtcbiAgc2FtcGxlRXZlcnlOOiAzMixcbiAgdG9wSzogMyxcbn0pXG5cbmV4cG9ydCBjb25zdCB0cmFpdENvbnZlcmdlRGlhZ25vc3RpY3NTYW1wbGluZyA9IChcbiAgY29uZmlnOiBUcmFpdENvbnZlcmdlRGlhZ25vc3RpY3NTYW1wbGluZ0NvbmZpZyxcbik6IExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5maWJlclJlZkxvY2FsbHlTY29wZWRXaXRoKGN1cnJlbnRUcmFpdENvbnZlcmdlRGlhZ25vc3RpY3NTYW1wbGluZyBhcyBhbnksICgpID0+IGNvbmZpZykgYXMgTGF5ZXIuTGF5ZXI8XG4gICAgYW55LFxuICAgIG5ldmVyLFxuICAgIG5ldmVyXG4gID5cblxuZXhwb3J0IGNvbnN0IGFwcGVuZFNpbmtzID0gKHNpbmtzOiBSZWFkb25seUFycmF5PFNpbms+KTogTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+ID0+XG4gIExheWVyLmZpYmVyUmVmTG9jYWxseVNjb3BlZFdpdGgoY3VycmVudERlYnVnU2lua3MsIChjdXJyZW50KSA9PiBbLi4uY3VycmVudCwgLi4uc2lua3NdKSBhcyBMYXllci5MYXllcjxcbiAgICBhbnksXG4gICAgbmV2ZXIsXG4gICAgbmV2ZXJcbiAgPlxuXG5leHBvcnQgdHlwZSBSdW50aW1lRGVidWdFdmVudEtpbmQgPVxuICB8ICdhY3Rpb24nXG4gIHwgJ3N0YXRlJ1xuICB8ICdzZXJ2aWNlJ1xuICB8ICdwcm9jZXNzJ1xuICB8ICd0cmFpdC1jb21wdXRlZCdcbiAgfCAndHJhaXQtbGluaydcbiAgfCAndHJhaXQtc291cmNlJ1xuICB8ICdsaWZlY3ljbGUnXG4gIHwgJ3JlYWN0LXJlbmRlcidcbiAgfCAnZGV2dG9vbHMnXG4gIHwgJ2RpYWdub3N0aWMnXG4gIHwgKHN0cmluZyAmIHt9KVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVEZWJ1Z0V2ZW50UmVmIHtcbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGV2ZW50U2VxOiBudW1iZXJcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gIHJlYWRvbmx5IHR4blNlcTogbnVtYmVyXG4gIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gIC8qKlxuICAgKiBsaW5rSWRcdUZGMUFcbiAgICogLSBcdTVGNTNcdTUyNERcdTY0Q0RcdTRGNUNcdTk0RkVcdThERUYgaWRcdUZGMDhcdTU0MENcdTRFMDBcdTk0RkVcdThERUZcdTRFMEJcdTc2ODRcdThGQjlcdTc1NENcdTY0Q0RcdTRGNUNcdTUxNzFcdTRFQUJcdUZGMDlcdUZGMUJcbiAgICogLSBcdTc1MzEgUnVudGltZSBcdTU3MjhcdThGQjlcdTc1NENcdThENzdcdTcwQjlcdTUyMUJcdTVFRkFcdUZGMENcdTVFNzZcdTkwMUFcdThGQzcgRmliZXJSZWYgXHU1NzI4XHU1RDRDXHU1OTU3L1x1OERFOFx1NkEyMVx1NTc1N1x1OTRGRVx1OERFRlx1NEUyRFx1NEYyMFx1OTAxMlx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0lkPzogc3RyaW5nXG4gIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyXG4gIHJlYWRvbmx5IGtpbmQ6IFJ1bnRpbWVEZWJ1Z0V2ZW50S2luZFxuICByZWFkb25seSBsYWJlbDogc3RyaW5nXG4gIHJlYWRvbmx5IG1ldGE/OiBKc29uVmFsdWVcbiAgcmVhZG9ubHkgZXJyb3JTdW1tYXJ5PzogU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5XG4gIHJlYWRvbmx5IGRvd25ncmFkZT86IHtcbiAgICByZWFkb25seSByZWFzb24/OiAnbm9uX3NlcmlhbGl6YWJsZScgfCAnb3ZlcnNpemVkJyB8ICd1bmtub3duJ1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFR4bkxhbmVFdmlkZW5jZVJlYXNvbiA9XG4gIHwgJ2Rpc2FibGVkJ1xuICB8ICdmb3JjZWRfb2ZmJ1xuICB8ICdmb3JjZWRfc3luYydcbiAgfCAncXVldWVkX25vbl91cmdlbnQnXG4gIHwgJ3ByZWVtcHRlZF9ieV91cmdlbnQnXG4gIHwgJ2J1ZGdldF95aWVsZCdcbiAgfCAnY29hbGVzY2VkJ1xuICB8ICdjYW5jZWxlZCdcbiAgfCAnbWF4X2xhZ19mb3JjZWQnXG4gIHwgJ3N0YXJ2YXRpb25fcHJvdGVjdGlvbidcblxuZXhwb3J0IHR5cGUgVHhuTGFuZU5vblVyZ2VudFlpZWxkUmVhc29uID0gJ25vbmUnIHwgJ2lucHV0X3BlbmRpbmcnIHwgJ2J1ZGdldF9leGNlZWRlZCcgfCAnZm9yY2VkX2ZyYW1lX3lpZWxkJ1xuXG5leHBvcnQgdHlwZSBUeG5MYW5lRXZpZGVuY2UgPSB7XG4gIHJlYWRvbmx5IGFuY2hvcjoge1xuICAgIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgICByZWFkb25seSB0eG5TZXE6IG51bWJlclxuICAgIHJlYWRvbmx5IG9wU2VxPzogbnVtYmVyXG4gIH1cbiAgcmVhZG9ubHkgbGFuZTogJ3VyZ2VudCcgfCAnbm9uVXJnZW50J1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgcG9saWN5OiB7XG4gICAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhblxuICAgIHJlYWRvbmx5IG92ZXJyaWRlTW9kZT86ICdmb3JjZWRfb2ZmJyB8ICdmb3JjZWRfc3luYydcbiAgICByZWFkb25seSBjb25maWdTY29wZTogJ3Byb3ZpZGVyJyB8ICdydW50aW1lX21vZHVsZScgfCAncnVudGltZV9kZWZhdWx0JyB8ICdidWlsdGluJ1xuICAgIHJlYWRvbmx5IGJ1ZGdldE1zOiBudW1iZXJcbiAgICByZWFkb25seSBkZWJvdW5jZU1zOiBudW1iZXJcbiAgICByZWFkb25seSBtYXhMYWdNczogbnVtYmVyXG4gICAgcmVhZG9ubHkgYWxsb3dDb2FsZXNjZTogYm9vbGVhblxuICAgIHJlYWRvbmx5IHlpZWxkU3RyYXRlZ3k/OiAnYmFzZWxpbmUnIHwgJ2lucHV0UGVuZGluZydcbiAgICByZWFkb25seSBxdWV1ZU1vZGU/OiAnZmlmbycgfCAnbGFuZXMnXG4gIH1cbiAgcmVhZG9ubHkgYmFja2xvZzoge1xuICAgIHJlYWRvbmx5IHBlbmRpbmdDb3VudDogbnVtYmVyXG4gICAgcmVhZG9ubHkgYWdlTXM/OiBudW1iZXJcbiAgICByZWFkb25seSBjb2FsZXNjZWRDb3VudD86IG51bWJlclxuICAgIHJlYWRvbmx5IGNhbmNlbGVkQ291bnQ/OiBudW1iZXJcbiAgfVxuICByZWFkb25seSBidWRnZXQ/OiB7XG4gICAgcmVhZG9ubHkgYnVkZ2V0TXM/OiBudW1iZXJcbiAgICByZWFkb25seSBzbGljZUR1cmF0aW9uTXM/OiBudW1iZXJcbiAgICByZWFkb25seSB5aWVsZENvdW50PzogbnVtYmVyXG4gICAgcmVhZG9ubHkgeWllbGRlZD86IGJvb2xlYW5cbiAgICByZWFkb25seSB5aWVsZFJlYXNvbj86IFR4bkxhbmVOb25VcmdlbnRZaWVsZFJlYXNvblxuICB9XG4gIHJlYWRvbmx5IHN0YXJ2YXRpb24/OiB7XG4gICAgcmVhZG9ubHkgdHJpZ2dlcmVkPzogYm9vbGVhblxuICAgIHJlYWRvbmx5IHJlYXNvbj86IHN0cmluZ1xuICB9XG4gIHJlYWRvbmx5IHJlYXNvbnM6IFJlYWRvbmx5QXJyYXk8VHhuTGFuZUV2aWRlbmNlUmVhc29uPlxufVxuXG5sZXQgbmV4dEdsb2JhbEV2ZW50U2VxID0gMFxuXG5leHBvcnQgY29uc3QgY2xlYXJSdW50aW1lRGVidWdFdmVudFNlcSA9ICgpOiB2b2lkID0+IHtcbiAgbmV4dEdsb2JhbEV2ZW50U2VxID0gMFxufVxuXG5jb25zdCBuZXh0RXZlbnRTZXEgPSAoKTogbnVtYmVyID0+IHtcbiAgbmV4dEdsb2JhbEV2ZW50U2VxICs9IDFcbiAgcmV0dXJuIG5leHRHbG9iYWxFdmVudFNlcVxufVxuXG5jb25zdCBtYWtlRXZlbnRJZCA9IChpbnN0YW5jZUlkOiBzdHJpbmcsIGV2ZW50U2VxOiBudW1iZXIpOiBzdHJpbmcgPT4gYCR7aW5zdGFuY2VJZH06OmUke2V2ZW50U2VxfWBcblxudHlwZSBEb3duZ3JhZGVSZWFzb24gPSBKc29uRG93bmdyYWRlUmVhc29uIHwgRXJyb3JEb3duZ3JhZGVSZWFzb25cblxuY29uc3QgbWVyZ2VEb3duZ3JhZGUgPSAoXG4gIGN1cnJlbnQ6IERvd25ncmFkZVJlYXNvbiB8IHVuZGVmaW5lZCxcbiAgbmV4dDogRG93bmdyYWRlUmVhc29uIHwgdW5kZWZpbmVkLFxuKTogRG93bmdyYWRlUmVhc29uIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFjdXJyZW50KSByZXR1cm4gbmV4dFxuICBpZiAoIW5leHQpIHJldHVybiBjdXJyZW50XG4gIGlmIChjdXJyZW50ID09PSAnbm9uX3NlcmlhbGl6YWJsZScgfHwgbmV4dCA9PT0gJ25vbl9zZXJpYWxpemFibGUnKSByZXR1cm4gJ25vbl9zZXJpYWxpemFibGUnXG4gIGlmIChjdXJyZW50ID09PSAnb3ZlcnNpemVkJyB8fCBuZXh0ID09PSAnb3ZlcnNpemVkJykgcmV0dXJuICdvdmVyc2l6ZWQnXG4gIHJldHVybiAndW5rbm93bidcbn1cblxuLy8gXHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXHU0RTBCXHVGRjBDXHU0RTNBXHU0RTg2XHU1MUNGXHU1QzExIFJlYWN0IFN0cmljdE1vZGUgXHU3QjQ5XHU1QkZDXHU4MUY0XHU3Njg0XHU5MUNEXHU1OTBEXHU2NUU1XHU1RkQ3XHU1NjZBXHU5N0YzXHVGRjBDXG4vLyBcdTVCRjkgbGlmZWN5Y2xlOmVycm9yIFx1NEUwRSBkaWFnbm9zdGljIFx1NEU4Qlx1NEVGNlx1NTA1QVx1NEUwMFx1NkIyMVx1N0I4MFx1NTM1NVx1NTNCQlx1OTFDRFx1RkYxQVx1NTQwQ1x1NEUwMCBtb2R1bGVJZCtwYXlsb2FkIFx1NTNFQVx1NjI1M1x1NTM3MFx1NEUwMFx1NkIyMVx1MzAwMlxuY29uc3QgYnJvd3NlckxpZmVjeWNsZVNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuY29uc3QgYnJvd3NlckRpYWdub3N0aWNTZWVuID0gbmV3IFNldDxzdHJpbmc+KClcblxuLy8gXHU3NTI4XHU0RThFXHU1QzA2IHRyYWNlOnJlYWN0LXJlbmRlciBcdTRFOEJcdTRFRjZcdTRFMEVcdTY3MDBcdThGRDFcdTRFMDBcdTZCMjEgc3RhdGU6dXBkYXRlIFx1NEU4Qlx1NTJBMVx1NUJGOVx1OUY1MFx1RkYwOFx1NEVDNVx1NEY1Q1x1NEUzQSBVSSBcdThGODVcdTUyQTlcdTUxNzNcdTgwNTRcdUZGMDlcdTMwMDJcbmNvbnN0IGxhc3RUeG5CeUluc3RhbmNlID0gbmV3IE1hcDxzdHJpbmcsIHsgcmVhZG9ubHkgdHhuSWQ6IHN0cmluZzsgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXIgfT4oKVxuXG4vLyB0cmFjZTpyZWFjdC1yZW5kZXIgLyB0cmFjZTpyZWFjdC1zZWxlY3RvciBcdTRFOEJcdTRFRjZcdTUzRUZcdTgwRkRcdTRGMUFcdTU3Mjggc3RhdGU6dXBkYXRlIFx1NEU0Qlx1NTI0RFx1OEZEQlx1NTE2NSBzaW5rXHVGRjA4XHU1RTc2XHU1M0QxL1x1OEMwM1x1NUVBNlx1NUJGQ1x1ODFGNFx1NzY4NFx1NEU3MVx1NUU4Rlx1RkYwOVx1MzAwMlxuLy8gXHU0RTNBXHU0RTg2XHU1NzI4IERldnRvb2xzL1VJIFx1NUM0Mlx1NjJGRlx1NTIzMFx1NTNFRlx1NzUyOFx1NzY4NCB0eG4gXHU5NTFBXHU3MEI5XHVGRjBDXHU4RkQ5XHU5MUNDXHU1MTQxXHU4QkI4XHU1QkY5XHUyMDFDXHU3RjNBIHR4blx1MjAxRFx1NzY4NCByZWYgXHU1MDVBXHU0RTAwXHU2QjIxXHU1NDBFXHU4ODY1XHUzMDAyXG5jb25zdCBwZW5kaW5nVHhuQWxpZ25tZW50QnlJbnN0YW5jZSA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxSdW50aW1lRGVidWdFdmVudFJlZj4+KClcblxuY29uc3QgZW5xdWV1ZVBlbmRpbmdUeG5BbGlnbm1lbnQgPSAoaW5zdGFuY2VJZDogc3RyaW5nLCByZWY6IFJ1bnRpbWVEZWJ1Z0V2ZW50UmVmKTogdm9pZCA9PiB7XG4gIGNvbnN0IGxpc3QgPSBwZW5kaW5nVHhuQWxpZ25tZW50QnlJbnN0YW5jZS5nZXQoaW5zdGFuY2VJZClcbiAgaWYgKCFsaXN0KSB7XG4gICAgcGVuZGluZ1R4bkFsaWdubWVudEJ5SW5zdGFuY2Uuc2V0KGluc3RhbmNlSWQsIFtyZWZdKVxuICAgIHJldHVyblxuICB9XG4gIGxpc3QucHVzaChyZWYpXG4gIGlmIChsaXN0Lmxlbmd0aCA+IDY0KSB7XG4gICAgbGlzdC5zaGlmdCgpXG4gIH1cbn1cblxuY29uc3QgYmFja2ZpbGxQZW5kaW5nVHhuQWxpZ25tZW50ID0gKFxuICBpbnN0YW5jZUlkOiBzdHJpbmcsXG4gIHR4bjogeyByZWFkb25seSB0eG5JZDogc3RyaW5nOyByZWFkb25seSB0eG5TZXE6IG51bWJlciB9LFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHBlbmRpbmcgPSBwZW5kaW5nVHhuQWxpZ25tZW50QnlJbnN0YW5jZS5nZXQoaW5zdGFuY2VJZClcbiAgaWYgKCFwZW5kaW5nIHx8IHBlbmRpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgcGVuZGluZ1R4bkFsaWdubWVudEJ5SW5zdGFuY2UuZGVsZXRlKGluc3RhbmNlSWQpXG4gICAgcmV0dXJuXG4gIH1cblxuICBmb3IgKGNvbnN0IHJlZiBvZiBwZW5kaW5nKSB7XG4gICAgY29uc3QgYW55UmVmOiBhbnkgPSByZWYgYXMgYW55XG4gICAgaWYgKGFueVJlZi50eG5JZCA9PSBudWxsKSB7XG4gICAgICBhbnlSZWYudHhuSWQgPSB0eG4udHhuSWRcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhbnlSZWYudHhuU2VxICE9PSAnbnVtYmVyJyB8fCBhbnlSZWYudHhuU2VxIDw9IDApIHtcbiAgICAgIGFueVJlZi50eG5TZXEgPSB0eG4udHhuU2VxXG4gICAgfVxuICB9XG5cbiAgcGVuZGluZ1R4bkFsaWdubWVudEJ5SW5zdGFuY2UuZGVsZXRlKGluc3RhbmNlSWQpXG59XG5cbmNvbnN0IGxpZmVjeWNsZUVycm9yTG9nID0gKGV2ZW50OiBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICdsaWZlY3ljbGU6ZXJyb3InIH0+KSA9PiB7XG4gIGNvbnN0IG1vZHVsZUlkID0gZXZlbnQubW9kdWxlSWQgPz8gJ3Vua25vd24nXG4gIGNvbnN0IGNhdXNlUHJldHR5ID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIENhdXNlLnByZXR0eShldmVudC5jYXVzZSBhcyBDYXVzZS5DYXVzZTx1bmtub3duPiwge1xuICAgICAgICByZW5kZXJFcnJvckNhdXNlOiB0cnVlLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShldmVudC5jYXVzZSwgbnVsbCwgMilcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGV2ZW50LmNhdXNlKVxuICAgICAgfVxuICAgIH1cbiAgfSkoKVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBgW0xvZ2l4XVttb2R1bGU9JHttb2R1bGVJZH1dIGxpZmVjeWNsZTplcnJvclxcbiR7Y2F1c2VQcmV0dHl9YFxuXG4gIHJldHVybiBFZmZlY3QubG9nRXJyb3IobWVzc2FnZSkucGlwZShcbiAgICBFZmZlY3QuYW5ub3RhdGVMb2dzKHtcbiAgICAgICdsb2dpeC5tb2R1bGVJZCc6IG1vZHVsZUlkLFxuICAgICAgJ2xvZ2l4LmV2ZW50JzogJ2xpZmVjeWNsZTplcnJvcicsXG4gICAgICAnbG9naXguY2F1c2UnOiBjYXVzZVByZXR0eSxcbiAgICB9KSxcbiAgKVxufVxuXG5jb25zdCBkaWFnbm9zdGljTG9nID0gKGV2ZW50OiBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICdkaWFnbm9zdGljJyB9PikgPT4ge1xuICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICBjb25zdCBoZWFkZXIgPSBgW0xvZ2l4XVttb2R1bGU9JHttb2R1bGVJZH1dIGRpYWdub3N0aWMoJHtldmVudC5zZXZlcml0eX0pYFxuICBjb25zdCBkZXRhaWwgPSBgY29kZT0ke2V2ZW50LmNvZGV9IG1lc3NhZ2U9JHtldmVudC5tZXNzYWdlfSR7XG4gICAgZXZlbnQuYWN0aW9uVGFnID8gYCBhY3Rpb249JHtldmVudC5hY3Rpb25UYWd9YCA6ICcnXG4gIH0ke2V2ZW50LmhpbnQgPyBgXFxuaGludDogJHtldmVudC5oaW50fWAgOiAnJ31gXG4gIGNvbnN0IG1zZyA9IGAke2hlYWRlcn1cXG4ke2RldGFpbH1gXG5cbiAgY29uc3QgYmFzZSA9XG4gICAgZXZlbnQuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJ1xuICAgICAgPyBFZmZlY3QubG9nV2FybmluZyhtc2cpXG4gICAgICA6IGV2ZW50LnNldmVyaXR5ID09PSAnaW5mbydcbiAgICAgICAgPyBFZmZlY3QubG9nSW5mbyhtc2cpXG4gICAgICAgIDogRWZmZWN0LmxvZ0Vycm9yKG1zZylcblxuICBjb25zdCBhbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgJ2xvZ2l4Lm1vZHVsZUlkJzogbW9kdWxlSWQsXG4gICAgJ2xvZ2l4LmV2ZW50JzogYGRpYWdub3N0aWMoJHtldmVudC5zZXZlcml0eX0pYCxcbiAgICAnbG9naXguZGlhZ25vc3RpYy5jb2RlJzogZXZlbnQuY29kZSxcbiAgICAnbG9naXguZGlhZ25vc3RpYy5tZXNzYWdlJzogZXZlbnQubWVzc2FnZSxcbiAgfVxuICBpZiAoZXZlbnQuaGludCkge1xuICAgIGFubm90YXRpb25zWydsb2dpeC5kaWFnbm9zdGljLmhpbnQnXSA9IGV2ZW50LmhpbnRcbiAgfVxuICBpZiAoZXZlbnQuYWN0aW9uVGFnKSB7XG4gICAgYW5ub3RhdGlvbnNbJ2xvZ2l4LmRpYWdub3N0aWMuYWN0aW9uVGFnJ10gPSBldmVudC5hY3Rpb25UYWdcbiAgfVxuXG4gIHJldHVybiBiYXNlLnBpcGUoRWZmZWN0LmFubm90YXRlTG9ncyhhbm5vdGF0aW9ucykpXG59XG5cbi8qKlxuICogXHU1N0ZBXHU0RThFIEZpYmVyUmVmLmN1cnJlbnREZWJ1Z1NpbmtzIFx1NzY4NFx1OUVEOFx1OEJBNCBMYXllciBcdTdFQzRcdTU0MDhcdUZGMUFcbiAqIC0gXHU0RjdGXHU3NTI4IExheWVyLmxvY2FsbHlTY29wZWQgXHU3ODZFXHU0RkREIERlYnVnIHNpbmtzIFx1NEY1Q1x1NEUzQSBGaWJlclJlZiBcdTcyQjZcdTYwMDFcdTZDRThcdTUxNjVcdUZGMENcbiAqIC0gXHU0RTBEXHU1MThEXHU1QzA2IEZpYmVyUmVmIFx1OEJFRlx1NzUyOFx1NEUzQSBDb250ZXh0LlRhZ1x1MzAwMlxuICovXG5leHBvcnQgY29uc3Qgbm9vcExheWVyID0gTGF5ZXIubG9jYWxseVNjb3BlZChjdXJyZW50RGVidWdTaW5rcywgW10pXG5cbi8qKlxuICogZXJyb3JPbmx5TGF5ZXJcdUZGMUFcbiAqIC0gXHU5RUQ4XHU4QkE0XHU3Njg0IERlYnVnU2luayBcdTVCOUVcdTczQjBcdUZGMENcdTRFQzVcdTUxNzNcdTVGQzMgbGlmZWN5Y2xlOmVycm9yIFx1NEU4Qlx1NEVGNlx1RkYxQlxuICogLSBcdTkwMDJcdTU0MDhcdTRGNUNcdTRFM0EgUnVudGltZSBcdTc2ODRcdTIwMUNcdTY3MDBcdTRGNEVcdTk2NTBcdTVFQTZcdTg5QzJcdTZENEJcdTIwMURcdTVDNDJcdUZGMENcdTRGRERcdThCQzFcdTgxRjRcdTU0N0RcdTk1MTlcdThCRUZcdTRFMERcdTRGMUFcdTYwODRcdTcxMzZcdTZEODhcdTU5MzFcdUZGMUJcbiAqIC0gXHU1MTc2XHU0RUQ2XHU0RThCXHU0RUY2XHVGRjA4bW9kdWxlOmluaXQvZGVzdHJveVx1MzAwMWFjdGlvbjpkaXNwYXRjaFx1MzAwMXN0YXRlOnVwZGF0ZVx1RkYwOVx1OUVEOFx1OEJBNFx1NEUwRFx1OEJCMFx1NUY1NVx1MzAwMlxuICovXG5jb25zdCBlcnJvck9ubHlTaW5rOiBTaW5rID0ge1xuICByZWNvcmQ6IChldmVudDogRXZlbnQpID0+XG4gICAgZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgID8gbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICA6IGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJyAmJiBldmVudC5zZXZlcml0eSAhPT0gJ2luZm8nXG4gICAgICAgID8gZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgOiBFZmZlY3Qudm9pZCxcbn1cblxuZXhwb3J0IGNvbnN0IGVycm9yT25seUxheWVyID0gTGF5ZXIubG9jYWxseVNjb3BlZChjdXJyZW50RGVidWdTaW5rcywgW2Vycm9yT25seVNpbmtdKVxuXG4vKipcbiAqIGNvbnNvbGVMYXllclx1RkYxQVxuICogLSBcdTUxNjhcdTkxQ0ZcdThDMDNcdThCRDVcdTVDNDJcdUZGMENcdTVDMDZcdTYyNDBcdTY3MDkgRGVidWcgXHU0RThCXHU0RUY2XHU0RUU1IEVmZmVjdCBcdTY1RTVcdTVGRDdcdTVGNjJcdTVGMEZcdThGOTNcdTUxRkFcdUZGMDhsb2dmbXQgLyBzdHJ1Y3R1cmVkXHVGRjA5XHVGRjBDXG4gKiAtIFx1OTAwMlx1NTQwOFx1NEY1Q1x1NEUzQVx1OTAxQVx1NzUyOFx1NzNBRlx1NTg4M1x1RkYwOE5vZGUgLyBcdTZENEJcdThCRDVcdTczQUZcdTU4ODNcdUZGMDlcdTc2ODRcdTg5QzJcdTZENEJcdTVDNDJcdTMwMDJcbiAqL1xuY29uc3QgY29uc29sZVNpbms6IFNpbmsgPSB7XG4gIHJlY29yZDogKGV2ZW50OiBFdmVudCkgPT5cbiAgICBldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJ1xuICAgICAgPyBsaWZlY3ljbGVFcnJvckxvZyhldmVudClcbiAgICAgIDogZXZlbnQudHlwZSA9PT0gJ2RpYWdub3N0aWMnXG4gICAgICAgID8gZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgOiBFZmZlY3QubG9nRGVidWcoeyBkZWJ1Z0V2ZW50OiBldmVudCB9KSxcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnNvbGVMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFtjb25zb2xlU2lua10pXG5cbmNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcblxuLy8gXHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXHU0RTBCXHU3RURGXHU0RTAwXHU3Njg0IENvbnNvbGUgXHU2RTMyXHU2N0QzXHU5MDNCXHU4RjkxXHVGRjBDXHU3NTI4XHU0RThFIERlYnVnU2luayBcdTdGM0FcdTc3MDFcdTVCOUVcdTczQjBcdTRFMEUgYnJvd3NlckNvbnNvbGVMYXllclx1MzAwMlxuY29uc3QgcmVuZGVyQnJvd3NlckNvbnNvbGVFdmVudCA9IChldmVudDogRXZlbnQpOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+IHtcbiAgLy8gdHJhY2U6KiBcdTRFOEJcdTRFRjZcdUZGMUFcdTU3MjhcdTZENEZcdTg5QzhcdTU2NjhcdTRFMkRcdTRFRTVcdTcyRUNcdTdBQ0JcdTUyMDZcdTdFQzRcdTVDNTVcdTc5M0FcdUZGMENcdTRGQkZcdTRFOEUgUGxheWdyb3VuZCAvIERldlRvb2xzIFx1ODlDMlx1NkQ0Qlx1MzAwMlxuICBpZiAodHlwZW9mIChldmVudCBhcyBhbnkpLnR5cGUgPT09ICdzdHJpbmcnICYmIChldmVudCBhcyBhbnkpLnR5cGUuc3RhcnRzV2l0aCgndHJhY2U6JykpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IChldmVudCBhcyBhbnkpLm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICAgIGNvbnN0IHR5cGUgPSAoZXZlbnQgYXMgYW55KS50eXBlXG5cbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICclY1tMb2dpeF0lYyB0cmFjZSAlYycgKyBtb2R1bGVJZCArICclYyAnICsgU3RyaW5nKHR5cGUpLFxuICAgICAgICAnY29sb3I6IzZiNzI4MDtmb250LXdlaWdodDpib2xkJywgLy8gdGFnXG4gICAgICAgICdjb2xvcjojM2I4MmY2JywgLy8gbGFiZWxcbiAgICAgICAgJ2NvbG9yOiM5Y2EzYWYnLCAvLyBtb2R1bGUgaWRcbiAgICAgICAgJ2NvbG9yOiM2YjcyODAnLCAvLyB0eXBlXG4gICAgICApXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coZXZlbnQpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5ncm91cEVuZCgpXG4gICAgfSlcbiAgfVxuXG4gIGlmIChldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJykge1xuICAgIGNvbnN0IG1vZHVsZUlkID0gZXZlbnQubW9kdWxlSWQgPz8gJ3Vua25vd24nXG4gICAgY29uc3QgY2F1c2VQcmV0dHkgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIENhdXNlLnByZXR0eShldmVudC5jYXVzZSBhcyBDYXVzZS5DYXVzZTx1bmtub3duPiwgeyByZW5kZXJFcnJvckNhdXNlOiB0cnVlIH0pXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXZlbnQuY2F1c2UsIG51bGwsIDIpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoZXZlbnQuY2F1c2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpXG5cbiAgICBjb25zdCBrZXkgPSBgJHttb2R1bGVJZH18JHtjYXVzZVByZXR0eX1gXG4gICAgaWYgKGJyb3dzZXJMaWZlY3ljbGVTZWVuLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG4gICAgYnJvd3NlckxpZmVjeWNsZVNlZW4uYWRkKGtleSlcblxuICAgIHJldHVybiBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcbiAgICAgICAgJyVjW0xvZ2l4XSVjIGxpZmVjeWNsZTplcnJvciAlYycgKyBtb2R1bGVJZCxcbiAgICAgICAgJ2NvbG9yOiNlZjQ0NDQ7Zm9udC13ZWlnaHQ6Ym9sZCcsIC8vIHRhZ1xuICAgICAgICAnY29sb3I6I2VmNDQ0NCcsIC8vIGxhYmVsXG4gICAgICAgICdjb2xvcjojOWNhM2FmJywgLy8gbW9kdWxlIGlkXG4gICAgICApXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihjYXVzZVByZXR0eSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmdyb3VwRW5kKClcbiAgICB9KVxuICB9XG5cbiAgaWYgKGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJykge1xuICAgIGNvbnN0IG1vZHVsZUlkID0gZXZlbnQubW9kdWxlSWQgPz8gJ3Vua25vd24nXG4gICAgY29uc3QgZGV0YWlsID0gYGNvZGU9JHtldmVudC5jb2RlfSBtZXNzYWdlPSR7ZXZlbnQubWVzc2FnZX0ke1xuICAgICAgZXZlbnQuYWN0aW9uVGFnID8gYCBhY3Rpb249JHtldmVudC5hY3Rpb25UYWd9YCA6ICcnXG4gICAgfSR7ZXZlbnQuaGludCA/IGBcXG5oaW50OiAke2V2ZW50LmhpbnR9YCA6ICcnfWBcblxuICAgIGNvbnN0IGNvbG9yID1cbiAgICAgIGV2ZW50LnNldmVyaXR5ID09PSAnd2FybmluZycgPyAnY29sb3I6I2Q5NzcwNicgOiBldmVudC5zZXZlcml0eSA9PT0gJ2luZm8nID8gJ2NvbG9yOiMzYjgyZjYnIDogJ2NvbG9yOiNlZjQ0NDQnXG5cbiAgICBjb25zdCBsYWJlbCA9XG4gICAgICBldmVudC5zZXZlcml0eSA9PT0gJ3dhcm5pbmcnXG4gICAgICAgID8gJ2RpYWdub3N0aWMod2FybmluZyknXG4gICAgICAgIDogZXZlbnQuc2V2ZXJpdHkgPT09ICdpbmZvJ1xuICAgICAgICAgID8gJ2RpYWdub3N0aWMoaW5mbyknXG4gICAgICAgICAgOiAnZGlhZ25vc3RpYyhlcnJvciknXG5cbiAgICBjb25zdCBrZXkgPSBgJHttb2R1bGVJZH18JHtldmVudC5jb2RlfXwke2V2ZW50Lm1lc3NhZ2V9YFxuICAgIGlmIChicm93c2VyRGlhZ25vc3RpY1NlZW4uaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgIH1cbiAgICBicm93c2VyRGlhZ25vc3RpY1NlZW4uYWRkKGtleSlcblxuICAgIHJldHVybiBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcbiAgICAgICAgJyVjW0xvZ2l4XSVjICcgKyBsYWJlbCArICclYyBtb2R1bGU9JyArIG1vZHVsZUlkLFxuICAgICAgICAnY29sb3I6IzZiNzI4MDtmb250LXdlaWdodDpib2xkJyxcbiAgICAgICAgY29sb3IsXG4gICAgICAgICdjb2xvcjojOWNhM2FmJyxcbiAgICAgIClcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhkZXRhaWwpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5ncm91cEVuZCgpXG4gICAgfSlcbiAgfVxuXG4gIC8vIFx1NTE3Nlx1NEVENlx1NEU4Qlx1NEVGNlx1RkYxQVx1OUVEOFx1OEJBNFx1NEUwRFx1NTcyOFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NjNBN1x1NTIzNlx1NTNGMFx1OEY5M1x1NTFGQVx1RkYwQ1x1NEVFNVx1NTE0RFx1NTcyOFx1NEUxQVx1NTJBMVx1NUYwMFx1NTNEMVx1NTczQVx1NjY2Rlx1NEUyRFx1OEZDN1x1NEU4RVx1NTQzNVx1OTVGOVx1RkYxQlxuICAvLyBcdTU5ODJcdTk3MDBcdTY3RTVcdTc3MEJcdTUxODVcdTkwRThcdThDMDNcdThCRDVcdTRFOEJcdTRFRjZcdUZGMENcdTUzRUZcdTkwMUFcdThGQzdcdTgxRUFcdTVCOUFcdTRFNDkgRGVidWcgU2luayBcdTYyMTZcdTU3MjggTm9kZSBcdTczQUZcdTU4ODNcdTRFMEJcdTRGN0ZcdTc1MjggY29uc29sZUxheWVyXHUzMDAyXG4gIHJldHVybiBFZmZlY3Qudm9pZFxufVxuXG4vKipcbiAqIFx1NkQ0Rlx1ODlDOFx1NTY2OCBDb25zb2xlIFx1OEMwM1x1OEJENVx1NUM0Mlx1RkYxQVxuICogLSBcdTU3MjhcdTZENEZcdTg5QzhcdTU2NjhcdTczQUZcdTU4ODNcdTRFMEJcdTRGN0ZcdTc1MjggY29uc29sZS5ncm91cENvbGxhcHNlZCArIFx1NUY2OVx1ODI3MiBsYWJlbCBcdTZBMjFcdTYyREYgcHJldHR5IGxvZ2dlciBcdTc2ODRcdTUyMDZcdTdFQzRcdTY1NDhcdTY3OUNcdUZGMUJcbiAqIC0gXHU1NzI4XHU5NzVFXHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXHU0RTBCXHU1NkRFXHU5MDAwXHU1MjMwIGNvbnNvbGVMYXllciBcdTc2ODQgRWZmZWN0IFx1NjVFNVx1NUZEN1x1NUI5RVx1NzNCMFx1MzAwMlxuICovXG5jb25zdCBicm93c2VyQ29uc29sZVNpbms6IFNpbmsgPSB7XG4gIHJlY29yZDogKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGlmICghaXNCcm93c2VyKSB7XG4gICAgICAvLyBcdTk3NUVcdTZENEZcdTg5QzhcdTU2NjhcdTczQUZcdTU4ODNcdUZGMUFcdTkwMDBcdTU2REVcdTUyMzAgRWZmZWN0LmxvZyogXHU3Njg0IGNvbnNvbGVMYXllciBcdTg4NENcdTRFM0FcbiAgICAgIHJldHVybiBldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJ1xuICAgICAgICA/IGxpZmVjeWNsZUVycm9yTG9nKGV2ZW50KVxuICAgICAgICA6IGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJ1xuICAgICAgICAgID8gZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgICA6IEVmZmVjdC5sb2dEZWJ1Zyh7IGRlYnVnRXZlbnQ6IGV2ZW50IH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlckJyb3dzZXJDb25zb2xlRXZlbnQoZXZlbnQpXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCBicm93c2VyQ29uc29sZUxheWVyID0gTGF5ZXIubG9jYWxseVNjb3BlZChjdXJyZW50RGVidWdTaW5rcywgW2Jyb3dzZXJDb25zb2xlU2lua10pXG5cbi8qKlxuICogXHU2RDRGXHU4OUM4XHU1NjY4XHU1M0NCXHU1OTdEXHU3Njg0IExvZ2dlciBcdTVDNDJcdUZGMUFcdTRGN0ZcdTc1MjggRWZmZWN0IFx1NUI5OFx1NjVCOVx1NzY4NCBwcmV0dHkgbG9nZ2VyXHVGRjA4YnJvd3NlciBcdTZBMjFcdTVGMEZcdUZGMDlcdTY2RkZcdTYzNjJcdTlFRDhcdThCQTQgbG9nZ2VyXHUzMDAyXG4gKiAtIFx1NEUwRFx1NTE4RFx1NjI0Qlx1NTE5OSBjb25zb2xlIFx1NjgzN1x1NUYwRlx1RkYwQ1x1NzZGNFx1NjNBNVx1NTkwRFx1NzUyOCBFZmZlY3QgXHU3Njg0XHU1RjY5XHU4MjcyL1x1NTIwNlx1N0VDNFx1NjgzQ1x1NUYwRlx1RkYxQlxuICogLSBcdTU3MjhcdTY3MERcdTUyQTFcdTdBRUZcdTczQUZcdTU4ODNcdTRFMEJcdTRFNUZcdTgwRkRcdTVCODlcdTUxNjhcdTkwMDBcdTUzMTZcdTRFM0FcdTlFRDhcdThCQTQgbG9nZ2VyXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBicm93c2VyUHJldHR5TG9nZ2VyTGF5ZXIgPSBMb2dnZXIucmVwbGFjZShcbiAgTG9nZ2VyLmRlZmF1bHRMb2dnZXIsXG4gIExvZ2dlci5wcmV0dHlMb2dnZXIoeyBtb2RlOiAnYnJvd3NlcicsIGNvbG9yczogdHJ1ZSB9KSxcbilcblxuLyoqXG4gKiBkZWZhdWx0TGF5ZXJcdUZGMUFcbiAqIC0gXHU1MTZDXHU1MTcxXHU5RUQ4XHU4QkE0XHU1QzQyXHVGRjBDXHU1RjUzXHU1MjREXHU3QjQ5XHU1NDBDXHU0RThFIGVycm9yT25seUxheWVyXHVGRjFCXG4gKiAtIFx1NEVDNVx1OEJCMFx1NUY1NSBsaWZlY3ljbGU6ZXJyb3JcdUZGMENcdTkwN0ZcdTUxNERcdTU3MjhcdTlFRDhcdThCQTRcdTYwQzVcdTUxQjVcdTRFMEJcdTVCRjkgYWN0aW9uL3N0YXRlIFx1NjI1M1x1NTM3MFx1NTkyN1x1OTFDRlx1NjVFNVx1NUZEN1x1MzAwMlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdExheWVyID0gZXJyb3JPbmx5TGF5ZXJcblxuZXhwb3J0IGNvbnN0IHJlY29yZCA9IChldmVudDogRXZlbnQpID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBzaW5rcyA9IHlpZWxkKiBGaWJlclJlZi5nZXQoY3VycmVudERlYnVnU2lua3MpXG5cbiAgICAvLyBGYXN0IHBhdGg6IHdoZW4gbm8gc2lua3MgYXJlIGluc3RhbGxlZCwgb25seSBhIHNtYWxsIHN1YnNldCBvZiBldmVudHMgYXJlIGV2ZXIgc3VyZmFjZWQuXG4gICAgLy8gQXZvaWQgcGF5aW5nIHBlci1ldmVudCBGaWJlclJlZiArIGVucmljaG1lbnQgY29zdHMgZm9yIGhpZ2gtZnJlcXVlbmN5IGV2ZW50cyBsaWtlIHN0YXRlOnVwZGF0ZS5cbiAgICBpZiAoc2lua3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJyB8fCBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycpIHtcbiAgICAgICAgICB5aWVsZCogcmVuZGVyQnJvd3NlckNvbnNvbGVFdmVudChldmVudClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJykge1xuICAgICAgICB5aWVsZCogbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJykge1xuICAgICAgICB5aWVsZCogZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGVucmljaGVkID0gZXZlbnQgYXMgRXZlbnRcblxuICAgIGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnREaWFnbm9zdGljc0xldmVsKVxuXG4gICAgLy8gXHU0RTNBIERlYnVnLkV2ZW50IFx1ODg2NVx1NTE2OFx1NTdGQVx1Nzg0MFx1NUI1N1x1NkJCNVx1RkYwOFx1NEVDNVx1NTcyOCBkaWFnbm9zdGljc0xldmVsIT1vZmYgXHU2NUY2XHU1NDJGXHU3NTI4XHVGRjA5XHVGRjFBXG4gICAgLy8gLSB0aW1lc3RhbXBcdUZGMUFcdTc1MjhcdTRFOEUgRGV2dG9vbHMvVGltZWxpbmUvT3ZlcnZpZXcgXHU1MDVBXHU2NUY2XHU5NUY0XHU4MDVBXHU1NDA4XHVGRjBDXHU5MDdGXHU1MTREIFVJIFx1NEZBN1x1NzUyOCBEYXRlLm5vdygpXHUyMDFDXHU5OTk2XHU2QjIxXHU4OUMyXHU1QkRGXHU2NUY2XHU5NUY0XHUyMDFEXHU1QkZDXHU4MUY0XHU1OTMxXHU3NzFGXHVGRjFCXG4gICAgLy8gLSBydW50aW1lTGFiZWxcdUZGMUFcdTY3NjVcdTgxRUEgRmliZXJSZWZcdUZGMENcdTRGQkZcdTRFOEVcdTYzMDkgcnVudGltZSBcdTdFRjRcdTVFQTZcdTUyMDZcdTdFQzRcdUZGMDhcdTRFQzVcdTU3MjhcdTRFOEJcdTRFRjZcdTY3MkFcdTY2M0VcdTVGMEZcdTYzRDBcdTRGOUJcdTY1RjZcdTZDRThcdTUxNjVcdUZGMDlcdTMwMDJcbiAgICBsZXQgbm93OiBudW1iZXIgfCB1bmRlZmluZWRcbiAgICBjb25zdCBnZXROb3cgPSAoKTogbnVtYmVyID0+IHtcbiAgICAgIGlmIChub3cgPT09IHVuZGVmaW5lZCkgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgcmV0dXJuIG5vd1xuICAgIH1cblxuICAgIC8vIGRpYWdub3N0aWNzPW9mZlx1RkYxQVx1NUMzRFx1OTFDRlx1NEZERFx1NjMwMVx1OEZEMVx1OTZGNlx1NjIxMFx1NjcyQ1x1RkYwQ1x1NEUwRFx1NEUzQVx1OUFEOFx1OTg5MVx1NEU4Qlx1NEVGNlx1ODg2NVx1NTE2OCB0aW1lc3RhbXBcdUZGMDhcdTkwN0ZcdTUxNERcdTk4OURcdTU5MTYgRGF0ZS5ub3coKVx1RkYwOVx1MzAwMlxuICAgIC8vIFx1NEY0RVx1OTg5MVx1NEU4Qlx1NEVGNlx1RkYwOGxpZmVjeWNsZTplcnJvci9kaWFnbm9zdGljXHVGRjA5XHU0RUNEXHU1MTQxXHU4QkI4XHU4ODY1XHU1MTY4IHRpbWVzdGFtcFx1RkYwQ1x1NEZCRlx1NEU4RVx1NUI5QVx1NEY0RFx1NEUwRVx1NjM5Mlx1NjdFNVx1MzAwMlxuICAgIGlmIChcbiAgICAgIGVucmljaGVkLnRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAoZGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicgfHwgZW5yaWNoZWQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcicgfHwgZW5yaWNoZWQudHlwZSA9PT0gJ2RpYWdub3N0aWMnKVxuICAgICkge1xuICAgICAgOyhlbnJpY2hlZCBhcyBhbnkpLnRpbWVzdGFtcCA9IGdldE5vdygpXG4gICAgfVxuICAgIGlmIChkaWFnbm9zdGljc0xldmVsICE9PSAnb2ZmJyAmJiBlbnJpY2hlZC5ydW50aW1lTGFiZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcnVudGltZUxhYmVsID0geWllbGQqIEZpYmVyUmVmLmdldChjdXJyZW50UnVudGltZUxhYmVsKVxuICAgICAgaWYgKHJ1bnRpbWVMYWJlbCkge1xuICAgICAgICA7KGVucmljaGVkIGFzIGFueSkucnVudGltZUxhYmVsID0gcnVudGltZUxhYmVsXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVucmljaGVkLnR5cGUgPT09ICdkaWFnbm9zdGljJyAmJiAoZW5yaWNoZWQgYXMgYW55KS50eG5JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB0eG5JZCA9IHlpZWxkKiBGaWJlclJlZi5nZXQoY3VycmVudFR4bklkKVxuICAgICAgaWYgKHR4bklkKSB7XG4gICAgICAgIDsoZW5yaWNoZWQgYXMgYW55KS50eG5JZCA9IHR4bklkXG4gICAgICB9XG4gICAgfVxuICAgIC8vIGxpbmtJZCBcdTRFQzVcdTVCRjkgRWZmZWN0T3AgXHU0RThCXHU0RUY2XHU2NzA5XHU2MTBGXHU0RTQ5XHVGRjFBXHU5MDdGXHU1MTREXHU1NzI4XHU5QUQ4XHU5ODkxXHU0RThCXHU0RUY2XHVGRjA4c3RhdGU6dXBkYXRlIFx1N0I0OVx1RkYwOVx1NEUwQVx1OTg5RFx1NTkxNlx1OEJGQlx1NTNENiBGaWJlclJlZlx1MzAwMlxuICAgIGlmIChcbiAgICAgIGRpYWdub3N0aWNzTGV2ZWwgIT09ICdvZmYnICYmXG4gICAgICAoZW5yaWNoZWQgYXMgYW55KS50eXBlID09PSAndHJhY2U6ZWZmZWN0b3AnICYmXG4gICAgICAoZW5yaWNoZWQgYXMgYW55KS5saW5rSWQgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3QgbGlua0lkID0geWllbGQqIEZpYmVyUmVmLmdldChFZmZlY3RPcENvcmUuY3VycmVudExpbmtJZClcbiAgICAgIGlmIChsaW5rSWQpIHtcbiAgICAgICAgOyhlbnJpY2hlZCBhcyBhbnkpLmxpbmtJZCA9IGxpbmtJZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW5rcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHlpZWxkKiBzaW5rc1swXSEucmVjb3JkKGVucmljaGVkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgeWllbGQqIEVmZmVjdC5mb3JFYWNoKHNpbmtzLCAoc2luaykgPT4gc2luay5yZWNvcmQoZW5yaWNoZWQpLCB7IGRpc2NhcmQ6IHRydWUgfSlcbiAgfSlcblxuLyoqXG4gKiBcdTVDMDZcdTUxODVcdTkwRTggRGVidWcuRXZlbnQgXHU1RjUyXHU0RTAwXHU1MzE2XHU0RTNBIFJ1bnRpbWVEZWJ1Z0V2ZW50UmVmXHVGRjFBXG4gKiAtIFx1NEZCRlx1NEU4RSBEZXZ0b29scyAvIFJ1bnRpbWUgXHU3RURGXHU0RTAwXHU2RDg4XHU4RDM5IERlYnVnIFx1NEU4Qlx1NEVGNlx1RkYxQlxuICogLSBcdTRFMERcdTY1MzlcdTUzRDhcdTUzOUZcdTY3MDkgRGVidWdTaW5rIFx1ODg0Q1x1NEUzQVx1RkYwQ1x1NEVDNVx1NjNEMFx1NEY5Qlx1N0VEM1x1Njc4NFx1NTMxNlx1ODlDNlx1NTZGRVx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgdG9SdW50aW1lRGVidWdFdmVudFJlZiA9IChcbiAgZXZlbnQ6IEV2ZW50LFxuICBvcHRpb25zPzoge1xuICAgIHJlYWRvbmx5IGRpYWdub3N0aWNzTGV2ZWw/OiBEaWFnbm9zdGljc0xldmVsXG4gICAgcmVhZG9ubHkgZXZlbnRTZXE/OiBudW1iZXJcbiAgICByZWFkb25seSByZXNvbHZlQ29udmVyZ2VTdGF0aWNJcj86IChzdGF0aWNJckRpZ2VzdDogc3RyaW5nKSA9PiBDb252ZXJnZVN0YXRpY0lyRXhwb3J0IHwgdW5kZWZpbmVkXG4gICAgcmVhZG9ubHkgb25NZXRhUHJvamVjdGlvbj86IChwcm9qZWN0aW9uOiB7XG4gICAgICByZWFkb25seSBzdGF0czogSnNvblZhbHVlUHJvamVjdGlvblN0YXRzXG4gICAgICByZWFkb25seSBkb3duZ3JhZGU/OiBKc29uRG93bmdyYWRlUmVhc29uXG4gICAgfSkgPT4gdm9pZFxuICB9LFxuKTogUnVudGltZURlYnVnRXZlbnRSZWYgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBkaWFnbm9zdGljc0xldmVsID0gb3B0aW9ucz8uZGlhZ25vc3RpY3NMZXZlbCA/PyAnZnVsbCdcbiAgaWYgKGRpYWdub3N0aWNzTGV2ZWwgPT09ICdvZmYnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgaXNMaWdodExpa2UgPSBkaWFnbm9zdGljc0xldmVsID09PSAnbGlnaHQnIHx8IGRpYWdub3N0aWNzTGV2ZWwgPT09ICdzYW1wbGVkJ1xuXG4gIGNvbnN0IHRpbWVzdGFtcCA9XG4gICAgdHlwZW9mIGV2ZW50LnRpbWVzdGFtcCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGV2ZW50LnRpbWVzdGFtcCkgPyBldmVudC50aW1lc3RhbXAgOiBEYXRlLm5vdygpXG5cbiAgY29uc3QgbW9kdWxlSWRSYXcgPSAoZXZlbnQgYXMgYW55KS5tb2R1bGVJZFxuICBjb25zdCBtb2R1bGVJZCA9IHR5cGVvZiBtb2R1bGVJZFJhdyA9PT0gJ3N0cmluZycgJiYgbW9kdWxlSWRSYXcubGVuZ3RoID4gMCA/IG1vZHVsZUlkUmF3IDogJ3Vua25vd24nXG5cbiAgY29uc3QgaW5zdGFuY2VJZFJhdyA9IChldmVudCBhcyBhbnkpLmluc3RhbmNlSWRcbiAgY29uc3QgaW5zdGFuY2VJZCA9IHR5cGVvZiBpbnN0YW5jZUlkUmF3ID09PSAnc3RyaW5nJyAmJiBpbnN0YW5jZUlkUmF3Lmxlbmd0aCA+IDAgPyBpbnN0YW5jZUlkUmF3IDogJ3Vua25vd24nXG5cbiAgY29uc3QgcnVudGltZUxhYmVsUmF3ID0gKGV2ZW50IGFzIGFueSkucnVudGltZUxhYmVsXG4gIGNvbnN0IHJ1bnRpbWVMYWJlbCA9IHR5cGVvZiBydW50aW1lTGFiZWxSYXcgPT09ICdzdHJpbmcnICYmIHJ1bnRpbWVMYWJlbFJhdy5sZW5ndGggPiAwID8gcnVudGltZUxhYmVsUmF3IDogdW5kZWZpbmVkXG5cbiAgY29uc3QgdHhuU2VxUmF3ID0gKGV2ZW50IGFzIGFueSkudHhuU2VxXG4gIGNvbnN0IHR4blNlcSA9XG4gICAgdHlwZW9mIHR4blNlcVJhdyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHR4blNlcVJhdykgJiYgdHhuU2VxUmF3ID49IDAgPyBNYXRoLmZsb29yKHR4blNlcVJhdykgOiAwXG5cbiAgY29uc3QgdHhuSWRSYXcgPSAoZXZlbnQgYXMgYW55KS50eG5JZFxuICBjb25zdCB0eG5JZCA9XG4gICAgdHlwZW9mIHR4bklkUmF3ID09PSAnc3RyaW5nJyAmJiB0eG5JZFJhdy5sZW5ndGggPiAwXG4gICAgICA/IHR4bklkUmF3XG4gICAgICA6IHR4blNlcSA+IDBcbiAgICAgICAgPyBgJHtpbnN0YW5jZUlkfTo6dCR7dHhuU2VxfWBcbiAgICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBsaW5rSWQgPSAoKCkgPT4ge1xuICAgIGNvbnN0IGxpbmtJZFJhdyA9IChldmVudCBhcyBhbnkpLmxpbmtJZFxuICAgIGlmICh0eXBlb2YgbGlua0lkUmF3ID09PSAnc3RyaW5nJyAmJiBsaW5rSWRSYXcubGVuZ3RoID4gMCkgcmV0dXJuIGxpbmtJZFJhd1xuXG4gICAgLy8gdHJhY2U6Klx1RkYxQVx1NTE0MVx1OEJCOFx1NEVDRSBkYXRhLm1ldGEubGlua0lkIFx1NTE1Q1x1NUU5NVx1NjNEMFx1NTNENlx1RkYwOFx1OTA3Rlx1NTE0RCBVSSBcdTRGQTdcdTZERjFcdTUxNjUgbWV0YSBcdTZERjFcdTZFMEFcdUZGMDlcdTMwMDJcbiAgICBpZiAodHlwZW9mIChldmVudCBhcyBhbnkpLnR5cGUgIT09ICdzdHJpbmcnIHx8ICEoZXZlbnQgYXMgYW55KS50eXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgIGNvbnN0IG1ldGE6IGFueSA9IGRhdGE/Lm1ldGFcbiAgICBjb25zdCBsaW5rSWRGcm9tTWV0YSA9IG1ldGE/LmxpbmtJZFxuICAgIGlmICh0eXBlb2YgbGlua0lkRnJvbU1ldGEgPT09ICdzdHJpbmcnICYmIGxpbmtJZEZyb21NZXRhLmxlbmd0aCA+IDApIHJldHVybiBsaW5rSWRGcm9tTWV0YVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KSgpXG5cbiAgY29uc3QgZXZlbnRTZXFSYXcgPSBvcHRpb25zPy5ldmVudFNlcVxuICBjb25zdCBldmVudFNlcSA9XG4gICAgdHlwZW9mIGV2ZW50U2VxUmF3ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZXZlbnRTZXFSYXcpICYmIGV2ZW50U2VxUmF3ID4gMFxuICAgICAgPyBNYXRoLmZsb29yKGV2ZW50U2VxUmF3KVxuICAgICAgOiBuZXh0RXZlbnRTZXEoKVxuICBjb25zdCBldmVudElkID0gbWFrZUV2ZW50SWQoaW5zdGFuY2VJZCwgZXZlbnRTZXEpXG5cbiAgY29uc3QgYmFzZSA9IHtcbiAgICBldmVudElkLFxuICAgIGV2ZW50U2VxLFxuICAgIG1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQsXG4gICAgcnVudGltZUxhYmVsLFxuICAgIHR4blNlcSxcbiAgICB0eG5JZCxcbiAgICBsaW5rSWQsXG4gICAgdGltZXN0YW1wLFxuICB9IGFzIGNvbnN0XG5cbiAgbGV0IGRvd25ncmFkZTogRG93bmdyYWRlUmVhc29uIHwgdW5kZWZpbmVkXG5cbiAgY29uc3Qgd2l0aERvd25ncmFkZSA9IChyZWY6IE9taXQ8UnVudGltZURlYnVnRXZlbnRSZWYsICdkb3duZ3JhZGUnPik6IFJ1bnRpbWVEZWJ1Z0V2ZW50UmVmID0+IHtcbiAgICBpZiAoIWRvd25ncmFkZSkgcmV0dXJuIHJlZlxuICAgIHJldHVybiB7IC4uLnJlZiwgZG93bmdyYWRlOiB7IHJlYXNvbjogZG93bmdyYWRlIH0gfVxuICB9XG5cbiAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgY2FzZSAnbW9kdWxlOmluaXQnOlxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnbGlmZWN5Y2xlJyxcbiAgICAgICAgbGFiZWw6ICdtb2R1bGU6aW5pdCcsXG4gICAgICB9KVxuICAgIGNhc2UgJ21vZHVsZTpkZXN0cm95JzpcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2xpZmVjeWNsZScsXG4gICAgICAgIGxhYmVsOiAnbW9kdWxlOmRlc3Ryb3knLFxuICAgICAgfSlcbiAgICBjYXNlICdsaWZlY3ljbGU6cGhhc2UnOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnbGlmZWN5Y2xlOnBoYXNlJyB9PlxuICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgPyB7IHR5cGU6ICdsaWZlY3ljbGU6cGhhc2UnLCBwaGFzZTogZS5waGFzZSwgbmFtZTogZS5uYW1lIH1cbiAgICAgICAgOiB7IHR5cGU6ICdsaWZlY3ljbGU6cGhhc2UnLCBwaGFzZTogZS5waGFzZSwgbmFtZTogZS5uYW1lLCBwYXlsb2FkOiBlLnBheWxvYWQgfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdsaWZlY3ljbGUnLFxuICAgICAgICBsYWJlbDogZS5uYW1lLFxuICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhc2UgJ2FjdGlvbjpkaXNwYXRjaCc6IHtcbiAgICAgIGNvbnN0IGFjdGlvbjogYW55ID0gKGV2ZW50IGFzIGFueSkuYWN0aW9uXG4gICAgICBjb25zdCB0YWcgPSBhY3Rpb24/Ll90YWcgPz8gYWN0aW9uPy50eXBlID8/ICdhY3Rpb246ZGlzcGF0Y2gnXG4gICAgICBjb25zdCBsYWJlbCA9IFN0cmluZyh0YWcpXG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSBpc0xpZ2h0TGlrZSA/IHsgYWN0aW9uVGFnOiBsYWJlbCB9IDogeyBhY3Rpb24gfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdhY3Rpb24nLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlICdzdGF0ZTp1cGRhdGUnOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnc3RhdGU6dXBkYXRlJyB9PlxuICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGF0ZTogZS5zdGF0ZSxcbiAgICAgICAgICAgIGRpcnR5U2V0OiBlLmRpcnR5U2V0LFxuICAgICAgICAgICAgcGF0Y2hDb3VudDogZS5wYXRjaENvdW50LFxuICAgICAgICAgICAgY29tbWl0TW9kZTogZS5jb21taXRNb2RlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IGUucHJpb3JpdHksXG4gICAgICAgICAgICBvcmlnaW5LaW5kOiBlLm9yaWdpbktpbmQsXG4gICAgICAgICAgICBvcmlnaW5OYW1lOiBlLm9yaWdpbk5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHN0YXRlOiBlLnN0YXRlLFxuICAgICAgICAgICAgZGlydHlTZXQ6IGUuZGlydHlTZXQsXG4gICAgICAgICAgICBwYXRjaENvdW50OiBlLnBhdGNoQ291bnQsXG4gICAgICAgICAgICBjb21taXRNb2RlOiBlLmNvbW1pdE1vZGUsXG4gICAgICAgICAgICBwcmlvcml0eTogZS5wcmlvcml0eSxcbiAgICAgICAgICAgIG9yaWdpbktpbmQ6IGUub3JpZ2luS2luZCxcbiAgICAgICAgICAgIG9yaWdpbk5hbWU6IGUub3JpZ2luTmFtZSxcbiAgICAgICAgICAgIHRyYWl0U3VtbWFyeTogZS50cmFpdFN1bW1hcnksXG4gICAgICAgICAgICByZXBsYXlFdmVudDogZS5yZXBsYXlFdmVudCxcbiAgICAgICAgICB9XG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIGlmICh0eG5JZCkge1xuICAgICAgICBsYXN0VHhuQnlJbnN0YW5jZS5zZXQoaW5zdGFuY2VJZCwgeyB0eG5JZCwgdHhuU2VxIH0pXG4gICAgICAgIGJhY2tmaWxsUGVuZGluZ1R4bkFsaWdubWVudChpbnN0YW5jZUlkLCB7IHR4bklkLCB0eG5TZXEgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ3N0YXRlJyxcbiAgICAgICAgbGFiZWw6ICdzdGF0ZTp1cGRhdGUnLFxuICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhc2UgJ3Byb2Nlc3M6c3RhcnQnOlxuICAgIGNhc2UgJ3Byb2Nlc3M6c3RvcCc6XG4gICAgY2FzZSAncHJvY2VzczpyZXN0YXJ0JzpcbiAgICBjYXNlICdwcm9jZXNzOnRyaWdnZXInOlxuICAgIGNhc2UgJ3Byb2Nlc3M6ZGlzcGF0Y2gnOlxuICAgIGNhc2UgJ3Byb2Nlc3M6ZXJyb3InOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxcbiAgICAgICAgRXZlbnQsXG4gICAgICAgIHtcbiAgICAgICAgICByZWFkb25seSB0eXBlOlxuICAgICAgICAgICAgfCAncHJvY2VzczpzdGFydCdcbiAgICAgICAgICAgIHwgJ3Byb2Nlc3M6c3RvcCdcbiAgICAgICAgICAgIHwgJ3Byb2Nlc3M6cmVzdGFydCdcbiAgICAgICAgICAgIHwgJ3Byb2Nlc3M6dHJpZ2dlcidcbiAgICAgICAgICAgIHwgJ3Byb2Nlc3M6ZGlzcGF0Y2gnXG4gICAgICAgICAgICB8ICdwcm9jZXNzOmVycm9yJ1xuICAgICAgICB9XG4gICAgICA+XG5cbiAgICAgIGNvbnN0IHRzMiA9IHR5cGVvZiBlLnRpbWVzdGFtcE1zID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZS50aW1lc3RhbXBNcykgPyBlLnRpbWVzdGFtcE1zIDogdGltZXN0YW1wXG5cbiAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IHtcbiAgICAgICAgaWRlbnRpdHk6IGUuaWRlbnRpdHksXG4gICAgICAgIHNldmVyaXR5OiBlLnNldmVyaXR5LFxuICAgICAgICBldmVudFNlcTogZS5ldmVudFNlcSxcbiAgICAgICAgdGltZXN0YW1wTXM6IGUudGltZXN0YW1wTXMsXG4gICAgICAgIHRyaWdnZXI6IGUudHJpZ2dlcixcbiAgICAgICAgZGlzcGF0Y2g6IGUuZGlzcGF0Y2gsXG4gICAgICAgIGVycm9yOiBlLmVycm9yLFxuICAgICAgfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgIGNvbnN0IGVycm9yU3VtbWFyeSA9XG4gICAgICAgIGUudHlwZSA9PT0gJ3Byb2Nlc3M6ZXJyb3InIHx8IGUudHlwZSA9PT0gJ3Byb2Nlc3M6cmVzdGFydCdcbiAgICAgICAgICA/IChlLmVycm9yIGFzIGFueSBhcyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfCB1bmRlZmluZWQpXG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICB0aW1lc3RhbXA6IHRzMixcbiAgICAgICAga2luZDogJ3Byb2Nlc3MnLFxuICAgICAgICBsYWJlbDogZS50eXBlLFxuICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgZXJyb3JTdW1tYXJ5LFxuICAgICAgfSlcbiAgICB9XG4gICAgY2FzZSAnbGlmZWN5Y2xlOmVycm9yJzoge1xuICAgICAgY29uc3QgZSA9IGV2ZW50IGFzIEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogJ2xpZmVjeWNsZTplcnJvcicgfT5cbiAgICAgIGNvbnN0IHN1bW1hcnkgPSB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeShlLmNhdXNlKVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBzdW1tYXJ5LmRvd25ncmFkZSlcbiAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGlzTGlnaHRMaWtlXG4gICAgICAgID8geyB0eXBlOiAnbGlmZWN5Y2xlOmVycm9yJywgcGhhc2U6IGUucGhhc2UsIG5hbWU6IGUuaG9vayB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdHlwZTogJ2xpZmVjeWNsZTplcnJvcicsXG4gICAgICAgICAgICBwaGFzZTogZS5waGFzZSxcbiAgICAgICAgICAgIG5hbWU6IGUuaG9vayxcbiAgICAgICAgICAgIGhvb2s6IGUuaG9vayxcbiAgICAgICAgICAgIHRhc2tJZDogZS50YXNrSWQsXG4gICAgICAgICAgICBvcmlnaW46IGUub3JpZ2luLFxuICAgICAgICAgICAgdHhuU2VxOiBlLnR4blNlcSxcbiAgICAgICAgICAgIG9wU2VxOiBlLm9wU2VxLFxuICAgICAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnbGlmZWN5Y2xlJyxcbiAgICAgICAgbGFiZWw6ICdsaWZlY3ljbGU6ZXJyb3InLFxuICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgZXJyb3JTdW1tYXJ5OiBzdW1tYXJ5LmVycm9yU3VtbWFyeSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhc2UgJ2RpYWdub3N0aWMnOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnZGlhZ25vc3RpYycgfT5cbiAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IHtcbiAgICAgICAgY29kZTogZS5jb2RlLFxuICAgICAgICBzZXZlcml0eTogZS5zZXZlcml0eSxcbiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICBoaW50OiBlLmhpbnQsXG4gICAgICAgIGFjdGlvblRhZzogZS5hY3Rpb25UYWcsXG4gICAgICAgIGtpbmQ6IGUua2luZCxcbiAgICAgICAgdHJpZ2dlcjogZS50cmlnZ2VyLFxuICAgICAgfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdkaWFnbm9zdGljJyxcbiAgICAgICAgbGFiZWw6IGUuY29kZSxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBpZiAodHlwZW9mIGV2ZW50LnR5cGUgIT09ICdzdHJpbmcnIHx8ICFldmVudC50eXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6dHhuLWxhbmVcdUZGMUFUeG4gTGFuZXMgXHU3Njg0IFNsaW0gXHU4QkMxXHU2MzZFXHVGRjA4bGFuZS9iYWNrbG9nL3JlYXNvbnNcdUZGMDlcdUZGMENcdTc1MjhcdTRFOEUgRGV2dG9vbHMgXHU2QzQ3XHU2MDNCXHU0RTBFXHU3OUJCXHU3RUJGXHU1QkZDXHU1MUZBXHUzMDAyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOnR4bi1sYW5lJykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IGV2aWRlbmNlID0gZGF0YT8uZXZpZGVuY2UgPz8gZGF0YVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShldmlkZW5jZSlcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIGNvbnN0IGxhYmVsID1cbiAgICAgICAgICB0eXBlb2YgZXZpZGVuY2U/LmtpbmQgPT09ICdzdHJpbmcnICYmIGV2aWRlbmNlLmtpbmQubGVuZ3RoID4gMCA/IFN0cmluZyhldmlkZW5jZS5raW5kKSA6ICd0eG4tbGFuZSdcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAndHhuLWxhbmUnLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTpyZWFjdC1yZW5kZXIgLyB0cmFjZTpyZWFjdC1zZWxlY3Rvclx1RkYxQVx1NTNFQVx1NEZERFx1NzU1OSBTbGltIG1ldGFcdUZGMDhcdTVCNTdcdTZCQjVcdTg4QzFcdTUyNkFcdTc1MzEgSnNvblZhbHVlIFx1NjI5NVx1NUY3MVx1NjI3Rlx1NjJDNVx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTpyZWFjdC1yZW5kZXInIHx8IGV2ZW50LnR5cGUgPT09ICd0cmFjZTpyZWFjdC1zZWxlY3RvcicpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUoXG4gICAgICAgICAgaXNMaWdodExpa2VcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudExhYmVsOiBkYXRhPy5jb21wb25lbnRMYWJlbCxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcktleTogZGF0YT8uc2VsZWN0b3JLZXksXG4gICAgICAgICAgICAgICAgZmllbGRQYXRoczogZGF0YT8uZmllbGRQYXRocyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcklkOiBkYXRhPy5zZWxlY3RvcklkLFxuICAgICAgICAgICAgICAgIGxhbmU6IGRhdGE/LmxhbmUsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IGRhdGE/LnByb2R1Y2VyLFxuICAgICAgICAgICAgICAgIGZhbGxiYWNrUmVhc29uOiBkYXRhPy5mYWxsYmFja1JlYXNvbixcbiAgICAgICAgICAgICAgICByZWFkc0RpZ2VzdDogZGF0YT8ucmVhZHNEaWdlc3QsXG4gICAgICAgICAgICAgICAgZXF1YWxzS2luZDogZGF0YT8uZXF1YWxzS2luZCxcbiAgICAgICAgICAgICAgICBzdHJpY3RNb2RlUGhhc2U6IGRhdGE/LnN0cmljdE1vZGVQaGFzZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50TGFiZWw6IGRhdGE/LmNvbXBvbmVudExhYmVsLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yS2V5OiBkYXRhPy5zZWxlY3RvcktleSxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGhzOiBkYXRhPy5maWVsZFBhdGhzLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9ySWQ6IGRhdGE/LnNlbGVjdG9ySWQsXG4gICAgICAgICAgICAgICAgbGFuZTogZGF0YT8ubGFuZSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogZGF0YT8ucHJvZHVjZXIsXG4gICAgICAgICAgICAgICAgZmFsbGJhY2tSZWFzb246IGRhdGE/LmZhbGxiYWNrUmVhc29uLFxuICAgICAgICAgICAgICAgIHJlYWRzRGlnZXN0OiBkYXRhPy5yZWFkc0RpZ2VzdCxcbiAgICAgICAgICAgICAgICBlcXVhbHNLaW5kOiBkYXRhPy5lcXVhbHNLaW5kLFxuICAgICAgICAgICAgICAgIHN0cmljdE1vZGVQaGFzZTogZGF0YT8uc3RyaWN0TW9kZVBoYXNlLFxuICAgICAgICAgICAgICAgIG1ldGE6IGRhdGE/Lm1ldGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgICBjb25zdCBsYWJlbCA9XG4gICAgICAgICAgdHlwZW9mIGRhdGE/LmNvbXBvbmVudExhYmVsID09PSAnc3RyaW5nJyAmJiBkYXRhLmNvbXBvbmVudExhYmVsLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gZGF0YS5jb21wb25lbnRMYWJlbFxuICAgICAgICAgICAgOiBldmVudC50eXBlID09PSAndHJhY2U6cmVhY3Qtc2VsZWN0b3InXG4gICAgICAgICAgICAgID8gJ3JlYWN0LXNlbGVjdG9yJ1xuICAgICAgICAgICAgICA6ICdyZWFjdC1yZW5kZXInXG4gICAgICAgIGNvbnN0IGxhc3QgPSBsYXN0VHhuQnlJbnN0YW5jZS5nZXQoaW5zdGFuY2VJZClcbiAgICAgICAgY29uc3QgdHhuU2VxRnJvbU1ldGEgPVxuICAgICAgICAgIHR5cGVvZiBkYXRhPy5tZXRhPy50eG5TZXEgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShkYXRhLm1ldGEudHhuU2VxKSAmJiBkYXRhLm1ldGEudHhuU2VxID49IDBcbiAgICAgICAgICAgID8gTWF0aC5mbG9vcihkYXRhLm1ldGEudHhuU2VxKVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgdHhuSWRGcm9tTWV0YSA9XG4gICAgICAgICAgdHlwZW9mIGRhdGE/Lm1ldGE/LnR4bklkID09PSAnc3RyaW5nJyAmJiBkYXRhLm1ldGEudHhuSWQubGVuZ3RoID4gMCA/IGRhdGEubWV0YS50eG5JZCA6IHVuZGVmaW5lZFxuICAgICAgICBjb25zdCB0eG5JZEFsaWduZWQgPSB0eG5JZEZyb21NZXRhID8/IGJhc2UudHhuSWQgPz8gbGFzdD8udHhuSWRcbiAgICAgICAgY29uc3QgdHhuU2VxQWxpZ25lZCA9IHR4blNlcUZyb21NZXRhID8/IChiYXNlLnR4blNlcSA+IDAgPyBiYXNlLnR4blNlcSA6IChsYXN0Py50eG5TZXEgPz8gYmFzZS50eG5TZXEpKVxuICAgICAgICBjb25zdCByZWYgPSB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHR4bklkOiB0eG5JZEFsaWduZWQsXG4gICAgICAgICAgdHhuU2VxOiB0eG5TZXFBbGlnbmVkLFxuICAgICAgICAgIGtpbmQ6IGV2ZW50LnR5cGUgPT09ICd0cmFjZTpyZWFjdC1zZWxlY3RvcicgPyAncmVhY3Qtc2VsZWN0b3InIDogJ3JlYWN0LXJlbmRlcicsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGluc3RhbmNlSWQgIT09ICd1bmtub3duJyAmJiAocmVmLnR4bklkID09IG51bGwgfHwgcmVmLnR4blNlcSA8PSAwKSkge1xuICAgICAgICAgIGVucXVldWVQZW5kaW5nVHhuQWxpZ25tZW50KGluc3RhbmNlSWQsIHJlZilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWZcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6c2VsZWN0b3I6ZXZhbFx1RkYxQVNlbGVjdG9yR3JhcGggXHU1NzI4IGNvbW1pdCBcdTUxODVcdTc2ODRcdTkxQ0RcdTdCOTcvXHU1NDdEXHU0RTJEXHU4QkMxXHU2MzZFXHVGRjA4XHU3NTI4XHU0RThFIHR4blx1MjE5MnNlbGVjdG9yXHUyMTkycmVuZGVyIFx1NTZFMFx1Njc5Q1x1OTRGRVx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTpzZWxlY3RvcjpldmFsJykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IHtcbiAgICAgICAgICBzZWxlY3RvcklkOiBkYXRhPy5zZWxlY3RvcklkLFxuICAgICAgICAgIGxhbmU6IGRhdGE/LmxhbmUsXG4gICAgICAgICAgcHJvZHVjZXI6IGRhdGE/LnByb2R1Y2VyLFxuICAgICAgICAgIGZhbGxiYWNrUmVhc29uOiBkYXRhPy5mYWxsYmFja1JlYXNvbixcbiAgICAgICAgICByZWFkc0RpZ2VzdDogZGF0YT8ucmVhZHNEaWdlc3QsXG4gICAgICAgICAgZXF1YWxzS2luZDogZGF0YT8uZXF1YWxzS2luZCxcbiAgICAgICAgICBjaGFuZ2VkOiBkYXRhPy5jaGFuZ2VkLFxuICAgICAgICAgIGV2YWxNczogZGF0YT8uZXZhbE1zLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6ICdkZXZ0b29scycsXG4gICAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOmV4ZWMtdm1cdUZGMUFFeGVjIFZNIFx1NTQ3RFx1NEUyRC9cdTY3MkFcdTU0N0RcdTRFMkRcdThCQzFcdTYzNkVcdUZGMDgwNDlcdUZGMDlcdTMwMDJsaWdodCBcdTY4NjNcdTRGNERcdTRFNUZcdTRGRERcdTc1NTlcdTY3MDBcdTVDMEZcdTY0NThcdTg5ODFcdTVCNTdcdTZCQjVcdTMwMDJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6ZXhlYy12bScpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBtZXRhSW5wdXQgPSB7XG4gICAgICAgICAgdmVyc2lvbjogZGF0YT8udmVyc2lvbixcbiAgICAgICAgICBzdGFnZTogZGF0YT8uc3RhZ2UsXG4gICAgICAgICAgaGl0OiBkYXRhPy5oaXQsXG4gICAgICAgICAgcmVhc29uQ29kZTogZGF0YT8ucmVhc29uQ29kZSA/PyBkYXRhPy5yZWFzb24sXG4gICAgICAgICAgcmVhc29uRGV0YWlsOiBkYXRhPy5yZWFzb25EZXRhaWwsXG4gICAgICAgICAgZXhlY0lyVmVyc2lvbjogZGF0YT8uZXhlY0lyVmVyc2lvbixcbiAgICAgICAgICBleGVjSXJIYXNoOiBkYXRhPy5leGVjSXJIYXNoLFxuICAgICAgICAgIHNlcnZpY2VJZDogZGF0YT8uc2VydmljZUlkLFxuICAgICAgICAgIGltcGxJZDogZGF0YT8uaW1wbElkLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6ICdkZXZ0b29scycsXG4gICAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOnRyYWl0OmNvbnZlcmdlXHVGRjFBXHU2NTM2XHU2NTVCXHU4QkMxXHU2MzZFXHU1RkM1XHU5ODdCXHU1M0VGXHU1QkZDXHU1MUZBXHVGRjA4SnNvblZhbHVlIFx1Nzg2Q1x1OTVFOFx1RkYwOVx1RkYwQ1x1NUU3Nlx1NTcyOCBsaWdodCBcdTY4NjNcdTRGNERcdTg4QzFcdTUyNkFcdTkxQ0RcdTVCNTdcdTZCQjVcdTMwMDJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6dHJhaXQ6Y29udmVyZ2UnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVEaXJ0eVJvb3RQYXRocyA9IChhcmdzOiB7XG4gICAgICAgICAgcmVhZG9ubHkgc3RhdGljSXJEaWdlc3Q6IHVua25vd25cbiAgICAgICAgICByZWFkb25seSByb290SWRzOiB1bmtub3duXG4gICAgICAgIH0pOiBSZWFkb25seUFycmF5PEpzb25WYWx1ZT4gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmUgPSBvcHRpb25zPy5yZXNvbHZlQ29udmVyZ2VTdGF0aWNJclxuICAgICAgICAgIGlmICghcmVzb2x2ZSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IGRpZ2VzdCA9IGFyZ3Muc3RhdGljSXJEaWdlc3RcbiAgICAgICAgICBpZiAodHlwZW9mIGRpZ2VzdCAhPT0gJ3N0cmluZycgfHwgZGlnZXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3Qgcm9vdElkcyA9IGFyZ3Mucm9vdElkc1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb290SWRzKSB8fCByb290SWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3QgaXIgPSByZXNvbHZlKGRpZ2VzdCkgYXMgQ29udmVyZ2VTdGF0aWNJckV4cG9ydCB8IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IGZpZWxkUGF0aHMgPSAoaXIgYXMgYW55KT8uZmllbGRQYXRocyBhcyB1bmtub3duXG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkUGF0aHMpIHx8IGZpZWxkUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgICBjb25zdCBvdXQ6IEFycmF5PEpzb25WYWx1ZT4gPSBbXVxuICAgICAgICAgIGZvciAoY29uc3QgaWQgb2Ygcm9vdElkcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0Zpbml0ZShpZCkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCBpZHggPSBNYXRoLmZsb29yKGlkKVxuICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IGZpZWxkUGF0aHMubGVuZ3RoKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGZpZWxkUGF0aHNbaWR4XVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgICAgICAgICAgb3V0LnB1c2gocGF0aCBhcyBhbnkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG91dC5sZW5ndGggPiAwID8gb3V0IDogdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnJpY2hEaXJ0eVJvb3RQYXRocyA9ICh2YWx1ZTogSnNvblZhbHVlKTogSnNvblZhbHVlID0+IHtcbiAgICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gICAgICAgICAgY29uc3QgYW55VmFsdWUgPSB2YWx1ZSBhcyBhbnlcbiAgICAgICAgICBjb25zdCBkaXJ0eSA9IGFueVZhbHVlLmRpcnR5XG4gICAgICAgICAgaWYgKCFkaXJ0eSB8fCB0eXBlb2YgZGlydHkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZGlydHkpKSByZXR1cm4gdmFsdWVcblxuICAgICAgICAgIGNvbnN0IGRpcnR5Um9vdFBhdGhzID0gcmVzb2x2ZURpcnR5Um9vdFBhdGhzKHtcbiAgICAgICAgICAgIHN0YXRpY0lyRGlnZXN0OiBhbnlWYWx1ZS5zdGF0aWNJckRpZ2VzdCxcbiAgICAgICAgICAgIHJvb3RJZHM6IGRpcnR5Py5yb290SWRzLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKCFkaXJ0eVJvb3RQYXRocykgcmV0dXJuIHZhbHVlXG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYW55VmFsdWUsXG4gICAgICAgICAgICBkaXJ0eToge1xuICAgICAgICAgICAgICAuLi4oZGlydHkgYXMgYW55KSxcbiAgICAgICAgICAgICAgcm9vdFBhdGhzOiBkaXJ0eVJvb3RQYXRocyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBKc29uVmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmlwSGVhdnlMaWdodCA9ICh2YWx1ZTogSnNvblZhbHVlKTogSnNvblZhbHVlID0+IHtcbiAgICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gICAgICAgICAgY29uc3QgYW55VmFsdWUgPSB2YWx1ZSBhcyBhbnlcbiAgICAgICAgICBjb25zdCBkaXJ0eSA9IGFueVZhbHVlLmRpcnR5XG4gICAgICAgICAgY29uc3QgZGlydHlSb290UGF0aHMgPSByZXNvbHZlRGlydHlSb290UGF0aHMoe1xuICAgICAgICAgICAgc3RhdGljSXJEaWdlc3Q6IGFueVZhbHVlLnN0YXRpY0lyRGlnZXN0LFxuICAgICAgICAgICAgcm9vdElkczogZGlydHk/LnJvb3RJZHMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBkaXJ0eVNsaW0gPVxuICAgICAgICAgICAgZGlydHkgJiYgdHlwZW9mIGRpcnR5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkaXJ0eSlcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBkaXJ0eUFsbDogKGRpcnR5IGFzIGFueSkuZGlydHlBbGwsXG4gICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIChkaXJ0eSBhcyBhbnkpLnJlYXNvbiA9PT0gJ3N0cmluZycgPyB7IHJlYXNvbjogKGRpcnR5IGFzIGFueSkucmVhc29uIH0gOiBudWxsKSxcbiAgICAgICAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KChkaXJ0eSBhcyBhbnkpLnJvb3RJZHMpID8geyByb290SWRzOiAoZGlydHkgYXMgYW55KS5yb290SWRzIH0gOiBudWxsKSxcbiAgICAgICAgICAgICAgICAgIC4uLih0eXBlb2YgKGRpcnR5IGFzIGFueSkucm9vdElkc1RydW5jYXRlZCA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgICAgICAgICAgICAgID8geyByb290SWRzVHJ1bmNhdGVkOiAoZGlydHkgYXMgYW55KS5yb290SWRzVHJ1bmNhdGVkIH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgICAgIC4uLihkaXJ0eVJvb3RQYXRocyA/IHsgcm9vdFBhdGhzOiBkaXJ0eVJvb3RQYXRocyB9IDogbnVsbCksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3QgeyB0b3AzLCBkaXJ0eVJvb3RzLCAuLi5yZXN0IH0gPSBhbnlWYWx1ZVxuICAgICAgICAgIHJldHVybiAoZGlydHlTbGltID8geyAuLi5yZXN0LCBkaXJ0eTogZGlydHlTbGltIH0gOiByZXN0KSBhcyBKc29uVmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmlwSGVhdnlTYW1wbGVkID0gKHZhbHVlOiBKc29uVmFsdWUpOiBKc29uVmFsdWUgPT4ge1xuICAgICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cbiAgICAgICAgICBjb25zdCBhbnlWYWx1ZSA9IHZhbHVlIGFzIGFueVxuICAgICAgICAgIGNvbnN0IGRpcnR5ID0gYW55VmFsdWUuZGlydHlcbiAgICAgICAgICBjb25zdCBkaXJ0eVNsaW0gPVxuICAgICAgICAgICAgZGlydHkgJiYgdHlwZW9mIGRpcnR5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkaXJ0eSlcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBkaXJ0eUFsbDogKGRpcnR5IGFzIGFueSkuZGlydHlBbGwsXG4gICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIChkaXJ0eSBhcyBhbnkpLnJlYXNvbiA9PT0gJ3N0cmluZycgPyB7IHJlYXNvbjogKGRpcnR5IGFzIGFueSkucmVhc29uIH0gOiBudWxsKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgICBjb25zdCB7IGRpcnR5Um9vdHMsIC4uLnJlc3QgfSA9IGFueVZhbHVlXG4gICAgICAgICAgcmV0dXJuIChkaXJ0eVNsaW0gPyB7IC4uLnJlc3QsIGRpcnR5OiBkaXJ0eVNsaW0gfSA6IHJlc3QpIGFzIEpzb25WYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IChldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICd0cmFjZTp0cmFpdDpjb252ZXJnZScgfT4pLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID1cbiAgICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSAnbGlnaHQnXG4gICAgICAgICAgICA/IHN0cmlwSGVhdnlMaWdodChkYXRhKVxuICAgICAgICAgICAgOiBkaWFnbm9zdGljc0xldmVsID09PSAnc2FtcGxlZCdcbiAgICAgICAgICAgICAgPyBzdHJpcEhlYXZ5U2FtcGxlZChkYXRhKVxuICAgICAgICAgICAgICA6IGVucmljaERpcnR5Um9vdFBhdGhzKGRhdGEpXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAndHJhaXQ6Y29udmVyZ2UnLFxuICAgICAgICAgIGxhYmVsOiAndHJhaXQ6Y29udmVyZ2UnLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTp0cmFpdDpjaGVja1x1RkYxQVx1NjgyMVx1OUE4Q1x1OEJDQVx1NjVBRFx1NUZDNVx1OTg3Qlx1NTNFRlx1NUJGQ1x1NTFGQVx1RkYwQ1x1NUU3Nlx1NTcyOCBsaWdodCBcdTY4NjNcdTRGNERcdTRGRERcdTYzMDEgU2xpbVx1RkYwOFx1NEUwRFx1NEUyMlx1NTE3M1x1OTUyRVx1NUI1N1x1NkJCNVx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTp0cmFpdDpjaGVjaycpIHtcbiAgICAgICAgY29uc3Qgc3RyaXBIZWF2eSA9ICh2YWx1ZTogSnNvblZhbHVlKTogSnNvblZhbHVlID0+IHtcbiAgICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuICAgICAgICAgIGNvbnN0IGFueVZhbHVlID0gdmFsdWUgYXMgYW55XG4gICAgICAgICAgY29uc3QgZGVncmFkZWQgPSBhbnlWYWx1ZS5kZWdyYWRlZFxuICAgICAgICAgIGNvbnN0IGRlZ3JhZGVkU2xpbSA9XG4gICAgICAgICAgICBkZWdyYWRlZCAmJiB0eXBlb2YgZGVncmFkZWQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRlZ3JhZGVkKVxuICAgICAgICAgICAgICA/IHsga2luZDogKGRlZ3JhZGVkIGFzIGFueSkua2luZCB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgICBjb25zdCB7IGRlZ3JhZGVkOiBfZGVncmFkZWQsIC4uLnJlc3QgfSA9IGFueVZhbHVlXG4gICAgICAgICAgcmV0dXJuIChkZWdyYWRlZFNsaW0gPyB7IC4uLnJlc3QsIGRlZ3JhZGVkOiBkZWdyYWRlZFNsaW0gfSA6IHJlc3QpIGFzIEpzb25WYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IChldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICd0cmFjZTp0cmFpdDpjaGVjaycgfT4pLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2UgPyBzdHJpcEhlYXZ5KGRhdGEpIDogZGF0YVxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ3RyYWl0OmNoZWNrJyxcbiAgICAgICAgICBsYWJlbDogJ3RyYWl0OmNoZWNrJyxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6dHJhaXQ6dmFsaWRhdGVcdUZGMUFcdTY4MjFcdTlBOENcdTUxQjNcdTdCNTZcdTY0NThcdTg5ODFcdTVGQzVcdTk4N0JcdTUzRUZcdTVCRkNcdTUxRkFcdUZGMENcdTRFMTRcdTU3MjggbGlnaHQgXHU2ODYzXHU0RjREXHU0RkREXHU2MzAxIFNsaW1cdUZGMDhcdTlFRDhcdThCQTRcdTRFMERcdTY0M0FcdTVFMjZcdTkxQ0RcdTVCNTdcdTZCQjVcdUZGMDlcdTMwMDJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6dHJhaXQ6dmFsaWRhdGUnKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAoZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAndHJhY2U6dHJhaXQ6dmFsaWRhdGUnIH0+KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShkYXRhKVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ3RyYWl0OnZhbGlkYXRlJyxcbiAgICAgICAgICBsYWJlbDogJ3RyYWl0OnZhbGlkYXRlJyxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6bW9kdWxlOnRyYWl0c1x1RkYxQXRyYWl0cyBcdTY3MDBcdTdFQzhcdTVGRUJcdTcxNjdcdTVGQzVcdTk4N0JcdTUzRUZcdTVCRkNcdTUxRkFcdUZGMENcdTVFNzZcdTU3MjggbGlnaHQgXHU2ODYzXHU0RjREXHU0RkREXHU2MzAxIFNsaW1cdUZGMDhkaWdlc3QvY291bnRcdUZGMDlcdTMwMDJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6bW9kdWxlOnRyYWl0cycpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBtZXRhSW5wdXQgPSBpc0xpZ2h0TGlrZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkaWdlc3Q6IGRhdGE/LmRpZ2VzdCxcbiAgICAgICAgICAgICAgY291bnQ6IGRhdGE/LmNvdW50LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBkaWdlc3Q6IGRhdGE/LmRpZ2VzdCxcbiAgICAgICAgICAgICAgY291bnQ6IGRhdGE/LmNvdW50LFxuICAgICAgICAgICAgICB0cmFpdHM6IGRhdGE/LnRyYWl0cyxcbiAgICAgICAgICAgICAgcHJvdmVuYW5jZUluZGV4OiBkYXRhPy5wcm92ZW5hbmNlSW5kZXgsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6ICdkZXZ0b29scycsXG4gICAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOm1vZHVsZTp0cmFpdHM6Y29uZmxpY3RcdUZGMUFcdTUxQjJcdTdBODFcdTdFQzZcdTgyODJcdTVGQzVcdTk4N0JcdTUzRUZcdTVCRkNcdTUxRkFcdUZGMENcdTkwN0ZcdTUxNERcdTRGOURcdThENTYgbGlmZWN5Y2xlOmVycm9yIFx1NzY4NFx1NjIyQVx1NjVBRCBtZXNzYWdlXHUzMDAyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOm1vZHVsZTp0cmFpdHM6Y29uZmxpY3QnKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZmxpY3RDb3VudDogZGF0YT8uY29uZmxpY3RDb3VudCxcbiAgICAgICAgICAgICAgdHJhaXRJZHM6IGRhdGE/LnRyYWl0SWRzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjb25mbGljdENvdW50OiBkYXRhPy5jb25mbGljdENvdW50LFxuICAgICAgICAgICAgICBjb25mbGljdHM6IGRhdGE/LmNvbmZsaWN0cyxcbiAgICAgICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ2RldnRvb2xzJyxcbiAgICAgICAgICBsYWJlbDogZXZlbnQudHlwZSxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6bW9kdWxlOmRlc2NyaXB0b3JcdUZGMUFcdTU3MjggbGlnaHQgXHU2ODYzXHU0RjREXHU0RTVGXHU0RkREXHU3NTU5XHU1MTczXHU5NTJFXHU5NTFBXHU3MEI5XHVGRjA4XHU5MDdGXHU1MTREIGRhdGEgXHU4OEFCXHU1QjhDXHU1MTY4XHU4OEMxXHU1MjZBXHVGRjA5XHUzMDAyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOm1vZHVsZTpkZXNjcmlwdG9yJykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGlzTGlnaHRMaWtlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGlkOiBkYXRhPy5pZCxcbiAgICAgICAgICAgICAgdHJhaXRzOiBkYXRhPy50cmFpdHMsXG4gICAgICAgICAgICAgIHNvdXJjZTogZGF0YT8uc291cmNlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogeyBkYXRhIH1cblxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ2RldnRvb2xzJyxcbiAgICAgICAgICBsYWJlbDogZXZlbnQudHlwZSxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6ZWZmZWN0b3BcdUZGMUFcdTRGRERcdTc1NTkgU2xpbSBvcCBtZXRhXHVGRjBDXHU1RTc2XHU0RjE4XHU1MTQ4XHU0RjdGXHU3NTI4IEVmZmVjdE9wLm1ldGEubW9kdWxlSWRcdUZGMDhcdTgyRTVcdTVCNThcdTU3MjhcdUZGMDlcdTMwMDJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6ZWZmZWN0b3AnKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3Qgb3BNZXRhOiBhbnkgPSBkYXRhPy5tZXRhXG4gICAgICAgIGNvbnN0IG9wS2luZCA9IChkYXRhPy5raW5kID8/ICdzZXJ2aWNlJykgYXMgUnVudGltZURlYnVnRXZlbnRLaW5kXG4gICAgICAgIGNvbnN0IGxhYmVsID0gdHlwZW9mIGRhdGE/Lm5hbWUgPT09ICdzdHJpbmcnID8gZGF0YS5uYW1lIDogJ2VmZmVjdG9wJ1xuICAgICAgICBjb25zdCBtb2R1bGVJZDIgPSB0eXBlb2Ygb3BNZXRhPy5tb2R1bGVJZCA9PT0gJ3N0cmluZycgPyBvcE1ldGEubW9kdWxlSWQgOiBtb2R1bGVJZFxuICAgICAgICBjb25zdCB0eG5JZDIgPSB0eXBlb2Ygb3BNZXRhPy50eG5JZCA9PT0gJ3N0cmluZycgJiYgb3BNZXRhLnR4bklkLmxlbmd0aCA+IDAgPyBvcE1ldGEudHhuSWQgOiBiYXNlLnR4bklkXG4gICAgICAgIGNvbnN0IHR4blNlcTIgPVxuICAgICAgICAgIHR5cGVvZiBvcE1ldGE/LnR4blNlcSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKG9wTWV0YS50eG5TZXEpICYmIG9wTWV0YS50eG5TZXEgPj0gMFxuICAgICAgICAgICAgPyBNYXRoLmZsb29yKG9wTWV0YS50eG5TZXEpXG4gICAgICAgICAgICA6IGJhc2UudHhuU2VxXG5cbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgaWQ6IGRhdGE/LmlkLFxuICAgICAgICAgICAgICBraW5kOiBkYXRhPy5raW5kLFxuICAgICAgICAgICAgICBuYW1lOiBkYXRhPy5uYW1lLFxuICAgICAgICAgICAgICBtZXRhOiBvcE1ldGEsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGlkOiBkYXRhPy5pZCxcbiAgICAgICAgICAgICAga2luZDogZGF0YT8ua2luZCxcbiAgICAgICAgICAgICAgbmFtZTogZGF0YT8ubmFtZSxcbiAgICAgICAgICAgICAgcGF5bG9hZDogZGF0YT8ucGF5bG9hZCxcbiAgICAgICAgICAgICAgbWV0YTogb3BNZXRhLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBtb2R1bGVJZDogbW9kdWxlSWQyLFxuICAgICAgICAgIHR4bklkOiB0eG5JZDIsXG4gICAgICAgICAgdHhuU2VxOiB0eG5TZXEyLFxuICAgICAgICAgIGtpbmQ6IG9wS2luZCxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gXHU1MTc2XHU0RUQ2IHRyYWNlOipcdUZGMUFcdTdFREZcdTRFMDBcdTVGNTJcdTdDN0JcdTRFM0EgZGV2dG9vbHNcdUZGMENcdTVFNzZcdTYzMDlcdTY4NjNcdTRGNERcdTg4QzFcdTUyNkEgbWV0YVx1MzAwMlxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKFxuICAgICAgICBpc0xpZ2h0TGlrZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGRhdGE6IChldmVudCBhcyBhbnkpLmRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2RldnRvb2xzJyxcbiAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDYXVzZSB9IGZyb20gJ2VmZmVjdCdcblxuZXhwb3J0IHR5cGUgRG93bmdyYWRlUmVhc29uID0gJ25vbl9zZXJpYWxpemFibGUnIHwgJ292ZXJzaXplZCcgfCAndW5rbm93bidcblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmdcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZ1xuICByZWFkb25seSBjb2RlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvclN1bW1hcnlSZXN1bHQge1xuICByZWFkb25seSBlcnJvclN1bW1hcnk6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICByZWFkb25seSBkb3duZ3JhZGU/OiBEb3duZ3JhZGVSZWFzb25cbn1cblxuY29uc3QgdHJ1bmNhdGUgPSAodmFsdWU6IHN0cmluZywgbWF4TGVuOiBudW1iZXIpOiB7IHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7IHJlYWRvbmx5IHRydW5jYXRlZDogYm9vbGVhbiB9ID0+IHtcbiAgaWYgKHZhbHVlLmxlbmd0aCA8PSBtYXhMZW4pIHJldHVybiB7IHZhbHVlLCB0cnVuY2F0ZWQ6IGZhbHNlIH1cbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLnNsaWNlKDAsIG1heExlbiksIHRydW5jYXRlZDogdHJ1ZSB9XG59XG5cbmNvbnN0IHNhZmVTdHJpbmdpZnkgPSAodmFsdWU6IHVua25vd24pOiB7IHJlYWRvbmx5IG9rOiB0cnVlOyByZWFkb25seSBqc29uOiBzdHJpbmcgfSB8IHsgcmVhZG9ubHkgb2s6IGZhbHNlIH0gPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCBqc29uOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBvazogZmFsc2UgfVxuICB9XG59XG5cbmNvbnN0IGdldE1lc3NhZ2VGcm9tVW5rbm93biA9IChjYXVzZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2YgY2F1c2UgPT09ICdzdHJpbmcnKSByZXR1cm4gY2F1c2VcbiAgaWYgKHR5cGVvZiBjYXVzZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGNhdXNlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGNhdXNlID09PSAnYmlnaW50JykgcmV0dXJuIFN0cmluZyhjYXVzZSlcbiAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBjYXVzZS5tZXNzYWdlIHx8IGNhdXNlLm5hbWUgfHwgJ0Vycm9yJ1xuICBpZiAoY2F1c2UgJiYgdHlwZW9mIGNhdXNlID09PSAnb2JqZWN0JyAmJiAnbWVzc2FnZScgaW4gKGNhdXNlIGFzIGFueSkgJiYgdHlwZW9mIChjYXVzZSBhcyBhbnkpLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIChjYXVzZSBhcyBhbnkpLm1lc3NhZ2UgYXMgc3RyaW5nXG4gIH1cblxuICAvLyBUcnkgRWZmZWN0IENhdXNlIHByZXR0eSAoYmVzdC1lZmZvcnQpLiBUaGlzIG1heSBpbmNsdWRlIG1vcmUgZGV0YWlscyB0aGFuIG5lZWRlZCxcbiAgLy8gc28gY2FsbGVycyBNVVNUIHN0aWxsIHRyZWF0IGl0IGFzIGFuIHVudHJ1c3RlZC9vdmVyc2l6ZWQgc3RyaW5nIGFuZCB0cnVuY2F0ZS5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcmV0dHkgPSBDYXVzZS5wcmV0dHkoY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KVxuICAgIGlmICh0eXBlb2YgcHJldHR5ID09PSAnc3RyaW5nJyAmJiBwcmV0dHkubGVuZ3RoID4gMCkgcmV0dXJuIHByZXR0eVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmVcbiAgfVxuXG4gIHJldHVybiAnVW5rbm93biBlcnJvcidcbn1cblxuZXhwb3J0IGNvbnN0IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5ID0gKFxuICBjYXVzZTogdW5rbm93bixcbiAgb3B0aW9ucz86IHtcbiAgICByZWFkb25seSBtYXhNZXNzYWdlTGVuZ3RoPzogbnVtYmVyXG4gIH0sXG4pOiBFcnJvclN1bW1hcnlSZXN1bHQgPT4ge1xuICBjb25zdCBtYXhNZXNzYWdlTGVuZ3RoID0gb3B0aW9ucz8ubWF4TWVzc2FnZUxlbmd0aCA/PyAyNTZcblxuICBjb25zdCBtZXNzYWdlUmF3ID0gZ2V0TWVzc2FnZUZyb21Vbmtub3duKGNhdXNlKVxuICBjb25zdCB7IHZhbHVlOiBtZXNzYWdlLCB0cnVuY2F0ZWQgfSA9IHRydW5jYXRlKG1lc3NhZ2VSYXcsIG1heE1lc3NhZ2VMZW5ndGgpXG5cbiAgY29uc3Qgc3VtbWFyeTogeyBtZXNzYWdlOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmc7IGNvZGU/OiBzdHJpbmc7IGhpbnQ/OiBzdHJpbmcgfSA9IHtcbiAgICBtZXNzYWdlLFxuICB9XG5cbiAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBpZiAoY2F1c2UubmFtZSAmJiBjYXVzZS5uYW1lICE9PSAnRXJyb3InKSBzdW1tYXJ5Lm5hbWUgPSBjYXVzZS5uYW1lXG4gICAgY29uc3QgYW55Q2F1c2UgPSBjYXVzZSBhcyBhbnlcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLmNvZGUgPT09ICdzdHJpbmcnICYmIGFueUNhdXNlLmNvZGUubGVuZ3RoID4gMCkgc3VtbWFyeS5jb2RlID0gYW55Q2F1c2UuY29kZVxuICAgIGVsc2UgaWYgKHR5cGVvZiBhbnlDYXVzZS5jb2RlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYW55Q2F1c2UuY29kZSkpIHN1bW1hcnkuY29kZSA9IFN0cmluZyhhbnlDYXVzZS5jb2RlKVxuICAgIGlmICh0eXBlb2YgYW55Q2F1c2UuaGludCA9PT0gJ3N0cmluZycgJiYgYW55Q2F1c2UuaGludC5sZW5ndGggPiAwKSBzdW1tYXJ5LmhpbnQgPSBhbnlDYXVzZS5oaW50XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogdHJ1bmNhdGVkID8gJ292ZXJzaXplZCcgOiB1bmRlZmluZWQsXG4gICAgfVxuICB9XG5cbiAgaWYgKGNhdXNlICYmIHR5cGVvZiBjYXVzZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBhbnlDYXVzZSA9IGNhdXNlIGFzIGFueVxuICAgIGlmICh0eXBlb2YgYW55Q2F1c2UubmFtZSA9PT0gJ3N0cmluZycgJiYgYW55Q2F1c2UubmFtZS5sZW5ndGggPiAwKSBzdW1tYXJ5Lm5hbWUgPSBhbnlDYXVzZS5uYW1lXG4gICAgaWYgKHR5cGVvZiBhbnlDYXVzZS5jb2RlID09PSAnc3RyaW5nJyAmJiBhbnlDYXVzZS5jb2RlLmxlbmd0aCA+IDApIHN1bW1hcnkuY29kZSA9IGFueUNhdXNlLmNvZGVcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLmhpbnQgPT09ICdzdHJpbmcnICYmIGFueUNhdXNlLmhpbnQubGVuZ3RoID4gMCkgc3VtbWFyeS5oaW50ID0gYW55Q2F1c2UuaGludFxuICB9XG5cbiAgLy8gSWYgdGhlIG9yaWdpbmFsIGNhdXNlIGlzbid0IEpTT04tc2VyaWFsaXphYmxlLCBtYXJrIGl0IGV4cGxpY2l0bHkuXG4gIGNvbnN0IHN0cmluZ2lmeVJlc3VsdCA9IHNhZmVTdHJpbmdpZnkoY2F1c2UpXG4gIGlmICghc3RyaW5naWZ5UmVzdWx0Lm9rKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogJ25vbl9zZXJpYWxpemFibGUnLFxuICAgIH1cbiAgfVxuXG4gIGlmICh0cnVuY2F0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JTdW1tYXJ5OiBzdW1tYXJ5LFxuICAgICAgZG93bmdyYWRlOiAnb3ZlcnNpemVkJyxcbiAgICB9XG4gIH1cblxuICBpZiAobWVzc2FnZSA9PT0gJ1Vua25vd24gZXJyb3InKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogJ3Vua25vd24nLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGVycm9yU3VtbWFyeTogc3VtbWFyeSB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztBQUFBLFNBQVMsU0FBQUEsUUFBTyxRQUFRLFVBQVUsT0FBTyxjQUFjOzs7QUNBdkQsU0FBUyxhQUFhO0FBZ0J0QixJQUFNLFdBQVcsQ0FBQyxPQUFlLFdBQTRFO0FBQzNHLE1BQUksTUFBTSxVQUFVLE9BQVEsUUFBTyxFQUFFLE9BQU8sV0FBVyxNQUFNO0FBQzdELFNBQU8sRUFBRSxPQUFPLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxXQUFXLEtBQUs7QUFDMUQ7QUFFQSxJQUFNLGdCQUFnQixDQUFDLFVBQTBGO0FBQy9HLE1BQUk7QUFDRixXQUFPLEVBQUUsSUFBSSxNQUFNLE1BQU0sS0FBSyxVQUFVLEtBQUssRUFBRTtBQUFBLEVBQ2pELFFBQVE7QUFDTixXQUFPLEVBQUUsSUFBSSxNQUFNO0FBQUEsRUFDckI7QUFDRjtBQUVBLElBQU0sd0JBQXdCLENBQUMsVUFBMkI7QUFDeEQsTUFBSSxPQUFPLFVBQVUsU0FBVSxRQUFPO0FBQ3RDLE1BQUksT0FBTyxVQUFVLFlBQVksT0FBTyxVQUFVLGFBQWEsT0FBTyxVQUFVLFNBQVUsUUFBTyxPQUFPLEtBQUs7QUFDN0csTUFBSSxpQkFBaUIsTUFBTyxRQUFPLE1BQU0sV0FBVyxNQUFNLFFBQVE7QUFDbEUsTUFBSSxTQUFTLE9BQU8sVUFBVSxZQUFZLGFBQWMsU0FBaUIsT0FBUSxNQUFjLFlBQVksVUFBVTtBQUNuSCxXQUFRLE1BQWM7QUFBQSxFQUN4QjtBQUlBLE1BQUk7QUFDRixVQUFNLFNBQVMsTUFBTSxPQUFPLE9BQStCLEVBQUUsa0JBQWtCLEtBQUssQ0FBQztBQUNyRixRQUFJLE9BQU8sV0FBVyxZQUFZLE9BQU8sU0FBUyxFQUFHLFFBQU87QUFBQSxFQUM5RCxRQUFRO0FBQUEsRUFFUjtBQUVBLFNBQU87QUFDVDtBQUVPLElBQU0sNkJBQTZCLENBQ3hDLE9BQ0EsWUFHdUI7QUFDdkIsUUFBTSxtQkFBbUIsU0FBUyxvQkFBb0I7QUFFdEQsUUFBTSxhQUFhLHNCQUFzQixLQUFLO0FBQzlDLFFBQU0sRUFBRSxPQUFPLFNBQVMsVUFBVSxJQUFJLFNBQVMsWUFBWSxnQkFBZ0I7QUFFM0UsUUFBTSxVQUE0RTtBQUFBLElBQ2hGO0FBQUEsRUFDRjtBQUVBLE1BQUksaUJBQWlCLE9BQU87QUFDMUIsUUFBSSxNQUFNLFFBQVEsTUFBTSxTQUFTLFFBQVMsU0FBUSxPQUFPLE1BQU07QUFDL0QsVUFBTSxXQUFXO0FBQ2pCLFFBQUksT0FBTyxTQUFTLFNBQVMsWUFBWSxTQUFTLEtBQUssU0FBUyxFQUFHLFNBQVEsT0FBTyxTQUFTO0FBQUEsYUFDbEYsT0FBTyxTQUFTLFNBQVMsWUFBWSxPQUFPLFNBQVMsU0FBUyxJQUFJLEVBQUcsU0FBUSxPQUFPLE9BQU8sU0FBUyxJQUFJO0FBQ2pILFFBQUksT0FBTyxTQUFTLFNBQVMsWUFBWSxTQUFTLEtBQUssU0FBUyxFQUFHLFNBQVEsT0FBTyxTQUFTO0FBQzNGLFdBQU87QUFBQSxNQUNMLGNBQWM7QUFBQSxNQUNkLFdBQVcsWUFBWSxjQUFjO0FBQUEsSUFDdkM7QUFBQSxFQUNGO0FBRUEsTUFBSSxTQUFTLE9BQU8sVUFBVSxVQUFVO0FBQ3RDLFVBQU0sV0FBVztBQUNqQixRQUFJLE9BQU8sU0FBUyxTQUFTLFlBQVksU0FBUyxLQUFLLFNBQVMsRUFBRyxTQUFRLE9BQU8sU0FBUztBQUMzRixRQUFJLE9BQU8sU0FBUyxTQUFTLFlBQVksU0FBUyxLQUFLLFNBQVMsRUFBRyxTQUFRLE9BQU8sU0FBUztBQUMzRixRQUFJLE9BQU8sU0FBUyxTQUFTLFlBQVksU0FBUyxLQUFLLFNBQVMsRUFBRyxTQUFRLE9BQU8sU0FBUztBQUFBLEVBQzdGO0FBR0EsUUFBTSxrQkFBa0IsY0FBYyxLQUFLO0FBQzNDLE1BQUksQ0FBQyxnQkFBZ0IsSUFBSTtBQUN2QixXQUFPO0FBQUEsTUFDTCxjQUFjO0FBQUEsTUFDZCxXQUFXO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLFdBQVc7QUFDYixXQUFPO0FBQUEsTUFDTCxjQUFjO0FBQUEsTUFDZCxXQUFXO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLFlBQVksaUJBQWlCO0FBQy9CLFdBQU87QUFBQSxNQUNMLGNBQWM7QUFBQSxNQUNkLFdBQVc7QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUVBLFNBQU8sRUFBRSxjQUFjLFFBQVE7QUFDakM7OztBRG9JTyxJQUFNLG9CQUFvQixTQUFTLFdBQWdDLENBQUMsQ0FBQztBQUNyRSxJQUFNLHNCQUFzQixTQUFTLFdBQStCLE1BQVM7QUFDN0UsSUFBTSxlQUFlLFNBQVMsV0FBK0IsTUFBUztBQUN0RSxJQUFNLGVBQWUsU0FBUyxXQUErQixNQUFTO0FBRXRFLElBQU0sMEJBQTBCLFNBQVMsV0FBNkIsS0FBSztBQUUzRSxJQUFNLG1CQUFtQixDQUFDLFVBQy9CLE1BQU0sMEJBQTBCLHlCQUFnQyxNQUFNLEtBQUs7QUFjdEUsSUFBTSwwQ0FBMEMsU0FBUyxXQUFtRDtBQUFBLEVBQ2pILGNBQWM7QUFBQSxFQUNkLE1BQU07QUFDUixDQUFDO0FBRU0sSUFBTSxtQ0FBbUMsQ0FDOUMsV0FFQSxNQUFNLDBCQUEwQix5Q0FBZ0QsTUFBTSxNQUFNO0FBTXZGLElBQU0sY0FBYyxDQUFDLFVBQzFCLE1BQU0sMEJBQTBCLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFrR3hGLElBQUkscUJBQXFCO0FBRWxCLElBQU0sNEJBQTRCLE1BQVk7QUFDbkQsdUJBQXFCO0FBQ3ZCO0FBRUEsSUFBTSxlQUFlLE1BQWM7QUFDakMsd0JBQXNCO0FBQ3RCLFNBQU87QUFDVDtBQUVBLElBQU0sY0FBYyxDQUFDLFlBQW9CLGFBQTZCLEdBQUcsVUFBVSxNQUFNLFFBQVE7QUFJakcsSUFBTSxpQkFBaUIsQ0FDckIsU0FDQSxTQUNnQztBQUNoQyxNQUFJLENBQUMsUUFBUyxRQUFPO0FBQ3JCLE1BQUksQ0FBQyxLQUFNLFFBQU87QUFDbEIsTUFBSSxZQUFZLHNCQUFzQixTQUFTLG1CQUFvQixRQUFPO0FBQzFFLE1BQUksWUFBWSxlQUFlLFNBQVMsWUFBYSxRQUFPO0FBQzVELFNBQU87QUFDVDtBQUlBLElBQU0sdUJBQXVCLG9CQUFJLElBQVk7QUFDN0MsSUFBTSx3QkFBd0Isb0JBQUksSUFBWTtBQUc5QyxJQUFNLG9CQUFvQixvQkFBSSxJQUFpRTtBQUkvRixJQUFNLGdDQUFnQyxvQkFBSSxJQUF5QztBQUVuRixJQUFNLDZCQUE2QixDQUFDLFlBQW9CLFFBQW9DO0FBQzFGLFFBQU0sT0FBTyw4QkFBOEIsSUFBSSxVQUFVO0FBQ3pELE1BQUksQ0FBQyxNQUFNO0FBQ1Qsa0NBQThCLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQztBQUNuRDtBQUFBLEVBQ0Y7QUFDQSxPQUFLLEtBQUssR0FBRztBQUNiLE1BQUksS0FBSyxTQUFTLElBQUk7QUFDcEIsU0FBSyxNQUFNO0FBQUEsRUFDYjtBQUNGO0FBRUEsSUFBTSw4QkFBOEIsQ0FDbEMsWUFDQSxRQUNTO0FBQ1QsUUFBTSxVQUFVLDhCQUE4QixJQUFJLFVBQVU7QUFDNUQsTUFBSSxDQUFDLFdBQVcsUUFBUSxXQUFXLEdBQUc7QUFDcEMsa0NBQThCLE9BQU8sVUFBVTtBQUMvQztBQUFBLEVBQ0Y7QUFFQSxhQUFXLE9BQU8sU0FBUztBQUN6QixVQUFNLFNBQWM7QUFDcEIsUUFBSSxPQUFPLFNBQVMsTUFBTTtBQUN4QixhQUFPLFFBQVEsSUFBSTtBQUFBLElBQ3JCO0FBQ0EsUUFBSSxPQUFPLE9BQU8sV0FBVyxZQUFZLE9BQU8sVUFBVSxHQUFHO0FBQzNELGFBQU8sU0FBUyxJQUFJO0FBQUEsSUFDdEI7QUFBQSxFQUNGO0FBRUEsZ0NBQThCLE9BQU8sVUFBVTtBQUNqRDtBQUVBLElBQU0sb0JBQW9CLENBQUMsVUFBZ0U7QUFDekYsUUFBTSxXQUFXLE1BQU0sWUFBWTtBQUNuQyxRQUFNLGVBQWUsTUFBTTtBQUN6QixRQUFJO0FBQ0YsYUFBT0MsT0FBTSxPQUFPLE1BQU0sT0FBK0I7QUFBQSxRQUN2RCxrQkFBa0I7QUFBQSxNQUNwQixDQUFDO0FBQUEsSUFDSCxRQUFRO0FBQ04sVUFBSTtBQUNGLGVBQU8sS0FBSyxVQUFVLE1BQU0sT0FBTyxNQUFNLENBQUM7QUFBQSxNQUM1QyxRQUFRO0FBQ04sZUFBTyxPQUFPLE1BQU0sS0FBSztBQUFBLE1BQzNCO0FBQUEsSUFDRjtBQUFBLEVBQ0YsR0FBRztBQUVILFFBQU0sVUFBVSxrQkFBa0IsUUFBUTtBQUFBLEVBQXNCLFdBQVc7QUFFM0UsU0FBTyxPQUFPLFNBQVMsT0FBTyxFQUFFO0FBQUEsSUFDOUIsT0FBTyxhQUFhO0FBQUEsTUFDbEIsa0JBQWtCO0FBQUEsTUFDbEIsZUFBZTtBQUFBLE1BQ2YsZUFBZTtBQUFBLElBQ2pCLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFFQSxJQUFNLGdCQUFnQixDQUFDLFVBQTJEO0FBQ2hGLFFBQU0sV0FBVyxNQUFNLFlBQVk7QUFDbkMsUUFBTSxTQUFTLGtCQUFrQixRQUFRLGdCQUFnQixNQUFNLFFBQVE7QUFDdkUsUUFBTSxTQUFTLFFBQVEsTUFBTSxJQUFJLFlBQVksTUFBTSxPQUFPLEdBQ3hELE1BQU0sWUFBWSxXQUFXLE1BQU0sU0FBUyxLQUFLLEVBQ25ELEdBQUcsTUFBTSxPQUFPO0FBQUEsUUFBVyxNQUFNLElBQUksS0FBSyxFQUFFO0FBQzVDLFFBQU0sTUFBTSxHQUFHLE1BQU07QUFBQSxFQUFLLE1BQU07QUFFaEMsUUFBTSxPQUNKLE1BQU0sYUFBYSxZQUNmLE9BQU8sV0FBVyxHQUFHLElBQ3JCLE1BQU0sYUFBYSxTQUNqQixPQUFPLFFBQVEsR0FBRyxJQUNsQixPQUFPLFNBQVMsR0FBRztBQUUzQixRQUFNLGNBQXVDO0FBQUEsSUFDM0Msa0JBQWtCO0FBQUEsSUFDbEIsZUFBZSxjQUFjLE1BQU0sUUFBUTtBQUFBLElBQzNDLHlCQUF5QixNQUFNO0FBQUEsSUFDL0IsNEJBQTRCLE1BQU07QUFBQSxFQUNwQztBQUNBLE1BQUksTUFBTSxNQUFNO0FBQ2QsZ0JBQVksdUJBQXVCLElBQUksTUFBTTtBQUFBLEVBQy9DO0FBQ0EsTUFBSSxNQUFNLFdBQVc7QUFDbkIsZ0JBQVksNEJBQTRCLElBQUksTUFBTTtBQUFBLEVBQ3BEO0FBRUEsU0FBTyxLQUFLLEtBQUssT0FBTyxhQUFhLFdBQVcsQ0FBQztBQUNuRDtBQU9PLElBQU0sWUFBWSxNQUFNLGNBQWMsbUJBQW1CLENBQUMsQ0FBQztBQVFsRSxJQUFNLGdCQUFzQjtBQUFBLEVBQzFCLFFBQVEsQ0FBQyxVQUNQLE1BQU0sU0FBUyxvQkFDWCxrQkFBa0IsS0FBSyxJQUN2QixNQUFNLFNBQVMsZ0JBQWdCLE1BQU0sYUFBYSxTQUNoRCxjQUFjLEtBQUssSUFDbkIsT0FBTztBQUNqQjtBQUVPLElBQU0saUJBQWlCLE1BQU0sY0FBYyxtQkFBbUIsQ0FBQyxhQUFhLENBQUM7QUFPcEYsSUFBTSxjQUFvQjtBQUFBLEVBQ3hCLFFBQVEsQ0FBQyxVQUNQLE1BQU0sU0FBUyxvQkFDWCxrQkFBa0IsS0FBSyxJQUN2QixNQUFNLFNBQVMsZUFDYixjQUFjLEtBQUssSUFDbkIsT0FBTyxTQUFTLEVBQUUsWUFBWSxNQUFNLENBQUM7QUFDL0M7QUFFTyxJQUFNLGVBQWUsTUFBTSxjQUFjLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztBQUVoRixJQUFNLFlBQVksT0FBTyxXQUFXLGVBQWUsT0FBTyxhQUFhO0FBR3ZFLElBQU0sNEJBQTRCLENBQUMsVUFBc0M7QUFFdkUsTUFBSSxPQUFRLE1BQWMsU0FBUyxZQUFhLE1BQWMsS0FBSyxXQUFXLFFBQVEsR0FBRztBQUN2RixVQUFNLFdBQVksTUFBYyxZQUFZO0FBQzVDLFVBQU0sT0FBUSxNQUFjO0FBRTVCLFdBQU8sT0FBTyxLQUFLLE1BQU07QUFFdkIsY0FBUTtBQUFBLFFBQ04seUJBQXlCLFdBQVcsUUFBUSxPQUFPLElBQUk7QUFBQSxRQUN2RDtBQUFBO0FBQUEsUUFDQTtBQUFBO0FBQUEsUUFDQTtBQUFBO0FBQUEsUUFDQTtBQUFBO0FBQUEsTUFDRjtBQUVBLGNBQVEsSUFBSSxLQUFLO0FBRWpCLGNBQVEsU0FBUztBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNIO0FBRUEsTUFBSSxNQUFNLFNBQVMsbUJBQW1CO0FBQ3BDLFVBQU0sV0FBVyxNQUFNLFlBQVk7QUFDbkMsVUFBTSxlQUFlLE1BQU07QUFDekIsVUFBSTtBQUNGLGVBQU9BLE9BQU0sT0FBTyxNQUFNLE9BQStCLEVBQUUsa0JBQWtCLEtBQUssQ0FBQztBQUFBLE1BQ3JGLFFBQVE7QUFDTixZQUFJO0FBQ0YsaUJBQU8sS0FBSyxVQUFVLE1BQU0sT0FBTyxNQUFNLENBQUM7QUFBQSxRQUM1QyxRQUFRO0FBQ04saUJBQU8sT0FBTyxNQUFNLEtBQUs7QUFBQSxRQUMzQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLEdBQUc7QUFFSCxVQUFNLE1BQU0sR0FBRyxRQUFRLElBQUksV0FBVztBQUN0QyxRQUFJLHFCQUFxQixJQUFJLEdBQUcsR0FBRztBQUNqQyxhQUFPLE9BQU87QUFBQSxJQUNoQjtBQUNBLHlCQUFxQixJQUFJLEdBQUc7QUFFNUIsV0FBTyxPQUFPLEtBQUssTUFBTTtBQUV2QixjQUFRO0FBQUEsUUFDTixtQ0FBbUM7QUFBQSxRQUNuQztBQUFBO0FBQUEsUUFDQTtBQUFBO0FBQUEsUUFDQTtBQUFBO0FBQUEsTUFDRjtBQUVBLGNBQVEsTUFBTSxXQUFXO0FBRXpCLGNBQVEsU0FBUztBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNIO0FBRUEsTUFBSSxNQUFNLFNBQVMsY0FBYztBQUMvQixVQUFNLFdBQVcsTUFBTSxZQUFZO0FBQ25DLFVBQU0sU0FBUyxRQUFRLE1BQU0sSUFBSSxZQUFZLE1BQU0sT0FBTyxHQUN4RCxNQUFNLFlBQVksV0FBVyxNQUFNLFNBQVMsS0FBSyxFQUNuRCxHQUFHLE1BQU0sT0FBTztBQUFBLFFBQVcsTUFBTSxJQUFJLEtBQUssRUFBRTtBQUU1QyxVQUFNLFFBQ0osTUFBTSxhQUFhLFlBQVksa0JBQWtCLE1BQU0sYUFBYSxTQUFTLGtCQUFrQjtBQUVqRyxVQUFNLFFBQ0osTUFBTSxhQUFhLFlBQ2Ysd0JBQ0EsTUFBTSxhQUFhLFNBQ2pCLHFCQUNBO0FBRVIsVUFBTSxNQUFNLEdBQUcsUUFBUSxJQUFJLE1BQU0sSUFBSSxJQUFJLE1BQU0sT0FBTztBQUN0RCxRQUFJLHNCQUFzQixJQUFJLEdBQUcsR0FBRztBQUNsQyxhQUFPLE9BQU87QUFBQSxJQUNoQjtBQUNBLDBCQUFzQixJQUFJLEdBQUc7QUFFN0IsV0FBTyxPQUFPLEtBQUssTUFBTTtBQUV2QixjQUFRO0FBQUEsUUFDTixpQkFBaUIsUUFBUSxlQUFlO0FBQUEsUUFDeEM7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFFQSxjQUFRLElBQUksTUFBTTtBQUVsQixjQUFRLFNBQVM7QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDSDtBQUlBLFNBQU8sT0FBTztBQUNoQjtBQU9BLElBQU0scUJBQTJCO0FBQUEsRUFDL0IsUUFBUSxDQUFDLFVBQWlCO0FBQ3hCLFFBQUksQ0FBQyxXQUFXO0FBRWQsYUFBTyxNQUFNLFNBQVMsb0JBQ2xCLGtCQUFrQixLQUFLLElBQ3ZCLE1BQU0sU0FBUyxlQUNiLGNBQWMsS0FBSyxJQUNuQixPQUFPLFNBQVMsRUFBRSxZQUFZLE1BQU0sQ0FBQztBQUFBLElBQzdDO0FBRUEsV0FBTywwQkFBMEIsS0FBSztBQUFBLEVBQ3hDO0FBQ0Y7QUFFTyxJQUFNLHNCQUFzQixNQUFNLGNBQWMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUM7QUFPdkYsSUFBTSwyQkFBMkIsT0FBTztBQUFBLEVBQzdDLE9BQU87QUFBQSxFQUNQLE9BQU8sYUFBYSxFQUFFLE1BQU0sV0FBVyxRQUFRLEtBQUssQ0FBQztBQUN2RDtBQVNPLElBQU0sU0FBUyxDQUFDLFVBQ3JCLE9BQU8sSUFBSSxhQUFhO0FBQ3RCLFFBQU0sUUFBUSxPQUFPLFNBQVMsSUFBSSxpQkFBaUI7QUFJbkQsTUFBSSxNQUFNLFdBQVcsR0FBRztBQUN0QixRQUFJLFdBQVc7QUFDYixVQUFJLE1BQU0sU0FBUyxxQkFBcUIsTUFBTSxTQUFTLGNBQWM7QUFDbkUsZUFBTywwQkFBMEIsS0FBSztBQUN0QztBQUFBLE1BQ0Y7QUFDQSxhQUFPLE9BQU87QUFDZDtBQUFBLElBQ0Y7QUFFQSxRQUFJLE1BQU0sU0FBUyxtQkFBbUI7QUFDcEMsYUFBTyxrQkFBa0IsS0FBSztBQUM5QjtBQUFBLElBQ0Y7QUFDQSxRQUFJLE1BQU0sU0FBUyxjQUFjO0FBQy9CLGFBQU8sY0FBYyxLQUFLO0FBQzFCO0FBQUEsSUFDRjtBQUNBLFdBQU8sT0FBTztBQUNkO0FBQUEsRUFDRjtBQUVBLFFBQU0sV0FBVztBQUVqQixRQUFNQyxvQkFBbUIsT0FBTyxTQUFTLElBQUksdUJBQXVCO0FBS3BFLE1BQUk7QUFDSixRQUFNLFNBQVMsTUFBYztBQUMzQixRQUFJLFFBQVEsT0FBVyxPQUFNLEtBQUssSUFBSTtBQUN0QyxXQUFPO0FBQUEsRUFDVDtBQUlBLE1BQ0UsU0FBUyxjQUFjLFdBQ3RCQSxzQkFBcUIsU0FBUyxTQUFTLFNBQVMscUJBQXFCLFNBQVMsU0FBUyxlQUN4RjtBQUNBO0FBQUMsSUFBQyxTQUFpQixZQUFZLE9BQU87QUFBQSxFQUN4QztBQUNBLE1BQUlBLHNCQUFxQixTQUFTLFNBQVMsaUJBQWlCLFFBQVc7QUFDckUsVUFBTSxlQUFlLE9BQU8sU0FBUyxJQUFJLG1CQUFtQjtBQUM1RCxRQUFJLGNBQWM7QUFDaEI7QUFBQyxNQUFDLFNBQWlCLGVBQWU7QUFBQSxJQUNwQztBQUFBLEVBQ0Y7QUFFQSxNQUFJLFNBQVMsU0FBUyxnQkFBaUIsU0FBaUIsVUFBVSxRQUFXO0FBQzNFLFVBQU0sUUFBUSxPQUFPLFNBQVMsSUFBSSxZQUFZO0FBQzlDLFFBQUksT0FBTztBQUNUO0FBQUMsTUFBQyxTQUFpQixRQUFRO0FBQUEsSUFDN0I7QUFBQSxFQUNGO0FBRUEsTUFDRUEsc0JBQXFCLFNBQ3BCLFNBQWlCLFNBQVMsb0JBQzFCLFNBQWlCLFdBQVcsUUFDN0I7QUFDQSxVQUFNLFNBQVMsT0FBTyxTQUFTLElBQWlCLGFBQWE7QUFDN0QsUUFBSSxRQUFRO0FBQ1Y7QUFBQyxNQUFDLFNBQWlCLFNBQVM7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLE1BQU0sV0FBVyxHQUFHO0FBQ3RCLFdBQU8sTUFBTSxDQUFDLEVBQUcsT0FBTyxRQUFRO0FBQ2hDO0FBQUEsRUFDRjtBQUVBLFNBQU8sT0FBTyxRQUFRLE9BQU8sQ0FBQyxTQUFTLEtBQUssT0FBTyxRQUFRLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNqRixDQUFDO0FBT0ksSUFBTSx5QkFBeUIsQ0FDcEMsT0FDQSxZQVNxQztBQUNyQyxRQUFNQSxvQkFBbUIsU0FBUyxvQkFBb0I7QUFDdEQsTUFBSUEsc0JBQXFCLE9BQU87QUFDOUIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGNBQWNBLHNCQUFxQixXQUFXQSxzQkFBcUI7QUFFekUsUUFBTSxZQUNKLE9BQU8sTUFBTSxjQUFjLFlBQVksT0FBTyxTQUFTLE1BQU0sU0FBUyxJQUFJLE1BQU0sWUFBWSxLQUFLLElBQUk7QUFFdkcsUUFBTSxjQUFlLE1BQWM7QUFDbkMsUUFBTSxXQUFXLE9BQU8sZ0JBQWdCLFlBQVksWUFBWSxTQUFTLElBQUksY0FBYztBQUUzRixRQUFNLGdCQUFpQixNQUFjO0FBQ3JDLFFBQU0sYUFBYSxPQUFPLGtCQUFrQixZQUFZLGNBQWMsU0FBUyxJQUFJLGdCQUFnQjtBQUVuRyxRQUFNLGtCQUFtQixNQUFjO0FBQ3ZDLFFBQU0sZUFBZSxPQUFPLG9CQUFvQixZQUFZLGdCQUFnQixTQUFTLElBQUksa0JBQWtCO0FBRTNHLFFBQU0sWUFBYSxNQUFjO0FBQ2pDLFFBQU0sU0FDSixPQUFPLGNBQWMsWUFBWSxPQUFPLFNBQVMsU0FBUyxLQUFLLGFBQWEsSUFBSSxLQUFLLE1BQU0sU0FBUyxJQUFJO0FBRTFHLFFBQU0sV0FBWSxNQUFjO0FBQ2hDLFFBQU0sUUFDSixPQUFPLGFBQWEsWUFBWSxTQUFTLFNBQVMsSUFDOUMsV0FDQSxTQUFTLElBQ1AsR0FBRyxVQUFVLE1BQU0sTUFBTSxLQUN6QjtBQUVSLFFBQU0sVUFBVSxNQUFNO0FBQ3BCLFVBQU0sWUFBYSxNQUFjO0FBQ2pDLFFBQUksT0FBTyxjQUFjLFlBQVksVUFBVSxTQUFTLEVBQUcsUUFBTztBQUdsRSxRQUFJLE9BQVEsTUFBYyxTQUFTLFlBQVksQ0FBRSxNQUFjLEtBQUssV0FBVyxRQUFRLEdBQUc7QUFDeEYsYUFBTztBQUFBLElBQ1Q7QUFFQSxVQUFNLE9BQWEsTUFBYztBQUNqQyxVQUFNLE9BQVksTUFBTTtBQUN4QixVQUFNLGlCQUFpQixNQUFNO0FBQzdCLFFBQUksT0FBTyxtQkFBbUIsWUFBWSxlQUFlLFNBQVMsRUFBRyxRQUFPO0FBRTVFLFdBQU87QUFBQSxFQUNULEdBQUc7QUFFSCxRQUFNLGNBQWMsU0FBUztBQUM3QixRQUFNLFdBQ0osT0FBTyxnQkFBZ0IsWUFBWSxPQUFPLFNBQVMsV0FBVyxLQUFLLGNBQWMsSUFDN0UsS0FBSyxNQUFNLFdBQVcsSUFDdEIsYUFBYTtBQUNuQixRQUFNLFVBQVUsWUFBWSxZQUFZLFFBQVE7QUFFaEQsUUFBTSxPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFFSixRQUFNLGdCQUFnQixDQUFDLFFBQXVFO0FBQzVGLFFBQUksQ0FBQyxVQUFXLFFBQU87QUFDdkIsV0FBTyxFQUFFLEdBQUcsS0FBSyxXQUFXLEVBQUUsUUFBUSxVQUFVLEVBQUU7QUFBQSxFQUNwRDtBQUVBLFVBQVEsTUFBTSxNQUFNO0FBQUEsSUFDbEIsS0FBSztBQUNILGFBQU8sY0FBYztBQUFBLFFBQ25CLEdBQUc7QUFBQSxRQUNILE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNILEtBQUs7QUFDSCxhQUFPLGNBQWM7QUFBQSxRQUNuQixHQUFHO0FBQUEsUUFDSCxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsTUFDVCxDQUFDO0FBQUEsSUFDSCxLQUFLLG1CQUFtQjtBQUN0QixZQUFNLElBQUk7QUFDVixZQUFNLFlBQVksY0FDZCxFQUFFLE1BQU0sbUJBQW1CLE9BQU8sRUFBRSxPQUFPLE1BQU0sRUFBRSxLQUFLLElBQ3hELEVBQUUsTUFBTSxtQkFBbUIsT0FBTyxFQUFFLE9BQU8sTUFBTSxFQUFFLE1BQU0sU0FBUyxFQUFFLFFBQVE7QUFDaEYsWUFBTSxpQkFBaUIsaUJBQWlCLFNBQVM7QUFDakQsZUFBUyxtQkFBbUI7QUFBQSxRQUMxQixPQUFPLGVBQWU7QUFBQSxRQUN0QixXQUFXLGVBQWU7QUFBQSxNQUM1QixDQUFDO0FBQ0Qsa0JBQVksZUFBZSxXQUFXLGVBQWUsU0FBUztBQUM5RCxhQUFPLGNBQWM7QUFBQSxRQUNuQixHQUFHO0FBQUEsUUFDSCxNQUFNO0FBQUEsUUFDTixPQUFPLEVBQUU7QUFBQSxRQUNULE1BQU0sZUFBZTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxLQUFLLG1CQUFtQjtBQUN0QixZQUFNLFNBQWUsTUFBYztBQUNuQyxZQUFNLE1BQU0sUUFBUSxRQUFRLFFBQVEsUUFBUTtBQUM1QyxZQUFNLFFBQVEsT0FBTyxHQUFHO0FBQ3hCLFlBQU0sWUFBWSxjQUFjLEVBQUUsV0FBVyxNQUFNLElBQUksRUFBRSxPQUFPO0FBQ2hFLFlBQU0saUJBQWlCLGlCQUFpQixTQUFTO0FBQ2pELGVBQVMsbUJBQW1CO0FBQUEsUUFDMUIsT0FBTyxlQUFlO0FBQUEsUUFDdEIsV0FBVyxlQUFlO0FBQUEsTUFDNUIsQ0FBQztBQUNELGtCQUFZLGVBQWUsV0FBVyxlQUFlLFNBQVM7QUFDOUQsYUFBTyxjQUFjO0FBQUEsUUFDbkIsR0FBRztBQUFBLFFBQ0gsTUFBTTtBQUFBLFFBQ047QUFBQSxRQUNBLE1BQU0sZUFBZTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxLQUFLLGdCQUFnQjtBQUNuQixZQUFNLElBQUk7QUFDVixZQUFNLFlBQVksY0FDZDtBQUFBLFFBQ0UsT0FBTyxFQUFFO0FBQUEsUUFDVCxVQUFVLEVBQUU7QUFBQSxRQUNaLFlBQVksRUFBRTtBQUFBLFFBQ2QsWUFBWSxFQUFFO0FBQUEsUUFDZCxVQUFVLEVBQUU7QUFBQSxRQUNaLFlBQVksRUFBRTtBQUFBLFFBQ2QsWUFBWSxFQUFFO0FBQUEsTUFDaEIsSUFDQTtBQUFBLFFBQ0UsT0FBTyxFQUFFO0FBQUEsUUFDVCxVQUFVLEVBQUU7QUFBQSxRQUNaLFlBQVksRUFBRTtBQUFBLFFBQ2QsWUFBWSxFQUFFO0FBQUEsUUFDZCxVQUFVLEVBQUU7QUFBQSxRQUNaLFlBQVksRUFBRTtBQUFBLFFBQ2QsWUFBWSxFQUFFO0FBQUEsUUFDZCxjQUFjLEVBQUU7QUFBQSxRQUNoQixhQUFhLEVBQUU7QUFBQSxNQUNqQjtBQUNKLFlBQU0saUJBQWlCLGlCQUFpQixTQUFTO0FBQ2pELGVBQVMsbUJBQW1CO0FBQUEsUUFDMUIsT0FBTyxlQUFlO0FBQUEsUUFDdEIsV0FBVyxlQUFlO0FBQUEsTUFDNUIsQ0FBQztBQUNELGtCQUFZLGVBQWUsV0FBVyxlQUFlLFNBQVM7QUFDOUQsVUFBSSxPQUFPO0FBQ1QsMEJBQWtCLElBQUksWUFBWSxFQUFFLE9BQU8sT0FBTyxDQUFDO0FBQ25ELG9DQUE0QixZQUFZLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFBQSxNQUMzRDtBQUNBLGFBQU8sY0FBYztBQUFBLFFBQ25CLEdBQUc7QUFBQSxRQUNILE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLE1BQU0sZUFBZTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLLGlCQUFpQjtBQUNwQixZQUFNLElBQUk7QUFhVixZQUFNLE1BQU0sT0FBTyxFQUFFLGdCQUFnQixZQUFZLE9BQU8sU0FBUyxFQUFFLFdBQVcsSUFBSSxFQUFFLGNBQWM7QUFFbEcsWUFBTSxZQUFZO0FBQUEsUUFDaEIsVUFBVSxFQUFFO0FBQUEsUUFDWixVQUFVLEVBQUU7QUFBQSxRQUNaLFVBQVUsRUFBRTtBQUFBLFFBQ1osYUFBYSxFQUFFO0FBQUEsUUFDZixTQUFTLEVBQUU7QUFBQSxRQUNYLFVBQVUsRUFBRTtBQUFBLFFBQ1osT0FBTyxFQUFFO0FBQUEsTUFDWDtBQUNBLFlBQU0saUJBQWlCLGlCQUFpQixTQUFTO0FBQ2pELGVBQVMsbUJBQW1CO0FBQUEsUUFDMUIsT0FBTyxlQUFlO0FBQUEsUUFDdEIsV0FBVyxlQUFlO0FBQUEsTUFDNUIsQ0FBQztBQUNELGtCQUFZLGVBQWUsV0FBVyxlQUFlLFNBQVM7QUFFOUQsWUFBTSxlQUNKLEVBQUUsU0FBUyxtQkFBbUIsRUFBRSxTQUFTLG9CQUNwQyxFQUFFLFFBQ0g7QUFFTixhQUFPLGNBQWM7QUFBQSxRQUNuQixHQUFHO0FBQUEsUUFDSCxXQUFXO0FBQUEsUUFDWCxNQUFNO0FBQUEsUUFDTixPQUFPLEVBQUU7QUFBQSxRQUNULE1BQU0sZUFBZTtBQUFBLFFBQ3JCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0EsS0FBSyxtQkFBbUI7QUFDdEIsWUFBTSxJQUFJO0FBQ1YsWUFBTSxVQUFVLDJCQUEyQixFQUFFLEtBQUs7QUFDbEQsa0JBQVksZUFBZSxXQUFXLFFBQVEsU0FBUztBQUN2RCxZQUFNLFlBQVksY0FDZCxFQUFFLE1BQU0sbUJBQW1CLE9BQU8sRUFBRSxPQUFPLE1BQU0sRUFBRSxLQUFLLElBQ3hEO0FBQUEsUUFDRSxNQUFNO0FBQUEsUUFDTixPQUFPLEVBQUU7QUFBQSxRQUNULE1BQU0sRUFBRTtBQUFBLFFBQ1IsTUFBTSxFQUFFO0FBQUEsUUFDUixRQUFRLEVBQUU7QUFBQSxRQUNWLFFBQVEsRUFBRTtBQUFBLFFBQ1YsUUFBUSxFQUFFO0FBQUEsUUFDVixPQUFPLEVBQUU7QUFBQSxNQUNYO0FBQ0osWUFBTSxpQkFBaUIsaUJBQWlCLFNBQVM7QUFDakQsZUFBUyxtQkFBbUI7QUFBQSxRQUMxQixPQUFPLGVBQWU7QUFBQSxRQUN0QixXQUFXLGVBQWU7QUFBQSxNQUM1QixDQUFDO0FBQ0Qsa0JBQVksZUFBZSxXQUFXLGVBQWUsU0FBUztBQUM5RCxhQUFPLGNBQWM7QUFBQSxRQUNuQixHQUFHO0FBQUEsUUFDSCxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxNQUFNLGVBQWU7QUFBQSxRQUNyQixjQUFjLFFBQVE7QUFBQSxNQUN4QixDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0EsS0FBSyxjQUFjO0FBQ2pCLFlBQU0sSUFBSTtBQUNWLFlBQU0sWUFBWTtBQUFBLFFBQ2hCLE1BQU0sRUFBRTtBQUFBLFFBQ1IsVUFBVSxFQUFFO0FBQUEsUUFDWixTQUFTLEVBQUU7QUFBQSxRQUNYLE1BQU0sRUFBRTtBQUFBLFFBQ1IsV0FBVyxFQUFFO0FBQUEsUUFDYixNQUFNLEVBQUU7QUFBQSxRQUNSLFNBQVMsRUFBRTtBQUFBLE1BQ2I7QUFDQSxZQUFNLGlCQUFpQixpQkFBaUIsU0FBUztBQUNqRCxlQUFTLG1CQUFtQjtBQUFBLFFBQzFCLE9BQU8sZUFBZTtBQUFBLFFBQ3RCLFdBQVcsZUFBZTtBQUFBLE1BQzVCLENBQUM7QUFDRCxrQkFBWSxlQUFlLFdBQVcsZUFBZSxTQUFTO0FBQzlELGFBQU8sY0FBYztBQUFBLFFBQ25CLEdBQUc7QUFBQSxRQUNILE1BQU07QUFBQSxRQUNOLE9BQU8sRUFBRTtBQUFBLFFBQ1QsTUFBTSxlQUFlO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUNBLFNBQVM7QUFDUCxVQUFJLE9BQU8sTUFBTSxTQUFTLFlBQVksQ0FBQyxNQUFNLEtBQUssV0FBVyxRQUFRLEdBQUc7QUFDdEUsZUFBTztBQUFBLE1BQ1Q7QUFHQSxVQUFJLE1BQU0sU0FBUyxrQkFBa0I7QUFDbkMsY0FBTSxPQUFhLE1BQWM7QUFDakMsY0FBTSxXQUFXLE1BQU0sWUFBWTtBQUVuQyxjQUFNQyxrQkFBaUIsaUJBQWlCLFFBQVE7QUFDaEQsaUJBQVMsbUJBQW1CO0FBQUEsVUFDMUIsT0FBT0EsZ0JBQWU7QUFBQSxVQUN0QixXQUFXQSxnQkFBZTtBQUFBLFFBQzVCLENBQUM7QUFDRCxvQkFBWSxlQUFlLFdBQVdBLGdCQUFlLFNBQVM7QUFFOUQsY0FBTSxRQUNKLE9BQU8sVUFBVSxTQUFTLFlBQVksU0FBUyxLQUFLLFNBQVMsSUFBSSxPQUFPLFNBQVMsSUFBSSxJQUFJO0FBRTNGLGVBQU8sY0FBYztBQUFBLFVBQ25CLEdBQUc7QUFBQSxVQUNILE1BQU07QUFBQSxVQUNOO0FBQUEsVUFDQSxNQUFNQSxnQkFBZTtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxNQUNIO0FBR0EsVUFBSSxNQUFNLFNBQVMsd0JBQXdCLE1BQU0sU0FBUyx3QkFBd0I7QUFDaEYsY0FBTSxPQUFhLE1BQWM7QUFDakMsY0FBTUEsa0JBQWlCO0FBQUEsVUFDckIsY0FDSTtBQUFBLFlBQ0UsZ0JBQWdCLE1BQU07QUFBQSxZQUN0QixhQUFhLE1BQU07QUFBQSxZQUNuQixZQUFZLE1BQU07QUFBQSxZQUNsQixZQUFZLE1BQU07QUFBQSxZQUNsQixNQUFNLE1BQU07QUFBQSxZQUNaLFVBQVUsTUFBTTtBQUFBLFlBQ2hCLGdCQUFnQixNQUFNO0FBQUEsWUFDdEIsYUFBYSxNQUFNO0FBQUEsWUFDbkIsWUFBWSxNQUFNO0FBQUEsWUFDbEIsaUJBQWlCLE1BQU07QUFBQSxVQUN6QixJQUNBO0FBQUEsWUFDRSxnQkFBZ0IsTUFBTTtBQUFBLFlBQ3RCLGFBQWEsTUFBTTtBQUFBLFlBQ25CLFlBQVksTUFBTTtBQUFBLFlBQ2xCLFlBQVksTUFBTTtBQUFBLFlBQ2xCLE1BQU0sTUFBTTtBQUFBLFlBQ1osVUFBVSxNQUFNO0FBQUEsWUFDaEIsZ0JBQWdCLE1BQU07QUFBQSxZQUN0QixhQUFhLE1BQU07QUFBQSxZQUNuQixZQUFZLE1BQU07QUFBQSxZQUNsQixpQkFBaUIsTUFBTTtBQUFBLFlBQ3ZCLE1BQU0sTUFBTTtBQUFBLFVBQ2Q7QUFBQSxRQUNOO0FBQ0EsaUJBQVMsbUJBQW1CO0FBQUEsVUFDMUIsT0FBT0EsZ0JBQWU7QUFBQSxVQUN0QixXQUFXQSxnQkFBZTtBQUFBLFFBQzVCLENBQUM7QUFDRCxvQkFBWSxlQUFlLFdBQVdBLGdCQUFlLFNBQVM7QUFDOUQsY0FBTSxRQUNKLE9BQU8sTUFBTSxtQkFBbUIsWUFBWSxLQUFLLGVBQWUsU0FBUyxJQUNyRSxLQUFLLGlCQUNMLE1BQU0sU0FBUyx5QkFDYixtQkFDQTtBQUNSLGNBQU0sT0FBTyxrQkFBa0IsSUFBSSxVQUFVO0FBQzdDLGNBQU0saUJBQ0osT0FBTyxNQUFNLE1BQU0sV0FBVyxZQUFZLE9BQU8sU0FBUyxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUssS0FBSyxVQUFVLElBQy9GLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTSxJQUMzQjtBQUNOLGNBQU0sZ0JBQ0osT0FBTyxNQUFNLE1BQU0sVUFBVSxZQUFZLEtBQUssS0FBSyxNQUFNLFNBQVMsSUFBSSxLQUFLLEtBQUssUUFBUTtBQUMxRixjQUFNLGVBQWUsaUJBQWlCLEtBQUssU0FBUyxNQUFNO0FBQzFELGNBQU0sZ0JBQWdCLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxLQUFLLFNBQVUsTUFBTSxVQUFVLEtBQUs7QUFDL0YsY0FBTSxNQUFNLGNBQWM7QUFBQSxVQUN4QixHQUFHO0FBQUEsVUFDSCxPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsVUFDUixNQUFNLE1BQU0sU0FBUyx5QkFBeUIsbUJBQW1CO0FBQUEsVUFDakU7QUFBQSxVQUNBLE1BQU1BLGdCQUFlO0FBQUEsUUFDdkIsQ0FBQztBQUVELFlBQUksZUFBZSxjQUFjLElBQUksU0FBUyxRQUFRLElBQUksVUFBVSxJQUFJO0FBQ3RFLHFDQUEyQixZQUFZLEdBQUc7QUFBQSxRQUM1QztBQUVBLGVBQU87QUFBQSxNQUNUO0FBR0EsVUFBSSxNQUFNLFNBQVMsdUJBQXVCO0FBQ3hDLGNBQU0sT0FBYSxNQUFjO0FBQ2pDLGNBQU0sWUFBWTtBQUFBLFVBQ2hCLFlBQVksTUFBTTtBQUFBLFVBQ2xCLE1BQU0sTUFBTTtBQUFBLFVBQ1osVUFBVSxNQUFNO0FBQUEsVUFDaEIsZ0JBQWdCLE1BQU07QUFBQSxVQUN0QixhQUFhLE1BQU07QUFBQSxVQUNuQixZQUFZLE1BQU07QUFBQSxVQUNsQixTQUFTLE1BQU07QUFBQSxVQUNmLFFBQVEsTUFBTTtBQUFBLFFBQ2hCO0FBRUEsY0FBTUEsa0JBQWlCLGlCQUFpQixTQUFTO0FBQ2pELGlCQUFTLG1CQUFtQjtBQUFBLFVBQzFCLE9BQU9BLGdCQUFlO0FBQUEsVUFDdEIsV0FBV0EsZ0JBQWU7QUFBQSxRQUM1QixDQUFDO0FBQ0Qsb0JBQVksZUFBZSxXQUFXQSxnQkFBZSxTQUFTO0FBRTlELGVBQU8sY0FBYztBQUFBLFVBQ25CLEdBQUc7QUFBQSxVQUNILE1BQU07QUFBQSxVQUNOLE9BQU8sTUFBTTtBQUFBLFVBQ2IsTUFBTUEsZ0JBQWU7QUFBQSxRQUN2QixDQUFDO0FBQUEsTUFDSDtBQUdBLFVBQUksTUFBTSxTQUFTLGlCQUFpQjtBQUNsQyxjQUFNLE9BQWEsTUFBYztBQUNqQyxjQUFNLFlBQVk7QUFBQSxVQUNoQixTQUFTLE1BQU07QUFBQSxVQUNmLE9BQU8sTUFBTTtBQUFBLFVBQ2IsS0FBSyxNQUFNO0FBQUEsVUFDWCxZQUFZLE1BQU0sY0FBYyxNQUFNO0FBQUEsVUFDdEMsY0FBYyxNQUFNO0FBQUEsVUFDcEIsZUFBZSxNQUFNO0FBQUEsVUFDckIsWUFBWSxNQUFNO0FBQUEsVUFDbEIsV0FBVyxNQUFNO0FBQUEsVUFDakIsUUFBUSxNQUFNO0FBQUEsUUFDaEI7QUFFQSxjQUFNQSxrQkFBaUIsaUJBQWlCLFNBQVM7QUFDakQsaUJBQVMsbUJBQW1CO0FBQUEsVUFDMUIsT0FBT0EsZ0JBQWU7QUFBQSxVQUN0QixXQUFXQSxnQkFBZTtBQUFBLFFBQzVCLENBQUM7QUFDRCxvQkFBWSxlQUFlLFdBQVdBLGdCQUFlLFNBQVM7QUFFOUQsZUFBTyxjQUFjO0FBQUEsVUFDbkIsR0FBRztBQUFBLFVBQ0gsTUFBTTtBQUFBLFVBQ04sT0FBTyxNQUFNO0FBQUEsVUFDYixNQUFNQSxnQkFBZTtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxNQUNIO0FBR0EsVUFBSSxNQUFNLFNBQVMsd0JBQXdCO0FBQ3pDLGNBQU0sd0JBQXdCLENBQUMsU0FHYTtBQUMxQyxnQkFBTSxVQUFVLFNBQVM7QUFDekIsY0FBSSxDQUFDLFFBQVMsUUFBTztBQUNyQixnQkFBTSxTQUFTLEtBQUs7QUFDcEIsY0FBSSxPQUFPLFdBQVcsWUFBWSxPQUFPLFdBQVcsRUFBRyxRQUFPO0FBRTlELGdCQUFNLFVBQVUsS0FBSztBQUNyQixjQUFJLENBQUMsTUFBTSxRQUFRLE9BQU8sS0FBSyxRQUFRLFdBQVcsRUFBRyxRQUFPO0FBRTVELGdCQUFNLEtBQUssUUFBUSxNQUFNO0FBQ3pCLGdCQUFNLGFBQWMsSUFBWTtBQUNoQyxjQUFJLENBQUMsTUFBTSxRQUFRLFVBQVUsS0FBSyxXQUFXLFdBQVcsRUFBRyxRQUFPO0FBRWxFLGdCQUFNLE1BQXdCLENBQUM7QUFDL0IscUJBQVcsTUFBTSxTQUFTO0FBQ3hCLGdCQUFJLE9BQU8sT0FBTyxZQUFZLENBQUMsT0FBTyxTQUFTLEVBQUUsRUFBRztBQUNwRCxrQkFBTSxNQUFNLEtBQUssTUFBTSxFQUFFO0FBQ3pCLGdCQUFJLE1BQU0sS0FBSyxPQUFPLFdBQVcsT0FBUTtBQUN6QyxrQkFBTSxPQUFPLFdBQVcsR0FBRztBQUMzQixnQkFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQ3ZCLGtCQUFJLEtBQUssSUFBVztBQUFBLFlBQ3RCO0FBQUEsVUFDRjtBQUVBLGlCQUFPLElBQUksU0FBUyxJQUFJLE1BQU07QUFBQSxRQUNoQztBQUVBLGNBQU0sdUJBQXVCLENBQUMsVUFBZ0M7QUFDNUQsY0FBSSxDQUFDLFNBQVMsT0FBTyxVQUFVLFlBQVksTUFBTSxRQUFRLEtBQUssRUFBRyxRQUFPO0FBRXhFLGdCQUFNLFdBQVc7QUFDakIsZ0JBQU0sUUFBUSxTQUFTO0FBQ3ZCLGNBQUksQ0FBQyxTQUFTLE9BQU8sVUFBVSxZQUFZLE1BQU0sUUFBUSxLQUFLLEVBQUcsUUFBTztBQUV4RSxnQkFBTSxpQkFBaUIsc0JBQXNCO0FBQUEsWUFDM0MsZ0JBQWdCLFNBQVM7QUFBQSxZQUN6QixTQUFTLE9BQU87QUFBQSxVQUNsQixDQUFDO0FBQ0QsY0FBSSxDQUFDLGVBQWdCLFFBQU87QUFFNUIsaUJBQU87QUFBQSxZQUNMLEdBQUc7QUFBQSxZQUNILE9BQU87QUFBQSxjQUNMLEdBQUk7QUFBQSxjQUNKLFdBQVc7QUFBQSxZQUNiO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLGtCQUFrQixDQUFDLFVBQWdDO0FBQ3ZELGNBQUksQ0FBQyxTQUFTLE9BQU8sVUFBVSxZQUFZLE1BQU0sUUFBUSxLQUFLLEVBQUcsUUFBTztBQUV4RSxnQkFBTSxXQUFXO0FBQ2pCLGdCQUFNLFFBQVEsU0FBUztBQUN2QixnQkFBTSxpQkFBaUIsc0JBQXNCO0FBQUEsWUFDM0MsZ0JBQWdCLFNBQVM7QUFBQSxZQUN6QixTQUFTLE9BQU87QUFBQSxVQUNsQixDQUFDO0FBQ0QsZ0JBQU0sWUFDSixTQUFTLE9BQU8sVUFBVSxZQUFZLENBQUMsTUFBTSxRQUFRLEtBQUssSUFDdEQ7QUFBQSxZQUNFLFVBQVcsTUFBYztBQUFBLFlBQ3pCLEdBQUksT0FBUSxNQUFjLFdBQVcsV0FBVyxFQUFFLFFBQVMsTUFBYyxPQUFPLElBQUk7QUFBQSxZQUNwRixHQUFJLE1BQU0sUUFBUyxNQUFjLE9BQU8sSUFBSSxFQUFFLFNBQVUsTUFBYyxRQUFRLElBQUk7QUFBQSxZQUNsRixHQUFJLE9BQVEsTUFBYyxxQkFBcUIsWUFDM0MsRUFBRSxrQkFBbUIsTUFBYyxpQkFBaUIsSUFDcEQ7QUFBQSxZQUNKLEdBQUksaUJBQWlCLEVBQUUsV0FBVyxlQUFlLElBQUk7QUFBQSxVQUN2RCxJQUNBO0FBRU4sZ0JBQU0sRUFBRSxNQUFNLFlBQVksR0FBRyxLQUFLLElBQUk7QUFDdEMsaUJBQVEsWUFBWSxFQUFFLEdBQUcsTUFBTSxPQUFPLFVBQVUsSUFBSTtBQUFBLFFBQ3REO0FBRUEsY0FBTSxvQkFBb0IsQ0FBQyxVQUFnQztBQUN6RCxjQUFJLENBQUMsU0FBUyxPQUFPLFVBQVUsWUFBWSxNQUFNLFFBQVEsS0FBSyxFQUFHLFFBQU87QUFFeEUsZ0JBQU0sV0FBVztBQUNqQixnQkFBTSxRQUFRLFNBQVM7QUFDdkIsZ0JBQU0sWUFDSixTQUFTLE9BQU8sVUFBVSxZQUFZLENBQUMsTUFBTSxRQUFRLEtBQUssSUFDdEQ7QUFBQSxZQUNFLFVBQVcsTUFBYztBQUFBLFlBQ3pCLEdBQUksT0FBUSxNQUFjLFdBQVcsV0FBVyxFQUFFLFFBQVMsTUFBYyxPQUFPLElBQUk7QUFBQSxVQUN0RixJQUNBO0FBRU4sZ0JBQU0sRUFBRSxZQUFZLEdBQUcsS0FBSyxJQUFJO0FBQ2hDLGlCQUFRLFlBQVksRUFBRSxHQUFHLE1BQU0sT0FBTyxVQUFVLElBQUk7QUFBQSxRQUN0RDtBQUVBLGNBQU0sT0FBUSxNQUFvRTtBQUNsRixjQUFNLFlBQ0pELHNCQUFxQixVQUNqQixnQkFBZ0IsSUFBSSxJQUNwQkEsc0JBQXFCLFlBQ25CLGtCQUFrQixJQUFJLElBQ3RCLHFCQUFxQixJQUFJO0FBQ2pDLGNBQU1DLGtCQUFpQixpQkFBaUIsU0FBUztBQUNqRCxpQkFBUyxtQkFBbUI7QUFBQSxVQUMxQixPQUFPQSxnQkFBZTtBQUFBLFVBQ3RCLFdBQVdBLGdCQUFlO0FBQUEsUUFDNUIsQ0FBQztBQUNELG9CQUFZLGVBQWUsV0FBV0EsZ0JBQWUsU0FBUztBQUU5RCxlQUFPLGNBQWM7QUFBQSxVQUNuQixHQUFHO0FBQUEsVUFDSCxNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsVUFDUCxNQUFNQSxnQkFBZTtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxNQUNIO0FBR0EsVUFBSSxNQUFNLFNBQVMscUJBQXFCO0FBQ3RDLGNBQU0sYUFBYSxDQUFDLFVBQWdDO0FBQ2xELGNBQUksQ0FBQyxTQUFTLE9BQU8sVUFBVSxZQUFZLE1BQU0sUUFBUSxLQUFLLEVBQUcsUUFBTztBQUN4RSxnQkFBTSxXQUFXO0FBQ2pCLGdCQUFNLFdBQVcsU0FBUztBQUMxQixnQkFBTSxlQUNKLFlBQVksT0FBTyxhQUFhLFlBQVksQ0FBQyxNQUFNLFFBQVEsUUFBUSxJQUMvRCxFQUFFLE1BQU8sU0FBaUIsS0FBSyxJQUMvQjtBQUVOLGdCQUFNLEVBQUUsVUFBVSxXQUFXLEdBQUcsS0FBSyxJQUFJO0FBQ3pDLGlCQUFRLGVBQWUsRUFBRSxHQUFHLE1BQU0sVUFBVSxhQUFhLElBQUk7QUFBQSxRQUMvRDtBQUVBLGNBQU0sT0FBUSxNQUFpRTtBQUMvRSxjQUFNLFlBQVksY0FBYyxXQUFXLElBQUksSUFBSTtBQUNuRCxjQUFNQSxrQkFBaUIsaUJBQWlCLFNBQVM7QUFDakQsaUJBQVMsbUJBQW1CO0FBQUEsVUFDMUIsT0FBT0EsZ0JBQWU7QUFBQSxVQUN0QixXQUFXQSxnQkFBZTtBQUFBLFFBQzVCLENBQUM7QUFDRCxvQkFBWSxlQUFlLFdBQVdBLGdCQUFlLFNBQVM7QUFFOUQsZUFBTyxjQUFjO0FBQUEsVUFDbkIsR0FBRztBQUFBLFVBQ0gsTUFBTTtBQUFBLFVBQ04sT0FBTztBQUFBLFVBQ1AsTUFBTUEsZ0JBQWU7QUFBQSxRQUN2QixDQUFDO0FBQUEsTUFDSDtBQUdBLFVBQUksTUFBTSxTQUFTLHdCQUF3QjtBQUN6QyxjQUFNLE9BQVEsTUFBb0U7QUFDbEYsY0FBTUEsa0JBQWlCLGlCQUFpQixJQUFJO0FBQzVDLGlCQUFTLG1CQUFtQjtBQUFBLFVBQzFCLE9BQU9BLGdCQUFlO0FBQUEsVUFDdEIsV0FBV0EsZ0JBQWU7QUFBQSxRQUM1QixDQUFDO0FBQ0Qsb0JBQVksZUFBZSxXQUFXQSxnQkFBZSxTQUFTO0FBRTlELGVBQU8sY0FBYztBQUFBLFVBQ25CLEdBQUc7QUFBQSxVQUNILE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU1BLGdCQUFlO0FBQUEsUUFDdkIsQ0FBQztBQUFBLE1BQ0g7QUFHQSxVQUFJLE1BQU0sU0FBUyx1QkFBdUI7QUFDeEMsY0FBTSxPQUFhLE1BQWM7QUFDakMsY0FBTSxZQUFZLGNBQ2Q7QUFBQSxVQUNFLFFBQVEsTUFBTTtBQUFBLFVBQ2QsT0FBTyxNQUFNO0FBQUEsUUFDZixJQUNBO0FBQUEsVUFDRSxRQUFRLE1BQU07QUFBQSxVQUNkLE9BQU8sTUFBTTtBQUFBLFVBQ2IsUUFBUSxNQUFNO0FBQUEsVUFDZCxpQkFBaUIsTUFBTTtBQUFBLFFBQ3pCO0FBRUosY0FBTUEsa0JBQWlCLGlCQUFpQixTQUFTO0FBQ2pELGlCQUFTLG1CQUFtQjtBQUFBLFVBQzFCLE9BQU9BLGdCQUFlO0FBQUEsVUFDdEIsV0FBV0EsZ0JBQWU7QUFBQSxRQUM1QixDQUFDO0FBQ0Qsb0JBQVksZUFBZSxXQUFXQSxnQkFBZSxTQUFTO0FBRTlELGVBQU8sY0FBYztBQUFBLFVBQ25CLEdBQUc7QUFBQSxVQUNILE1BQU07QUFBQSxVQUNOLE9BQU8sTUFBTTtBQUFBLFVBQ2IsTUFBTUEsZ0JBQWU7QUFBQSxRQUN2QixDQUFDO0FBQUEsTUFDSDtBQUdBLFVBQUksTUFBTSxTQUFTLGdDQUFnQztBQUNqRCxjQUFNLE9BQWEsTUFBYztBQUNqQyxjQUFNLFlBQVksY0FDZDtBQUFBLFVBQ0UsZUFBZSxNQUFNO0FBQUEsVUFDckIsVUFBVSxNQUFNO0FBQUEsUUFDbEIsSUFDQTtBQUFBLFVBQ0UsZUFBZSxNQUFNO0FBQUEsVUFDckIsV0FBVyxNQUFNO0FBQUEsUUFDbkI7QUFFSixjQUFNQSxrQkFBaUIsaUJBQWlCLFNBQVM7QUFDakQsaUJBQVMsbUJBQW1CO0FBQUEsVUFDMUIsT0FBT0EsZ0JBQWU7QUFBQSxVQUN0QixXQUFXQSxnQkFBZTtBQUFBLFFBQzVCLENBQUM7QUFDRCxvQkFBWSxlQUFlLFdBQVdBLGdCQUFlLFNBQVM7QUFFOUQsZUFBTyxjQUFjO0FBQUEsVUFDbkIsR0FBRztBQUFBLFVBQ0gsTUFBTTtBQUFBLFVBQ04sT0FBTyxNQUFNO0FBQUEsVUFDYixNQUFNQSxnQkFBZTtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxNQUNIO0FBR0EsVUFBSSxNQUFNLFNBQVMsMkJBQTJCO0FBQzVDLGNBQU0sT0FBYSxNQUFjO0FBQ2pDLGNBQU0sWUFBWSxjQUNkO0FBQUEsVUFDRSxJQUFJLE1BQU07QUFBQSxVQUNWLFFBQVEsTUFBTTtBQUFBLFVBQ2QsUUFBUSxNQUFNO0FBQUEsUUFDaEIsSUFDQSxFQUFFLEtBQUs7QUFFWCxjQUFNQSxrQkFBaUIsaUJBQWlCLFNBQVM7QUFDakQsaUJBQVMsbUJBQW1CO0FBQUEsVUFDMUIsT0FBT0EsZ0JBQWU7QUFBQSxVQUN0QixXQUFXQSxnQkFBZTtBQUFBLFFBQzVCLENBQUM7QUFDRCxvQkFBWSxlQUFlLFdBQVdBLGdCQUFlLFNBQVM7QUFFOUQsZUFBTyxjQUFjO0FBQUEsVUFDbkIsR0FBRztBQUFBLFVBQ0gsTUFBTTtBQUFBLFVBQ04sT0FBTyxNQUFNO0FBQUEsVUFDYixNQUFNQSxnQkFBZTtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxNQUNIO0FBR0EsVUFBSSxNQUFNLFNBQVMsa0JBQWtCO0FBQ25DLGNBQU0sT0FBYSxNQUFjO0FBQ2pDLGNBQU0sU0FBYyxNQUFNO0FBQzFCLGNBQU0sU0FBVSxNQUFNLFFBQVE7QUFDOUIsY0FBTSxRQUFRLE9BQU8sTUFBTSxTQUFTLFdBQVcsS0FBSyxPQUFPO0FBQzNELGNBQU0sWUFBWSxPQUFPLFFBQVEsYUFBYSxXQUFXLE9BQU8sV0FBVztBQUMzRSxjQUFNLFNBQVMsT0FBTyxRQUFRLFVBQVUsWUFBWSxPQUFPLE1BQU0sU0FBUyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ2xHLGNBQU0sVUFDSixPQUFPLFFBQVEsV0FBVyxZQUFZLE9BQU8sU0FBUyxPQUFPLE1BQU0sS0FBSyxPQUFPLFVBQVUsSUFDckYsS0FBSyxNQUFNLE9BQU8sTUFBTSxJQUN4QixLQUFLO0FBRVgsY0FBTSxZQUFZLGNBQ2Q7QUFBQSxVQUNFLElBQUksTUFBTTtBQUFBLFVBQ1YsTUFBTSxNQUFNO0FBQUEsVUFDWixNQUFNLE1BQU07QUFBQSxVQUNaLE1BQU07QUFBQSxRQUNSLElBQ0E7QUFBQSxVQUNFLElBQUksTUFBTTtBQUFBLFVBQ1YsTUFBTSxNQUFNO0FBQUEsVUFDWixNQUFNLE1BQU07QUFBQSxVQUNaLFNBQVMsTUFBTTtBQUFBLFVBQ2YsTUFBTTtBQUFBLFFBQ1I7QUFFSixjQUFNQSxrQkFBaUIsaUJBQWlCLFNBQVM7QUFDakQsaUJBQVMsbUJBQW1CO0FBQUEsVUFDMUIsT0FBT0EsZ0JBQWU7QUFBQSxVQUN0QixXQUFXQSxnQkFBZTtBQUFBLFFBQzVCLENBQUM7QUFDRCxvQkFBWSxlQUFlLFdBQVdBLGdCQUFlLFNBQVM7QUFFOUQsZUFBTyxjQUFjO0FBQUEsVUFDbkIsR0FBRztBQUFBLFVBQ0gsVUFBVTtBQUFBLFVBQ1YsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsTUFBTTtBQUFBLFVBQ047QUFBQSxVQUNBLE1BQU1BLGdCQUFlO0FBQUEsUUFDdkIsQ0FBQztBQUFBLE1BQ0g7QUFHQSxZQUFNLGlCQUFpQjtBQUFBLFFBQ3JCLGNBQ0k7QUFBQSxVQUNFLE1BQU07QUFBQSxRQUNSLElBQ0E7QUFBQSxVQUNFLE1BQU8sTUFBYztBQUFBLFFBQ3ZCO0FBQUEsTUFDTjtBQUNBLGVBQVMsbUJBQW1CO0FBQUEsUUFDMUIsT0FBTyxlQUFlO0FBQUEsUUFDdEIsV0FBVyxlQUFlO0FBQUEsTUFDNUIsQ0FBQztBQUNELGtCQUFZLGVBQWUsV0FBVyxlQUFlLFNBQVM7QUFDOUQsYUFBTyxjQUFjO0FBQUEsUUFDbkIsR0FBRztBQUFBLFFBQ0gsTUFBTTtBQUFBLFFBQ04sT0FBTyxNQUFNO0FBQUEsUUFDYixNQUFNLGVBQWU7QUFBQSxNQUN2QixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsiQ2F1c2UiLCAiQ2F1c2UiLCAiZGlhZ25vc3RpY3NMZXZlbCIsICJtZXRhUHJvamVjdGlvbiJdCn0K