@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
@@ -835,7 +835,6 @@ var trialRunModule = (root, options) => Effect4.gen(function* () {
835
835
  })();
836
836
  let ok = Exit.isSuccess(bootExit) && Exit.isSuccess(closeExit);
837
837
  let error;
838
- let summary;
839
838
  const depsFromBootFailure = Exit.isFailure(bootExit) ? parseMissingDependencyFromCause(bootExit.cause) : { missingServices: [], missingConfigKeys: [] };
840
839
  const missingServices = depsFromBootFailure.missingServices;
841
840
  const missingConfigKeys = depsFromBootFailure.missingConfigKeys;
@@ -867,22 +866,17 @@ var trialRunModule = (root, options) => Effect4.gen(function* () {
867
866
  const died = Option.getOrUndefined(Cause2.dieOption(closeExit.cause));
868
867
  const failure = Option.getOrUndefined(Cause2.failureOption(closeExit.cause));
869
868
  const base = died ?? failure ?? closeExit.cause;
870
- const closeErrorSummary = (() => {
871
- const tag = isRecord3(base) ? base._tag : void 0;
872
- if (tag === "DisposeTimeout") {
873
- return toErrorSummaryWithCode2(
874
- base,
875
- "DisposeTimeout",
876
- "Dispose timed out: check for unclosed resource handles, fibers not interrupted, or event listeners not unregistered."
877
- );
878
- }
879
- return toErrorSummaryWithCode2(base, "RuntimeFailure");
880
- })();
881
- ok = false;
882
- if (!error) {
883
- error = closeErrorSummary;
869
+ const tag = isRecord3(base) ? base._tag : void 0;
870
+ if (tag === "DisposeTimeout") {
871
+ ok = false;
872
+ error = toErrorSummaryWithCode2(
873
+ base,
874
+ "DisposeTimeout",
875
+ "Dispose timed out: check for unclosed resource handles, fibers not interrupted, or event listeners not unregistered."
876
+ );
884
877
  } else {
885
- summary = { __logix: { closeError: closeErrorSummary } };
878
+ ok = false;
879
+ error = toErrorSummaryWithCode2(base, "RuntimeFailure");
886
880
  }
887
881
  }
888
882
  const environment = buildEnvironmentIr({
@@ -910,7 +904,6 @@ var trialRunModule = (root, options) => Effect4.gen(function* () {
910
904
  artifacts,
911
905
  environment,
912
906
  evidence,
913
- summary,
914
907
  error
915
908
  };
916
909
  const maxBytes = options?.budgets?.maxBytes;
@@ -992,4 +985,4 @@ export {
992
985
  trialRunModule,
993
986
  trialRun
994
987
  };
995
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9zdGF0aWNJci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL21hbmlmZXN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL3JlZ2lzdHJ5LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW5Nb2R1bGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQnVpbGRFbnYudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQ29uc3RydWN0aW9uR3VhcmQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vUnVudGltZUhvc3QudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9SdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL21vZGVsLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL2RpZ2VzdC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L2FydGlmYWN0cy9jb2xsZWN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHsgZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvaXIuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRlVHJhaXRQcm9ncmFtIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvbW9kZWwuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciBhcyBleHBvcnRTdGF0ZVRyYWl0U3RhdGljSXIgfSBmcm9tICcuLi9zdGF0ZS10cmFpdC9pci5qcydcblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVNb2R1bGVUYWcgPSAoaW5wdXQ6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKGlzTW9kdWxlSW1wbChpbnB1dCkpIHJldHVybiBpbnB1dC5tb2R1bGVcbiAgaWYgKGlzUmVjb3JkKGlucHV0KSAmJiAoaW5wdXQgYXMgYW55KS50YWcpIHJldHVybiAoaW5wdXQgYXMgYW55KS50YWdcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgZXhwb3J0U3RhdGljSXIgPSAobW9kdWxlOiB1bmtub3duKTogU3RhdGljSXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB0YWcgPSByZXNvbHZlTW9kdWxlVGFnKG1vZHVsZSlcbiAgaWYgKCF0YWcpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBwcm9ncmFtID0gZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSh0YWcpIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4gfCB1bmRlZmluZWRcbiAgaWYgKCFwcm9ncmFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGV4cG9ydFN0YXRlVHJhaXRTdGF0aWNJcih7XG4gICAgcHJvZ3JhbSxcbiAgICBtb2R1bGVJZDogcmVzb2x2ZU1vZHVsZUlkKG1vZHVsZSksXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanMnXG5pbXBvcnQgKiBhcyBBY3Rpb24gZnJvbSAnLi4vYWN0aW9uLmpzJ1xuaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5LCBmbnYxYTMyIH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciB9IGZyb20gJy4vc3RhdGljSXIuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3RCdWRnZXRzIHtcbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0TWFuaWZlc3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgaW5jbHVkZVN0YXRpY0lyPzogYm9vbGVhblxuICByZWFkb25seSBidWRnZXRzPzogTWFuaWZlc3RCdWRnZXRzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQge1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICByZWFkb25seSBkZXJpdmVkPzogYm9vbGVhblxuICByZWFkb25seSBuYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RBY3Rpb24ge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBwYXlsb2FkOiB7XG4gICAgcmVhZG9ubHkga2luZDogJ3ZvaWQnIHwgJ25vblZvaWQnIHwgJ3Vua25vd24nXG4gIH1cbiAgcmVhZG9ubHkgcHJpbWFyeVJlZHVjZXI/OiB7XG4gICAgcmVhZG9ubHkga2luZDogJ2RlY2xhcmVkJyB8ICdyZWdpc3RlcmVkJ1xuICB9XG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RFZmZlY3Qge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBzb3VyY2VLZXk6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiAnZGVjbGFyZWQnIHwgJ3JlZ2lzdGVyZWQnXG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3Qge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc291cmNlPzoge1xuICAgIHJlYWRvbmx5IGZpbGU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGxpbmU6IG51bWJlclxuICAgIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyXG4gIH1cbiAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT5cbiAgcmVhZG9ubHkgc3RhdGljSXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBleHBvcnRTdGF0aWNJcj5cbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25LZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgdGFnID0gaXNNb2R1bGVJbXBsKGlucHV0KSA/IChpbnB1dC5tb2R1bGUgYXMgYW55KSA6IChpbnB1dCBhcyBhbnkpPy50YWdcbiAgY29uc3QgYWN0aW9uTWFwID0gdGFnPy5zaGFwZT8uYWN0aW9uTWFwXG4gIGlmICghaXNSZWNvcmQoYWN0aW9uTWFwKSkgcmV0dXJuIFtdXG4gIHJldHVybiBPYmplY3Qua2V5cyhhY3Rpb25NYXApLnNvcnQoKVxufVxuXG50eXBlIERldlNvdXJjZSA9IE1vZHVsZU1hbmlmZXN0Wydzb3VyY2UnXVxuXG5jb25zdCByZXNvbHZlRGV2U291cmNlID0gKGlucHV0OiB1bmtub3duKTogRGV2U291cmNlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgZmlsZSA9IChpbnB1dCBhcyBhbnkpLmZpbGVcbiAgY29uc3QgbGluZSA9IChpbnB1dCBhcyBhbnkpLmxpbmVcbiAgY29uc3QgY29sdW1uID0gKGlucHV0IGFzIGFueSkuY29sdW1uXG4gIGlmICh0eXBlb2YgZmlsZSAhPT0gJ3N0cmluZycgfHwgZmlsZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHR5cGVvZiBsaW5lICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAxKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB7IGZpbGUsIGxpbmUsIGNvbHVtbiB9XG59XG5cbmNvbnN0IHJlc29sdmVUb2tlblNvdXJjZSA9ICh0b2tlbjogdW5rbm93bik6IERldlNvdXJjZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghdG9rZW4gfHwgKHR5cGVvZiB0b2tlbiAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHRva2VuICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gcmVzb2x2ZURldlNvdXJjZSgodG9rZW4gYXMgYW55KS5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25zID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEFjdGlvbj4gPT4ge1xuICBjb25zdCB0YWcgPSBpc01vZHVsZUltcGwoaW5wdXQpID8gKGlucHV0Lm1vZHVsZSBhcyBhbnkpIDogKGlucHV0IGFzIGFueSk/LnRhZ1xuICBjb25zdCBhY3Rpb25NYXAgPSB0YWc/LnNoYXBlPy5hY3Rpb25NYXBcbiAgaWYgKCFpc1JlY29yZChhY3Rpb25NYXApKSByZXR1cm4gW11cblxuICBjb25zdCBtb2R1bGVTb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuICBjb25zdCByZWR1Y2VycyA9IGlzUmVjb3JkKHRhZz8ucmVkdWNlcnMpID8gKHRhZy5yZWR1Y2VycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiB1bmRlZmluZWRcblxuICBjb25zdCBhY3Rpb25UYWdzID0gT2JqZWN0LmtleXMoYWN0aW9uTWFwKS5zb3J0KClcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPiA9IFtdXG4gIGZvciAoY29uc3QgYWN0aW9uVGFnIG9mIGFjdGlvblRhZ3MpIHtcbiAgICBjb25zdCB0b2tlbiA9IGFjdGlvbk1hcFthY3Rpb25UYWddXG4gICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVRva2VuU291cmNlKHRva2VuKSA/PyBtb2R1bGVTb3VyY2VcbiAgICBjb25zdCBwYXlsb2FkS2luZCA9XG4gICAgICBBY3Rpb24uaXNBY3Rpb25Ub2tlbih0b2tlbikgJiYgU2NoZW1hLmlzU2NoZW1hKCh0b2tlbiBhcyBBY3Rpb24uQW55QWN0aW9uVG9rZW4pLnNjaGVtYSlcbiAgICAgICAgPyAodG9rZW4gYXMgQWN0aW9uLkFueUFjdGlvblRva2VuKS5zY2hlbWEgPT09IFNjaGVtYS5Wb2lkXG4gICAgICAgICAgPyAndm9pZCdcbiAgICAgICAgICA6ICdub25Wb2lkJ1xuICAgICAgICA6ICd1bmtub3duJ1xuXG4gICAgY29uc3QgcHJpbWFyeVJlZHVjZXIgPVxuICAgICAgcmVkdWNlcnMgJiYgdHlwZW9mIHJlZHVjZXJzW2FjdGlvblRhZ10gPT09ICdmdW5jdGlvbicgPyAoeyBraW5kOiAnZGVjbGFyZWQnIH0gYXMgY29uc3QpIDogdW5kZWZpbmVkXG5cbiAgICBvdXQucHVzaCh7XG4gICAgICBhY3Rpb25UYWcsXG4gICAgICBwYXlsb2FkOiB7IGtpbmQ6IHBheWxvYWRLaW5kIH0sXG4gICAgICAuLi4ocHJpbWFyeVJlZHVjZXIgPyB7IHByaW1hcnlSZWR1Y2VyIH0gOiB7fSksXG4gICAgICAuLi4oc291cmNlID8geyBzb3VyY2UgfSA6IHt9KSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBNT0RVTEVfREVDTEFSRURfRUZGRUNUUyA9IFN5bWJvbC5mb3IoJ2xvZ2l4Lm1vZHVsZS5lZmZlY3RzLmRlY2xhcmVkJylcblxuY29uc3QgcmVzb2x2ZUVmZmVjdHMgPSAoaW5wdXQ6IHVua25vd24pOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0RWZmZWN0PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHRhZyA9IGlzTW9kdWxlSW1wbChpbnB1dCkgPyAoaW5wdXQubW9kdWxlIGFzIGFueSkgOiAoaW5wdXQgYXMgYW55KT8udGFnXG4gIGNvbnN0IGFjdGlvbk1hcCA9IHRhZz8uc2hhcGU/LmFjdGlvbk1hcFxuICBpZiAoIWlzUmVjb3JkKGFjdGlvbk1hcCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBlZmZlY3RzUmF3ID0gKHRhZyBhcyBhbnkpPy5bTU9EVUxFX0RFQ0xBUkVEX0VGRkVDVFNdXG4gIGlmICghaXNSZWNvcmQoZWZmZWN0c1JhdykpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuXG4gIGNvbnN0IGxvZ2ljVW5pdElkID0gJ19fbG9naXhfaW50ZXJuYWw6ZWZmZWN0czpkZWNsYXJlZCdcbiAgY29uc3QgaGFuZGxlcklkcyA9IG5ldyBXZWFrTWFwPCguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBzdHJpbmc+KClcbiAgbGV0IG5leHRIYW5kbGVyU2VxID0gMFxuXG4gIGNvbnN0IG91dDogQXJyYXk8TW9kdWxlTWFuaWZlc3RFZmZlY3Q+ID0gW11cblxuICBmb3IgKGNvbnN0IGFjdGlvblRhZyBvZiBPYmplY3Qua2V5cyhlZmZlY3RzUmF3KS5zb3J0KCkpIHtcbiAgICBpZiAoIShhY3Rpb25UYWcgaW4gYWN0aW9uTWFwKSkgY29udGludWVcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKGVmZmVjdHNSYXcgYXMgYW55KVthY3Rpb25UYWddXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkgY29udGludWVcblxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nKSBjb250aW51ZVxuXG4gICAgICBsZXQgaGFuZGxlcklkID0gaGFuZGxlcklkcy5nZXQoaGFuZGxlcilcbiAgICAgIGlmICghaGFuZGxlcklkKSB7XG4gICAgICAgIG5leHRIYW5kbGVyU2VxICs9IDFcbiAgICAgICAgaGFuZGxlcklkID0gYGgke25leHRIYW5kbGVyU2VxfWBcbiAgICAgICAgaGFuZGxlcklkcy5zZXQoaGFuZGxlciwgaGFuZGxlcklkKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VLZXkgPSBgJHtsb2dpY1VuaXRJZH06OiR7aGFuZGxlcklkfWBcblxuICAgICAgb3V0LnB1c2goe1xuICAgICAgICBhY3Rpb25UYWcsXG4gICAgICAgIHNvdXJjZUtleSxcbiAgICAgICAga2luZDogJ2RlY2xhcmVkJyxcbiAgICAgICAgLi4uKHNvdXJjZSA/IHsgc291cmNlIH0gOiB7fSksXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuICBjb25zdCBkZWR1cGVkOiBBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD4gPSBbXVxuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb3V0KSB7XG4gICAgY29uc3Qga2V5ID0gYCR7aXRlbS5hY3Rpb25UYWd9XFx1MDAwMCR7aXRlbS5zb3VyY2VLZXl9YFxuICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKGtleSlcbiAgICBkZWR1cGVkLnB1c2goaXRlbSlcbiAgfVxuXG4gIGRlZHVwZWQuc29ydCgoYSwgYikgPT5cbiAgICBhLmFjdGlvblRhZyA8IGIuYWN0aW9uVGFnID8gLTEgOiBhLmFjdGlvblRhZyA+IGIuYWN0aW9uVGFnID8gMSA6IGEuc291cmNlS2V5LmxvY2FsZUNvbXBhcmUoYi5zb3VyY2VLZXkpLFxuICApXG4gIHJldHVybiBkZWR1cGVkLmxlbmd0aCA+IDAgPyBkZWR1cGVkIDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IHJlc29sdmVTY2hlbWFLZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2NoZW1hcyA9IChpbnB1dCBhcyBhbnkpLnNjaGVtYXNcbiAgaWYgKCFpc1JlY29yZChzY2hlbWFzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hcykuc29ydCgpXG59XG5cbmNvbnN0IHJlc29sdmVTb3VyY2UgPSAoaW5wdXQ6IHVua25vd24pOiBNb2R1bGVNYW5pZmVzdFsnc291cmNlJ10gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBkZXYgPSAoaW5wdXQgYXMgYW55KS5kZXZcbiAgcmV0dXJuIHJlc29sdmVEZXZTb3VyY2UoZGV2Py5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVNZXRhID0gKGlucHV0OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNSZWNvcmQoaW5wdXQpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG1ldGEgPSAoaW5wdXQgYXMgYW55KS5tZXRhXG4gIGlmICghaXNSZWNvcmQobWV0YSkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKS5zb3J0KCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGFba2V5XVxuICAgIGlmIChpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIG91dFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBNT0RVTEVfSU5URVJOQUwgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaW50ZXJuYWwnKVxuXG5jb25zdCByZXNvbHZlTG9naWNVbml0cyA9IChpbnB1dDogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgaW50ZXJuYWwgPSAoaW5wdXQgYXMgYW55KVtNT0RVTEVfSU5URVJOQUxdXG4gIGNvbnN0IG1vdW50ZWQgPSBpbnRlcm5hbD8ubW91bnRlZFxuICBpZiAoIUFycmF5LmlzQXJyYXkobW91bnRlZCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiA9IFtdXG4gIGZvciAoY29uc3QgdW5pdCBvZiBtb3VudGVkKSB7XG4gICAgaWYgKCFpc1JlY29yZCh1bml0KSkgY29udGludWVcbiAgICBjb25zdCBraW5kID0gdW5pdC5raW5kXG4gICAgY29uc3QgaWQgPSB1bml0LmlkXG4gICAgaWYgKHR5cGVvZiBraW5kICE9PSAnc3RyaW5nJyB8fCBraW5kLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICBjb25zdCBkZXJpdmVkID0gdW5pdC5kZXJpdmVkID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5pdC5uYW1lID09PSAnc3RyaW5nJyA/IHVuaXQubmFtZSA6IHVuZGVmaW5lZFxuICAgIG91dC5wdXNoKHsga2luZCwgaWQsIGRlcml2ZWQsIG5hbWUgfSlcbiAgfVxuXG4gIG91dC5zb3J0KChhLCBiKSA9PiAoYS5pZCA8IGIuaWQgPyAtMSA6IGEuaWQgPiBiLmlkID8gMSA6IGEua2luZC5sb2NhbGVDb21wYXJlKGIua2luZCkpKVxuICByZXR1cm4gb3V0Lmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWRcbn1cblxudHlwZSBEaWdlc3RCYXNlID0ge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc3RhdGljSXJEaWdlc3Q/OiBzdHJpbmdcbn1cblxuY29uc3QgZGlnZXN0T2YgPSAoYmFzZTogRGlnZXN0QmFzZSk6IHN0cmluZyA9PiBgbWFuaWZlc3Q6MDY3OiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoYmFzZSkpfWBcblxuY29uc3QgdXRmOEJ5dGVMZW5ndGggPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKS5sZW5ndGhcbiAgfVxuICByZXR1cm4ganNvbi5sZW5ndGhcbn1cblxuY29uc3QgYXBwbHlNYXhCeXRlcyA9IChtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QsIG1heEJ5dGVzOiBudW1iZXIpOiBNb2R1bGVNYW5pZmVzdCA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsQnl0ZXMgPSB1dGY4Qnl0ZUxlbmd0aChtYW5pZmVzdClcbiAgaWYgKG9yaWdpbmFsQnl0ZXMgPD0gbWF4Qnl0ZXMpIHJldHVybiBtYW5pZmVzdFxuXG4gIGNvbnN0IGRyb3BwZWQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBjb25zdCB0cnVuY2F0ZWRBcnJheXM6IEFycmF5PHN0cmluZz4gPSBbXVxuXG4gIGNvbnN0IGJhc2VNYXJrZXIgPSAoKTogSnNvblZhbHVlID0+ICh7XG4gICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgIG1heEJ5dGVzLFxuICAgIG9yaWdpbmFsQnl0ZXMsXG4gICAgZHJvcHBlZCxcbiAgICB0cnVuY2F0ZWRBcnJheXMsXG4gIH0pXG5cbiAgY29uc3Qgd2l0aE1hcmtlciA9IChuZXh0OiBNb2R1bGVNYW5pZmVzdCk6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0ge1xuICAgICAgX19sb2dpeDogYmFzZU1hcmtlcigpLFxuICAgIH1cbiAgICByZXR1cm4geyAuLi5uZXh0LCBtZXRhIH1cbiAgfVxuXG4gIGxldCBuZXh0OiBNb2R1bGVNYW5pZmVzdCA9IHdpdGhNYXJrZXIobWFuaWZlc3QpXG5cbiAgY29uc3QgbWFya1RydW5jYXRlZEFycmF5ID0gKG5hbWU6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICghdHJ1bmNhdGVkQXJyYXlzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICB0cnVuY2F0ZWRBcnJheXMucHVzaChuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRyb3BGaWVsZCA9IChmaWVsZDoga2V5b2YgTW9kdWxlTWFuaWZlc3QpOiB2b2lkID0+IHtcbiAgICBpZiAoKG5leHQgYXMgYW55KVtmaWVsZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZHJvcHBlZC5wdXNoKFN0cmluZyhmaWVsZCkpXG4gICAgICBuZXh0ID0gd2l0aE1hcmtlcih7IC4uLihuZXh0IGFzIGFueSksIFtmaWVsZF06IHVuZGVmaW5lZCB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIERldGVybWluaXN0aWMgdHJpbW1pbmcgb3JkZXIgKGxlYXN0IHZhbHVhYmxlIGZpcnN0KS5cbiAgZHJvcEZpZWxkKCdtZXRhJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc291cmNlJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc3RhdGljSXInKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgZHJvcEZpZWxkKCdsb2dpY1VuaXRzJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc2NoZW1hS2V5cycpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoJ2VmZmVjdHMnKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgLy8gTGFzdCByZXNvcnQ6IGRldGVybWluaXN0aWNhbGx5IHRydW5jYXRlIHRhaWwgaXRlbXMgKHN0YWJsZSBvcmRlcjogYWN0aW9uc1tdIHNvcnRlZCBieSBhY3Rpb25UYWcpLlxuICBjb25zdCB0cnVuY2F0ZUFjdGlvbnNUb0ZpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0b3RhbCA9IG5leHQuYWN0aW9ucy5sZW5ndGhcbiAgICBpZiAodG90YWwgPD0gMSkgcmV0dXJuXG5cbiAgICAvLyBGaW5kIHRoZSBsYXJnZXN0IHByZWZpeCB0aGF0IGZpdHMuXG4gICAgbGV0IGxvID0gMVxuICAgIGxldCBoaSA9IHRvdGFsXG4gICAgbGV0IGJlc3QgPSAxXG5cbiAgICB3aGlsZSAobG8gPD0gaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvICsgaGkpIC8gMilcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgbWlkKSxcbiAgICAgICAgYWN0aW9uS2V5czogbmV4dC5hY3Rpb25LZXlzLnNsaWNlKDAsIG1pZCksXG4gICAgICB9KVxuICAgICAgaWYgKHV0ZjhCeXRlTGVuZ3RoKGNhbmRpZGF0ZSkgPD0gbWF4Qnl0ZXMpIHtcbiAgICAgICAgYmVzdCA9IG1pZFxuICAgICAgICBsbyA9IG1pZCArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpID0gbWlkIC0gMVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiZXN0IDwgdG90YWwpIHtcbiAgICAgIG1hcmtUcnVuY2F0ZWRBcnJheSgnYWN0aW9ucycpXG4gICAgICBtYXJrVHJ1bmNhdGVkQXJyYXkoJ2FjdGlvbktleXMnKVxuICAgICAgbmV4dCA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgYmVzdCksXG4gICAgICAgIGFjdGlvbktleXM6IG5leHQuYWN0aW9uS2V5cy5zbGljZSgwLCBiZXN0KSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpID4gbWF4Qnl0ZXMpIHtcbiAgICBjb25zdCBiZWZvcmVMZW4gPSBuZXh0LmFjdGlvbnMubGVuZ3RoXG4gICAgdHJ1bmNhdGVBY3Rpb25zVG9GaXQoKVxuICAgIGlmIChuZXh0LmFjdGlvbnMubGVuZ3RoID09PSBiZWZvcmVMZW4pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RNYW5pZmVzdCA9IChtb2R1bGU6IHVua25vd24sIG9wdGlvbnM/OiBFeHRyYWN0TWFuaWZlc3RPcHRpb25zKTogTW9kdWxlTWFuaWZlc3QgPT4ge1xuICBjb25zdCBtYW5pZmVzdFZlcnNpb24gPSAnMDY3J1xuICBjb25zdCBtb2R1bGVJZCA9IHJlc29sdmVNb2R1bGVJZChtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbktleXMgPSByZXNvbHZlQWN0aW9uS2V5cyhtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbnMgPSByZXNvbHZlQWN0aW9ucyhtb2R1bGUpXG4gIGNvbnN0IGVmZmVjdHMgPSByZXNvbHZlRWZmZWN0cyhtb2R1bGUpXG5cbiAgY29uc3Qgc2NoZW1hS2V5cyA9IHJlc29sdmVTY2hlbWFLZXlzKG1vZHVsZSlcbiAgY29uc3QgbG9naWNVbml0cyA9IHJlc29sdmVMb2dpY1VuaXRzKG1vZHVsZSlcbiAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVNvdXJjZShtb2R1bGUpXG4gIGNvbnN0IG1ldGEgPSByZXNvbHZlTWV0YShtb2R1bGUpXG5cbiAgY29uc3Qgc3RhdGljSXIgPSBvcHRpb25zPy5pbmNsdWRlU3RhdGljSXIgPyBleHBvcnRTdGF0aWNJcihtb2R1bGUpIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZGlnZXN0QmFzZTogRGlnZXN0QmFzZSA9IHtcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kdWxlSWQsXG4gICAgYWN0aW9uS2V5cyxcbiAgICBhY3Rpb25zLFxuICAgIGVmZmVjdHMsXG4gICAgc2NoZW1hS2V5cyxcbiAgICBsb2dpY1VuaXRzLFxuICAgIHN0YXRpY0lyRGlnZXN0OiBzdGF0aWNJcj8uZGlnZXN0LFxuICB9XG5cbiAgY29uc3QgZGlnZXN0ID0gZGlnZXN0T2YoZGlnZXN0QmFzZSlcblxuICBjb25zdCBtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QgPSB7XG4gICAgbWFuaWZlc3RWZXJzaW9uLFxuICAgIG1vZHVsZUlkLFxuICAgIGFjdGlvbktleXMsXG4gICAgYWN0aW9ucyxcbiAgICBlZmZlY3RzLFxuICAgIHNjaGVtYUtleXMsXG4gICAgbG9naWNVbml0cyxcbiAgICBzb3VyY2UsXG4gICAgbWV0YSxcbiAgICBzdGF0aWNJcixcbiAgICBkaWdlc3QsXG4gIH1cblxuICBjb25zdCBtYXhCeXRlcyA9IG9wdGlvbnM/LmJ1ZGdldHM/Lm1heEJ5dGVzXG4gIGlmICh0eXBlb2YgbWF4Qnl0ZXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShtYXhCeXRlcykgJiYgbWF4Qnl0ZXMgPiAwKSB7XG4gICAgcmV0dXJuIGFwcGx5TWF4Qnl0ZXMobWFuaWZlc3QsIG1heEJ5dGVzKVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIgfSBmcm9tICcuL2V4cG9ydGVyLmpzJ1xuXG5jb25zdCBBUlRJRkFDVF9FWFBPUlRFUlMgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUudHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVycycpXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9ICh0YWc6IHVua25vd24sIGV4cG9ydGVyOiBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIpOiB2b2lkID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbTG9naXhdIHJlZ2lzdGVyVHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVyOiBpbnZhbGlkIG1vZHVsZSB0YWcnKVxuICB9XG5cbiAgY29uc3QgY3VycmVudCA9ICgodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA/PyBbXSkgYXMgdW5rbm93blxuICBjb25zdCBuZXh0ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IFsuLi5jdXJyZW50LCBleHBvcnRlcl0gOiBbZXhwb3J0ZXJdXG4gIDsodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA9IG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgPSAodGFnOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXI+ID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBjdXJyZW50ID0gKHRhZyBhcyBhbnkpW0FSVElGQUNUX0VYUE9SVEVSU10gYXMgdW5rbm93blxuICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudCkpIHJldHVybiBbXVxuICByZXR1cm4gY3VycmVudC5maWx0ZXIoKHgpOiB4IGlzIFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9PiB4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0Jylcbn1cbiIsICJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBFeGl0LCBGaWJlciwgTGF5ZXIsIE9wdGlvbiB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0ICogYXMgQnVpbGRFbnYgZnJvbSAnLi4vcGxhdGZvcm0vQnVpbGRFbnYuanMnXG5pbXBvcnQgdHlwZSB7IEV2aWRlbmNlUGFja2FnZSwgRXZpZGVuY2VQYWNrYWdlU291cmNlIH0gZnJvbSAnLi9ldmlkZW5jZS5qcydcbmltcG9ydCB7IG1ha2VFdmlkZW5jZUNvbGxlY3RvciwgZXZpZGVuY2VDb2xsZWN0b3JMYXllciB9IGZyb20gJy4vZXZpZGVuY2VDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBtYWtlUnVuU2Vzc2lvbiwgcnVuU2Vzc2lvbkxheWVyLCB0eXBlIFJ1bklkIH0gZnJvbSAnLi9ydW5TZXNzaW9uLmpzJ1xuaW1wb3J0IHtcbiAgYXBwZW5kU2lua3MsXG4gIGRpYWdub3N0aWNzTGV2ZWwsXG4gIHR5cGUgRGlhZ25vc3RpY3NMZXZlbCxcbiAgdHlwZSBTaW5rIGFzIERlYnVnU2luayxcbn0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qcydcbmltcG9ydCB0eXBlIHsgS2VybmVsSW1wbGVtZW50YXRpb25SZWYgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvS2VybmVsUmVmLmpzJ1xuaW1wb3J0ICogYXMgS2VybmVsUmVmIGZyb20gJy4uL3J1bnRpbWUvY29yZS9LZXJuZWxSZWYuanMnXG5pbXBvcnQgKiBhcyBSdW50aW1lS2VybmVsIGZyb20gJy4uL3J1bnRpbWUvY29yZS9SdW50aW1lS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0NvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgbWFrZVByb2dyYW1SdW5uZXJLZXJuZWwgfSBmcm9tICcuLi9ydW50aW1lL1Byb2dyYW1SdW5uZXIua2VybmVsLmpzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hbmlmZXN0LCB0eXBlIE1vZHVsZU1hbmlmZXN0IH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9tYW5pZmVzdC5qcydcbmltcG9ydCB7IGV4cG9ydFN0YXRpY0lyIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9zdGF0aWNJci5qcydcbmltcG9ydCAqIGFzIFJ1bnRpbWUgZnJvbSAnLi4vcnVudGltZS9SdW50aW1lLmpzJ1xuaW1wb3J0IHsgY29sbGVjdFRyaWFsUnVuQXJ0aWZhY3RzIH0gZnJvbSAnLi9hcnRpZmFjdHMvY29sbGVjdC5qcydcbmltcG9ydCB0eXBlIHsgVHJpYWxSdW5BcnRpZmFjdHMgfSBmcm9tICcuL2FydGlmYWN0cy9tb2RlbC5qcydcbmltcG9ydCB7IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgfSBmcm9tICcuL2FydGlmYWN0cy9yZWdpc3RyeS5qcydcblxudHlwZSBSb290TGlrZTxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPiA9IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PiB8IHsgcmVhZG9ubHkgaW1wbDogTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+IH1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1blJlcG9ydEJ1ZGdldHMge1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFsUnVuUmVwb3J0IHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZ1xuICByZWFkb25seSBvazogYm9vbGVhblxuICByZWFkb25seSBtYW5pZmVzdD86IE1vZHVsZU1hbmlmZXN0XG4gIHJlYWRvbmx5IHN0YXRpY0lyPzogUmV0dXJuVHlwZTx0eXBlb2YgZXhwb3J0U3RhdGljSXI+XG4gIHJlYWRvbmx5IGFydGlmYWN0cz86IFRyaWFsUnVuQXJ0aWZhY3RzXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogRW52aXJvbm1lbnRJclxuICByZWFkb25seSBldmlkZW5jZT86IEV2aWRlbmNlUGFja2FnZVxuICByZWFkb25seSBzdW1tYXJ5PzogdW5rbm93blxuICByZWFkb25seSBlcnJvcj86IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SXIge1xuICByZWFkb25seSB0YWdJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBjb25maWdLZXlzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ1NlcnZpY2VzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ0NvbmZpZ0tleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZj86IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZVxuICByZWFkb25seSBub3Rlcz86IHVua25vd25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bk1vZHVsZU9wdGlvbnMge1xuICByZWFkb25seSBydW5JZD86IFJ1bklkXG4gIHJlYWRvbmx5IHNvdXJjZT86IEV2aWRlbmNlUGFja2FnZVNvdXJjZVxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT5cbiAgcmVhZG9ubHkgYnVpbGRFbnY/OiB7XG4gICAgcmVhZG9ubHkgY29uZmlnPzogUmVjb3JkPHN0cmluZywgQnVpbGRFbnYuQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD5cbiAgICByZWFkb25seSBob3N0S2luZD86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1sncnVudGltZUhvc3RLaW5kJ11cbiAgICByZWFkb25seSBjb25maWdQcm92aWRlcj86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1snY29uZmlnUHJvdmlkZXInXVxuICB9XG4gIHJlYWRvbmx5IHRyaWFsUnVuVGltZW91dE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IGNsb3NlU2NvcGVUaW1lb3V0PzogbnVtYmVyXG4gIHJlYWRvbmx5IGJ1ZGdldHM/OiBUcmlhbFJ1blJlcG9ydEJ1ZGdldHNcbn1cblxuY29uc3QgZGVmYXVsdEhvc3QgPSAoKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnYnJvd3NlcidcbiAgcmV0dXJuICdub2RlJ1xufVxuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHJlc29sdmVSb290SW1wbCA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihyb290OiBSb290TGlrZTxTaD4pOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gPT5cbiAgKChyb290IGFzIGFueSk/Ll90YWcgPT09ICdNb2R1bGVJbXBsJ1xuICAgID8gKHJvb3QgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KVxuICAgIDogKChyb290IGFzIGFueSk/LmltcGwgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KSkgc2F0aXNmaWVzIE1vZHVsZUltcGw8YW55LCBTaCwgYW55PlxuXG5jb25zdCB1dGY4Qnl0ZUxlbmd0aCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGpzb24pLmxlbmd0aFxuICB9XG4gIHJldHVybiBqc29uLmxlbmd0aFxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdDb25maWdLZXlzID0gKG1lc3NhZ2U6IHN0cmluZyk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEVmZmVjdCBDb25maWcgZXJyb3IgbWVzc2FnZXMgdmFyeTsga2VlcCBwYXJzaW5nIGNvbnNlcnZhdGl2ZSBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgY29uc3QgcGF0dGVybnM6IFJlYWRvbmx5QXJyYXk8UmVnRXhwPiA9IFtcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBmb3IgKD86a2V5fHBhdGgpIFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBhdCAoW0EtWjAtOV8uLzotXSspXFxiL2csXG4gICAgL1xcYk1pc3NpbmcgY29uZmlndXJhdGlvbjo/IFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiQ29uZmlnXFxiLipcXGJtaXNzaW5nXFxiLipcIj8oW0EtWjAtOV8uLzotXSspXCI/L2dpLFxuICBdXG5cbiAgZm9yIChjb25zdCByZSBvZiBwYXR0ZXJucykge1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAgIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKG1lc3NhZ2UpKSkge1xuICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV1cbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMCkgb3V0LnB1c2goa2V5KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQob3V0KSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdTZXJ2aWNlSWRzID0gKG1lc3NhZ2U6IHN0cmluZyk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXVxuICBjb25zdCByZSA9IC9TZXJ2aWNlIG5vdCBmb3VuZDogKFteXFxzKF0rKS9nXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICB3aGlsZSAoKG1hdGNoID0gcmUuZXhlYyhtZXNzYWdlKSkpIHtcbiAgICBjb25zdCBpZCA9IG1hdGNoWzFdPy5yZXBsYWNlKC9bLDouO10rJC8sICcnKVxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCA+IDApIG91dC5wdXNoKGlkKVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQob3V0KSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdEZXBlbmRlbmN5RnJvbUNhdXNlID0gKFxuICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4pOiB7XG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlczogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IG1pc3NpbmdDb25maWdLZXlzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn0gPT4ge1xuICBjb25zdCBtaXNzaW5nU2VydmljZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgbWlzc2luZ0NvbmZpZ0tleXM6IHN0cmluZ1tdID0gW11cblxuICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLkFycmF5LmZyb20oQ2F1c2UuZmFpbHVyZXMoY2F1c2UpKSwgLi4uQXJyYXkuZnJvbShDYXVzZS5kZWZlY3RzKGNhdXNlKSldXG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChpc1JlY29yZChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUgYXMgYW55KS5fdGFnID09PSAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcicpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdTZXJ2aWNlID0gKGNhbmRpZGF0ZSBhcyBhbnkpLm1pc3NpbmdTZXJ2aWNlXG4gICAgICBpZiAodHlwZW9mIG1pc3NpbmdTZXJ2aWNlID09PSAnc3RyaW5nJyAmJiBtaXNzaW5nU2VydmljZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1pc3NpbmdTZXJ2aWNlcy5wdXNoKG1pc3NpbmdTZXJ2aWNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGlzUmVjb3JkKGNhbmRpZGF0ZSkgJiZcbiAgICAgIChjYW5kaWRhdGUgYXMgYW55KS5fdGFnID09PSAnQ29uZmlnRXJyb3InICYmXG4gICAgICAoY2FuZGlkYXRlIGFzIGFueSkuX29wID09PSAnTWlzc2luZ0RhdGEnICYmXG4gICAgICBBcnJheS5pc0FycmF5KChjYW5kaWRhdGUgYXMgYW55KS5wYXRoKSAmJlxuICAgICAgKGNhbmRpZGF0ZSBhcyBhbnkpLnBhdGguZXZlcnkoKGs6IHVua25vd24pID0+IHR5cGVvZiBrID09PSAnc3RyaW5nJyAmJiBrLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICBjb25zdCBrZXkgPSAoY2FuZGlkYXRlIGFzIGFueSkucGF0aC5qb2luKCcuJylcbiAgICAgIGlmIChrZXkubGVuZ3RoID4gMCkgbWlzc2luZ0NvbmZpZ0tleXMucHVzaChrZXkpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgbWVzc2FnZXMucHVzaChjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZXMucHVzaChjYW5kaWRhdGUpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoaXNSZWNvcmQoY2FuZGlkYXRlKSAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyBhbnkpLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlcy5wdXNoKFN0cmluZygoY2FuZGlkYXRlIGFzIGFueSkubWVzc2FnZSkpXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBtZXNzYWdlcy5wdXNoKENhdXNlLnByZXR0eShjYXVzZSwgeyByZW5kZXJFcnJvckNhdXNlOiB0cnVlIH0pKVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmVcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZCA9IG1lc3NhZ2VzLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKS5qb2luKCdcXG4nKVxuXG4gIGlmIChtZXJnZWQpIHtcbiAgICBtaXNzaW5nU2VydmljZXMucHVzaCguLi5wYXJzZU1pc3NpbmdTZXJ2aWNlSWRzKG1lcmdlZCkpXG4gICAgbWlzc2luZ0NvbmZpZ0tleXMucHVzaCguLi5wYXJzZU1pc3NpbmdDb25maWdLZXlzKG1lcmdlZCkpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1pc3NpbmdTZXJ2aWNlczogQXJyYXkuZnJvbShuZXcgU2V0KG1pc3NpbmdTZXJ2aWNlcykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgbWlzc2luZ0NvbmZpZ0tleXM6IEFycmF5LmZyb20obmV3IFNldChtaXNzaW5nQ29uZmlnS2V5cykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gIH1cbn1cblxuY29uc3QgYnVpbGRFbnZpcm9ubWVudElyID0gKHBhcmFtczoge1xuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZj86IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZVxuICByZWFkb25seSBidWlsZEVudkNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52LkJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+XG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlcz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBtaXNzaW5nQ29uZmlnS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufSk6IEVudmlyb25tZW50SXIgPT4ge1xuICBjb25zdCBwcm92aWRlZENvbmZpZ0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbXMuYnVpbGRFbnZDb25maWcgPz8ge30pXG4gICAgLmZpbHRlcigoaykgPT4gay5sZW5ndGggPiAwICYmIChwYXJhbXMuYnVpbGRFbnZDb25maWcgYXMgYW55KVtrXSAhPT0gdW5kZWZpbmVkKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG5cbiAgY29uc3QgbWlzc2luZ1NlcnZpY2VzID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhcmFtcy5taXNzaW5nU2VydmljZXMgPz8gW10pKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gIGNvbnN0IG1pc3NpbmdDb25maWdLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhcmFtcy5taXNzaW5nQ29uZmlnS2V5cyA/PyBbXSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBjb25zdCBydW50aW1lU2VydmljZUlkcyA9XG4gICAgcGFyYW1zLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPy5iaW5kaW5ncz8ubWFwKChiKSA9PiBiLnNlcnZpY2VJZCkuZmlsdGVyKChzKSA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycpID8/IFtdXG5cbiAgY29uc3QgdGFnSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5ydW50aW1lU2VydmljZUlkcywgLi4ubWlzc2luZ1NlcnZpY2VzXSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBjb25zdCBjb25maWdLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5wcm92aWRlZENvbmZpZ0tleXMsIC4uLm1pc3NpbmdDb25maWdLZXlzXSkpLnNvcnQoKGEsIGIpID0+XG4gICAgYS5sb2NhbGVDb21wYXJlKGIpLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICB0YWdJZHMsXG4gICAgY29uZmlnS2V5cyxcbiAgICBtaXNzaW5nU2VydmljZXMsXG4gICAgbWlzc2luZ0NvbmZpZ0tleXMsXG4gICAga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IHBhcmFtcy5rZXJuZWxJbXBsZW1lbnRhdGlvblJlZixcbiAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZTogcGFyYW1zLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLFxuICB9XG59XG5cbmNvbnN0IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUgPSAoY2F1c2U6IHVua25vd24sIGNvZGU6IHN0cmluZywgaGludD86IHN0cmluZyk6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSA9PiB7XG4gIGNvbnN0IGJhc2UgPSB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeShjYXVzZSkuZXJyb3JTdW1tYXJ5XG4gIHJldHVybiB7XG4gICAgbmFtZTogYmFzZS5uYW1lLFxuICAgIG1lc3NhZ2U6IGJhc2UubWVzc2FnZSxcbiAgICBjb2RlLFxuICAgIGhpbnQ6IGhpbnQgPz8gYmFzZS5oaW50LFxuICB9XG59XG5cbmNvbnN0IG1ha2VUcmlhbFJ1blRpbWVvdXRFcnJvciA9ICgpOiBFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignW0xvZ2l4XSB0cmlhbFJ1bk1vZHVsZSB0aW1lZCBvdXQnKSwge1xuICAgIG5hbWU6ICdUcmlhbFJ1blRpbWVvdXRFcnJvcicsXG4gIH0pXG5cbmNvbnN0IGF3YWl0RmliZXJFeGl0V2l0aFRpbWVvdXQgPSA8QSwgRT4oXG4gIGZpYmVyOiBGaWJlci5GaWJlcjxBLCBFPixcbiAgdGltZW91dE1zOiBudW1iZXIgfCB1bmRlZmluZWQsXG4pOiBFZmZlY3QuRWZmZWN0PEV4aXQuRXhpdDxBLCBFIHwgRXJyb3I+LCBuZXZlciwgbmV2ZXI+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBoYXNUaW1lb3V0ID0gdHlwZW9mIHRpbWVvdXRNcyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRNcykgJiYgdGltZW91dE1zID4gMFxuICAgIGNvbnN0IHN0YXJ0ID0gaGFzVGltZW91dCA/IERhdGUubm93KCkgOiAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgZXhpdE9wdCA9IHlpZWxkKiBGaWJlci5wb2xsKGZpYmVyKVxuICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZXhpdE9wdCkpIHtcbiAgICAgICAgcmV0dXJuIGV4aXRPcHQudmFsdWUgYXMgRXhpdC5FeGl0PEEsIEUgfCBFcnJvcj5cbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1RpbWVvdXQpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZE1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0XG4gICAgICAgIGlmIChlbGFwc2VkTXMgPj0gdGltZW91dE1zKSB7XG4gICAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdEZvcmsoZmliZXIpXG4gICAgICAgICAgcmV0dXJuIEV4aXQuZmFpbChtYWtlVHJpYWxSdW5UaW1lb3V0RXJyb3IoKSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOT1RFOiB0aW1lciB5aWVsZCAobm90IFRlc3RDbG9jay1iYXNlZClcbiAgICAgIHlpZWxkKiBFZmZlY3QucHJvbWlzZSgoKSA9PiBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4gc2V0VGltZW91dChyLCAxKSkpXG4gICAgfVxuICB9KVxuXG5leHBvcnQgY29uc3QgdHJpYWxSdW5Nb2R1bGUgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4oXG4gIHJvb3Q6IFJvb3RMaWtlPFNoPixcbiAgb3B0aW9ucz86IFRyaWFsUnVuTW9kdWxlT3B0aW9ucyxcbik6IEVmZmVjdC5FZmZlY3Q8VHJpYWxSdW5SZXBvcnQsIG5ldmVyLCBuZXZlcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJvb3RJbXBsID0gcmVzb2x2ZVJvb3RJbXBsKHJvb3QpXG5cbiAgICBjb25zdCBzZXNzaW9uID0gbWFrZVJ1blNlc3Npb24oe1xuICAgICAgcnVuSWQ6IG9wdGlvbnM/LnJ1bklkLFxuICAgICAgc291cmNlOiBvcHRpb25zPy5zb3VyY2UgPz8geyBob3N0OiBkZWZhdWx0SG9zdCgpLCBsYWJlbDogJ3RyaWFsLXJ1bi1tb2R1bGUnIH0sXG4gICAgICBzdGFydGVkQXQ6IG9wdGlvbnM/LnN0YXJ0ZWRBdCxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdG9yID0gbWFrZUV2aWRlbmNlQ29sbGVjdG9yKHNlc3Npb24pXG5cbiAgICBjb25zdCBjb252ZXJnZUNvbGxlY3RvcjogQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvciA9IHtcbiAgICAgIHJlZ2lzdGVyOiAoaXIpID0+IHtcbiAgICAgICAgY29sbGVjdG9yLnJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcihpcilcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3Qgc2lua3NMYXllciA9IGFwcGVuZFNpbmtzKFtjb2xsZWN0b3IuZGVidWdTaW5rIGFzIHVua25vd24gYXMgRGVidWdTaW5rXSlcbiAgICBjb25zdCByZXNvbHZlZERpYWdub3N0aWNzTGV2ZWwgPSBvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsID8/ICdsaWdodCdcbiAgICBjb25zdCBkaWFnbm9zdGljc0xheWVyID0gZGlhZ25vc3RpY3NMZXZlbChyZXNvbHZlZERpYWdub3N0aWNzTGV2ZWwpXG4gICAgY29uc3QgY29udmVyZ2VMYXllciA9IGFwcGVuZENvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3JzKFtjb252ZXJnZUNvbGxlY3Rvcl0pXG4gICAgY29uc3QgY29sbGVjdG9yTGF5ZXIgPSBldmlkZW5jZUNvbGxlY3RvckxheWVyKGNvbGxlY3RvcilcbiAgICBjb25zdCBzZXNzaW9uTGF5ZXIgPSBydW5TZXNzaW9uTGF5ZXIoc2Vzc2lvbilcblxuICAgIGNvbnN0IGJ1aWxkRW52Q29uZmlnID0gb3B0aW9ucz8uYnVpbGRFbnY/LmNvbmZpZ1xuICAgIGNvbnN0IGJ1aWxkRW52TGF5ZXIgPSBCdWlsZEVudi5sYXllcih7XG4gICAgICBydW50aW1lSG9zdEtpbmQ6IG9wdGlvbnM/LmJ1aWxkRW52Py5ob3N0S2luZCxcbiAgICAgIGNvbmZpZzogYnVpbGRFbnZDb25maWcsXG4gICAgICBjb25maWdQcm92aWRlcjogb3B0aW9ucz8uYnVpbGRFbnY/LmNvbmZpZ1Byb3ZpZGVyLFxuICAgIH0pXG5cbiAgICBjb25zdCB0cmlhbExheWVyID0gTGF5ZXIubWVyZ2VBbGwoXG4gICAgICBidWlsZEVudkxheWVyLFxuICAgICAgb3B0aW9ucz8ubGF5ZXIgPz8gKExheWVyLmVtcHR5IGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pLFxuICAgICAgc2Vzc2lvbkxheWVyLFxuICAgICAgY29sbGVjdG9yTGF5ZXIsXG4gICAgICBkaWFnbm9zdGljc0xheWVyLFxuICAgICAgc2lua3NMYXllcixcbiAgICAgIGNvbnZlcmdlTGF5ZXIsXG4gICAgKSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuICAgIGNvbnN0IGtlcm5lbCA9IHlpZWxkKiBtYWtlUHJvZ3JhbVJ1bm5lcktlcm5lbChcbiAgICAgIChpbXBsKSA9PlxuICAgICAgICBSdW50aW1lLm1ha2UoaW1wbCwge1xuICAgICAgICAgIGxheWVyOiB0cmlhbExheWVyIGFzIGFueSxcbiAgICAgICAgICAvLyB0cmlhbC1ydW4gZG9lcyBub3QgZW5hYmxlIGRldnRvb2xzIGJ5IGRlZmF1bHQ7IGRpYWdub3N0aWNzIGlzIGNvbnRyb2xsZWQgYnkgZGlhZ25vc3RpY3NMZXZlbC5cbiAgICAgICAgfSBhcyBhbnkpLFxuICAgICAgcm9vdEltcGwsXG4gICAgKVxuXG4gICAgY29uc3QgaWRlbnRpdHkgPSBrZXJuZWwuaWRlbnRpdHlcblxuICAgIGNvbnN0IGJvb3RGaWJlciA9IGtlcm5lbC5ydW50aW1lLnJ1bkZvcmsocm9vdEltcGwubW9kdWxlIGFzIGFueSlcbiAgICBjb25zdCBib290RXhpdCA9IHlpZWxkKiBhd2FpdEZpYmVyRXhpdFdpdGhUaW1lb3V0KGJvb3RGaWJlciwgb3B0aW9ucz8udHJpYWxSdW5UaW1lb3V0TXMpXG5cbiAgICBsZXQga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmIHwgdW5kZWZpbmVkXG4gICAgbGV0IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlIHwgdW5kZWZpbmVkXG4gICAgbGV0IGluc3RhbmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gICAgaWYgKEV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSkge1xuICAgICAgY29uc3QgbW9kdWxlUnVudGltZSA9IGJvb3RFeGl0LnZhbHVlIGFzIGFueVxuICAgICAgaW5zdGFuY2VJZCA9XG4gICAgICAgIHR5cGVvZiBtb2R1bGVSdW50aW1lPy5pbnN0YW5jZUlkID09PSAnc3RyaW5nJyAmJiBtb2R1bGVSdW50aW1lLmluc3RhbmNlSWQubGVuZ3RoID4gMFxuICAgICAgICAgID8gbW9kdWxlUnVudGltZS5pbnN0YW5jZUlkXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIGtlcm5lbC5zZXRJbnN0YW5jZUlkKGluc3RhbmNlSWQpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmID0gS2VybmVsUmVmLmdldEtlcm5lbEltcGxlbWVudGF0aW9uUmVmKG1vZHVsZVJ1bnRpbWUpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYgPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmVkRGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSA9IFJ1bnRpbWVLZXJuZWwuZ2V0UnVudGltZVNlcnZpY2VzRXZpZGVuY2UobW9kdWxlUnVudGltZSlcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmYWlsdXJlID0gQ2F1c2UuZmFpbHVyZU9wdGlvbihib290RXhpdC5jYXVzZSlcbiAgICAgIGlmIChPcHRpb24uaXNTb21lKGZhaWx1cmUpKSB7XG4gICAgICAgIGNvbnN0IGVycjogYW55ID0gZmFpbHVyZS52YWx1ZVxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkRnJvbUVyciA9IHR5cGVvZiBlcnI/Lmluc3RhbmNlSWQgPT09ICdzdHJpbmcnID8gZXJyLmluc3RhbmNlSWQgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKGluc3RhbmNlSWRGcm9tRXJyICYmIGluc3RhbmNlSWRGcm9tRXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBrZXJuZWwuc2V0SW5zdGFuY2VJZChpbnN0YW5jZUlkRnJvbUVycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNsb3NlRXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChcbiAgICAgIGtlcm5lbC5jbG9zZSh7XG4gICAgICAgIHRpbWVvdXRNczpcbiAgICAgICAgICB0eXBlb2Ygb3B0aW9ucz8uY2xvc2VTY29wZVRpbWVvdXQgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG9wdGlvbnMuY2xvc2VTY29wZVRpbWVvdXQpICYmXG4gICAgICAgICAgb3B0aW9ucy5jbG9zZVNjb3BlVGltZW91dCA+IDBcbiAgICAgICAgICAgID8gb3B0aW9ucy5jbG9zZVNjb3BlVGltZW91dFxuICAgICAgICAgICAgOiAxMDAwLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgZXZpZGVuY2UgPSBjb2xsZWN0b3IuZXhwb3J0RXZpZGVuY2VQYWNrYWdlKHtcbiAgICAgIG1heEV2ZW50czogb3B0aW9ucz8ubWF4RXZlbnRzID8/IDEwMDAsXG4gICAgfSlcblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBleHRyYWN0TWFuaWZlc3Qocm9vdCBhcyBhbnksIHtcbiAgICAgICAgICBpbmNsdWRlU3RhdGljSXI6IHRydWUsXG4gICAgICAgICAgYnVkZ2V0czogeyBtYXhCeXRlczogMjAwXzAwMCB9LFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KSgpXG5cbiAgICBjb25zdCBzdGF0aWNJciA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhwb3J0U3RhdGljSXIocm9vdCBhcyBhbnkpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0pKClcblxuICAgIGxldCBvayA9IEV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSAmJiBFeGl0LmlzU3VjY2VzcyhjbG9zZUV4aXQpXG4gICAgbGV0IGVycm9yOiBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfCB1bmRlZmluZWRcbiAgICBsZXQgc3VtbWFyeTogdW5rbm93biB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGVwc0Zyb21Cb290RmFpbHVyZSA9IEV4aXQuaXNGYWlsdXJlKGJvb3RFeGl0KVxuICAgICAgPyBwYXJzZU1pc3NpbmdEZXBlbmRlbmN5RnJvbUNhdXNlKGJvb3RFeGl0LmNhdXNlIGFzIENhdXNlLkNhdXNlPHVua25vd24+KVxuICAgICAgOiB7IG1pc3NpbmdTZXJ2aWNlczogW10sIG1pc3NpbmdDb25maWdLZXlzOiBbXSB9XG5cbiAgICBjb25zdCBtaXNzaW5nU2VydmljZXMgPSBkZXBzRnJvbUJvb3RGYWlsdXJlLm1pc3NpbmdTZXJ2aWNlc1xuICAgIGNvbnN0IG1pc3NpbmdDb25maWdLZXlzID0gZGVwc0Zyb21Cb290RmFpbHVyZS5taXNzaW5nQ29uZmlnS2V5c1xuXG4gICAgY29uc3QgY2xvc2VFcnJvciA9IEV4aXQuaXNGYWlsdXJlKGNsb3NlRXhpdCkgPyBPcHRpb24uZ2V0T3JVbmRlZmluZWQoQ2F1c2UuZGllT3B0aW9uKGNsb3NlRXhpdC5jYXVzZSkpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIUV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSkge1xuICAgICAgY29uc3QgZmFpbHVyZSA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5mYWlsdXJlT3B0aW9uKGJvb3RFeGl0LmNhdXNlKSlcbiAgICAgIGNvbnN0IGRlZmVjdCA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5kaWVPcHRpb24oYm9vdEV4aXQuY2F1c2UpKVxuICAgICAgY29uc3QgYmFzZSA9IGZhaWx1cmUgPz8gZGVmZWN0ID8/IGJvb3RFeGl0LmNhdXNlXG5cbiAgICAgIGlmIChtaXNzaW5nU2VydmljZXMubGVuZ3RoID4gMCB8fCBtaXNzaW5nQ29uZmlnS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKFxuICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgJ01pc3NpbmdEZXBlbmRlbmN5JyxcbiAgICAgICAgICBtaXNzaW5nU2VydmljZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyAnQnVpbGQtdGltZSBtaXNzaW5nIHNlcnZpY2U6IHByb3ZpZGUgYSBMYXllciBtb2NrL2ltcGxlbWVudGF0aW9uIHZpYSBvcHRpb25zLmxheWVyLCBvciBtb3ZlIHRoZSBkZXBlbmRlbmN5IGFjY2VzcyB0byBydW50aW1lLidcbiAgICAgICAgICAgIDogJ0J1aWxkLXRpbWUgbWlzc2luZyBjb25maWc6IHByb3ZpZGUgdGhlIG1pc3Npbmcga2V5KHMpIGluIGJ1aWxkRW52LmNvbmZpZywgb3IgYWRkIGEgZGVmYXVsdCB2YWx1ZSB0byBDb25maWcuJyxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNSZWNvcmQoYmFzZSkgJiZcbiAgICAgICAgKChiYXNlIGFzIGFueSkubmFtZSA9PT0gJ1RyaWFsUnVuVGltZW91dEVycm9yJyB8fCAoYmFzZSBhcyBhbnkpLl90YWcgPT09ICdUcmlhbFJ1blRpbWVvdXQnKVxuICAgICAgKSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKFxuICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgJ1RyaWFsUnVuVGltZW91dCcsXG4gICAgICAgICAgJ1RyaWFsIHJ1biB0aW1lZCBvdXQ6IGNoZWNrIGZvciBMYXllci9hc3NlbWJseSBwaGFzZSBibG9ja2luZyAoRWZmZWN0Lm5ldmVyIC8gdW5maW5pc2hlZCBhY3F1aXJlKS4nLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvayA9IGZhbHNlXG4gICAgICAgIGVycm9yID0gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShiYXNlLCAnUnVudGltZUZhaWx1cmUnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChFeGl0LmlzRmFpbHVyZShjbG9zZUV4aXQpKSB7XG4gICAgICBjb25zdCBkaWVkID0gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmRpZU9wdGlvbihjbG9zZUV4aXQuY2F1c2UpKVxuICAgICAgY29uc3QgZmFpbHVyZSA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5mYWlsdXJlT3B0aW9uKGNsb3NlRXhpdC5jYXVzZSkpXG4gICAgICBjb25zdCBiYXNlID0gZGllZCA/PyBmYWlsdXJlID8/IGNsb3NlRXhpdC5jYXVzZVxuXG4gICAgICBjb25zdCBjbG9zZUVycm9yU3VtbWFyeSA9ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGlzUmVjb3JkKGJhc2UpID8gKGJhc2UgYXMgYW55KS5fdGFnIDogdW5kZWZpbmVkXG4gICAgICAgIGlmICh0YWcgPT09ICdEaXNwb3NlVGltZW91dCcpIHtcbiAgICAgICAgICByZXR1cm4gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgICAnRGlzcG9zZVRpbWVvdXQnLFxuICAgICAgICAgICAgJ0Rpc3Bvc2UgdGltZWQgb3V0OiBjaGVjayBmb3IgdW5jbG9zZWQgcmVzb3VyY2UgaGFuZGxlcywgZmliZXJzIG5vdCBpbnRlcnJ1cHRlZCwgb3IgZXZlbnQgbGlzdGVuZXJzIG5vdCB1bnJlZ2lzdGVyZWQuJyxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoYmFzZSwgJ1J1bnRpbWVGYWlsdXJlJylcbiAgICAgIH0pKClcblxuICAgICAgb2sgPSBmYWxzZVxuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAvLyBJZiBib290IHN1Y2NlZWRlZCBidXQgZGlzcG9zZSBmYWlsZWQsIHRoZSBjbG9zZSBlcnJvciBpcyB0aGUgcHJpbWFyeSBmYWlsdXJlLlxuICAgICAgICBlcnJvciA9IGNsb3NlRXJyb3JTdW1tYXJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgcHJpbWFyeSBib290IGZhaWx1cmUgKGUuZy4gVHJpYWxSdW5UaW1lb3V0KSBidXQga2VlcCBkaXNwb3NlIGZhaWx1cmUgZXZpZGVuY2UuXG4gICAgICAgIHN1bW1hcnkgPSB7IF9fbG9naXg6IHsgY2xvc2VFcnJvcjogY2xvc2VFcnJvclN1bW1hcnkgfSB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBidWlsZEVudmlyb25tZW50SXIoe1xuICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYsXG4gICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSxcbiAgICAgIGJ1aWxkRW52Q29uZmlnLFxuICAgICAgbWlzc2luZ1NlcnZpY2VzLFxuICAgICAgbWlzc2luZ0NvbmZpZ0tleXMsXG4gICAgfSlcblxuICAgIGNvbnN0IG1vZHVsZUlkID1cbiAgICAgIHR5cGVvZiAocm9vdEltcGwubW9kdWxlIGFzIGFueSk/LmlkID09PSAnc3RyaW5nJyAmJiAocm9vdEltcGwubW9kdWxlIGFzIGFueSkuaWQubGVuZ3RoID4gMFxuICAgICAgICA/IFN0cmluZygocm9vdEltcGwubW9kdWxlIGFzIGFueSkuaWQpXG4gICAgICAgIDogKG1hbmlmZXN0Py5tb2R1bGVJZCA/PyAndW5rbm93bicpXG5cbiAgICBjb25zdCBhcnRpZmFjdHMgPSBjb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHMoe1xuICAgICAgZXhwb3J0ZXJzOiBnZXRUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXJzKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpLFxuICAgICAgY3R4OiB7XG4gICAgICAgIG1vZHVsZUlkLFxuICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgc3RhdGljSXI6IHN0YXRpY0lyIGFzIGFueSxcbiAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBsZXQgcmVwb3J0OiBUcmlhbFJ1blJlcG9ydCA9IHtcbiAgICAgIHJ1bklkOiBzZXNzaW9uLnJ1bklkLFxuICAgICAgb2ssXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHN0YXRpY0lyOiBzdGF0aWNJciBhcyBhbnksXG4gICAgICBhcnRpZmFjdHMsXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGV2aWRlbmNlLFxuICAgICAgc3VtbWFyeSxcbiAgICAgIGVycm9yLFxuICAgIH1cblxuICAgIGNvbnN0IG1heEJ5dGVzID0gb3B0aW9ucz8uYnVkZ2V0cz8ubWF4Qnl0ZXNcbiAgICBpZiAodHlwZW9mIG1heEJ5dGVzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUobWF4Qnl0ZXMpICYmIG1heEJ5dGVzID4gMCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxCeXRlcyA9IHV0ZjhCeXRlTGVuZ3RoKHJlcG9ydClcbiAgICAgIGlmIChvcmlnaW5hbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgcmVwb3J0ID0ge1xuICAgICAgICAgIHJ1bklkOiBzZXNzaW9uLnJ1bklkLFxuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgbWVzc2FnZTogYFtMb2dpeF0gVHJpYWxSdW5SZXBvcnQgZXhjZWVkZWQgbWF4Qnl0ZXMgKCR7b3JpZ2luYWxCeXRlc30gPiAke21heEJ5dGVzfSlgLFxuICAgICAgICAgICAgY29kZTogJ092ZXJzaXplZCcsXG4gICAgICAgICAgICBoaW50OiAnUmVkdWNlIG1heEV2ZW50cyBvciBidWRnZXRzLm1heEJ5dGVzLCBvciBzcGxpdCBtYW5pZmVzdC9ldmlkZW5jZSBhcnRpZmFjdHMgaW4gQ0kuJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIF9fbG9naXg6IHtcbiAgICAgICAgICAgICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgICAgICAgICAgICBtYXhCeXRlcyxcbiAgICAgICAgICAgICAgb3JpZ2luYWxCeXRlcyxcbiAgICAgICAgICAgICAgZHJvcHBlZDogWydtYW5pZmVzdCcsICdzdGF0aWNJcicsICdhcnRpZmFjdHMnLCAnZXZpZGVuY2UnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXBvcnRcbiAgfSlcbiIsICJpbXBvcnQgeyBDb25maWdQcm92aWRlciwgRWZmZWN0LCBMYXllciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCAqIGFzIENvbnN0cnVjdGlvbkd1YXJkIGZyb20gJy4vQ29uc3RydWN0aW9uR3VhcmQuanMnXG5pbXBvcnQge1xuICBSdW50aW1lSG9zdCxcbiAgdHlwZSBSdW50aW1lSG9zdEtpbmQsXG4gIHR5cGUgUnVudGltZUhvc3RTZXJ2aWNlLFxuICBkZWZhdWx0TGF5ZXIgYXMgZGVmYXVsdFJ1bnRpbWVIb3N0TGF5ZXIsXG4gIG1ha2UgYXMgbWFrZVJ1bnRpbWVIb3N0LFxuICBsYXllciBhcyBydW50aW1lSG9zdExheWVyLFxufSBmcm9tICcuL1J1bnRpbWVIb3N0LmpzJ1xuXG5leHBvcnQgdHlwZSBCdWlsZEVudkNvbmZpZ1ZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRW52T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHJ1bnRpbWVIb3N0PzogUnVudGltZUhvc3RTZXJ2aWNlXG4gIHJlYWRvbmx5IHJ1bnRpbWVIb3N0S2luZD86IFJ1bnRpbWVIb3N0S2luZFxuICAvKipcbiAgICogRmxhdCBrZXkvdmFsdWUgY29uZmlnIGZvciBtb2NraW5nIGZlYXR1cmUgZmxhZ3MgLyBlbnYgdmFyaWFibGVzICh2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gc3RyaW5nKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+XG4gIC8qKlxuICAgKiBBZHZhbmNlZDogaW5qZWN0IGEgQ29uZmlnUHJvdmlkZXIgZGlyZWN0bHkgKGhpZ2hlciBwcmlvcml0eSB0aGFuIGNvbmZpZykuXG4gICAqL1xuICByZWFkb25seSBjb25maWdQcm92aWRlcj86IENvbmZpZ1Byb3ZpZGVyLkNvbmZpZ1Byb3ZpZGVyXG59XG5cbmNvbnN0IHRvQ29uZmlnUHJvdmlkZXJGcm9tUmVjb3JkID0gKFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuKTogQ29uZmlnUHJvdmlkZXIuQ29uZmlnUHJvdmlkZXIgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCA/PyB7fSkpIHtcbiAgICBpZiAoIWspIGNvbnRpbnVlXG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICBtYXAuc2V0KGssIFN0cmluZyh2KSlcbiAgfVxuICByZXR1cm4gQ29uZmlnUHJvdmlkZXIuZnJvbU1hcChtYXApXG59XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChvcHRpb25zOiBCdWlsZEVudk9wdGlvbnMgPSB7fSk6IExheWVyLkxheWVyPFJ1bnRpbWVIb3N0LCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgY29uc3QgcnVudGltZUhvc3QgPSBvcHRpb25zLnJ1bnRpbWVIb3N0XG4gICAgPyBydW50aW1lSG9zdExheWVyKG9wdGlvbnMucnVudGltZUhvc3QpXG4gICAgOiBvcHRpb25zLnJ1bnRpbWVIb3N0S2luZFxuICAgICAgPyBydW50aW1lSG9zdExheWVyKG1ha2VSdW50aW1lSG9zdChvcHRpb25zLnJ1bnRpbWVIb3N0S2luZCkpXG4gICAgICA6IGRlZmF1bHRSdW50aW1lSG9zdExheWVyXG5cbiAgY29uc3QgY29uZmlnUHJvdmlkZXIgPSBvcHRpb25zLmNvbmZpZ1Byb3ZpZGVyID8gb3B0aW9ucy5jb25maWdQcm92aWRlciA6IHRvQ29uZmlnUHJvdmlkZXJGcm9tUmVjb3JkKG9wdGlvbnMuY29uZmlnKVxuXG4gIGNvbnN0IGNvbmZpZyA9IExheWVyLnNldENvbmZpZ1Byb3ZpZGVyKGNvbmZpZ1Byb3ZpZGVyKVxuXG4gIHJldHVybiBMYXllci5tZXJnZUFsbChydW50aW1lSG9zdCwgY29uZmlnKSBhcyBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPlxufVxuXG5leHBvcnQgY29uc3QgcnVuID0gPEEsIEU+KFxuICBidWlsZGVyOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFJ1bnRpbWVIb3N0PixcbiAgb3B0aW9uczogQnVpbGRFbnZPcHRpb25zID0ge30sXG4pOiBFZmZlY3QuRWZmZWN0PEEsIEUgfCBDb25zdHJ1Y3Rpb25HdWFyZC5Db25zdHJ1Y3Rpb25HdWFyZEVycm9yLCBuZXZlcj4gPT5cbiAgYnVpbGRlci5waXBlKEVmZmVjdC5wcm92aWRlKGxheWVyKG9wdGlvbnMpKSwgQ29uc3RydWN0aW9uR3VhcmQuZ3VhcmRCdWlsZFRpbWUpXG4iLCAiaW1wb3J0IHsgQ2F1c2UsIEVmZmVjdCB9IGZyb20gJ2VmZmVjdCdcblxuZXhwb3J0IGludGVyZmFjZSBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnOiAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcidcbiAgcmVhZG9ubHkga2luZDogJ21pc3Npbmdfc2VydmljZScgfCAndW5rbm93bl9kZWZlY3QnXG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VDb25zdHJ1Y3Rpb25HdWFyZEVycm9yID0gKG9wdGlvbnM6IHtcbiAgcmVhZG9ubHkga2luZDogQ29uc3RydWN0aW9uR3VhcmRFcnJvclsna2luZCddXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xuICByZWFkb25seSBtaXNzaW5nU2VydmljZT86IHN0cmluZ1xuICByZWFkb25seSBoaW50Pzogc3RyaW5nXG59KTogQ29uc3RydWN0aW9uR3VhcmRFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UpLCB7XG4gICAgX3RhZzogJ0NvbnN0cnVjdGlvbkd1YXJkRXJyb3InLFxuICAgIGtpbmQ6IG9wdGlvbnMua2luZCxcbiAgICBtaXNzaW5nU2VydmljZTogb3B0aW9ucy5taXNzaW5nU2VydmljZSxcbiAgICBoaW50OiBvcHRpb25zLmhpbnQsXG4gIH0pIGFzIENvbnN0cnVjdGlvbkd1YXJkRXJyb3JcblxuY29uc3QgZXh0cmFjdE1pc3NpbmdTZXJ2aWNlID0gKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbLi4uQXJyYXkuZnJvbShDYXVzZS5kZWZlY3RzKGNhdXNlKSksIC4uLkFycmF5LmZyb20oQ2F1c2UuZmFpbHVyZXMoY2F1c2UpKV1cblxuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvciA/IGNhbmRpZGF0ZS5tZXNzYWdlIDogdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ3N0cmluZycgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWRcblxuICAgIGlmICghbWVzc2FnZSkgY29udGludWVcblxuICAgIGNvbnN0IG1hdGNoID0gL1NlcnZpY2Ugbm90IGZvdW5kOiAoW15cXHMoXSspLy5leGVjKG1lc3NhZ2UpXG4gICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBtYXRjaFsxXVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIGd1YXJkQnVpbGRUaW1lXHVGRjFBXG4gKiAtIER1cmluZyBCdWlsZCBFbnYvUmVmbGVjdGlvbiwgY2F0Y2ggXCJtaXNzaW5nIHNlcnZpY2VcIiBkZWZlY3RzIGFuZCBjb252ZXJ0IHRoZW0gaW50byBhY3Rpb25hYmxlIGVycm9ycy5cbiAqIC0gUHJlc2VydmUgb3RoZXIgZmFpbHVyZXMvZGVmZWN0cyBhcy1pcyAoZG8gbm90IHN3YWxsb3cgYnVzaW5lc3MgZXJyb3Igc2VtYW50aWNzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGd1YXJkQnVpbGRUaW1lID0gPEEsIEUsIFI+KFxuICBzZWxmOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+LFxuKTogRWZmZWN0LkVmZmVjdDxBLCBFIHwgQ29uc3RydWN0aW9uR3VhcmRFcnJvciwgUj4gPT5cbiAgc2VsZi5waXBlKFxuICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSk6IEVmZmVjdC5FZmZlY3Q8bmV2ZXIsIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgfCBFLCBuZXZlcj4gPT4ge1xuICAgICAgY29uc3QgbWlzc2luZyA9IGV4dHJhY3RNaXNzaW5nU2VydmljZShjYXVzZSlcbiAgICAgIGlmIChtaXNzaW5nKSB7XG4gICAgICAgIHJldHVybiBFZmZlY3QuZmFpbChcbiAgICAgICAgICBtYWtlQ29uc3RydWN0aW9uR3VhcmRFcnJvcih7XG4gICAgICAgICAgICBraW5kOiAnbWlzc2luZ19zZXJ2aWNlJyxcbiAgICAgICAgICAgIG1pc3NpbmdTZXJ2aWNlOiBtaXNzaW5nLFxuICAgICAgICAgICAgbWVzc2FnZTogYFtDb25zdHJ1Y3Rpb25HdWFyZEVycm9yXSBCdWlsZC10aW1lIGRlcGVuZGVuY3kgdmlvbGF0aW9uOiBzZXJ2aWNlIFwiJHttaXNzaW5nfVwiIGlzIG5vdCBhdmFpbGFibGUgaW4gQnVpbGQgRW52LmAsXG4gICAgICAgICAgICBoaW50OlxuICAgICAgICAgICAgICAnQnVpbGQtdGltZSAoUmVmbGVjdGlvbikgY2FuIG9ubHkgZGVwZW5kIG9uIGEgc21hbGwgc2V0IG9mIG1vY2thYmxlIHByaW1pdGl2ZXMgKGUuZy4gQ29uZmlnL1J1bnRpbWVIb3N0KS4gJyArXG4gICAgICAgICAgICAgICdNb3ZlIGJ1c2luZXNzIHNlcnZpY2UgYWNjZXNzIHRvIHJ1bnRpbWUgKGUuZy4gVHJhaXQgaGFuZGxlciAvIExvZ2ljIHJ1biBzZWN0aW9uKSBvciBpc29sYXRlIGl0IHZpYSBleHBsaWNpdCBpbmplY3Rpb24uJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIEVmZmVjdC5mYWlsQ2F1c2UoY2F1c2UpIGFzIEVmZmVjdC5FZmZlY3Q8bmV2ZXIsIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgfCBFPlxuICAgIH0pLFxuICApXG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgTGF5ZXIgfSBmcm9tICdlZmZlY3QnXG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVIb3N0S2luZCA9ICdub2RlJyB8ICdicm93c2VyJyB8ICd1bmtub3duJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVIb3N0U2VydmljZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFJ1bnRpbWVIb3N0S2luZFxuICByZWFkb25seSBpc05vZGU6IGJvb2xlYW5cbiAgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuXG59XG5cbmNvbnN0IGRldGVjdEtpbmQgPSAoKTogUnVudGltZUhvc3RLaW5kID0+IHtcbiAgY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG4gIGlmIChpc0Jyb3dzZXIpIHJldHVybiAnYnJvd3NlcidcblxuICBjb25zdCBpc05vZGUgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIChwcm9jZXNzIGFzIGFueSk/LnZlcnNpb25zPy5ub2RlID09PSAnc3RyaW5nJ1xuXG4gIGlmIChpc05vZGUpIHJldHVybiAnbm9kZSdcblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmV4cG9ydCBjb25zdCBtYWtlID0gKGtpbmQ6IFJ1bnRpbWVIb3N0S2luZCk6IFJ1bnRpbWVIb3N0U2VydmljZSA9PiAoe1xuICBraW5kLFxuICBpc05vZGU6IGtpbmQgPT09ICdub2RlJyxcbiAgaXNCcm93c2VyOiBraW5kID09PSAnYnJvd3NlcicsXG59KVxuXG5leHBvcnQgY2xhc3MgUnVudGltZUhvc3QgZXh0ZW5kcyBDb250ZXh0LlRhZygnQGxvZ2l4L1J1bnRpbWVIb3N0Jyk8UnVudGltZUhvc3QsIFJ1bnRpbWVIb3N0U2VydmljZT4oKSB7fVxuXG5leHBvcnQgY29uc3QgbGF5ZXIgPSAoc2VydmljZTogUnVudGltZUhvc3RTZXJ2aWNlKTogTGF5ZXIuTGF5ZXI8UnVudGltZUhvc3QsIG5ldmVyLCBuZXZlcj4gPT5cbiAgTGF5ZXIuc3VjY2VlZChSdW50aW1lSG9zdCwgc2VydmljZSlcblxuZXhwb3J0IGNvbnN0IG1vY2sgPSAoa2luZDogUnVudGltZUhvc3RLaW5kKTogTGF5ZXIuTGF5ZXI8UnVudGltZUhvc3QsIG5ldmVyLCBuZXZlcj4gPT4gbGF5ZXIobWFrZShraW5kKSlcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRMYXllcjogTGF5ZXIuTGF5ZXI8UnVudGltZUhvc3QsIG5ldmVyLCBuZXZlcj4gPSBsYXllcihtYWtlKGRldGVjdEtpbmQoKSkpXG4iLCAiaW1wb3J0IHsgRWZmZWN0LCBMYXllciwgTWFuYWdlZFJ1bnRpbWUgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgdHlwZSB7IEFueU1vZHVsZVNoYXBlLCBNb2R1bGVJbXBsIH0gZnJvbSAnLi9jb3JlL21vZHVsZS5qcydcbmltcG9ydCAqIGFzIEFwcFJ1bnRpbWVJbXBsIGZyb20gJy4vQXBwUnVudGltZS5qcydcblxuLyoqXG4gKiBSdW50aW1lIG9wdGlvbnM6XG4gKiAtIGxheWVyOiBleHRyYSB0b3AtbGV2ZWwgRW52IChlLmcuIENvbmZpZyAvIHBsYXRmb3JtIHNlcnZpY2VzKSBtZXJnZWQgd2l0aCBSb290IE1vZHVsZUltcGwubGF5ZXIuXG4gKiAtIG9uRXJyb3I6IGFwcC1sZXZlbCBlcnJvciBoYW5kbGVyIGVudHJ5cG9pbnQgdXNlZCB0byByZXBvcnQgdW5jYXVnaHQgZXJyb3JzIGF0IHRoZSBSdW50aW1lIGxldmVsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVPcHRpb25zIHtcbiAgcmVhZG9ubHkgbGF5ZXI/OiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cbiAgcmVhZG9ubHkgb25FcnJvcj86IChjYXVzZTogaW1wb3J0KCdlZmZlY3QnKS5DYXVzZS5DYXVzZTx1bmtub3duPikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPlxufVxuXG4vKipcbiAqIFJ1bnRpbWUubWFrZVxuICpcbiAqIEJ1aWxkIGFuIGFwcGxpY2F0aW9uLWxldmVsIFJ1bnRpbWUgZ2l2ZW4gYSByb290IE1vZHVsZUltcGw6XG4gKlxuICogLSBVc2UgUm9vdEltcGwubW9kdWxlICsgUm9vdEltcGwubGF5ZXIgYXMgdGhlIHNpbmdsZSBnbG9iYWwgbW9kdWxlLlxuICogLSBGb3JrIFJvb3RJbXBsLnByb2Nlc3NlcyBhcyBsb25nLWxpdmVkIHByb2Nlc3NlcyB3aXRoaW4gdGhlIFJ1bnRpbWUgc2NvcGUuXG4gKiAtIFJldXNlIHRoZSBleGlzdGluZyBBcHBSdW50aW1lIGltcGxlbWVudGF0aW9uIGFzIHRoZSB1bmRlcmx5aW5nIGNvbnRhaW5lciBhbmQgZXhwb3NlIG9ubHkgTWFuYWdlZFJ1bnRpbWUuXG4gKlxuICogTm90ZXM6XG4gKiAtIFVzZXMgYnJvYWQgYW55L25ldmVyIGF0IHRoZSB0eXBlIGxldmVsIHRvIGF2b2lkIGNvbXBsZXggRW52IGluZmVyZW5jZSBoZXJlLlxuICogLSBCdXNpbmVzcyBjb2RlIG9ubHkgbmVlZHMgdG8gZW5zdXJlIFJvb3RJbXBsLmxheWVyIGFuZCBvcHRpb25zLmxheWVyIHRvZ2V0aGVyIGNhbiBwcm92aWRlIHRoZSBmdWxsIEVudi5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ha2UgPSAoXG4gIHJvb3RJbXBsOiBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4sXG4gIG9wdGlvbnM/OiBSdW50aW1lT3B0aW9ucyxcbik6IE1hbmFnZWRSdW50aW1lLk1hbmFnZWRSdW50aW1lPGFueSwgbmV2ZXI+ID0+IHtcbiAgY29uc3QgYXBwQ29uZmlnOiBBcHBSdW50aW1lSW1wbC5Mb2dpeEFwcENvbmZpZzxhbnk+ID0ge1xuICAgIGxheWVyOiAob3B0aW9ucz8ubGF5ZXIgPz8gTGF5ZXIuZW1wdHkpIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPixcbiAgICBtb2R1bGVzOiBbQXBwUnVudGltZUltcGwucHJvdmlkZShyb290SW1wbC5tb2R1bGUsIHJvb3RJbXBsLmxheWVyIGFzIExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+KV0sXG4gICAgcHJvY2Vzc2VzOiByb290SW1wbC5wcm9jZXNzZXMgPz8gW10sXG4gICAgb25FcnJvcjogb3B0aW9ucz8ub25FcnJvcixcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IEFwcFJ1bnRpbWVJbXBsLm1ha2VBcHAoYXBwQ29uZmlnKVxuICByZXR1cm4gYXBwLm1ha2VSdW50aW1lKCkgYXMgTWFuYWdlZFJ1bnRpbWUuTWFuYWdlZFJ1bnRpbWU8YW55LCBuZXZlcj5cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJy4uL2pzb25WYWx1ZS5qcydcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vcnVudGltZS9jb3JlL2Vycm9yU3VtbWFyeS5qcydcblxuZXhwb3J0IHR5cGUgQXJ0aWZhY3RLZXkgPSBzdHJpbmdcblxuZXhwb3J0IGNvbnN0IGFydGlmYWN0S2V5U2NoZW1hUGF0dGVybiA9ICdeQFteXFxcXHMvXStcXFxcL1teXFxcXHNAXStAdlxcXFxkKyQnIGFzIGNvbnN0XG5cbmV4cG9ydCBjb25zdCBpc0FydGlmYWN0S2V5ID0gKGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgQXJ0aWZhY3RLZXkgPT5cbiAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyAmJiAvXkBbXlxccy9dK1xcL1teXFxzQF0rQHZcXGQrJC8udGVzdChpbnB1dClcblxudHlwZSBFbnZlbG9wZUJhc2UgPSB7XG4gIHJlYWRvbmx5IGFydGlmYWN0S2V5OiBBcnRpZmFjdEtleVxuICByZWFkb25seSB0cnVuY2F0ZWQ/OiBib29sZWFuXG4gIHJlYWRvbmx5IGJ1ZGdldEJ5dGVzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGFjdHVhbEJ5dGVzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGRpZ2VzdD86IHN0cmluZ1xuICByZWFkb25seSBub3Rlcz86IEpzb25WYWx1ZVxufVxuXG5leHBvcnQgdHlwZSBBcnRpZmFjdEVudmVsb3BlID1cbiAgfCAoRW52ZWxvcGVCYXNlICYge1xuICAgICAgcmVhZG9ubHkgb2s6IHRydWVcbiAgICAgIHJlYWRvbmx5IHZhbHVlOiBKc29uVmFsdWVcbiAgICAgIHJlYWRvbmx5IGVycm9yPzogbmV2ZXJcbiAgICB9KVxuICB8IChFbnZlbG9wZUJhc2UgJiB7XG4gICAgICByZWFkb25seSBvazogZmFsc2VcbiAgICAgIHJlYWRvbmx5IGVycm9yOiBTZXJpYWxpemFibGVFcnJvclN1bW1hcnlcbiAgICAgIHJlYWRvbmx5IHZhbHVlPzogbmV2ZXJcbiAgICB9KVxuXG5leHBvcnQgdHlwZSBUcmlhbFJ1bkFydGlmYWN0cyA9IFJlYWRvbmx5PFJlY29yZDxBcnRpZmFjdEtleSwgQXJ0aWZhY3RFbnZlbG9wZT4+XG4iLCAiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuLi9qc29uVmFsdWUuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblZhbHVlRGlnZXN0IHtcbiAgcmVhZG9ubHkgc3RhYmxlSnNvbjogc3RyaW5nXG4gIHJlYWRvbmx5IGJ5dGVzOiBudW1iZXJcbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbn1cblxuY29uc3QgdXRmOEJ5dGVMZW5ndGhTdHJpbmcgPSAodGV4dDogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHRleHQpLmxlbmd0aFxuICB9XG4gIHJldHVybiB0ZXh0Lmxlbmd0aFxufVxuXG5leHBvcnQgY29uc3QgZGlnZXN0SnNvblZhbHVlID0gKHZhbHVlOiBKc29uVmFsdWUpOiBKc29uVmFsdWVEaWdlc3QgPT4ge1xuICBjb25zdCBzdGFibGVKc29uID0gc3RhYmxlU3RyaW5naWZ5KHZhbHVlKVxuICBjb25zdCBieXRlcyA9IHV0ZjhCeXRlTGVuZ3RoU3RyaW5nKHN0YWJsZUpzb24pXG4gIHJldHVybiB7XG4gICAgc3RhYmxlSnNvbixcbiAgICBieXRlcyxcbiAgICBkaWdlc3Q6IGBhcnRpZmFjdDowMzE6JHtmbnYxYTMyKHN0YWJsZUpzb24pfWAsXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB9IGZyb20gJy4uLy4uL3J1bnRpbWUvY29yZS9lcnJvclN1bW1hcnkuanMnXG5pbXBvcnQgeyB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB9IGZyb20gJy4uLy4uL3J1bnRpbWUvY29yZS9lcnJvclN1bW1hcnkuanMnXG5pbXBvcnQgeyBpc0pzb25WYWx1ZSwgdHlwZSBKc29uVmFsdWUgfSBmcm9tICcuLi9qc29uVmFsdWUuanMnXG5pbXBvcnQgdHlwZSB7IEFydGlmYWN0RW52ZWxvcGUsIEFydGlmYWN0S2V5LCBUcmlhbFJ1bkFydGlmYWN0cyB9IGZyb20gJy4vbW9kZWwuanMnXG5pbXBvcnQgeyBpc0FydGlmYWN0S2V5IH0gZnJvbSAnLi9tb2RlbC5qcydcbmltcG9ydCB0eXBlIHsgVHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVyLCBUcmlhbFJ1bkFydGlmYWN0SW5zcGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL2V4cG9ydGVyLmpzJ1xuaW1wb3J0IHsgZGlnZXN0SnNvblZhbHVlIH0gZnJvbSAnLi9kaWdlc3QuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJpYWxSdW5BcnRpZmFjdHNCdWRnZXRzIHtcbiAgLyoqXG4gICAqIFBlci1hcnRpZmFjdCBtYXhpbXVtIHNlcmlhbGl6ZWQgYnl0ZXMgKFVURi04KS5cbiAgICogRGVmYXVsdDogNTBLQi5cbiAgICovXG4gIHJlYWRvbmx5IG1heEJ5dGVzPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdFRyaWFsUnVuQXJ0aWZhY3RzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGV4cG9ydGVyczogUmVhZG9ubHlBcnJheTxUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXI+XG4gIHJlYWRvbmx5IGN0eDogVHJpYWxSdW5BcnRpZmFjdEluc3BlY3Rpb25Db250ZXh0XG4gIHJlYWRvbmx5IGJ1ZGdldHM/OiBUcmlhbFJ1bkFydGlmYWN0c0J1ZGdldHNcbn1cblxuY29uc3QgdG9FcnJvclN1bW1hcnlXaXRoQ29kZSA9IChjYXVzZTogdW5rbm93biwgY29kZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKTogU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5ID0+IHtcbiAgY29uc3QgYmFzZSA9IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5KGNhdXNlKS5lcnJvclN1bW1hcnlcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBiYXNlLm5hbWUsXG4gICAgbWVzc2FnZTogYmFzZS5tZXNzYWdlLFxuICAgIGNvZGUsXG4gICAgaGludDogaGludCA/PyBiYXNlLmhpbnQsXG4gIH1cbn1cblxuY29uc3QgZGVmYXVsdEFydGlmYWN0QnVkZ2V0Qnl0ZXMgPSA1MCAqIDEwMjRcblxuY29uc3QgYnVkZ2V0T2YgPSAoYnVkZ2V0czogVHJpYWxSdW5BcnRpZmFjdHNCdWRnZXRzIHwgdW5kZWZpbmVkKTogbnVtYmVyID0+XG4gIHR5cGVvZiBidWRnZXRzPy5tYXhCeXRlcyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGJ1ZGdldHMubWF4Qnl0ZXMpICYmIGJ1ZGdldHMubWF4Qnl0ZXMgPiAwXG4gICAgPyBidWRnZXRzLm1heEJ5dGVzXG4gICAgOiBkZWZhdWx0QXJ0aWZhY3RCdWRnZXRCeXRlc1xuXG50eXBlIENvbGxlY3RlZCA9IHtcbiAgcmVhZG9ubHkgYXJ0aWZhY3RLZXk6IEFydGlmYWN0S2V5XG4gIHJlYWRvbmx5IGVudmVsb3BlOiBBcnRpZmFjdEVudmVsb3BlXG59XG5cbmNvbnN0IG1ha2VDb25mbGljdEVudmVsb3BlID0gKGFydGlmYWN0S2V5OiBBcnRpZmFjdEtleSwgZXhwb3J0ZXJJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPik6IENvbGxlY3RlZCA9PiB7XG4gIGNvbnN0IGlkcyA9IEFycmF5LmZyb20obmV3IFNldChleHBvcnRlcklkcy5tYXAoKHMpID0+IFN0cmluZyhzKSkuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApKSkuc29ydCgoYSwgYikgPT5cbiAgICBhLmxvY2FsZUNvbXBhcmUoYiksXG4gIClcbiAgcmV0dXJuIHtcbiAgICBhcnRpZmFjdEtleSxcbiAgICBlbnZlbG9wZToge1xuICAgICAgYXJ0aWZhY3RLZXksXG4gICAgICBvazogZmFsc2UsXG4gICAgICBlcnJvcjoge1xuICAgICAgICBuYW1lOiAnQXJ0aWZhY3RLZXlDb25mbGljdEVycm9yJyxcbiAgICAgICAgbWVzc2FnZTogYFtMb2dpeF0gVHJpYWxSdW4gYXJ0aWZhY3Qga2V5IGNvbmZsaWN0OiAke2FydGlmYWN0S2V5fWAsXG4gICAgICAgIGNvZGU6ICdBcnRpZmFjdEtleUNvbmZsaWN0JyxcbiAgICAgICAgaGludDogaWRzLmxlbmd0aCA+IDAgPyBgY29uZmxpY3RpbmdFeHBvcnRlcnM9JHtpZHMuam9pbignLCcpfWAgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgdHJ1bmNhdGVKc29uVmFsdWUgPSAoXG4gIHZhbHVlOiBKc29uVmFsdWUsXG4gIG1heEJ5dGVzOiBudW1iZXIsXG4pOiB7IHJlYWRvbmx5IHZhbHVlOiBKc29uVmFsdWU7IHJlYWRvbmx5IGFjdHVhbEJ5dGVzOiBudW1iZXI7IHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nIH0gPT4ge1xuICBjb25zdCBhbmFseXplZCA9IGRpZ2VzdEpzb25WYWx1ZSh2YWx1ZSlcbiAgY29uc3QganNvbiA9IGFuYWx5emVkLnN0YWJsZUpzb25cbiAgY29uc3QgYnl0ZXMgPSBhbmFseXplZC5ieXRlc1xuICBpZiAoYnl0ZXMgPD0gbWF4Qnl0ZXMpIHtcbiAgICByZXR1cm4geyB2YWx1ZSwgYWN0dWFsQnl0ZXM6IGJ5dGVzLCBkaWdlc3Q6IGFuYWx5emVkLmRpZ2VzdCB9XG4gIH1cblxuICBjb25zdCBwcmV2aWV3Q2hhcnMgPSBNYXRoLm1pbihqc29uLmxlbmd0aCwgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU2LCBtYXhCeXRlcykpKVxuICBjb25zdCBwcmV2aWV3ID0ganNvbi5zbGljZSgwLCBwcmV2aWV3Q2hhcnMpXG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIF90YWc6ICdvdmVyc2l6ZWQnLFxuICAgICAgYnl0ZXMsXG4gICAgICBwcmV2aWV3LFxuICAgIH0sXG4gICAgYWN0dWFsQnl0ZXM6IGJ5dGVzLFxuICAgIGRpZ2VzdDogYW5hbHl6ZWQuZGlnZXN0LFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHMgPSAob3B0aW9uczogQ29sbGVjdFRyaWFsUnVuQXJ0aWZhY3RzT3B0aW9ucyk6IFRyaWFsUnVuQXJ0aWZhY3RzIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZXhwb3J0ZXJzU29ydGVkID0gQXJyYXkuZnJvbShvcHRpb25zLmV4cG9ydGVycykuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGthID0gU3RyaW5nKGE/LmFydGlmYWN0S2V5ID8/ICcnKVxuICAgIGNvbnN0IGtiID0gU3RyaW5nKGI/LmFydGlmYWN0S2V5ID8/ICcnKVxuICAgIGlmIChrYSA8IGtiKSByZXR1cm4gLTFcbiAgICBpZiAoa2EgPiBrYikgcmV0dXJuIDFcbiAgICBjb25zdCBpYSA9IFN0cmluZyhhPy5leHBvcnRlcklkID8/ICcnKVxuICAgIGNvbnN0IGliID0gU3RyaW5nKGI/LmV4cG9ydGVySWQgPz8gJycpXG4gICAgcmV0dXJuIGlhLmxvY2FsZUNvbXBhcmUoaWIpXG4gIH0pXG5cbiAgY29uc3QgY29uZmxpY3RzID0gbmV3IE1hcDxBcnRpZmFjdEtleSwgQXJyYXk8c3RyaW5nPj4oKVxuICBmb3IgKGNvbnN0IGV4IG9mIGV4cG9ydGVyc1NvcnRlZCkge1xuICAgIGNvbnN0IGtleSA9IGV4Py5hcnRpZmFjdEtleVxuICAgIGNvbnN0IGlkID0gU3RyaW5nKGV4Py5leHBvcnRlcklkID8/ICcnKVxuICAgIGlmICghaXNBcnRpZmFjdEtleShrZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBjdXJyZW50ID0gY29uZmxpY3RzLmdldChrZXkpXG4gICAgaWYgKGN1cnJlbnQpIGN1cnJlbnQucHVzaChpZClcbiAgICBlbHNlIGNvbmZsaWN0cy5zZXQoa2V5LCBbaWRdKVxuICB9XG5cbiAgY29uc3QgY29uZmxpY3RLZXlzID0gbmV3IFNldDxBcnRpZmFjdEtleT4oKVxuICBmb3IgKGNvbnN0IFtrLCBpZHNdIG9mIGNvbmZsaWN0cykge1xuICAgIGNvbnN0IHVuaXF1ZSA9IEFycmF5LmZyb20obmV3IFNldChpZHMpKVxuICAgIGlmICh1bmlxdWUubGVuZ3RoID4gMSkge1xuICAgICAgY29uZmxpY3RLZXlzLmFkZChrKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1heEJ5dGVzID0gYnVkZ2V0T2Yob3B0aW9ucy5idWRnZXRzKVxuICBjb25zdCBjb2xsZWN0ZWQ6IEFycmF5PENvbGxlY3RlZD4gPSBbXVxuXG4gIGZvciAoY29uc3QgZXhwb3J0ZXIgb2YgZXhwb3J0ZXJzU29ydGVkKSB7XG4gICAgY29uc3QgYXJ0aWZhY3RLZXkgPSBleHBvcnRlcj8uYXJ0aWZhY3RLZXlcbiAgICBpZiAoIWlzQXJ0aWZhY3RLZXkoYXJ0aWZhY3RLZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoY29uZmxpY3RLZXlzLmhhcyhhcnRpZmFjdEtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZXhwb3J0ZXIuZXhwb3J0KG9wdGlvbnMuY3R4KVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoIWlzSnNvblZhbHVlKHZhbHVlKSkge1xuICAgICAgICBjb2xsZWN0ZWQucHVzaCh7XG4gICAgICAgICAgYXJ0aWZhY3RLZXksXG4gICAgICAgICAgZW52ZWxvcGU6IHtcbiAgICAgICAgICAgIGFydGlmYWN0S2V5LFxuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihgW0xvZ2l4XSBBcnRpZmFjdCBleHBvcnRlciByZXR1cm5lZCBub24tSnNvblZhbHVlOiAke2V4cG9ydGVyLmV4cG9ydGVySWR9YCksXG4gICAgICAgICAgICAgICdBcnRpZmFjdE5vblNlcmlhbGl6YWJsZScsXG4gICAgICAgICAgICAgIGBhcnRpZmFjdEtleT0ke2FydGlmYWN0S2V5fSBleHBvcnRlcklkPSR7ZXhwb3J0ZXIuZXhwb3J0ZXJJZH1gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cnVuY2F0ZWQgPSB0cnVuY2F0ZUpzb25WYWx1ZSh2YWx1ZSwgbWF4Qnl0ZXMpXG4gICAgICBjb25zdCBlbnZlbG9wZTogQXJ0aWZhY3RFbnZlbG9wZSA9IHtcbiAgICAgICAgYXJ0aWZhY3RLZXksXG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICB2YWx1ZTogdHJ1bmNhdGVkLnZhbHVlLFxuICAgICAgICBkaWdlc3Q6IHRydW5jYXRlZC5kaWdlc3QsXG4gICAgICAgIC4uLih0cnVuY2F0ZWQuYWN0dWFsQnl0ZXMgPiBtYXhCeXRlc1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICB0cnVuY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGJ1ZGdldEJ5dGVzOiBtYXhCeXRlcyxcbiAgICAgICAgICAgICAgYWN0dWFsQnl0ZXM6IHRydW5jYXRlZC5hY3R1YWxCeXRlcyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgYnVkZ2V0Qnl0ZXM6IG1heEJ5dGVzLFxuICAgICAgICAgICAgICBhY3R1YWxCeXRlczogdHJ1bmNhdGVkLmFjdHVhbEJ5dGVzLFxuICAgICAgICAgICAgfSksXG4gICAgICB9XG5cbiAgICAgIGNvbGxlY3RlZC5wdXNoKHsgYXJ0aWZhY3RLZXksIGVudmVsb3BlIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29sbGVjdGVkLnB1c2goe1xuICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgZW52ZWxvcGU6IHtcbiAgICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoXG4gICAgICAgICAgICBlLFxuICAgICAgICAgICAgJ0FydGlmYWN0RXhwb3J0RmFpbGVkJyxcbiAgICAgICAgICAgIGBhcnRpZmFjdEtleT0ke2FydGlmYWN0S2V5fSBleHBvcnRlcklkPSR7ZXhwb3J0ZXIuZXhwb3J0ZXJJZH1gLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgY29uZmxpY3RLZXkgb2YgQXJyYXkuZnJvbShjb25mbGljdEtleXMpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSkpIHtcbiAgICBjb2xsZWN0ZWQucHVzaChtYWtlQ29uZmxpY3RFbnZlbG9wZShjb25mbGljdEtleSwgY29uZmxpY3RzLmdldChjb25mbGljdEtleSkgPz8gW10pKVxuICB9XG5cbiAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICBjb2xsZWN0ZWQuc29ydCgoYSwgYikgPT4gYS5hcnRpZmFjdEtleS5sb2NhbGVDb21wYXJlKGIuYXJ0aWZhY3RLZXkpKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoY29sbGVjdGVkLm1hcCgoYykgPT4gW2MuYXJ0aWZhY3RLZXksIGMuZW52ZWxvcGVdKSkgc2F0aXNmaWVzIFRyaWFsUnVuQXJ0aWZhY3RzXG59XG4iLCAiaW1wb3J0IHsgRWZmZWN0LCBFeGl0LCBMYXllciwgU2NvcGUgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgdHlwZSB7IEV2aWRlbmNlUGFja2FnZSwgRXZpZGVuY2VQYWNrYWdlU291cmNlIH0gZnJvbSAnLi9ldmlkZW5jZS5qcydcbmltcG9ydCB7IG1ha2VFdmlkZW5jZUNvbGxlY3RvciwgZXZpZGVuY2VDb2xsZWN0b3JMYXllciB9IGZyb20gJy4vZXZpZGVuY2VDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBtYWtlUnVuU2Vzc2lvbiwgcnVuU2Vzc2lvbkxheWVyLCB0eXBlIFJ1blNlc3Npb24sIHR5cGUgUnVuSWQgfSBmcm9tICcuL3J1blNlc3Npb24uanMnXG5pbXBvcnQge1xuICBhcHBlbmRTaW5rcyxcbiAgZGlhZ25vc3RpY3NMZXZlbCxcbiAgdHlwZSBEaWFnbm9zdGljc0xldmVsLFxuICB0eXBlIFNpbmsgYXMgRGVidWdTaW5rLFxufSBmcm9tICcuLi9ydW50aW1lL2NvcmUvRGVidWdTaW5rLmpzJ1xuaW1wb3J0ICogYXMgUnVudGltZUtlcm5lbCBmcm9tICcuLi9ydW50aW1lL2NvcmUvUnVudGltZUtlcm5lbC5qcydcbmltcG9ydCB0eXBlIHsgQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvciB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuaW1wb3J0IHsgYXBwZW5kQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvcnMgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvQ29udmVyZ2VTdGF0aWNJckNvbGxlY3Rvci5qcydcbmV4cG9ydCAqIGZyb20gJy4vdHJpYWxSdW5Nb2R1bGUuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJpYWxSdW5PcHRpb25zIHtcbiAgcmVhZG9ubHkgcnVuSWQ/OiBSdW5JZFxuICByZWFkb25seSBzb3VyY2U/OiBFdmlkZW5jZVBhY2thZ2VTb3VyY2VcbiAgcmVhZG9ubHkgc3RhcnRlZEF0PzogbnVtYmVyXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzTGV2ZWw/OiBEaWFnbm9zdGljc0xldmVsXG4gIHJlYWRvbmx5IG1heEV2ZW50cz86IG51bWJlclxuICByZWFkb25seSBsYXllcj86IExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+XG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNPdmVycmlkZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1blJlc3VsdDxBLCBFPiB7XG4gIHJlYWRvbmx5IHNlc3Npb246IFJ1blNlc3Npb25cbiAgcmVhZG9ubHkgZXhpdDogRXhpdC5FeGl0PEEsIEU+XG4gIHJlYWRvbmx5IGV2aWRlbmNlOiBFdmlkZW5jZVBhY2thZ2Vcbn1cblxuY29uc3QgZGVmYXVsdEhvc3QgPSAoKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnYnJvd3NlcidcbiAgcmV0dXJuICdub2RlJ1xufVxuXG5leHBvcnQgY29uc3QgdHJpYWxSdW4gPSA8QSwgRSwgUj4oXG4gIHByb2dyYW06IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUj4sXG4gIG9wdGlvbnM/OiBUcmlhbFJ1bk9wdGlvbnMsXG4pOiBFZmZlY3QuRWZmZWN0PFRyaWFsUnVuUmVzdWx0PEEsIEU+LCBuZXZlciwgUj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHNlc3Npb24gPSBtYWtlUnVuU2Vzc2lvbih7XG4gICAgICBydW5JZDogb3B0aW9ucz8ucnVuSWQsXG4gICAgICBzb3VyY2U6IG9wdGlvbnM/LnNvdXJjZSA/PyB7IGhvc3Q6IGRlZmF1bHRIb3N0KCksIGxhYmVsOiAndHJpYWwtcnVuJyB9LFxuICAgICAgc3RhcnRlZEF0OiBvcHRpb25zPy5zdGFydGVkQXQsXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RvciA9IG1ha2VFdmlkZW5jZUNvbGxlY3RvcihzZXNzaW9uKVxuXG4gICAgY29uc3QgY29udmVyZ2VDb2xsZWN0b3I6IENvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IgPSB7XG4gICAgICByZWdpc3RlcjogKGlyKSA9PiB7XG4gICAgICAgIGNvbGxlY3Rvci5yZWdpc3RlckNvbnZlcmdlU3RhdGljSXIoaXIpXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHNpbmtzTGF5ZXIgPSBhcHBlbmRTaW5rcyhbY29sbGVjdG9yLmRlYnVnU2luayBhcyB1bmtub3duIGFzIERlYnVnU2lua10pXG4gICAgY29uc3QgZGlhZ25vc3RpY3NMYXllciA9IGRpYWdub3N0aWNzTGV2ZWwob3B0aW9ucz8uZGlhZ25vc3RpY3NMZXZlbCA/PyAnbGlnaHQnKVxuICAgIGNvbnN0IGNvbnZlcmdlTGF5ZXIgPSBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyhbY29udmVyZ2VDb2xsZWN0b3JdKVxuICAgIGNvbnN0IGNvbGxlY3RvckxheWVyID0gZXZpZGVuY2VDb2xsZWN0b3JMYXllcihjb2xsZWN0b3IpXG4gICAgY29uc3Qgc2Vzc2lvbkxheWVyID0gcnVuU2Vzc2lvbkxheWVyKHNlc3Npb24pXG5cbiAgICBjb25zdCBvdmVycmlkZXNMYXllciA9XG4gICAgICBvcHRpb25zPy5ydW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlcyAhPSBudWxsXG4gICAgICAgID8gKExheWVyLnN1Y2NlZWQoXG4gICAgICAgICAgICBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnLFxuICAgICAgICAgICAgb3B0aW9ucy5ydW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlcyxcbiAgICAgICAgICApIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPilcbiAgICAgICAgOiAoTGF5ZXIuZW1wdHkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+KVxuXG4gICAgY29uc3QgdHJpYWxMYXllciA9IExheWVyLm1lcmdlQWxsKFxuICAgICAgb3B0aW9ucz8ubGF5ZXIgPz8gKExheWVyLmVtcHR5IGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pLFxuICAgICAgc2Vzc2lvbkxheWVyLFxuICAgICAgY29sbGVjdG9yTGF5ZXIsXG4gICAgICBvdmVycmlkZXNMYXllcixcbiAgICAgIGRpYWdub3N0aWNzTGF5ZXIsXG4gICAgICBzaW5rc0xheWVyLFxuICAgICAgY29udmVyZ2VMYXllcixcbiAgICApIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIGFueT5cblxuICAgIGNvbnN0IHNjb3BlID0geWllbGQqIFNjb3BlLm1ha2UoKVxuXG4gICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChwcm9ncmFtKS5waXBlKEVmZmVjdC5wcm92aWRlU2VydmljZShTY29wZS5TY29wZSwgc2NvcGUpLCBFZmZlY3QucHJvdmlkZSh0cmlhbExheWVyKSlcblxuICAgIHlpZWxkKiBTY29wZS5jbG9zZShzY29wZSwgZXhpdClcblxuICAgIGNvbnN0IGV2aWRlbmNlID0gY29sbGVjdG9yLmV4cG9ydEV2aWRlbmNlUGFja2FnZSh7XG4gICAgICBtYXhFdmVudHM6IG9wdGlvbnM/Lm1heEV2ZW50cyxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHsgc2Vzc2lvbiwgZXhpdCwgZXZpZGVuY2UgfSBzYXRpc2ZpZXMgVHJpYWxSdW5SZXN1bHQ8QSwgRT5cbiAgfSlcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQSxJQUFNLFdBQVcsQ0FBQyxVQUNoQixPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsQ0FBQyxNQUFNLFFBQVEsS0FBSztBQUVyRSxJQUFNLGVBQWUsQ0FBQyxVQUNwQixTQUFTLEtBQUssS0FBSyxNQUFNLFNBQVMsZ0JBQWdCLFNBQVMsTUFBTSxNQUFNO0FBRXpFLElBQU0sa0JBQWtCLENBQUMsVUFBMkI7QUFDbEQsTUFBSSxhQUFhLEtBQUssR0FBRztBQUN2QixVQUFNLEtBQU0sTUFBTSxPQUFlO0FBQ2pDLFdBQU8sT0FBTyxPQUFPLFlBQVksR0FBRyxTQUFTLElBQUksS0FBSztBQUFBLEVBQ3hEO0FBRUEsTUFBSSxTQUFTLEtBQUssR0FBRztBQUNuQixVQUFNLEtBQUssTUFBTTtBQUNqQixRQUFJLE9BQU8sT0FBTyxZQUFZLEdBQUcsU0FBUyxFQUFHLFFBQU87QUFDcEQsVUFBTSxNQUFPLE1BQWM7QUFDM0IsUUFBSSxRQUFRLE9BQU8sUUFBUSxZQUFZLE9BQU8sUUFBUSxhQUFhO0FBQ2pFLFlBQU0sUUFBUyxJQUFZO0FBQzNCLFVBQUksT0FBTyxVQUFVLFlBQVksTUFBTSxTQUFTLEVBQUcsUUFBTztBQUFBLElBQzVEO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVBLElBQU0sbUJBQW1CLENBQUMsVUFBNEI7QUFDcEQsTUFBSSxhQUFhLEtBQUssRUFBRyxRQUFPLE1BQU07QUFDdEMsTUFBSSxTQUFTLEtBQUssS0FBTSxNQUFjLElBQUssUUFBUSxNQUFjO0FBQ2pFLFNBQU87QUFDVDtBQUVPLElBQU1BLGtCQUFpQixDQUFDLFdBQTBDO0FBQ3ZFLFFBQU0sTUFBTSxpQkFBaUIsTUFBTTtBQUNuQyxNQUFJLENBQUMsSUFBSyxRQUFPO0FBRWpCLFFBQU0sVUFBVSx1QkFBdUIsR0FBRztBQUMxQyxNQUFJLENBQUMsUUFBUyxRQUFPO0FBRXJCLFNBQU8sZUFBeUI7QUFBQSxJQUM5QjtBQUFBLElBQ0EsVUFBVSxnQkFBZ0IsTUFBTTtBQUFBLEVBQ2xDLENBQUM7QUFDSDs7O0FDaERBLFNBQVMsY0FBYztBQW1FdkIsSUFBTUMsWUFBVyxDQUFDLFVBQ2hCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU1DLGdCQUFlLENBQUMsVUFDcEJELFVBQVMsS0FBSyxLQUFLLE1BQU0sU0FBUyxnQkFBZ0JBLFVBQVMsTUFBTSxNQUFNO0FBRXpFLElBQU1FLG1CQUFrQixDQUFDLFVBQTJCO0FBQ2xELE1BQUlELGNBQWEsS0FBSyxHQUFHO0FBQ3ZCLFVBQU0sS0FBTSxNQUFNLE9BQWU7QUFDakMsV0FBTyxPQUFPLE9BQU8sWUFBWSxHQUFHLFNBQVMsSUFBSSxLQUFLO0FBQUEsRUFDeEQ7QUFFQSxNQUFJRCxVQUFTLEtBQUssR0FBRztBQUNuQixVQUFNLEtBQUssTUFBTTtBQUNqQixRQUFJLE9BQU8sT0FBTyxZQUFZLEdBQUcsU0FBUyxFQUFHLFFBQU87QUFDcEQsVUFBTSxNQUFPLE1BQWM7QUFDM0IsUUFBSSxRQUFRLE9BQU8sUUFBUSxZQUFZLE9BQU8sUUFBUSxhQUFhO0FBQ2pFLFlBQU0sUUFBUyxJQUFZO0FBQzNCLFVBQUksT0FBTyxVQUFVLFlBQVksTUFBTSxTQUFTLEVBQUcsUUFBTztBQUFBLElBQzVEO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVBLElBQU0sb0JBQW9CLENBQUMsVUFBMEM7QUFDbkUsUUFBTSxNQUFNQyxjQUFhLEtBQUssSUFBSyxNQUFNLFNBQWtCLE9BQWU7QUFDMUUsUUFBTSxZQUFZLEtBQUssT0FBTztBQUM5QixNQUFJLENBQUNELFVBQVMsU0FBUyxFQUFHLFFBQU8sQ0FBQztBQUNsQyxTQUFPLE9BQU8sS0FBSyxTQUFTLEVBQUUsS0FBSztBQUNyQztBQUlBLElBQU0sbUJBQW1CLENBQUMsVUFBMEM7QUFDbEUsTUFBSSxDQUFDQSxVQUFTLEtBQUssRUFBRyxRQUFPO0FBQzdCLFFBQU0sT0FBUSxNQUFjO0FBQzVCLFFBQU0sT0FBUSxNQUFjO0FBQzVCLFFBQU0sU0FBVSxNQUFjO0FBQzlCLE1BQUksT0FBTyxTQUFTLFlBQVksS0FBSyxXQUFXLEVBQUcsUUFBTztBQUMxRCxNQUFJLE9BQU8sU0FBUyxZQUFZLENBQUMsT0FBTyxVQUFVLElBQUksS0FBSyxPQUFPLEVBQUcsUUFBTztBQUM1RSxNQUFJLE9BQU8sV0FBVyxZQUFZLENBQUMsT0FBTyxVQUFVLE1BQU0sS0FBSyxTQUFTLEVBQUcsUUFBTztBQUNsRixTQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU87QUFDOUI7QUFFQSxJQUFNLHFCQUFxQixDQUFDLFVBQTBDO0FBQ3BFLE1BQUksQ0FBQyxTQUFVLE9BQU8sVUFBVSxZQUFZLE9BQU8sVUFBVSxXQUFhLFFBQU87QUFDakYsU0FBTyxpQkFBa0IsTUFBYyxNQUFNO0FBQy9DO0FBRUEsSUFBTSxpQkFBaUIsQ0FBQyxVQUF3RDtBQUM5RSxRQUFNLE1BQU1DLGNBQWEsS0FBSyxJQUFLLE1BQU0sU0FBa0IsT0FBZTtBQUMxRSxRQUFNLFlBQVksS0FBSyxPQUFPO0FBQzlCLE1BQUksQ0FBQ0QsVUFBUyxTQUFTLEVBQUcsUUFBTyxDQUFDO0FBRWxDLFFBQU0sZUFBZSxjQUFjLEtBQUs7QUFDeEMsUUFBTSxXQUFXQSxVQUFTLEtBQUssUUFBUSxJQUFLLElBQUksV0FBdUM7QUFFdkYsUUFBTSxhQUFhLE9BQU8sS0FBSyxTQUFTLEVBQUUsS0FBSztBQUUvQyxRQUFNLE1BQW1DLENBQUM7QUFDMUMsYUFBVyxhQUFhLFlBQVk7QUFDbEMsVUFBTSxRQUFRLFVBQVUsU0FBUztBQUNqQyxVQUFNLFNBQVMsbUJBQW1CLEtBQUssS0FBSztBQUM1QyxVQUFNLGNBQ0csY0FBYyxLQUFLLEtBQUssT0FBTyxTQUFVLE1BQWdDLE1BQU0sSUFDakYsTUFBZ0MsV0FBVyxPQUFPLE9BQ2pELFNBQ0EsWUFDRjtBQUVOLFVBQU0saUJBQ0osWUFBWSxPQUFPLFNBQVMsU0FBUyxNQUFNLGFBQWMsRUFBRSxNQUFNLFdBQVcsSUFBYztBQUU1RixRQUFJLEtBQUs7QUFBQSxNQUNQO0FBQUEsTUFDQSxTQUFTLEVBQUUsTUFBTSxZQUFZO0FBQUEsTUFDN0IsR0FBSSxpQkFBaUIsRUFBRSxlQUFlLElBQUksQ0FBQztBQUFBLE1BQzNDLEdBQUksU0FBUyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQUEsSUFDN0IsQ0FBQztBQUFBLEVBQ0g7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxJQUFNLDBCQUEwQix1QkFBTyxJQUFJLCtCQUErQjtBQUUxRSxJQUFNLGlCQUFpQixDQUFDLFVBQW9FO0FBQzFGLFFBQU0sTUFBTUMsY0FBYSxLQUFLLElBQUssTUFBTSxTQUFrQixPQUFlO0FBQzFFLFFBQU0sWUFBWSxLQUFLLE9BQU87QUFDOUIsTUFBSSxDQUFDRCxVQUFTLFNBQVMsRUFBRyxRQUFPO0FBRWpDLFFBQU0sYUFBYyxNQUFjLHVCQUF1QjtBQUN6RCxNQUFJLENBQUNBLFVBQVMsVUFBVSxFQUFHLFFBQU87QUFFbEMsUUFBTSxTQUFTLGNBQWMsS0FBSztBQUVsQyxRQUFNLGNBQWM7QUFDcEIsUUFBTSxhQUFhLG9CQUFJLFFBQXlDO0FBQ2hFLE1BQUksaUJBQWlCO0FBRXJCLFFBQU0sTUFBbUMsQ0FBQztBQUUxQyxhQUFXLGFBQWEsT0FBTyxLQUFLLFVBQVUsRUFBRSxLQUFLLEdBQUc7QUFDdEQsUUFBSSxFQUFFLGFBQWEsV0FBWTtBQUUvQixVQUFNLFdBQVksV0FBbUIsU0FBUztBQUM5QyxRQUFJLENBQUMsTUFBTSxRQUFRLFFBQVEsRUFBRztBQUU5QixlQUFXLFdBQVcsVUFBVTtBQUM5QixVQUFJLE9BQU8sWUFBWSxXQUFZO0FBRW5DLFVBQUksWUFBWSxXQUFXLElBQUksT0FBTztBQUN0QyxVQUFJLENBQUMsV0FBVztBQUNkLDBCQUFrQjtBQUNsQixvQkFBWSxJQUFJLGNBQWM7QUFDOUIsbUJBQVcsSUFBSSxTQUFTLFNBQVM7QUFBQSxNQUNuQztBQUVBLFlBQU0sWUFBWSxHQUFHLFdBQVcsS0FBSyxTQUFTO0FBRTlDLFVBQUksS0FBSztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsUUFDQSxNQUFNO0FBQUEsUUFDTixHQUFJLFNBQVMsRUFBRSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQzdCLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUVBLFFBQU0sT0FBTyxvQkFBSSxJQUFZO0FBQzdCLFFBQU0sVUFBdUMsQ0FBQztBQUM5QyxhQUFXLFFBQVEsS0FBSztBQUN0QixVQUFNLE1BQU0sR0FBRyxLQUFLLFNBQVMsS0FBUyxLQUFLLFNBQVM7QUFDcEQsUUFBSSxLQUFLLElBQUksR0FBRyxFQUFHO0FBQ25CLFNBQUssSUFBSSxHQUFHO0FBQ1osWUFBUSxLQUFLLElBQUk7QUFBQSxFQUNuQjtBQUVBLFVBQVE7QUFBQSxJQUFLLENBQUMsR0FBRyxNQUNmLEVBQUUsWUFBWSxFQUFFLFlBQVksS0FBSyxFQUFFLFlBQVksRUFBRSxZQUFZLElBQUksRUFBRSxVQUFVLGNBQWMsRUFBRSxTQUFTO0FBQUEsRUFDeEc7QUFDQSxTQUFPLFFBQVEsU0FBUyxJQUFJLFVBQVU7QUFDeEM7QUFFQSxJQUFNLG9CQUFvQixDQUFDLFVBQXNEO0FBQy9FLE1BQUksQ0FBQ0EsVUFBUyxLQUFLLEVBQUcsUUFBTztBQUM3QixRQUFNLFVBQVcsTUFBYztBQUMvQixNQUFJLENBQUNBLFVBQVMsT0FBTyxFQUFHLFFBQU87QUFDL0IsU0FBTyxPQUFPLEtBQUssT0FBTyxFQUFFLEtBQUs7QUFDbkM7QUFFQSxJQUFNLGdCQUFnQixDQUFDLFVBQXlEO0FBQzlFLE1BQUksQ0FBQ0EsVUFBUyxLQUFLLEVBQUcsUUFBTztBQUM3QixRQUFNLE1BQU8sTUFBYztBQUMzQixTQUFPLGlCQUFpQixLQUFLLE1BQU07QUFDckM7QUFFQSxJQUFNLGNBQWMsQ0FBQyxVQUEwRDtBQUM3RSxNQUFJLENBQUNBLFVBQVMsS0FBSyxFQUFHLFFBQU87QUFDN0IsUUFBTSxPQUFRLE1BQWM7QUFDNUIsTUFBSSxDQUFDQSxVQUFTLElBQUksRUFBRyxRQUFPO0FBRTVCLFFBQU0sTUFBaUMsQ0FBQztBQUN4QyxhQUFXLE9BQU8sT0FBTyxLQUFLLElBQUksRUFBRSxLQUFLLEdBQUc7QUFDMUMsVUFBTSxRQUFRLEtBQUssR0FBRztBQUN0QixRQUFJLFlBQVksS0FBSyxHQUFHO0FBQ3RCLFVBQUksR0FBRyxJQUFJO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFDQSxTQUFPLE9BQU8sS0FBSyxHQUFHLEVBQUUsU0FBUyxJQUFJLE1BQU07QUFDN0M7QUFFQSxJQUFNLGtCQUFrQix1QkFBTyxJQUFJLHVCQUF1QjtBQUUxRCxJQUFNLG9CQUFvQixDQUFDLFVBQXVFO0FBQ2hHLE1BQUksQ0FBQ0EsVUFBUyxLQUFLLEVBQUcsUUFBTztBQUM3QixRQUFNLFdBQVksTUFBYyxlQUFlO0FBQy9DLFFBQU0sVUFBVSxVQUFVO0FBQzFCLE1BQUksQ0FBQyxNQUFNLFFBQVEsT0FBTyxFQUFHLFFBQU87QUFFcEMsUUFBTSxNQUFzQyxDQUFDO0FBQzdDLGFBQVcsUUFBUSxTQUFTO0FBQzFCLFFBQUksQ0FBQ0EsVUFBUyxJQUFJLEVBQUc7QUFDckIsVUFBTSxPQUFPLEtBQUs7QUFDbEIsVUFBTSxLQUFLLEtBQUs7QUFDaEIsUUFBSSxPQUFPLFNBQVMsWUFBWSxLQUFLLFdBQVcsRUFBRztBQUNuRCxRQUFJLE9BQU8sT0FBTyxZQUFZLEdBQUcsV0FBVyxFQUFHO0FBRS9DLFVBQU0sVUFBVSxLQUFLLFlBQVksT0FBTyxPQUFPO0FBQy9DLFVBQU0sT0FBTyxPQUFPLEtBQUssU0FBUyxXQUFXLEtBQUssT0FBTztBQUN6RCxRQUFJLEtBQUssRUFBRSxNQUFNLElBQUksU0FBUyxLQUFLLENBQUM7QUFBQSxFQUN0QztBQUVBLE1BQUksS0FBSyxDQUFDLEdBQUcsTUFBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsS0FBSyxjQUFjLEVBQUUsSUFBSSxDQUFFO0FBQ3RGLFNBQU8sSUFBSSxTQUFTLElBQUksTUFBTTtBQUNoQztBQWFBLElBQU0sV0FBVyxDQUFDLFNBQTZCLGdCQUFnQixRQUFRLGdCQUFnQixJQUFJLENBQUMsQ0FBQztBQUU3RixJQUFNLGlCQUFpQixDQUFDLFVBQTJCO0FBQ2pELFFBQU0sT0FBTyxLQUFLLFVBQVUsS0FBSztBQUNqQyxNQUFJLE9BQU8sZ0JBQWdCLGFBQWE7QUFDdEMsV0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLElBQUksRUFBRTtBQUFBLEVBQ3hDO0FBQ0EsU0FBTyxLQUFLO0FBQ2Q7QUFFQSxJQUFNLGdCQUFnQixDQUFDLFVBQTBCLGFBQXFDO0FBQ3BGLFFBQU0sZ0JBQWdCLGVBQWUsUUFBUTtBQUM3QyxNQUFJLGlCQUFpQixTQUFVLFFBQU87QUFFdEMsUUFBTSxVQUF5QixDQUFDO0FBQ2hDLFFBQU0sa0JBQWlDLENBQUM7QUFFeEMsUUFBTSxhQUFhLE9BQWtCO0FBQUEsSUFDbkMsV0FBVztBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhLENBQUNHLFVBQXlDO0FBQzNELFVBQU0sT0FBa0M7QUFBQSxNQUN0QyxTQUFTLFdBQVc7QUFBQSxJQUN0QjtBQUNBLFdBQU8sRUFBRSxHQUFHQSxPQUFNLEtBQUs7QUFBQSxFQUN6QjtBQUVBLE1BQUksT0FBdUIsV0FBVyxRQUFRO0FBRTlDLFFBQU0scUJBQXFCLENBQUMsU0FBdUI7QUFDakQsUUFBSSxDQUFDLGdCQUFnQixTQUFTLElBQUksR0FBRztBQUNuQyxzQkFBZ0IsS0FBSyxJQUFJO0FBQUEsSUFDM0I7QUFBQSxFQUNGO0FBRUEsUUFBTSxZQUFZLENBQUMsVUFBc0M7QUFDdkQsUUFBSyxLQUFhLEtBQUssTUFBTSxRQUFXO0FBQ3RDLGNBQVEsS0FBSyxPQUFPLEtBQUssQ0FBQztBQUMxQixhQUFPLFdBQVcsRUFBRSxHQUFJLE1BQWMsQ0FBQyxLQUFLLEdBQUcsT0FBVSxDQUFDO0FBQUEsSUFDNUQ7QUFBQSxFQUNGO0FBR0EsWUFBVSxNQUFNO0FBQ2hCLE1BQUksZUFBZSxJQUFJLEtBQUssU0FBVSxRQUFPO0FBRTdDLFlBQVUsUUFBUTtBQUNsQixNQUFJLGVBQWUsSUFBSSxLQUFLLFNBQVUsUUFBTztBQUU3QyxZQUFVLFVBQVU7QUFDcEIsTUFBSSxlQUFlLElBQUksS0FBSyxTQUFVLFFBQU87QUFFN0MsWUFBVSxZQUFZO0FBQ3RCLE1BQUksZUFBZSxJQUFJLEtBQUssU0FBVSxRQUFPO0FBRTdDLFlBQVUsWUFBWTtBQUN0QixNQUFJLGVBQWUsSUFBSSxLQUFLLFNBQVUsUUFBTztBQUU3QyxZQUFVLFNBQVM7QUFDbkIsTUFBSSxlQUFlLElBQUksS0FBSyxTQUFVLFFBQU87QUFHN0MsUUFBTSx1QkFBdUIsTUFBWTtBQUN2QyxVQUFNLFFBQVEsS0FBSyxRQUFRO0FBQzNCLFFBQUksU0FBUyxFQUFHO0FBR2hCLFFBQUksS0FBSztBQUNULFFBQUksS0FBSztBQUNULFFBQUksT0FBTztBQUVYLFdBQU8sTUFBTSxJQUFJO0FBQ2YsWUFBTSxNQUFNLEtBQUssT0FBTyxLQUFLLE1BQU0sQ0FBQztBQUNwQyxZQUFNLFlBQVksV0FBVztBQUFBLFFBQzNCLEdBQUc7QUFBQSxRQUNILFNBQVMsS0FBSyxRQUFRLE1BQU0sR0FBRyxHQUFHO0FBQUEsUUFDbEMsWUFBWSxLQUFLLFdBQVcsTUFBTSxHQUFHLEdBQUc7QUFBQSxNQUMxQyxDQUFDO0FBQ0QsVUFBSSxlQUFlLFNBQVMsS0FBSyxVQUFVO0FBQ3pDLGVBQU87QUFDUCxhQUFLLE1BQU07QUFBQSxNQUNiLE9BQU87QUFDTCxhQUFLLE1BQU07QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUVBLFFBQUksT0FBTyxPQUFPO0FBQ2hCLHlCQUFtQixTQUFTO0FBQzVCLHlCQUFtQixZQUFZO0FBQy9CLGFBQU8sV0FBVztBQUFBLFFBQ2hCLEdBQUc7QUFBQSxRQUNILFNBQVMsS0FBSyxRQUFRLE1BQU0sR0FBRyxJQUFJO0FBQUEsUUFDbkMsWUFBWSxLQUFLLFdBQVcsTUFBTSxHQUFHLElBQUk7QUFBQSxNQUMzQyxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxTQUFPLGVBQWUsSUFBSSxJQUFJLFVBQVU7QUFDdEMsVUFBTSxZQUFZLEtBQUssUUFBUTtBQUMvQix5QkFBcUI7QUFDckIsUUFBSSxLQUFLLFFBQVEsV0FBVyxXQUFXO0FBQ3JDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFTyxJQUFNLGtCQUFrQixDQUFDLFFBQWlCLFlBQXFEO0FBQ3BHLFFBQU0sa0JBQWtCO0FBQ3hCLFFBQU0sV0FBV0QsaUJBQWdCLE1BQU07QUFDdkMsUUFBTSxhQUFhLGtCQUFrQixNQUFNO0FBQzNDLFFBQU0sVUFBVSxlQUFlLE1BQU07QUFDckMsUUFBTSxVQUFVLGVBQWUsTUFBTTtBQUVyQyxRQUFNLGFBQWEsa0JBQWtCLE1BQU07QUFDM0MsUUFBTSxhQUFhLGtCQUFrQixNQUFNO0FBQzNDLFFBQU0sU0FBUyxjQUFjLE1BQU07QUFDbkMsUUFBTSxPQUFPLFlBQVksTUFBTTtBQUUvQixRQUFNLFdBQVcsU0FBUyxrQkFBa0JFLGdCQUFlLE1BQU0sSUFBSTtBQUVyRSxRQUFNLGFBQXlCO0FBQUEsSUFDN0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLGdCQUFnQixVQUFVO0FBQUEsRUFDNUI7QUFFQSxRQUFNLFNBQVMsU0FBUyxVQUFVO0FBRWxDLFFBQU0sV0FBMkI7QUFBQSxJQUMvQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxXQUFXLFNBQVMsU0FBUztBQUNuQyxNQUFJLE9BQU8sYUFBYSxZQUFZLE9BQU8sU0FBUyxRQUFRLEtBQUssV0FBVyxHQUFHO0FBQzdFLFdBQU8sY0FBYyxVQUFVLFFBQVE7QUFBQSxFQUN6QztBQUVBLFNBQU87QUFDVDs7O0FDbGJBLElBQU0scUJBQXFCLHVCQUFPLElBQUksd0NBQXdDO0FBRXZFLElBQU0sbUNBQW1DLENBQUMsS0FBYyxhQUE2QztBQUMxRyxNQUFJLENBQUMsT0FBUSxPQUFPLFFBQVEsWUFBWSxPQUFPLFFBQVEsWUFBYTtBQUNsRSxVQUFNLElBQUksTUFBTSw4REFBOEQ7QUFBQSxFQUNoRjtBQUVBLFFBQU0sVUFBWSxJQUFZLGtCQUFrQixLQUFLLENBQUM7QUFDdEQsUUFBTSxPQUFPLE1BQU0sUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHLFNBQVMsUUFBUSxJQUFJLENBQUMsUUFBUTtBQUN2RSxFQUFDLElBQVksa0JBQWtCLElBQUk7QUFDdEM7QUFFTyxJQUFNLCtCQUErQixDQUFDLFFBQTBEO0FBQ3JHLE1BQUksQ0FBQyxPQUFRLE9BQU8sUUFBUSxZQUFZLE9BQU8sUUFBUSxZQUFhO0FBQ2xFLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFVBQVcsSUFBWSxrQkFBa0I7QUFDL0MsTUFBSSxDQUFDLE1BQU0sUUFBUSxPQUFPLEVBQUcsUUFBTyxDQUFDO0FBQ3JDLFNBQU8sUUFBUSxPQUFPLENBQUMsTUFBcUMsS0FBSyxPQUFPLE1BQU0sUUFBUTtBQUN4Rjs7O0FDdEJBLFNBQVMsU0FBQUMsUUFBTyxVQUFBQyxTQUFRLE1BQU0sT0FBTyxTQUFBQyxRQUFPLGNBQWM7OztBQ0ExRCxTQUFTLGdCQUFnQixVQUFBQyxTQUFRLFNBQUFDLGNBQWE7OztBQ0E5QyxTQUFTLE9BQU8sY0FBYzs7O0FDQTlCLFNBQVMsU0FBUyxhQUFhO0FBVS9CLElBQU0sYUFBYSxNQUF1QjtBQUN4QyxRQUFNLFlBQVksT0FBTyxXQUFXLGVBQWUsT0FBTyxhQUFhO0FBRXZFLE1BQUksVUFBVyxRQUFPO0FBRXRCLFFBQU0sU0FBUyxPQUFPLFlBQVksZUFBZSxPQUFRLFNBQWlCLFVBQVUsU0FBUztBQUU3RixNQUFJLE9BQVEsUUFBTztBQUVuQixTQUFPO0FBQ1Q7QUFFTyxJQUFNLE9BQU8sQ0FBQyxVQUErQztBQUFBLEVBQ2xFO0FBQUEsRUFDQSxRQUFRLFNBQVM7QUFBQSxFQUNqQixXQUFXLFNBQVM7QUFDdEI7QUFFTyxJQUFNLGNBQU4sY0FBMEIsUUFBUSxJQUFJLG9CQUFvQixFQUFtQyxFQUFFO0FBQUM7QUFFaEcsSUFBTSxRQUFRLENBQUMsWUFDcEIsTUFBTSxRQUFRLGFBQWEsT0FBTztBQUk3QixJQUFNLGVBQXVELE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQzs7O0FGVDVGLElBQU0sNkJBQTZCLENBQ2pDLFdBQ2tDO0FBQ2xDLFFBQU0sTUFBTSxvQkFBSSxJQUFvQjtBQUNwQyxhQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssT0FBTyxRQUFRLFVBQVUsQ0FBQyxDQUFDLEdBQUc7QUFDakQsUUFBSSxDQUFDLEVBQUc7QUFDUixRQUFJLE1BQU0sT0FBVztBQUNyQixRQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQztBQUFBLEVBQ3RCO0FBQ0EsU0FBTyxlQUFlLFFBQVEsR0FBRztBQUNuQztBQUVPLElBQU1DLFNBQVEsQ0FBQyxVQUEyQixDQUFDLE1BQThDO0FBQzlGLFFBQU0sY0FBYyxRQUFRLGNBQ3hCLE1BQWlCLFFBQVEsV0FBVyxJQUNwQyxRQUFRLGtCQUNOLE1BQWlCLEtBQWdCLFFBQVEsZUFBZSxDQUFDLElBQ3pEO0FBRU4sUUFBTSxpQkFBaUIsUUFBUSxpQkFBaUIsUUFBUSxpQkFBaUIsMkJBQTJCLFFBQVEsTUFBTTtBQUVsSCxRQUFNLFNBQVNDLE9BQU0sa0JBQWtCLGNBQWM7QUFFckQsU0FBT0EsT0FBTSxTQUFTLGFBQWEsTUFBTTtBQUMzQzs7O0FHbERBLFNBQWlCLFNBQUFDLGNBQTZCO0FBMkJ2QyxJQUFNQyxRQUFPLENBQ2xCLFVBQ0EsWUFDOEM7QUFDOUMsUUFBTSxZQUFnRDtBQUFBLElBQ3BELE9BQVEsU0FBUyxTQUFTQyxPQUFNO0FBQUEsSUFDaEMsU0FBUyxDQUFnQixRQUFRLFNBQVMsUUFBUSxTQUFTLEtBQW1DLENBQUM7QUFBQSxJQUMvRixXQUFXLFNBQVMsYUFBYSxDQUFDO0FBQUEsSUFDbEMsU0FBUyxTQUFTO0FBQUEsRUFDcEI7QUFFQSxRQUFNLE1BQXFCLFFBQVEsU0FBUztBQUM1QyxTQUFPLElBQUksWUFBWTtBQUN6Qjs7O0FDakNPLElBQU0sZ0JBQWdCLENBQUMsVUFDNUIsT0FBTyxVQUFVLFlBQVksMkJBQTJCLEtBQUssS0FBSzs7O0FDQ3BFLElBQU0sdUJBQXVCLENBQUMsU0FBeUI7QUFDckQsTUFBSSxPQUFPLGdCQUFnQixhQUFhO0FBQ3RDLFdBQU8sSUFBSSxZQUFZLEVBQUUsT0FBTyxJQUFJLEVBQUU7QUFBQSxFQUN4QztBQUNBLFNBQU8sS0FBSztBQUNkO0FBRU8sSUFBTSxrQkFBa0IsQ0FBQyxVQUFzQztBQUNwRSxRQUFNLGFBQWEsZ0JBQWdCLEtBQUs7QUFDeEMsUUFBTSxRQUFRLHFCQUFxQixVQUFVO0FBQzdDLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBUSxnQkFBZ0IsUUFBUSxVQUFVLENBQUM7QUFBQSxFQUM3QztBQUNGOzs7QUNGQSxJQUFNLHlCQUF5QixDQUFDLE9BQWdCLE1BQWMsU0FBNEM7QUFDeEcsUUFBTSxPQUFPLDJCQUEyQixLQUFLLEVBQUU7QUFDL0MsU0FBTztBQUFBLElBQ0wsTUFBTSxLQUFLO0FBQUEsSUFDWCxTQUFTLEtBQUs7QUFBQSxJQUNkO0FBQUEsSUFDQSxNQUFNLFFBQVEsS0FBSztBQUFBLEVBQ3JCO0FBQ0Y7QUFFQSxJQUFNLDZCQUE2QixLQUFLO0FBRXhDLElBQU0sV0FBVyxDQUFDLFlBQ2hCLE9BQU8sU0FBUyxhQUFhLFlBQVksT0FBTyxTQUFTLFFBQVEsUUFBUSxLQUFLLFFBQVEsV0FBVyxJQUM3RixRQUFRLFdBQ1I7QUFPTixJQUFNLHVCQUF1QixDQUFDLGFBQTBCLGdCQUFrRDtBQUN4RyxRQUFNLE1BQU0sTUFBTSxLQUFLLElBQUksSUFBSSxZQUFZLElBQUksQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFBQSxJQUFLLENBQUMsR0FBRyxNQUN0RyxFQUFFLGNBQWMsQ0FBQztBQUFBLEVBQ25CO0FBQ0EsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSO0FBQUEsTUFDQSxJQUFJO0FBQUEsTUFDSixPQUFPO0FBQUEsUUFDTCxNQUFNO0FBQUEsUUFDTixTQUFTLDJDQUEyQyxXQUFXO0FBQUEsUUFDL0QsTUFBTTtBQUFBLFFBQ04sTUFBTSxJQUFJLFNBQVMsSUFBSSx3QkFBd0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLO0FBQUEsTUFDbkU7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTSxvQkFBb0IsQ0FDeEIsT0FDQSxhQUN5RjtBQUN6RixRQUFNLFdBQVcsZ0JBQWdCLEtBQUs7QUFDdEMsUUFBTSxPQUFPLFNBQVM7QUFDdEIsUUFBTSxRQUFRLFNBQVM7QUFDdkIsTUFBSSxTQUFTLFVBQVU7QUFDckIsV0FBTyxFQUFFLE9BQU8sYUFBYSxPQUFPLFFBQVEsU0FBUyxPQUFPO0FBQUEsRUFDOUQ7QUFFQSxRQUFNLGVBQWUsS0FBSyxJQUFJLEtBQUssUUFBUSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztBQUMvRSxRQUFNLFVBQVUsS0FBSyxNQUFNLEdBQUcsWUFBWTtBQUMxQyxTQUFPO0FBQUEsSUFDTCxPQUFPO0FBQUEsTUFDTCxNQUFNO0FBQUEsTUFDTjtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFDQSxhQUFhO0FBQUEsSUFDYixRQUFRLFNBQVM7QUFBQSxFQUNuQjtBQUNGO0FBRU8sSUFBTSwyQkFBMkIsQ0FBQyxZQUE0RTtBQUNuSCxRQUFNLGtCQUFrQixNQUFNLEtBQUssUUFBUSxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTTtBQUNuRSxVQUFNLEtBQUssT0FBTyxHQUFHLGVBQWUsRUFBRTtBQUN0QyxVQUFNLEtBQUssT0FBTyxHQUFHLGVBQWUsRUFBRTtBQUN0QyxRQUFJLEtBQUssR0FBSSxRQUFPO0FBQ3BCLFFBQUksS0FBSyxHQUFJLFFBQU87QUFDcEIsVUFBTSxLQUFLLE9BQU8sR0FBRyxjQUFjLEVBQUU7QUFDckMsVUFBTSxLQUFLLE9BQU8sR0FBRyxjQUFjLEVBQUU7QUFDckMsV0FBTyxHQUFHLGNBQWMsRUFBRTtBQUFBLEVBQzVCLENBQUM7QUFFRCxRQUFNLFlBQVksb0JBQUksSUFBZ0M7QUFDdEQsYUFBVyxNQUFNLGlCQUFpQjtBQUNoQyxVQUFNLE1BQU0sSUFBSTtBQUNoQixVQUFNLEtBQUssT0FBTyxJQUFJLGNBQWMsRUFBRTtBQUN0QyxRQUFJLENBQUMsY0FBYyxHQUFHLEdBQUc7QUFDdkI7QUFBQSxJQUNGO0FBQ0EsVUFBTSxVQUFVLFVBQVUsSUFBSSxHQUFHO0FBQ2pDLFFBQUksUUFBUyxTQUFRLEtBQUssRUFBRTtBQUFBLFFBQ3ZCLFdBQVUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO0FBQUEsRUFDOUI7QUFFQSxRQUFNLGVBQWUsb0JBQUksSUFBaUI7QUFDMUMsYUFBVyxDQUFDLEdBQUcsR0FBRyxLQUFLLFdBQVc7QUFDaEMsVUFBTSxTQUFTLE1BQU0sS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDO0FBQ3RDLFFBQUksT0FBTyxTQUFTLEdBQUc7QUFDckIsbUJBQWEsSUFBSSxDQUFDO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBRUEsUUFBTSxXQUFXLFNBQVMsUUFBUSxPQUFPO0FBQ3pDLFFBQU0sWUFBOEIsQ0FBQztBQUVyQyxhQUFXLFlBQVksaUJBQWlCO0FBQ3RDLFVBQU0sY0FBYyxVQUFVO0FBQzlCLFFBQUksQ0FBQyxjQUFjLFdBQVcsR0FBRztBQUMvQjtBQUFBLElBQ0Y7QUFDQSxRQUFJLGFBQWEsSUFBSSxXQUFXLEdBQUc7QUFDakM7QUFBQSxJQUNGO0FBRUEsUUFBSTtBQUNGLFlBQU0sUUFBUSxTQUFTLE9BQU8sUUFBUSxHQUFHO0FBQ3pDLFVBQUksVUFBVSxPQUFXO0FBQ3pCLFVBQUksQ0FBQyxZQUFZLEtBQUssR0FBRztBQUN2QixrQkFBVSxLQUFLO0FBQUEsVUFDYjtBQUFBLFVBQ0EsVUFBVTtBQUFBLFlBQ1I7QUFBQSxZQUNBLElBQUk7QUFBQSxZQUNKLE9BQU87QUFBQSxjQUNMLElBQUksTUFBTSxxREFBcUQsU0FBUyxVQUFVLEVBQUU7QUFBQSxjQUNwRjtBQUFBLGNBQ0EsZUFBZSxXQUFXLGVBQWUsU0FBUyxVQUFVO0FBQUEsWUFDOUQ7QUFBQSxVQUNGO0FBQUEsUUFDRixDQUFDO0FBQ0Q7QUFBQSxNQUNGO0FBRUEsWUFBTSxZQUFZLGtCQUFrQixPQUFPLFFBQVE7QUFDbkQsWUFBTSxXQUE2QjtBQUFBLFFBQ2pDO0FBQUEsUUFDQSxJQUFJO0FBQUEsUUFDSixPQUFPLFVBQVU7QUFBQSxRQUNqQixRQUFRLFVBQVU7QUFBQSxRQUNsQixHQUFJLFVBQVUsY0FBYyxXQUN4QjtBQUFBLFVBQ0UsV0FBVztBQUFBLFVBQ1gsYUFBYTtBQUFBLFVBQ2IsYUFBYSxVQUFVO0FBQUEsUUFDekIsSUFDQTtBQUFBLFVBQ0UsYUFBYTtBQUFBLFVBQ2IsYUFBYSxVQUFVO0FBQUEsUUFDekI7QUFBQSxNQUNOO0FBRUEsZ0JBQVUsS0FBSyxFQUFFLGFBQWEsU0FBUyxDQUFDO0FBQUEsSUFDMUMsU0FBUyxHQUFHO0FBQ1YsZ0JBQVUsS0FBSztBQUFBLFFBQ2I7QUFBQSxRQUNBLFVBQVU7QUFBQSxVQUNSO0FBQUEsVUFDQSxJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsWUFDTDtBQUFBLFlBQ0E7QUFBQSxZQUNBLGVBQWUsV0FBVyxlQUFlLFNBQVMsVUFBVTtBQUFBLFVBQzlEO0FBQUEsUUFDRjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBRUEsYUFBVyxlQUFlLE1BQU0sS0FBSyxZQUFZLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDLEdBQUc7QUFDckYsY0FBVSxLQUFLLHFCQUFxQixhQUFhLFVBQVUsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFBQSxFQUNwRjtBQUVBLE1BQUksVUFBVSxXQUFXLEVBQUcsUUFBTztBQUVuQyxZQUFVLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxZQUFZLGNBQWMsRUFBRSxXQUFXLENBQUM7QUFFbkUsU0FBTyxPQUFPLFlBQVksVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzdFOzs7QVB6SEEsSUFBTSxjQUFjLE1BQWM7QUFDaEMsTUFBSSxPQUFPLFdBQVcsZUFBZSxPQUFPLGFBQWEsWUFBYSxRQUFPO0FBQzdFLFNBQU87QUFDVDtBQUVBLElBQU1DLFlBQVcsQ0FBQyxVQUNoQixPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsQ0FBQyxNQUFNLFFBQVEsS0FBSztBQUVyRSxJQUFNLGtCQUFrQixDQUE0QixTQUNoRCxNQUFjLFNBQVMsZUFDcEIsT0FDQyxNQUFjO0FBRXRCLElBQU1DLGtCQUFpQixDQUFDLFVBQTJCO0FBQ2pELFFBQU0sT0FBTyxLQUFLLFVBQVUsS0FBSztBQUNqQyxNQUFJLE9BQU8sZ0JBQWdCLGFBQWE7QUFDdEMsV0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLElBQUksRUFBRTtBQUFBLEVBQ3hDO0FBQ0EsU0FBTyxLQUFLO0FBQ2Q7QUFFQSxJQUFNLHlCQUF5QixDQUFDLFlBQTJDO0FBQ3pFLFFBQU0sTUFBZ0IsQ0FBQztBQUd2QixRQUFNLFdBQWtDO0FBQUEsSUFDdEM7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsYUFBVyxNQUFNLFVBQVU7QUFDekIsUUFBSTtBQUNKLFdBQVEsUUFBUSxHQUFHLEtBQUssT0FBTyxHQUFJO0FBQ2pDLFlBQU0sTUFBTSxNQUFNLENBQUM7QUFDbkIsVUFBSSxPQUFPLFFBQVEsWUFBWSxJQUFJLFNBQVMsRUFBRyxLQUFJLEtBQUssR0FBRztBQUFBLElBQzdEO0FBQUEsRUFDRjtBQUVBLFNBQU8sTUFBTSxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDbkU7QUFFQSxJQUFNLHlCQUF5QixDQUFDLFlBQTJDO0FBQ3pFLFFBQU0sTUFBZ0IsQ0FBQztBQUN2QixRQUFNLEtBQUs7QUFDWCxNQUFJO0FBQ0osU0FBUSxRQUFRLEdBQUcsS0FBSyxPQUFPLEdBQUk7QUFDakMsVUFBTSxLQUFLLE1BQU0sQ0FBQyxHQUFHLFFBQVEsWUFBWSxFQUFFO0FBQzNDLFFBQUksT0FBTyxPQUFPLFlBQVksR0FBRyxTQUFTLEVBQUcsS0FBSSxLQUFLLEVBQUU7QUFBQSxFQUMxRDtBQUNBLFNBQU8sTUFBTSxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDbkU7QUFFQSxJQUFNLGtDQUFrQyxDQUN0QyxVQUlHO0FBQ0gsUUFBTSxrQkFBNEIsQ0FBQztBQUNuQyxRQUFNLG9CQUE4QixDQUFDO0FBRXJDLFFBQU0sYUFBYSxDQUFDLEdBQUcsTUFBTSxLQUFLQyxPQUFNLFNBQVMsS0FBSyxDQUFDLEdBQUcsR0FBRyxNQUFNLEtBQUtBLE9BQU0sUUFBUSxLQUFLLENBQUMsQ0FBQztBQUU3RixhQUFXLGFBQWEsWUFBWTtBQUNsQyxRQUFJRixVQUFTLFNBQVMsS0FBTSxVQUFrQixTQUFTLDBCQUEwQjtBQUMvRSxZQUFNLGlCQUFrQixVQUFrQjtBQUMxQyxVQUFJLE9BQU8sbUJBQW1CLFlBQVksZUFBZSxTQUFTLEdBQUc7QUFDbkUsd0JBQWdCLEtBQUssY0FBYztBQUFBLE1BQ3JDO0FBQUEsSUFDRjtBQUVBLFFBQ0VBLFVBQVMsU0FBUyxLQUNqQixVQUFrQixTQUFTLGlCQUMzQixVQUFrQixRQUFRLGlCQUMzQixNQUFNLFFBQVMsVUFBa0IsSUFBSSxLQUNwQyxVQUFrQixLQUFLLE1BQU0sQ0FBQyxNQUFlLE9BQU8sTUFBTSxZQUFZLEVBQUUsU0FBUyxDQUFDLEdBQ25GO0FBQ0EsWUFBTSxNQUFPLFVBQWtCLEtBQUssS0FBSyxHQUFHO0FBQzVDLFVBQUksSUFBSSxTQUFTLEVBQUcsbUJBQWtCLEtBQUssR0FBRztBQUFBLElBQ2hEO0FBQUEsRUFDRjtBQUVBLFFBQU0sV0FBcUIsQ0FBQztBQUM1QixhQUFXLGFBQWEsWUFBWTtBQUNsQyxRQUFJLHFCQUFxQixPQUFPO0FBQzlCLGVBQVMsS0FBSyxVQUFVLE9BQU87QUFDL0I7QUFBQSxJQUNGO0FBQ0EsUUFBSSxPQUFPLGNBQWMsVUFBVTtBQUNqQyxlQUFTLEtBQUssU0FBUztBQUN2QjtBQUFBLElBQ0Y7QUFDQSxRQUFJQSxVQUFTLFNBQVMsS0FBSyxPQUFRLFVBQWtCLFlBQVksVUFBVTtBQUN6RSxlQUFTLEtBQUssT0FBUSxVQUFrQixPQUFPLENBQUM7QUFBQSxJQUNsRDtBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0YsYUFBUyxLQUFLRSxPQUFNLE9BQU8sT0FBTyxFQUFFLGtCQUFrQixLQUFLLENBQUMsQ0FBQztBQUFBLEVBQy9ELFFBQVE7QUFBQSxFQUVSO0FBRUEsUUFBTSxTQUFTLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsRUFBRSxLQUFLLElBQUk7QUFFN0QsTUFBSSxRQUFRO0FBQ1Ysb0JBQWdCLEtBQUssR0FBRyx1QkFBdUIsTUFBTSxDQUFDO0FBQ3RELHNCQUFrQixLQUFLLEdBQUcsdUJBQXVCLE1BQU0sQ0FBQztBQUFBLEVBQzFEO0FBRUEsU0FBTztBQUFBLElBQ0wsaUJBQWlCLE1BQU0sS0FBSyxJQUFJLElBQUksZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQUEsSUFDdkYsbUJBQW1CLE1BQU0sS0FBSyxJQUFJLElBQUksaUJBQWlCLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFBQSxFQUM3RjtBQUNGO0FBRUEsSUFBTSxxQkFBcUIsQ0FBQyxXQU1QO0FBQ25CLFFBQU0scUJBQXFCLE9BQU8sS0FBSyxPQUFPLGtCQUFrQixDQUFDLENBQUMsRUFDL0QsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLEtBQU0sT0FBTyxlQUF1QixDQUFDLE1BQU0sTUFBUyxFQUM3RSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFFcEMsUUFBTSxrQkFBa0IsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUMzRyxRQUFNLG9CQUFvQixNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8scUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBRS9HLFFBQU0sb0JBQ0osT0FBTyx5QkFBeUIsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxPQUFPLE1BQU0sUUFBUSxLQUFLLENBQUM7QUFFN0csUUFBTSxTQUFTLE1BQU0sS0FBSyxvQkFBSSxJQUFJLENBQUMsR0FBRyxtQkFBbUIsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVoSCxRQUFNLGFBQWEsTUFBTSxLQUFLLG9CQUFJLElBQUksQ0FBQyxHQUFHLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLENBQUMsRUFBRTtBQUFBLElBQUssQ0FBQyxHQUFHLE1BQzdGLEVBQUUsY0FBYyxDQUFDO0FBQUEsRUFDbkI7QUFFQSxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EseUJBQXlCLE9BQU87QUFBQSxJQUNoQyx5QkFBeUIsT0FBTztBQUFBLEVBQ2xDO0FBQ0Y7QUFFQSxJQUFNQywwQkFBeUIsQ0FBQyxPQUFnQixNQUFjLFNBQTRDO0FBQ3hHLFFBQU0sT0FBTywyQkFBMkIsS0FBSyxFQUFFO0FBQy9DLFNBQU87QUFBQSxJQUNMLE1BQU0sS0FBSztBQUFBLElBQ1gsU0FBUyxLQUFLO0FBQUEsSUFDZDtBQUFBLElBQ0EsTUFBTSxRQUFRLEtBQUs7QUFBQSxFQUNyQjtBQUNGO0FBRUEsSUFBTSwyQkFBMkIsTUFDL0IsT0FBTyxPQUFPLElBQUksTUFBTSxrQ0FBa0MsR0FBRztBQUFBLEVBQzNELE1BQU07QUFDUixDQUFDO0FBRUgsSUFBTSw0QkFBNEIsQ0FDaEMsT0FDQSxjQUVBQyxRQUFPLElBQUksYUFBYTtBQUN0QixRQUFNLGFBQWEsT0FBTyxjQUFjLFlBQVksT0FBTyxTQUFTLFNBQVMsS0FBSyxZQUFZO0FBQzlGLFFBQU0sUUFBUSxhQUFhLEtBQUssSUFBSSxJQUFJO0FBRXhDLFNBQU8sTUFBTTtBQUNYLFVBQU0sVUFBVSxPQUFPLE1BQU0sS0FBSyxLQUFLO0FBQ3ZDLFFBQUksT0FBTyxPQUFPLE9BQU8sR0FBRztBQUMxQixhQUFPLFFBQVE7QUFBQSxJQUNqQjtBQUVBLFFBQUksWUFBWTtBQUNkLFlBQU0sWUFBWSxLQUFLLElBQUksSUFBSTtBQUMvQixVQUFJLGFBQWEsV0FBVztBQUMxQixlQUFPLE1BQU0sY0FBYyxLQUFLO0FBQ2hDLGVBQU8sS0FBSyxLQUFLLHlCQUF5QixDQUFDO0FBQUEsTUFDN0M7QUFBQSxJQUNGO0FBR0EsV0FBT0EsUUFBTyxRQUFRLE1BQU0sSUFBSSxRQUFjLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFBQSxFQUN4RTtBQUNGLENBQUM7QUFFSSxJQUFNLGlCQUFpQixDQUM1QixNQUNBLFlBRUFBLFFBQU8sSUFBSSxhQUFhO0FBQ3RCLFFBQU0sV0FBVyxnQkFBZ0IsSUFBSTtBQUVyQyxRQUFNLFVBQVUsZUFBZTtBQUFBLElBQzdCLE9BQU8sU0FBUztBQUFBLElBQ2hCLFFBQVEsU0FBUyxVQUFVLEVBQUUsTUFBTSxZQUFZLEdBQUcsT0FBTyxtQkFBbUI7QUFBQSxJQUM1RSxXQUFXLFNBQVM7QUFBQSxFQUN0QixDQUFDO0FBRUQsUUFBTSxZQUFZLHNCQUFzQixPQUFPO0FBRS9DLFFBQU0sb0JBQStDO0FBQUEsSUFDbkQsVUFBVSxDQUFDLE9BQU87QUFDaEIsZ0JBQVUseUJBQXlCLEVBQUU7QUFBQSxJQUN2QztBQUFBLEVBQ0Y7QUFFQSxRQUFNLGFBQWEsWUFBWSxDQUFDLFVBQVUsU0FBaUMsQ0FBQztBQUM1RSxRQUFNLDJCQUEyQixTQUFTLG9CQUFvQjtBQUM5RCxRQUFNLG1CQUFtQixpQkFBaUIsd0JBQXdCO0FBQ2xFLFFBQU0sZ0JBQWdCLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDO0FBQzFFLFFBQU0saUJBQWlCLHVCQUF1QixTQUFTO0FBQ3ZELFFBQU0sZUFBZSxnQkFBZ0IsT0FBTztBQUU1QyxRQUFNLGlCQUFpQixTQUFTLFVBQVU7QUFDMUMsUUFBTSxnQkFBeUJDLE9BQU07QUFBQSxJQUNuQyxpQkFBaUIsU0FBUyxVQUFVO0FBQUEsSUFDcEMsUUFBUTtBQUFBLElBQ1IsZ0JBQWdCLFNBQVMsVUFBVTtBQUFBLEVBQ3JDLENBQUM7QUFFRCxRQUFNLGFBQWFDLE9BQU07QUFBQSxJQUN2QjtBQUFBLElBQ0EsU0FBUyxTQUFVQSxPQUFNO0FBQUEsSUFDekI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFFBQU0sU0FBUyxPQUFPO0FBQUEsSUFDcEIsQ0FBQyxTQUNTQyxNQUFLLE1BQU07QUFBQSxNQUNqQixPQUFPO0FBQUE7QUFBQSxJQUVULENBQVE7QUFBQSxJQUNWO0FBQUEsRUFDRjtBQUVBLFFBQU0sV0FBVyxPQUFPO0FBRXhCLFFBQU0sWUFBWSxPQUFPLFFBQVEsUUFBUSxTQUFTLE1BQWE7QUFDL0QsUUFBTSxXQUFXLE9BQU8sMEJBQTBCLFdBQVcsU0FBUyxpQkFBaUI7QUFFdkYsTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJO0FBRUosTUFBSSxLQUFLLFVBQVUsUUFBUSxHQUFHO0FBQzVCLFVBQU0sZ0JBQWdCLFNBQVM7QUFDL0IsaUJBQ0UsT0FBTyxlQUFlLGVBQWUsWUFBWSxjQUFjLFdBQVcsU0FBUyxJQUMvRSxjQUFjLGFBQ2Q7QUFDTixXQUFPLGNBQWMsVUFBVTtBQUUvQixRQUFJO0FBQ0YsZ0NBQW9DLDJCQUEyQixhQUFhO0FBQUEsSUFDOUUsUUFBUTtBQUNOLGdDQUEwQjtBQUFBLElBQzVCO0FBRUEsUUFBSSw2QkFBNkIsT0FBTztBQUN0QyxVQUFJO0FBQ0Ysa0NBQXdDLDJCQUEyQixhQUFhO0FBQUEsTUFDbEYsUUFBUTtBQUNOLGtDQUEwQjtBQUFBLE1BQzVCO0FBQUEsSUFDRjtBQUFBLEVBQ0YsT0FBTztBQUNMLFVBQU0sVUFBVUwsT0FBTSxjQUFjLFNBQVMsS0FBSztBQUNsRCxRQUFJLE9BQU8sT0FBTyxPQUFPLEdBQUc7QUFDMUIsWUFBTSxNQUFXLFFBQVE7QUFDekIsWUFBTSxvQkFBb0IsT0FBTyxLQUFLLGVBQWUsV0FBVyxJQUFJLGFBQWE7QUFDakYsVUFBSSxxQkFBcUIsa0JBQWtCLFNBQVMsR0FBRztBQUNyRCxlQUFPLGNBQWMsaUJBQWlCO0FBQUEsTUFDeEM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFFBQU0sWUFBWSxPQUFPRSxRQUFPO0FBQUEsSUFDOUIsT0FBTyxNQUFNO0FBQUEsTUFDWCxXQUNFLE9BQU8sU0FBUyxzQkFBc0IsWUFDdEMsT0FBTyxTQUFTLFFBQVEsaUJBQWlCLEtBQ3pDLFFBQVEsb0JBQW9CLElBQ3hCLFFBQVEsb0JBQ1I7QUFBQSxJQUNSLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxXQUFXLFVBQVUsc0JBQXNCO0FBQUEsSUFDL0MsV0FBVyxTQUFTLGFBQWE7QUFBQSxFQUNuQyxDQUFDO0FBRUQsUUFBTSxZQUFZLE1BQU07QUFDdEIsUUFBSTtBQUNGLGFBQU8sZ0JBQWdCLE1BQWE7QUFBQSxRQUNsQyxpQkFBaUI7QUFBQSxRQUNqQixTQUFTLEVBQUUsVUFBVSxJQUFRO0FBQUEsTUFDL0IsQ0FBQztBQUFBLElBQ0gsUUFBUTtBQUNOLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRixHQUFHO0FBRUgsUUFBTSxZQUFZLE1BQU07QUFDdEIsUUFBSTtBQUNGLGFBQU9JLGdCQUFlLElBQVc7QUFBQSxJQUNuQyxRQUFRO0FBQ04sYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGLEdBQUc7QUFFSCxNQUFJLEtBQUssS0FBSyxVQUFVLFFBQVEsS0FBSyxLQUFLLFVBQVUsU0FBUztBQUM3RCxNQUFJO0FBQ0osTUFBSTtBQUVKLFFBQU0sc0JBQXNCLEtBQUssVUFBVSxRQUFRLElBQy9DLGdDQUFnQyxTQUFTLEtBQTZCLElBQ3RFLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFO0FBRWpELFFBQU0sa0JBQWtCLG9CQUFvQjtBQUM1QyxRQUFNLG9CQUFvQixvQkFBb0I7QUFFOUMsUUFBTSxhQUFhLEtBQUssVUFBVSxTQUFTLElBQUksT0FBTyxlQUFlTixPQUFNLFVBQVUsVUFBVSxLQUFLLENBQUMsSUFBSTtBQUV6RyxNQUFJLENBQUMsS0FBSyxVQUFVLFFBQVEsR0FBRztBQUM3QixVQUFNLFVBQVUsT0FBTyxlQUFlQSxPQUFNLGNBQWMsU0FBUyxLQUFLLENBQUM7QUFDekUsVUFBTSxTQUFTLE9BQU8sZUFBZUEsT0FBTSxVQUFVLFNBQVMsS0FBSyxDQUFDO0FBQ3BFLFVBQU0sT0FBTyxXQUFXLFVBQVUsU0FBUztBQUUzQyxRQUFJLGdCQUFnQixTQUFTLEtBQUssa0JBQWtCLFNBQVMsR0FBRztBQUM5RCxXQUFLO0FBQ0wsY0FBUUM7QUFBQSxRQUNOO0FBQUEsUUFDQTtBQUFBLFFBQ0EsZ0JBQWdCLFNBQVMsSUFDckIsaUlBQ0E7QUFBQSxNQUNOO0FBQUEsSUFDRixXQUNFSCxVQUFTLElBQUksTUFDWCxLQUFhLFNBQVMsMEJBQTJCLEtBQWEsU0FBUyxvQkFDekU7QUFDQSxXQUFLO0FBQ0wsY0FBUUc7QUFBQSxRQUNOO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRixPQUFPO0FBQ0wsV0FBSztBQUNMLGNBQVFBLHdCQUF1QixNQUFNLGdCQUFnQjtBQUFBLElBQ3ZEO0FBQUEsRUFDRjtBQUVBLE1BQUksS0FBSyxVQUFVLFNBQVMsR0FBRztBQUM3QixVQUFNLE9BQU8sT0FBTyxlQUFlRCxPQUFNLFVBQVUsVUFBVSxLQUFLLENBQUM7QUFDbkUsVUFBTSxVQUFVLE9BQU8sZUFBZUEsT0FBTSxjQUFjLFVBQVUsS0FBSyxDQUFDO0FBQzFFLFVBQU0sT0FBTyxRQUFRLFdBQVcsVUFBVTtBQUUxQyxVQUFNLHFCQUFxQixNQUFNO0FBQy9CLFlBQU0sTUFBTUYsVUFBUyxJQUFJLElBQUssS0FBYSxPQUFPO0FBQ2xELFVBQUksUUFBUSxrQkFBa0I7QUFDNUIsZUFBT0c7QUFBQSxVQUNMO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUNBLGFBQU9BLHdCQUF1QixNQUFNLGdCQUFnQjtBQUFBLElBQ3RELEdBQUc7QUFFSCxTQUFLO0FBQ0wsUUFBSSxDQUFDLE9BQU87QUFFVixjQUFRO0FBQUEsSUFDVixPQUFPO0FBRUwsZ0JBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxrQkFBa0IsRUFBRTtBQUFBLElBQ3pEO0FBQUEsRUFDRjtBQUVBLFFBQU0sY0FBYyxtQkFBbUI7QUFBQSxJQUNyQztBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFFRCxRQUFNLFdBQ0osT0FBUSxTQUFTLFFBQWdCLE9BQU8sWUFBYSxTQUFTLE9BQWUsR0FBRyxTQUFTLElBQ3JGLE9BQVEsU0FBUyxPQUFlLEVBQUUsSUFDakMsVUFBVSxZQUFZO0FBRTdCLFFBQU0sWUFBWSx5QkFBeUI7QUFBQSxJQUN6QyxXQUFXLDZCQUE2QixTQUFTLE1BQWE7QUFBQSxJQUM5RCxLQUFLO0FBQUEsTUFDSDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFFRCxNQUFJLFNBQXlCO0FBQUEsSUFDM0IsT0FBTyxRQUFRO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxXQUFXLFNBQVMsU0FBUztBQUNuQyxNQUFJLE9BQU8sYUFBYSxZQUFZLE9BQU8sU0FBUyxRQUFRLEtBQUssV0FBVyxHQUFHO0FBQzdFLFVBQU0sZ0JBQWdCRixnQkFBZSxNQUFNO0FBQzNDLFFBQUksZ0JBQWdCLFVBQVU7QUFDNUIsZUFBUztBQUFBLFFBQ1AsT0FBTyxRQUFRO0FBQUEsUUFDZixJQUFJO0FBQUEsUUFDSjtBQUFBLFFBQ0EsT0FBTztBQUFBLFVBQ0wsU0FBUyw2Q0FBNkMsYUFBYSxNQUFNLFFBQVE7QUFBQSxVQUNqRixNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ1AsU0FBUztBQUFBLFlBQ1AsV0FBVztBQUFBLFlBQ1g7QUFBQSxZQUNBO0FBQUEsWUFDQSxTQUFTLENBQUMsWUFBWSxZQUFZLGFBQWEsVUFBVTtBQUFBLFVBQzNEO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVCxDQUFDOzs7QVE5Z0JILFNBQVMsVUFBQVEsU0FBYyxTQUFBQyxRQUFPLGFBQWE7QUErQjNDLElBQU1DLGVBQWMsTUFBYztBQUNoQyxNQUFJLE9BQU8sV0FBVyxlQUFlLE9BQU8sYUFBYSxZQUFhLFFBQU87QUFDN0UsU0FBTztBQUNUO0FBRU8sSUFBTSxXQUFXLENBQ3RCLFNBQ0EsWUFFQUMsUUFBTyxJQUFJLGFBQWE7QUFDdEIsUUFBTSxVQUFVLGVBQWU7QUFBQSxJQUM3QixPQUFPLFNBQVM7QUFBQSxJQUNoQixRQUFRLFNBQVMsVUFBVSxFQUFFLE1BQU1ELGFBQVksR0FBRyxPQUFPLFlBQVk7QUFBQSxJQUNyRSxXQUFXLFNBQVM7QUFBQSxFQUN0QixDQUFDO0FBRUQsUUFBTSxZQUFZLHNCQUFzQixPQUFPO0FBRS9DLFFBQU0sb0JBQStDO0FBQUEsSUFDbkQsVUFBVSxDQUFDLE9BQU87QUFDaEIsZ0JBQVUseUJBQXlCLEVBQUU7QUFBQSxJQUN2QztBQUFBLEVBQ0Y7QUFFQSxRQUFNLGFBQWEsWUFBWSxDQUFDLFVBQVUsU0FBaUMsQ0FBQztBQUM1RSxRQUFNLG1CQUFtQixpQkFBaUIsU0FBUyxvQkFBb0IsT0FBTztBQUM5RSxRQUFNLGdCQUFnQixpQ0FBaUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUMxRSxRQUFNLGlCQUFpQix1QkFBdUIsU0FBUztBQUN2RCxRQUFNLGVBQWUsZ0JBQWdCLE9BQU87QUFFNUMsUUFBTSxpQkFDSixTQUFTLG9DQUFvQyxPQUN4Q0UsT0FBTTtBQUFBLElBQ1M7QUFBQSxJQUNkLFFBQVE7QUFBQSxFQUNWLElBQ0NBLE9BQU07QUFFYixRQUFNLGFBQWFBLE9BQU07QUFBQSxJQUN2QixTQUFTLFNBQVVBLE9BQU07QUFBQSxJQUN6QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFFBQU0sUUFBUSxPQUFPLE1BQU0sS0FBSztBQUVoQyxRQUFNLE9BQU8sT0FBT0QsUUFBTyxLQUFLLE9BQU8sRUFBRSxLQUFLQSxRQUFPLGVBQWUsTUFBTSxPQUFPLEtBQUssR0FBR0EsUUFBTyxRQUFRLFVBQVUsQ0FBQztBQUVuSCxTQUFPLE1BQU0sTUFBTSxPQUFPLElBQUk7QUFFOUIsUUFBTSxXQUFXLFVBQVUsc0JBQXNCO0FBQUEsSUFDL0MsV0FBVyxTQUFTO0FBQUEsRUFDdEIsQ0FBQztBQUVELFNBQU8sRUFBRSxTQUFTLE1BQU0sU0FBUztBQUNuQyxDQUFDOyIsCiAgIm5hbWVzIjogWyJleHBvcnRTdGF0aWNJciIsICJpc1JlY29yZCIsICJpc01vZHVsZUltcGwiLCAicmVzb2x2ZU1vZHVsZUlkIiwgIm5leHQiLCAiZXhwb3J0U3RhdGljSXIiLCAiQ2F1c2UiLCAiRWZmZWN0IiwgIkxheWVyIiwgIkVmZmVjdCIsICJMYXllciIsICJsYXllciIsICJMYXllciIsICJMYXllciIsICJtYWtlIiwgIkxheWVyIiwgImlzUmVjb3JkIiwgInV0ZjhCeXRlTGVuZ3RoIiwgIkNhdXNlIiwgInRvRXJyb3JTdW1tYXJ5V2l0aENvZGUiLCAiRWZmZWN0IiwgImxheWVyIiwgIkxheWVyIiwgIm1ha2UiLCAiZXhwb3J0U3RhdGljSXIiLCAiRWZmZWN0IiwgIkxheWVyIiwgImRlZmF1bHRIb3N0IiwgIkVmZmVjdCIsICJMYXllciJdCn0K
988
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9zdGF0aWNJci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL21hbmlmZXN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL3JlZ2lzdHJ5LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW5Nb2R1bGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQnVpbGRFbnYudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQ29uc3RydWN0aW9uR3VhcmQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vUnVudGltZUhvc3QudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9SdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL21vZGVsLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL2RpZ2VzdC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L2FydGlmYWN0cy9jb2xsZWN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHsgZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvaXIuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRlVHJhaXRQcm9ncmFtIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvbW9kZWwuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciBhcyBleHBvcnRTdGF0ZVRyYWl0U3RhdGljSXIgfSBmcm9tICcuLi9zdGF0ZS10cmFpdC9pci5qcydcblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVNb2R1bGVUYWcgPSAoaW5wdXQ6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKGlzTW9kdWxlSW1wbChpbnB1dCkpIHJldHVybiBpbnB1dC5tb2R1bGVcbiAgaWYgKGlzUmVjb3JkKGlucHV0KSAmJiAoaW5wdXQgYXMgYW55KS50YWcpIHJldHVybiAoaW5wdXQgYXMgYW55KS50YWdcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgZXhwb3J0U3RhdGljSXIgPSAobW9kdWxlOiB1bmtub3duKTogU3RhdGljSXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB0YWcgPSByZXNvbHZlTW9kdWxlVGFnKG1vZHVsZSlcbiAgaWYgKCF0YWcpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBwcm9ncmFtID0gZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSh0YWcpIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4gfCB1bmRlZmluZWRcbiAgaWYgKCFwcm9ncmFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGV4cG9ydFN0YXRlVHJhaXRTdGF0aWNJcih7XG4gICAgcHJvZ3JhbSxcbiAgICBtb2R1bGVJZDogcmVzb2x2ZU1vZHVsZUlkKG1vZHVsZSksXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanMnXG5pbXBvcnQgKiBhcyBBY3Rpb24gZnJvbSAnLi4vYWN0aW9uLmpzJ1xuaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5LCBmbnYxYTMyIH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciB9IGZyb20gJy4vc3RhdGljSXIuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3RCdWRnZXRzIHtcbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0TWFuaWZlc3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgaW5jbHVkZVN0YXRpY0lyPzogYm9vbGVhblxuICByZWFkb25seSBidWRnZXRzPzogTWFuaWZlc3RCdWRnZXRzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQge1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICByZWFkb25seSBkZXJpdmVkPzogYm9vbGVhblxuICByZWFkb25seSBuYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RBY3Rpb24ge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBwYXlsb2FkOiB7XG4gICAgcmVhZG9ubHkga2luZDogJ3ZvaWQnIHwgJ25vblZvaWQnIHwgJ3Vua25vd24nXG4gIH1cbiAgcmVhZG9ubHkgcHJpbWFyeVJlZHVjZXI/OiB7XG4gICAgcmVhZG9ubHkga2luZDogJ2RlY2xhcmVkJyB8ICdyZWdpc3RlcmVkJ1xuICB9XG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RFZmZlY3Qge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBzb3VyY2VLZXk6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiAnZGVjbGFyZWQnIHwgJ3JlZ2lzdGVyZWQnXG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3Qge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc291cmNlPzoge1xuICAgIHJlYWRvbmx5IGZpbGU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGxpbmU6IG51bWJlclxuICAgIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyXG4gIH1cbiAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT5cbiAgcmVhZG9ubHkgc3RhdGljSXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBleHBvcnRTdGF0aWNJcj5cbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25LZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgdGFnID0gaXNNb2R1bGVJbXBsKGlucHV0KSA/IChpbnB1dC5tb2R1bGUgYXMgYW55KSA6IChpbnB1dCBhcyBhbnkpPy50YWdcbiAgY29uc3QgYWN0aW9uTWFwID0gdGFnPy5zaGFwZT8uYWN0aW9uTWFwXG4gIGlmICghaXNSZWNvcmQoYWN0aW9uTWFwKSkgcmV0dXJuIFtdXG4gIHJldHVybiBPYmplY3Qua2V5cyhhY3Rpb25NYXApLnNvcnQoKVxufVxuXG50eXBlIERldlNvdXJjZSA9IE1vZHVsZU1hbmlmZXN0Wydzb3VyY2UnXVxuXG5jb25zdCByZXNvbHZlRGV2U291cmNlID0gKGlucHV0OiB1bmtub3duKTogRGV2U291cmNlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgZmlsZSA9IChpbnB1dCBhcyBhbnkpLmZpbGVcbiAgY29uc3QgbGluZSA9IChpbnB1dCBhcyBhbnkpLmxpbmVcbiAgY29uc3QgY29sdW1uID0gKGlucHV0IGFzIGFueSkuY29sdW1uXG4gIGlmICh0eXBlb2YgZmlsZSAhPT0gJ3N0cmluZycgfHwgZmlsZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHR5cGVvZiBsaW5lICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAxKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB7IGZpbGUsIGxpbmUsIGNvbHVtbiB9XG59XG5cbmNvbnN0IHJlc29sdmVUb2tlblNvdXJjZSA9ICh0b2tlbjogdW5rbm93bik6IERldlNvdXJjZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghdG9rZW4gfHwgKHR5cGVvZiB0b2tlbiAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHRva2VuICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gcmVzb2x2ZURldlNvdXJjZSgodG9rZW4gYXMgYW55KS5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25zID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEFjdGlvbj4gPT4ge1xuICBjb25zdCB0YWcgPSBpc01vZHVsZUltcGwoaW5wdXQpID8gKGlucHV0Lm1vZHVsZSBhcyBhbnkpIDogKGlucHV0IGFzIGFueSk/LnRhZ1xuICBjb25zdCBhY3Rpb25NYXAgPSB0YWc/LnNoYXBlPy5hY3Rpb25NYXBcbiAgaWYgKCFpc1JlY29yZChhY3Rpb25NYXApKSByZXR1cm4gW11cblxuICBjb25zdCBtb2R1bGVTb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuICBjb25zdCByZWR1Y2VycyA9IGlzUmVjb3JkKHRhZz8ucmVkdWNlcnMpID8gKHRhZy5yZWR1Y2VycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiB1bmRlZmluZWRcblxuICBjb25zdCBhY3Rpb25UYWdzID0gT2JqZWN0LmtleXMoYWN0aW9uTWFwKS5zb3J0KClcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPiA9IFtdXG4gIGZvciAoY29uc3QgYWN0aW9uVGFnIG9mIGFjdGlvblRhZ3MpIHtcbiAgICBjb25zdCB0b2tlbiA9IGFjdGlvbk1hcFthY3Rpb25UYWddXG4gICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVRva2VuU291cmNlKHRva2VuKSA/PyBtb2R1bGVTb3VyY2VcbiAgICBjb25zdCBwYXlsb2FkS2luZCA9XG4gICAgICBBY3Rpb24uaXNBY3Rpb25Ub2tlbih0b2tlbikgJiYgU2NoZW1hLmlzU2NoZW1hKCh0b2tlbiBhcyBBY3Rpb24uQW55QWN0aW9uVG9rZW4pLnNjaGVtYSlcbiAgICAgICAgPyAodG9rZW4gYXMgQWN0aW9uLkFueUFjdGlvblRva2VuKS5zY2hlbWEgPT09IFNjaGVtYS5Wb2lkXG4gICAgICAgICAgPyAndm9pZCdcbiAgICAgICAgICA6ICdub25Wb2lkJ1xuICAgICAgICA6ICd1bmtub3duJ1xuXG4gICAgY29uc3QgcHJpbWFyeVJlZHVjZXIgPVxuICAgICAgcmVkdWNlcnMgJiYgdHlwZW9mIHJlZHVjZXJzW2FjdGlvblRhZ10gPT09ICdmdW5jdGlvbicgPyAoeyBraW5kOiAnZGVjbGFyZWQnIH0gYXMgY29uc3QpIDogdW5kZWZpbmVkXG5cbiAgICBvdXQucHVzaCh7XG4gICAgICBhY3Rpb25UYWcsXG4gICAgICBwYXlsb2FkOiB7IGtpbmQ6IHBheWxvYWRLaW5kIH0sXG4gICAgICAuLi4ocHJpbWFyeVJlZHVjZXIgPyB7IHByaW1hcnlSZWR1Y2VyIH0gOiB7fSksXG4gICAgICAuLi4oc291cmNlID8geyBzb3VyY2UgfSA6IHt9KSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBNT0RVTEVfREVDTEFSRURfRUZGRUNUUyA9IFN5bWJvbC5mb3IoJ2xvZ2l4Lm1vZHVsZS5lZmZlY3RzLmRlY2xhcmVkJylcblxuY29uc3QgcmVzb2x2ZUVmZmVjdHMgPSAoaW5wdXQ6IHVua25vd24pOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0RWZmZWN0PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHRhZyA9IGlzTW9kdWxlSW1wbChpbnB1dCkgPyAoaW5wdXQubW9kdWxlIGFzIGFueSkgOiAoaW5wdXQgYXMgYW55KT8udGFnXG4gIGNvbnN0IGFjdGlvbk1hcCA9IHRhZz8uc2hhcGU/LmFjdGlvbk1hcFxuICBpZiAoIWlzUmVjb3JkKGFjdGlvbk1hcCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBlZmZlY3RzUmF3ID0gKHRhZyBhcyBhbnkpPy5bTU9EVUxFX0RFQ0xBUkVEX0VGRkVDVFNdXG4gIGlmICghaXNSZWNvcmQoZWZmZWN0c1JhdykpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuXG4gIGNvbnN0IGxvZ2ljVW5pdElkID0gJ19fbG9naXhfaW50ZXJuYWw6ZWZmZWN0czpkZWNsYXJlZCdcbiAgY29uc3QgaGFuZGxlcklkcyA9IG5ldyBXZWFrTWFwPCguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBzdHJpbmc+KClcbiAgbGV0IG5leHRIYW5kbGVyU2VxID0gMFxuXG4gIGNvbnN0IG91dDogQXJyYXk8TW9kdWxlTWFuaWZlc3RFZmZlY3Q+ID0gW11cblxuICBmb3IgKGNvbnN0IGFjdGlvblRhZyBvZiBPYmplY3Qua2V5cyhlZmZlY3RzUmF3KS5zb3J0KCkpIHtcbiAgICBpZiAoIShhY3Rpb25UYWcgaW4gYWN0aW9uTWFwKSkgY29udGludWVcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKGVmZmVjdHNSYXcgYXMgYW55KVthY3Rpb25UYWddXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkgY29udGludWVcblxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nKSBjb250aW51ZVxuXG4gICAgICBsZXQgaGFuZGxlcklkID0gaGFuZGxlcklkcy5nZXQoaGFuZGxlcilcbiAgICAgIGlmICghaGFuZGxlcklkKSB7XG4gICAgICAgIG5leHRIYW5kbGVyU2VxICs9IDFcbiAgICAgICAgaGFuZGxlcklkID0gYGgke25leHRIYW5kbGVyU2VxfWBcbiAgICAgICAgaGFuZGxlcklkcy5zZXQoaGFuZGxlciwgaGFuZGxlcklkKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VLZXkgPSBgJHtsb2dpY1VuaXRJZH06OiR7aGFuZGxlcklkfWBcblxuICAgICAgb3V0LnB1c2goe1xuICAgICAgICBhY3Rpb25UYWcsXG4gICAgICAgIHNvdXJjZUtleSxcbiAgICAgICAga2luZDogJ2RlY2xhcmVkJyxcbiAgICAgICAgLi4uKHNvdXJjZSA/IHsgc291cmNlIH0gOiB7fSksXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuICBjb25zdCBkZWR1cGVkOiBBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD4gPSBbXVxuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb3V0KSB7XG4gICAgY29uc3Qga2V5ID0gYCR7aXRlbS5hY3Rpb25UYWd9XFx1MDAwMCR7aXRlbS5zb3VyY2VLZXl9YFxuICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKGtleSlcbiAgICBkZWR1cGVkLnB1c2goaXRlbSlcbiAgfVxuXG4gIGRlZHVwZWQuc29ydCgoYSwgYikgPT5cbiAgICBhLmFjdGlvblRhZyA8IGIuYWN0aW9uVGFnID8gLTEgOiBhLmFjdGlvblRhZyA+IGIuYWN0aW9uVGFnID8gMSA6IGEuc291cmNlS2V5LmxvY2FsZUNvbXBhcmUoYi5zb3VyY2VLZXkpLFxuICApXG4gIHJldHVybiBkZWR1cGVkLmxlbmd0aCA+IDAgPyBkZWR1cGVkIDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IHJlc29sdmVTY2hlbWFLZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2NoZW1hcyA9IChpbnB1dCBhcyBhbnkpLnNjaGVtYXNcbiAgaWYgKCFpc1JlY29yZChzY2hlbWFzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hcykuc29ydCgpXG59XG5cbmNvbnN0IHJlc29sdmVTb3VyY2UgPSAoaW5wdXQ6IHVua25vd24pOiBNb2R1bGVNYW5pZmVzdFsnc291cmNlJ10gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBkZXYgPSAoaW5wdXQgYXMgYW55KS5kZXZcbiAgcmV0dXJuIHJlc29sdmVEZXZTb3VyY2UoZGV2Py5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVNZXRhID0gKGlucHV0OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNSZWNvcmQoaW5wdXQpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG1ldGEgPSAoaW5wdXQgYXMgYW55KS5tZXRhXG4gIGlmICghaXNSZWNvcmQobWV0YSkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKS5zb3J0KCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGFba2V5XVxuICAgIGlmIChpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIG91dFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBNT0RVTEVfSU5URVJOQUwgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaW50ZXJuYWwnKVxuXG5jb25zdCByZXNvbHZlTG9naWNVbml0cyA9IChpbnB1dDogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgaW50ZXJuYWwgPSAoaW5wdXQgYXMgYW55KVtNT0RVTEVfSU5URVJOQUxdXG4gIGNvbnN0IG1vdW50ZWQgPSBpbnRlcm5hbD8ubW91bnRlZFxuICBpZiAoIUFycmF5LmlzQXJyYXkobW91bnRlZCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiA9IFtdXG4gIGZvciAoY29uc3QgdW5pdCBvZiBtb3VudGVkKSB7XG4gICAgaWYgKCFpc1JlY29yZCh1bml0KSkgY29udGludWVcbiAgICBjb25zdCBraW5kID0gdW5pdC5raW5kXG4gICAgY29uc3QgaWQgPSB1bml0LmlkXG4gICAgaWYgKHR5cGVvZiBraW5kICE9PSAnc3RyaW5nJyB8fCBraW5kLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICBjb25zdCBkZXJpdmVkID0gdW5pdC5kZXJpdmVkID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5pdC5uYW1lID09PSAnc3RyaW5nJyA/IHVuaXQubmFtZSA6IHVuZGVmaW5lZFxuICAgIG91dC5wdXNoKHsga2luZCwgaWQsIGRlcml2ZWQsIG5hbWUgfSlcbiAgfVxuXG4gIG91dC5zb3J0KChhLCBiKSA9PiAoYS5pZCA8IGIuaWQgPyAtMSA6IGEuaWQgPiBiLmlkID8gMSA6IGEua2luZC5sb2NhbGVDb21wYXJlKGIua2luZCkpKVxuICByZXR1cm4gb3V0Lmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWRcbn1cblxudHlwZSBEaWdlc3RCYXNlID0ge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc3RhdGljSXJEaWdlc3Q/OiBzdHJpbmdcbn1cblxuY29uc3QgZGlnZXN0T2YgPSAoYmFzZTogRGlnZXN0QmFzZSk6IHN0cmluZyA9PiBgbWFuaWZlc3Q6MDY3OiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoYmFzZSkpfWBcblxuY29uc3QgdXRmOEJ5dGVMZW5ndGggPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKS5sZW5ndGhcbiAgfVxuICByZXR1cm4ganNvbi5sZW5ndGhcbn1cblxuY29uc3QgYXBwbHlNYXhCeXRlcyA9IChtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QsIG1heEJ5dGVzOiBudW1iZXIpOiBNb2R1bGVNYW5pZmVzdCA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsQnl0ZXMgPSB1dGY4Qnl0ZUxlbmd0aChtYW5pZmVzdClcbiAgaWYgKG9yaWdpbmFsQnl0ZXMgPD0gbWF4Qnl0ZXMpIHJldHVybiBtYW5pZmVzdFxuXG4gIGNvbnN0IGRyb3BwZWQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBjb25zdCB0cnVuY2F0ZWRBcnJheXM6IEFycmF5PHN0cmluZz4gPSBbXVxuXG4gIGNvbnN0IGJhc2VNYXJrZXIgPSAoKTogSnNvblZhbHVlID0+ICh7XG4gICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgIG1heEJ5dGVzLFxuICAgIG9yaWdpbmFsQnl0ZXMsXG4gICAgZHJvcHBlZCxcbiAgICB0cnVuY2F0ZWRBcnJheXMsXG4gIH0pXG5cbiAgY29uc3Qgd2l0aE1hcmtlciA9IChuZXh0OiBNb2R1bGVNYW5pZmVzdCk6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0ge1xuICAgICAgX19sb2dpeDogYmFzZU1hcmtlcigpLFxuICAgIH1cbiAgICByZXR1cm4geyAuLi5uZXh0LCBtZXRhIH1cbiAgfVxuXG4gIGxldCBuZXh0OiBNb2R1bGVNYW5pZmVzdCA9IHdpdGhNYXJrZXIobWFuaWZlc3QpXG5cbiAgY29uc3QgbWFya1RydW5jYXRlZEFycmF5ID0gKG5hbWU6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICghdHJ1bmNhdGVkQXJyYXlzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICB0cnVuY2F0ZWRBcnJheXMucHVzaChuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRyb3BGaWVsZCA9IChmaWVsZDoga2V5b2YgTW9kdWxlTWFuaWZlc3QpOiB2b2lkID0+IHtcbiAgICBpZiAoKG5leHQgYXMgYW55KVtmaWVsZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZHJvcHBlZC5wdXNoKFN0cmluZyhmaWVsZCkpXG4gICAgICBuZXh0ID0gd2l0aE1hcmtlcih7IC4uLihuZXh0IGFzIGFueSksIFtmaWVsZF06IHVuZGVmaW5lZCB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIERldGVybWluaXN0aWMgdHJpbW1pbmcgb3JkZXIgKGxlYXN0IHZhbHVhYmxlIGZpcnN0KS5cbiAgZHJvcEZpZWxkKCdtZXRhJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc291cmNlJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc3RhdGljSXInKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgZHJvcEZpZWxkKCdsb2dpY1VuaXRzJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc2NoZW1hS2V5cycpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoJ2VmZmVjdHMnKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgLy8gTGFzdCByZXNvcnQ6IGRldGVybWluaXN0aWNhbGx5IHRydW5jYXRlIHRhaWwgaXRlbXMgKHN0YWJsZSBvcmRlcjogYWN0aW9uc1tdIHNvcnRlZCBieSBhY3Rpb25UYWcpLlxuICBjb25zdCB0cnVuY2F0ZUFjdGlvbnNUb0ZpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0b3RhbCA9IG5leHQuYWN0aW9ucy5sZW5ndGhcbiAgICBpZiAodG90YWwgPD0gMSkgcmV0dXJuXG5cbiAgICAvLyBGaW5kIHRoZSBsYXJnZXN0IHByZWZpeCB0aGF0IGZpdHMuXG4gICAgbGV0IGxvID0gMVxuICAgIGxldCBoaSA9IHRvdGFsXG4gICAgbGV0IGJlc3QgPSAxXG5cbiAgICB3aGlsZSAobG8gPD0gaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvICsgaGkpIC8gMilcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgbWlkKSxcbiAgICAgICAgYWN0aW9uS2V5czogbmV4dC5hY3Rpb25LZXlzLnNsaWNlKDAsIG1pZCksXG4gICAgICB9KVxuICAgICAgaWYgKHV0ZjhCeXRlTGVuZ3RoKGNhbmRpZGF0ZSkgPD0gbWF4Qnl0ZXMpIHtcbiAgICAgICAgYmVzdCA9IG1pZFxuICAgICAgICBsbyA9IG1pZCArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpID0gbWlkIC0gMVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiZXN0IDwgdG90YWwpIHtcbiAgICAgIG1hcmtUcnVuY2F0ZWRBcnJheSgnYWN0aW9ucycpXG4gICAgICBtYXJrVHJ1bmNhdGVkQXJyYXkoJ2FjdGlvbktleXMnKVxuICAgICAgbmV4dCA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgYmVzdCksXG4gICAgICAgIGFjdGlvbktleXM6IG5leHQuYWN0aW9uS2V5cy5zbGljZSgwLCBiZXN0KSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpID4gbWF4Qnl0ZXMpIHtcbiAgICBjb25zdCBiZWZvcmVMZW4gPSBuZXh0LmFjdGlvbnMubGVuZ3RoXG4gICAgdHJ1bmNhdGVBY3Rpb25zVG9GaXQoKVxuICAgIGlmIChuZXh0LmFjdGlvbnMubGVuZ3RoID09PSBiZWZvcmVMZW4pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RNYW5pZmVzdCA9IChtb2R1bGU6IHVua25vd24sIG9wdGlvbnM/OiBFeHRyYWN0TWFuaWZlc3RPcHRpb25zKTogTW9kdWxlTWFuaWZlc3QgPT4ge1xuICBjb25zdCBtYW5pZmVzdFZlcnNpb24gPSAnMDY3J1xuICBjb25zdCBtb2R1bGVJZCA9IHJlc29sdmVNb2R1bGVJZChtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbktleXMgPSByZXNvbHZlQWN0aW9uS2V5cyhtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbnMgPSByZXNvbHZlQWN0aW9ucyhtb2R1bGUpXG4gIGNvbnN0IGVmZmVjdHMgPSByZXNvbHZlRWZmZWN0cyhtb2R1bGUpXG5cbiAgY29uc3Qgc2NoZW1hS2V5cyA9IHJlc29sdmVTY2hlbWFLZXlzKG1vZHVsZSlcbiAgY29uc3QgbG9naWNVbml0cyA9IHJlc29sdmVMb2dpY1VuaXRzKG1vZHVsZSlcbiAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVNvdXJjZShtb2R1bGUpXG4gIGNvbnN0IG1ldGEgPSByZXNvbHZlTWV0YShtb2R1bGUpXG5cbiAgY29uc3Qgc3RhdGljSXIgPSBvcHRpb25zPy5pbmNsdWRlU3RhdGljSXIgPyBleHBvcnRTdGF0aWNJcihtb2R1bGUpIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZGlnZXN0QmFzZTogRGlnZXN0QmFzZSA9IHtcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kdWxlSWQsXG4gICAgYWN0aW9uS2V5cyxcbiAgICBhY3Rpb25zLFxuICAgIGVmZmVjdHMsXG4gICAgc2NoZW1hS2V5cyxcbiAgICBsb2dpY1VuaXRzLFxuICAgIHN0YXRpY0lyRGlnZXN0OiBzdGF0aWNJcj8uZGlnZXN0LFxuICB9XG5cbiAgY29uc3QgZGlnZXN0ID0gZGlnZXN0T2YoZGlnZXN0QmFzZSlcblxuICBjb25zdCBtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QgPSB7XG4gICAgbWFuaWZlc3RWZXJzaW9uLFxuICAgIG1vZHVsZUlkLFxuICAgIGFjdGlvbktleXMsXG4gICAgYWN0aW9ucyxcbiAgICBlZmZlY3RzLFxuICAgIHNjaGVtYUtleXMsXG4gICAgbG9naWNVbml0cyxcbiAgICBzb3VyY2UsXG4gICAgbWV0YSxcbiAgICBzdGF0aWNJcixcbiAgICBkaWdlc3QsXG4gIH1cblxuICBjb25zdCBtYXhCeXRlcyA9IG9wdGlvbnM/LmJ1ZGdldHM/Lm1heEJ5dGVzXG4gIGlmICh0eXBlb2YgbWF4Qnl0ZXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShtYXhCeXRlcykgJiYgbWF4Qnl0ZXMgPiAwKSB7XG4gICAgcmV0dXJuIGFwcGx5TWF4Qnl0ZXMobWFuaWZlc3QsIG1heEJ5dGVzKVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIgfSBmcm9tICcuL2V4cG9ydGVyLmpzJ1xuXG5jb25zdCBBUlRJRkFDVF9FWFBPUlRFUlMgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUudHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVycycpXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9ICh0YWc6IHVua25vd24sIGV4cG9ydGVyOiBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIpOiB2b2lkID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbTG9naXhdIHJlZ2lzdGVyVHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVyOiBpbnZhbGlkIG1vZHVsZSB0YWcnKVxuICB9XG5cbiAgY29uc3QgY3VycmVudCA9ICgodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA/PyBbXSkgYXMgdW5rbm93blxuICBjb25zdCBuZXh0ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IFsuLi5jdXJyZW50LCBleHBvcnRlcl0gOiBbZXhwb3J0ZXJdXG4gIDsodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA9IG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgPSAodGFnOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXI+ID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBjdXJyZW50ID0gKHRhZyBhcyBhbnkpW0FSVElGQUNUX0VYUE9SVEVSU10gYXMgdW5rbm93blxuICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudCkpIHJldHVybiBbXVxuICByZXR1cm4gY3VycmVudC5maWx0ZXIoKHgpOiB4IGlzIFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9PiB4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0Jylcbn1cbiIsICJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBFeGl0LCBGaWJlciwgTGF5ZXIsIE9wdGlvbiB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0ICogYXMgQnVpbGRFbnYgZnJvbSAnLi4vcGxhdGZvcm0vQnVpbGRFbnYuanMnXG5pbXBvcnQgdHlwZSB7IEV2aWRlbmNlUGFja2FnZSwgRXZpZGVuY2VQYWNrYWdlU291cmNlIH0gZnJvbSAnLi9ldmlkZW5jZS5qcydcbmltcG9ydCB7IG1ha2VFdmlkZW5jZUNvbGxlY3RvciwgZXZpZGVuY2VDb2xsZWN0b3JMYXllciB9IGZyb20gJy4vZXZpZGVuY2VDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBtYWtlUnVuU2Vzc2lvbiwgcnVuU2Vzc2lvbkxheWVyLCB0eXBlIFJ1bklkIH0gZnJvbSAnLi9ydW5TZXNzaW9uLmpzJ1xuaW1wb3J0IHtcbiAgYXBwZW5kU2lua3MsXG4gIGRpYWdub3N0aWNzTGV2ZWwsXG4gIHR5cGUgRGlhZ25vc3RpY3NMZXZlbCxcbiAgdHlwZSBTaW5rIGFzIERlYnVnU2luayxcbn0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qcydcbmltcG9ydCB0eXBlIHsgS2VybmVsSW1wbGVtZW50YXRpb25SZWYgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvS2VybmVsUmVmLmpzJ1xuaW1wb3J0ICogYXMgS2VybmVsUmVmIGZyb20gJy4uL3J1bnRpbWUvY29yZS9LZXJuZWxSZWYuanMnXG5pbXBvcnQgKiBhcyBSdW50aW1lS2VybmVsIGZyb20gJy4uL3J1bnRpbWUvY29yZS9SdW50aW1lS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0NvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgbWFrZVByb2dyYW1SdW5uZXJLZXJuZWwgfSBmcm9tICcuLi9ydW50aW1lL1Byb2dyYW1SdW5uZXIua2VybmVsLmpzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hbmlmZXN0LCB0eXBlIE1vZHVsZU1hbmlmZXN0IH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9tYW5pZmVzdC5qcydcbmltcG9ydCB7IGV4cG9ydFN0YXRpY0lyIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9zdGF0aWNJci5qcydcbmltcG9ydCAqIGFzIFJ1bnRpbWUgZnJvbSAnLi4vcnVudGltZS9SdW50aW1lLmpzJ1xuaW1wb3J0IHsgY29sbGVjdFRyaWFsUnVuQXJ0aWZhY3RzIH0gZnJvbSAnLi9hcnRpZmFjdHMvY29sbGVjdC5qcydcbmltcG9ydCB0eXBlIHsgVHJpYWxSdW5BcnRpZmFjdHMgfSBmcm9tICcuL2FydGlmYWN0cy9tb2RlbC5qcydcbmltcG9ydCB7IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgfSBmcm9tICcuL2FydGlmYWN0cy9yZWdpc3RyeS5qcydcblxudHlwZSBSb290TGlrZTxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPiA9IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PiB8IHsgcmVhZG9ubHkgaW1wbDogTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+IH1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1blJlcG9ydEJ1ZGdldHMge1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFsUnVuUmVwb3J0IHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZ1xuICByZWFkb25seSBvazogYm9vbGVhblxuICByZWFkb25seSBtYW5pZmVzdD86IE1vZHVsZU1hbmlmZXN0XG4gIHJlYWRvbmx5IHN0YXRpY0lyPzogUmV0dXJuVHlwZTx0eXBlb2YgZXhwb3J0U3RhdGljSXI+XG4gIHJlYWRvbmx5IGFydGlmYWN0cz86IFRyaWFsUnVuQXJ0aWZhY3RzXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogRW52aXJvbm1lbnRJclxuICByZWFkb25seSBldmlkZW5jZT86IEV2aWRlbmNlUGFja2FnZVxuICByZWFkb25seSBzdW1tYXJ5PzogdW5rbm93blxuICByZWFkb25seSBlcnJvcj86IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SXIge1xuICByZWFkb25seSB0YWdJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBjb25maWdLZXlzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ1NlcnZpY2VzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ0NvbmZpZ0tleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZj86IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZVxuICByZWFkb25seSBub3Rlcz86IHVua25vd25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bk1vZHVsZU9wdGlvbnMge1xuICByZWFkb25seSBydW5JZD86IFJ1bklkXG4gIHJlYWRvbmx5IHNvdXJjZT86IEV2aWRlbmNlUGFja2FnZVNvdXJjZVxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT5cbiAgcmVhZG9ubHkgYnVpbGRFbnY/OiB7XG4gICAgcmVhZG9ubHkgY29uZmlnPzogUmVjb3JkPHN0cmluZywgQnVpbGRFbnYuQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD5cbiAgICByZWFkb25seSBob3N0S2luZD86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1sncnVudGltZUhvc3RLaW5kJ11cbiAgICByZWFkb25seSBjb25maWdQcm92aWRlcj86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1snY29uZmlnUHJvdmlkZXInXVxuICB9XG4gIHJlYWRvbmx5IHRyaWFsUnVuVGltZW91dE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IGNsb3NlU2NvcGVUaW1lb3V0PzogbnVtYmVyXG4gIHJlYWRvbmx5IGJ1ZGdldHM/OiBUcmlhbFJ1blJlcG9ydEJ1ZGdldHNcbn1cblxuY29uc3QgZGVmYXVsdEhvc3QgPSAoKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnYnJvd3NlcidcbiAgcmV0dXJuICdub2RlJ1xufVxuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHJlc29sdmVSb290SW1wbCA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihyb290OiBSb290TGlrZTxTaD4pOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gPT5cbiAgKChyb290IGFzIGFueSk/Ll90YWcgPT09ICdNb2R1bGVJbXBsJ1xuICAgID8gKHJvb3QgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KVxuICAgIDogKChyb290IGFzIGFueSk/LmltcGwgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KSkgc2F0aXNmaWVzIE1vZHVsZUltcGw8YW55LCBTaCwgYW55PlxuXG5jb25zdCB1dGY4Qnl0ZUxlbmd0aCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGpzb24pLmxlbmd0aFxuICB9XG4gIHJldHVybiBqc29uLmxlbmd0aFxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdDb25maWdLZXlzID0gKG1lc3NhZ2U6IHN0cmluZyk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEVmZmVjdCBDb25maWcgZXJyb3IgbWVzc2FnZXMgdmFyeTsga2VlcCBwYXJzaW5nIGNvbnNlcnZhdGl2ZSBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgY29uc3QgcGF0dGVybnM6IFJlYWRvbmx5QXJyYXk8UmVnRXhwPiA9IFtcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBmb3IgKD86a2V5fHBhdGgpIFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBhdCAoW0EtWjAtOV8uLzotXSspXFxiL2csXG4gICAgL1xcYk1pc3NpbmcgY29uZmlndXJhdGlvbjo/IFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiQ29uZmlnXFxiLipcXGJtaXNzaW5nXFxiLipcIj8oW0EtWjAtOV8uLzotXSspXCI/L2dpLFxuICBdXG5cbiAgZm9yIChjb25zdCByZSBvZiBwYXR0ZXJucykge1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAgIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKG1lc3NhZ2UpKSkge1xuICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV1cbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMCkgb3V0LnB1c2goa2V5KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQob3V0KSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdTZXJ2aWNlSWRzID0gKG1lc3NhZ2U6IHN0cmluZyk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXVxuICBjb25zdCByZSA9IC9TZXJ2aWNlIG5vdCBmb3VuZDogKFteXFxzKF0rKS9nXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICB3aGlsZSAoKG1hdGNoID0gcmUuZXhlYyhtZXNzYWdlKSkpIHtcbiAgICBjb25zdCBpZCA9IG1hdGNoWzFdPy5yZXBsYWNlKC9bLDouO10rJC8sICcnKVxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCA+IDApIG91dC5wdXNoKGlkKVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQob3V0KSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdEZXBlbmRlbmN5RnJvbUNhdXNlID0gKFxuICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4pOiB7XG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlczogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IG1pc3NpbmdDb25maWdLZXlzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn0gPT4ge1xuICBjb25zdCBtaXNzaW5nU2VydmljZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgbWlzc2luZ0NvbmZpZ0tleXM6IHN0cmluZ1tdID0gW11cblxuICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLkFycmF5LmZyb20oQ2F1c2UuZmFpbHVyZXMoY2F1c2UpKSwgLi4uQXJyYXkuZnJvbShDYXVzZS5kZWZlY3RzKGNhdXNlKSldXG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChpc1JlY29yZChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUgYXMgYW55KS5fdGFnID09PSAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcicpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdTZXJ2aWNlID0gKGNhbmRpZGF0ZSBhcyBhbnkpLm1pc3NpbmdTZXJ2aWNlXG4gICAgICBpZiAodHlwZW9mIG1pc3NpbmdTZXJ2aWNlID09PSAnc3RyaW5nJyAmJiBtaXNzaW5nU2VydmljZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1pc3NpbmdTZXJ2aWNlcy5wdXNoKG1pc3NpbmdTZXJ2aWNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGlzUmVjb3JkKGNhbmRpZGF0ZSkgJiZcbiAgICAgIChjYW5kaWRhdGUgYXMgYW55KS5fdGFnID09PSAnQ29uZmlnRXJyb3InICYmXG4gICAgICAoY2FuZGlkYXRlIGFzIGFueSkuX29wID09PSAnTWlzc2luZ0RhdGEnICYmXG4gICAgICBBcnJheS5pc0FycmF5KChjYW5kaWRhdGUgYXMgYW55KS5wYXRoKSAmJlxuICAgICAgKGNhbmRpZGF0ZSBhcyBhbnkpLnBhdGguZXZlcnkoKGs6IHVua25vd24pID0+IHR5cGVvZiBrID09PSAnc3RyaW5nJyAmJiBrLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICBjb25zdCBrZXkgPSAoY2FuZGlkYXRlIGFzIGFueSkucGF0aC5qb2luKCcuJylcbiAgICAgIGlmIChrZXkubGVuZ3RoID4gMCkgbWlzc2luZ0NvbmZpZ0tleXMucHVzaChrZXkpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgbWVzc2FnZXMucHVzaChjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZXMucHVzaChjYW5kaWRhdGUpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoaXNSZWNvcmQoY2FuZGlkYXRlKSAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyBhbnkpLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlcy5wdXNoKFN0cmluZygoY2FuZGlkYXRlIGFzIGFueSkubWVzc2FnZSkpXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBtZXNzYWdlcy5wdXNoKENhdXNlLnByZXR0eShjYXVzZSwgeyByZW5kZXJFcnJvckNhdXNlOiB0cnVlIH0pKVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmVcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZCA9IG1lc3NhZ2VzLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKS5qb2luKCdcXG4nKVxuXG4gIGlmIChtZXJnZWQpIHtcbiAgICBtaXNzaW5nU2VydmljZXMucHVzaCguLi5wYXJzZU1pc3NpbmdTZXJ2aWNlSWRzKG1lcmdlZCkpXG4gICAgbWlzc2luZ0NvbmZpZ0tleXMucHVzaCguLi5wYXJzZU1pc3NpbmdDb25maWdLZXlzKG1lcmdlZCkpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1pc3NpbmdTZXJ2aWNlczogQXJyYXkuZnJvbShuZXcgU2V0KG1pc3NpbmdTZXJ2aWNlcykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgbWlzc2luZ0NvbmZpZ0tleXM6IEFycmF5LmZyb20obmV3IFNldChtaXNzaW5nQ29uZmlnS2V5cykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gIH1cbn1cblxuY29uc3QgYnVpbGRFbnZpcm9ubWVudElyID0gKHBhcmFtczoge1xuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZj86IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZVxuICByZWFkb25seSBidWlsZEVudkNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52LkJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+XG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlcz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBtaXNzaW5nQ29uZmlnS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufSk6IEVudmlyb25tZW50SXIgPT4ge1xuICBjb25zdCBwcm92aWRlZENvbmZpZ0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbXMuYnVpbGRFbnZDb25maWcgPz8ge30pXG4gICAgLmZpbHRlcigoaykgPT4gay5sZW5ndGggPiAwICYmIChwYXJhbXMuYnVpbGRFbnZDb25maWcgYXMgYW55KVtrXSAhPT0gdW5kZWZpbmVkKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG5cbiAgY29uc3QgbWlzc2luZ1NlcnZpY2VzID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhcmFtcy5taXNzaW5nU2VydmljZXMgPz8gW10pKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gIGNvbnN0IG1pc3NpbmdDb25maWdLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhcmFtcy5taXNzaW5nQ29uZmlnS2V5cyA/PyBbXSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBjb25zdCBydW50aW1lU2VydmljZUlkcyA9XG4gICAgcGFyYW1zLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPy5iaW5kaW5ncz8ubWFwKChiKSA9PiBiLnNlcnZpY2VJZCkuZmlsdGVyKChzKSA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycpID8/IFtdXG5cbiAgY29uc3QgdGFnSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5ydW50aW1lU2VydmljZUlkcywgLi4ubWlzc2luZ1NlcnZpY2VzXSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBjb25zdCBjb25maWdLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5wcm92aWRlZENvbmZpZ0tleXMsIC4uLm1pc3NpbmdDb25maWdLZXlzXSkpLnNvcnQoKGEsIGIpID0+XG4gICAgYS5sb2NhbGVDb21wYXJlKGIpLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICB0YWdJZHMsXG4gICAgY29uZmlnS2V5cyxcbiAgICBtaXNzaW5nU2VydmljZXMsXG4gICAgbWlzc2luZ0NvbmZpZ0tleXMsXG4gICAga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IHBhcmFtcy5rZXJuZWxJbXBsZW1lbnRhdGlvblJlZixcbiAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZTogcGFyYW1zLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLFxuICB9XG59XG5cbmNvbnN0IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUgPSAoY2F1c2U6IHVua25vd24sIGNvZGU6IHN0cmluZywgaGludD86IHN0cmluZyk6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSA9PiB7XG4gIGNvbnN0IGJhc2UgPSB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeShjYXVzZSkuZXJyb3JTdW1tYXJ5XG4gIHJldHVybiB7XG4gICAgbmFtZTogYmFzZS5uYW1lLFxuICAgIG1lc3NhZ2U6IGJhc2UubWVzc2FnZSxcbiAgICBjb2RlLFxuICAgIGhpbnQ6IGhpbnQgPz8gYmFzZS5oaW50LFxuICB9XG59XG5cbmNvbnN0IG1ha2VUcmlhbFJ1blRpbWVvdXRFcnJvciA9ICgpOiBFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignW0xvZ2l4XSB0cmlhbFJ1bk1vZHVsZSB0aW1lZCBvdXQnKSwge1xuICAgIG5hbWU6ICdUcmlhbFJ1blRpbWVvdXRFcnJvcicsXG4gIH0pXG5cbmNvbnN0IGF3YWl0RmliZXJFeGl0V2l0aFRpbWVvdXQgPSA8QSwgRT4oXG4gIGZpYmVyOiBGaWJlci5GaWJlcjxBLCBFPixcbiAgdGltZW91dE1zOiBudW1iZXIgfCB1bmRlZmluZWQsXG4pOiBFZmZlY3QuRWZmZWN0PEV4aXQuRXhpdDxBLCBFIHwgRXJyb3I+LCBuZXZlciwgbmV2ZXI+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBoYXNUaW1lb3V0ID0gdHlwZW9mIHRpbWVvdXRNcyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRNcykgJiYgdGltZW91dE1zID4gMFxuICAgIGNvbnN0IHN0YXJ0ID0gaGFzVGltZW91dCA/IERhdGUubm93KCkgOiAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgZXhpdE9wdCA9IHlpZWxkKiBGaWJlci5wb2xsKGZpYmVyKVxuICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZXhpdE9wdCkpIHtcbiAgICAgICAgcmV0dXJuIGV4aXRPcHQudmFsdWUgYXMgRXhpdC5FeGl0PEEsIEUgfCBFcnJvcj5cbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1RpbWVvdXQpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZE1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0XG4gICAgICAgIGlmIChlbGFwc2VkTXMgPj0gdGltZW91dE1zKSB7XG4gICAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdEZvcmsoZmliZXIpXG4gICAgICAgICAgcmV0dXJuIEV4aXQuZmFpbChtYWtlVHJpYWxSdW5UaW1lb3V0RXJyb3IoKSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOT1RFOiB0aW1lciB5aWVsZCAobm90IFRlc3RDbG9jay1iYXNlZClcbiAgICAgIHlpZWxkKiBFZmZlY3QucHJvbWlzZSgoKSA9PiBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4gc2V0VGltZW91dChyLCAxKSkpXG4gICAgfVxuICB9KVxuXG5leHBvcnQgY29uc3QgdHJpYWxSdW5Nb2R1bGUgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4oXG4gIHJvb3Q6IFJvb3RMaWtlPFNoPixcbiAgb3B0aW9ucz86IFRyaWFsUnVuTW9kdWxlT3B0aW9ucyxcbik6IEVmZmVjdC5FZmZlY3Q8VHJpYWxSdW5SZXBvcnQsIG5ldmVyLCBuZXZlcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJvb3RJbXBsID0gcmVzb2x2ZVJvb3RJbXBsKHJvb3QpXG5cbiAgICBjb25zdCBzZXNzaW9uID0gbWFrZVJ1blNlc3Npb24oe1xuICAgICAgcnVuSWQ6IG9wdGlvbnM/LnJ1bklkLFxuICAgICAgc291cmNlOiBvcHRpb25zPy5zb3VyY2UgPz8geyBob3N0OiBkZWZhdWx0SG9zdCgpLCBsYWJlbDogJ3RyaWFsLXJ1bi1tb2R1bGUnIH0sXG4gICAgICBzdGFydGVkQXQ6IG9wdGlvbnM/LnN0YXJ0ZWRBdCxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdG9yID0gbWFrZUV2aWRlbmNlQ29sbGVjdG9yKHNlc3Npb24pXG5cbiAgICBjb25zdCBjb252ZXJnZUNvbGxlY3RvcjogQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvciA9IHtcbiAgICAgIHJlZ2lzdGVyOiAoaXIpID0+IHtcbiAgICAgICAgY29sbGVjdG9yLnJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcihpcilcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3Qgc2lua3NMYXllciA9IGFwcGVuZFNpbmtzKFtjb2xsZWN0b3IuZGVidWdTaW5rIGFzIHVua25vd24gYXMgRGVidWdTaW5rXSlcbiAgICBjb25zdCByZXNvbHZlZERpYWdub3N0aWNzTGV2ZWwgPSBvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsID8/ICdsaWdodCdcbiAgICBjb25zdCBkaWFnbm9zdGljc0xheWVyID0gZGlhZ25vc3RpY3NMZXZlbChyZXNvbHZlZERpYWdub3N0aWNzTGV2ZWwpXG4gICAgY29uc3QgY29udmVyZ2VMYXllciA9IGFwcGVuZENvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3JzKFtjb252ZXJnZUNvbGxlY3Rvcl0pXG4gICAgY29uc3QgY29sbGVjdG9yTGF5ZXIgPSBldmlkZW5jZUNvbGxlY3RvckxheWVyKGNvbGxlY3RvcilcbiAgICBjb25zdCBzZXNzaW9uTGF5ZXIgPSBydW5TZXNzaW9uTGF5ZXIoc2Vzc2lvbilcblxuICAgIGNvbnN0IGJ1aWxkRW52Q29uZmlnID0gb3B0aW9ucz8uYnVpbGRFbnY/LmNvbmZpZ1xuICAgIGNvbnN0IGJ1aWxkRW52TGF5ZXIgPSBCdWlsZEVudi5sYXllcih7XG4gICAgICBydW50aW1lSG9zdEtpbmQ6IG9wdGlvbnM/LmJ1aWxkRW52Py5ob3N0S2luZCxcbiAgICAgIGNvbmZpZzogYnVpbGRFbnZDb25maWcsXG4gICAgICBjb25maWdQcm92aWRlcjogb3B0aW9ucz8uYnVpbGRFbnY/LmNvbmZpZ1Byb3ZpZGVyLFxuICAgIH0pXG5cbiAgICBjb25zdCB0cmlhbExheWVyID0gTGF5ZXIubWVyZ2VBbGwoXG4gICAgICBidWlsZEVudkxheWVyLFxuICAgICAgb3B0aW9ucz8ubGF5ZXIgPz8gKExheWVyLmVtcHR5IGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pLFxuICAgICAgc2Vzc2lvbkxheWVyLFxuICAgICAgY29sbGVjdG9yTGF5ZXIsXG4gICAgICBkaWFnbm9zdGljc0xheWVyLFxuICAgICAgc2lua3NMYXllcixcbiAgICAgIGNvbnZlcmdlTGF5ZXIsXG4gICAgKSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuICAgIGNvbnN0IGtlcm5lbCA9IHlpZWxkKiBtYWtlUHJvZ3JhbVJ1bm5lcktlcm5lbChcbiAgICAgIChpbXBsKSA9PlxuICAgICAgICBSdW50aW1lLm1ha2UoaW1wbCwge1xuICAgICAgICAgIGxheWVyOiB0cmlhbExheWVyIGFzIGFueSxcbiAgICAgICAgICAvLyB0cmlhbC1ydW4gZG9lcyBub3QgZW5hYmxlIGRldnRvb2xzIGJ5IGRlZmF1bHQ7IGRpYWdub3N0aWNzIGlzIGNvbnRyb2xsZWQgYnkgZGlhZ25vc3RpY3NMZXZlbC5cbiAgICAgICAgfSBhcyBhbnkpLFxuICAgICAgcm9vdEltcGwsXG4gICAgKVxuXG4gICAgY29uc3QgaWRlbnRpdHkgPSBrZXJuZWwuaWRlbnRpdHlcblxuICAgIGNvbnN0IGJvb3RGaWJlciA9IGtlcm5lbC5ydW50aW1lLnJ1bkZvcmsocm9vdEltcGwubW9kdWxlIGFzIGFueSlcbiAgICBjb25zdCBib290RXhpdCA9IHlpZWxkKiBhd2FpdEZpYmVyRXhpdFdpdGhUaW1lb3V0KGJvb3RGaWJlciwgb3B0aW9ucz8udHJpYWxSdW5UaW1lb3V0TXMpXG5cbiAgICBsZXQga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmIHwgdW5kZWZpbmVkXG4gICAgbGV0IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlIHwgdW5kZWZpbmVkXG4gICAgbGV0IGluc3RhbmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gICAgaWYgKEV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSkge1xuICAgICAgY29uc3QgbW9kdWxlUnVudGltZSA9IGJvb3RFeGl0LnZhbHVlIGFzIGFueVxuICAgICAgaW5zdGFuY2VJZCA9XG4gICAgICAgIHR5cGVvZiBtb2R1bGVSdW50aW1lPy5pbnN0YW5jZUlkID09PSAnc3RyaW5nJyAmJiBtb2R1bGVSdW50aW1lLmluc3RhbmNlSWQubGVuZ3RoID4gMFxuICAgICAgICAgID8gbW9kdWxlUnVudGltZS5pbnN0YW5jZUlkXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIGtlcm5lbC5zZXRJbnN0YW5jZUlkKGluc3RhbmNlSWQpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmID0gS2VybmVsUmVmLmdldEtlcm5lbEltcGxlbWVudGF0aW9uUmVmKG1vZHVsZVJ1bnRpbWUpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYgPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmVkRGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSA9IFJ1bnRpbWVLZXJuZWwuZ2V0UnVudGltZVNlcnZpY2VzRXZpZGVuY2UobW9kdWxlUnVudGltZSlcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmYWlsdXJlID0gQ2F1c2UuZmFpbHVyZU9wdGlvbihib290RXhpdC5jYXVzZSlcbiAgICAgIGlmIChPcHRpb24uaXNTb21lKGZhaWx1cmUpKSB7XG4gICAgICAgIGNvbnN0IGVycjogYW55ID0gZmFpbHVyZS52YWx1ZVxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkRnJvbUVyciA9IHR5cGVvZiBlcnI/Lmluc3RhbmNlSWQgPT09ICdzdHJpbmcnID8gZXJyLmluc3RhbmNlSWQgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKGluc3RhbmNlSWRGcm9tRXJyICYmIGluc3RhbmNlSWRGcm9tRXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBrZXJuZWwuc2V0SW5zdGFuY2VJZChpbnN0YW5jZUlkRnJvbUVycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNsb3NlRXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChcbiAgICAgIGtlcm5lbC5jbG9zZSh7XG4gICAgICAgIHRpbWVvdXRNczpcbiAgICAgICAgICB0eXBlb2Ygb3B0aW9ucz8uY2xvc2VTY29wZVRpbWVvdXQgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG9wdGlvbnMuY2xvc2VTY29wZVRpbWVvdXQpICYmXG4gICAgICAgICAgb3B0aW9ucy5jbG9zZVNjb3BlVGltZW91dCA+IDBcbiAgICAgICAgICAgID8gb3B0aW9ucy5jbG9zZVNjb3BlVGltZW91dFxuICAgICAgICAgICAgOiAxMDAwLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgZXZpZGVuY2UgPSBjb2xsZWN0b3IuZXhwb3J0RXZpZGVuY2VQYWNrYWdlKHtcbiAgICAgIG1heEV2ZW50czogb3B0aW9ucz8ubWF4RXZlbnRzID8/IDEwMDAsXG4gICAgfSlcblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBleHRyYWN0TWFuaWZlc3Qocm9vdCBhcyBhbnksIHtcbiAgICAgICAgICBpbmNsdWRlU3RhdGljSXI6IHRydWUsXG4gICAgICAgICAgYnVkZ2V0czogeyBtYXhCeXRlczogMjAwXzAwMCB9LFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KSgpXG5cbiAgICBjb25zdCBzdGF0aWNJciA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhwb3J0U3RhdGljSXIocm9vdCBhcyBhbnkpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0pKClcblxuICAgIGxldCBvayA9IEV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSAmJiBFeGl0LmlzU3VjY2VzcyhjbG9zZUV4aXQpXG4gICAgbGV0IGVycm9yOiBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfCB1bmRlZmluZWRcblxuICAgIGNvbnN0IGRlcHNGcm9tQm9vdEZhaWx1cmUgPSBFeGl0LmlzRmFpbHVyZShib290RXhpdClcbiAgICAgID8gcGFyc2VNaXNzaW5nRGVwZW5kZW5jeUZyb21DYXVzZShib290RXhpdC5jYXVzZSBhcyBDYXVzZS5DYXVzZTx1bmtub3duPilcbiAgICAgIDogeyBtaXNzaW5nU2VydmljZXM6IFtdLCBtaXNzaW5nQ29uZmlnS2V5czogW10gfVxuXG4gICAgY29uc3QgbWlzc2luZ1NlcnZpY2VzID0gZGVwc0Zyb21Cb290RmFpbHVyZS5taXNzaW5nU2VydmljZXNcbiAgICBjb25zdCBtaXNzaW5nQ29uZmlnS2V5cyA9IGRlcHNGcm9tQm9vdEZhaWx1cmUubWlzc2luZ0NvbmZpZ0tleXNcblxuICAgIGNvbnN0IGNsb3NlRXJyb3IgPSBFeGl0LmlzRmFpbHVyZShjbG9zZUV4aXQpID8gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmRpZU9wdGlvbihjbG9zZUV4aXQuY2F1c2UpKSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFFeGl0LmlzU3VjY2Vzcyhib290RXhpdCkpIHtcbiAgICAgIGNvbnN0IGZhaWx1cmUgPSBPcHRpb24uZ2V0T3JVbmRlZmluZWQoQ2F1c2UuZmFpbHVyZU9wdGlvbihib290RXhpdC5jYXVzZSkpXG4gICAgICBjb25zdCBkZWZlY3QgPSBPcHRpb24uZ2V0T3JVbmRlZmluZWQoQ2F1c2UuZGllT3B0aW9uKGJvb3RFeGl0LmNhdXNlKSlcbiAgICAgIGNvbnN0IGJhc2UgPSBmYWlsdXJlID8/IGRlZmVjdCA/PyBib290RXhpdC5jYXVzZVxuXG4gICAgICBpZiAobWlzc2luZ1NlcnZpY2VzLmxlbmd0aCA+IDAgfHwgbWlzc2luZ0NvbmZpZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgICBvayA9IGZhbHNlXG4gICAgICAgIGVycm9yID0gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICBiYXNlLFxuICAgICAgICAgICdNaXNzaW5nRGVwZW5kZW5jeScsXG4gICAgICAgICAgbWlzc2luZ1NlcnZpY2VzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gJ0J1aWxkLXRpbWUgbWlzc2luZyBzZXJ2aWNlOiBwcm92aWRlIGEgTGF5ZXIgbW9jay9pbXBsZW1lbnRhdGlvbiB2aWEgb3B0aW9ucy5sYXllciwgb3IgbW92ZSB0aGUgZGVwZW5kZW5jeSBhY2Nlc3MgdG8gcnVudGltZS4nXG4gICAgICAgICAgICA6ICdCdWlsZC10aW1lIG1pc3NpbmcgY29uZmlnOiBwcm92aWRlIHRoZSBtaXNzaW5nIGtleShzKSBpbiBidWlsZEVudi5jb25maWcsIG9yIGFkZCBhIGRlZmF1bHQgdmFsdWUgdG8gQ29uZmlnLicsXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGlzUmVjb3JkKGJhc2UpICYmXG4gICAgICAgICgoYmFzZSBhcyBhbnkpLm5hbWUgPT09ICdUcmlhbFJ1blRpbWVvdXRFcnJvcicgfHwgKGJhc2UgYXMgYW55KS5fdGFnID09PSAnVHJpYWxSdW5UaW1lb3V0JylcbiAgICAgICkge1xuICAgICAgICBvayA9IGZhbHNlXG4gICAgICAgIGVycm9yID0gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICBiYXNlLFxuICAgICAgICAgICdUcmlhbFJ1blRpbWVvdXQnLFxuICAgICAgICAgICdUcmlhbCBydW4gdGltZWQgb3V0OiBjaGVjayBmb3IgTGF5ZXIvYXNzZW1ibHkgcGhhc2UgYmxvY2tpbmcgKEVmZmVjdC5uZXZlciAvIHVuZmluaXNoZWQgYWNxdWlyZSkuJyxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2sgPSBmYWxzZVxuICAgICAgICBlcnJvciA9IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoYmFzZSwgJ1J1bnRpbWVGYWlsdXJlJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoRXhpdC5pc0ZhaWx1cmUoY2xvc2VFeGl0KSkge1xuICAgICAgY29uc3QgZGllZCA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5kaWVPcHRpb24oY2xvc2VFeGl0LmNhdXNlKSlcbiAgICAgIGNvbnN0IGZhaWx1cmUgPSBPcHRpb24uZ2V0T3JVbmRlZmluZWQoQ2F1c2UuZmFpbHVyZU9wdGlvbihjbG9zZUV4aXQuY2F1c2UpKVxuICAgICAgY29uc3QgYmFzZSA9IGRpZWQgPz8gZmFpbHVyZSA/PyBjbG9zZUV4aXQuY2F1c2VcblxuICAgICAgY29uc3QgdGFnID0gaXNSZWNvcmQoYmFzZSkgPyAoYmFzZSBhcyBhbnkpLl90YWcgOiB1bmRlZmluZWRcbiAgICAgIGlmICh0YWcgPT09ICdEaXNwb3NlVGltZW91dCcpIHtcbiAgICAgICAgb2sgPSBmYWxzZVxuICAgICAgICBlcnJvciA9IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoXG4gICAgICAgICAgYmFzZSxcbiAgICAgICAgICAnRGlzcG9zZVRpbWVvdXQnLFxuICAgICAgICAgICdEaXNwb3NlIHRpbWVkIG91dDogY2hlY2sgZm9yIHVuY2xvc2VkIHJlc291cmNlIGhhbmRsZXMsIGZpYmVycyBub3QgaW50ZXJydXB0ZWQsIG9yIGV2ZW50IGxpc3RlbmVycyBub3QgdW5yZWdpc3RlcmVkLicsXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKGJhc2UsICdSdW50aW1lRmFpbHVyZScpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBidWlsZEVudmlyb25tZW50SXIoe1xuICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYsXG4gICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSxcbiAgICAgIGJ1aWxkRW52Q29uZmlnLFxuICAgICAgbWlzc2luZ1NlcnZpY2VzLFxuICAgICAgbWlzc2luZ0NvbmZpZ0tleXMsXG4gICAgfSlcblxuICAgIGNvbnN0IG1vZHVsZUlkID1cbiAgICAgIHR5cGVvZiAocm9vdEltcGwubW9kdWxlIGFzIGFueSk/LmlkID09PSAnc3RyaW5nJyAmJiAocm9vdEltcGwubW9kdWxlIGFzIGFueSkuaWQubGVuZ3RoID4gMFxuICAgICAgICA/IFN0cmluZygocm9vdEltcGwubW9kdWxlIGFzIGFueSkuaWQpXG4gICAgICAgIDogKG1hbmlmZXN0Py5tb2R1bGVJZCA/PyAndW5rbm93bicpXG5cbiAgICBjb25zdCBhcnRpZmFjdHMgPSBjb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHMoe1xuICAgICAgZXhwb3J0ZXJzOiBnZXRUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXJzKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpLFxuICAgICAgY3R4OiB7XG4gICAgICAgIG1vZHVsZUlkLFxuICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgc3RhdGljSXI6IHN0YXRpY0lyIGFzIGFueSxcbiAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBsZXQgcmVwb3J0OiBUcmlhbFJ1blJlcG9ydCA9IHtcbiAgICAgIHJ1bklkOiBzZXNzaW9uLnJ1bklkLFxuICAgICAgb2ssXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHN0YXRpY0lyOiBzdGF0aWNJciBhcyBhbnksXG4gICAgICBhcnRpZmFjdHMsXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGV2aWRlbmNlLFxuICAgICAgZXJyb3IsXG4gICAgfVxuXG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBvcHRpb25zPy5idWRnZXRzPy5tYXhCeXRlc1xuICAgIGlmICh0eXBlb2YgbWF4Qnl0ZXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShtYXhCeXRlcykgJiYgbWF4Qnl0ZXMgPiAwKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEJ5dGVzID0gdXRmOEJ5dGVMZW5ndGgocmVwb3J0KVxuICAgICAgaWYgKG9yaWdpbmFsQnl0ZXMgPiBtYXhCeXRlcykge1xuICAgICAgICByZXBvcnQgPSB7XG4gICAgICAgICAgcnVuSWQ6IHNlc3Npb24ucnVuSWQsXG4gICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgW0xvZ2l4XSBUcmlhbFJ1blJlcG9ydCBleGNlZWRlZCBtYXhCeXRlcyAoJHtvcmlnaW5hbEJ5dGVzfSA+ICR7bWF4Qnl0ZXN9KWAsXG4gICAgICAgICAgICBjb2RlOiAnT3ZlcnNpemVkJyxcbiAgICAgICAgICAgIGhpbnQ6ICdSZWR1Y2UgbWF4RXZlbnRzIG9yIGJ1ZGdldHMubWF4Qnl0ZXMsIG9yIHNwbGl0IG1hbmlmZXN0L2V2aWRlbmNlIGFydGlmYWN0cyBpbiBDSS4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgX19sb2dpeDoge1xuICAgICAgICAgICAgICB0cnVuY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIG1heEJ5dGVzLFxuICAgICAgICAgICAgICBvcmlnaW5hbEJ5dGVzLFxuICAgICAgICAgICAgICBkcm9wcGVkOiBbJ21hbmlmZXN0JywgJ3N0YXRpY0lyJywgJ2FydGlmYWN0cycsICdldmlkZW5jZSddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcG9ydFxuICB9KVxuIiwgImltcG9ydCB7IENvbmZpZ1Byb3ZpZGVyLCBFZmZlY3QsIExheWVyIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0ICogYXMgQ29uc3RydWN0aW9uR3VhcmQgZnJvbSAnLi9Db25zdHJ1Y3Rpb25HdWFyZC5qcydcbmltcG9ydCB7XG4gIFJ1bnRpbWVIb3N0LFxuICB0eXBlIFJ1bnRpbWVIb3N0S2luZCxcbiAgdHlwZSBSdW50aW1lSG9zdFNlcnZpY2UsXG4gIGRlZmF1bHRMYXllciBhcyBkZWZhdWx0UnVudGltZUhvc3RMYXllcixcbiAgbWFrZSBhcyBtYWtlUnVudGltZUhvc3QsXG4gIGxheWVyIGFzIHJ1bnRpbWVIb3N0TGF5ZXIsXG59IGZyb20gJy4vUnVudGltZUhvc3QuanMnXG5cbmV4cG9ydCB0eXBlIEJ1aWxkRW52Q29uZmlnVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRFbnZPcHRpb25zIHtcbiAgcmVhZG9ubHkgcnVudGltZUhvc3Q/OiBSdW50aW1lSG9zdFNlcnZpY2VcbiAgcmVhZG9ubHkgcnVudGltZUhvc3RLaW5kPzogUnVudGltZUhvc3RLaW5kXG4gIC8qKlxuICAgKiBGbGF0IGtleS92YWx1ZSBjb25maWcgZm9yIG1vY2tpbmcgZmVhdHVyZSBmbGFncyAvIGVudiB2YXJpYWJsZXMgKHZhbHVlcyBhcmUgY29lcmNlZCB0byBzdHJpbmcpLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnPzogUmVjb3JkPHN0cmluZywgQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD5cbiAgLyoqXG4gICAqIEFkdmFuY2VkOiBpbmplY3QgYSBDb25maWdQcm92aWRlciBkaXJlY3RseSAoaGlnaGVyIHByaW9yaXR5IHRoYW4gY29uZmlnKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ1Byb3ZpZGVyPzogQ29uZmlnUHJvdmlkZXIuQ29uZmlnUHJvdmlkZXJcbn1cblxuY29uc3QgdG9Db25maWdQcm92aWRlckZyb21SZWNvcmQgPSAoXG4gIHJlY29yZDogUmVjb3JkPHN0cmluZywgQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQsXG4pOiBDb25maWdQcm92aWRlci5Db25maWdQcm92aWRlciA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkID8/IHt9KSkge1xuICAgIGlmICghaykgY29udGludWVcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgIG1hcC5zZXQoaywgU3RyaW5nKHYpKVxuICB9XG4gIHJldHVybiBDb25maWdQcm92aWRlci5mcm9tTWFwKG1hcClcbn1cblxuZXhwb3J0IGNvbnN0IGxheWVyID0gKG9wdGlvbnM6IEJ1aWxkRW52T3B0aW9ucyA9IHt9KTogTGF5ZXIuTGF5ZXI8UnVudGltZUhvc3QsIG5ldmVyLCBuZXZlcj4gPT4ge1xuICBjb25zdCBydW50aW1lSG9zdCA9IG9wdGlvbnMucnVudGltZUhvc3RcbiAgICA/IHJ1bnRpbWVIb3N0TGF5ZXIob3B0aW9ucy5ydW50aW1lSG9zdClcbiAgICA6IG9wdGlvbnMucnVudGltZUhvc3RLaW5kXG4gICAgICA/IHJ1bnRpbWVIb3N0TGF5ZXIobWFrZVJ1bnRpbWVIb3N0KG9wdGlvbnMucnVudGltZUhvc3RLaW5kKSlcbiAgICAgIDogZGVmYXVsdFJ1bnRpbWVIb3N0TGF5ZXJcblxuICBjb25zdCBjb25maWdQcm92aWRlciA9IG9wdGlvbnMuY29uZmlnUHJvdmlkZXIgPyBvcHRpb25zLmNvbmZpZ1Byb3ZpZGVyIDogdG9Db25maWdQcm92aWRlckZyb21SZWNvcmQob3B0aW9ucy5jb25maWcpXG5cbiAgY29uc3QgY29uZmlnID0gTGF5ZXIuc2V0Q29uZmlnUHJvdmlkZXIoY29uZmlnUHJvdmlkZXIpXG5cbiAgcmV0dXJuIExheWVyLm1lcmdlQWxsKHJ1bnRpbWVIb3N0LCBjb25maWcpIGFzIExheWVyLkxheWVyPFJ1bnRpbWVIb3N0LCBuZXZlciwgbmV2ZXI+XG59XG5cbmV4cG9ydCBjb25zdCBydW4gPSA8QSwgRT4oXG4gIGJ1aWxkZXI6IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUnVudGltZUhvc3Q+LFxuICBvcHRpb25zOiBCdWlsZEVudk9wdGlvbnMgPSB7fSxcbik6IEVmZmVjdC5FZmZlY3Q8QSwgRSB8IENvbnN0cnVjdGlvbkd1YXJkLkNvbnN0cnVjdGlvbkd1YXJkRXJyb3IsIG5ldmVyPiA9PlxuICBidWlsZGVyLnBpcGUoRWZmZWN0LnByb3ZpZGUobGF5ZXIob3B0aW9ucykpLCBDb25zdHJ1Y3Rpb25HdWFyZC5ndWFyZEJ1aWxkVGltZSlcbiIsICJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0IH0gZnJvbSAnZWZmZWN0J1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWc6ICdDb25zdHJ1Y3Rpb25HdWFyZEVycm9yJ1xuICByZWFkb25seSBraW5kOiAnbWlzc2luZ19zZXJ2aWNlJyB8ICd1bmtub3duX2RlZmVjdCdcbiAgcmVhZG9ubHkgbWlzc2luZ1NlcnZpY2U/OiBzdHJpbmdcbiAgcmVhZG9ubHkgaGludD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgbWFrZUNvbnN0cnVjdGlvbkd1YXJkRXJyb3IgPSAob3B0aW9uczoge1xuICByZWFkb25seSBraW5kOiBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yWydraW5kJ11cbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nXG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbn0pOiBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yID0+XG4gIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKG9wdGlvbnMubWVzc2FnZSksIHtcbiAgICBfdGFnOiAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcicsXG4gICAga2luZDogb3B0aW9ucy5raW5kLFxuICAgIG1pc3NpbmdTZXJ2aWNlOiBvcHRpb25zLm1pc3NpbmdTZXJ2aWNlLFxuICAgIGhpbnQ6IG9wdGlvbnMuaGludCxcbiAgfSkgYXMgQ29uc3RydWN0aW9uR3VhcmRFcnJvclxuXG5jb25zdCBleHRyYWN0TWlzc2luZ1NlcnZpY2UgPSAoY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+KTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi5BcnJheS5mcm9tKENhdXNlLmRlZmVjdHMoY2F1c2UpKSwgLi4uQXJyYXkuZnJvbShDYXVzZS5mYWlsdXJlcyhjYXVzZSkpXVxuXG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yID8gY2FuZGlkYXRlLm1lc3NhZ2UgOiB0eXBlb2YgY2FuZGlkYXRlID09PSAnc3RyaW5nJyA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFtZXNzYWdlKSBjb250aW51ZVxuXG4gICAgY29uc3QgbWF0Y2ggPSAvU2VydmljZSBub3QgZm91bmQ6IChbXlxccyhdKykvLmV4ZWMobWVzc2FnZSlcbiAgICBpZiAobWF0Y2g/LlsxXSkgcmV0dXJuIG1hdGNoWzFdXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogZ3VhcmRCdWlsZFRpbWVcdUZGMUFcbiAqIC0gRHVyaW5nIEJ1aWxkIEVudi9SZWZsZWN0aW9uLCBjYXRjaCBcIm1pc3Npbmcgc2VydmljZVwiIGRlZmVjdHMgYW5kIGNvbnZlcnQgdGhlbSBpbnRvIGFjdGlvbmFibGUgZXJyb3JzLlxuICogLSBQcmVzZXJ2ZSBvdGhlciBmYWlsdXJlcy9kZWZlY3RzIGFzLWlzIChkbyBub3Qgc3dhbGxvdyBidXNpbmVzcyBlcnJvciBzZW1hbnRpY3MpLlxuICovXG5leHBvcnQgY29uc3QgZ3VhcmRCdWlsZFRpbWUgPSA8QSwgRSwgUj4oXG4gIHNlbGY6IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUj4sXG4pOiBFZmZlY3QuRWZmZWN0PEEsIEUgfCBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yLCBSPiA9PlxuICBzZWxmLnBpcGUoXG4gICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKTogRWZmZWN0LkVmZmVjdDxuZXZlciwgQ29uc3RydWN0aW9uR3VhcmRFcnJvciB8IEUsIG5ldmVyPiA9PiB7XG4gICAgICBjb25zdCBtaXNzaW5nID0gZXh0cmFjdE1pc3NpbmdTZXJ2aWNlKGNhdXNlKVxuICAgICAgaWYgKG1pc3NpbmcpIHtcbiAgICAgICAgcmV0dXJuIEVmZmVjdC5mYWlsKFxuICAgICAgICAgIG1ha2VDb25zdHJ1Y3Rpb25HdWFyZEVycm9yKHtcbiAgICAgICAgICAgIGtpbmQ6ICdtaXNzaW5nX3NlcnZpY2UnLFxuICAgICAgICAgICAgbWlzc2luZ1NlcnZpY2U6IG1pc3NpbmcsXG4gICAgICAgICAgICBtZXNzYWdlOiBgW0NvbnN0cnVjdGlvbkd1YXJkRXJyb3JdIEJ1aWxkLXRpbWUgZGVwZW5kZW5jeSB2aW9sYXRpb246IHNlcnZpY2UgXCIke21pc3Npbmd9XCIgaXMgbm90IGF2YWlsYWJsZSBpbiBCdWlsZCBFbnYuYCxcbiAgICAgICAgICAgIGhpbnQ6XG4gICAgICAgICAgICAgICdCdWlsZC10aW1lIChSZWZsZWN0aW9uKSBjYW4gb25seSBkZXBlbmQgb24gYSBzbWFsbCBzZXQgb2YgbW9ja2FibGUgcHJpbWl0aXZlcyAoZS5nLiBDb25maWcvUnVudGltZUhvc3QpLiAnICtcbiAgICAgICAgICAgICAgJ01vdmUgYnVzaW5lc3Mgc2VydmljZSBhY2Nlc3MgdG8gcnVudGltZSAoZS5nLiBUcmFpdCBoYW5kbGVyIC8gTG9naWMgcnVuIHNlY3Rpb24pIG9yIGlzb2xhdGUgaXQgdmlhIGV4cGxpY2l0IGluamVjdGlvbi4nLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gRWZmZWN0LmZhaWxDYXVzZShjYXVzZSkgYXMgRWZmZWN0LkVmZmVjdDxuZXZlciwgQ29uc3RydWN0aW9uR3VhcmRFcnJvciB8IEU+XG4gICAgfSksXG4gIClcbiIsICJpbXBvcnQgeyBDb250ZXh0LCBMYXllciB9IGZyb20gJ2VmZmVjdCdcblxuZXhwb3J0IHR5cGUgUnVudGltZUhvc3RLaW5kID0gJ25vZGUnIHwgJ2Jyb3dzZXInIHwgJ3Vua25vd24nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZUhvc3RTZXJ2aWNlIHtcbiAgcmVhZG9ubHkga2luZDogUnVudGltZUhvc3RLaW5kXG4gIHJlYWRvbmx5IGlzTm9kZTogYm9vbGVhblxuICByZWFkb25seSBpc0Jyb3dzZXI6IGJvb2xlYW5cbn1cblxuY29uc3QgZGV0ZWN0S2luZCA9ICgpOiBSdW50aW1lSG9zdEtpbmQgPT4ge1xuICBjb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG5cbiAgaWYgKGlzQnJvd3NlcikgcmV0dXJuICdicm93c2VyJ1xuXG4gIGNvbnN0IGlzTm9kZSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgKHByb2Nlc3MgYXMgYW55KT8udmVyc2lvbnM/Lm5vZGUgPT09ICdzdHJpbmcnXG5cbiAgaWYgKGlzTm9kZSkgcmV0dXJuICdub2RlJ1xuXG4gIHJldHVybiAndW5rbm93bidcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2UgPSAoa2luZDogUnVudGltZUhvc3RLaW5kKTogUnVudGltZUhvc3RTZXJ2aWNlID0+ICh7XG4gIGtpbmQsXG4gIGlzTm9kZToga2luZCA9PT0gJ25vZGUnLFxuICBpc0Jyb3dzZXI6IGtpbmQgPT09ICdicm93c2VyJyxcbn0pXG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lSG9zdCBleHRlbmRzIENvbnRleHQuVGFnKCdAbG9naXgvUnVudGltZUhvc3QnKTxSdW50aW1lSG9zdCwgUnVudGltZUhvc3RTZXJ2aWNlPigpIHt9XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChzZXJ2aWNlOiBSdW50aW1lSG9zdFNlcnZpY2UpOiBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKFJ1bnRpbWVIb3N0LCBzZXJ2aWNlKVxuXG5leHBvcnQgY29uc3QgbW9jayA9IChraW5kOiBSdW50aW1lSG9zdEtpbmQpOiBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPiA9PiBsYXllcihtYWtlKGtpbmQpKVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdExheWVyOiBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPiA9IGxheWVyKG1ha2UoZGV0ZWN0S2luZCgpKSlcbiIsICJpbXBvcnQgeyBFZmZlY3QsIExheWVyLCBNYW5hZ2VkUnVudGltZSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0ICogYXMgQXBwUnVudGltZUltcGwgZnJvbSAnLi9BcHBSdW50aW1lLmpzJ1xuXG4vKipcbiAqIFJ1bnRpbWUgb3B0aW9uczpcbiAqIC0gbGF5ZXI6IGV4dHJhIHRvcC1sZXZlbCBFbnYgKGUuZy4gQ29uZmlnIC8gcGxhdGZvcm0gc2VydmljZXMpIG1lcmdlZCB3aXRoIFJvb3QgTW9kdWxlSW1wbC5sYXllci5cbiAqIC0gb25FcnJvcjogYXBwLWxldmVsIGVycm9yIGhhbmRsZXIgZW50cnlwb2ludCB1c2VkIHRvIHJlcG9ydCB1bmNhdWdodCBlcnJvcnMgYXQgdGhlIFJ1bnRpbWUgbGV2ZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZU9wdGlvbnMge1xuICByZWFkb25seSBsYXllcj86IExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPlxuICByZWFkb25seSBvbkVycm9yPzogKGNhdXNlOiBpbXBvcnQoJ2VmZmVjdCcpLkNhdXNlLkNhdXNlPHVua25vd24+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG59XG5cbi8qKlxuICogUnVudGltZS5tYWtlXG4gKlxuICogQnVpbGQgYW4gYXBwbGljYXRpb24tbGV2ZWwgUnVudGltZSBnaXZlbiBhIHJvb3QgTW9kdWxlSW1wbDpcbiAqXG4gKiAtIFVzZSBSb290SW1wbC5tb2R1bGUgKyBSb290SW1wbC5sYXllciBhcyB0aGUgc2luZ2xlIGdsb2JhbCBtb2R1bGUuXG4gKiAtIEZvcmsgUm9vdEltcGwucHJvY2Vzc2VzIGFzIGxvbmctbGl2ZWQgcHJvY2Vzc2VzIHdpdGhpbiB0aGUgUnVudGltZSBzY29wZS5cbiAqIC0gUmV1c2UgdGhlIGV4aXN0aW5nIEFwcFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gYXMgdGhlIHVuZGVybHlpbmcgY29udGFpbmVyIGFuZCBleHBvc2Ugb25seSBNYW5hZ2VkUnVudGltZS5cbiAqXG4gKiBOb3RlczpcbiAqIC0gVXNlcyBicm9hZCBhbnkvbmV2ZXIgYXQgdGhlIHR5cGUgbGV2ZWwgdG8gYXZvaWQgY29tcGxleCBFbnYgaW5mZXJlbmNlIGhlcmUuXG4gKiAtIEJ1c2luZXNzIGNvZGUgb25seSBuZWVkcyB0byBlbnN1cmUgUm9vdEltcGwubGF5ZXIgYW5kIG9wdGlvbnMubGF5ZXIgdG9nZXRoZXIgY2FuIHByb3ZpZGUgdGhlIGZ1bGwgRW52LlxuICovXG5leHBvcnQgY29uc3QgbWFrZSA9IChcbiAgcm9vdEltcGw6IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PixcbiAgb3B0aW9ucz86IFJ1bnRpbWVPcHRpb25zLFxuKTogTWFuYWdlZFJ1bnRpbWUuTWFuYWdlZFJ1bnRpbWU8YW55LCBuZXZlcj4gPT4ge1xuICBjb25zdCBhcHBDb25maWc6IEFwcFJ1bnRpbWVJbXBsLkxvZ2l4QXBwQ29uZmlnPGFueT4gPSB7XG4gICAgbGF5ZXI6IChvcHRpb25zPy5sYXllciA/PyBMYXllci5lbXB0eSkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+LFxuICAgIG1vZHVsZXM6IFtBcHBSdW50aW1lSW1wbC5wcm92aWRlKHJvb3RJbXBsLm1vZHVsZSwgcm9vdEltcGwubGF5ZXIgYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pXSxcbiAgICBwcm9jZXNzZXM6IHJvb3RJbXBsLnByb2Nlc3NlcyA/PyBbXSxcbiAgICBvbkVycm9yOiBvcHRpb25zPy5vbkVycm9yLFxuICB9XG5cbiAgY29uc3QgYXBwID0gQXBwUnVudGltZUltcGwubWFrZUFwcChhcHBDb25maWcpXG4gIHJldHVybiBhcHAubWFrZVJ1bnRpbWUoKSBhcyBNYW5hZ2VkUnVudGltZS5NYW5hZ2VkUnVudGltZTxhbnksIG5ldmVyPlxufVxuIiwgImltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAnLi4vanNvblZhbHVlLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi8uLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuXG5leHBvcnQgdHlwZSBBcnRpZmFjdEtleSA9IHN0cmluZ1xuXG5leHBvcnQgY29uc3QgYXJ0aWZhY3RLZXlTY2hlbWFQYXR0ZXJuID0gJ15AW15cXFxccy9dK1xcXFwvW15cXFxcc0BdK0B2XFxcXGQrJCcgYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IGlzQXJ0aWZhY3RLZXkgPSAoaW5wdXQ6IHVua25vd24pOiBpbnB1dCBpcyBBcnRpZmFjdEtleSA9PlxuICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIC9eQFteXFxzL10rXFwvW15cXHNAXStAdlxcZCskLy50ZXN0KGlucHV0KVxuXG50eXBlIEVudmVsb3BlQmFzZSA9IHtcbiAgcmVhZG9ubHkgYXJ0aWZhY3RLZXk6IEFydGlmYWN0S2V5XG4gIHJlYWRvbmx5IHRydW5jYXRlZD86IGJvb2xlYW5cbiAgcmVhZG9ubHkgYnVkZ2V0Qnl0ZXM/OiBudW1iZXJcbiAgcmVhZG9ubHkgYWN0dWFsQnl0ZXM/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlnZXN0Pzogc3RyaW5nXG4gIHJlYWRvbmx5IG5vdGVzPzogSnNvblZhbHVlXG59XG5cbmV4cG9ydCB0eXBlIEFydGlmYWN0RW52ZWxvcGUgPVxuICB8IChFbnZlbG9wZUJhc2UgJiB7XG4gICAgICByZWFkb25seSBvazogdHJ1ZVxuICAgICAgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgZXJyb3I/OiBuZXZlclxuICAgIH0pXG4gIHwgKEVudmVsb3BlQmFzZSAmIHtcbiAgICAgIHJlYWRvbmx5IG9rOiBmYWxzZVxuICAgICAgcmVhZG9ubHkgZXJyb3I6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICAgICAgcmVhZG9ubHkgdmFsdWU/OiBuZXZlclxuICAgIH0pXG5cbmV4cG9ydCB0eXBlIFRyaWFsUnVuQXJ0aWZhY3RzID0gUmVhZG9ubHk8UmVjb3JkPEFydGlmYWN0S2V5LCBBcnRpZmFjdEVudmVsb3BlPj5cbiIsICJpbXBvcnQgeyBmbnYxYTMyLCBzdGFibGVTdHJpbmdpZnkgfSBmcm9tICcuLi8uLi9kaWdlc3QuanMnXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJy4uL2pzb25WYWx1ZS5qcydcblxuZXhwb3J0IGludGVyZmFjZSBKc29uVmFsdWVEaWdlc3Qge1xuICByZWFkb25seSBzdGFibGVKc29uOiBzdHJpbmdcbiAgcmVhZG9ubHkgYnl0ZXM6IG51bWJlclxuICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xufVxuXG5jb25zdCB1dGY4Qnl0ZUxlbmd0aFN0cmluZyA9ICh0ZXh0OiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIFRleHRFbmNvZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIHRleHQubGVuZ3RoXG59XG5cbmV4cG9ydCBjb25zdCBkaWdlc3RKc29uVmFsdWUgPSAodmFsdWU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZURpZ2VzdCA9PiB7XG4gIGNvbnN0IHN0YWJsZUpzb24gPSBzdGFibGVTdHJpbmdpZnkodmFsdWUpXG4gIGNvbnN0IGJ5dGVzID0gdXRmOEJ5dGVMZW5ndGhTdHJpbmcoc3RhYmxlSnNvbilcbiAgcmV0dXJuIHtcbiAgICBzdGFibGVKc29uLFxuICAgIGJ5dGVzLFxuICAgIGRpZ2VzdDogYGFydGlmYWN0OjAzMToke2ZudjFhMzIoc3RhYmxlSnNvbil9YCxcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vcnVudGltZS9jb3JlL2Vycm9yU3VtbWFyeS5qcydcbmltcG9ydCB7IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vcnVudGltZS9jb3JlL2Vycm9yU3VtbWFyeS5qcydcbmltcG9ydCB7IGlzSnNvblZhbHVlLCB0eXBlIEpzb25WYWx1ZSB9IGZyb20gJy4uL2pzb25WYWx1ZS5qcydcbmltcG9ydCB0eXBlIHsgQXJ0aWZhY3RFbnZlbG9wZSwgQXJ0aWZhY3RLZXksIFRyaWFsUnVuQXJ0aWZhY3RzIH0gZnJvbSAnLi9tb2RlbC5qcydcbmltcG9ydCB7IGlzQXJ0aWZhY3RLZXkgfSBmcm9tICcuL21vZGVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIsIFRyaWFsUnVuQXJ0aWZhY3RJbnNwZWN0aW9uQ29udGV4dCB9IGZyb20gJy4vZXhwb3J0ZXIuanMnXG5pbXBvcnQgeyBkaWdlc3RKc29uVmFsdWUgfSBmcm9tICcuL2RpZ2VzdC5qcydcblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bkFydGlmYWN0c0J1ZGdldHMge1xuICAvKipcbiAgICogUGVyLWFydGlmYWN0IG1heGltdW0gc2VyaWFsaXplZCBieXRlcyAoVVRGLTgpLlxuICAgKiBEZWZhdWx0OiA1MEtCLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHNPcHRpb25zIHtcbiAgcmVhZG9ubHkgZXhwb3J0ZXJzOiBSZWFkb25seUFycmF5PFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcj5cbiAgcmVhZG9ubHkgY3R4OiBUcmlhbFJ1bkFydGlmYWN0SW5zcGVjdGlvbkNvbnRleHRcbiAgcmVhZG9ubHkgYnVkZ2V0cz86IFRyaWFsUnVuQXJ0aWZhY3RzQnVkZ2V0c1xufVxuXG5jb25zdCB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlID0gKGNhdXNlOiB1bmtub3duLCBjb2RlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpOiBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgPT4ge1xuICBjb25zdCBiYXNlID0gdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkoY2F1c2UpLmVycm9yU3VtbWFyeVxuICByZXR1cm4ge1xuICAgIG5hbWU6IGJhc2UubmFtZSxcbiAgICBtZXNzYWdlOiBiYXNlLm1lc3NhZ2UsXG4gICAgY29kZSxcbiAgICBoaW50OiBoaW50ID8/IGJhc2UuaGludCxcbiAgfVxufVxuXG5jb25zdCBkZWZhdWx0QXJ0aWZhY3RCdWRnZXRCeXRlcyA9IDUwICogMTAyNFxuXG5jb25zdCBidWRnZXRPZiA9IChidWRnZXRzOiBUcmlhbFJ1bkFydGlmYWN0c0J1ZGdldHMgfCB1bmRlZmluZWQpOiBudW1iZXIgPT5cbiAgdHlwZW9mIGJ1ZGdldHM/Lm1heEJ5dGVzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYnVkZ2V0cy5tYXhCeXRlcykgJiYgYnVkZ2V0cy5tYXhCeXRlcyA+IDBcbiAgICA/IGJ1ZGdldHMubWF4Qnl0ZXNcbiAgICA6IGRlZmF1bHRBcnRpZmFjdEJ1ZGdldEJ5dGVzXG5cbnR5cGUgQ29sbGVjdGVkID0ge1xuICByZWFkb25seSBhcnRpZmFjdEtleTogQXJ0aWZhY3RLZXlcbiAgcmVhZG9ubHkgZW52ZWxvcGU6IEFydGlmYWN0RW52ZWxvcGVcbn1cblxuY29uc3QgbWFrZUNvbmZsaWN0RW52ZWxvcGUgPSAoYXJ0aWZhY3RLZXk6IEFydGlmYWN0S2V5LCBleHBvcnRlcklkczogUmVhZG9ubHlBcnJheTxzdHJpbmc+KTogQ29sbGVjdGVkID0+IHtcbiAgY29uc3QgaWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KGV4cG9ydGVySWRzLm1hcCgocykgPT4gU3RyaW5nKHMpKS5maWx0ZXIoKHMpID0+IHMubGVuZ3RoID4gMCkpKS5zb3J0KChhLCBiKSA9PlxuICAgIGEubG9jYWxlQ29tcGFyZShiKSxcbiAgKVxuICByZXR1cm4ge1xuICAgIGFydGlmYWN0S2V5LFxuICAgIGVudmVsb3BlOiB7XG4gICAgICBhcnRpZmFjdEtleSxcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIG5hbWU6ICdBcnRpZmFjdEtleUNvbmZsaWN0RXJyb3InLFxuICAgICAgICBtZXNzYWdlOiBgW0xvZ2l4XSBUcmlhbFJ1biBhcnRpZmFjdCBrZXkgY29uZmxpY3Q6ICR7YXJ0aWZhY3RLZXl9YCxcbiAgICAgICAgY29kZTogJ0FydGlmYWN0S2V5Q29uZmxpY3QnLFxuICAgICAgICBoaW50OiBpZHMubGVuZ3RoID4gMCA/IGBjb25mbGljdGluZ0V4cG9ydGVycz0ke2lkcy5qb2luKCcsJyl9YCA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCB0cnVuY2F0ZUpzb25WYWx1ZSA9IChcbiAgdmFsdWU6IEpzb25WYWx1ZSxcbiAgbWF4Qnl0ZXM6IG51bWJlcixcbik6IHsgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZTsgcmVhZG9ubHkgYWN0dWFsQnl0ZXM6IG51bWJlcjsgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGFuYWx5emVkID0gZGlnZXN0SnNvblZhbHVlKHZhbHVlKVxuICBjb25zdCBqc29uID0gYW5hbHl6ZWQuc3RhYmxlSnNvblxuICBjb25zdCBieXRlcyA9IGFuYWx5emVkLmJ5dGVzXG4gIGlmIChieXRlcyA8PSBtYXhCeXRlcykge1xuICAgIHJldHVybiB7IHZhbHVlLCBhY3R1YWxCeXRlczogYnl0ZXMsIGRpZ2VzdDogYW5hbHl6ZWQuZGlnZXN0IH1cbiAgfVxuXG4gIGNvbnN0IHByZXZpZXdDaGFycyA9IE1hdGgubWluKGpzb24ubGVuZ3RoLCBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTYsIG1heEJ5dGVzKSkpXG4gIGNvbnN0IHByZXZpZXcgPSBqc29uLnNsaWNlKDAsIHByZXZpZXdDaGFycylcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZToge1xuICAgICAgX3RhZzogJ292ZXJzaXplZCcsXG4gICAgICBieXRlcyxcbiAgICAgIHByZXZpZXcsXG4gICAgfSxcbiAgICBhY3R1YWxCeXRlczogYnl0ZXMsXG4gICAgZGlnZXN0OiBhbmFseXplZC5kaWdlc3QsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbGxlY3RUcmlhbFJ1bkFydGlmYWN0cyA9IChvcHRpb25zOiBDb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHNPcHRpb25zKTogVHJpYWxSdW5BcnRpZmFjdHMgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBleHBvcnRlcnNTb3J0ZWQgPSBBcnJheS5mcm9tKG9wdGlvbnMuZXhwb3J0ZXJzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qga2EgPSBTdHJpbmcoYT8uYXJ0aWZhY3RLZXkgPz8gJycpXG4gICAgY29uc3Qga2IgPSBTdHJpbmcoYj8uYXJ0aWZhY3RLZXkgPz8gJycpXG4gICAgaWYgKGthIDwga2IpIHJldHVybiAtMVxuICAgIGlmIChrYSA+IGtiKSByZXR1cm4gMVxuICAgIGNvbnN0IGlhID0gU3RyaW5nKGE/LmV4cG9ydGVySWQgPz8gJycpXG4gICAgY29uc3QgaWIgPSBTdHJpbmcoYj8uZXhwb3J0ZXJJZCA/PyAnJylcbiAgICByZXR1cm4gaWEubG9jYWxlQ29tcGFyZShpYilcbiAgfSlcblxuICBjb25zdCBjb25mbGljdHMgPSBuZXcgTWFwPEFydGlmYWN0S2V5LCBBcnJheTxzdHJpbmc+PigpXG4gIGZvciAoY29uc3QgZXggb2YgZXhwb3J0ZXJzU29ydGVkKSB7XG4gICAgY29uc3Qga2V5ID0gZXg/LmFydGlmYWN0S2V5XG4gICAgY29uc3QgaWQgPSBTdHJpbmcoZXg/LmV4cG9ydGVySWQgPz8gJycpXG4gICAgaWYgKCFpc0FydGlmYWN0S2V5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSBjb25mbGljdHMuZ2V0KGtleSlcbiAgICBpZiAoY3VycmVudCkgY3VycmVudC5wdXNoKGlkKVxuICAgIGVsc2UgY29uZmxpY3RzLnNldChrZXksIFtpZF0pXG4gIH1cblxuICBjb25zdCBjb25mbGljdEtleXMgPSBuZXcgU2V0PEFydGlmYWN0S2V5PigpXG4gIGZvciAoY29uc3QgW2ssIGlkc10gb2YgY29uZmxpY3RzKSB7XG4gICAgY29uc3QgdW5pcXVlID0gQXJyYXkuZnJvbShuZXcgU2V0KGlkcykpXG4gICAgaWYgKHVuaXF1ZS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25mbGljdEtleXMuYWRkKGspXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF4Qnl0ZXMgPSBidWRnZXRPZihvcHRpb25zLmJ1ZGdldHMpXG4gIGNvbnN0IGNvbGxlY3RlZDogQXJyYXk8Q29sbGVjdGVkPiA9IFtdXG5cbiAgZm9yIChjb25zdCBleHBvcnRlciBvZiBleHBvcnRlcnNTb3J0ZWQpIHtcbiAgICBjb25zdCBhcnRpZmFjdEtleSA9IGV4cG9ydGVyPy5hcnRpZmFjdEtleVxuICAgIGlmICghaXNBcnRpZmFjdEtleShhcnRpZmFjdEtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChjb25mbGljdEtleXMuaGFzKGFydGlmYWN0S2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBleHBvcnRlci5leHBvcnQob3B0aW9ucy5jdHgpXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGlmICghaXNKc29uVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIGNvbGxlY3RlZC5wdXNoKHtcbiAgICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgICBlbnZlbG9wZToge1xuICAgICAgICAgICAgYXJ0aWZhY3RLZXksXG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICAgICAgbmV3IEVycm9yKGBbTG9naXhdIEFydGlmYWN0IGV4cG9ydGVyIHJldHVybmVkIG5vbi1Kc29uVmFsdWU6ICR7ZXhwb3J0ZXIuZXhwb3J0ZXJJZH1gKSxcbiAgICAgICAgICAgICAgJ0FydGlmYWN0Tm9uU2VyaWFsaXphYmxlJyxcbiAgICAgICAgICAgICAgYGFydGlmYWN0S2V5PSR7YXJ0aWZhY3RLZXl9IGV4cG9ydGVySWQ9JHtleHBvcnRlci5leHBvcnRlcklkfWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRydW5jYXRlZCA9IHRydW5jYXRlSnNvblZhbHVlKHZhbHVlLCBtYXhCeXRlcylcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBBcnRpZmFjdEVudmVsb3BlID0ge1xuICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIHZhbHVlOiB0cnVuY2F0ZWQudmFsdWUsXG4gICAgICAgIGRpZ2VzdDogdHJ1bmNhdGVkLmRpZ2VzdCxcbiAgICAgICAgLi4uKHRydW5jYXRlZC5hY3R1YWxCeXRlcyA+IG1heEJ5dGVzXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgYnVkZ2V0Qnl0ZXM6IG1heEJ5dGVzLFxuICAgICAgICAgICAgICBhY3R1YWxCeXRlczogdHJ1bmNhdGVkLmFjdHVhbEJ5dGVzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBidWRnZXRCeXRlczogbWF4Qnl0ZXMsXG4gICAgICAgICAgICAgIGFjdHVhbEJ5dGVzOiB0cnVuY2F0ZWQuYWN0dWFsQnl0ZXMsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH1cblxuICAgICAgY29sbGVjdGVkLnB1c2goeyBhcnRpZmFjdEtleSwgZW52ZWxvcGUgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb2xsZWN0ZWQucHVzaCh7XG4gICAgICAgIGFydGlmYWN0S2V5LFxuICAgICAgICBlbnZlbG9wZToge1xuICAgICAgICAgIGFydGlmYWN0S2V5LFxuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAnQXJ0aWZhY3RFeHBvcnRGYWlsZWQnLFxuICAgICAgICAgICAgYGFydGlmYWN0S2V5PSR7YXJ0aWZhY3RLZXl9IGV4cG9ydGVySWQ9JHtleHBvcnRlci5leHBvcnRlcklkfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBjb25mbGljdEtleSBvZiBBcnJheS5mcm9tKGNvbmZsaWN0S2V5cykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSkge1xuICAgIGNvbGxlY3RlZC5wdXNoKG1ha2VDb25mbGljdEVudmVsb3BlKGNvbmZsaWN0S2V5LCBjb25mbGljdHMuZ2V0KGNvbmZsaWN0S2V5KSA/PyBbXSkpXG4gIH1cblxuICBpZiAoY29sbGVjdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbGxlY3RlZC5zb3J0KChhLCBiKSA9PiBhLmFydGlmYWN0S2V5LmxvY2FsZUNvbXBhcmUoYi5hcnRpZmFjdEtleSkpXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhjb2xsZWN0ZWQubWFwKChjKSA9PiBbYy5hcnRpZmFjdEtleSwgYy5lbnZlbG9wZV0pKSBzYXRpc2ZpZXMgVHJpYWxSdW5BcnRpZmFjdHNcbn1cbiIsICJpbXBvcnQgeyBFZmZlY3QsIEV4aXQsIExheWVyLCBTY29wZSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgRXZpZGVuY2VQYWNrYWdlLCBFdmlkZW5jZVBhY2thZ2VTb3VyY2UgfSBmcm9tICcuL2V2aWRlbmNlLmpzJ1xuaW1wb3J0IHsgbWFrZUV2aWRlbmNlQ29sbGVjdG9yLCBldmlkZW5jZUNvbGxlY3RvckxheWVyIH0gZnJvbSAnLi9ldmlkZW5jZUNvbGxlY3Rvci5qcydcbmltcG9ydCB7IG1ha2VSdW5TZXNzaW9uLCBydW5TZXNzaW9uTGF5ZXIsIHR5cGUgUnVuU2Vzc2lvbiwgdHlwZSBSdW5JZCB9IGZyb20gJy4vcnVuU2Vzc2lvbi5qcydcbmltcG9ydCB7XG4gIGFwcGVuZFNpbmtzLFxuICBkaWFnbm9zdGljc0xldmVsLFxuICB0eXBlIERpYWdub3N0aWNzTGV2ZWwsXG4gIHR5cGUgU2luayBhcyBEZWJ1Z1NpbmssXG59IGZyb20gJy4uL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5pbXBvcnQgKiBhcyBSdW50aW1lS2VybmVsIGZyb20gJy4uL3J1bnRpbWUvY29yZS9SdW50aW1lS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0NvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi90cmlhbFJ1bk1vZHVsZS5qcydcblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bk9wdGlvbnMge1xuICByZWFkb25seSBydW5JZD86IFJ1bklkXG4gIHJlYWRvbmx5IHNvdXJjZT86IEV2aWRlbmNlUGFja2FnZVNvdXJjZVxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT5cbiAgcmVhZG9ubHkgcnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXM/OiBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFsUnVuUmVzdWx0PEEsIEU+IHtcbiAgcmVhZG9ubHkgc2Vzc2lvbjogUnVuU2Vzc2lvblxuICByZWFkb25seSBleGl0OiBFeGl0LkV4aXQ8QSwgRT5cbiAgcmVhZG9ubHkgZXZpZGVuY2U6IEV2aWRlbmNlUGFja2FnZVxufVxuXG5jb25zdCBkZWZhdWx0SG9zdCA9ICgpOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuICdicm93c2VyJ1xuICByZXR1cm4gJ25vZGUnXG59XG5cbmV4cG9ydCBjb25zdCB0cmlhbFJ1biA9IDxBLCBFLCBSPihcbiAgcHJvZ3JhbTogRWZmZWN0LkVmZmVjdDxBLCBFLCBSPixcbiAgb3B0aW9ucz86IFRyaWFsUnVuT3B0aW9ucyxcbik6IEVmZmVjdC5FZmZlY3Q8VHJpYWxSdW5SZXN1bHQ8QSwgRT4sIG5ldmVyLCBSPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IG1ha2VSdW5TZXNzaW9uKHtcbiAgICAgIHJ1bklkOiBvcHRpb25zPy5ydW5JZCxcbiAgICAgIHNvdXJjZTogb3B0aW9ucz8uc291cmNlID8/IHsgaG9zdDogZGVmYXVsdEhvc3QoKSwgbGFiZWw6ICd0cmlhbC1ydW4nIH0sXG4gICAgICBzdGFydGVkQXQ6IG9wdGlvbnM/LnN0YXJ0ZWRBdCxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdG9yID0gbWFrZUV2aWRlbmNlQ29sbGVjdG9yKHNlc3Npb24pXG5cbiAgICBjb25zdCBjb252ZXJnZUNvbGxlY3RvcjogQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvciA9IHtcbiAgICAgIHJlZ2lzdGVyOiAoaXIpID0+IHtcbiAgICAgICAgY29sbGVjdG9yLnJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcihpcilcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3Qgc2lua3NMYXllciA9IGFwcGVuZFNpbmtzKFtjb2xsZWN0b3IuZGVidWdTaW5rIGFzIHVua25vd24gYXMgRGVidWdTaW5rXSlcbiAgICBjb25zdCBkaWFnbm9zdGljc0xheWVyID0gZGlhZ25vc3RpY3NMZXZlbChvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsID8/ICdsaWdodCcpXG4gICAgY29uc3QgY29udmVyZ2VMYXllciA9IGFwcGVuZENvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3JzKFtjb252ZXJnZUNvbGxlY3Rvcl0pXG4gICAgY29uc3QgY29sbGVjdG9yTGF5ZXIgPSBldmlkZW5jZUNvbGxlY3RvckxheWVyKGNvbGxlY3RvcilcbiAgICBjb25zdCBzZXNzaW9uTGF5ZXIgPSBydW5TZXNzaW9uTGF5ZXIoc2Vzc2lvbilcblxuICAgIGNvbnN0IG92ZXJyaWRlc0xheWVyID1cbiAgICAgIG9wdGlvbnM/LnJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzICE9IG51bGxcbiAgICAgICAgPyAoTGF5ZXIuc3VjY2VlZChcbiAgICAgICAgICAgIFJ1bnRpbWVLZXJuZWwuUnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXNUYWcsXG4gICAgICAgICAgICBvcHRpb25zLnJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzLFxuICAgICAgICAgICkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+KVxuICAgICAgICA6IChMYXllci5lbXB0eSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4pXG5cbiAgICBjb25zdCB0cmlhbExheWVyID0gTGF5ZXIubWVyZ2VBbGwoXG4gICAgICBvcHRpb25zPy5sYXllciA/PyAoTGF5ZXIuZW1wdHkgYXMgdW5rbm93biBhcyBMYXllci5MYXllcjxhbnksIGFueSwgYW55PiksXG4gICAgICBzZXNzaW9uTGF5ZXIsXG4gICAgICBjb2xsZWN0b3JMYXllcixcbiAgICAgIG92ZXJyaWRlc0xheWVyLFxuICAgICAgZGlhZ25vc3RpY3NMYXllcixcbiAgICAgIHNpbmtzTGF5ZXIsXG4gICAgICBjb252ZXJnZUxheWVyLFxuICAgICkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgYW55PlxuXG4gICAgY29uc3Qgc2NvcGUgPSB5aWVsZCogU2NvcGUubWFrZSgpXG5cbiAgICBjb25zdCBleGl0ID0geWllbGQqIEVmZmVjdC5leGl0KHByb2dyYW0pLnBpcGUoRWZmZWN0LnByb3ZpZGVTZXJ2aWNlKFNjb3BlLlNjb3BlLCBzY29wZSksIEVmZmVjdC5wcm92aWRlKHRyaWFsTGF5ZXIpKVxuXG4gICAgeWllbGQqIFNjb3BlLmNsb3NlKHNjb3BlLCBleGl0KVxuXG4gICAgY29uc3QgZXZpZGVuY2UgPSBjb2xsZWN0b3IuZXhwb3J0RXZpZGVuY2VQYWNrYWdlKHtcbiAgICAgIG1heEV2ZW50czogb3B0aW9ucz8ubWF4RXZlbnRzLFxuICAgIH0pXG5cbiAgICByZXR1cm4geyBzZXNzaW9uLCBleGl0LCBldmlkZW5jZSB9IHNhdGlzZmllcyBUcmlhbFJ1blJlc3VsdDxBLCBFPlxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLElBQU0sV0FBVyxDQUFDLFVBQ2hCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU0sZUFBZSxDQUFDLFVBQ3BCLFNBQVMsS0FBSyxLQUFLLE1BQU0sU0FBUyxnQkFBZ0Is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QixRQUFNLFdBQVcsVUFBVSxzQkFBc0I7QUFBQSxJQUMvQyxXQUFXLFNBQVM7QUFBQSxFQUN0QixDQUFDO0FBRUQsU0FBTyxFQUFFLFNBQVMsTUFBTSxTQUFTO0FBQ25DLENBQUM7IiwKICAibmFtZXMiOiBbImV4cG9ydFN0YXRpY0lyIiwgImlzUmVjb3JkIiwgImlzTW9kdWxlSW1wbCIsICJyZXNvbHZlTW9kdWxlSWQiLCAibmV4dCIsICJleHBvcnRTdGF0aWNJciIsICJDYXVzZSIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiRWZmZWN0IiwgIkxheWVyIiwgImxheWVyIiwgIkxheWVyIiwgIkxheWVyIiwgIm1ha2UiLCAiTGF5ZXIiLCAiaXNSZWNvcmQiLCAidXRmOEJ5dGVMZW5ndGgiLCAiQ2F1c2UiLCAidG9FcnJvclN1bW1hcnlXaXRoQ29kZSIsICJFZmZlY3QiLCAibGF5ZXIiLCAiTGF5ZXIiLCAibWFrZSIsICJleHBvcnRTdGF0aWNJciIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiZGVmYXVsdEhvc3QiLCAiRWZmZWN0IiwgIkxheWVyIl0KfQo=