@bitgo-beta/sdk-coin-sol 7.6.4-beta.31 → 7.6.4-beta.310

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 (395) hide show
  1. package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
  2. package/dist/cjs/src/bigint-buffer-guard.js +29 -0
  3. package/dist/cjs/src/config/token2022StaticConfig.d.ts.map +1 -0
  4. package/dist/cjs/src/config/token2022StaticConfig.js +50 -0
  5. package/dist/cjs/src/index.d.ts.map +1 -0
  6. package/dist/{src → cjs/src}/index.js +1 -1
  7. package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
  8. package/dist/cjs/src/lib/ataInitializationBuilder.js +196 -0
  9. package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
  10. package/dist/cjs/src/lib/closeAtaBuilder.js +69 -0
  11. package/dist/{src → cjs/src}/lib/constants.d.ts +24 -0
  12. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/constants.js +196 -0
  14. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  15. package/dist/cjs/src/lib/customInstructionBuilder.js +289 -0
  16. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  17. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  18. package/dist/cjs/src/lib/explainTransactionWasm.js +264 -0
  19. package/dist/{src → cjs/src}/lib/iface.d.ts +20 -2
  20. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  21. package/dist/cjs/src/lib/iface.js +7 -0
  22. package/dist/{src → cjs/src}/lib/index.d.ts +1 -0
  23. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  24. package/dist/{src → cjs/src}/lib/index.js +4 -2
  25. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +1 -0
  26. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/instructionParamsFactory.js +1059 -0
  28. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  29. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  30. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/keyPair.js +63 -0
  32. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  33. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  34. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  35. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  36. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  37. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  38. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  39. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  40. package/dist/cjs/src/lib/solInstructionFactory.js +595 -0
  41. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  42. package/dist/cjs/src/lib/stakingActivateBuilder.js +120 -0
  43. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  44. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  45. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  46. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +208 -0
  47. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  48. package/dist/cjs/src/lib/stakingDelegateBuilder.js +120 -0
  49. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  50. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  51. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +78 -0
  53. package/dist/cjs/src/lib/token2022Config.d.ts.map +1 -0
  54. package/dist/cjs/src/lib/token2022Config.js +27 -0
  55. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  56. package/dist/cjs/src/lib/tokenTransferBuilder.js +188 -0
  57. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  58. package/dist/cjs/src/lib/transaction.js +612 -0
  59. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  60. package/dist/cjs/src/lib/transactionBuilder.js +380 -0
  61. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +5 -0
  62. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  63. package/dist/cjs/src/lib/transactionBuilderFactory.js +209 -0
  64. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  65. package/dist/cjs/src/lib/transferBuilder.js +70 -0
  66. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  67. package/dist/cjs/src/lib/transferBuilderV2.js +210 -0
  68. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  69. package/dist/cjs/src/lib/utils.js +595 -0
  70. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  71. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  72. package/dist/cjs/src/register.d.ts.map +1 -0
  73. package/dist/cjs/src/register.js +15 -0
  74. package/dist/{src → cjs/src}/sol.d.ts +40 -0
  75. package/dist/cjs/src/sol.d.ts.map +1 -0
  76. package/dist/cjs/src/sol.js +1402 -0
  77. package/dist/cjs/src/solToken.d.ts.map +1 -0
  78. package/dist/cjs/src/solToken.js +69 -0
  79. package/dist/cjs/src/tsol.d.ts.map +1 -0
  80. package/dist/cjs/src/tsol.js +24 -0
  81. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  82. package/dist/cjs/test/fixtures/sol.js +1433 -0
  83. package/dist/{test → cjs/test}/resources/sol.d.ts +27 -27
  84. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  85. package/dist/cjs/test/resources/sol.js +320 -0
  86. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  87. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  88. package/dist/cjs/test/unit/explainTransactionWasm.js +26 -0
  89. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  90. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  91. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  92. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  93. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  94. package/dist/cjs/test/unit/instructionParamsFactory.js +412 -0
  95. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  96. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  97. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  98. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  99. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  100. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  101. package/dist/cjs/test/unit/keyPair.js +177 -0
  102. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  103. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  104. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  105. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  106. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  107. package/dist/cjs/test/unit/sol.js +3326 -0
  108. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  109. package/dist/cjs/test/unit/solInstructionFactory.js +454 -0
  110. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  111. package/dist/cjs/test/unit/solToken.js +31 -0
  112. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  113. package/dist/cjs/test/unit/transaction.js +1108 -0
  114. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  115. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  116. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  117. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
  118. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  119. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  120. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  121. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  122. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  123. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  124. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  125. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  126. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  127. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  128. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  129. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  130. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  131. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
  132. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  133. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  134. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  135. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +286 -0
  136. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  137. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
  138. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  139. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  140. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  141. package/dist/cjs/test/unit/utils.js +517 -0
  142. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  143. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  144. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  145. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  146. package/dist/esm/config/token2022StaticConfig.d.ts +3 -0
  147. package/dist/esm/config/token2022StaticConfig.js +47 -0
  148. package/dist/esm/index.d.ts +7 -0
  149. package/dist/esm/index.js +7 -0
  150. package/dist/esm/lib/ataInitializationBuilder.d.ts +47 -0
  151. package/dist/esm/lib/ataInitializationBuilder.js +156 -0
  152. package/dist/esm/lib/closeAtaBuilder.d.ts +19 -0
  153. package/dist/esm/lib/closeAtaBuilder.js +62 -0
  154. package/dist/esm/lib/constants.d.ts +164 -0
  155. package/dist/esm/lib/constants.d.ts.map +1 -0
  156. package/dist/esm/lib/constants.js +193 -0
  157. package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
  158. package/dist/esm/lib/customInstructionBuilder.js +282 -0
  159. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  160. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  161. package/dist/esm/lib/explainTransactionWasm.js +261 -0
  162. package/dist/esm/lib/iface.d.ts +262 -0
  163. package/dist/esm/lib/iface.d.ts.map +1 -0
  164. package/dist/esm/lib/iface.js +3 -0
  165. package/dist/esm/lib/index.d.ts +23 -0
  166. package/dist/{src → esm}/lib/index.d.ts.map +1 -1
  167. package/dist/esm/lib/index.js +23 -0
  168. package/dist/esm/lib/instructionParamsFactory.d.ts +13 -0
  169. package/dist/{src → esm}/lib/instructionParamsFactory.d.ts.map +1 -1
  170. package/dist/esm/lib/instructionParamsFactory.js +1052 -0
  171. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  172. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  173. package/dist/esm/lib/keyPair.d.ts +26 -0
  174. package/dist/esm/lib/keyPair.js +59 -0
  175. package/dist/esm/lib/messages/index.d.ts +2 -0
  176. package/dist/esm/lib/messages/index.js +2 -0
  177. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  178. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  179. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  180. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  181. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  182. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  183. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  184. package/dist/esm/lib/solInstructionFactory.js +589 -0
  185. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  186. package/dist/esm/lib/stakingActivateBuilder.js +113 -0
  187. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  188. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  189. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  190. package/dist/{src → esm}/lib/stakingDeactivateBuilder.js +31 -38
  191. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  192. package/dist/esm/lib/stakingDelegateBuilder.js +113 -0
  193. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  194. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  195. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  196. package/dist/esm/lib/stakingWithdrawBuilder.js +71 -0
  197. package/dist/esm/lib/token2022Config.d.ts +44 -0
  198. package/dist/esm/lib/token2022Config.js +23 -0
  199. package/dist/esm/lib/tokenTransferBuilder.d.ts +41 -0
  200. package/dist/esm/lib/tokenTransferBuilder.js +181 -0
  201. package/dist/esm/lib/transaction.d.ts +103 -0
  202. package/dist/esm/lib/transaction.d.ts.map +1 -0
  203. package/dist/esm/lib/transaction.js +605 -0
  204. package/dist/esm/lib/transactionBuilder.d.ts +128 -0
  205. package/dist/esm/lib/transactionBuilder.js +373 -0
  206. package/dist/esm/lib/transactionBuilderFactory.d.ts +120 -0
  207. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  208. package/dist/esm/lib/transactionBuilderFactory.js +205 -0
  209. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  210. package/dist/esm/lib/transferBuilder.js +63 -0
  211. package/dist/esm/lib/transferBuilderV2.d.ts +43 -0
  212. package/dist/esm/lib/transferBuilderV2.js +203 -0
  213. package/dist/esm/lib/utils.d.ts +200 -0
  214. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  215. package/dist/esm/lib/utils.js +558 -0
  216. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  217. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  218. package/dist/esm/register.d.ts +3 -0
  219. package/dist/esm/register.js +11 -0
  220. package/dist/esm/sol.d.ts +267 -0
  221. package/dist/esm/sol.d.ts.map +1 -0
  222. package/dist/esm/sol.js +1361 -0
  223. package/dist/esm/solToken.d.ts +37 -0
  224. package/dist/esm/solToken.js +65 -0
  225. package/dist/esm/tsol.d.ts +11 -0
  226. package/dist/esm/tsol.js +20 -0
  227. package/package.json +34 -15
  228. package/dist/src/config/token2022StaticConfig.js +0 -50
  229. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  230. package/dist/src/lib/closeAtaBuilder.js +0 -69
  231. package/dist/src/lib/constants.d.ts.map +0 -1
  232. package/dist/src/lib/constants.js +0 -171
  233. package/dist/src/lib/customInstructionBuilder.js +0 -289
  234. package/dist/src/lib/iface.d.ts.map +0 -1
  235. package/dist/src/lib/iface.js +0 -7
  236. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  237. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  238. package/dist/src/lib/keyPair.js +0 -63
  239. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  240. package/dist/src/lib/solInstructionFactory.js +0 -572
  241. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  242. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  243. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  244. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  245. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  246. package/dist/src/lib/token2022Config.js +0 -27
  247. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  248. package/dist/src/lib/transaction.d.ts.map +0 -1
  249. package/dist/src/lib/transaction.js +0 -595
  250. package/dist/src/lib/transactionBuilder.js +0 -380
  251. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  252. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  253. package/dist/src/lib/transferBuilder.js +0 -70
  254. package/dist/src/lib/transferBuilderV2.js +0 -210
  255. package/dist/src/lib/utils.js +0 -589
  256. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  257. package/dist/src/register.js +0 -15
  258. package/dist/src/sol.d.ts.map +0 -1
  259. package/dist/src/sol.js +0 -1285
  260. package/dist/src/solToken.js +0 -69
  261. package/dist/src/tsol.js +0 -24
  262. package/dist/test/fixtures/sol.js +0 -1433
  263. package/dist/test/resources/sol.d.ts.map +0 -1
  264. package/dist/test/resources/sol.js +0 -320
  265. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  266. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  267. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  268. package/dist/test/unit/getBuilderFactory.js +0 -10
  269. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  270. package/dist/test/unit/instructionParamsFactory.js +0 -412
  271. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  272. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  273. package/dist/test/unit/keyPair.js +0 -177
  274. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  275. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  276. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  277. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  278. package/dist/test/unit/sol.js +0 -3108
  279. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  280. package/dist/test/unit/solInstructionFactory.js +0 -454
  281. package/dist/test/unit/solToken.d.ts.map +0 -1
  282. package/dist/test/unit/solToken.js +0 -31
  283. package/dist/test/unit/transaction.d.ts.map +0 -1
  284. package/dist/test/unit/transaction.js +0 -983
  285. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  286. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  287. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  288. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  289. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  290. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  291. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  292. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  293. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  294. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  295. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  296. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  297. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  298. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  299. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  300. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  301. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  302. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  303. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  304. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  305. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  306. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  307. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  308. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  309. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  310. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  311. package/dist/test/unit/utils.js +0 -517
  312. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  313. package/dist/test/unit/versionedTransaction.js +0 -207
  314. package/dist/tsconfig.tsbuildinfo +0 -1
  315. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  316. /package/dist/{src → cjs/src}/config/token2022StaticConfig.d.ts +0 -0
  317. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  318. /package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +0 -0
  319. /package/dist/{src → cjs/src}/lib/closeAtaBuilder.d.ts +0 -0
  320. /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
  321. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  322. /package/dist/{src → cjs/src}/lib/keyPair.d.ts +0 -0
  323. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  324. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  325. /package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +0 -0
  326. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  327. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  328. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  329. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  330. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  331. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  332. /package/dist/{src → cjs/src}/lib/token2022Config.d.ts +0 -0
  333. /package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +0 -0
  334. /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
  335. /package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -0
  336. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  337. /package/dist/{src → cjs/src}/lib/transferBuilderV2.d.ts +0 -0
  338. /package/dist/{src → cjs/src}/lib/utils.d.ts +0 -0
  339. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  340. /package/dist/{src → cjs/src}/register.d.ts +0 -0
  341. /package/dist/{src → cjs/src}/solToken.d.ts +0 -0
  342. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  343. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  344. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  345. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  346. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  347. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  348. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  349. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  350. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  351. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  352. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  353. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  354. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  355. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  356. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  357. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  358. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  359. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  360. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  361. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  362. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  363. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  364. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  365. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  366. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  367. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  368. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  369. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  370. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  371. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  372. /package/dist/{src → esm}/config/token2022StaticConfig.d.ts.map +0 -0
  373. /package/dist/{src → esm}/index.d.ts.map +0 -0
  374. /package/dist/{src → esm}/lib/ataInitializationBuilder.d.ts.map +0 -0
  375. /package/dist/{src → esm}/lib/closeAtaBuilder.d.ts.map +0 -0
  376. /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
  377. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  378. /package/dist/{src → esm}/lib/keyPair.d.ts.map +0 -0
  379. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  380. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  381. /package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +0 -0
  382. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  383. /package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +0 -0
  384. /package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +0 -0
  385. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  386. /package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +0 -0
  387. /package/dist/{src → esm}/lib/token2022Config.d.ts.map +0 -0
  388. /package/dist/{src → esm}/lib/tokenTransferBuilder.d.ts.map +0 -0
  389. /package/dist/{src → esm}/lib/transactionBuilder.d.ts.map +0 -0
  390. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  391. /package/dist/{src → esm}/lib/transferBuilderV2.d.ts.map +0 -0
  392. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  393. /package/dist/{src → esm}/register.d.ts.map +0 -0
  394. /package/dist/{src → esm}/solToken.d.ts.map +0 -0
  395. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -1,3108 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const assert_1 = __importDefault(require("assert"));
40
- const _ = __importStar(require("lodash"));
41
- const nock_1 = __importDefault(require("nock"));
42
- const should = __importStar(require("should"));
43
- const sinon = __importStar(require("sinon"));
44
- const spl_token_1 = require("@solana/spl-token");
45
- const sdk_api_1 = require("@bitgo-beta/sdk-api");
46
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
47
- const sdk_test_1 = require("@bitgo-beta/sdk-test");
48
- const statics_1 = require("@bitgo-beta/statics");
49
- const src_1 = require("../../src");
50
- const lib_1 = require("../../src/lib");
51
- const utils_1 = require("../../src/lib/utils");
52
- const testData = __importStar(require("../fixtures/sol"));
53
- const resources = __importStar(require("../resources/sol"));
54
- const solBackupKey_1 = require("./fixtures/solBackupKey");
55
- const getBuilderFactory_1 = require("./getBuilderFactory");
56
- describe('SOL:', function () {
57
- let bitgo;
58
- let basecoin;
59
- let keyPair;
60
- let newTxPrebuild;
61
- let newTxPrebuildTokenTransfer;
62
- let newTxParams;
63
- let newTxParamsWithError;
64
- let newTxParamsWithExtraData;
65
- let newTxParamsTokenTransfer;
66
- const badAddresses = resources.addresses.invalidAddresses;
67
- const goodAddresses = resources.addresses.validAddresses;
68
- const keypair = {
69
- pub: resources.accountWithSeed.publicKey,
70
- prv: resources.accountWithSeed.privateKey.base58,
71
- };
72
- const txPrebuild = {
73
- recipients: [
74
- {
75
- address: 'lionteste212',
76
- amount: '1000',
77
- },
78
- ],
79
- txBase64: resources.TRANSFER_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE,
80
- txInfo: {
81
- feePayer: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
82
- nonce: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
83
- },
84
- txid: '586c5b59b10b134d04c16ac1b273fe3c5529f34aef75db4456cd469c5cdac7e2',
85
- isVotingTransaction: false,
86
- coin: 'tsol',
87
- };
88
- const txParams = {
89
- txPrebuild,
90
- recipients: [
91
- {
92
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
93
- amount: '300000',
94
- },
95
- ],
96
- };
97
- const memo = { value: 'test memo' };
98
- const durableNonce = {
99
- walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
100
- authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
101
- };
102
- const errorDurableNonce = {
103
- walletNonceAddress: '8YM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
104
- authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
105
- };
106
- const txParamsWithError = {
107
- txPrebuild,
108
- recipients: [
109
- {
110
- address: 'CP5Dpaa42mMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
111
- amount: '300000',
112
- },
113
- ],
114
- };
115
- const txParamsWithExtraData = {
116
- txPrebuild,
117
- recipients: [
118
- {
119
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
120
- amount: '300000',
121
- data: undefined,
122
- },
123
- ],
124
- };
125
- const txPrebuildTokenTransfer = {
126
- recipients: [
127
- {
128
- address: 'AF5H6vBkFnJuVqChRPgPQ4JRcQ5Gk25HBFhQQkyojmvg',
129
- amount: '1',
130
- },
131
- ],
132
- txHex: resources.TOKEN_TRANSFER_TO_NATIVE_UNSIGNED_TX_HEX,
133
- txInfo: {
134
- feePayer: '4DujymUFbQ8GBKtAwAZrQ6QqpvtBEivL48h4ta2oJGd2',
135
- nonce: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
136
- },
137
- txid: '586c5b59b10b134d04c16ac1b273fe3c5529f34aef75db4456cd469c5cdac7e2',
138
- isVotingTransaction: false,
139
- coin: 'tsol',
140
- };
141
- const txParamsTokenTransfer = {
142
- txPrebuild,
143
- recipients: [
144
- {
145
- address: 'AF5H6vBkFnJuVqChRPgPQ4JRcQ5Gk25HBFhQQkyojmvg',
146
- amount: '1',
147
- },
148
- ],
149
- };
150
- const errorMemo = { value: 'different memo' };
151
- const errorFeePayer = '5hr5fisPi6DXCuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe';
152
- const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
153
- const wallet = new src_1.KeyPair(resources.authAccount).getKeys();
154
- const stakeAccount = new src_1.KeyPair(resources.stakeAccount).getKeys();
155
- const blockHash = resources.blockHashes.validBlockHashes[0];
156
- const amount = '10000';
157
- const validator = resources.validator;
158
- before(function () {
159
- bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
160
- bitgo.safeRegister('sol', src_1.Tsol.createInstance);
161
- bitgo.safeRegister('tsol', src_1.Tsol.createInstance);
162
- bitgo.initializeTestVars();
163
- basecoin = bitgo.coin('tsol');
164
- keyPair = basecoin.generateKeyPair(resources.accountWithSeed.seed);
165
- newTxPrebuild = () => {
166
- return _.cloneDeep(txPrebuild);
167
- };
168
- newTxPrebuildTokenTransfer = () => {
169
- return _.cloneDeep(txPrebuildTokenTransfer);
170
- };
171
- newTxParams = () => {
172
- return _.cloneDeep(txParams);
173
- };
174
- newTxParamsWithError = () => {
175
- return _.cloneDeep(txParamsWithError);
176
- };
177
- newTxParamsWithExtraData = () => {
178
- return _.cloneDeep(txParamsWithExtraData);
179
- };
180
- newTxParamsTokenTransfer = () => {
181
- return _.cloneDeep(txParamsTokenTransfer);
182
- };
183
- });
184
- it('should instantiate the coin', async function () {
185
- let localBasecoin = bitgo.coin('tsol');
186
- localBasecoin.should.be.an.instanceof(src_1.Tsol);
187
- localBasecoin = bitgo.coin('sol');
188
- localBasecoin.should.be.an.instanceof(src_1.Sol);
189
- });
190
- it('should retun the right info', function () {
191
- basecoin.getChain().should.equal('tsol');
192
- basecoin.getFamily().should.equal('sol');
193
- basecoin.getFullName().should.equal('Testnet Solana');
194
- basecoin.getBaseFactor().should.equal(1000000000);
195
- });
196
- describe('verify transactions', () => {
197
- const walletData = {
198
- id: '5b34252f1bf349930e34020a00000000',
199
- coin: 'tsol',
200
- keys: [
201
- '5b3424f91bf349930e34017500000000',
202
- '5b3424f91bf349930e34017600000000',
203
- '5b3424f91bf349930e34017700000000',
204
- ],
205
- coinSpecific: {
206
- rootAddress: wallet.pub,
207
- },
208
- multisigType: 'tss',
209
- };
210
- const walletObj = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
211
- it('should verify transactions', async function () {
212
- const txParams = newTxParams();
213
- const txPrebuild = newTxPrebuild();
214
- const validTransaction = await basecoin.verifyTransaction({
215
- txParams,
216
- txPrebuild,
217
- memo,
218
- durableNonce,
219
- wallet: walletObj,
220
- });
221
- validTransaction.should.equal(true);
222
- });
223
- it('should verify consolidate transaction', async function () {
224
- const txParams = newTxParams();
225
- const txPrebuild = newTxPrebuild();
226
- txPrebuild.consolidateId = 'consolidateId';
227
- const walletData = {
228
- id: '5b34252f1bf349930e34020a00000000',
229
- coin: 'tsol',
230
- keys: [
231
- '5b3424f91bf349930e34017500000000',
232
- '5b3424f91bf349930e34017600000000',
233
- '5b3424f91bf349930e34017700000000',
234
- ],
235
- coinSpecific: {
236
- rootAddress: stakeAccount.pub,
237
- },
238
- multisigType: 'tss',
239
- };
240
- const walletWithDifferentAddress = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
241
- const validTransaction = await basecoin.verifyTransaction({
242
- txParams,
243
- txPrebuild,
244
- memo,
245
- durableNonce,
246
- wallet: walletWithDifferentAddress,
247
- });
248
- validTransaction.should.be.true();
249
- });
250
- it('should handle txBase64 and txHex interchangeably', async function () {
251
- const txParams = newTxParams();
252
- const txPrebuild = newTxPrebuild();
253
- txPrebuild.txHex = txPrebuild.txBase64;
254
- txPrebuild.txBase64 = undefined;
255
- const validTransaction = await basecoin.verifyTransaction({
256
- txParams,
257
- txPrebuild,
258
- memo,
259
- durableNonce,
260
- wallet: walletObj,
261
- });
262
- validTransaction.should.equal(true);
263
- });
264
- it('should convert serialized hex string to base64', async function () {
265
- const txParams = newTxParams();
266
- const txPrebuild = newTxPrebuild();
267
- txPrebuild.txBase64 = Buffer.from(txPrebuild.txBase64, 'base64').toString('hex');
268
- const validTransaction = await basecoin.verifyTransaction({
269
- txParams,
270
- txPrebuild,
271
- memo,
272
- durableNonce,
273
- wallet: walletObj,
274
- });
275
- validTransaction.should.equal(true);
276
- });
277
- it('should verify when input `recipients` is absent', async function () {
278
- const txParams = newTxParams();
279
- txParams.recipients = undefined;
280
- const txPrebuild = newTxPrebuild();
281
- const validTransaction = await basecoin.verifyTransaction({
282
- txParams,
283
- txPrebuild,
284
- memo,
285
- durableNonce,
286
- wallet: walletObj,
287
- });
288
- validTransaction.should.equal(true);
289
- });
290
- it('should fail verify transactions when have different memo', async function () {
291
- const txParams = newTxParams();
292
- const txPrebuild = newTxPrebuild();
293
- await basecoin
294
- .verifyTransaction({ txParams, txPrebuild, memo: errorMemo, wallet: walletObj })
295
- .should.be.rejectedWith('Tx memo does not match with expected txParams recipient memo');
296
- });
297
- it('should pass if we pass PDA address', async function () {
298
- const walletData = {
299
- id: '67f8ddff4c9b8b57a2e16acffac9a3b5',
300
- coin: 'tsol',
301
- keys: [
302
- '5b3424f91bf349930e34017500000000',
303
- '5b3424f91bf349930e34017600000000',
304
- '5b3424f91bf349930e34017700000000',
305
- ],
306
- coinSpecific: {
307
- rootAddress: '8zbsJA5c8HPR7BPjZkrSVrus2uMuXqCfzksGwB3Uscjb',
308
- },
309
- multisigType: 'tss',
310
- };
311
- const walletObj = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
312
- const txPrebuild = {
313
- recipients: [
314
- {
315
- address: '11111111111111111111111111111112',
316
- amount: '1000000000',
317
- tokenName: 'tsol:usdc',
318
- },
319
- ],
320
- txBase64: '02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ec1adcc89bb564f1f8225821140a9723efa80e8d506765770b7e201d66d8200d4f690e9a8163291b69f8c3827aad96cfd2105eee3aae76cbca38fcad2bf7f0a0201070c76c356cb069b66c2b35a8638b4d4afca75b303f29f0deeb4bff8528299a9c9d21c96172044f1217c3784e8f02f49e2c8fc3591e81294ab54394f9d22fd7b7a8f60129e6ecb20309c27dcba5fc6c441438d33a1568004a1860e22c16f071976a7d2e2008bd34b53a08aa9c8ec04eb2196745fc6029224447417e2fb0fced601240cabba4ce534c02fc154ba559ed2a02ac971e3385acb426ff63bb1040e2c2435000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018c97258f4e2489f1bb3d1029148e0d830b5a1399daff1084048e7bd8dbe9f859d10389fbcee528f208611dccc734b31092540cb2b8d58d100f2eaa2cedb4da5e06a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000006a7d517192c5c51218cc94c3d4af17f58daee089ba1fd44e3dbd98a0000000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9e680634533882f880a3e7dfa999dfb864b88968d242a0c9a90b5df149e42da050305030209010404000000070700030608050b0a000b04040803000a0c00ca9a3b0000000009',
321
- txInfo: {
322
- feePayer: '8zbsJA5c8HPR7BPjZkrSVrus2uMuXqCfzksGwB3Uscjb',
323
- nonce: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
324
- },
325
- txid: '586c5b59b10b134d04c16ac1b273fe3c5529f34aef75db4456cd469c5cdac7e2',
326
- isVotingTransaction: false,
327
- coin: 'tsol',
328
- };
329
- const txParams = {
330
- txPrebuild,
331
- recipients: [
332
- {
333
- address: '11111111111111111111111111111112',
334
- amount: '1000000000',
335
- tokenName: 'tsol:usdc',
336
- },
337
- ],
338
- };
339
- const memo = {
340
- value: undefined,
341
- };
342
- const verifyTransaction = await basecoin.verifyTransaction({
343
- txParams,
344
- txPrebuild,
345
- memo: memo,
346
- wallet: walletObj,
347
- });
348
- verifyTransaction.should.equal(true);
349
- });
350
- it('should fail verify transactions when have different durableNonce', async function () {
351
- const txParams = newTxParams();
352
- const txPrebuild = newTxPrebuild();
353
- await basecoin
354
- .verifyTransaction({ txParams, txPrebuild, memo, durableNonce: errorDurableNonce, wallet: walletObj })
355
- .should.be.rejectedWith('Tx durableNonce does not match with param durableNonce');
356
- });
357
- it('should fail verify transactions when have different feePayer', async function () {
358
- const txParams = newTxParams();
359
- const txPrebuild = newTxPrebuild();
360
- const walletData = {
361
- id: '5b34252f1bf349930e34020a00000000',
362
- coin: 'tsol',
363
- keys: [
364
- '5b3424f91bf349930e34017500000000',
365
- '5b3424f91bf349930e34017600000000',
366
- '5b3424f91bf349930e34017700000000',
367
- ],
368
- coinSpecific: {
369
- rootAddress: stakeAccount.pub,
370
- },
371
- multisigType: 'tss',
372
- };
373
- const walletWithDifferentAddress = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
374
- await basecoin
375
- .verifyTransaction({ txParams, txPrebuild, memo, wallet: walletWithDifferentAddress })
376
- .should.be.rejectedWith('Tx fee payer is not the wallet root address');
377
- });
378
- it('should fail verify transactions when have different recipients', async function () {
379
- const txParams = newTxParamsWithError();
380
- const txPrebuild = newTxPrebuild();
381
- await basecoin
382
- .verifyTransaction({ txParams, txPrebuild, memo, errorFeePayer, wallet: walletObj })
383
- .should.be.rejectedWith('Tx outputs does not match with expected txParams recipients');
384
- });
385
- it('should succeed to verify token transaction with native address recipient', async function () {
386
- const txParams = newTxParamsTokenTransfer();
387
- const address = 'AF5H6vBkFnJuVqChRPgPQ4JRcQ5Gk25HBFhQQkyojmvg'; // Native SOL address
388
- txParams.recipients = [{ address, amount: '1', tokenName: 'tsol:usdc' }];
389
- const txPrebuild = newTxPrebuildTokenTransfer();
390
- const feePayerWalletData = {
391
- id: '5b34252f1bf349930e34020a00000000',
392
- coin: 'tsol',
393
- keys: [
394
- '5b3424f91bf349930e34017500000000',
395
- '5b3424f91bf349930e34017600000000',
396
- '5b3424f91bf349930e34017700000000',
397
- ],
398
- coinSpecific: {
399
- rootAddress: '4DujymUFbQ8GBKtAwAZrQ6QqpvtBEivL48h4ta2oJGd2',
400
- },
401
- multisigType: 'tss',
402
- };
403
- const feePayerWallet = new sdk_core_1.Wallet(bitgo, basecoin, feePayerWalletData);
404
- const validTransaction = await basecoin.verifyTransaction({
405
- txParams,
406
- txPrebuild,
407
- wallet: feePayerWallet,
408
- });
409
- validTransaction.should.equal(true);
410
- });
411
- it('should succeed to verify token transaction with leading zero recipient amount', async function () {
412
- const txParams = newTxParamsTokenTransfer();
413
- const address = 'AF5H6vBkFnJuVqChRPgPQ4JRcQ5Gk25HBFhQQkyojmvg'; // Native SOL address
414
- txParams.recipients = [{ address, amount: '0001', tokenName: 'tsol:usdc' }];
415
- const txPrebuild = newTxPrebuildTokenTransfer();
416
- const feePayerWalletData = {
417
- id: '5b34252f1bf349930e34020a00000000',
418
- coin: 'tsol',
419
- keys: [
420
- '5b3424f91bf349930e34017500000000',
421
- '5b3424f91bf349930e34017600000000',
422
- '5b3424f91bf349930e34017700000000',
423
- ],
424
- coinSpecific: {
425
- rootAddress: '4DujymUFbQ8GBKtAwAZrQ6QqpvtBEivL48h4ta2oJGd2',
426
- },
427
- multisigType: 'tss',
428
- };
429
- const feePayerWallet = new sdk_core_1.Wallet(bitgo, basecoin, feePayerWalletData);
430
- const validTransaction = await basecoin.verifyTransaction({
431
- txParams,
432
- txPrebuild,
433
- wallet: feePayerWallet,
434
- });
435
- validTransaction.should.equal(true);
436
- });
437
- it('should fail to verify token transaction with different recipient tokenName', async function () {
438
- const txParams = newTxParamsTokenTransfer();
439
- const address = 'AF5H6vBkFnJuVqChRPgPQ4JRcQ5Gk25HBFhQQkyojmvg'; // Native SOL address
440
- txParams.recipients = [{ address, amount: '1', tokenName: 'tsol:usdt' }]; // Different tokenName, should fail to verify tx
441
- const txPrebuild = newTxPrebuildTokenTransfer();
442
- await basecoin
443
- .verifyTransaction({
444
- txParams,
445
- txPrebuild,
446
- wallet: walletObj,
447
- })
448
- .should.be.rejectedWith('Tx outputs does not match with expected txParams recipients');
449
- });
450
- it('should fail to verify token transaction with different recipient amounts', async function () {
451
- const txParams = newTxParamsTokenTransfer();
452
- const address = 'AF5H6vBkFnJuVqChRPgPQ4JRcQ5Gk25HBFhQQkyojmvg'; // Native SOL address
453
- txParams.recipients = [{ address, amount: '2', tokenName: 'tsol:usdt' }];
454
- const txPrebuild = newTxPrebuildTokenTransfer();
455
- await basecoin
456
- .verifyTransaction({
457
- txParams,
458
- txPrebuild,
459
- wallet: walletObj,
460
- })
461
- .should.be.rejectedWith('Tx outputs does not match with expected txParams recipients');
462
- });
463
- it('should fail to verify token transaction with different native address', async function () {
464
- const txParams = newTxParamsTokenTransfer();
465
- const address = 'AF5H6vBkFnJuVqChRPgPQ4JRcQ5Gk25HBFhQQkyojmvX'; // Native SOL address, different than tx recipients
466
- txParams.recipients = [{ address, amount: '1', tokenName: 'tsol:usdc' }];
467
- const txPrebuild = newTxPrebuildTokenTransfer();
468
- await basecoin
469
- .verifyTransaction({
470
- txParams,
471
- txPrebuild,
472
- wallet: walletObj,
473
- })
474
- .should.be.rejectedWith('Tx outputs does not match with expected txParams recipients');
475
- });
476
- it('should succeed to verify transactions when recipients has extra data', async function () {
477
- const txParams = newTxParamsWithExtraData();
478
- const txPrebuild = newTxPrebuild();
479
- const validTransaction = await basecoin.verifyTransaction({
480
- txParams,
481
- txPrebuild,
482
- memo,
483
- durableNonce,
484
- wallet: walletObj,
485
- });
486
- validTransaction.should.equal(true);
487
- });
488
- it('should verify activate staking transaction', async function () {
489
- const tx = await factory
490
- .getStakingActivateBuilder()
491
- .stakingAddress(stakeAccount.pub)
492
- .sender(wallet.pub)
493
- .nonce(blockHash)
494
- .amount(amount)
495
- .validator(validator.pub)
496
- .memo('test memo')
497
- .fee({ amount: 5000 })
498
- .build();
499
- const txToBroadcastFormat = tx.toBroadcastFormat();
500
- const txParams = newTxParams();
501
- const txPrebuild = newTxPrebuild();
502
- txPrebuild.txBase64 = txToBroadcastFormat;
503
- txPrebuild.txInfo.nonce = '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen';
504
- txParams.recipients = [
505
- {
506
- address: '7dRuGFbU2y2kijP6o1LYNzVyz4yf13MooqoionCzv5Za',
507
- amount: amount,
508
- },
509
- ];
510
- const validTransaction = await basecoin.verifyTransaction({
511
- txParams,
512
- txPrebuild,
513
- memo,
514
- wallet: walletObj,
515
- });
516
- validTransaction.should.equal(true);
517
- });
518
- it('should verify withdraw staking transaction', async function () {
519
- const tx = await factory
520
- .getStakingWithdrawBuilder()
521
- .stakingAddress(stakeAccount.pub)
522
- .sender(wallet.pub)
523
- .nonce(blockHash)
524
- .amount(amount)
525
- .memo('test memo')
526
- .fee({ amount: 5000 })
527
- .build();
528
- const txToBroadcastFormat = tx.toBroadcastFormat();
529
- const txParams = newTxParams();
530
- const txPrebuild = newTxPrebuild();
531
- txPrebuild.txBase64 = txToBroadcastFormat;
532
- txPrebuild.txInfo.nonce = '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen';
533
- txParams.recipients = [
534
- {
535
- address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
536
- amount: amount,
537
- },
538
- ];
539
- const validTransaction = await basecoin.verifyTransaction({
540
- txParams,
541
- txPrebuild,
542
- memo,
543
- wallet: walletObj,
544
- });
545
- validTransaction.should.equal(true);
546
- });
547
- it('should verify deactivate staking transaction', async function () {
548
- const tx = await factory
549
- .getStakingDeactivateBuilder()
550
- .stakingAddress(stakeAccount.pub)
551
- .sender(wallet.pub)
552
- .nonce(blockHash)
553
- .memo('test memo')
554
- .fee({ amount: 5000 })
555
- .build();
556
- const txToBroadcastFormat = tx.toBroadcastFormat();
557
- const txParams = newTxParams();
558
- const txPrebuild = newTxPrebuild();
559
- txPrebuild.txBase64 = txToBroadcastFormat;
560
- txPrebuild.txInfo.nonce = '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen';
561
- txParams.recipients = [];
562
- const validTransaction = await basecoin.verifyTransaction({
563
- txParams,
564
- txPrebuild,
565
- memo,
566
- wallet: walletObj,
567
- });
568
- validTransaction.should.equal(true);
569
- });
570
- it('should verify create associated token account transaction', async function () {
571
- const tx = await factory
572
- .getAtaInitializationBuilder()
573
- .mint('tsol:usdc')
574
- .sender(wallet.pub)
575
- .nonce(blockHash)
576
- .memo('test memo')
577
- .fee({ amount: 5000 })
578
- .build();
579
- const txToBroadcastFormat = tx.toBroadcastFormat();
580
- const txParams = newTxParams();
581
- const txPrebuild = newTxPrebuild();
582
- txPrebuild.txBase64 = txToBroadcastFormat;
583
- txPrebuild.txInfo.nonce = blockHash;
584
- txParams.recipients = [];
585
- const validTransaction = await basecoin.verifyTransaction({
586
- txParams,
587
- txPrebuild,
588
- memo,
589
- wallet: walletObj,
590
- });
591
- validTransaction.should.equal(true);
592
- });
593
- });
594
- it('should accept valid address', function () {
595
- goodAddresses.forEach((addr) => {
596
- basecoin.isValidAddress(addr).should.equal(true);
597
- });
598
- });
599
- it('should reject invalid address', function () {
600
- badAddresses.forEach((addr) => {
601
- basecoin.isValidAddress(addr).should.equal(false);
602
- });
603
- });
604
- it('should check valid pub keys', function () {
605
- keyPair.should.have.property('pub');
606
- basecoin.isValidPub(keyPair.pub).should.equal(true);
607
- });
608
- it('should check an invalid pub keys', function () {
609
- const badPubKey = keyPair.pub.slice(0, keyPair.pub.length - 1) + '-';
610
- basecoin.isValidPub(badPubKey).should.equal(false);
611
- });
612
- it('should check valid prv keys', function () {
613
- keyPair.should.have.property('prv');
614
- basecoin.isValidPrv(keyPair.prv).should.equal(true);
615
- });
616
- it('should check an invalid prv keys', function () {
617
- const badPrvKey = keyPair.prv ? keyPair.prv.slice(0, keyPair.prv.length - 1) + '-' : undefined;
618
- basecoin.isValidPrv(badPrvKey).should.equal(false);
619
- });
620
- describe('Parse Transactions:', () => {
621
- it('should parse an unsigned transfer transaction', async function () {
622
- const parsedTransaction = await basecoin.parseTransaction({
623
- txBase64: testData.rawTransactions.transfer.unsigned,
624
- feeInfo: {
625
- fee: '5000',
626
- },
627
- });
628
- parsedTransaction.should.deepEqual({
629
- inputs: [
630
- {
631
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
632
- amount: 305000,
633
- },
634
- ],
635
- outputs: [
636
- {
637
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
638
- amount: '300000',
639
- },
640
- ],
641
- });
642
- });
643
- it('should parse a signed transfer transaction', async function () {
644
- const parsedTransaction = await basecoin.parseTransaction({
645
- txBase64: testData.rawTransactions.transfer.signed,
646
- feeInfo: {
647
- fee: '5000',
648
- },
649
- });
650
- parsedTransaction.should.deepEqual({
651
- inputs: [
652
- {
653
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
654
- amount: 305000,
655
- },
656
- ],
657
- outputs: [
658
- {
659
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
660
- amount: '300000',
661
- },
662
- ],
663
- });
664
- });
665
- it('should parse an unsigned wallet init transaction', async function () {
666
- const parsedTransaction = await basecoin.parseTransaction({
667
- txBase64: testData.rawTransactions.walletInit.unsigned,
668
- feeInfo: {
669
- fee: '5000',
670
- },
671
- });
672
- parsedTransaction.should.deepEqual({
673
- inputs: [
674
- {
675
- address: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
676
- amount: 310000,
677
- },
678
- ],
679
- outputs: [
680
- {
681
- address: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
682
- amount: '300000',
683
- },
684
- ],
685
- });
686
- });
687
- it('should parse a signed wallet init transaction', async function () {
688
- const parsedTransaction = await basecoin.parseTransaction({
689
- txBase64: testData.rawTransactions.walletInit.signed,
690
- feeInfo: {
691
- fee: '5000',
692
- },
693
- });
694
- parsedTransaction.should.deepEqual({
695
- inputs: [
696
- {
697
- address: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
698
- amount: 310000,
699
- },
700
- ],
701
- outputs: [
702
- {
703
- address: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
704
- amount: '300000',
705
- },
706
- ],
707
- });
708
- });
709
- it('should parse an unsigned transfer token transaction', async function () {
710
- const parsedTransaction = await basecoin.parseTransaction({
711
- txBase64: testData.rawTransactions.transferToken.unsigned,
712
- feeInfo: {
713
- fee: '5000',
714
- },
715
- });
716
- parsedTransaction.should.deepEqual({
717
- inputs: [
718
- {
719
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
720
- amount: 5000,
721
- },
722
- ],
723
- outputs: [
724
- {
725
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
726
- amount: '300000',
727
- tokenName: 'tsol:usdc',
728
- },
729
- ],
730
- });
731
- });
732
- it('should parse a signed transfer token transaction', async function () {
733
- const parsedTransaction = await basecoin.parseTransaction({
734
- txBase64: testData.rawTransactions.transferToken.signed,
735
- feeInfo: {
736
- fee: '5000',
737
- },
738
- });
739
- parsedTransaction.should.deepEqual({
740
- inputs: [
741
- {
742
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
743
- amount: 5000,
744
- },
745
- ],
746
- outputs: [
747
- {
748
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
749
- amount: '300000',
750
- tokenName: 'tsol:usdc',
751
- },
752
- ],
753
- });
754
- });
755
- });
756
- describe('Explain Transactions:', () => {
757
- it('should explain an unsigned transfer transaction', async function () {
758
- const explainedTransaction = await basecoin.explainTransaction({
759
- txBase64: testData.rawTransactions.transfer.unsigned,
760
- feeInfo: {
761
- fee: '5000',
762
- },
763
- });
764
- explainedTransaction.should.deepEqual({
765
- displayOrder: [
766
- 'id',
767
- 'type',
768
- 'blockhash',
769
- 'durableNonce',
770
- 'outputAmount',
771
- 'changeAmount',
772
- 'outputs',
773
- 'changeOutputs',
774
- 'tokenEnablements',
775
- 'fee',
776
- 'memo',
777
- ],
778
- id: 'UNAVAILABLE',
779
- type: 'Send',
780
- changeOutputs: [],
781
- changeAmount: '0',
782
- outputAmount: '300000',
783
- outputs: [
784
- {
785
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
786
- amount: '300000',
787
- },
788
- ],
789
- fee: {
790
- fee: '5000',
791
- feeRate: 5000,
792
- },
793
- memo: 'test memo',
794
- blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
795
- durableNonce: {
796
- authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
797
- walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
798
- },
799
- tokenEnablements: [],
800
- });
801
- });
802
- it('should explain a signed transfer transaction', async function () {
803
- const explainedTransaction = await basecoin.explainTransaction({
804
- txBase64: testData.rawTransactions.transfer.signed,
805
- feeInfo: {
806
- fee: '5000',
807
- },
808
- });
809
- explainedTransaction.should.deepEqual({
810
- displayOrder: [
811
- 'id',
812
- 'type',
813
- 'blockhash',
814
- 'durableNonce',
815
- 'outputAmount',
816
- 'changeAmount',
817
- 'outputs',
818
- 'changeOutputs',
819
- 'tokenEnablements',
820
- 'fee',
821
- 'memo',
822
- ],
823
- id: '2XFxGfXddKWnqGaMAsfNL8HgXqDvjBL2Ae28KWrRvg9bQBmCrpHYVDacuZFeAUyYwjXG6ey2jTARX5VQCnj7SF4L',
824
- type: 'Send',
825
- changeOutputs: [],
826
- changeAmount: '0',
827
- outputAmount: '300000',
828
- outputs: [
829
- {
830
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
831
- amount: '300000',
832
- },
833
- ],
834
- fee: {
835
- fee: '5000',
836
- feeRate: 5000,
837
- },
838
- memo: 'test memo',
839
- blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
840
- durableNonce: {
841
- authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
842
- walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
843
- },
844
- tokenEnablements: [],
845
- });
846
- });
847
- it('should explain an unsigned wallet init transaction', async function () {
848
- const explainedTransaction = await basecoin.explainTransaction({
849
- txBase64: testData.rawTransactions.walletInit.unsigned,
850
- feeInfo: {
851
- fee: '5000',
852
- },
853
- });
854
- explainedTransaction.should.deepEqual({
855
- displayOrder: [
856
- 'id',
857
- 'type',
858
- 'blockhash',
859
- 'durableNonce',
860
- 'outputAmount',
861
- 'changeAmount',
862
- 'outputs',
863
- 'changeOutputs',
864
- 'tokenEnablements',
865
- 'fee',
866
- 'memo',
867
- ],
868
- id: 'UNAVAILABLE',
869
- type: 'WalletInitialization',
870
- changeOutputs: [],
871
- changeAmount: '0',
872
- outputAmount: '300000',
873
- outputs: [
874
- {
875
- address: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
876
- amount: '300000',
877
- },
878
- ],
879
- fee: {
880
- fee: '10000',
881
- feeRate: 5000,
882
- },
883
- blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
884
- durableNonce: undefined,
885
- memo: undefined,
886
- tokenEnablements: [],
887
- });
888
- });
889
- it('should explain a signed wallet init transaction', async function () {
890
- const explainedTransaction = await basecoin.explainTransaction({
891
- txBase64: testData.rawTransactions.walletInit.signed,
892
- feeInfo: {
893
- fee: '5000',
894
- },
895
- });
896
- explainedTransaction.should.deepEqual({
897
- displayOrder: [
898
- 'id',
899
- 'type',
900
- 'blockhash',
901
- 'durableNonce',
902
- 'outputAmount',
903
- 'changeAmount',
904
- 'outputs',
905
- 'changeOutputs',
906
- 'tokenEnablements',
907
- 'fee',
908
- 'memo',
909
- ],
910
- id: '7TkU8wLgXDeLFbVydtg6mqMsp9GatsetitSngysgjxFhofKSUcLPBoKPHciLeGEfJFMsqezpZmGRSFQTBy7ZDsg',
911
- type: 'WalletInitialization',
912
- changeOutputs: [],
913
- changeAmount: '0',
914
- outputAmount: '300000',
915
- outputs: [
916
- {
917
- address: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
918
- amount: '300000',
919
- },
920
- ],
921
- fee: {
922
- fee: '10000',
923
- feeRate: 5000,
924
- },
925
- blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
926
- durableNonce: undefined,
927
- memo: undefined,
928
- tokenEnablements: [],
929
- });
930
- });
931
- it('should explain an unsigned token transfer transaction', async function () {
932
- const explainedTransaction = await basecoin.explainTransaction({
933
- txBase64: testData.rawTransactions.transferToken.unsigned,
934
- feeInfo: {
935
- fee: '5000',
936
- },
937
- });
938
- explainedTransaction.should.deepEqual({
939
- displayOrder: [
940
- 'id',
941
- 'type',
942
- 'blockhash',
943
- 'durableNonce',
944
- 'outputAmount',
945
- 'changeAmount',
946
- 'outputs',
947
- 'changeOutputs',
948
- 'tokenEnablements',
949
- 'fee',
950
- 'memo',
951
- ],
952
- id: 'UNAVAILABLE',
953
- type: 'Send',
954
- changeOutputs: [],
955
- changeAmount: '0',
956
- outputAmount: '0',
957
- outputs: [
958
- {
959
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
960
- amount: '300000',
961
- tokenName: 'tsol:usdc',
962
- },
963
- ],
964
- fee: {
965
- fee: '5000',
966
- feeRate: 5000,
967
- },
968
- memo: 'test memo',
969
- blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
970
- durableNonce: {
971
- authWalletAddress: '12f6D3WubGVeQoH2m8kTvvcrasWdXWwtVzUCyRNDZxA2',
972
- walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
973
- },
974
- tokenEnablements: [],
975
- });
976
- });
977
- it('should explain a signed token transfer transaction', async function () {
978
- const explainedTransaction = await basecoin.explainTransaction({
979
- txBase64: testData.rawTransactions.transferToken.signed,
980
- feeInfo: {
981
- fee: '5000',
982
- },
983
- });
984
- explainedTransaction.should.deepEqual({
985
- displayOrder: [
986
- 'id',
987
- 'type',
988
- 'blockhash',
989
- 'durableNonce',
990
- 'outputAmount',
991
- 'changeAmount',
992
- 'outputs',
993
- 'changeOutputs',
994
- 'tokenEnablements',
995
- 'fee',
996
- 'memo',
997
- ],
998
- id: '2ticU4ZkEqdTHULr6LobTgWBhim6E7wSscDhM4gzyuGUmQyUwLYhoqaifuvwmNzzEf1T5aefVcgMQkSHdJ5nsrfZ',
999
- type: 'Send',
1000
- changeOutputs: [],
1001
- changeAmount: '0',
1002
- outputAmount: '0',
1003
- outputs: [
1004
- {
1005
- address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
1006
- amount: '300000',
1007
- tokenName: 'tsol:usdc',
1008
- },
1009
- ],
1010
- fee: {
1011
- fee: '5000',
1012
- feeRate: 5000,
1013
- },
1014
- memo: 'test memo',
1015
- blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
1016
- durableNonce: {
1017
- authWalletAddress: '12f6D3WubGVeQoH2m8kTvvcrasWdXWwtVzUCyRNDZxA2',
1018
- walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
1019
- },
1020
- tokenEnablements: [],
1021
- });
1022
- });
1023
- it('should explain activate staking transaction', async function () {
1024
- const tx = await factory
1025
- .getStakingActivateBuilder()
1026
- .stakingAddress(stakeAccount.pub)
1027
- .sender(wallet.pub)
1028
- .nonce(blockHash)
1029
- .amount(amount)
1030
- .validator(validator.pub)
1031
- .memo('test memo')
1032
- .fee({ amount: 5000 })
1033
- .build();
1034
- const txToBroadcastFormat = tx.toBroadcastFormat();
1035
- const explainedTransaction = await basecoin.explainTransaction({
1036
- txBase64: txToBroadcastFormat,
1037
- feeInfo: {
1038
- fee: '5000',
1039
- },
1040
- });
1041
- explainedTransaction.should.deepEqual({
1042
- displayOrder: [
1043
- 'id',
1044
- 'type',
1045
- 'blockhash',
1046
- 'durableNonce',
1047
- 'outputAmount',
1048
- 'changeAmount',
1049
- 'outputs',
1050
- 'changeOutputs',
1051
- 'tokenEnablements',
1052
- 'fee',
1053
- 'memo',
1054
- ],
1055
- id: 'UNAVAILABLE',
1056
- type: 'StakingActivate',
1057
- changeOutputs: [],
1058
- changeAmount: '0',
1059
- outputAmount: '10000',
1060
- outputs: [
1061
- {
1062
- address: '7dRuGFbU2y2kijP6o1LYNzVyz4yf13MooqoionCzv5Za',
1063
- amount: '10000',
1064
- },
1065
- ],
1066
- fee: {
1067
- fee: '10000',
1068
- feeRate: 5000,
1069
- },
1070
- memo: 'test memo',
1071
- blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
1072
- durableNonce: undefined,
1073
- tokenEnablements: [],
1074
- });
1075
- });
1076
- it('should explain deactivate staking transaction', async function () {
1077
- const tx = await factory
1078
- .getStakingDeactivateBuilder()
1079
- .stakingAddress(stakeAccount.pub)
1080
- .sender(wallet.pub)
1081
- .nonce(blockHash)
1082
- .memo('test memo')
1083
- .fee({ amount: 5000 })
1084
- .build();
1085
- const txToBroadcastFormat = tx.toBroadcastFormat();
1086
- const explainedTransaction = await basecoin.explainTransaction({
1087
- txBase64: txToBroadcastFormat,
1088
- feeInfo: {
1089
- fee: '5000',
1090
- },
1091
- });
1092
- explainedTransaction.should.deepEqual({
1093
- displayOrder: [
1094
- 'id',
1095
- 'type',
1096
- 'blockhash',
1097
- 'durableNonce',
1098
- 'outputAmount',
1099
- 'changeAmount',
1100
- 'outputs',
1101
- 'changeOutputs',
1102
- 'tokenEnablements',
1103
- 'fee',
1104
- 'memo',
1105
- ],
1106
- id: 'UNAVAILABLE',
1107
- type: 'StakingDeactivate',
1108
- changeOutputs: [],
1109
- changeAmount: '0',
1110
- outputAmount: '0',
1111
- outputs: [],
1112
- fee: {
1113
- fee: '5000',
1114
- feeRate: 5000,
1115
- },
1116
- memo: 'test memo',
1117
- blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
1118
- durableNonce: undefined,
1119
- tokenEnablements: [],
1120
- });
1121
- });
1122
- it('should explain withdraw staking transaction', async function () {
1123
- const tx = await factory
1124
- .getStakingWithdrawBuilder()
1125
- .stakingAddress(stakeAccount.pub)
1126
- .sender(wallet.pub)
1127
- .nonce(blockHash)
1128
- .amount(amount)
1129
- .memo('test memo')
1130
- .fee({ amount: 5000 })
1131
- .build();
1132
- const txToBroadcastFormat = tx.toBroadcastFormat();
1133
- const explainedTransaction = await basecoin.explainTransaction({
1134
- txBase64: txToBroadcastFormat,
1135
- feeInfo: {
1136
- fee: '5000',
1137
- },
1138
- });
1139
- explainedTransaction.should.deepEqual({
1140
- displayOrder: [
1141
- 'id',
1142
- 'type',
1143
- 'blockhash',
1144
- 'durableNonce',
1145
- 'outputAmount',
1146
- 'changeAmount',
1147
- 'outputs',
1148
- 'changeOutputs',
1149
- 'tokenEnablements',
1150
- 'fee',
1151
- 'memo',
1152
- ],
1153
- id: 'UNAVAILABLE',
1154
- type: 'StakingWithdraw',
1155
- changeOutputs: [],
1156
- changeAmount: '0',
1157
- outputAmount: '10000',
1158
- outputs: [
1159
- {
1160
- address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
1161
- amount: '10000',
1162
- },
1163
- ],
1164
- fee: {
1165
- fee: '5000',
1166
- feeRate: 5000,
1167
- },
1168
- memo: 'test memo',
1169
- blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
1170
- durableNonce: undefined,
1171
- tokenEnablements: [],
1172
- });
1173
- });
1174
- it('should explain create ATA transaction', async function () {
1175
- const tokenName = 'tsol:usdc';
1176
- const rentExemptAmount = '3000000';
1177
- const tx = await factory
1178
- .getAtaInitializationBuilder()
1179
- .sender(wallet.pub)
1180
- .nonce(blockHash)
1181
- .mint(tokenName)
1182
- .rentExemptAmount(rentExemptAmount)
1183
- .memo('test memo')
1184
- .fee({ amount: 5000 })
1185
- .build();
1186
- const txToBroadcastFormat = tx.toBroadcastFormat();
1187
- const explainedTransaction = await basecoin.explainTransaction({
1188
- txBase64: txToBroadcastFormat,
1189
- feeInfo: {
1190
- fee: '5000',
1191
- },
1192
- tokenAccountRentExemptAmount: rentExemptAmount,
1193
- });
1194
- explainedTransaction.should.deepEqual({
1195
- displayOrder: [
1196
- 'id',
1197
- 'type',
1198
- 'blockhash',
1199
- 'durableNonce',
1200
- 'outputAmount',
1201
- 'changeAmount',
1202
- 'outputs',
1203
- 'changeOutputs',
1204
- 'tokenEnablements',
1205
- 'fee',
1206
- 'memo',
1207
- ],
1208
- id: 'UNAVAILABLE',
1209
- type: 'AssociatedTokenAccountInitialization',
1210
- changeOutputs: [],
1211
- changeAmount: '0',
1212
- outputAmount: '0',
1213
- outputs: [],
1214
- fee: {
1215
- fee: '3005000',
1216
- feeRate: 5000,
1217
- },
1218
- memo: 'test memo',
1219
- blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
1220
- durableNonce: undefined,
1221
- tokenEnablements: [
1222
- {
1223
- address: '141BFNem3pknc8CzPVLv1Ri3btgKdCsafYP5nXwmXfxU',
1224
- tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
1225
- tokenName: 'tsol:usdc',
1226
- },
1227
- ],
1228
- });
1229
- });
1230
- it('should explain create multi ATA transaction', async function () {
1231
- const recipients = [
1232
- {
1233
- ownerAddress: wallet.pub,
1234
- tokenName: 'tsol:usdc',
1235
- },
1236
- {
1237
- ownerAddress: durableNonce.walletNonceAddress,
1238
- tokenName: 'tsol:ray',
1239
- },
1240
- ];
1241
- const rentExemptAmount = '3000000';
1242
- const tx = await factory
1243
- .getAtaInitializationBuilder()
1244
- .sender(wallet.pub)
1245
- .nonce(blockHash)
1246
- .enableToken(recipients[0])
1247
- .enableToken(recipients[1])
1248
- .rentExemptAmount(rentExemptAmount)
1249
- .memo('test memo')
1250
- .fee({ amount: 5000 })
1251
- .build();
1252
- const txToBroadcastFormat = tx.toBroadcastFormat();
1253
- const explainedTransaction = await basecoin.explainTransaction({
1254
- txBase64: txToBroadcastFormat,
1255
- feeInfo: {
1256
- fee: '5000',
1257
- },
1258
- tokenAccountRentExemptAmount: rentExemptAmount,
1259
- });
1260
- explainedTransaction.should.deepEqual({
1261
- displayOrder: [
1262
- 'id',
1263
- 'type',
1264
- 'blockhash',
1265
- 'durableNonce',
1266
- 'outputAmount',
1267
- 'changeAmount',
1268
- 'outputs',
1269
- 'changeOutputs',
1270
- 'tokenEnablements',
1271
- 'fee',
1272
- 'memo',
1273
- ],
1274
- id: 'UNAVAILABLE',
1275
- type: 'AssociatedTokenAccountInitialization',
1276
- changeOutputs: [],
1277
- changeAmount: '0',
1278
- outputAmount: '0',
1279
- outputs: [],
1280
- fee: {
1281
- fee: '6005000',
1282
- feeRate: 5000,
1283
- },
1284
- memo: 'test memo',
1285
- blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
1286
- durableNonce: undefined,
1287
- tokenEnablements: [
1288
- {
1289
- address: '141BFNem3pknc8CzPVLv1Ri3btgKdCsafYP5nXwmXfxU',
1290
- tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
1291
- tokenName: 'tsol:usdc',
1292
- },
1293
- {
1294
- address: '9KaLinZFNW5chL4J8UoKnTECppWVMz3ewgx4FAkxUDcf',
1295
- tokenAddress: '9kLJoGbMgSteptkhKKuh7ken4JEvHrT83157ezEGrZ7R',
1296
- tokenName: 'tsol:ray',
1297
- },
1298
- ],
1299
- });
1300
- });
1301
- it('should explain an unsigned token transfer with ATA creation transaction', async function () {
1302
- const explainedTransaction = await basecoin.explainTransaction({
1303
- txBase64: testData.rawTransactions.tokenTransferWithAtaCreation.unsigned,
1304
- feeInfo: {
1305
- fee: '5000',
1306
- },
1307
- tokenAccountRentExemptAmount: '3000000',
1308
- });
1309
- explainedTransaction.should.deepEqual({
1310
- displayOrder: [
1311
- 'id',
1312
- 'type',
1313
- 'blockhash',
1314
- 'durableNonce',
1315
- 'outputAmount',
1316
- 'changeAmount',
1317
- 'outputs',
1318
- 'changeOutputs',
1319
- 'tokenEnablements',
1320
- 'fee',
1321
- 'memo',
1322
- ],
1323
- id: 'UNAVAILABLE',
1324
- type: 'Send',
1325
- changeOutputs: [],
1326
- changeAmount: '0',
1327
- outputAmount: '0',
1328
- outputs: [
1329
- {
1330
- address: '2eKjVtzV3oPTXFdtRSDj3Em9k1MV7k8WjKkBszQUwizS',
1331
- amount: '10000',
1332
- tokenName: 'tsol:usdc',
1333
- },
1334
- ],
1335
- fee: { fee: '3005000', feeRate: 5000 },
1336
- memo: undefined,
1337
- blockhash: '27E3MXFvXMUNYeMJeX1pAbERGsJfUbkaZTfgMgpmNN5g',
1338
- durableNonce: undefined,
1339
- tokenEnablements: [
1340
- {
1341
- address: '2eKjVtzV3oPTXFdtRSDj3Em9k1MV7k8WjKkBszQUwizS',
1342
- tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
1343
- tokenName: 'tsol:usdc',
1344
- },
1345
- ],
1346
- });
1347
- });
1348
- });
1349
- describe('Keypair:', () => {
1350
- it('should generate a keypair from random seed', function () {
1351
- should.throws(() => basecoin.generateKeyPair('placeholder'), 'generateKeyPair method not implemented');
1352
- });
1353
- it('should generate a keypair from a seed', function () {
1354
- should.throws(() => basecoin.generateKeyPair('placeholder'), 'generateKeyPair method not implemented');
1355
- });
1356
- });
1357
- describe('Sign transaction:', () => {
1358
- it('should sign transaction', async function () {
1359
- const signed = await basecoin.signTransaction({
1360
- txPrebuild: {
1361
- txBase64: resources.RAW_TX_UNSIGNED,
1362
- keys: [resources.accountWithSeed.publicKey.toString()],
1363
- },
1364
- prv: resources.accountWithSeed.privateKey.base58,
1365
- });
1366
- signed.txHex.should.equal(resources.RAW_TX_SIGNED);
1367
- });
1368
- it('should handle txHex and txBase64 interchangeably', async function () {
1369
- const signed = await basecoin.signTransaction({
1370
- txPrebuild: {
1371
- txHex: resources.RAW_TX_UNSIGNED,
1372
- keys: [resources.accountWithSeed.publicKey.toString()],
1373
- },
1374
- prv: resources.accountWithSeed.privateKey.base58,
1375
- });
1376
- signed.txHex.should.equal(resources.RAW_TX_SIGNED);
1377
- });
1378
- it('should throw invalid transaction when sign with public key', async function () {
1379
- await basecoin
1380
- .signTransaction({
1381
- txPrebuild: {
1382
- txBase64: resources.RAW_TX_UNSIGNED,
1383
- keys: [resources.accountWithSeed.publicKey.toString()],
1384
- },
1385
- prv: resources.accountWithSeed.publicKey,
1386
- })
1387
- .should.be.rejectedWith('Invalid key');
1388
- });
1389
- });
1390
- describe('Sign message', () => {
1391
- it('should sign message', async function () {
1392
- const signed = await basecoin.signMessage(keypair, 'signed message');
1393
- signed
1394
- .toString('base64')
1395
- .should.equal('s+7d/8aW/twfM/0wLSKOGxd9+LhDIiz/g0FfJ39ylJhQIkjK0RYPm/Y+gdeJ5DIy6K6h6gCXXESDomlv12DBBQ==');
1396
- });
1397
- it('shouldnt sign message when message is undefined', async function () {
1398
- await basecoin
1399
- .signMessage(keypair, undefined)
1400
- .should.be.rejectedWith('The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined');
1401
- });
1402
- });
1403
- describe('Get Signing Payload', () => {
1404
- it('should return a valid signing payload', async function () {
1405
- const factory = (0, getBuilderFactory_1.getBuilderFactory)(basecoin.getChain());
1406
- const rebuiltSignablePayload = (await factory.from(resources.TRANSFER_UNSIGNED_TX_WITH_MEMO).build())
1407
- .signablePayload;
1408
- const signingPayload = await basecoin.getSignablePayload(resources.TRANSFER_UNSIGNED_TX_WITH_MEMO);
1409
- signingPayload.should.be.deepEqual(rebuiltSignablePayload);
1410
- });
1411
- it('should build CloseAssociatedTokenAccount txn builder from raw txn', async function () {
1412
- const factory = (0, getBuilderFactory_1.getBuilderFactory)(basecoin.getChain());
1413
- const txnBuilder = factory.from(resources.TRANSFER_UNSIGNED_TX_CLOSE_ATA);
1414
- assert_1.default.ok(txnBuilder);
1415
- });
1416
- });
1417
- describe('Presign transaction', () => {
1418
- const txRequestId = 'txRequestId';
1419
- let sandbox;
1420
- beforeEach(() => {
1421
- sandbox = sinon.createSandbox();
1422
- });
1423
- afterEach(() => {
1424
- sandbox.verifyAndRestore();
1425
- });
1426
- it('should rebuild tx request for hot wallets', async () => {
1427
- const rebuiltTx = {
1428
- txRequestId,
1429
- unsignedTxs: [
1430
- {
1431
- serializedTxHex: 'deadbeef',
1432
- signableHex: 'serializedTxHex',
1433
- derivationPath: 'm/0',
1434
- },
1435
- ],
1436
- transactions: [],
1437
- date: new Date().toISOString(),
1438
- intent: {
1439
- intentType: 'payment',
1440
- },
1441
- latest: true,
1442
- state: 'pendingUserSignature',
1443
- walletType: 'hot',
1444
- walletId: 'walletId',
1445
- policiesChecked: true,
1446
- version: 1,
1447
- userId: 'userId',
1448
- };
1449
- const stubTssUtils = sandbox.createStubInstance(sdk_core_1.TssUtils);
1450
- stubTssUtils.deleteSignatureShares.resolves([]);
1451
- stubTssUtils.getTxRequest.resolves(rebuiltTx);
1452
- const hotWallet = {
1453
- type: 'hot',
1454
- };
1455
- const presignedTransaction = await basecoin.presignTransaction({
1456
- walletData: hotWallet,
1457
- tssUtils: stubTssUtils,
1458
- txPrebuild: {
1459
- txRequestId,
1460
- },
1461
- });
1462
- presignedTransaction.walletData.should.deepEqual(hotWallet);
1463
- presignedTransaction.txPrebuild.should.deepEqual(rebuiltTx);
1464
- presignedTransaction.txHex.should.equal(rebuiltTx.unsignedTxs[0].serializedTxHex);
1465
- });
1466
- it('should do nothing for non-hot wallets', async () => {
1467
- const coldWallet = {
1468
- type: 'cold',
1469
- };
1470
- const presignedTransaction = await basecoin.presignTransaction({
1471
- walletData: coldWallet,
1472
- });
1473
- presignedTransaction.should.deepEqual({
1474
- walletData: coldWallet,
1475
- });
1476
- });
1477
- it('should error if txRequestId is missing', async () => {
1478
- const hotWallet = {
1479
- type: 'hot',
1480
- };
1481
- await basecoin
1482
- .presignTransaction({
1483
- walletData: hotWallet,
1484
- txPrebuild: {},
1485
- })
1486
- .should.rejectedWith('Missing txRequestId');
1487
- });
1488
- });
1489
- describe('API Key parameter:', () => {
1490
- // Test the getPublicNodeUrl method directly
1491
- it('should append apiKey to node URL when provided', function () {
1492
- // Access the protected method using type casting
1493
- const url = basecoin.getPublicNodeUrl('test-api-key-123');
1494
- url.should.equal(`${sdk_core_1.Environments.test.solAlchemyNodeUrl}/test-api-key-123`);
1495
- });
1496
- it('should use regular node URL when apiKey is not provided', function () {
1497
- // Access the protected method using type casting
1498
- const url = basecoin.getPublicNodeUrl();
1499
- url.should.equal(sdk_core_1.Environments.test.solNodeUrl);
1500
- });
1501
- });
1502
- describe('Recover Transactions:', () => {
1503
- const sandBox = sinon.createSandbox();
1504
- const coin = statics_1.coins.get('tsol');
1505
- const usdtMintAddress = '9cgpBeNZ2HnLda7NWaaU1i3NyTstk2c4zCMUcoAGsi9C';
1506
- const t22mintAddress = '5NR1bQwLWqjbkhbQ1hx72HKJybbuvwkDnUZNoAZ2VhW6';
1507
- let callBack;
1508
- beforeEach(() => {
1509
- callBack = sandBox.stub(src_1.Sol.prototype, 'getDataFromNode');
1510
- callBack
1511
- .withArgs({
1512
- payload: {
1513
- id: '1',
1514
- jsonrpc: '2.0',
1515
- method: 'getLatestBlockhash',
1516
- params: [
1517
- {
1518
- commitment: 'finalized',
1519
- },
1520
- ],
1521
- },
1522
- })
1523
- .resolves(testData.SolResponses.getBlockhashResponse);
1524
- callBack
1525
- .withArgs({
1526
- payload: {
1527
- id: '1',
1528
- jsonrpc: '2.0',
1529
- method: 'getFeeForMessage',
1530
- params: [
1531
- sinon.match.string,
1532
- {
1533
- commitment: 'finalized',
1534
- },
1535
- ],
1536
- },
1537
- })
1538
- .resolves(testData.SolResponses.getFeesForMessageResponse);
1539
- callBack
1540
- .withArgs({
1541
- payload: {
1542
- id: '1',
1543
- jsonrpc: '2.0',
1544
- method: 'getMinimumBalanceForRentExemption',
1545
- params: [165],
1546
- },
1547
- })
1548
- .resolves(testData.SolResponses.getMinimumBalanceForRentExemptionResponse);
1549
- callBack
1550
- .withArgs({
1551
- payload: {
1552
- id: '1',
1553
- jsonrpc: '2.0',
1554
- method: 'getBalance',
1555
- params: [testData.accountInfo.bs58EncodedPublicKey],
1556
- },
1557
- })
1558
- .resolves(testData.SolResponses.getAccountBalanceResponse);
1559
- callBack
1560
- .withArgs({
1561
- payload: {
1562
- id: '1',
1563
- jsonrpc: '2.0',
1564
- method: 'getBalance',
1565
- params: [testData.accountInfo.bs58EncodedPublicKeyNoFunds],
1566
- },
1567
- })
1568
- .resolves(testData.SolResponses.getAccountBalanceResponseNoFunds);
1569
- callBack
1570
- .withArgs({
1571
- payload: {
1572
- id: '1',
1573
- jsonrpc: '2.0',
1574
- method: 'getBalance',
1575
- params: [testData.accountInfo.bs58EncodedPublicKeyM1Derivation],
1576
- },
1577
- })
1578
- .resolves(testData.SolResponses.getAccountBalanceResponseM1Derivation);
1579
- callBack
1580
- .withArgs({
1581
- payload: {
1582
- id: '1',
1583
- jsonrpc: '2.0',
1584
- method: 'getBalance',
1585
- params: [testData.accountInfo.bs58EncodedPublicKeyM2Derivation],
1586
- },
1587
- })
1588
- .resolves(testData.SolResponses.getAccountBalanceResponseM2Derivation);
1589
- callBack
1590
- .withArgs({
1591
- payload: {
1592
- id: '1',
1593
- jsonrpc: '2.0',
1594
- method: 'getBalance',
1595
- params: [testData.accountInfo.bs58EncodedPublicKeyWithManyTokens],
1596
- },
1597
- })
1598
- .resolves(testData.SolResponses.getAccountBalanceResponseM2Derivation);
1599
- callBack
1600
- .withArgs({
1601
- payload: {
1602
- id: '1',
1603
- jsonrpc: '2.0',
1604
- method: 'getBalance',
1605
- params: [testData.closeATAkeys.closeAtaAddress],
1606
- },
1607
- })
1608
- .resolves(testData.SolResponses.getAccountBalanceResponseM2Derivation);
1609
- callBack
1610
- .withArgs({
1611
- payload: {
1612
- id: '1',
1613
- jsonrpc: '2.0',
1614
- method: 'getBalance',
1615
- params: [testData.closeATAkeys.bs58EncodedPublicKey],
1616
- },
1617
- })
1618
- .resolves(testData.SolResponses.getAccountBalanceResponseM2Derivation);
1619
- callBack
1620
- .withArgs({
1621
- payload: {
1622
- id: '1',
1623
- jsonrpc: '2.0',
1624
- method: 'getAccountInfo',
1625
- params: [
1626
- testData.closeATAkeys.closeAtaAddress,
1627
- {
1628
- encoding: 'jsonParsed',
1629
- },
1630
- ],
1631
- },
1632
- })
1633
- .resolves(testData.SolResponses.getTokenInfoResponse);
1634
- callBack
1635
- .withArgs({
1636
- payload: {
1637
- id: '1',
1638
- jsonrpc: '2.0',
1639
- method: 'getAccountInfo',
1640
- params: [
1641
- testData.keys.durableNoncePubKey,
1642
- {
1643
- encoding: 'jsonParsed',
1644
- },
1645
- ],
1646
- },
1647
- })
1648
- .resolves(testData.SolResponses.getAccountInfoResponse);
1649
- callBack
1650
- .withArgs({
1651
- payload: {
1652
- id: '1',
1653
- jsonrpc: '2.0',
1654
- method: 'getTokenAccountsByOwner',
1655
- params: [
1656
- testData.keys.destinationPubKey,
1657
- {
1658
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
1659
- },
1660
- {
1661
- encoding: 'jsonParsed',
1662
- },
1663
- ],
1664
- },
1665
- })
1666
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponseNoAccounts);
1667
- callBack
1668
- .withArgs({
1669
- payload: {
1670
- id: '1',
1671
- jsonrpc: '2.0',
1672
- method: 'getTokenAccountsByOwner',
1673
- params: [
1674
- testData.accountInfo.bs58EncodedPublicKey,
1675
- {
1676
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
1677
- },
1678
- {
1679
- encoding: 'jsonParsed',
1680
- },
1681
- ],
1682
- },
1683
- })
1684
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponseNoAccounts);
1685
- callBack
1686
- .withArgs({
1687
- payload: {
1688
- id: '1',
1689
- jsonrpc: '2.0',
1690
- method: 'getTokenAccountsByOwner',
1691
- params: [
1692
- testData.keys.destinationPubKey2,
1693
- {
1694
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
1695
- },
1696
- {
1697
- encoding: 'jsonParsed',
1698
- },
1699
- ],
1700
- },
1701
- })
1702
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponse);
1703
- callBack
1704
- .withArgs({
1705
- payload: {
1706
- id: '1',
1707
- jsonrpc: '2.0',
1708
- method: 'getTokenAccountsByOwner',
1709
- params: [
1710
- testData.keys.destinationPubKey2,
1711
- {
1712
- programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',
1713
- },
1714
- {
1715
- encoding: 'jsonParsed',
1716
- },
1717
- ],
1718
- },
1719
- })
1720
- .resolves(testData.SolResponses.getTokenAccountsByOwnerForSol2022Response2);
1721
- callBack
1722
- .withArgs({
1723
- payload: {
1724
- id: '1',
1725
- jsonrpc: '2.0',
1726
- method: 'getTokenAccountsByOwner',
1727
- params: [
1728
- testData.wrwUser.walletAddress0,
1729
- {
1730
- programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',
1731
- },
1732
- {
1733
- encoding: 'jsonParsed',
1734
- },
1735
- ],
1736
- },
1737
- })
1738
- .resolves(testData.SolResponses.getTokenAccountsByOwnerForSol2022Response);
1739
- callBack
1740
- .withArgs({
1741
- payload: {
1742
- id: '1',
1743
- jsonrpc: '2.0',
1744
- method: 'getTokenAccountsByOwner',
1745
- params: [
1746
- testData.wrwUser.walletAddress0,
1747
- {
1748
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
1749
- },
1750
- {
1751
- encoding: 'jsonParsed',
1752
- },
1753
- ],
1754
- },
1755
- })
1756
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponse2);
1757
- callBack
1758
- .withArgs({
1759
- payload: {
1760
- id: '1',
1761
- jsonrpc: '2.0',
1762
- method: 'getTokenAccountsByOwner',
1763
- params: [
1764
- testData.wrwUser.walletAddress4,
1765
- {
1766
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
1767
- },
1768
- {
1769
- encoding: 'jsonParsed',
1770
- },
1771
- ],
1772
- },
1773
- })
1774
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponse3);
1775
- callBack
1776
- .withArgs({
1777
- payload: {
1778
- id: '1',
1779
- jsonrpc: '2.0',
1780
- method: 'getBalance',
1781
- params: [testData.wrwUser.walletAddress0],
1782
- },
1783
- })
1784
- .resolves(testData.SolResponses.getAccountBalanceResponse);
1785
- callBack
1786
- .withArgs({
1787
- payload: {
1788
- id: '1',
1789
- jsonrpc: '2.0',
1790
- method: 'getTokenAccountsByOwner',
1791
- params: [
1792
- testData.keys.destinationPubKey,
1793
- {
1794
- programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',
1795
- },
1796
- {
1797
- encoding: 'jsonParsed',
1798
- },
1799
- ],
1800
- },
1801
- })
1802
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponseNoAccounts);
1803
- callBack
1804
- .withArgs({
1805
- payload: {
1806
- id: '1',
1807
- jsonrpc: '2.0',
1808
- method: 'sendTransaction',
1809
- params: sinon.match.array,
1810
- },
1811
- })
1812
- .onCall(0)
1813
- .resolves(testData.SolResponses.broadcastTransactionResponse)
1814
- .onCall(1)
1815
- .resolves(testData.SolResponses.broadcastTransactionResponse1);
1816
- });
1817
- afterEach(() => {
1818
- sandBox.restore();
1819
- });
1820
- it('should take OVC output and generate a signed sweep transaction', async function () {
1821
- const params = testData.ovcResponse;
1822
- const recoveryTxn = await basecoin.createBroadcastableSweepTransaction(params);
1823
- recoveryTxn.transactions[0].serializedTx.should.equal('AvR+L909kzRq6NuaUe9F6Jt97MOiFs7jpW8MuOrwz4EbKF40d31dci/bgLTq4gpk/Hh3s5cA8FtbLkDQr15PqAE7yd8LOXvsLtO2REqMM/OCZ8wItfsqfTfia2xIfibRW3wHgw63jiaojbXeSqaYajJ/Ca7YwBUz5blydI3fYLgPAgECBsLVtfT7mpvNii8wPk0G942N7TAHE/RW2iq/8LPqAYWqBRo0vIrNQ4djl2+Wh2EVBQ9zgoVTVm0RHXrIv/6/WHxPX1mHv+JqpmAT79ltNjYPK0M2yR+ZMln7VgUTBWFNQvLqE/j/nXlY2/JpxuNr/fXLXEPeS04dPvt9qz1dAoYEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGp9UXGSxWjuCKhF9z0peIzwNcMUWyGrNE2AYuqUAAADpiH20cxLj7KnOaoI5ANNoPxYjs472FdjDeMPft3kXdAgQDAgUBBAQAAAAEAgADDAIAAADwopo7AAAAAA==');
1824
- (recoveryTxn.transactions[0].scanIndex ?? 0).should.equal(0);
1825
- (recoveryTxn.lastScanIndex ?? 0).should.equal(0);
1826
- });
1827
- it('should take sol 2022 token OVC output and generate a signed sweep transaction', async function () {
1828
- const params = testData.ovcResponse;
1829
- const recoveryTxn = await basecoin.createBroadcastableSweepTransaction(params);
1830
- recoveryTxn.transactions[0].serializedTx.should.equal('AvR+L909kzRq6NuaUe9F6Jt97MOiFs7jpW8MuOrwz4EbKF40d31dci/bgLTq4gpk/Hh3s5cA8FtbLkDQr15PqAE7yd8LOXvsLtO2REqMM/OCZ8wItfsqfTfia2xIfibRW3wHgw63jiaojbXeSqaYajJ/Ca7YwBUz5blydI3fYLgPAgECBsLVtfT7mpvNii8wPk0G942N7TAHE/RW2iq/8LPqAYWqBRo0vIrNQ4djl2+Wh2EVBQ9zgoVTVm0RHXrIv/6/WHxPX1mHv+JqpmAT79ltNjYPK0M2yR+ZMln7VgUTBWFNQvLqE/j/nXlY2/JpxuNr/fXLXEPeS04dPvt9qz1dAoYEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGp9UXGSxWjuCKhF9z0peIzwNcMUWyGrNE2AYuqUAAADpiH20cxLj7KnOaoI5ANNoPxYjs472FdjDeMPft3kXdAgQDAgUBBAQAAAAEAgADDAIAAADwopo7AAAAAA==');
1831
- (recoveryTxn.transactions[0].scanIndex ?? 0).should.equal(0);
1832
- (recoveryTxn.lastScanIndex ?? 0).should.equal(0);
1833
- });
1834
- it('should take consolidation OVC output and generate multiple signed sweep transactions', async function () {
1835
- const params = testData.ovcResponse2;
1836
- const recoveryTxn = await basecoin.createBroadcastableSweepTransaction(params);
1837
- recoveryTxn.transactions[0].serializedTx.should.equal('AtQPLzOmLuKwHY6N5XoJIZK/T7W10uYWm/MRte3GFUdl+w3gHLjSa9H66WSfFNubQxIPckxJDyltkP7ksLDf9QgBNJM2UWbBUH5wT0JJHILlhCs33HX8DeE/8Tdsw6tGfZoMhCnSKv6TPWtBxy7Sb6sW8ksCUPnAWuHGGKmgjEMBAgECBmLrqxJrY2kbN/tcrQw3P8P15OljFGabFJAKBrUO1grNBRo0vIrNQ4djl2+Wh2EVBQ9zgoVTVm0RHXrIv/6/WHxPX1mHv+JqpmAT79ltNjYPK0M2yR+ZMln7VgUTBWFNQsLVtfT7mpvNii8wPk0G942N7TAHE/RW2iq/8LPqAYWqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGp9UXGSxWjuCKhF9z0peIzwNcMUWyGrNE2AYuqUAAAIZQniiS73D6mwfpnfhVMC4lyYJtRSrmoZpF7yIlUdIDAgQDAgUBBAQAAAAEAgADDAIAAADwPc0dAAAAAA==');
1838
- (recoveryTxn.transactions[0].scanIndex ?? 0).should.equal(1);
1839
- recoveryTxn.transactions[1].serializedTx.should.equal('AuLhOA5zmOBZR85lo+nKdTopVwJAMrMp6NW+8UnGNsSBSpBkqfWZQqSg9s+7aTlXezm5vxol+Pl6t7PpVNTOHwLcp9xJp3TFHdivEbhwJKldR4Ny+pasoFx+Bgk8q6g1iNiq7XSi1Ov3bs7euMkTj7nDRFqP8lv7xLTcvrBm9OQJAgECBp14ImBCdmVROlw0UveYS1MvG/ljCRI3MJTFmsxuXEoWBRo0vIrNQ4djl2+Wh2EVBQ9zgoVTVm0RHXrIv/6/WHw0hyxvpVwtIx9/zeX2O16eTrY+aKIh1mdKg4MMg0eyxMLVtfT7mpvNii8wPk0G942N7TAHE/RW2iq/8LPqAYWqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGp9UXGSxWjuCKhF9z0peIzwNcMUWyGrNE2AYuqUAAAC7ws1XFslinwgtpISUViVWIVTHyD2Q0qj24YjKmrAmXAgQDAgUBBAQAAAAEAgADDAIAAADwPc0dAAAAAA==');
1840
- (recoveryTxn.transactions[1].scanIndex ?? 0).should.equal(2);
1841
- (recoveryTxn.lastScanIndex ?? 0).should.equal(20);
1842
- });
1843
- it('should recover a txn for non-bitgo recoveries (latest blockhash)', async function () {
1844
- // Latest Blockhash Recovery (BitGo-less)
1845
- const latestBlockHashTxn = await basecoin.recover({
1846
- userKey: testData.keys.userKey,
1847
- backupKey: testData.keys.backupKey,
1848
- bitgoKey: testData.keys.bitgoKey,
1849
- recoveryDestination: testData.keys.destinationPubKey,
1850
- walletPassphrase: testData.keys.walletPassword,
1851
- });
1852
- latestBlockHashTxn.should.not.be.empty();
1853
- latestBlockHashTxn.should.hasOwnProperty('serializedTx');
1854
- latestBlockHashTxn.should.hasOwnProperty('scanIndex');
1855
- should.equal(latestBlockHashTxn.scanIndex, 0);
1856
- const latestBlockhashTxnDeserialize = new lib_1.Transaction(coin);
1857
- latestBlockhashTxnDeserialize.fromRawTransaction(latestBlockHashTxn.serializedTx);
1858
- const latestBlockhashTxnJson = latestBlockhashTxnDeserialize.toJson();
1859
- should.equal(latestBlockhashTxnJson.nonce, testData.SolInputData.blockhash);
1860
- should.equal(latestBlockhashTxnJson.feePayer, testData.accountInfo.bs58EncodedPublicKey);
1861
- should.equal(latestBlockhashTxnJson.numSignatures, testData.SolInputData.latestBlockhashSignatures);
1862
- const solCoin = basecoin;
1863
- sandBox.assert.callCount(solCoin.getDataFromNode, 3);
1864
- });
1865
- it('should recover a txn for non-bitgo recoveries (durable nonce)', async function () {
1866
- // Durable Nonce Recovery (BitGo-less)
1867
- const durableNonceTxn = await basecoin.recover({
1868
- userKey: testData.keys.userKey,
1869
- backupKey: testData.keys.backupKey,
1870
- bitgoKey: testData.keys.bitgoKey,
1871
- recoveryDestination: testData.keys.destinationPubKey,
1872
- walletPassphrase: testData.keys.walletPassword,
1873
- durableNonce: {
1874
- publicKey: testData.keys.durableNoncePubKey,
1875
- secretKey: testData.keys.durableNoncePrivKey,
1876
- },
1877
- });
1878
- durableNonceTxn.should.not.be.empty();
1879
- durableNonceTxn.should.hasOwnProperty('serializedTx');
1880
- durableNonceTxn.should.hasOwnProperty('scanIndex');
1881
- should.equal(durableNonceTxn.scanIndex, 0);
1882
- const durableNonceTxnDeserialize = new lib_1.Transaction(coin);
1883
- durableNonceTxnDeserialize.fromRawTransaction(durableNonceTxn.serializedTx);
1884
- const durableNonceTxnJson = durableNonceTxnDeserialize.toJson();
1885
- should.equal(durableNonceTxnJson.nonce, testData.SolInputData.durableNonceBlockhash);
1886
- should.equal(durableNonceTxnJson.feePayer, testData.accountInfo.bs58EncodedPublicKey);
1887
- should.equal(durableNonceTxnJson.numSignatures, testData.SolInputData.durableNonceSignatures);
1888
- const solCoin = basecoin;
1889
- sandBox.assert.callCount(solCoin.getDataFromNode, 4);
1890
- });
1891
- it('should recover a txn for unsigned sweep recoveries', async function () {
1892
- // Unsigned Sweep Recovery
1893
- const unsignedSweepTxn = (await basecoin.recover({
1894
- bitgoKey: testData.keys.bitgoKey,
1895
- recoveryDestination: testData.keys.destinationPubKey,
1896
- durableNonce: {
1897
- publicKey: testData.keys.durableNoncePubKey,
1898
- secretKey: testData.keys.durableNoncePrivKey,
1899
- },
1900
- }));
1901
- unsignedSweepTxn.should.not.be.empty();
1902
- unsignedSweepTxn.txRequests[0].transactions[0].unsignedTx.should.hasOwnProperty('serializedTx');
1903
- unsignedSweepTxn.txRequests[0].transactions[0].unsignedTx.should.hasOwnProperty('scanIndex');
1904
- should.equal(unsignedSweepTxn.txRequests[0].transactions[0].unsignedTx.scanIndex, 0);
1905
- const unsignedSweepTxnDeserialize = new lib_1.Transaction(coin);
1906
- unsignedSweepTxnDeserialize.fromRawTransaction(unsignedSweepTxn.txRequests[0].transactions[0].unsignedTx.serializedTx);
1907
- const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
1908
- should.equal(unsignedSweepTxnJson.nonce, testData.SolInputData.durableNonceBlockhash);
1909
- should.equal(unsignedSweepTxnJson.feePayer, testData.accountInfo.bs58EncodedPublicKey);
1910
- should.equal(unsignedSweepTxnJson.numSignatures, testData.SolInputData.unsignedSweepSignatures);
1911
- const solCoin = basecoin;
1912
- sandBox.assert.callCount(solCoin.getDataFromNode, 4);
1913
- });
1914
- it('should handle error in recover function if a required field is missing/incorrect', async function () {
1915
- // missing userkey
1916
- await basecoin
1917
- .recover({
1918
- backupKey: testData.keys.backupKey,
1919
- bitgoKey: testData.keys.bitgoKey,
1920
- recoveryDestination: testData.keys.destinationPubKey,
1921
- walletPassphrase: testData.keys.walletPassword,
1922
- })
1923
- .should.rejectedWith('missing userKey');
1924
- // missing backupkey
1925
- await basecoin
1926
- .recover({
1927
- userKey: testData.keys.userKey,
1928
- bitgoKey: testData.keys.bitgoKey,
1929
- recoveryDestination: testData.keys.destinationPubKey,
1930
- walletPassphrase: testData.keys.walletPassword,
1931
- })
1932
- .should.rejectedWith('missing backupKey');
1933
- // missing wallet passphrase
1934
- await basecoin
1935
- .recover({
1936
- userKey: testData.keys.userKey,
1937
- backupKey: testData.keys.backupKey,
1938
- bitgoKey: testData.keys.bitgoKey,
1939
- recoveryDestination: testData.keys.destinationPubKey,
1940
- })
1941
- .should.rejectedWith('missing wallet passphrase');
1942
- // incorrect wallet passphrase, user key, backup key combination
1943
- await basecoin
1944
- .recover({
1945
- userKey: testData.keys.userKey,
1946
- backupKey: testData.keys.backupKey,
1947
- bitgoKey: testData.keys.bitgoKey,
1948
- recoveryDestination: testData.keys.destinationPubKey,
1949
- walletPassphrase: testData.keys.walletPassword + 'incorrect',
1950
- })
1951
- .should.rejectedWith("Error decrypting user keychain: password error - ccm: tag doesn't match");
1952
- // no wallet with sufficient funds
1953
- await basecoin
1954
- .recover({
1955
- userKey: testData.keys.userKey,
1956
- backupKey: testData.keys.backupKey,
1957
- bitgoKey: testData.keys.bitgoKeyNoFunds,
1958
- recoveryDestination: testData.keys.destinationPubKey,
1959
- walletPassphrase: testData.keys.walletPassword,
1960
- })
1961
- .should.rejectedWith('Did not find address with funds to recover');
1962
- });
1963
- it('should recover sol tokens to recovery destination with no existing token accounts', async function () {
1964
- const tokenTxn = await basecoin.recover({
1965
- userKey: testData.wrwUser.userKey,
1966
- backupKey: testData.wrwUser.backupKey,
1967
- bitgoKey: testData.wrwUser.bitgoKey,
1968
- recoveryDestination: testData.keys.destinationPubKey,
1969
- tokenContractAddress: usdtMintAddress,
1970
- walletPassphrase: testData.wrwUser.walletPassphrase,
1971
- durableNonce: {
1972
- publicKey: testData.keys.durableNoncePubKey,
1973
- secretKey: testData.keys.durableNoncePrivKey,
1974
- },
1975
- });
1976
- tokenTxn.should.not.be.empty();
1977
- tokenTxn.should.hasOwnProperty('serializedTx');
1978
- tokenTxn.should.hasOwnProperty('scanIndex');
1979
- should.equal(tokenTxn.scanIndex, 0);
1980
- const tokenTxnDeserialize = new lib_1.Transaction(coin);
1981
- tokenTxnDeserialize.fromRawTransaction(tokenTxn.serializedTx);
1982
- const tokenTxnJson = tokenTxnDeserialize.toJson();
1983
- should.equal(tokenTxnJson.nonce, testData.SolInputData.durableNonceBlockhash);
1984
- should.equal(tokenTxnJson.feePayer, testData.wrwUser.walletAddress0);
1985
- should.equal(tokenTxnJson.numSignatures, testData.SolInputData.durableNonceSignatures);
1986
- const instructionsData = tokenTxnJson.instructionsData;
1987
- should.equal(instructionsData.length, 3);
1988
- should.equal(instructionsData[0].type, 'NonceAdvance');
1989
- const destinationUSDTTokenAccount = await (0, utils_1.getAssociatedTokenAccountAddress)(usdtMintAddress, testData.keys.destinationPubKey);
1990
- should.equal(instructionsData[1].type, 'CreateAssociatedTokenAccount');
1991
- should.equal(instructionsData[1].params.mintAddress, usdtMintAddress);
1992
- should.equal(instructionsData[1].params.ataAddress, destinationUSDTTokenAccount);
1993
- should.equal(instructionsData[1].params.ownerAddress, testData.keys.destinationPubKey);
1994
- should.equal(instructionsData[1].params.tokenName, 'tsol:usdt');
1995
- should.equal(instructionsData[1].params.payerAddress, testData.wrwUser.walletAddress0);
1996
- const sourceUSDTTokenAccount = await (0, utils_1.getAssociatedTokenAccountAddress)(usdtMintAddress, testData.wrwUser.walletAddress0);
1997
- should.equal(instructionsData[2].type, 'TokenTransfer');
1998
- should.equal(instructionsData[2].params.fromAddress, testData.wrwUser.walletAddress0);
1999
- should.equal(instructionsData[2].params.toAddress, destinationUSDTTokenAccount);
2000
- should.equal(instructionsData[2].params.amount, '2000000000');
2001
- should.equal(instructionsData[2].params.tokenName, 'tsol:usdt');
2002
- should.equal(instructionsData[2].params.sourceAddress, sourceUSDTTokenAccount);
2003
- const solCoin = basecoin;
2004
- sandBox.assert.callCount(solCoin.getDataFromNode, 7);
2005
- });
2006
- it('should recover sol 2022 tokens to recovery destination with no existing token accounts', async function () {
2007
- const tokenTxn = await basecoin.recover({
2008
- userKey: testData.wrwUser.userKey,
2009
- backupKey: testData.wrwUser.backupKey,
2010
- bitgoKey: testData.wrwUser.bitgoKey,
2011
- recoveryDestination: testData.keys.destinationPubKey,
2012
- tokenContractAddress: t22mintAddress,
2013
- walletPassphrase: testData.wrwUser.walletPassphrase,
2014
- durableNonce: {
2015
- publicKey: testData.keys.durableNoncePubKey,
2016
- secretKey: testData.keys.durableNoncePrivKey,
2017
- },
2018
- programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',
2019
- });
2020
- tokenTxn.should.not.be.empty();
2021
- tokenTxn.should.hasOwnProperty('serializedTx');
2022
- tokenTxn.should.hasOwnProperty('scanIndex');
2023
- should.equal(tokenTxn.scanIndex, 0);
2024
- const tokenTxnDeserialize = new lib_1.Transaction(coin);
2025
- tokenTxnDeserialize.fromRawTransaction(tokenTxn.serializedTx);
2026
- const tokenTxnJson = tokenTxnDeserialize.toJson();
2027
- should.equal(tokenTxnJson.nonce, testData.SolInputData.durableNonceBlockhash);
2028
- should.equal(tokenTxnJson.feePayer, testData.wrwUser.walletAddress0);
2029
- should.equal(tokenTxnJson.numSignatures, testData.SolInputData.durableNonceSignatures);
2030
- const instructionsData = tokenTxnJson.instructionsData;
2031
- should.equal(instructionsData.length, 3);
2032
- should.equal(instructionsData[0].type, 'NonceAdvance');
2033
- const destinationTokenAccount = await (0, utils_1.getAssociatedTokenAccountAddress)(t22mintAddress, testData.keys.destinationPubKey);
2034
- should.equal(instructionsData[1].type, 'CreateAssociatedTokenAccount');
2035
- should.equal(instructionsData[1].params.mintAddress, t22mintAddress);
2036
- should.equal(instructionsData[1].params.ataAddress, destinationTokenAccount);
2037
- should.equal(instructionsData[1].params.ownerAddress, testData.keys.destinationPubKey);
2038
- should.equal(instructionsData[1].params.tokenName, 'tsol:t22mint');
2039
- should.equal(instructionsData[1].params.payerAddress, testData.wrwUser.walletAddress0);
2040
- const sourceTokenAccount = await (0, utils_1.getAssociatedTokenAccountAddress)(t22mintAddress, testData.wrwUser.walletAddress0);
2041
- should.equal(instructionsData[2].type, 'TokenTransfer');
2042
- should.equal(instructionsData[2].params.fromAddress, testData.wrwUser.walletAddress0);
2043
- should.equal(instructionsData[2].params.toAddress, destinationTokenAccount);
2044
- should.equal(instructionsData[2].params.amount, '2000000000');
2045
- should.equal(instructionsData[2].params.tokenName, 'tsol:t22mint');
2046
- should.equal(instructionsData[2].params.sourceAddress, sourceTokenAccount);
2047
- should.equal(instructionsData[2].params.programId, 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb');
2048
- const solCoin = basecoin;
2049
- sandBox.assert.callCount(solCoin.getDataFromNode, 7);
2050
- });
2051
- it('should recover sol tokens to recovery destination with existing token accounts', async function () {
2052
- const tokenTxn = await basecoin.recover({
2053
- userKey: testData.wrwUser.userKey,
2054
- backupKey: testData.wrwUser.backupKey,
2055
- bitgoKey: testData.wrwUser.bitgoKey,
2056
- recoveryDestination: testData.keys.destinationPubKey2,
2057
- tokenContractAddress: usdtMintAddress,
2058
- walletPassphrase: testData.wrwUser.walletPassphrase,
2059
- durableNonce: {
2060
- publicKey: testData.keys.durableNoncePubKey,
2061
- secretKey: testData.keys.durableNoncePrivKey,
2062
- },
2063
- });
2064
- tokenTxn.should.not.be.empty();
2065
- tokenTxn.should.hasOwnProperty('serializedTx');
2066
- tokenTxn.should.hasOwnProperty('scanIndex');
2067
- should.equal(tokenTxn.scanIndex, 0);
2068
- const tokenTxnDeserialize = new lib_1.Transaction(coin);
2069
- tokenTxnDeserialize.fromRawTransaction(tokenTxn.serializedTx);
2070
- const tokenTxnJson = tokenTxnDeserialize.toJson();
2071
- should.equal(tokenTxnJson.nonce, testData.SolInputData.durableNonceBlockhash);
2072
- should.equal(tokenTxnJson.feePayer, testData.wrwUser.walletAddress0);
2073
- should.equal(tokenTxnJson.numSignatures, testData.SolInputData.durableNonceSignatures);
2074
- const instructionsData = tokenTxnJson.instructionsData;
2075
- should.equal(instructionsData.length, 2);
2076
- should.equal(instructionsData[0].type, 'NonceAdvance');
2077
- const sourceUSDTTokenAccount = await (0, utils_1.getAssociatedTokenAccountAddress)(usdtMintAddress, testData.wrwUser.walletAddress0);
2078
- const destinationUSDTTokenAccount = await (0, utils_1.getAssociatedTokenAccountAddress)(usdtMintAddress, testData.keys.destinationPubKey2);
2079
- should.equal(instructionsData[1].type, 'TokenTransfer');
2080
- should.equal(instructionsData[1].params.fromAddress, testData.wrwUser.walletAddress0);
2081
- should.equal(instructionsData[1].params.toAddress, destinationUSDTTokenAccount);
2082
- should.equal(instructionsData[1].params.amount, '2000000000');
2083
- should.equal(instructionsData[1].params.tokenName, 'tsol:usdt');
2084
- should.equal(instructionsData[1].params.sourceAddress, sourceUSDTTokenAccount);
2085
- const solCoin = basecoin;
2086
- sandBox.assert.callCount(solCoin.getDataFromNode, 7);
2087
- });
2088
- it('should recover sol 2022 tokens to recovery destination with existing token accounts', async function () {
2089
- const tokenTxn = await basecoin.recover({
2090
- userKey: testData.wrwUser.userKey,
2091
- backupKey: testData.wrwUser.backupKey,
2092
- bitgoKey: testData.wrwUser.bitgoKey,
2093
- recoveryDestination: testData.keys.destinationPubKey2,
2094
- tokenContractAddress: t22mintAddress,
2095
- walletPassphrase: testData.wrwUser.walletPassphrase,
2096
- durableNonce: {
2097
- publicKey: testData.keys.durableNoncePubKey,
2098
- secretKey: testData.keys.durableNoncePrivKey,
2099
- },
2100
- programId: spl_token_1.TOKEN_2022_PROGRAM_ID.toString(),
2101
- });
2102
- tokenTxn.should.not.be.empty();
2103
- tokenTxn.should.hasOwnProperty('serializedTx');
2104
- tokenTxn.should.hasOwnProperty('scanIndex');
2105
- should.equal(tokenTxn.scanIndex, 0);
2106
- const tokenTxnDeserialize = new lib_1.Transaction(coin);
2107
- tokenTxnDeserialize.fromRawTransaction(tokenTxn.serializedTx);
2108
- const tokenTxnJson = tokenTxnDeserialize.toJson();
2109
- console.log(tokenTxnJson);
2110
- should.equal(tokenTxnJson.nonce, testData.SolInputData.durableNonceBlockhash);
2111
- should.equal(tokenTxnJson.feePayer, testData.wrwUser.walletAddress0);
2112
- should.equal(tokenTxnJson.numSignatures, testData.SolInputData.durableNonceSignatures);
2113
- const instructionsData = tokenTxnJson.instructionsData;
2114
- should.equal(instructionsData.length, 2);
2115
- should.equal(instructionsData[0].type, 'NonceAdvance');
2116
- const source2022TokenAccount = await (0, utils_1.getAssociatedTokenAccountAddress)(t22mintAddress, testData.wrwUser.walletAddress0, false, spl_token_1.TOKEN_2022_PROGRAM_ID.toString());
2117
- const destination2022TokenAccount = await (0, utils_1.getAssociatedTokenAccountAddress)(t22mintAddress, testData.keys.destinationPubKey2, false, spl_token_1.TOKEN_2022_PROGRAM_ID.toString());
2118
- should.equal(instructionsData[1].type, 'TokenTransfer');
2119
- should.equal(instructionsData[1].params.fromAddress, testData.wrwUser.walletAddress0);
2120
- should.equal(instructionsData[1].params.toAddress, destination2022TokenAccount);
2121
- should.equal(instructionsData[1].params.amount, '2000000000');
2122
- should.equal(instructionsData[1].params.tokenName, 'tsol:t22mint');
2123
- should.equal(instructionsData[1].params.sourceAddress, source2022TokenAccount);
2124
- const solCoin = basecoin;
2125
- sandBox.assert.callCount(solCoin.getDataFromNode, 7);
2126
- });
2127
- it('should recover sol tokens to recovery destination with existing token accounts for unsigned sweep recoveries', async function () {
2128
- const feeResponse = testData.SolResponses.getFeesForMessageResponse;
2129
- feeResponse.body.result.value = 10000;
2130
- callBack
2131
- .withArgs({
2132
- payload: {
2133
- id: '1',
2134
- jsonrpc: '2.0',
2135
- method: 'getFeeForMessage',
2136
- params: [
2137
- sinon.match.string,
2138
- {
2139
- commitment: 'finalized',
2140
- },
2141
- ],
2142
- },
2143
- })
2144
- .resolves(feeResponse);
2145
- const tokenTxn = (await basecoin.recover({
2146
- bitgoKey: testData.wrwUser.bitgoKey,
2147
- recoveryDestination: testData.keys.destinationPubKey2,
2148
- durableNonce: {
2149
- publicKey: testData.keys.durableNoncePubKey,
2150
- secretKey: testData.keys.durableNoncePrivKey,
2151
- },
2152
- tokenContractAddress: testData.tokenAddress.TestUSDC,
2153
- }));
2154
- // 2 signatures and no rent exemption fee since the destination already has token accounts
2155
- const expectedFee = 5000 + 5000;
2156
- const { serializedTx, scanIndex, feeInfo, parsedTx } = tokenTxn.txRequests[0].transactions[0].unsignedTx;
2157
- assert_1.default.ok(serializedTx);
2158
- assert_1.default.strictEqual(scanIndex, 0);
2159
- assert_1.default.ok(feeInfo);
2160
- assert_1.default.strictEqual(feeInfo.feeString, expectedFee.toString());
2161
- assert_1.default.strictEqual(feeInfo.fee, expectedFee);
2162
- assert_1.default.ok(parsedTx);
2163
- assert_1.default.ok(parsedTx.inputs instanceof Array && parsedTx.inputs.length === 1);
2164
- assert_1.default.ok(parsedTx.outputs instanceof Array && parsedTx.outputs.length === 1);
2165
- const tokenTxnDeserialize = new lib_1.Transaction(coin);
2166
- tokenTxnDeserialize.fromRawTransaction(tokenTxn.txRequests[0].transactions[0].unsignedTx.serializedTx);
2167
- const tokenTxnJson = tokenTxnDeserialize.toJson();
2168
- assert_1.default.strictEqual(tokenTxnJson.nonce, testData.SolInputData.durableNonceBlockhash);
2169
- assert_1.default.strictEqual(tokenTxnJson.feePayer, testData.wrwUser.walletAddress0);
2170
- assert_1.default.strictEqual(tokenTxnJson.numSignatures, testData.SolInputData.unsignedSweepSignatures);
2171
- const solCoin = basecoin;
2172
- sandBox.assert.callCount(solCoin.getDataFromNode, 7);
2173
- });
2174
- it('should recover sol funds from ATA address for non-bitgo recoveries', async function () {
2175
- // close ATA address instruction type txn
2176
- const closeATATxns = await basecoin.recoverCloseATA({
2177
- userKey: testData.closeATAkeys.userKey,
2178
- backupKey: testData.closeATAkeys.backupKey,
2179
- bitgoKey: testData.closeATAkeys.bitgoKey,
2180
- recoveryDestination: testData.closeATAkeys.destinationPubKey,
2181
- walletPassphrase: testData.closeATAkeys.walletPassword,
2182
- closeAtaAddress: testData.closeATAkeys.closeAtaAddress,
2183
- recoveryDestinationAtaAddress: testData.closeATAkeys.recoveryDestinationAtaAddress,
2184
- });
2185
- closeATATxns.should.not.be.empty();
2186
- should.equal(closeATATxns[0].txId, '2id3YC2jK9G5Wo2phDx4gJVAew8DcY5NAojnVuao8rkxwPYPe8cSwE5GzhEgJA2y8fVjDEo6iR6ykBvDxrTQrtpb');
2187
- should.equal(closeATATxns[1].txId, '5oUBgXX4enGmFEspG64goy3PRysjfrekZGg3rZNkBHUCQFd482vrVWbfDcRYMBEJt65JXymfEPm8M6d89X4xV79n');
2188
- });
2189
- });
2190
- describe('Build Consolidation Recoveries:', () => {
2191
- const sandBox = sinon.createSandbox();
2192
- const coin = statics_1.coins.get('tsol');
2193
- const usdtMintAddress = '9cgpBeNZ2HnLda7NWaaU1i3NyTstk2c4zCMUcoAGsi9C';
2194
- const durableNonces = {
2195
- publicKeys: [
2196
- testData.keys.durableNoncePubKey,
2197
- testData.keys.durableNoncePubKey2,
2198
- testData.keys.durableNoncePubKey3,
2199
- ],
2200
- secretKey: testData.keys.durableNoncePrivKey,
2201
- };
2202
- beforeEach(() => {
2203
- const callBack = sandBox.stub(src_1.Sol.prototype, 'getDataFromNode');
2204
- callBack
2205
- .withArgs({
2206
- payload: {
2207
- id: '1',
2208
- jsonrpc: '2.0',
2209
- method: 'getLatestBlockhash',
2210
- params: [
2211
- {
2212
- commitment: 'finalized',
2213
- },
2214
- ],
2215
- },
2216
- })
2217
- .resolves(testData.SolResponses.getBlockhashResponse);
2218
- callBack
2219
- .withArgs({
2220
- payload: {
2221
- id: '1',
2222
- jsonrpc: '2.0',
2223
- method: 'getFeeForMessage',
2224
- params: [
2225
- sinon.match.string,
2226
- {
2227
- commitment: 'finalized',
2228
- },
2229
- ],
2230
- },
2231
- })
2232
- .resolves(testData.SolResponses.getFeesForMessageResponse);
2233
- callBack
2234
- .withArgs({
2235
- payload: {
2236
- id: '1',
2237
- jsonrpc: '2.0',
2238
- method: 'getBalance',
2239
- params: [testData.wrwUser.walletAddress1],
2240
- },
2241
- })
2242
- .resolves(testData.SolResponses.getAccountBalanceResponseNoFunds);
2243
- callBack
2244
- .withArgs({
2245
- payload: {
2246
- id: '1',
2247
- jsonrpc: '2.0',
2248
- method: 'getBalance',
2249
- params: [testData.wrwUser.walletAddress2],
2250
- },
2251
- })
2252
- .resolves(testData.SolResponses.getAccountBalanceResponse);
2253
- callBack
2254
- .withArgs({
2255
- payload: {
2256
- id: '1',
2257
- jsonrpc: '2.0',
2258
- method: 'getBalance',
2259
- params: [testData.wrwUser.walletAddress3],
2260
- },
2261
- })
2262
- .resolves(testData.SolResponses.getAccountBalanceResponse);
2263
- callBack
2264
- .withArgs({
2265
- payload: {
2266
- id: '1',
2267
- jsonrpc: '2.0',
2268
- method: 'getBalance',
2269
- params: [testData.wrwUser.walletAddress5],
2270
- },
2271
- })
2272
- .resolves(testData.SolResponses.getAccountBalanceResponse);
2273
- callBack
2274
- .withArgs({
2275
- payload: {
2276
- id: '1',
2277
- jsonrpc: '2.0',
2278
- method: 'getMinimumBalanceForRentExemption',
2279
- params: [165],
2280
- },
2281
- })
2282
- .resolves(testData.SolResponses.getMinimumBalanceForRentExemptionResponse);
2283
- callBack
2284
- .withArgs({
2285
- payload: {
2286
- id: '1',
2287
- jsonrpc: '2.0',
2288
- method: 'getAccountInfo',
2289
- params: [
2290
- testData.keys.durableNoncePubKey,
2291
- {
2292
- encoding: 'jsonParsed',
2293
- },
2294
- ],
2295
- },
2296
- })
2297
- .resolves(testData.SolResponses.getAccountInfoResponse);
2298
- callBack
2299
- .withArgs({
2300
- payload: {
2301
- id: '1',
2302
- jsonrpc: '2.0',
2303
- method: 'getAccountInfo',
2304
- params: [
2305
- testData.keys.durableNoncePubKey2,
2306
- {
2307
- encoding: 'jsonParsed',
2308
- },
2309
- ],
2310
- },
2311
- })
2312
- .resolves(testData.SolResponses.getAccountInfoResponse2);
2313
- callBack
2314
- .withArgs({
2315
- payload: {
2316
- id: '1',
2317
- jsonrpc: '2.0',
2318
- method: 'getTokenAccountsByOwner',
2319
- params: [
2320
- testData.wrwUser.walletAddress1,
2321
- {
2322
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
2323
- },
2324
- {
2325
- encoding: 'jsonParsed',
2326
- },
2327
- ],
2328
- },
2329
- })
2330
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponseNoAccounts);
2331
- callBack
2332
- .withArgs({
2333
- payload: {
2334
- id: '1',
2335
- jsonrpc: '2.0',
2336
- method: 'getTokenAccountsByOwner',
2337
- params: [
2338
- testData.wrwUser.walletAddress2,
2339
- {
2340
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
2341
- },
2342
- {
2343
- encoding: 'jsonParsed',
2344
- },
2345
- ],
2346
- },
2347
- })
2348
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponseNoAccounts);
2349
- callBack
2350
- .withArgs({
2351
- payload: {
2352
- id: '1',
2353
- jsonrpc: '2.0',
2354
- method: 'getTokenAccountsByOwner',
2355
- params: [
2356
- testData.wrwUser.walletAddress3,
2357
- {
2358
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
2359
- },
2360
- {
2361
- encoding: 'jsonParsed',
2362
- },
2363
- ],
2364
- },
2365
- })
2366
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponseNoAccounts);
2367
- callBack
2368
- .withArgs({
2369
- payload: {
2370
- id: '1',
2371
- jsonrpc: '2.0',
2372
- method: 'getTokenAccountsByOwner',
2373
- params: [
2374
- testData.wrwUser.walletAddress5,
2375
- {
2376
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
2377
- },
2378
- {
2379
- encoding: 'jsonParsed',
2380
- },
2381
- ],
2382
- },
2383
- })
2384
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponse);
2385
- callBack
2386
- .withArgs({
2387
- payload: {
2388
- id: '1',
2389
- jsonrpc: '2.0',
2390
- method: 'getTokenAccountsByOwner',
2391
- params: [
2392
- testData.wrwUser.walletAddress0,
2393
- {
2394
- programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
2395
- },
2396
- {
2397
- encoding: 'jsonParsed',
2398
- },
2399
- ],
2400
- },
2401
- })
2402
- .resolves(testData.SolResponses.getTokenAccountsByOwnerResponse);
2403
- });
2404
- afterEach(() => {
2405
- sandBox.restore();
2406
- });
2407
- it('should build signed consolidation recoveries', async function () {
2408
- const res = (await basecoin.recoverConsolidations({
2409
- userKey: testData.wrwUser.userKey,
2410
- backupKey: testData.wrwUser.backupKey,
2411
- bitgoKey: testData.wrwUser.bitgoKey,
2412
- walletPassphrase: testData.wrwUser.walletPassphrase,
2413
- startingScanIndex: 1,
2414
- endingScanIndex: 4,
2415
- durableNonces: durableNonces,
2416
- }));
2417
- res.should.not.be.empty();
2418
- res.transactions.length.should.equal(2);
2419
- (res.lastScanIndex ?? 0).should.equal(3);
2420
- const txn1 = res.transactions[0];
2421
- const latestBlockhashTxnDeserialize1 = new lib_1.Transaction(coin);
2422
- latestBlockhashTxnDeserialize1.fromRawTransaction(txn1.serializedTx);
2423
- const latestBlockhashTxnJson1 = latestBlockhashTxnDeserialize1.toJson();
2424
- const nonce1 = testData.SolResponses.getAccountInfoResponse.body.result.value.data.parsed.info.blockhash;
2425
- should.equal(latestBlockhashTxnJson1.nonce, nonce1);
2426
- should.equal(latestBlockhashTxnJson1.feePayer, testData.wrwUser.walletAddress2);
2427
- should.equal(latestBlockhashTxnJson1.numSignatures, testData.SolInputData.durableNonceSignatures);
2428
- const txn2 = res.transactions[1];
2429
- const latestBlockhashTxnDeserialize2 = new lib_1.Transaction(coin);
2430
- latestBlockhashTxnDeserialize2.fromRawTransaction(txn2.serializedTx);
2431
- const latestBlockhashTxnJson2 = latestBlockhashTxnDeserialize2.toJson();
2432
- const nonce2 = testData.SolResponses.getAccountInfoResponse2.body.result.value.data.parsed.info.blockhash;
2433
- should.equal(latestBlockhashTxnJson2.nonce, nonce2);
2434
- should.equal(latestBlockhashTxnJson2.feePayer, testData.wrwUser.walletAddress3);
2435
- should.equal(latestBlockhashTxnJson2.numSignatures, testData.SolInputData.durableNonceSignatures);
2436
- });
2437
- it('should build unsigned consolidation recoveries', async function () {
2438
- const res = (await basecoin.recoverConsolidations({
2439
- bitgoKey: testData.wrwUser.bitgoKey,
2440
- startingScanIndex: 1,
2441
- endingScanIndex: 4,
2442
- durableNonces: durableNonces,
2443
- }));
2444
- res.should.not.be.empty();
2445
- res.txRequests.length.should.equal(2);
2446
- const txn1 = res.txRequests[0].transactions[0].unsignedTx;
2447
- txn1.should.hasOwnProperty('serializedTx');
2448
- txn1.should.hasOwnProperty('signableHex');
2449
- txn1.should.hasOwnProperty('scanIndex');
2450
- (txn1.scanIndex ?? 0).should.equal(2);
2451
- txn1.should.hasOwnProperty('coin');
2452
- txn1.coin?.should.equal('tsol');
2453
- txn1.should.hasOwnProperty('derivationPath');
2454
- txn1.derivationPath?.should.equal('m/2');
2455
- txn1.should.hasOwnProperty('coinSpecific');
2456
- const coinSpecific1 = txn1.coinSpecific;
2457
- coinSpecific1?.should.hasOwnProperty('commonKeychain');
2458
- const latestBlockhashTxnDeserialize1 = new lib_1.Transaction(coin);
2459
- latestBlockhashTxnDeserialize1.fromRawTransaction(txn1.serializedTx);
2460
- const latestBlockhashTxnJson1 = latestBlockhashTxnDeserialize1.toJson();
2461
- const nonce1 = testData.SolResponses.getAccountInfoResponse.body.result.value.data.parsed.info.blockhash;
2462
- should.equal(latestBlockhashTxnJson1.nonce, nonce1);
2463
- should.equal(latestBlockhashTxnJson1.feePayer, testData.wrwUser.walletAddress2);
2464
- should.equal(latestBlockhashTxnJson1.numSignatures, testData.SolInputData.unsignedSweepSignatures);
2465
- const txn2 = res.txRequests[1].transactions[0].unsignedTx;
2466
- txn2.should.hasOwnProperty('serializedTx');
2467
- txn2.should.hasOwnProperty('signableHex');
2468
- txn2.should.hasOwnProperty('scanIndex');
2469
- (txn2.scanIndex ?? 0).should.equal(3);
2470
- txn2.should.hasOwnProperty('coin');
2471
- txn2.coin?.should.equal('tsol');
2472
- txn2.should.hasOwnProperty('derivationPath');
2473
- txn2.derivationPath?.should.equal('m/3');
2474
- txn2.should.hasOwnProperty('coinSpecific');
2475
- const coinSpecific2 = txn2.coinSpecific;
2476
- coinSpecific2?.should.hasOwnProperty('commonKeychain');
2477
- coinSpecific2?.should.hasOwnProperty('lastScanIndex');
2478
- coinSpecific2?.lastScanIndex?.should.equal(3);
2479
- const latestBlockhashTxnDeserialize2 = new lib_1.Transaction(coin);
2480
- latestBlockhashTxnDeserialize2.fromRawTransaction(txn2.serializedTx);
2481
- const latestBlockhashTxnJson2 = latestBlockhashTxnDeserialize2.toJson();
2482
- const nonce2 = testData.SolResponses.getAccountInfoResponse2.body.result.value.data.parsed.info.blockhash;
2483
- should.equal(latestBlockhashTxnJson2.nonce, nonce2);
2484
- should.equal(latestBlockhashTxnJson2.feePayer, testData.wrwUser.walletAddress3);
2485
- should.equal(latestBlockhashTxnJson2.numSignatures, testData.SolInputData.unsignedSweepSignatures);
2486
- });
2487
- it('should build unsigned token consolidation recoveries', async function () {
2488
- const res = (await basecoin.recoverConsolidations({
2489
- bitgoKey: testData.wrwUser.bitgoKey,
2490
- startingScanIndex: 3,
2491
- endingScanIndex: 5,
2492
- tokenContractAddress: usdtMintAddress,
2493
- durableNonces: durableNonces,
2494
- }));
2495
- res.should.not.be.empty();
2496
- res.txRequests.length.should.equal(1);
2497
- const txn1 = res.txRequests[0].transactions[0].unsignedTx;
2498
- txn1.should.hasOwnProperty('serializedTx');
2499
- txn1.should.hasOwnProperty('signableHex');
2500
- txn1.should.hasOwnProperty('scanIndex');
2501
- (txn1.scanIndex ?? 0).should.equal(4);
2502
- txn1.should.hasOwnProperty('coin');
2503
- txn1.coin?.should.equal('tsol');
2504
- txn1.should.hasOwnProperty('derivationPath');
2505
- txn1.derivationPath?.should.equal('m/4');
2506
- txn1.should.hasOwnProperty('coinSpecific');
2507
- const coinSpecific1 = txn1.coinSpecific;
2508
- coinSpecific1?.should.hasOwnProperty('commonKeychain');
2509
- const latestBlockhashTxnDeserialize1 = new lib_1.Transaction(coin);
2510
- latestBlockhashTxnDeserialize1.fromRawTransaction(txn1.serializedTx);
2511
- const latestBlockhashTxnJson1 = latestBlockhashTxnDeserialize1.toJson();
2512
- const nonce1 = testData.SolResponses.getAccountInfoResponse.body.result.value.data.parsed.info.blockhash;
2513
- should.equal(latestBlockhashTxnJson1.nonce, nonce1);
2514
- should.equal(latestBlockhashTxnJson1.feePayer, testData.wrwUser.walletAddress5);
2515
- should.equal(latestBlockhashTxnJson1.numSignatures, testData.SolInputData.unsignedSweepSignatures);
2516
- });
2517
- it('should skip building consolidate transaction if balance is equal to zero', async function () {
2518
- await basecoin
2519
- .recoverConsolidations({
2520
- userKey: testData.wrwUser.userKey,
2521
- backupKey: testData.wrwUser.backupKey,
2522
- bitgoKey: testData.wrwUser.bitgoKey,
2523
- walletPassphrase: testData.wrwUser.walletPassphrase,
2524
- startingScanIndex: 1,
2525
- endingScanIndex: 2,
2526
- durableNonces: durableNonces,
2527
- })
2528
- .should.rejectedWith('Did not find an address with funds to recover');
2529
- });
2530
- it('should throw if startingScanIndex is not ge to 1', async () => {
2531
- await basecoin
2532
- .recoverConsolidations({
2533
- userKey: testData.wrwUser.userKey,
2534
- backupKey: testData.wrwUser.backupKey,
2535
- bitgoKey: testData.wrwUser.bitgoKey,
2536
- startingScanIndex: -1,
2537
- durableNonces: durableNonces,
2538
- })
2539
- .should.be.rejectedWith('Invalid starting or ending index to scan for addresses. startingScanIndex: -1, endingScanIndex: 19.');
2540
- });
2541
- it('should throw if scan factor is too high', async () => {
2542
- await basecoin
2543
- .recoverConsolidations({
2544
- userKey: testData.wrwUser.userKey,
2545
- backupKey: testData.wrwUser.backupKey,
2546
- bitgoKey: testData.wrwUser.bitgoKey,
2547
- startingScanIndex: 1,
2548
- endingScanIndex: 300,
2549
- durableNonces: durableNonces,
2550
- })
2551
- .should.be.rejectedWith('Invalid starting or ending index to scan for addresses. startingScanIndex: 1, endingScanIndex: 300.');
2552
- });
2553
- });
2554
- describe('broadcastTransaction', function () {
2555
- const sandBox = sinon.createSandbox();
2556
- afterEach(() => {
2557
- sandBox.restore();
2558
- });
2559
- it('should broadcast a transaction succesfully', async function () {
2560
- const serializedSignedTransaction = testData.rawTransactions.transfer.signed;
2561
- const broadcastStub = sandBox
2562
- .stub(src_1.Sol.prototype, 'getDataFromNode')
2563
- .withArgs({
2564
- payload: {
2565
- id: '1',
2566
- jsonrpc: '2.0',
2567
- method: 'sendTransaction',
2568
- params: [
2569
- serializedSignedTransaction,
2570
- {
2571
- encoding: 'base64',
2572
- },
2573
- ],
2574
- },
2575
- })
2576
- .resolves(testData.SolResponses.broadcastTransactionResponse);
2577
- const broadcastTxn = await basecoin.broadcastTransaction({ serializedSignedTransaction });
2578
- assert_1.default.ok(broadcastTxn);
2579
- assert_1.default.ok(broadcastTxn.txId);
2580
- assert_1.default.strictEqual(broadcastTxn.txId, '2id3YC2jK9G5Wo2phDx4gJVAew8DcY5NAojnVuao8rkxwPYPe8cSwE5GzhEgJA2y8fVjDEo6iR6ykBvDxrTQrtpb');
2581
- assert_1.default.strictEqual(broadcastStub.callCount, 1);
2582
- });
2583
- it('should throw if got an error from the node', async function () {
2584
- const serializedSignedTransaction = testData.rawTransactions.transfer.signed;
2585
- const broadcastStub = sandBox
2586
- .stub(src_1.Sol.prototype, 'getDataFromNode')
2587
- .withArgs({
2588
- payload: {
2589
- id: '1',
2590
- jsonrpc: '2.0',
2591
- method: 'sendTransaction',
2592
- params: [
2593
- serializedSignedTransaction,
2594
- {
2595
- encoding: 'base64',
2596
- },
2597
- ],
2598
- },
2599
- })
2600
- .resolves(testData.SolResponses.broadcastTransactionResponseError);
2601
- await assert_1.default.rejects(async () => {
2602
- await basecoin.broadcastTransaction({ serializedSignedTransaction });
2603
- }, { message: 'Error broadcasting transaction: Transaction simulation failed: Blockhash not found' });
2604
- assert_1.default.strictEqual(broadcastStub.callCount, 1);
2605
- });
2606
- it('should throw if is not a valid transaction', async function () {
2607
- const serializedSignedTransaction = 'randomstring';
2608
- await assert_1.default.rejects(async () => {
2609
- await basecoin.broadcastTransaction({ serializedSignedTransaction });
2610
- }, { message: 'Invalid raw transaction' });
2611
- });
2612
- it('should throw if is not a signed transaction', async function () {
2613
- const serializedSignedTransaction = testData.rawTransactions.transfer.unsigned;
2614
- await assert_1.default.rejects(async () => {
2615
- await basecoin.broadcastTransaction({ serializedSignedTransaction });
2616
- }, { message: 'Invalid raw transaction' });
2617
- });
2618
- });
2619
- describe('AuditKey', () => {
2620
- const { key: keyString, commonKeychain } = solBackupKey_1.solBackupKey;
2621
- const key = keyString.replace(/\s/g, '');
2622
- const walletPassphrase = 'kAm[EFQ6o=SxlcLFDw%,';
2623
- const multiSigType = 'tss';
2624
- it('should return for valid inputs', () => {
2625
- basecoin.assertIsValidKey({
2626
- encryptedPrv: key,
2627
- publicKey: commonKeychain,
2628
- walletPassphrase,
2629
- multiSigType,
2630
- });
2631
- });
2632
- it('should throw error if the commonKeychain is invalid', () => {
2633
- const alteredCommonKeychain = (0, sdk_core_1.generateRandomPassword)(10);
2634
- assert_1.default.throws(() => basecoin.assertIsValidKey({
2635
- encryptedPrv: key,
2636
- publicKey: alteredCommonKeychain,
2637
- walletPassphrase,
2638
- multiSigType,
2639
- }), {
2640
- message: 'Invalid common keychain',
2641
- });
2642
- });
2643
- it('should throw error if the walletPassphrase is incorrect', () => {
2644
- const incorrectPassphrase = 'foo';
2645
- assert_1.default.throws(() => basecoin.assertIsValidKey({
2646
- encryptedPrv: key,
2647
- publicKey: commonKeychain,
2648
- walletPassphrase: incorrectPassphrase,
2649
- multiSigType,
2650
- }), {
2651
- message: "failed to decrypt prv: ccm: tag doesn't match",
2652
- });
2653
- });
2654
- it('should throw error if the key is altered', () => {
2655
- const alteredKey = key.replace(/[0-9]/g, '0');
2656
- assert_1.default.throws(() => basecoin.assertIsValidKey({
2657
- encryptedPrv: alteredKey,
2658
- publicKey: commonKeychain,
2659
- walletPassphrase,
2660
- multiSigType,
2661
- }), {
2662
- message: 'failed to decrypt prv: json decrypt: invalid parameters',
2663
- });
2664
- });
2665
- it('should verify consolidation transaction', async function () {
2666
- // Set up wallet data
2667
- const walletData = {
2668
- id: '5b34252f1bf349930e34020a00000000',
2669
- coin: 'tsol',
2670
- keys: [
2671
- '5b3424f91bf349930e34017500000000',
2672
- '5b3424f91bf349930e34017600000000',
2673
- '5b3424f91bf349930e34017700000000',
2674
- ],
2675
- coinSpecific: {
2676
- rootAddress: wallet.pub,
2677
- },
2678
- multisigType: 'tss',
2679
- };
2680
- const fakePrv = (0, sdk_api_1.encrypt)('password', 'prv');
2681
- const walletObj = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
2682
- const bgUrl = sdk_core_1.common.Environments['mock'].uri;
2683
- (0, nock_1.default)(bgUrl)
2684
- .get('/api/v2/tsol/key/5b3424f91bf349930e34017500000000')
2685
- .reply(200, [
2686
- {
2687
- encryptedPrv: fakePrv,
2688
- },
2689
- ]);
2690
- // Mock the API response for buildAccountConsolidations
2691
- (0, nock_1.default)(bgUrl)
2692
- .post('/api/v2/tsol/wallet/5b34252f1bf349930e34020a00000000/consolidateAccount/build')
2693
- .reply(200, [
2694
- {
2695
- txRequestId: '4fdd0cae-2563-43b1-b5cf-94865158ca10',
2696
- walletId: '63068ed4efa63a000877f02fd4b0fa6d',
2697
- txHex: '02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f50130abf8d0d8943c5b9a51a574886a7d7b3d8db18f0ddb4ab8b6d3ec27e3c2f36f3339bb92d4296af6ae4d3abfbb07877f77d0033c883de08fa4a2eea670d0201020674a9df2b94aa4b4ada1202dc2891be366501d0acb4a01ca3e02e7fd6c1f505a71c96172044f1217c3784e8f02f49e2c8fc3591e81294ab54394f9d22fd7b7a8f8401c3f67cfa52518b34a09b08f4ea77e1c4fb9d89bfaccdc33cf8b8a9cf8d7bf0e04c89c50428e4eda5cbb759427c370f0a29a50bb0d1407e57924b0cc5b36f000000000000000000000000000000000000000000000000000000000000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000040c9568195d67eb6b396fdbe97ba2e276622ef0023af09f23e6e0292abb678d90204030305010404000000040200020c020000000100000000000000',
2698
- feeInfo: {
2699
- fee: 10000,
2700
- feeString: '10000',
2701
- },
2702
- txInfo: {
2703
- minerFee: '10000',
2704
- spendAmount: '1547864',
2705
- spendAmounts: [
2706
- {
2707
- coinName: 'tsol',
2708
- amountString: '1547864',
2709
- },
2710
- ],
2711
- payGoFee: '0',
2712
- outputs: [
2713
- {
2714
- address: '8rQXeVEMrKvtWCEJirEM6cKYnbZuTqVTbqRPiMMAJ8R4',
2715
- value: 1547864,
2716
- wallet: '63068ed4efa63a000877f02f',
2717
- wallets: ['63068ed4efa63a000877f02f'],
2718
- enterprise: '62d71a6b86068f0008f029fd',
2719
- enterprises: ['62d71a6b86068f0008f029fd'],
2720
- valueString: '1547864',
2721
- coinName: 'tsol',
2722
- walletType: 'hot',
2723
- walletTypes: ['hot'],
2724
- },
2725
- ],
2726
- inputs: [
2727
- {
2728
- value: 1547864,
2729
- address: 'CmYsN3f8bcm4BDkFJWNsvYgjRxMTLH6vbJWNfYdmH7GU',
2730
- valueString: '1547864',
2731
- },
2732
- {
2733
- value: 10000,
2734
- address: 'CmYsN3f8bcm4BDkFJWNsvYgjRxMTLH6vbJWNfYdmH7GU',
2735
- valueString: '10000',
2736
- },
2737
- ],
2738
- type: 'Send',
2739
- },
2740
- consolidateId: '68a7d5d0c66e74e216b97173bd558c6d',
2741
- coin: 'tsol',
2742
- },
2743
- ]);
2744
- // Call the function to test
2745
- await assert_1.default.rejects(async () => {
2746
- await walletObj.sendAccountConsolidations({
2747
- walletPassphrase: 'password',
2748
- });
2749
- }, {
2750
- message: 'tx outputs does not match with expected address',
2751
- });
2752
- });
2753
- it('should verify valid a consolidation transaction', async () => {
2754
- const consolidationTx = {
2755
- txRequestId: '4fdd0cae-2563-43b1-b5cf-94865158ca10',
2756
- walletId: '63068ed4efa63a000877f02fd4b0fa6d',
2757
- txHex: '02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002010206aeda253a331de489838246df93879440af8c62ac4967658edc2bb5d52b9759d91c96172044f1217c3784e8f02f49e2c8fc3591e81294ab54394f9d22fd7b7a8f74a9df2b94aa4b4ada1202dc2891be366501d0acb4a01ca3e02e7fd6c1f505a7d2734f3952f3eb4aefcf6c7a6092e979dd3fe5563ccfaca1cc92652a15ddd393000000000000000000000000000000000000000000000000000000000000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea9400000428dad41bbedeb38018379e4ceeb7e80757d74dd00ae8c47c38d597477339ad80204030305010404000000040200020c02000000589e170000000000',
2758
- feeInfo: {
2759
- fee: 10000,
2760
- feeString: '10000',
2761
- },
2762
- txInfo: {
2763
- minerFee: '10000',
2764
- spendAmount: '1547864',
2765
- spendAmounts: [
2766
- {
2767
- coinName: 'tsol',
2768
- amountString: '1547864',
2769
- },
2770
- ],
2771
- payGoFee: '0',
2772
- outputs: [
2773
- {
2774
- address: '8rQXeVEMrKvtWCEJirEM6cKYnbZuTqVTbqRPiMMAJ8R4',
2775
- value: 1547864,
2776
- wallet: '63068ed4efa63a000877f02f',
2777
- wallets: ['63068ed4efa63a000877f02f'],
2778
- enterprise: '62d71a6b86068f0008f029fd',
2779
- enterprises: ['62d71a6b86068f0008f029fd'],
2780
- valueString: '1547864',
2781
- coinName: 'tsol',
2782
- walletType: 'hot',
2783
- walletTypes: ['hot'],
2784
- },
2785
- ],
2786
- inputs: [
2787
- {
2788
- value: 1547864,
2789
- address: 'CmYsN3f8bcm4BDkFJWNsvYgjRxMTLH6vbJWNfYdmH7GU',
2790
- valueString: '1547864',
2791
- },
2792
- {
2793
- value: 10000,
2794
- address: 'CmYsN3f8bcm4BDkFJWNsvYgjRxMTLH6vbJWNfYdmH7GU',
2795
- valueString: '10000',
2796
- },
2797
- ],
2798
- type: 'Send',
2799
- },
2800
- consolidateId: '68a7d5d0c66e74e216b97173bd558c6d',
2801
- coin: 'tsol',
2802
- };
2803
- const mockedWallet = {
2804
- coinSpecific: () => {
2805
- const cs = {
2806
- rootAddress: '8rQXeVEMrKvtWCEJirEM6cKYnbZuTqVTbqRPiMMAJ8R4',
2807
- };
2808
- return cs;
2809
- },
2810
- };
2811
- try {
2812
- if (!(await basecoin.verifyTransaction({
2813
- blockhash: '',
2814
- feePayer: '',
2815
- txParams: {},
2816
- txPrebuild: consolidationTx,
2817
- walletType: 'tss',
2818
- wallet: mockedWallet,
2819
- verification: {
2820
- consolidationToBaseAddress: true,
2821
- },
2822
- }))) {
2823
- assert_1.default.fail('Transaction should pass verification');
2824
- }
2825
- }
2826
- catch (e) {
2827
- assert_1.default.fail('Transaction should pass verification');
2828
- }
2829
- });
2830
- it('should verify a token consolidation transaction', async () => {
2831
- const consolidationTx = {
2832
- txRequestId: '4fdd0cae-2563-43b1-b5cf-94865158ca10',
2833
- walletId: '63068ed4efa63a000877f02fd4b0fa6d',
2834
- txHex: '02b7c2c7829eded4e8f947c90ed3b9afce71f616eb47dfcfbf4b765778149060013acb33b9f67fdd9c2512f48fac4e4c049eab93829b69404f3bd166fe3242c90700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020104096da690bd558fd8634ac14f1645d8095afd0caea5953578c596e3c0dea38305ee7298bfac55101f177735659d42ed6be890ef3a1d204d9e33f32e24c5635327ca66d1fe00826e5a4f759f87b279c1aee19cce5301af4ed66ae17db48b201ed6c2a0e8a28bf565627f1ab8a34b1a95ee1b0a2a39084f1f0e2acb1c394b20185d8e0b22657c8d9c4ce5f6495efb6410c199011530f90e3ab9d8d1e4206f9ae0ffeb0000000000000000000000000000000000000000000000000000000000000000c5f9fb32f49111ab20c33f2598fc836c113e291881ac21ee29169394011244e406a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9de13c74d2b4d948e1608ea6eebdafe75bc2f995aad11b21d1e2c94f2a2d12f6802050303070004040000000804020604010a0ce0076bb20400000006',
2835
- feeInfo: {
2836
- fee: 10000,
2837
- feeString: '10000',
2838
- },
2839
- txInfo: {
2840
- inputs: [
2841
- {
2842
- address: '8iLa26KSbdpBUzNK7uYq8FvyuyA5h4k4erDHsDcPbHus',
2843
- value: 2.0173228e10,
2844
- valueString: '20173228000',
2845
- },
2846
- {
2847
- address: '8P2kX7Tyh9eS3RKdaBhqbEtQGAX58DXzL7mhDQABGX2d',
2848
- value: 10000,
2849
- valueString: '10000',
2850
- },
2851
- ],
2852
- minerFee: '10000',
2853
- outputs: [
2854
- {
2855
- address: 'HBxZShcE86UMmF93KUM8eWJKqeEXi5cqWCLYLMMhqMYm',
2856
- coinName: 'sol:wif',
2857
- enterprise: {
2858
- $oid: '5553ba8ae7a5c77006719661',
2859
- },
2860
- enterprises: [
2861
- {
2862
- $oid: '5553ba8ae7a5c77006719661',
2863
- },
2864
- ],
2865
- value: 2.0173228e10,
2866
- valueString: '20173228000',
2867
- wallet: {
2868
- $oid: '62f4c3720d92c50008257eb5',
2869
- },
2870
- walletType: 'hot',
2871
- wallets: [
2872
- {
2873
- $oid: '62f4c3720d92c50008257eb5',
2874
- },
2875
- ],
2876
- },
2877
- ],
2878
- payGoFee: '0',
2879
- spendAmount: '20173228000',
2880
- spendAmounts: [
2881
- {
2882
- amountString: '20173228000',
2883
- coinName: 'sol:wif',
2884
- },
2885
- ],
2886
- type: 'Send',
2887
- },
2888
- consolidateId: '6712d7fda6de4906d658c04aebbf8f9b',
2889
- coin: 'tsol',
2890
- };
2891
- const mockedWallet = {
2892
- coinSpecific: () => {
2893
- const cs = {
2894
- rootAddress: 'HBxZShcE86UMmF93KUM8eWJKqeEXi5cqWCLYLMMhqMYm',
2895
- };
2896
- return cs;
2897
- },
2898
- };
2899
- try {
2900
- if (!(await basecoin.verifyTransaction({
2901
- blockhash: '',
2902
- feePayer: '',
2903
- txParams: {},
2904
- txPrebuild: consolidationTx,
2905
- walletType: 'tss',
2906
- wallet: mockedWallet,
2907
- verification: {
2908
- consolidationToBaseAddress: true,
2909
- },
2910
- }))) {
2911
- assert_1.default.fail('Transaction should pass verification');
2912
- }
2913
- }
2914
- catch (e) {
2915
- assert_1.default.fail('Transaction should pass verification');
2916
- }
2917
- });
2918
- it('should verify a spoofed token consolidation transaction', async () => {
2919
- const consolidationTx = {
2920
- txRequestId: '4fdd0cae-2563-43b1-b5cf-94865158ca10',
2921
- walletId: '63068ed4efa63a000877f02fd4b0fa6d',
2922
- txHex: '02b7c2c7829eded4e8f947c90ed3b9afce71f616eb47dfcfbf4b765778149060013acb33b9f67fdd9c2512f48fac4e4c049eab93829b69404f3bd166fe3242c90700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020104096da690bd558fd8634ac14f1645d8095afd0caea5953578c596e3c0dea38305ee7298bfac55101f177735659d42ed6be890ef3a1d204d9e33f32e24c5635327ca66d1fe00826e5a4f759f87b279c1aee19cce5301af4ed66ae17db48b201ed6c2a0e8a28bf565627f1ab8a34b1a95ee1b0a2a39084f1f0e2acb1c394b20185d8e0b22657c8d9c4ce5f6495efb6410c199011530f90e3ab9d8d1e4206f9ae0ffeb0000000000000000000000000000000000000000000000000000000000000000c5f9fb32f49111ab20c33f2598fc836c113e291881ac21ee29169394011244e406a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9de13c74d2b4d948e1608ea6eebdafe75bc2f995aad11b21d1e2c94f2a2d12f6802050303070004040000000804020604010a0ce0076bb20400000006',
2923
- feeInfo: {
2924
- fee: 10000,
2925
- feeString: '10000',
2926
- },
2927
- txInfo: {
2928
- inputs: [
2929
- {
2930
- address: '8iLa26KSbdpBUzNK7uYq8FvyuyA5h4k4erDHsDcPbHus',
2931
- value: 2.0173228e10,
2932
- valueString: '20173228000',
2933
- },
2934
- {
2935
- address: '8P2kX7Tyh9eS3RKdaBhqbEtQGAX58DXzL7mhDQABGX2d',
2936
- value: 10000,
2937
- valueString: '10000',
2938
- },
2939
- ],
2940
- minerFee: '10000',
2941
- outputs: [
2942
- {
2943
- address: 'HBxZShcE86UMmF93KUM8eWJKqeEXi5cqWCLYLMMhqMYm',
2944
- coinName: 'sol:wif',
2945
- enterprise: {
2946
- $oid: '5553ba8ae7a5c77006719661',
2947
- },
2948
- enterprises: [
2949
- {
2950
- $oid: '5553ba8ae7a5c77006719661',
2951
- },
2952
- ],
2953
- value: 2.0173228e10,
2954
- valueString: '20173228000',
2955
- wallet: {
2956
- $oid: '62f4c3720d92c50008257eb5',
2957
- },
2958
- walletType: 'hot',
2959
- wallets: [
2960
- {
2961
- $oid: '62f4c3720d92c50008257eb5',
2962
- },
2963
- ],
2964
- },
2965
- ],
2966
- payGoFee: '0',
2967
- spendAmount: '20173228000',
2968
- spendAmounts: [
2969
- {
2970
- amountString: '20173228000',
2971
- coinName: 'sol:wif',
2972
- },
2973
- ],
2974
- type: 'Send',
2975
- },
2976
- consolidateId: '6712d7fda6de4906d658c04aebbf8f9b',
2977
- coin: 'tsol',
2978
- };
2979
- const mockedWallet = {
2980
- coinSpecific: () => {
2981
- const cs = {
2982
- rootAddress: '8rQXeVEMrKvtWCEJirEM6cKYnbZuTqVTbqRPiMMAJ8R4',
2983
- };
2984
- return cs;
2985
- },
2986
- };
2987
- await assert_1.default.rejects(async () => basecoin.verifyTransaction({
2988
- blockhash: '',
2989
- feePayer: '',
2990
- txParams: {},
2991
- txPrebuild: consolidationTx,
2992
- walletType: 'tss',
2993
- wallet: mockedWallet,
2994
- verification: {
2995
- consolidationToBaseAddress: true,
2996
- },
2997
- }), {
2998
- message: 'tx outputs does not match with expected address',
2999
- });
3000
- });
3001
- });
3002
- describe('blind signing token enablement protection', () => {
3003
- it('should verify as valid the enabletoken intent when prebuild tx matchs user intent ', async function () {
3004
- const { txParams, txPrebuildRaw, walletData } = testData.enableTokenFixtures;
3005
- const wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
3006
- const sameIntentTx = await basecoin.verifyTransaction({
3007
- txParams,
3008
- txPrebuild: txPrebuildRaw,
3009
- wallet,
3010
- verification: { verifyTokenEnablement: true },
3011
- });
3012
- sameIntentTx.should.equal(true);
3013
- });
3014
- it('should thrown an error when tampered prebuild tx type ', async function () {
3015
- const { txParams, txPrebuildRaw, sendTxHex, walletData } = testData.enableTokenFixtures;
3016
- const tamperedTxPrebuild = { ...txPrebuildRaw, txHex: sendTxHex };
3017
- const wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
3018
- await assert_1.default.rejects(async () => await basecoin.verifyTransaction({
3019
- txParams,
3020
- txPrebuild: tamperedTxPrebuild,
3021
- wallet,
3022
- verification: { verifyTokenEnablement: true },
3023
- }), {
3024
- message: 'Invalid transaction type on token enablement: expected "AssociatedTokenAccountInitialization", got "Send".',
3025
- });
3026
- });
3027
- it('should verify that tokenName matches between user intent and hex', async function () {
3028
- const { txParams, txPrebuildRaw, wrongTokenNameTxHex, walletData } = testData.enableTokenFixtures;
3029
- const tamperedTxPrebuild = { ...txPrebuildRaw, txHex: wrongTokenNameTxHex };
3030
- const wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
3031
- await assert_1.default.rejects(async () => basecoin.verifyTransaction({
3032
- txParams,
3033
- txPrebuild: tamperedTxPrebuild,
3034
- wallet,
3035
- verification: { verifyTokenEnablement: true },
3036
- }), { message: 'Invalid token name: expected tsol:ray, got tsol:t22mint on token enablement tx' });
3037
- });
3038
- it('should verify that tokenAddr matches between user intent and hex', async function () {
3039
- const { txParams, txPrebuildRaw, wrongAddrTxHex, walletData } = testData.enableTokenFixtures;
3040
- const tamperedTxPrebuild = { ...txPrebuildRaw, txHex: wrongAddrTxHex };
3041
- const wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
3042
- await assert_1.default.rejects(async () => basecoin.verifyTransaction({
3043
- txParams,
3044
- txPrebuild: tamperedTxPrebuild,
3045
- wallet,
3046
- verification: { verifyTokenEnablement: true },
3047
- }), {
3048
- message: 'Invalid token address: expected 4bTYvvv2Hk4v2kQW8HZFFS4SzYPztQshw9Gm1suXmaBj, got G1LEgANAwKo7b8NfxTsMzrbBYDkXqi5REVJY8thrMRQm on token enablement tx',
3049
- });
3050
- });
3051
- it('should fail sendTokenEnablement call on spoofed data', async function () {
3052
- const { sendTokenEnablementPayload, walletData, wrongTokenNameTxHex } = testData.enableTokenFixtures;
3053
- const wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
3054
- (0, nock_1.default)('https://bitgo.fakeurl').get('/api/v2/tsol/key/68bafed588671cf94ed8a5dbba882ad3').reply(200, {});
3055
- await assert_1.default.rejects(async () => wallet.sendTokenEnablement({
3056
- verification: { verifyTokenEnablement: true },
3057
- ...sendTokenEnablementPayload,
3058
- prebuildTx: { ...sendTokenEnablementPayload.prebuildTx, txHex: wrongTokenNameTxHex },
3059
- }), {
3060
- message: 'Invalid token name: expected tsol:ray, got tsol:t22mint on token enablement tx',
3061
- });
3062
- });
3063
- });
3064
- describe('isWalletAddress', () => {
3065
- it('should verify valid wallet address with correct keychain and index', async function () {
3066
- const address = '7YAesfwPk41VChUgr65bm8FEep7ymWqLSW5rpYB5zZPY';
3067
- const commonKeychain = '8ea32ecacfc83effbd2e2790ee44fa7c59b4d86c29a12f09fb613d8195f93f4e21875cad3b98adada40c040c54c3569467df41a020881a6184096378701862bd';
3068
- const index = '1';
3069
- const keychains = [{ id: '1', type: 'tss', commonKeychain }];
3070
- const result = await basecoin.isWalletAddress({ keychains, address, index });
3071
- result.should.equal(true);
3072
- });
3073
- it('should return false for address with incorrect keychain', async function () {
3074
- const address = '7YAesfwPk41VChUgr65bm8FEep7ymWqLSW5rpYB5zZPY';
3075
- const wrongKeychain = '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
3076
- const index = '1';
3077
- const keychains = [{ id: '1', type: 'tss', commonKeychain: wrongKeychain }];
3078
- const result = await basecoin.isWalletAddress({ keychains, address, index });
3079
- result.should.equal(false);
3080
- });
3081
- it('should return false for address with incorrect index', async function () {
3082
- const address = '7YAesfwPk41VChUgr65bm8FEep7ymWqLSW5rpYB5zZPY';
3083
- const commonKeychain = '8ea32ecacfc83effbd2e2790ee44fa7c59b4d86c29a12f09fb613d8195f93f4e21875cad3b98adada40c040c54c3569467df41a020881a6184096378701862bd';
3084
- const wrongIndex = '999';
3085
- const keychains = [{ id: '1', type: 'tss', commonKeychain }];
3086
- const result = await basecoin.isWalletAddress({ keychains, address, index: wrongIndex });
3087
- result.should.equal(false);
3088
- });
3089
- it('should throw error for invalid address', async function () {
3090
- const invalidAddress = 'invalidaddress';
3091
- const commonKeychain = '8ea32ecacfc83effbd2e2790ee44fa7c59b4d86c29a12f09fb613d8195f93f4e21875cad3b98adada40c040c54c3569467df41a020881a6184096378701862bd';
3092
- const index = '1';
3093
- const keychains = [{ id: '1', type: 'tss', commonKeychain }];
3094
- await assert_1.default.rejects(async () => await basecoin.isWalletAddress({ keychains, address: invalidAddress, index }), {
3095
- message: `invalid address: ${invalidAddress}`,
3096
- });
3097
- });
3098
- });
3099
- describe('getAddressFromPublicKey', () => {
3100
- it('should convert public key to base58 address', function () {
3101
- const publicKey = '61220a9394802b1d1df37b35f7a3197970f48081092cee011fc98f7b71b2bd43';
3102
- const expectedAddress = '7YAesfwPk41VChUgr65bm8FEep7ymWqLSW5rpYB5zZPY';
3103
- const address = basecoin.getAddressFromPublicKey(publicKey);
3104
- address.should.equal(expectedAddress);
3105
- });
3106
- });
3107
- });
3108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwwQ0FBNEI7QUFDNUIsZ0RBQXdCO0FBQ3hCLCtDQUFpQztBQUNqQyw2Q0FBK0I7QUFFL0IsaURBQTBEO0FBRTFELGlEQUF3RDtBQUN4RCxtREFjOEI7QUFDOUIsbURBQStEO0FBQy9ELGlEQUE0QztBQUM1QyxtQ0FBNEU7QUFDNUUsdUNBQTRDO0FBRTVDLCtDQUF1RTtBQUN2RSwwREFBNEM7QUFDNUMsNERBQThDO0FBQzlDLDBEQUF1RDtBQUN2RCwyREFBd0Q7QUFFeEQsUUFBUSxDQUFDLE1BQU0sRUFBRTtJQUNmLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWEsQ0FBQztJQUNsQixJQUFJLE9BQU8sQ0FBQztJQUNaLElBQUksYUFBYSxDQUFDO0lBQ2xCLElBQUksMEJBQTBCLENBQUM7SUFDL0IsSUFBSSxXQUFXLENBQUM7SUFDaEIsSUFBSSxvQkFBb0IsQ0FBQztJQUN6QixJQUFJLHdCQUF3QixDQUFDO0lBQzdCLElBQUksd0JBQXdCLENBQUM7SUFDN0IsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMxRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztJQUV6RCxNQUFNLE9BQU8sR0FBRztRQUNkLEdBQUcsRUFBRSxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVM7UUFDeEMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE1BQU07S0FDakQsQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLFVBQVUsRUFBRTtZQUNWO2dCQUNFLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixNQUFNLEVBQUUsTUFBTTth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QUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUU7UUFDaEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUU7UUFDckMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNyRSxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUU7UUFDaEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUU7UUFDckMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQy9GLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBbUIsQ0FBQyxDQUFDLE1B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QUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsS0FBSztZQUNoRCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQztZQUN4QyxNQUFNLGNBQWMsR0FDbEIsa0lBQWtJLENBQUM7WUFDckksTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLE1BQU0sU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUV0RSxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtnQkFDOUcsT0FBTyxFQUFFLG9CQUFvQixjQUFjLEVBQUU7YUFDOUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7UUFDdkMsRUFBRSxDQUFDLDZDQUE2QyxFQUFFO1lBQ2hELE1BQU0sU0FBUyxHQUFHLGtFQUFrRSxDQUFDO1lBQ3JGLE1BQU0sZUFBZSxHQUFHLDhDQUE4QyxDQUFDO1lBRXZFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuXG5pbXBvcnQgeyBUT0tFTl8yMDIyX1BST0dSQU1fSUQgfSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5cbmltcG9ydCB7IEJpdEdvQVBJLCBlbmNyeXB0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQge1xuICBjb21tb24sXG4gIEVudmlyb25tZW50cyxcbiAgZ2VuZXJhdGVSYW5kb21QYXNzd29yZCxcbiAgSVdhbGxldCxcbiAgTVBDU3dlZXBUeHMsXG4gIE1QQ1R4LFxuICBNUENUeHMsXG4gIFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVHNzVXRpbHMsXG4gIFR4UmVxdWVzdCxcbiAgV2FsbGV0LFxuICBXYWxsZXRDb2luU3BlY2lmaWMsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEtleVBhaXIsIFNvbCwgU29sVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLCBUc29sIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBBdGFJbml0LCBJbnN0cnVjdGlvblBhcmFtcywgVG9rZW5UcmFuc2ZlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuaW1wb3J0IHsgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MgfSBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL2ZpeHR1cmVzL3NvbCc7XG5pbXBvcnQgKiBhcyByZXNvdXJjZXMgZnJvbSAnLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgeyBzb2xCYWNrdXBLZXkgfSBmcm9tICcuL2ZpeHR1cmVzL3NvbEJhY2t1cEtleSc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4vZ2V0QnVpbGRlckZhY3RvcnknO1xuXG5kZXNjcmliZSgnU09MOicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogU29sO1xuICBsZXQga2V5UGFpcjtcbiAgbGV0IG5ld1R4UHJlYnVpbGQ7XG4gIGxldCBuZXdUeFByZWJ1aWxkVG9rZW5UcmFuc2ZlcjtcbiAgbGV0IG5ld1R4UGFyYW1zO1xuICBsZXQgbmV3VHhQYXJhbXNXaXRoRXJyb3I7XG4gIGxldCBuZXdUeFBhcmFtc1dpdGhFeHRyYURhdGE7XG4gIGxldCBuZXdUeFBhcmFtc1Rva2VuVHJhbnNmZXI7XG4gIGNvbnN0IGJhZEFkZHJlc3NlcyA9IHJlc291cmNlcy5hZGRyZXNzZXMuaW52YWxpZEFkZHJlc3NlcztcbiAgY29uc3QgZ29vZEFkZHJlc3NlcyA9IHJlc291cmNlcy5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXM7XG5cbiAgY29uc3Qga2V5cGFpciA9IHtcbiAgICBwdWI6IHJlc291cmNlcy5hY2NvdW50V2l0aFNlZWQucHVibGljS2V5LFxuICAgIHBydjogcmVzb3VyY2VzLmFjY291bnRXaXRoU2VlZC5wcml2YXRlS2V5LmJhc2U1OCxcbiAgfTtcbiAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICByZWNpcGllbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6ICdsaW9udGVzdGUyMTInLFxuICAgICAgICBhbW91bnQ6ICcxMDAwJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICB0eEJhc2U2NDogcmVzb3VyY2VzLlRSQU5TRkVSX1VOU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSxcbiAgICB0eEluZm86IHtcbiAgICAgIGZlZVBheWVyOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgbm9uY2U6ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaScsXG4gICAgfSxcbiAgICB0eGlkOiAnNTg2YzViNTliMTBiMTM0ZDA0YzE2YWMxYjI3M2ZlM2M1NTI5ZjM0YWVmNzVkYjQ0NTZjZDQ2OWM1Y2RhYzdlMicsXG4gICAgaXNWb3RpbmdUcmFuc2FjdGlvbjogZmFsc2UsXG4gICAgY29pbjogJ3Rzb2wnLFxuICB9O1xuICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICB0eFByZWJ1aWxkLFxuICAgIHJlY2lwaWVudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogJ0NQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyxcbiAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgbWVtbyA9IHsgdmFsdWU6ICd0ZXN0IG1lbW8nIH07XG4gIGNvbnN0IGR1cmFibGVOb25jZSA9IHtcbiAgICB3YWxsZXROb25jZUFkZHJlc3M6ICc4WTdSTTZKZmNYNEFTU05Ca3Jrcm1TYlJ1NDMxWVZpOVkzb0xGbnpDMmRDaCcsXG4gICAgYXV0aFdhbGxldEFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gIH07XG4gIGNvbnN0IGVycm9yRHVyYWJsZU5vbmNlID0ge1xuICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZTTZKZmNYNEFTU05Ca3Jrcm1TYlJ1NDMxWVZpOVkzb0xGbnpDMmRDaCcsXG4gICAgYXV0aFdhbGxldEFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gIH07XG4gIGNvbnN0IHR4UGFyYW1zV2l0aEVycm9yID0ge1xuICAgIHR4UHJlYnVpbGQsXG4gICAgcmVjaXBpZW50czogW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiAnQ1A1RHBhYTQybU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xuICBjb25zdCB0eFBhcmFtc1dpdGhFeHRyYURhdGEgPSB7XG4gICAgdHhQcmVidWlsZCxcbiAgICByZWNpcGllbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgIGFtb3VudDogJzMwMDAwMCcsXG4gICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgdHhQcmVidWlsZFRva2VuVHJhbnNmZXIgPSB7XG4gICAgcmVjaXBpZW50czogW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiAnQUY1SDZ2QmtGbkp1VnFDaFJQZ1BRNEpSY1E1R2syNUhCRmhRUWt5b2ptdmcnLFxuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICB0eEhleDogcmVzb3VyY2VzLlRPS0VOX1RSQU5TRkVSX1RPX05BVElWRV9VTlNJR05FRF9UWF9IRVgsXG4gICAgdHhJbmZvOiB7XG4gICAgICBmZWVQYXllcjogJzREdWp5bVVGYlE4R0JLdEF3QVpyUTZRcXB2dEJFaXZMNDhoNHRhMm9KR2QyJyxcbiAgICAgIG5vbmNlOiAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknLFxuICAgIH0sXG4gICAgdHhpZDogJzU4NmM1YjU5YjEwYjEzNGQwNGMxNmFjMWIyNzNmZTNjNTUyOWYzNGFlZjc1ZGI0NDU2Y2Q0NjljNWNkYWM3ZTInLFxuICAgIGlzVm90aW5nVHJhbnNhY3Rpb246IGZhbHNlLFxuICAgIGNvaW46ICd0c29sJyxcbiAgfTtcbiAgY29uc3QgdHhQYXJhbXNUb2tlblRyYW5zZmVyID0ge1xuICAgIHR4UHJlYnVpbGQsXG4gICAgcmVjaXBpZW50czogW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiAnQUY1SDZ2QmtGbkp1VnFDaFJQZ1BRNEpSY1E1R2syNUhCRmhRUWt5b2ptdmcnLFxuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgZXJyb3JNZW1vID0geyB2YWx1ZTogJ2RpZmZlcmVudCBtZW1vJyB9O1xuICBjb25zdCBlcnJvckZlZVBheWVyID0gJzVocjVmaXNQaTZEWEN1dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJztcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c29sJyk7XG4gIGNvbnN0IHdhbGxldCA9IG5ldyBLZXlQYWlyKHJlc291cmNlcy5hdXRoQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBzdGFrZUFjY291bnQgPSBuZXcgS2V5UGFpcihyZXNvdXJjZXMuc3Rha2VBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IGJsb2NrSGFzaCA9IHJlc291cmNlcy5ibG9ja0hhc2hlcy52YWxpZEJsb2NrSGFzaGVzWzBdO1xuICBjb25zdCBhbW91bnQgPSAnMTAwMDAnO1xuICBjb25zdCB2YWxpZGF0b3IgPSByZXNvdXJjZXMudmFsaWRhdG9yO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdzb2wnLCBUc29sLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3Rzb2wnLCBUc29sLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3Rzb2wnKSBhcyBUc29sO1xuICAgIGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIocmVzb3VyY2VzLmFjY291bnRXaXRoU2VlZC5zZWVkKTtcbiAgICBuZXdUeFByZWJ1aWxkID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKHR4UHJlYnVpbGQpO1xuICAgIH07XG4gICAgbmV3VHhQcmVidWlsZFRva2VuVHJhbnNmZXIgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQcmVidWlsZFRva2VuVHJhbnNmZXIpO1xuICAgIH07XG4gICAgbmV3VHhQYXJhbXMgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQYXJhbXMpO1xuICAgIH07XG4gICAgbmV3VHhQYXJhbXNXaXRoRXJyb3IgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQYXJhbXNXaXRoRXJyb3IpO1xuICAgIH07XG4gICAgbmV3VHhQYXJhbXNXaXRoRXh0cmFEYXRhID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKHR4UGFyYW1zV2l0aEV4dHJhRGF0YSk7XG4gICAgfTtcbiAgICBuZXdUeFBhcmFtc1Rva2VuVHJhbnNmZXIgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQYXJhbXNUb2tlblRyYW5zZmVyKTtcbiAgICB9O1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGxldCBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbigndHNvbCcpO1xuICAgIGxvY2FsQmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoVHNvbCk7XG5cbiAgICBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbignc29sJyk7XG4gICAgbG9jYWxCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihTb2wpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVuIHRoZSByaWdodCBpbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGJhc2Vjb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCd0c29sJyk7XG4gICAgYmFzZWNvaW4uZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCdzb2wnKTtcbiAgICBiYXNlY29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdG5ldCBTb2xhbmEnKTtcbiAgICBiYXNlY29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDEwMDAwMDAwMDApO1xuICB9KTtcbiAgZGVzY3JpYmUoJ3ZlcmlmeSB0cmFuc2FjdGlvbnMnLCAoKSA9PiB7XG4gICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnLFxuICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAga2V5czogW1xuICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnLFxuICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc2MDAwMDAwMDAnLFxuICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc3MDAwMDAwMDAnLFxuICAgICAgXSxcbiAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICByb290QWRkcmVzczogd2FsbGV0LnB1YixcbiAgICAgIH0sXG4gICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgIH07XG4gICAgY29uc3Qgd2FsbGV0T2JqID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHdhbGxldERhdGEpO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHZhbGlkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICBtZW1vLFxuICAgICAgICBkdXJhYmxlTm9uY2UsXG4gICAgICAgIHdhbGxldDogd2FsbGV0T2JqLFxuICAgICAgfSBhcyBhbnkpO1xuICAgICAgdmFsaWRUcmFuc2FjdGlvbi5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBjb25zb2xpZGF0ZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICB0eFByZWJ1aWxkLmNvbnNvbGlkYXRlSWQgPSAnY29uc29saWRhdGVJZCc7XG5cbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnLFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICAgIGtleXM6IFtcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzYwMDAwMDAwMCcsXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NzAwMDAwMDAwJyxcbiAgICAgICAgXSxcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgcm9vdEFkZHJlc3M6IHN0YWtlQWNjb3VudC5wdWIsXG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICB9O1xuICAgICAgY29uc3Qgd2FsbGV0V2l0aERpZmZlcmVudEFkZHJlc3MgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG5cbiAgICAgIGNvbnN0IHZhbGlkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICBtZW1vLFxuICAgICAgICBkdXJhYmxlTm9uY2UsXG4gICAgICAgIHdhbGxldDogd2FsbGV0V2l0aERpZmZlcmVudEFkZHJlc3MsXG4gICAgICB9IGFzIGFueSk7XG4gICAgICB2YWxpZFRyYW5zYWN0aW9uLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB0eEJhc2U2NCBhbmQgdHhIZXggaW50ZXJjaGFuZ2VhYmx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIHR4UHJlYnVpbGQudHhIZXggPSB0eFByZWJ1aWxkLnR4QmFzZTY0O1xuICAgICAgdHhQcmVidWlsZC50eEJhc2U2NCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHZhbGlkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICBtZW1vLFxuICAgICAgICBkdXJhYmxlTm9uY2UsXG4gICAgICAgIHdhbGxldDogd2FsbGV0T2JqLFxuICAgICAgfSBhcyBhbnkpO1xuICAgICAgdmFsaWRUcmFuc2FjdGlvbi5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgc2VyaWFsaXplZCBoZXggc3RyaW5nIHRvIGJhc2U2NCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICB0eFByZWJ1aWxkLnR4QmFzZTY0ID0gQnVmZmVyLmZyb20odHhQcmVidWlsZC50eEJhc2U2NCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHZhbGlkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICBtZW1vLFxuICAgICAgICBkdXJhYmxlTm9uY2UsXG4gICAgICAgIHdhbGxldDogd2FsbGV0T2JqLFxuICAgICAgfSBhcyBhbnkpO1xuICAgICAgdmFsaWRUcmFuc2FjdGlvbi5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB3aGVuIGlucHV0IGByZWNpcGllbnRzYCBpcyBhYnNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHZhbGlkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICBtZW1vLFxuICAgICAgICBkdXJhYmxlTm9uY2UsXG4gICAgICAgIHdhbGxldDogd2FsbGV0T2JqLFxuICAgICAgfSBhcyBhbnkpO1xuICAgICAgdmFsaWRUcmFuc2FjdGlvbi5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmVyaWZ5IHRyYW5zYWN0aW9ucyB3aGVuIGhhdmUgZGlmZmVyZW50IG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIG1lbW86IGVycm9yTWVtbywgd2FsbGV0OiB3YWxsZXRPYmogfSBhcyBhbnkpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUeCBtZW1vIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50IG1lbW8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyBpZiB3ZSBwYXNzIFBEQSBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgICAgaWQ6ICc2N2Y4ZGRmZjRjOWI4YjU3YTJlMTZhY2ZmYWM5YTNiNScsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgICAga2V5czogW1xuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzUwMDAwMDAwMCcsXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NjAwMDAwMDAwJyxcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc3MDAwMDAwMDAnLFxuICAgICAgICBdLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICByb290QWRkcmVzczogJzh6YnNKQTVjOEhQUjdCUGpaa3JTVnJ1czJ1TXVYcUNmemtzR3dCM1VzY2piJyxcbiAgICAgICAgfSxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgIH07XG4gICAgICBjb25zdCB3YWxsZXRPYmogPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJzExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAnLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB0eEJhc2U2NDpcbiAgICAgICAgICAnMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZlYzFhZGNjODliYjU2NGYxZjgyMjU4MjExNDBhOTcyM2VmYTgwZThkNTA2NzY1NzcwYjdlMjAxZDY2ZDgyMDBkNGY2OTBlOWE4MTYzMjkxYjY5ZjhjMzgyN2FhZDk2Y2ZkMjEwNWVlZTNhYWU3NmNiY2EzOGZjYWQyYmY3ZjBhMDIwMTA3MGM3NmMzNTZjYjA2OWI2NmMyYjM1YTg2MzhiNGQ0YWZjYTc1YjMwM2YyOWYwZGVlYjRiZmY4NTI4Mjk5YTljOWQyMWM5NjE3MjA0NGYxMjE3YzM3ODRlOGYwMmY0OWUyYzhmYzM1OTFlODEyOTRhYjU0Mzk0ZjlkMjJmZDdiN2E4ZjYwMTI5ZTZlY2IyMDMwOWMyN2RjYmE1ZmM2YzQ0MTQzOGQzM2ExNTY4MDA0YTE4NjBlMjJjMTZmMDcxOTc2YTdkMmUyMDA4YmQzNGI1M2EwOGFhOWM4ZWMwNGViMjE5Njc0NWZjNjAyOTIyNDQ0NzQxN2UyZmIwZmNlZDYwMTI0MGNhYmJhNGNlNTM0YzAyZmMxNTRiYTU1OWVkMmEwMmFjOTcxZTMzODVhY2I0MjZmZjYzYmIxMDQwZTJjMjQzNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxOGM5NzI1OGY0ZTI0ODlmMWJiM2QxMDI5MTQ4ZTBkODMwYjVhMTM5OWRhZmYxMDg0MDQ4ZTdiZDhkYmU5Zjg1OWQxMDM4OWZiY2VlNTI4ZjIwODYxMWRjY2M3MzRiMzEwOTI1NDBjYjJiOGQ1OGQxMDBmMmVhYTJjZWRiNGRhNWUwNmE3ZDUxNzE5MmM1NjhlZTA4YTg0NWY3M2QyOTc4OGNmMDM1YzMxNDViMjFhYjM0NGQ4MDYyZWE5NDAwMDAwMDZhN2Q1MTcxOTJjNWM1MTIxOGNjOTRjM2Q0YWYxN2Y1OGRhZWUwODliYTFmZDQ0ZTNkYmQ5OGEwMDAwMDAwMDA2ZGRmNmUxZDc2NWExOTNkOWNiZTE0NmNlZWI3OWFjMWNiNDg1ZWQ1ZjViMzc5MTNhOGNmNTg1N2VmZjAwYTllNjgwNjM0NTMzODgyZjg4MGEzZTdkZmE5OTlkZmI4NjRiODg5NjhkMjQyYTBjOWE5MGI1ZGYxNDllNDJkYTA1MDMwNTAzMDIwOTAxMDQwNDAwMDAwMDA3MDcwMDAzMDYwODA1MGIwYTAwMGIwNDA0MDgwMzAwMGEwYzAwY2E5YTNiMDAwMDAwMDAwOScsXG4gICAgICAgIHR4SW5mbzoge1xuICAgICAgICAgIGZlZVBheWVyOiAnOHpic0pBNWM4SFBSN0JQalprclNWcnVzMnVNdVhxQ2Z6a3NHd0IzVXNjamInLFxuICAgICAgICAgIG5vbmNlOiAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknLFxuICAgICAgICB9LFxuICAgICAgICB0eGlkOiAnNTg2YzViNTliMTBiMTM0ZDA0YzE2YWMxYjI3M2ZlM2M1NTI5ZjM0YWVmNzVkYjQ0NTZjZDQ2OWM1Y2RhYzdlMicsXG4gICAgICAgIGlzVm90aW5nVHJhbnNhY3Rpb246IGZhbHNlLFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTInLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMCcsXG4gICAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgbWVtbyA9IHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICBjb25zdCB2ZXJpZnlUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIG1lbW86IG1lbW8sXG4gICAgICAgIHdhbGxldDogd2FsbGV0T2JqLFxuICAgICAgfSBhcyBhbnkpO1xuICAgICAgdmVyaWZ5VHJhbnNhY3Rpb24uc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZlcmlmeSB0cmFuc2FjdGlvbnMgd2hlbiBoYXZlIGRpZmZlcmVudCBkdXJhYmxlTm9uY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIG1lbW8sIGR1cmFibGVOb25jZTogZXJyb3JEdXJhYmxlTm9uY2UsIHdhbGxldDogd2FsbGV0T2JqIH0gYXMgYW55KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVHggZHVyYWJsZU5vbmNlIGRvZXMgbm90IG1hdGNoIHdpdGggcGFyYW0gZHVyYWJsZU5vbmNlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmVyaWZ5IHRyYW5zYWN0aW9ucyB3aGVuIGhhdmUgZGlmZmVyZW50IGZlZVBheWVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnLFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICAgIGtleXM6IFtcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzYwMDAwMDAwMCcsXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NzAwMDAwMDAwJyxcbiAgICAgICAgXSxcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgcm9vdEFkZHJlc3M6IHN0YWtlQWNjb3VudC5wdWIsXG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICB9O1xuICAgICAgY29uc3Qgd2FsbGV0V2l0aERpZmZlcmVudEFkZHJlc3MgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG5cbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCBtZW1vLCB3YWxsZXQ6IHdhbGxldFdpdGhEaWZmZXJlbnRBZGRyZXNzIH0gYXMgYW55KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVHggZmVlIHBheWVyIGlzIG5vdCB0aGUgd2FsbGV0IHJvb3QgYWRkcmVzcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZlcmlmeSB0cmFuc2FjdGlvbnMgd2hlbiBoYXZlIGRpZmZlcmVudCByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtc1dpdGhFcnJvcigpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCBtZW1vLCBlcnJvckZlZVBheWVyLCB3YWxsZXQ6IHdhbGxldE9iaiB9IGFzIGFueSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRva2VuIHRyYW5zYWN0aW9uIHdpdGggbmF0aXZlIGFkZHJlc3MgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtc1Rva2VuVHJhbnNmZXIoKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnQUY1SDZ2QmtGbkp1VnFDaFJQZ1BRNEpSY1E1R2syNUhCRmhRUWt5b2ptdmcnOyAvLyBOYXRpdmUgU09MIGFkZHJlc3NcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBbeyBhZGRyZXNzLCBhbW91bnQ6ICcxJywgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyB9XTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkVG9rZW5UcmFuc2ZlcigpO1xuICAgICAgY29uc3QgZmVlUGF5ZXJXYWxsZXREYXRhID0ge1xuICAgICAgICBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJyxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NTAwMDAwMDAwJyxcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc2MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzcwMDAwMDAwMCcsXG4gICAgICAgIF0sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiAnNER1anltVUZiUThHQkt0QXdBWnJRNlFxcHZ0QkVpdkw0OGg0dGEyb0pHZDInLFxuICAgICAgICB9LFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZlZVBheWVyV2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIGZlZVBheWVyV2FsbGV0RGF0YSk7XG4gICAgICBjb25zdCB2YWxpZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiBmZWVQYXllcldhbGxldCxcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIHZhbGlkVHJhbnNhY3Rpb24uc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0b2tlbiB0cmFuc2FjdGlvbiB3aXRoIGxlYWRpbmcgemVybyByZWNpcGllbnQgYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtc1Rva2VuVHJhbnNmZXIoKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnQUY1SDZ2QmtGbkp1VnFDaFJQZ1BRNEpSY1E1R2syNUhCRmhRUWt5b2ptdmcnOyAvLyBOYXRpdmUgU09MIGFkZHJlc3NcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBbeyBhZGRyZXNzLCBhbW91bnQ6ICcwMDAxJywgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyB9XTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkVG9rZW5UcmFuc2ZlcigpO1xuICAgICAgY29uc3QgZmVlUGF5ZXJXYWxsZXREYXRhID0ge1xuICAgICAgICBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJyxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NTAwMDAwMDAwJyxcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc2MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzcwMDAwMDAwMCcsXG4gICAgICAgIF0sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiAnNER1anltVUZiUThHQkt0QXdBWnJRNlFxcHZ0QkVpdkw0OGg0dGEyb0pHZDInLFxuICAgICAgICB9LFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZlZVBheWVyV2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIGZlZVBheWVyV2FsbGV0RGF0YSk7XG4gICAgICBjb25zdCB2YWxpZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiBmZWVQYXllcldhbGxldCxcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIHZhbGlkVHJhbnNhY3Rpb24uc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSB0b2tlbiB0cmFuc2FjdGlvbiB3aXRoIGRpZmZlcmVudCByZWNpcGllbnQgdG9rZW5OYW1lJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtc1Rva2VuVHJhbnNmZXIoKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnQUY1SDZ2QmtGbkp1VnFDaFJQZ1BRNEpSY1E1R2syNUhCRmhRUWt5b2ptdmcnOyAvLyBOYXRpdmUgU09MIGFkZHJlc3NcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBbeyBhZGRyZXNzLCBhbW91bnQ6ICcxJywgdG9rZW5OYW1lOiAndHNvbDp1c2R0JyB9XTsgLy8gRGlmZmVyZW50IHRva2VuTmFtZSwgc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHR4XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZFRva2VuVHJhbnNmZXIoKTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB3YWxsZXQ6IHdhbGxldE9iaixcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSB0b2tlbiB0cmFuc2FjdGlvbiB3aXRoIGRpZmZlcmVudCByZWNpcGllbnQgYW1vdW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXNUb2tlblRyYW5zZmVyKCk7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJ0FGNUg2dkJrRm5KdVZxQ2hSUGdQUTRKUmNRNUdrMjVIQkZoUVFreW9qbXZnJzsgLy8gTmF0aXZlIFNPTCBhZGRyZXNzXG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gW3sgYWRkcmVzcywgYW1vdW50OiAnMicsIHRva2VuTmFtZTogJ3Rzb2w6dXNkdCcgfV07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZFRva2VuVHJhbnNmZXIoKTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB3YWxsZXQ6IHdhbGxldE9iaixcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSB0b2tlbiB0cmFuc2FjdGlvbiB3aXRoIGRpZmZlcmVudCBuYXRpdmUgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXNUb2tlblRyYW5zZmVyKCk7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJ0FGNUg2dkJrRm5KdVZxQ2hSUGdQUTRKUmNRNUdrMjVIQkZoUVFreW9qbXZYJzsgLy8gTmF0aXZlIFNPTCBhZGRyZXNzLCBkaWZmZXJlbnQgdGhhbiB0eCByZWNpcGllbnRzXG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gW3sgYWRkcmVzcywgYW1vdW50OiAnMScsIHRva2VuTmFtZTogJ3Rzb2w6dXNkYycgfV07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZFRva2VuVHJhbnNmZXIoKTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB3YWxsZXQ6IHdhbGxldE9iaixcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbnMgd2hlbiByZWNpcGllbnRzIGhhcyBleHRyYSBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtc1dpdGhFeHRyYURhdGEoKTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICBjb25zdCB2YWxpZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgbWVtbyxcbiAgICAgICAgZHVyYWJsZU5vbmNlLFxuICAgICAgICB3YWxsZXQ6IHdhbGxldE9iaixcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIHZhbGlkVHJhbnNhY3Rpb24uc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYWN0aXZhdGUgc3Rha2luZyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0U3Rha2luZ0FjdGl2YXRlQnVpbGRlcigpXG4gICAgICAgIC5zdGFraW5nQWRkcmVzcyhzdGFrZUFjY291bnQucHViKVxuICAgICAgICAuc2VuZGVyKHdhbGxldC5wdWIpXG4gICAgICAgIC5ub25jZShibG9ja0hhc2gpXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAudmFsaWRhdG9yKHZhbGlkYXRvci5wdWIpXG4gICAgICAgIC5tZW1vKCd0ZXN0IG1lbW8nKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5idWlsZCgpO1xuICAgICAgY29uc3QgdHhUb0Jyb2FkY2FzdEZvcm1hdCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgdHhQcmVidWlsZC50eEJhc2U2NCA9IHR4VG9Ccm9hZGNhc3RGb3JtYXQ7XG4gICAgICB0eFByZWJ1aWxkLnR4SW5mby5ub25jZSA9ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbic7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJzdkUnVHRmJVMnkya2lqUDZvMUxZTnpWeXo0eWYxM01vb3FvaW9uQ3p2NVphJyxcbiAgICAgICAgICBhbW91bnQ6IGFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB2YWxpZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgbWVtbyxcbiAgICAgICAgd2FsbGV0OiB3YWxsZXRPYmosXG4gICAgICB9IGFzIGFueSk7XG4gICAgICB2YWxpZFRyYW5zYWN0aW9uLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHdpdGhkcmF3IHN0YWtpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFN0YWtpbmdXaXRoZHJhd0J1aWxkZXIoKVxuICAgICAgICAuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1YilcbiAgICAgICAgLnNlbmRlcih3YWxsZXQucHViKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoKVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLm1lbW8oJ3Rlc3QgbWVtbycpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eFRvQnJvYWRjYXN0Rm9ybWF0ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICB0eFByZWJ1aWxkLnR4QmFzZTY0ID0gdHhUb0Jyb2FkY2FzdEZvcm1hdDtcbiAgICAgIHR4UHJlYnVpbGQudHhJbmZvLm5vbmNlID0gJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJztcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIGFtb3VudDogYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHZhbGlkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICBtZW1vLFxuICAgICAgICB3YWxsZXQ6IHdhbGxldE9iaixcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIHZhbGlkVHJhbnNhY3Rpb24uc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgZGVhY3RpdmF0ZSBzdGFraW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIoKVxuICAgICAgICAuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1YilcbiAgICAgICAgLnNlbmRlcih3YWxsZXQucHViKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoKVxuICAgICAgICAubWVtbygndGVzdCBtZW1vJylcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4VG9Ccm9hZGNhc3RGb3JtYXQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIHR4UHJlYnVpbGQudHhCYXNlNjQgPSB0eFRvQnJvYWRjYXN0Rm9ybWF0O1xuICAgICAgdHhQcmVidWlsZC50eEluZm8ubm9uY2UgPSAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nO1xuICAgICAgdHhQYXJhbXMucmVjaXBpZW50cyA9IFtdO1xuICAgICAgY29uc3QgdmFsaWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIG1lbW8sXG4gICAgICAgIHdhbGxldDogd2FsbGV0T2JqLFxuICAgICAgfSBhcyBhbnkpO1xuICAgICAgdmFsaWRUcmFuc2FjdGlvbi5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBjcmVhdGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIoKVxuICAgICAgICAubWludCgndHNvbDp1c2RjJylcbiAgICAgICAgLnNlbmRlcih3YWxsZXQucHViKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoKVxuICAgICAgICAubWVtbygndGVzdCBtZW1vJylcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4VG9Ccm9hZGNhc3RGb3JtYXQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIHR4UHJlYnVpbGQudHhCYXNlNjQgPSB0eFRvQnJvYWRjYXN0Rm9ybWF0O1xuICAgICAgdHhQcmVidWlsZC50eEluZm8ubm9uY2UgPSBibG9ja0hhc2g7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gW107XG4gICAgICBjb25zdCB2YWxpZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgbWVtbyxcbiAgICAgICAgd2FsbGV0OiB3YWxsZXRPYmosXG4gICAgICB9IGFzIGFueSk7XG4gICAgICB2YWxpZFRyYW5zYWN0aW9uLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhY2NlcHQgdmFsaWQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBnb29kQWRkcmVzc2VzLmZvckVhY2goKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGJhZEFkZHJlc3Nlcy5mb3JFYWNoKChhZGRyKSA9PiB7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIHZhbGlkIHB1YiBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGtleVBhaXIuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3B1YicpO1xuICAgIGJhc2Vjb2luLmlzVmFsaWRQdWIoa2V5UGFpci5wdWIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjaGVjayBhbiBpbnZhbGlkIHB1YiBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJhZFB1YktleSA9IGtleVBhaXIucHViLnNsaWNlKDAsIGtleVBhaXIucHViLmxlbmd0aCAtIDEpICsgJy0nO1xuICAgIGJhc2Vjb2luLmlzVmFsaWRQdWIoYmFkUHViS2V5KS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIHZhbGlkIHBydiBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGtleVBhaXIuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BydicpO1xuICAgIGJhc2Vjb2luLmlzVmFsaWRQcnYoa2V5UGFpci5wcnYpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjaGVjayBhbiBpbnZhbGlkIHBydiBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJhZFBydktleSA9IGtleVBhaXIucHJ2ID8ga2V5UGFpci5wcnYuc2xpY2UoMCwga2V5UGFpci5wcnYubGVuZ3RoIC0gMSkgKyAnLScgOiB1bmRlZmluZWQ7XG4gICAgYmFzZWNvaW4uaXNWYWxpZFBydihiYWRQcnZLZXkgYXMgc3RyaW5nKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyc2UgVHJhbnNhY3Rpb25zOicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIGFuIHVuc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5wYXJzZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhCYXNlNjQ6IHRlc3REYXRhLnJhd1RyYW5zYWN0aW9ucy50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHBhcnNlZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgICAgICAgYW1vdW50OiAzMDUwMDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NDogdGVzdERhdGEucmF3VHJhbnNhY3Rpb25zLnRyYW5zZmVyLnNpZ25lZCxcbiAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHBhcnNlZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgICAgICAgYW1vdW50OiAzMDUwMDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgYW4gdW5zaWduZWQgd2FsbGV0IGluaXQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NDogdGVzdERhdGEucmF3VHJhbnNhY3Rpb25zLndhbGxldEluaXQudW5zaWduZWQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgICAgICAgIGFtb3VudDogMzEwMDAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIGEgc2lnbmVkIHdhbGxldCBpbml0IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5wYXJzZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhCYXNlNjQ6IHRlc3REYXRhLnJhd1RyYW5zYWN0aW9ucy53YWxsZXRJbml0LnNpZ25lZCxcbiAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHBhcnNlZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgICAgICAgYW1vdW50OiAzMTAwMDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICc4WTdSTTZKZmNYNEFTU05Ca3Jrcm1TYlJ1NDMxWVZpOVkzb0xGbnpDMmRDaCcsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgYW4gdW5zaWduZWQgdHJhbnNmZXIgdG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NDogdGVzdERhdGEucmF3VHJhbnNhY3Rpb25zLnRyYW5zZmVyVG9rZW4udW5zaWduZWQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0NQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyxcbiAgICAgICAgICAgIGFtb3VudDogNTAwMCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0NQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyxcbiAgICAgICAgICAgIGFtb3VudDogJzMwMDAwMCcsXG4gICAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgYSBzaWduZWQgdHJhbnNmZXIgdG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NDogdGVzdERhdGEucmF3VHJhbnNhY3Rpb25zLnRyYW5zZmVyVG9rZW4uc2lnbmVkLFxuICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgZmVlOiAnNTAwMCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcGFyc2VkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGlucHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgICBhbW91bnQ6IDUwMDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFeHBsYWluIFRyYW5zYWN0aW9uczonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGFuIHVuc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NDogdGVzdERhdGEucmF3VHJhbnNhY3Rpb25zLnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgZmVlOiAnNTAwMCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnU2VuZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICAgIGZlZVJhdGU6IDUwMDAsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86ICd0ZXN0IG1lbW8nLFxuICAgICAgICBibG9ja2hhc2g6ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaScsXG4gICAgICAgIGR1cmFibGVOb25jZToge1xuICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhCYXNlNjQ6IHRlc3REYXRhLnJhd1RyYW5zYWN0aW9ucy50cmFuc2Zlci5zaWduZWQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICcyWEZ4R2ZYZGRLV25xR2FNQXNmTkw4SGdYcUR2akJMMkFlMjhLV3JSdmc5YlFCbUNycEhZVkRhY3VaRmVBVXlZd2pYRzZleTJqVEFSWDVWUUNuajdTRjRMJyxcbiAgICAgICAgdHlwZTogJ1NlbmQnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzMwMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiAndGVzdCBtZW1vJyxcbiAgICAgICAgYmxvY2toYXNoOiAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHtcbiAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6ICc4WTdSTTZKZmNYNEFTU05Ca3Jrcm1TYlJ1NDMxWVZpOVkzb0xGbnpDMmRDaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYW4gdW5zaWduZWQgd2FsbGV0IGluaXQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4QmFzZTY0OiB0ZXN0RGF0YS5yYXdUcmFuc2FjdGlvbnMud2FsbGV0SW5pdC51bnNpZ25lZCxcbiAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnV2FsbGV0SW5pdGlhbGl6YXRpb24nLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzMwMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMDAwMCcsXG4gICAgICAgICAgZmVlUmF0ZTogNTAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgYmxvY2toYXNoOiAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVtbzogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgc2lnbmVkIHdhbGxldCBpbml0IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NDogdGVzdERhdGEucmF3VHJhbnNhY3Rpb25zLndhbGxldEluaXQuc2lnbmVkLFxuICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgZmVlOiAnNTAwMCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICc3VGtVOHdMZ1hEZUxGYlZ5ZHRnNm1xTXNwOUdhdHNldGl0U25neXNnanhGaG9mS1NVY0xQQm9LUEhjaUxlR0VmSkZNc3FlenBabUdSU0ZRVEJ5N1pEc2cnLFxuICAgICAgICB0eXBlOiAnV2FsbGV0SW5pdGlhbGl6YXRpb24nLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzMwMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMDAwMCcsXG4gICAgICAgICAgZmVlUmF0ZTogNTAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgYmxvY2toYXNoOiAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVtbzogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGFuIHVuc2lnbmVkIHRva2VuIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NDogdGVzdERhdGEucmF3VHJhbnNhY3Rpb25zLnRyYW5zZmVyVG9rZW4udW5zaWduZWQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdTZW5kJyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiAndGVzdCBtZW1vJyxcbiAgICAgICAgYmxvY2toYXNoOiAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHtcbiAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogJzEyZjZEM1d1YkdWZVFvSDJtOGtUdnZjcmFzV2RYV3d0VnpVQ3lSTkRaeEEyJyxcbiAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6ICc4WTdSTTZKZmNYNEFTU05Ca3Jrcm1TYlJ1NDMxWVZpOVkzb0xGbnpDMmRDaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBzaWduZWQgdG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4QmFzZTY0OiB0ZXN0RGF0YS5yYXdUcmFuc2FjdGlvbnMudHJhbnNmZXJUb2tlbi5zaWduZWQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICcydGljVTRaa0VxZFRIVUxyNkxvYlRnV0JoaW02RTd3U3NjRGhNNGd6eXVHVW1ReVV3TFlob3FhaWZ1dndtTnp6RWYxVDVhZWZWY2dNUWtTSGRKNW5zcmZaJyxcbiAgICAgICAgdHlwZTogJ1NlbmQnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0NQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyxcbiAgICAgICAgICAgIGFtb3VudDogJzMwMDAwMCcsXG4gICAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICAgIGZlZVJhdGU6IDUwMDAsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86ICd0ZXN0IG1lbW8nLFxuICAgICAgICBibG9ja2hhc2g6ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaScsXG4gICAgICAgIGR1cmFibGVOb25jZToge1xuICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnMTJmNkQzV3ViR1ZlUW9IMm04a1R2dmNyYXNXZFhXd3RWelVDeVJORFp4QTInLFxuICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhY3RpdmF0ZSBzdGFraW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRTdGFraW5nQWN0aXZhdGVCdWlsZGVyKClcbiAgICAgICAgLnN0YWtpbmdBZGRyZXNzKHN0YWtlQWNjb3VudC5wdWIpXG4gICAgICAgIC5zZW5kZXIod2FsbGV0LnB1YilcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC52YWxpZGF0b3IodmFsaWRhdG9yLnB1YilcbiAgICAgICAgLm1lbW8oJ3Rlc3QgbWVtbycpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eFRvQnJvYWRjYXN0Rm9ybWF0ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhCYXNlNjQ6IHR4VG9Ccm9hZGNhc3RGb3JtYXQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdTdGFraW5nQWN0aXZhdGUnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICc3ZFJ1R0ZiVTJ5MmtpalA2bzFMWU56Vnl6NHlmMTNNb29xb2lvbkN6djVaYScsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnMTAwMDAnLFxuICAgICAgICAgIGZlZVJhdGU6IDUwMDAsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86ICd0ZXN0IG1lbW8nLFxuICAgICAgICBibG9ja2hhc2g6ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbicsXG4gICAgICAgIGR1cmFibGVOb25jZTogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGRlYWN0aXZhdGUgc3Rha2luZyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0U3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyKClcbiAgICAgICAgLnN0YWtpbmdBZGRyZXNzKHN0YWtlQWNjb3VudC5wdWIpXG4gICAgICAgIC5zZW5kZXIod2FsbGV0LnB1YilcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLm1lbW8oJ3Rlc3QgbWVtbycpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eFRvQnJvYWRjYXN0Rm9ybWF0ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhCYXNlNjQ6IHR4VG9Ccm9hZGNhc3RGb3JtYXQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdTdGFraW5nRGVhY3RpdmF0ZScsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiAndGVzdCBtZW1vJyxcbiAgICAgICAgYmxvY2toYXNoOiAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiB3aXRoZHJhdyBzdGFraW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRTdGFraW5nV2l0aGRyYXdCdWlsZGVyKClcbiAgICAgICAgLnN0YWtpbmdBZGRyZXNzKHN0YWtlQWNjb3VudC5wdWIpXG4gICAgICAgIC5zZW5kZXIod2FsbGV0LnB1YilcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC5tZW1vKCd0ZXN0IG1lbW8nKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5idWlsZCgpO1xuICAgICAgY29uc3QgdHhUb0Jyb2FkY2FzdEZvcm1hdCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4QmFzZTY0OiB0eFRvQnJvYWRjYXN0Rm9ybWF0LFxuICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgZmVlOiAnNTAwMCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnU3Rha2luZ1dpdGhkcmF3JyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICAgIGZlZVJhdGU6IDUwMDAsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86ICd0ZXN0IG1lbW8nLFxuICAgICAgICBibG9ja2hhc2g6ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbicsXG4gICAgICAgIGR1cmFibGVOb25jZTogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGNyZWF0ZSBBVEEgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0b2tlbk5hbWUgPSAndHNvbDp1c2RjJztcbiAgICAgIGNvbnN0IHJlbnRFeGVtcHRBbW91bnQgPSAnMzAwMDAwMCc7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIod2FsbGV0LnB1YilcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLm1pbnQodG9rZW5OYW1lKVxuICAgICAgICAucmVudEV4ZW1wdEFtb3VudChyZW50RXhlbXB0QW1vdW50KVxuICAgICAgICAubWVtbygndGVzdCBtZW1vJylcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4VG9Ccm9hZGNhc3RGb3JtYXQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NDogdHhUb0Jyb2FkY2FzdEZvcm1hdCxcbiAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICB9LFxuICAgICAgICB0b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50OiByZW50RXhlbXB0QW1vdW50LFxuICAgICAgfSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ0Fzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbicsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICczMDA1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiAndGVzdCBtZW1vJyxcbiAgICAgICAgYmxvY2toYXNoOiAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICcxNDFCRk5lbTNwa25jOEN6UFZMdjFSaTNidGdLZENzYWZZUDVuWHdtWGZ4VScsXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6ICdGNHVMZVhKb0Z6M2h3MTNNcG9zdXdhUWJNY1piQ2pxdkVHUFBlUlJCMUJ5ZicsXG4gICAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBjcmVhdGUgbXVsdGkgQVRBIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG93bmVyQWRkcmVzczogd2FsbGV0LnB1YixcbiAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3duZXJBZGRyZXNzOiBkdXJhYmxlTm9uY2Uud2FsbGV0Tm9uY2VBZGRyZXNzLFxuICAgICAgICAgIHRva2VuTmFtZTogJ3Rzb2w6cmF5JyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCByZW50RXhlbXB0QW1vdW50ID0gJzMwMDAwMDAnO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHdhbGxldC5wdWIpXG4gICAgICAgIC5ub25jZShibG9ja0hhc2gpXG4gICAgICAgIC5lbmFibGVUb2tlbihyZWNpcGllbnRzWzBdKVxuICAgICAgICAuZW5hYmxlVG9rZW4ocmVjaXBpZW50c1sxXSlcbiAgICAgICAgLnJlbnRFeGVtcHRBbW91bnQocmVudEV4ZW1wdEFtb3VudClcbiAgICAgICAgLm1lbW8oJ3Rlc3QgbWVtbycpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eFRvQnJvYWRjYXN0Rm9ybWF0ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhCYXNlNjQ6IHR4VG9Ccm9hZGNhc3RGb3JtYXQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogcmVudEV4ZW1wdEFtb3VudCxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb24nLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnNjAwNTAwMCcsXG4gICAgICAgICAgZmVlUmF0ZTogNTAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogJ3Rlc3QgbWVtbycsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnMTQxQkZOZW0zcGtuYzhDelBWTHYxUmkzYnRnS2RDc2FmWVA1blh3bVhmeFUnLFxuICAgICAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYSm9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICc5S2FMaW5aRk5XNWNoTDRKOFVvS25URUNwcFdWTXozZXdneDRGQWt4VURjZicsXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6ICc5a0xKb0diTWdTdGVwdGtoS0t1aDdrZW40SkV2SHJUODMxNTdlekVHclo3UicsXG4gICAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnJheScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGFuIHVuc2lnbmVkIHRva2VuIHRyYW5zZmVyIHdpdGggQVRBIGNyZWF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NDogdGVzdERhdGEucmF3VHJhbnNhY3Rpb25zLnRva2VuVHJhbnNmZXJXaXRoQXRhQ3JlYXRpb24udW5zaWduZWQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogJzMwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1NlbmQnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJzJlS2pWdHpWM29QVFhGZHRSU0RqM0VtOWsxTVY3azhXaktrQnN6UVV3aXpTJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogJ3Rzb2w6dXNkYycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlOiB7IGZlZTogJzMwMDUwMDAnLCBmZWVSYXRlOiA1MDAwIH0sXG4gICAgICAgIG1lbW86IHVuZGVmaW5lZCxcbiAgICAgICAgYmxvY2toYXNoOiAnMjdFM01YRnZYTVVOWWVNSmVYMXBBYkVSR3NKZlVia2FaVGZnTWdwbU5ONWcnLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICcyZUtqVnR6VjNvUFRYRmR0UlNEajNFbTlrMU1WN2s4V2pLa0JzelFVd2l6UycsXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6ICdGNHVMZVhKb0Z6M2h3MTNNcG9zdXdhUWJNY1piQ2pxdkVHUFBlUlJCMUJ5ZicsXG4gICAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0tleXBhaXI6JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBrZXlwYWlyIGZyb20gcmFuZG9tIHNlZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IGJhc2Vjb2luLmdlbmVyYXRlS2V5UGFpcigncGxhY2Vob2xkZXInIGFzIGFueSksICdnZW5lcmF0ZUtleVBhaXIgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIGtleXBhaXIgZnJvbSBhIHNlZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IGJhc2Vjb2luLmdlbmVyYXRlS2V5UGFpcigncGxhY2Vob2xkZXInIGFzIGFueSksICdnZW5lcmF0ZUtleVBhaXIgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2lnbiB0cmFuc2FjdGlvbjonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmVkOiBhbnkgPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhCYXNlNjQ6IHJlc291cmNlcy5SQVdfVFhfVU5TSUdORUQsXG4gICAgICAgICAga2V5czogW3Jlc291cmNlcy5hY2NvdW50V2l0aFNlZWQucHVibGljS2V5LnRvU3RyaW5nKCldLFxuICAgICAgICB9LFxuICAgICAgICBwcnY6IHJlc291cmNlcy5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTgsXG4gICAgICB9IGFzIGFueSk7XG4gICAgICBzaWduZWQudHhIZXguc2hvdWxkLmVxdWFsKHJlc291cmNlcy5SQVdfVFhfU0lHTkVEKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHR4SGV4IGFuZCB0eEJhc2U2NCBpbnRlcmNoYW5nZWFibHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduZWQ6IGFueSA9IGF3YWl0IGJhc2Vjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogcmVzb3VyY2VzLlJBV19UWF9VTlNJR05FRCxcbiAgICAgICAgICBrZXlzOiBbcmVzb3VyY2VzLmFjY291bnRXaXRoU2VlZC5wdWJsaWNLZXkudG9TdHJpbmcoKV0sXG4gICAgICAgIH0sXG4gICAgICAgIHBydjogcmVzb3VyY2VzLmFjY291bnRXaXRoU2VlZC5wcml2YXRlS2V5LmJhc2U1OCxcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIHNpZ25lZC50eEhleC5zaG91bGQuZXF1YWwocmVzb3VyY2VzLlJBV19UWF9TSUdORUQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpbnZhbGlkIHRyYW5zYWN0aW9uIHdoZW4gc2lnbiB3aXRoIHB1YmxpYyBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEJhc2U2NDogcmVzb3VyY2VzLlJBV19UWF9VTlNJR05FRCxcbiAgICAgICAgICAgIGtleXM6IFtyZXNvdXJjZXMuYWNjb3VudFdpdGhTZWVkLnB1YmxpY0tleS50b1N0cmluZygpXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBydjogcmVzb3VyY2VzLmFjY291bnRXaXRoU2VlZC5wdWJsaWNLZXksXG4gICAgICAgIH0gYXMgYW55KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCBrZXknKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NpZ24gbWVzc2FnZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNpZ24gbWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25lZCA9IGF3YWl0IGJhc2Vjb2luLnNpZ25NZXNzYWdlKGtleXBhaXIsICdzaWduZWQgbWVzc2FnZScpO1xuICAgICAgc2lnbmVkXG4gICAgICAgIC50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgLnNob3VsZC5lcXVhbCgncys3ZC84YVcvdHdmTS8wd0xTS09HeGQ5K0xoRElpei9nMEZmSjM5eWxKaFFJa2pLMFJZUG0vWStnZGVKNURJeTZLNmg2Z0NYWEVTRG9tbHYxMkRCQlE9PScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGRudCBzaWduIG1lc3NhZ2Ugd2hlbiBtZXNzYWdlIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5zaWduTWVzc2FnZShrZXlwYWlyLCB1bmRlZmluZWQgYXMgYW55KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgb3IgYW4gaW5zdGFuY2Ugb2YgQnVmZmVyLCBBcnJheUJ1ZmZlciwgb3IgQXJyYXkgb3IgYW4gQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHVuZGVmaW5lZCdcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0dldCBTaWduaW5nIFBheWxvYWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSB2YWxpZCBzaWduaW5nIHBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoYmFzZWNvaW4uZ2V0Q2hhaW4oKSk7XG4gICAgICBjb25zdCByZWJ1aWx0U2lnbmFibGVQYXlsb2FkID0gKGF3YWl0IGZhY3RvcnkuZnJvbShyZXNvdXJjZXMuVFJBTlNGRVJfVU5TSUdORURfVFhfV0lUSF9NRU1PKS5idWlsZCgpKVxuICAgICAgICAuc2lnbmFibGVQYXlsb2FkO1xuICAgICAgY29uc3Qgc2lnbmluZ1BheWxvYWQgPSBhd2FpdCBiYXNlY29pbi5nZXRTaWduYWJsZVBheWxvYWQocmVzb3VyY2VzLlRSQU5TRkVSX1VOU0lHTkVEX1RYX1dJVEhfTUVNTyk7XG4gICAgICBzaWduaW5nUGF5bG9hZC5zaG91bGQuYmUuZGVlcEVxdWFsKHJlYnVpbHRTaWduYWJsZVBheWxvYWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBDbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQgdHhuIGJ1aWxkZXIgZnJvbSByYXcgdHhuJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KGJhc2Vjb2luLmdldENoYWluKCkpO1xuICAgICAgY29uc3QgdHhuQnVpbGRlciA9IGZhY3RvcnkuZnJvbShyZXNvdXJjZXMuVFJBTlNGRVJfVU5TSUdORURfVFhfQ0xPU0VfQVRBKTtcbiAgICAgIGFzc2VydC5vayh0eG5CdWlsZGVyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ByZXNpZ24gdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgdHhSZXF1ZXN0SWQgPSAndHhSZXF1ZXN0SWQnO1xuICAgIGxldCBzYW5kYm94OiBzaW5vbi5TaW5vblNhbmRib3g7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgc2FuZGJveC52ZXJpZnlBbmRSZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlYnVpbGQgdHggcmVxdWVzdCBmb3IgaG90IHdhbGxldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZWJ1aWx0VHg6IFR4UmVxdWVzdCA9IHtcbiAgICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICAgIHVuc2lnbmVkVHhzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VyaWFsaXplZFR4SGV4OiAnZGVhZGJlZWYnLFxuICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdzZXJpYWxpemVkVHhIZXgnLFxuICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHRyYW5zYWN0aW9uczogW10sXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgaW50ZW50OiB7XG4gICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICB9LFxuICAgICAgICBsYXRlc3Q6IHRydWUsXG4gICAgICAgIHN0YXRlOiAncGVuZGluZ1VzZXJTaWduYXR1cmUnLFxuICAgICAgICB3YWxsZXRUeXBlOiAnaG90JyxcbiAgICAgICAgd2FsbGV0SWQ6ICd3YWxsZXRJZCcsXG4gICAgICAgIHBvbGljaWVzQ2hlY2tlZDogdHJ1ZSxcbiAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgdXNlcklkOiAndXNlcklkJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN0dWJUc3NVdGlscyA9IHNhbmRib3guY3JlYXRlU3R1Ykluc3RhbmNlKFRzc1V0aWxzKTtcbiAgICAgIHN0dWJUc3NVdGlscy5kZWxldGVTaWduYXR1cmVTaGFyZXMucmVzb2x2ZXMoW10pO1xuICAgICAgc3R1YlRzc1V0aWxzLmdldFR4UmVxdWVzdC5yZXNvbHZlcyhyZWJ1aWx0VHgpO1xuXG4gICAgICBjb25zdCBob3RXYWxsZXQgPSB7XG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByZXNpZ25lZFRyYW5zYWN0aW9uOiBhbnkgPSBhd2FpdCBiYXNlY29pbi5wcmVzaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICB3YWxsZXREYXRhOiBob3RXYWxsZXQsXG4gICAgICAgIHRzc1V0aWxzOiBzdHViVHNzVXRpbHMsXG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZCxcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgcHJlc2lnbmVkVHJhbnNhY3Rpb24ud2FsbGV0RGF0YS5zaG91bGQuZGVlcEVxdWFsKGhvdFdhbGxldCk7XG4gICAgICBwcmVzaWduZWRUcmFuc2FjdGlvbi50eFByZWJ1aWxkLnNob3VsZC5kZWVwRXF1YWwocmVidWlsdFR4KTtcbiAgICAgIHByZXNpZ25lZFRyYW5zYWN0aW9uLnR4SGV4LnNob3VsZC5lcXVhbChyZWJ1aWx0VHgudW5zaWduZWRUeHNbMF0uc2VyaWFsaXplZFR4SGV4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZG8gbm90aGluZyBmb3Igbm9uLWhvdCB3YWxsZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29sZFdhbGxldCA9IHtcbiAgICAgICAgdHlwZTogJ2NvbGQnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcHJlc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5wcmVzaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICB3YWxsZXREYXRhOiBjb2xkV2FsbGV0LFxuICAgICAgfSBhcyBhbnkpO1xuICAgICAgcHJlc2lnbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHdhbGxldERhdGE6IGNvbGRXYWxsZXQsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXJyb3IgaWYgdHhSZXF1ZXN0SWQgaXMgbWlzc2luZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGhvdFdhbGxldCA9IHtcbiAgICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnByZXNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgICAgd2FsbGV0RGF0YTogaG90V2FsbGV0LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHt9LFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ01pc3NpbmcgdHhSZXF1ZXN0SWQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0FQSSBLZXkgcGFyYW1ldGVyOicsICgpID0+IHtcbiAgICAvLyBUZXN0IHRoZSBnZXRQdWJsaWNOb2RlVXJsIG1ldGhvZCBkaXJlY3RseVxuICAgIGl0KCdzaG91bGQgYXBwZW5kIGFwaUtleSB0byBub2RlIFVSTCB3aGVuIHByb3ZpZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQWNjZXNzIHRoZSBwcm90ZWN0ZWQgbWV0aG9kIHVzaW5nIHR5cGUgY2FzdGluZ1xuICAgICAgY29uc3QgdXJsID0gKGJhc2Vjb2luIGFzIGFueSkuZ2V0UHVibGljTm9kZVVybCgndGVzdC1hcGkta2V5LTEyMycpO1xuICAgICAgdXJsLnNob3VsZC5lcXVhbChgJHtFbnZpcm9ubWVudHMudGVzdC5zb2xBbGNoZW15Tm9kZVVybH0vdGVzdC1hcGkta2V5LTEyM2ApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgcmVndWxhciBub2RlIFVSTCB3aGVuIGFwaUtleSBpcyBub3QgcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBBY2Nlc3MgdGhlIHByb3RlY3RlZCBtZXRob2QgdXNpbmcgdHlwZSBjYXN0aW5nXG4gICAgICBjb25zdCB1cmwgPSAoYmFzZWNvaW4gYXMgYW55KS5nZXRQdWJsaWNOb2RlVXJsKCk7XG4gICAgICB1cmwuc2hvdWxkLmVxdWFsKEVudmlyb25tZW50cy50ZXN0LnNvbE5vZGVVcmwpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUcmFuc2FjdGlvbnM6JywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3QgY29pbiA9IGNvaW5zLmdldCgndHNvbCcpO1xuICAgIGNvbnN0IHVzZHRNaW50QWRkcmVzcyA9ICc5Y2dwQmVOWjJIbkxkYTdOV2FhVTFpM055VHN0azJjNHpDTVVjb0FHc2k5Qyc7XG4gICAgY29uc3QgdDIybWludEFkZHJlc3MgPSAnNU5SMWJRd0xXcWpia2hiUTFoeDcySEtKeWJidXZ3a0RuVVpOb0FaMlZoVzYnO1xuICAgIGxldCBjYWxsQmFjazogc2lub24uU2lub25TdHViO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTb2wucHJvdG90eXBlLCAnZ2V0RGF0YUZyb21Ob2RlJyBhcyBrZXlvZiBTb2wpO1xuXG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldExhdGVzdEJsb2NraGFzaCcsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1pdG1lbnQ6ICdmaW5hbGl6ZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldEJsb2NraGFzaFJlc3BvbnNlKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0RmVlRm9yTWVzc2FnZScsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgc2lub24ubWF0Y2guc3RyaW5nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWl0bWVudDogJ2ZpbmFsaXplZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0RmVlc0Zvck1lc3NhZ2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldE1pbmltdW1CYWxhbmNlRm9yUmVudEV4ZW1wdGlvbicsXG4gICAgICAgICAgICBwYXJhbXM6IFsxNjVdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0TWluaW11bUJhbGFuY2VGb3JSZW50RXhlbXB0aW9uUmVzcG9uc2UpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRCYWxhbmNlJyxcbiAgICAgICAgICAgIHBhcmFtczogW3Rlc3REYXRhLmFjY291bnRJbmZvLmJzNThFbmNvZGVkUHVibGljS2V5XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldEFjY291bnRCYWxhbmNlUmVzcG9uc2UpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRCYWxhbmNlJyxcbiAgICAgICAgICAgIHBhcmFtczogW3Rlc3REYXRhLmFjY291bnRJbmZvLmJzNThFbmNvZGVkUHVibGljS2V5Tm9GdW5kc10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRBY2NvdW50QmFsYW5jZVJlc3BvbnNlTm9GdW5kcyk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldEJhbGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1zOiBbdGVzdERhdGEuYWNjb3VudEluZm8uYnM1OEVuY29kZWRQdWJsaWNLZXlNMURlcml2YXRpb25dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0QWNjb3VudEJhbGFuY2VSZXNwb25zZU0xRGVyaXZhdGlvbik7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldEJhbGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1zOiBbdGVzdERhdGEuYWNjb3VudEluZm8uYnM1OEVuY29kZWRQdWJsaWNLZXlNMkRlcml2YXRpb25dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0QWNjb3VudEJhbGFuY2VSZXNwb25zZU0yRGVyaXZhdGlvbik7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldEJhbGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1zOiBbdGVzdERhdGEuYWNjb3VudEluZm8uYnM1OEVuY29kZWRQdWJsaWNLZXlXaXRoTWFueVRva2Vuc10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRBY2NvdW50QmFsYW5jZVJlc3BvbnNlTTJEZXJpdmF0aW9uKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0QmFsYW5jZScsXG4gICAgICAgICAgICBwYXJhbXM6IFt0ZXN0RGF0YS5jbG9zZUFUQWtleXMuY2xvc2VBdGFBZGRyZXNzXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldEFjY291bnRCYWxhbmNlUmVzcG9uc2VNMkRlcml2YXRpb24pO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRCYWxhbmNlJyxcbiAgICAgICAgICAgIHBhcmFtczogW3Rlc3REYXRhLmNsb3NlQVRBa2V5cy5iczU4RW5jb2RlZFB1YmxpY0tleV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRBY2NvdW50QmFsYW5jZVJlc3BvbnNlTTJEZXJpdmF0aW9uKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0QWNjb3VudEluZm8nLFxuICAgICAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAgICAgIHRlc3REYXRhLmNsb3NlQVRBa2V5cy5jbG9zZUF0YUFkZHJlc3MsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogJ2pzb25QYXJzZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldFRva2VuSW5mb1Jlc3BvbnNlKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0QWNjb3VudEluZm8nLFxuICAgICAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAgICAgIHRlc3REYXRhLmtleXMuZHVyYWJsZU5vbmNlUHViS2V5LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6ICdqc29uUGFyc2VkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRBY2NvdW50SW5mb1Jlc3BvbnNlKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0VG9rZW5BY2NvdW50c0J5T3duZXInLFxuICAgICAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAgICAgIHRlc3REYXRhLmtleXMuZGVzdGluYXRpb25QdWJLZXksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiAnanNvblBhcnNlZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0VG9rZW5BY2NvdW50c0J5T3duZXJSZXNwb25zZU5vQWNjb3VudHMpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRUb2tlbkFjY291bnRzQnlPd25lcicsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgdGVzdERhdGEuYWNjb3VudEluZm8uYnM1OEVuY29kZWRQdWJsaWNLZXksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiAnanNvblBhcnNlZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0VG9rZW5BY2NvdW50c0J5T3duZXJSZXNwb25zZU5vQWNjb3VudHMpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRUb2tlbkFjY291bnRzQnlPd25lcicsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleTIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiAnanNvblBhcnNlZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0VG9rZW5BY2NvdW50c0J5T3duZXJSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldFRva2VuQWNjb3VudHNCeU93bmVyJyxcbiAgICAgICAgICAgIHBhcmFtczogW1xuICAgICAgICAgICAgICB0ZXN0RGF0YS5rZXlzLmRlc3RpbmF0aW9uUHViS2V5MixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb2dyYW1JZDogJ1Rva2VuelFkQk5iTHFQNVZFaGRrQVM2RVBGTEMxUEhuQnFDWEVwUHh1RWInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6ICdqc29uUGFyc2VkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRUb2tlbkFjY291bnRzQnlPd25lckZvclNvbDIwMjJSZXNwb25zZTIpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRUb2tlbkFjY291bnRzQnlPd25lcicsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb2dyYW1JZDogJ1Rva2VuelFkQk5iTHFQNVZFaGRrQVM2RVBGTEMxUEhuQnFDWEVwUHh1RWInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6ICdqc29uUGFyc2VkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRUb2tlbkFjY291bnRzQnlPd25lckZvclNvbDIwMjJSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldFRva2VuQWNjb3VudHNCeU93bmVyJyxcbiAgICAgICAgICAgIHBhcmFtczogW1xuICAgICAgICAgICAgICB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MwLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbUlkOiAnVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogJ2pzb25QYXJzZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldFRva2VuQWNjb3VudHNCeU93bmVyUmVzcG9uc2UyKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0VG9rZW5BY2NvdW50c0J5T3duZXInLFxuICAgICAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAgICAgIHRlc3REYXRhLndyd1VzZXIud2FsbGV0QWRkcmVzczQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiAnanNvblBhcnNlZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0VG9rZW5BY2NvdW50c0J5T3duZXJSZXNwb25zZTMpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRCYWxhbmNlJyxcbiAgICAgICAgICAgIHBhcmFtczogW3Rlc3REYXRhLndyd1VzZXIud2FsbGV0QWRkcmVzczBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0QWNjb3VudEJhbGFuY2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldFRva2VuQWNjb3VudHNCeU93bmVyJyxcbiAgICAgICAgICAgIHBhcmFtczogW1xuICAgICAgICAgICAgICB0ZXN0RGF0YS5rZXlzLmRlc3RpbmF0aW9uUHViS2V5LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbUlkOiAnVG9rZW56UWRCTmJMcVA1VkVoZGtBUzZFUEZMQzFQSG5CcUNYRXBQeHVFYicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogJ2pzb25QYXJzZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldFRva2VuQWNjb3VudHNCeU93bmVyUmVzcG9uc2VOb0FjY291bnRzKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnc2VuZFRyYW5zYWN0aW9uJyxcbiAgICAgICAgICAgIHBhcmFtczogc2lub24ubWF0Y2guYXJyYXksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9uQ2FsbCgwKVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmJyb2FkY2FzdFRyYW5zYWN0aW9uUmVzcG9uc2UpXG4gICAgICAgIC5vbkNhbGwoMSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5icm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlMSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRha2UgT1ZDIG91dHB1dCBhbmQgZ2VuZXJhdGUgYSBzaWduZWQgc3dlZXAgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0ZXN0RGF0YS5vdmNSZXNwb25zZTtcbiAgICAgIGNvbnN0IHJlY292ZXJ5VHhuID0gYXdhaXQgYmFzZWNvaW4uY3JlYXRlQnJvYWRjYXN0YWJsZVN3ZWVwVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICAgIHJlY292ZXJ5VHhuLnRyYW5zYWN0aW9uc1swXS5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQXZSK0w5MDlrelJxNk51YVVlOUY2SnQ5N01PaUZzN2pwVzhNdU9yd3o0RWJLRjQwZDMxZGNpL2JnTFRxNGdway9IaDNzNWNBOEZ0YkxrRFFyMTVQcUFFN3lkOExPWHZzTHRPMlJFcU1NL09DWjh3SXRmc3FmVGZpYTJ4SWZpYlJXM3dIZ3c2M2ppYW9qYlhlU3FhWWFqSi9DYTdZd0JVejVibHlkSTNmWUxnUEFnRUNCc0xWdGZUN21wdk5paTh3UGswRzk0Mk43VEFIRS9SVzJpcS84TFBxQVlXcUJSbzB2SXJOUTRkamwyK1doMkVWQlE5emdvVlRWbTBSSFhySXYvNi9XSHhQWDFtSHYrSnFwbUFUNzlsdE5qWVBLME0yeVIrWk1sbjdWZ1VUQldGTlF2THFFL2ovblhsWTIvSnB4dU5yL2ZYTFhFUGVTMDRkUHZ0OXF6MWRBb1lFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdwOVVYR1N4V2p1Q0toRjl6MHBlSXp3TmNNVVd5R3JORTJBWXVxVUFBQURwaUgyMGN4TGo3S25PYW9JNUFOTm9QeFlqczQ3MkZkakRlTVBmdDNrWGRBZ1FEQWdVQkJBUUFBQUFFQWdBRERBSUFBQUR3b3BvN0FBQUFBQT09J1xuICAgICAgKTtcbiAgICAgIChyZWNvdmVyeVR4bi50cmFuc2FjdGlvbnNbMF0uc2NhbkluZGV4ID8/IDApLnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIChyZWNvdmVyeVR4bi5sYXN0U2NhbkluZGV4ID8/IDApLnNob3VsZC5lcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGFrZSBzb2wgMjAyMiB0b2tlbiBPVkMgb3V0cHV0IGFuZCBnZW5lcmF0ZSBhIHNpZ25lZCBzd2VlcCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRlc3REYXRhLm92Y1Jlc3BvbnNlO1xuICAgICAgY29uc3QgcmVjb3ZlcnlUeG4gPSBhd2FpdCBiYXNlY29pbi5jcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgICAgcmVjb3ZlcnlUeG4udHJhbnNhY3Rpb25zWzBdLnNlcmlhbGl6ZWRUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdBdlIrTDkwOWt6UnE2TnVhVWU5RjZKdDk3TU9pRnM3anBXOE11T3J3ejRFYktGNDBkMzFkY2kvYmdMVHE0Z3BrL0hoM3M1Y0E4RnRiTGtEUXIxNVBxQUU3eWQ4TE9YdnNMdE8yUkVxTU0vT0NaOHdJdGZzcWZUZmlhMnhJZmliUlczd0hndzYzamlhb2piWGVTcWFZYWpKL0NhN1l3QlV6NWJseWRJM2ZZTGdQQWdFQ0JzTFZ0ZlQ3bXB2TmlpOHdQazBHOTQyTjdUQUhFL1JXMmlxLzhMUHFBWVdxQlJvMHZJck5RNGRqbDIrV2gyRVZCUTl6Z29WVFZtMFJIWHJJdi82L1dIeFBYMW1IditKcXBtQVQ3OWx0TmpZUEswTTJ5UitaTWxuN1ZnVVRCV0ZOUXZMcUUvai9uWGxZMi9KcHh1TnIvZlhMWEVQZVMwNGRQdnQ5cXoxZEFvWUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR3A5VVhHU3hXanVDS2hGOXowcGVJendOY01VV3lHck5FMkFZdXFVQUFBRHBpSDIwY3hMajdLbk9hb0k1QU5Ob1B4WWpzNDcyRmRqRGVNUGZ0M2tYZEFnUURBZ1VCQkFRQUFBQUVBZ0FEREFJQUFBRHdvcG83QUFBQUFBPT0nXG4gICAgICApO1xuICAgICAgKHJlY292ZXJ5VHhuLnRyYW5zYWN0aW9uc1swXS5zY2FuSW5kZXggPz8gMCkuc2hvdWxkLmVxdWFsKDApO1xuICAgICAgKHJlY292ZXJ5VHhuLmxhc3RTY2FuSW5kZXggPz8gMCkuc2hvdWxkLmVxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0YWtlIGNvbnNvbGlkYXRpb24gT1ZDIG91dHB1dCBhbmQgZ2VuZXJhdGUgbXVsdGlwbGUgc2lnbmVkIHN3ZWVwIHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRlc3REYXRhLm92Y1Jlc3BvbnNlMjtcbiAgICAgIGNvbnN0IHJlY292ZXJ5VHhuID0gYXdhaXQgYmFzZWNvaW4uY3JlYXRlQnJvYWRjYXN0YWJsZVN3ZWVwVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICAgIHJlY292ZXJ5VHhuLnRyYW5zYWN0aW9uc1swXS5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQXRRUEx6T21MdUt3SFk2TjVYb0pJWksvVDdXMTB1WVdtL01SdGUzR0ZVZGwrdzNnSExqU2E5SDY2V1NmRk51YlF4SVBja3hKRHlsdGtQN2tzTERmOVFnQk5KTTJVV2JCVUg1d1QwSkpISUxsaENzMzNIWDhEZUUvOFRkc3c2dEdmWm9NaENuU0t2NlRQV3RCeHk3U2I2c1c4a3NDVVBuQVd1SEdHS21nakVNQkFnRUNCbUxycXhKclkya2JOL3RjclF3M1A4UDE1T2xqRkdhYkZKQUtCclVPMWdyTkJSbzB2SXJOUTRkamwyK1doMkVWQlE5emdvVlRWbTBSSFhySXYvNi9XSHhQWDFtSHYrSnFwbUFUNzlsdE5qWVBLME0yeVIrWk1sbjdWZ1VUQldGTlFzTFZ0ZlQ3bXB2TmlpOHdQazBHOTQyTjdUQUhFL1JXMmlxLzhMUHFBWVdxQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdwOVVYR1N4V2p1Q0toRjl6MHBlSXp3TmNNVVd5R3JORTJBWXVxVUFBQUlaUW5paVM3M0Q2bXdmcG5maFZNQzRseVlKdFJTcm1vWnBGN3lJbFVkSURBZ1FEQWdVQkJBUUFBQUFFQWdBRERBSUFBQUR3UGMwZEFBQUFBQT09J1xuICAgICAgKTtcbiAgICAgIChyZWNvdmVyeVR4bi50cmFuc2FjdGlvbnNbMF0uc2NhbkluZGV4ID8/IDApLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHJlY292ZXJ5VHhuLnRyYW5zYWN0aW9uc1sxXS5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQXVMaE9BNXptT0JaUjg1bG8rbktkVG9wVndKQU1yTXA2TlcrOFVuR05zU0JTcEJrcWZXWlFxU2c5cys3YVRsWGV6bTV2eG9sK1BsNnQ3UHBWTlRPSHdMY3A5eEpwM1RGSGRpdkViaHdKS2xkUjROeStwYXNvRngrQmdrOHE2ZzFpTmlxN1hTaTFPdjNiczdldU1rVGo3bkRSRnFQOGx2N3hMVGN2ckJtOU9RSkFnRUNCcDE0SW1CQ2RtVlJPbHcwVXZlWVMxTXZHL2xqQ1JJM01KVEZtc3h1WEVvV0JSbzB2SXJOUTRkamwyK1doMkVWQlE5emdvVlRWbTBSSFhySXYvNi9XSHcwaHl4dnBWd3RJeDkvemVYMk8xNmVUclkrYUtJaDFtZEtnNE1NZzBleXhNTFZ0ZlQ3bXB2TmlpOHdQazBHOTQyTjdUQUhFL1JXMmlxLzhMUHFBWVdxQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdwOVVYR1N4V2p1Q0toRjl6MHBlSXp3TmNNVVd5R3JORTJBWXVxVUFBQUM3d3MxWEZzbGlud2d0cElTVVZpVldJVlRIeUQyUTBxajI0WWpLbXJBbVhBZ1FEQWdVQkJBUUFBQUFFQWdBRERBSUFBQUR3UGMwZEFBQUFBQT09J1xuICAgICAgKTtcbiAgICAgIChyZWNvdmVyeVR4bi50cmFuc2FjdGlvbnNbMV0uc2NhbkluZGV4ID8/IDApLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIChyZWNvdmVyeVR4bi5sYXN0U2NhbkluZGV4ID8/IDApLnNob3VsZC5lcXVhbCgyMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyaWVzIChsYXRlc3QgYmxvY2toYXNoKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIExhdGVzdCBCbG9ja2hhc2ggUmVjb3ZlcnkgKEJpdEdvLWxlc3MpXG4gICAgICBjb25zdCBsYXRlc3RCbG9ja0hhc2hUeG4gPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleTogdGVzdERhdGEua2V5cy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLmtleXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEua2V5cy5iaXRnb0tleSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEua2V5cy53YWxsZXRQYXNzd29yZCxcbiAgICAgIH0pO1xuICAgICAgbGF0ZXN0QmxvY2tIYXNoVHhuLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIGxhdGVzdEJsb2NrSGFzaFR4bi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NlcmlhbGl6ZWRUeCcpO1xuICAgICAgbGF0ZXN0QmxvY2tIYXNoVHhuLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2NhbkluZGV4Jyk7XG4gICAgICBzaG91bGQuZXF1YWwoKGxhdGVzdEJsb2NrSGFzaFR4biBhcyBNUENUeCkuc2NhbkluZGV4LCAwKTtcblxuICAgICAgY29uc3QgbGF0ZXN0QmxvY2toYXNoVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICBsYXRlc3RCbG9ja2hhc2hUeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24oKGxhdGVzdEJsb2NrSGFzaFR4biBhcyBNUENUeCkuc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IGxhdGVzdEJsb2NraGFzaFR4bkpzb24gPSBsYXRlc3RCbG9ja2hhc2hUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKGxhdGVzdEJsb2NraGFzaFR4bkpzb24ubm9uY2UsIHRlc3REYXRhLlNvbElucHV0RGF0YS5ibG9ja2hhc2gpO1xuICAgICAgc2hvdWxkLmVxdWFsKGxhdGVzdEJsb2NraGFzaFR4bkpzb24uZmVlUGF5ZXIsIHRlc3REYXRhLmFjY291bnRJbmZvLmJzNThFbmNvZGVkUHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChsYXRlc3RCbG9ja2hhc2hUeG5Kc29uLm51bVNpZ25hdHVyZXMsIHRlc3REYXRhLlNvbElucHV0RGF0YS5sYXRlc3RCbG9ja2hhc2hTaWduYXR1cmVzKTtcbiAgICAgIGNvbnN0IHNvbENvaW4gPSBiYXNlY29pbiBhcyBhbnk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoc29sQ29pbi5nZXREYXRhRnJvbU5vZGUsIDMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcmllcyAoZHVyYWJsZSBub25jZSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBEdXJhYmxlIE5vbmNlIFJlY292ZXJ5IChCaXRHby1sZXNzKVxuICAgICAgY29uc3QgZHVyYWJsZU5vbmNlVHhuID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IHRlc3REYXRhLmtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5rZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLmtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHRlc3REYXRhLmtleXMuZGVzdGluYXRpb25QdWJLZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHRlc3REYXRhLmtleXMud2FsbGV0UGFzc3dvcmQsXG4gICAgICAgIGR1cmFibGVOb25jZToge1xuICAgICAgICAgIHB1YmxpY0tleTogdGVzdERhdGEua2V5cy5kdXJhYmxlTm9uY2VQdWJLZXksXG4gICAgICAgICAgc2VjcmV0S2V5OiB0ZXN0RGF0YS5rZXlzLmR1cmFibGVOb25jZVByaXZLZXksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZHVyYWJsZU5vbmNlVHhuLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIGR1cmFibGVOb25jZVR4bi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NlcmlhbGl6ZWRUeCcpO1xuICAgICAgZHVyYWJsZU5vbmNlVHhuLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2NhbkluZGV4Jyk7XG4gICAgICBzaG91bGQuZXF1YWwoKGR1cmFibGVOb25jZVR4biBhcyBNUENUeCkuc2NhbkluZGV4LCAwKTtcblxuICAgICAgY29uc3QgZHVyYWJsZU5vbmNlVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICBkdXJhYmxlTm9uY2VUeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24oKGR1cmFibGVOb25jZVR4biBhcyBNUENUeCkuc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IGR1cmFibGVOb25jZVR4bkpzb24gPSBkdXJhYmxlTm9uY2VUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKGR1cmFibGVOb25jZVR4bkpzb24ubm9uY2UsIHRlc3REYXRhLlNvbElucHV0RGF0YS5kdXJhYmxlTm9uY2VCbG9ja2hhc2gpO1xuICAgICAgc2hvdWxkLmVxdWFsKGR1cmFibGVOb25jZVR4bkpzb24uZmVlUGF5ZXIsIHRlc3REYXRhLmFjY291bnRJbmZvLmJzNThFbmNvZGVkUHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChkdXJhYmxlTm9uY2VUeG5Kc29uLm51bVNpZ25hdHVyZXMsIHRlc3REYXRhLlNvbElucHV0RGF0YS5kdXJhYmxlTm9uY2VTaWduYXR1cmVzKTtcbiAgICAgIGNvbnN0IHNvbENvaW4gPSBiYXNlY29pbiBhcyBhbnk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoc29sQ29pbi5nZXREYXRhRnJvbU5vZGUsIDQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdHhuIGZvciB1bnNpZ25lZCBzd2VlcCByZWNvdmVyaWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVW5zaWduZWQgU3dlZXAgUmVjb3ZlcnlcbiAgICAgIGNvbnN0IHVuc2lnbmVkU3dlZXBUeG4gPSAoYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5rZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5rZXlzLmRlc3RpbmF0aW9uUHViS2V5LFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHtcbiAgICAgICAgICBwdWJsaWNLZXk6IHRlc3REYXRhLmtleXMuZHVyYWJsZU5vbmNlUHViS2V5LFxuICAgICAgICAgIHNlY3JldEtleTogdGVzdERhdGEua2V5cy5kdXJhYmxlTm9uY2VQcml2S2V5LFxuICAgICAgICB9LFxuICAgICAgfSkpIGFzIE1QQ1N3ZWVwVHhzO1xuXG4gICAgICB1bnNpZ25lZFN3ZWVwVHhuLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHVuc2lnbmVkU3dlZXBUeG4udHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NlcmlhbGl6ZWRUeCcpO1xuICAgICAgdW5zaWduZWRTd2VlcFR4bi50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2NhbkluZGV4Jyk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bi50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnNjYW5JbmRleCwgMCk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZSA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24oXG4gICAgICAgIHVuc2lnbmVkU3dlZXBUeG4udHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zZXJpYWxpemVkVHhcbiAgICAgICk7XG4gICAgICBjb25zdCB1bnNpZ25lZFN3ZWVwVHhuSnNvbiA9IHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLm5vbmNlLCB0ZXN0RGF0YS5Tb2xJbnB1dERhdGEuZHVyYWJsZU5vbmNlQmxvY2toYXNoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1bnNpZ25lZFN3ZWVwVHhuSnNvbi5mZWVQYXllciwgdGVzdERhdGEuYWNjb3VudEluZm8uYnM1OEVuY29kZWRQdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLm51bVNpZ25hdHVyZXMsIHRlc3REYXRhLlNvbElucHV0RGF0YS51bnNpZ25lZFN3ZWVwU2lnbmF0dXJlcyk7XG4gICAgICBjb25zdCBzb2xDb2luID0gYmFzZWNvaW4gYXMgYW55O1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KHNvbENvaW4uZ2V0RGF0YUZyb21Ob2RlLCA0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVycm9yIGluIHJlY292ZXIgZnVuY3Rpb24gaWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nL2luY29ycmVjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIG1pc3NpbmcgdXNlcmtleVxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXIoe1xuICAgICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEua2V5cy5iYWNrdXBLZXksXG4gICAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLmtleXMuYml0Z29LZXksXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS5rZXlzLndhbGxldFBhc3N3b3JkLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyB1c2VyS2V5Jyk7XG5cbiAgICAgIC8vIG1pc3NpbmcgYmFja3Vwa2V5XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3Zlcih7XG4gICAgICAgICAgdXNlcktleTogdGVzdERhdGEua2V5cy51c2VyS2V5LFxuICAgICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5rZXlzLmJpdGdvS2V5LFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHRlc3REYXRhLmtleXMuZGVzdGluYXRpb25QdWJLZXksXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEua2V5cy53YWxsZXRQYXNzd29yZCxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG5cbiAgICAgIC8vIG1pc3Npbmcgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5rZXlzLnVzZXJLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5rZXlzLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleTogdGVzdERhdGEua2V5cy5iaXRnb0tleSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5rZXlzLmRlc3RpbmF0aW9uUHViS2V5LFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuXG4gICAgICAvLyBpbmNvcnJlY3Qgd2FsbGV0IHBhc3NwaHJhc2UsIHVzZXIga2V5LCBiYWNrdXAga2V5IGNvbWJpbmF0aW9uXG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3Zlcih7XG4gICAgICAgICAgdXNlcktleTogdGVzdERhdGEua2V5cy51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEua2V5cy5iYWNrdXBLZXksXG4gICAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLmtleXMuYml0Z29LZXksXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS5rZXlzLndhbGxldFBhc3N3b3JkICsgJ2luY29ycmVjdCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKFwiRXJyb3IgZGVjcnlwdGluZyB1c2VyIGtleWNoYWluOiBwYXNzd29yZCBlcnJvciAtIGNjbTogdGFnIGRvZXNuJ3QgbWF0Y2hcIik7XG5cbiAgICAgIC8vIG5vIHdhbGxldCB3aXRoIHN1ZmZpY2llbnQgZnVuZHNcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5rZXlzLnVzZXJLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5rZXlzLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleTogdGVzdERhdGEua2V5cy5iaXRnb0tleU5vRnVuZHMsXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS5rZXlzLndhbGxldFBhc3N3b3JkLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnRGlkIG5vdCBmaW5kIGFkZHJlc3Mgd2l0aCBmdW5kcyB0byByZWNvdmVyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgc29sIHRva2VucyB0byByZWNvdmVyeSBkZXN0aW5hdGlvbiB3aXRoIG5vIGV4aXN0aW5nIHRva2VuIGFjY291bnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdG9rZW5UeG4gPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleTogdGVzdERhdGEud3J3VXNlci51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLndyd1VzZXIuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEud3J3VXNlci5iaXRnb0tleSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleSxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHVzZHRNaW50QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEud3J3VXNlci53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHtcbiAgICAgICAgICBwdWJsaWNLZXk6IHRlc3REYXRhLmtleXMuZHVyYWJsZU5vbmNlUHViS2V5LFxuICAgICAgICAgIHNlY3JldEtleTogdGVzdERhdGEua2V5cy5kdXJhYmxlTm9uY2VQcml2S2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRva2VuVHhuLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHRva2VuVHhuLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2VyaWFsaXplZFR4Jyk7XG4gICAgICB0b2tlblR4bi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NjYW5JbmRleCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKCh0b2tlblR4biBhcyBNUENUeCkuc2NhbkluZGV4LCAwKTtcblxuICAgICAgY29uc3QgdG9rZW5UeG5EZXNlcmlhbGl6ZSA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHRva2VuVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKCh0b2tlblR4biBhcyBNUENUeCkuc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IHRva2VuVHhuSnNvbiA9IHRva2VuVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0b2tlblR4bkpzb24ubm9uY2UsIHRlc3REYXRhLlNvbElucHV0RGF0YS5kdXJhYmxlTm9uY2VCbG9ja2hhc2gpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRva2VuVHhuSnNvbi5mZWVQYXllciwgdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9rZW5UeG5Kc29uLm51bVNpZ25hdHVyZXMsIHRlc3REYXRhLlNvbElucHV0RGF0YS5kdXJhYmxlTm9uY2VTaWduYXR1cmVzKTtcblxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zRGF0YSA9IHRva2VuVHhuSnNvbi5pbnN0cnVjdGlvbnNEYXRhIGFzIEluc3RydWN0aW9uUGFyYW1zW107XG4gICAgICBzaG91bGQuZXF1YWwoaW5zdHJ1Y3Rpb25zRGF0YS5sZW5ndGgsIDMpO1xuICAgICAgc2hvdWxkLmVxdWFsKGluc3RydWN0aW9uc0RhdGFbMF0udHlwZSwgJ05vbmNlQWR2YW5jZScpO1xuXG4gICAgICBjb25zdCBkZXN0aW5hdGlvblVTRFRUb2tlbkFjY291bnQgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyhcbiAgICAgICAgdXNkdE1pbnRBZGRyZXNzLFxuICAgICAgICB0ZXN0RGF0YS5rZXlzLmRlc3RpbmF0aW9uUHViS2V5XG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKGluc3RydWN0aW9uc0RhdGFbMV0udHlwZSwgJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoaW5zdHJ1Y3Rpb25zRGF0YVsxXSBhcyBBdGFJbml0KS5wYXJhbXMubWludEFkZHJlc3MsIHVzZHRNaW50QWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwoKGluc3RydWN0aW9uc0RhdGFbMV0gYXMgQXRhSW5pdCkucGFyYW1zLmF0YUFkZHJlc3MsIGRlc3RpbmF0aW9uVVNEVFRva2VuQWNjb3VudCk7XG4gICAgICBzaG91bGQuZXF1YWwoKGluc3RydWN0aW9uc0RhdGFbMV0gYXMgQXRhSW5pdCkucGFyYW1zLm93bmVyQWRkcmVzcywgdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleSk7XG4gICAgICBzaG91bGQuZXF1YWwoKGluc3RydWN0aW9uc0RhdGFbMV0gYXMgQXRhSW5pdCkucGFyYW1zLnRva2VuTmFtZSwgJ3Rzb2w6dXNkdCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKChpbnN0cnVjdGlvbnNEYXRhWzFdIGFzIEF0YUluaXQpLnBhcmFtcy5wYXllckFkZHJlc3MsIHRlc3REYXRhLndyd1VzZXIud2FsbGV0QWRkcmVzczApO1xuXG4gICAgICBjb25zdCBzb3VyY2VVU0RUVG9rZW5BY2NvdW50ID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gICAgICAgIHVzZHRNaW50QWRkcmVzcyxcbiAgICAgICAgdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChpbnN0cnVjdGlvbnNEYXRhWzJdLnR5cGUsICdUb2tlblRyYW5zZmVyJyk7XG4gICAgICBzaG91bGQuZXF1YWwoKGluc3RydWN0aW9uc0RhdGFbMl0gYXMgVG9rZW5UcmFuc2ZlcikucGFyYW1zLmZyb21BZGRyZXNzLCB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MwKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoaW5zdHJ1Y3Rpb25zRGF0YVsyXSBhcyBUb2tlblRyYW5zZmVyKS5wYXJhbXMudG9BZGRyZXNzLCBkZXN0aW5hdGlvblVTRFRUb2tlbkFjY291bnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKChpbnN0cnVjdGlvbnNEYXRhWzJdIGFzIFRva2VuVHJhbnNmZXIpLnBhcmFtcy5hbW91bnQsICcyMDAwMDAwMDAwJyk7XG4gICAgICBzaG91bGQuZXF1YWwoKGluc3RydWN0aW9uc0RhdGFbMl0gYXMgVG9rZW5UcmFuc2ZlcikucGFyYW1zLnRva2VuTmFtZSwgJ3Rzb2w6dXNkdCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKChpbnN0cnVjdGlvbnNEYXRhWzJdIGFzIFRva2VuVHJhbnNmZXIpLnBhcmFtcy5zb3VyY2VBZGRyZXNzLCBzb3VyY2VVU0RUVG9rZW5BY2NvdW50KTtcblxuICAgICAgY29uc3Qgc29sQ29pbiA9IGJhc2Vjb2luIGFzIGFueTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChzb2xDb2luLmdldERhdGFGcm9tTm9kZSwgNyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgc29sIDIwMjIgdG9rZW5zIHRvIHJlY292ZXJ5IGRlc3RpbmF0aW9uIHdpdGggbm8gZXhpc3RpbmcgdG9rZW4gYWNjb3VudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0b2tlblR4biA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS53cndVc2VyLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEud3J3VXNlci5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS53cndVc2VyLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5rZXlzLmRlc3RpbmF0aW9uUHViS2V5LFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogdDIybWludEFkZHJlc3MsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHRlc3REYXRhLndyd1VzZXIud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB7XG4gICAgICAgICAgcHVibGljS2V5OiB0ZXN0RGF0YS5rZXlzLmR1cmFibGVOb25jZVB1YktleSxcbiAgICAgICAgICBzZWNyZXRLZXk6IHRlc3REYXRhLmtleXMuZHVyYWJsZU5vbmNlUHJpdktleSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJvZ3JhbUlkOiAnVG9rZW56UWRCTmJMcVA1VkVoZGtBUzZFUEZMQzFQSG5CcUNYRXBQeHVFYicsXG4gICAgICB9KTtcblxuICAgICAgdG9rZW5UeG4uc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgdG9rZW5UeG4uc2hvdWxkLmhhc093blByb3BlcnR5KCdzZXJpYWxpemVkVHgnKTtcbiAgICAgIHRva2VuVHhuLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2NhbkluZGV4Jyk7XG4gICAgICBzaG91bGQuZXF1YWwoKHRva2VuVHhuIGFzIE1QQ1R4KS5zY2FuSW5kZXgsIDApO1xuXG4gICAgICBjb25zdCB0b2tlblR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgdG9rZW5UeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24oKHRva2VuVHhuIGFzIE1QQ1R4KS5zZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgdG9rZW5UeG5Kc29uID0gdG9rZW5UeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHRva2VuVHhuSnNvbi5ub25jZSwgdGVzdERhdGEuU29sSW5wdXREYXRhLmR1cmFibGVOb25jZUJsb2NraGFzaCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9rZW5UeG5Kc29uLmZlZVBheWVyLCB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b2tlblR4bkpzb24ubnVtU2lnbmF0dXJlcywgdGVzdERhdGEuU29sSW5wdXREYXRhLmR1cmFibGVOb25jZVNpZ25hdHVyZXMpO1xuXG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnNEYXRhID0gdG9rZW5UeG5Kc29uLmluc3RydWN0aW9uc0RhdGEgYXMgSW5zdHJ1Y3Rpb25QYXJhbXNbXTtcbiAgICAgIHNob3VsZC5lcXVhbChpbnN0cnVjdGlvbnNEYXRhLmxlbmd0aCwgMyk7XG4gICAgICBzaG91bGQuZXF1YWwoaW5zdHJ1Y3Rpb25zRGF0YVswXS50eXBlLCAnTm9uY2VBZHZhbmNlJyk7XG5cbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uVG9rZW5BY2NvdW50ID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gICAgICAgIHQyMm1pbnRBZGRyZXNzLFxuICAgICAgICB0ZXN0RGF0YS5rZXlzLmRlc3RpbmF0aW9uUHViS2V5XG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKGluc3RydWN0aW9uc0RhdGFbMV0udHlwZSwgJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoaW5zdHJ1Y3Rpb25zRGF0YVsxXSBhcyBBdGFJbml0KS5wYXJhbXMubWludEFkZHJlc3MsIHQyMm1pbnRBZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoaW5zdHJ1Y3Rpb25zRGF0YVsxXSBhcyBBdGFJbml0KS5wYXJhbXMuYXRhQWRkcmVzcywgZGVzdGluYXRpb25Ub2tlbkFjY291bnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKChpbnN0cnVjdGlvbnNEYXRhWzFdIGFzIEF0YUluaXQpLnBhcmFtcy5vd25lckFkZHJlc3MsIHRlc3REYXRhLmtleXMuZGVzdGluYXRpb25QdWJLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKChpbnN0cnVjdGlvbnNEYXRhWzFdIGFzIEF0YUluaXQpLnBhcmFtcy50b2tlbk5hbWUsICd0c29sOnQyMm1pbnQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoaW5zdHJ1Y3Rpb25zRGF0YVsxXSBhcyBBdGFJbml0KS5wYXJhbXMucGF5ZXJBZGRyZXNzLCB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MwKTtcblxuICAgICAgY29uc3Qgc291cmNlVG9rZW5BY2NvdW50ID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gICAgICAgIHQyMm1pbnRBZGRyZXNzLFxuICAgICAgICB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MwXG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKGluc3RydWN0aW9uc0RhdGFbMl0udHlwZSwgJ1Rva2VuVHJhbnNmZXInKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoaW5zdHJ1Y3Rpb25zRGF0YVsyXSBhcyBUb2tlblRyYW5zZmVyKS5wYXJhbXMuZnJvbUFkZHJlc3MsIHRlc3REYXRhLndyd1VzZXIud2FsbGV0QWRkcmVzczApO1xuICAgICAgc2hvdWxkLmVxdWFsKChpbnN0cnVjdGlvbnNEYXRhWzJdIGFzIFRva2VuVHJhbnNmZXIpLnBhcmFtcy50b0FkZHJlc3MsIGRlc3RpbmF0aW9uVG9rZW5BY2NvdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbCgoaW5zdHJ1Y3Rpb25zRGF0YVsyXSBhcyBUb2tlblRyYW5zZmVyKS5wYXJhbXMuYW1vdW50LCAnMjAwMDAwMDAwMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKChpbnN0cnVjdGlvbnNEYXRhWzJdIGFzIFRva2VuVHJhbnNmZXIpLnBhcmFtcy50b2tlbk5hbWUsICd0c29sOnQyMm1pbnQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoaW5zdHJ1Y3Rpb25zRGF0YVsyXSBhcyBUb2tlblRyYW5zZmVyKS5wYXJhbXMuc291cmNlQWRkcmVzcywgc291cmNlVG9rZW5BY2NvdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgKGluc3RydWN0aW9uc0RhdGFbMl0gYXMgVG9rZW5UcmFuc2ZlcikucGFyYW1zLnByb2dyYW1JZCxcbiAgICAgICAgJ1Rva2VuelFkQk5iTHFQNVZFaGRrQVM2RVBGTEMxUEhuQnFDWEVwUHh1RWInXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzb2xDb2luID0gYmFzZWNvaW4gYXMgYW55O1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KHNvbENvaW4uZ2V0RGF0YUZyb21Ob2RlLCA3KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBzb2wgdG9rZW5zIHRvIHJlY292ZXJ5IGRlc3RpbmF0aW9uIHdpdGggZXhpc3RpbmcgdG9rZW4gYWNjb3VudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0b2tlblR4biA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS53cndVc2VyLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEud3J3VXNlci5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS53cndVc2VyLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5rZXlzLmRlc3RpbmF0aW9uUHViS2V5MixcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHVzZHRNaW50QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEud3J3VXNlci53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHtcbiAgICAgICAgICBwdWJsaWNLZXk6IHRlc3REYXRhLmtleXMuZHVyYWJsZU5vbmNlUHViS2V5LFxuICAgICAgICAgIHNlY3JldEtleTogdGVzdERhdGEua2V5cy5kdXJhYmxlTm9uY2VQcml2S2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRva2VuVHhuLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHRva2VuVHhuLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2VyaWFsaXplZFR4Jyk7XG4gICAgICB0b2tlblR4bi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NjYW5JbmRleCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKCh0b2tlblR4biBhcyBNUENUeCkuc2NhbkluZGV4LCAwKTtcblxuICAgICAgY29uc3QgdG9rZW5UeG5EZXNlcmlhbGl6ZSA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHRva2VuVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKCh0b2tlblR4biBhcyBNUENUeCkuc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IHRva2VuVHhuSnNvbiA9IHRva2VuVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0b2tlblR4bkpzb24ubm9uY2UsIHRlc3REYXRhLlNvbElucHV0RGF0YS5kdXJhYmxlTm9uY2VCbG9ja2hhc2gpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRva2VuVHhuSnNvbi5mZWVQYXllciwgdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9rZW5UeG5Kc29uLm51bVNpZ25hdHVyZXMsIHRlc3REYXRhLlNvbElucHV0RGF0YS5kdXJhYmxlTm9uY2VTaWduYXR1cmVzKTtcblxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zRGF0YSA9IHRva2VuVHhuSnNvbi5pbnN0cnVjdGlvbnNEYXRhIGFzIFRva2VuVHJhbnNmZXJbXTtcbiAgICAgIHNob3VsZC5lcXVhbChpbnN0cnVjdGlvbnNEYXRhLmxlbmd0aCwgMik7XG4gICAgICBzaG91bGQuZXF1YWwoaW5zdHJ1Y3Rpb25zRGF0YVswXS50eXBlLCAnTm9uY2VBZHZhbmNlJyk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVVTRFRUb2tlbkFjY291bnQgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyhcbiAgICAgICAgdXNkdE1pbnRBZGRyZXNzLFxuICAgICAgICB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MwXG4gICAgICApO1xuICAgICAgY29uc3QgZGVzdGluYXRpb25VU0RUVG9rZW5BY2NvdW50ID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gICAgICAgIHVzZHRNaW50QWRkcmVzcyxcbiAgICAgICAgdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleTJcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoaW5zdHJ1Y3Rpb25zRGF0YVsxXS50eXBlLCAnVG9rZW5UcmFuc2ZlcicpO1xuICAgICAgc2hvdWxkLmVxdWFsKGluc3RydWN0aW9uc0RhdGFbMV0ucGFyYW1zLmZyb21BZGRyZXNzLCB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MwKTtcbiAgICAgIHNob3VsZC5lcXVhbChpbnN0cnVjdGlvbnNEYXRhWzFdLnBhcmFtcy50b0FkZHJlc3MsIGRlc3RpbmF0aW9uVVNEVFRva2VuQWNjb3VudCk7XG4gICAgICBzaG91bGQuZXF1YWwoaW5zdHJ1Y3Rpb25zRGF0YVsxXS5wYXJhbXMuYW1vdW50LCAnMjAwMDAwMDAwMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGluc3RydWN0aW9uc0RhdGFbMV0ucGFyYW1zLnRva2VuTmFtZSwgJ3Rzb2w6dXNkdCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGluc3RydWN0aW9uc0RhdGFbMV0ucGFyYW1zLnNvdXJjZUFkZHJlc3MsIHNvdXJjZVVTRFRUb2tlbkFjY291bnQpO1xuXG4gICAgICBjb25zdCBzb2xDb2luID0gYmFzZWNvaW4gYXMgYW55O1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KHNvbENvaW4uZ2V0RGF0YUZyb21Ob2RlLCA3KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBzb2wgMjAyMiB0b2tlbnMgdG8gcmVjb3ZlcnkgZGVzdGluYXRpb24gd2l0aCBleGlzdGluZyB0b2tlbiBhY2NvdW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRva2VuVHhuID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IHRlc3REYXRhLndyd1VzZXIudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS53cndVc2VyLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLndyd1VzZXIuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHRlc3REYXRhLmtleXMuZGVzdGluYXRpb25QdWJLZXkyLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogdDIybWludEFkZHJlc3MsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHRlc3REYXRhLndyd1VzZXIud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB7XG4gICAgICAgICAgcHVibGljS2V5OiB0ZXN0RGF0YS5rZXlzLmR1cmFibGVOb25jZVB1YktleSxcbiAgICAgICAgICBzZWNyZXRLZXk6IHRlc3REYXRhLmtleXMuZHVyYWJsZU5vbmNlUHJpdktleSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJvZ3JhbUlkOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuXG4gICAgICB0b2tlblR4bi5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICB0b2tlblR4bi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NlcmlhbGl6ZWRUeCcpO1xuICAgICAgdG9rZW5UeG4uc2hvdWxkLmhhc093blByb3BlcnR5KCdzY2FuSW5kZXgnKTtcbiAgICAgIHNob3VsZC5lcXVhbCgodG9rZW5UeG4gYXMgTVBDVHgpLnNjYW5JbmRleCwgMCk7XG5cbiAgICAgIGNvbnN0IHRva2VuVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0b2tlblR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbigodG9rZW5UeG4gYXMgTVBDVHgpLnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCB0b2tlblR4bkpzb24gPSB0b2tlblR4bkRlc2VyaWFsaXplLnRvSnNvbigpO1xuICAgICAgY29uc29sZS5sb2codG9rZW5UeG5Kc29uKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b2tlblR4bkpzb24ubm9uY2UsIHRlc3REYXRhLlNvbElucHV0RGF0YS5kdXJhYmxlTm9uY2VCbG9ja2hhc2gpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRva2VuVHhuSnNvbi5mZWVQYXllciwgdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9rZW5UeG5Kc29uLm51bVNpZ25hdHVyZXMsIHRlc3REYXRhLlNvbElucHV0RGF0YS5kdXJhYmxlTm9uY2VTaWduYXR1cmVzKTtcblxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zRGF0YSA9IHRva2VuVHhuSnNvbi5pbnN0cnVjdGlvbnNEYXRhIGFzIFRva2VuVHJhbnNmZXJbXTtcbiAgICAgIHNob3VsZC5lcXVhbChpbnN0cnVjdGlvbnNEYXRhLmxlbmd0aCwgMik7XG4gICAgICBzaG91bGQuZXF1YWwoaW5zdHJ1Y3Rpb25zRGF0YVswXS50eXBlLCAnTm9uY2VBZHZhbmNlJyk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZTIwMjJUb2tlbkFjY291bnQgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyhcbiAgICAgICAgdDIybWludEFkZHJlc3MsXG4gICAgICAgIHRlc3REYXRhLndyd1VzZXIud2FsbGV0QWRkcmVzczAsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uMjAyMlRva2VuQWNjb3VudCA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFjY291bnRBZGRyZXNzKFxuICAgICAgICB0MjJtaW50QWRkcmVzcyxcbiAgICAgICAgdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleTIsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChpbnN0cnVjdGlvbnNEYXRhWzFdLnR5cGUsICdUb2tlblRyYW5zZmVyJyk7XG4gICAgICBzaG91bGQuZXF1YWwoaW5zdHJ1Y3Rpb25zRGF0YVsxXS5wYXJhbXMuZnJvbUFkZHJlc3MsIHRlc3REYXRhLndyd1VzZXIud2FsbGV0QWRkcmVzczApO1xuICAgICAgc2hvdWxkLmVxdWFsKGluc3RydWN0aW9uc0RhdGFbMV0ucGFyYW1zLnRvQWRkcmVzcywgZGVzdGluYXRpb24yMDIyVG9rZW5BY2NvdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbChpbnN0cnVjdGlvbnNEYXRhWzFdLnBhcmFtcy5hbW91bnQsICcyMDAwMDAwMDAwJyk7XG4gICAgICBzaG91bGQuZXF1YWwoaW5zdHJ1Y3Rpb25zRGF0YVsxXS5wYXJhbXMudG9rZW5OYW1lLCAndHNvbDp0MjJtaW50Jyk7XG4gICAgICBzaG91bGQuZXF1YWwoaW5zdHJ1Y3Rpb25zRGF0YVsxXS5wYXJhbXMuc291cmNlQWRkcmVzcywgc291cmNlMjAyMlRva2VuQWNjb3VudCk7XG4gICAgICBjb25zdCBzb2xDb2luID0gYmFzZWNvaW4gYXMgYW55O1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KHNvbENvaW4uZ2V0RGF0YUZyb21Ob2RlLCA3KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBzb2wgdG9rZW5zIHRvIHJlY292ZXJ5IGRlc3RpbmF0aW9uIHdpdGggZXhpc3RpbmcgdG9rZW4gYWNjb3VudHMgZm9yIHVuc2lnbmVkIHN3ZWVwIHJlY292ZXJpZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZWVSZXNwb25zZSA9IHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRGZWVzRm9yTWVzc2FnZVJlc3BvbnNlO1xuICAgICAgZmVlUmVzcG9uc2UuYm9keS5yZXN1bHQudmFsdWUgPSAxMDAwMDtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0RmVlRm9yTWVzc2FnZScsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgc2lub24ubWF0Y2guc3RyaW5nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWl0bWVudDogJ2ZpbmFsaXplZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyhmZWVSZXNwb25zZSk7XG5cbiAgICAgIGNvbnN0IHRva2VuVHhuID0gKGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEud3J3VXNlci5iaXRnb0tleSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEua2V5cy5kZXN0aW5hdGlvblB1YktleTIsXG4gICAgICAgIGR1cmFibGVOb25jZToge1xuICAgICAgICAgIHB1YmxpY0tleTogdGVzdERhdGEua2V5cy5kdXJhYmxlTm9uY2VQdWJLZXksXG4gICAgICAgICAgc2VjcmV0S2V5OiB0ZXN0RGF0YS5rZXlzLmR1cmFibGVOb25jZVByaXZLZXksXG4gICAgICAgIH0sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiB0ZXN0RGF0YS50b2tlbkFkZHJlc3MuVGVzdFVTREMsXG4gICAgICB9KSkgYXMgTVBDU3dlZXBUeHM7XG5cbiAgICAgIC8vIDIgc2lnbmF0dXJlcyBhbmQgbm8gcmVudCBleGVtcHRpb24gZmVlIHNpbmNlIHRoZSBkZXN0aW5hdGlvbiBhbHJlYWR5IGhhcyB0b2tlbiBhY2NvdW50c1xuICAgICAgY29uc3QgZXhwZWN0ZWRGZWUgPSA1MDAwICsgNTAwMDtcblxuICAgICAgY29uc3QgeyBzZXJpYWxpemVkVHgsIHNjYW5JbmRleCwgZmVlSW5mbywgcGFyc2VkVHggfSA9IHRva2VuVHhuLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgICBhc3NlcnQub2soc2VyaWFsaXplZFR4KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY2FuSW5kZXgsIDApO1xuICAgICAgYXNzZXJ0Lm9rKGZlZUluZm8pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZlZUluZm8uZmVlU3RyaW5nLCBleHBlY3RlZEZlZS50b1N0cmluZygpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmZWVJbmZvLmZlZSwgZXhwZWN0ZWRGZWUpO1xuICAgICAgYXNzZXJ0Lm9rKHBhcnNlZFR4KTtcbiAgICAgIGFzc2VydC5vayhwYXJzZWRUeC5pbnB1dHMgaW5zdGFuY2VvZiBBcnJheSAmJiBwYXJzZWRUeC5pbnB1dHMubGVuZ3RoID09PSAxKTtcbiAgICAgIGFzc2VydC5vayhwYXJzZWRUeC5vdXRwdXRzIGluc3RhbmNlb2YgQXJyYXkgJiYgcGFyc2VkVHgub3V0cHV0cy5sZW5ndGggPT09IDEpO1xuXG4gICAgICBjb25zdCB0b2tlblR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgdG9rZW5UeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24odG9rZW5UeG4udHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgdG9rZW5UeG5Kc29uID0gdG9rZW5UeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRva2VuVHhuSnNvbi5ub25jZSwgdGVzdERhdGEuU29sSW5wdXREYXRhLmR1cmFibGVOb25jZUJsb2NraGFzaCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9rZW5UeG5Kc29uLmZlZVBheWVyLCB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b2tlblR4bkpzb24ubnVtU2lnbmF0dXJlcywgdGVzdERhdGEuU29sSW5wdXREYXRhLnVuc2lnbmVkU3dlZXBTaWduYXR1cmVzKTtcbiAgICAgIGNvbnN0IHNvbENvaW4gPSBiYXNlY29pbiBhcyBhbnk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoc29sQ29pbi5nZXREYXRhRnJvbU5vZGUsIDcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIHNvbCBmdW5kcyBmcm9tIEFUQSBhZGRyZXNzIGZvciBub24tYml0Z28gcmVjb3ZlcmllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGNsb3NlIEFUQSBhZGRyZXNzIGluc3RydWN0aW9uIHR5cGUgdHhuXG4gICAgICBjb25zdCBjbG9zZUFUQVR4bnMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyQ2xvc2VBVEEoe1xuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5jbG9zZUFUQWtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5jbG9zZUFUQWtleXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuY2xvc2VBVEFrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5jbG9zZUFUQWtleXMuZGVzdGluYXRpb25QdWJLZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHRlc3REYXRhLmNsb3NlQVRBa2V5cy53YWxsZXRQYXNzd29yZCxcbiAgICAgICAgY2xvc2VBdGFBZGRyZXNzOiB0ZXN0RGF0YS5jbG9zZUFUQWtleXMuY2xvc2VBdGFBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uQXRhQWRkcmVzczogdGVzdERhdGEuY2xvc2VBVEFrZXlzLnJlY292ZXJ5RGVzdGluYXRpb25BdGFBZGRyZXNzLFxuICAgICAgfSk7XG4gICAgICBjbG9zZUFUQVR4bnMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICBjbG9zZUFUQVR4bnNbMF0udHhJZCxcbiAgICAgICAgJzJpZDNZQzJqSzlHNVdvMnBoRHg0Z0pWQWV3OERjWTVOQW9qblZ1YW84cmt4d1BZUGU4Y1N3RTVHemhFZ0pBMnk4ZlZqREVvNmlSNnlrQnZEeHJUUXJ0cGInXG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICBjbG9zZUFUQVR4bnNbMV0udHhJZCxcbiAgICAgICAgJzVvVUJnWFg0ZW5HbUZFc3BHNjRnb3kzUFJ5c2pmcmVrWkdnM3JaTmtCSFVDUUZkNDgydnJWV2JmRGNSWU1CRUp0NjVKWHltZkVQbThNNmQ4OVg0eFY3OW4nXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQnVpbGQgQ29uc29saWRhdGlvbiBSZWNvdmVyaWVzOicsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IGNvaW4gPSBjb2lucy5nZXQoJ3Rzb2wnKTtcbiAgICBjb25zdCB1c2R0TWludEFkZHJlc3MgPSAnOWNncEJlTloySG5MZGE3TldhYVUxaTNOeVRzdGsyYzR6Q01VY29BR3NpOUMnO1xuICAgIGNvbnN0IGR1cmFibGVOb25jZXMgPSB7XG4gICAgICBwdWJsaWNLZXlzOiBbXG4gICAgICAgIHRlc3REYXRhLmtleXMuZHVyYWJsZU5vbmNlUHViS2V5LFxuICAgICAgICB0ZXN0RGF0YS5rZXlzLmR1cmFibGVOb25jZVB1YktleTIsXG4gICAgICAgIHRlc3REYXRhLmtleXMuZHVyYWJsZU5vbmNlUHViS2V5MyxcbiAgICAgIF0sXG4gICAgICBzZWNyZXRLZXk6IHRlc3REYXRhLmtleXMuZHVyYWJsZU5vbmNlUHJpdktleSxcbiAgICB9O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBjb25zdCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTb2wucHJvdG90eXBlLCAnZ2V0RGF0YUZyb21Ob2RlJyBhcyBrZXlvZiBTb2wpO1xuXG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldExhdGVzdEJsb2NraGFzaCcsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1pdG1lbnQ6ICdmaW5hbGl6ZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldEJsb2NraGFzaFJlc3BvbnNlKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0RmVlRm9yTWVzc2FnZScsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgc2lub24ubWF0Y2guc3RyaW5nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWl0bWVudDogJ2ZpbmFsaXplZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0RmVlc0Zvck1lc3NhZ2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldEJhbGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1zOiBbdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRBY2NvdW50QmFsYW5jZVJlc3BvbnNlTm9GdW5kcyk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldEJhbGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1zOiBbdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRBY2NvdW50QmFsYW5jZVJlc3BvbnNlKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0QmFsYW5jZScsXG4gICAgICAgICAgICBwYXJhbXM6IFt0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MzXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldEFjY291bnRCYWxhbmNlUmVzcG9uc2UpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRCYWxhbmNlJyxcbiAgICAgICAgICAgIHBhcmFtczogW3Rlc3REYXRhLndyd1VzZXIud2FsbGV0QWRkcmVzczVdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0QWNjb3VudEJhbGFuY2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldE1pbmltdW1CYWxhbmNlRm9yUmVudEV4ZW1wdGlvbicsXG4gICAgICAgICAgICBwYXJhbXM6IFsxNjVdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0TWluaW11bUJhbGFuY2VGb3JSZW50RXhlbXB0aW9uUmVzcG9uc2UpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRBY2NvdW50SW5mbycsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgdGVzdERhdGEua2V5cy5kdXJhYmxlTm9uY2VQdWJLZXksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogJ2pzb25QYXJzZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldEFjY291bnRJbmZvUmVzcG9uc2UpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRBY2NvdW50SW5mbycsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgdGVzdERhdGEua2V5cy5kdXJhYmxlTm9uY2VQdWJLZXkyLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6ICdqc29uUGFyc2VkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRBY2NvdW50SW5mb1Jlc3BvbnNlMik7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldFRva2VuQWNjb3VudHNCeU93bmVyJyxcbiAgICAgICAgICAgIHBhcmFtczogW1xuICAgICAgICAgICAgICB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MxLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbUlkOiAnVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogJ2pzb25QYXJzZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldFRva2VuQWNjb3VudHNCeU93bmVyUmVzcG9uc2VOb0FjY291bnRzKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgbWV0aG9kOiAnZ2V0VG9rZW5BY2NvdW50c0J5T3duZXInLFxuICAgICAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAgICAgIHRlc3REYXRhLndyd1VzZXIud2FsbGV0QWRkcmVzczIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiAnanNvblBhcnNlZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0VG9rZW5BY2NvdW50c0J5T3duZXJSZXNwb25zZU5vQWNjb3VudHMpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRUb2tlbkFjY291bnRzQnlPd25lcicsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6ICdqc29uUGFyc2VkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRUb2tlbkFjY291bnRzQnlPd25lclJlc3BvbnNlTm9BY2NvdW50cyk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2dldFRva2VuQWNjb3VudHNCeU93bmVyJyxcbiAgICAgICAgICAgIHBhcmFtczogW1xuICAgICAgICAgICAgICB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3M1LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbUlkOiAnVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogJ2pzb25QYXJzZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmdldFRva2VuQWNjb3VudHNCeU93bmVyUmVzcG9uc2UpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdnZXRUb2tlbkFjY291bnRzQnlPd25lcicsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6ICdqc29uUGFyc2VkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRUb2tlbkFjY291bnRzQnlPd25lclJlc3BvbnNlKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgc2lnbmVkIGNvbnNvbGlkYXRpb24gcmVjb3ZlcmllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IChhd2FpdCBiYXNlY29pbi5yZWNvdmVyQ29uc29saWRhdGlvbnMoe1xuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS53cndVc2VyLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEud3J3VXNlci5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS53cndVc2VyLmJpdGdvS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS53cndVc2VyLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDQsXG4gICAgICAgIGR1cmFibGVOb25jZXM6IGR1cmFibGVOb25jZXMsXG4gICAgICB9KSkgYXMgTVBDVHhzO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy50cmFuc2FjdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIChyZXMubGFzdFNjYW5JbmRleCA/PyAwKS5zaG91bGQuZXF1YWwoMyk7XG5cbiAgICAgIGNvbnN0IHR4bjEgPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgY29uc3QgbGF0ZXN0QmxvY2toYXNoVHhuRGVzZXJpYWxpemUxID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgbGF0ZXN0QmxvY2toYXNoVHhuRGVzZXJpYWxpemUxLmZyb21SYXdUcmFuc2FjdGlvbigodHhuMSBhcyBNUENUeCkuc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IGxhdGVzdEJsb2NraGFzaFR4bkpzb24xID0gbGF0ZXN0QmxvY2toYXNoVHhuRGVzZXJpYWxpemUxLnRvSnNvbigpO1xuXG4gICAgICBjb25zdCBub25jZTEgPSB0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0QWNjb3VudEluZm9SZXNwb25zZS5ib2R5LnJlc3VsdC52YWx1ZS5kYXRhLnBhcnNlZC5pbmZvLmJsb2NraGFzaDtcbiAgICAgIHNob3VsZC5lcXVhbChsYXRlc3RCbG9ja2hhc2hUeG5Kc29uMS5ub25jZSwgbm9uY2UxKTtcbiAgICAgIHNob3VsZC5lcXVhbChsYXRlc3RCbG9ja2hhc2hUeG5Kc29uMS5mZWVQYXllciwgdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMik7XG4gICAgICBzaG91bGQuZXF1YWwobGF0ZXN0QmxvY2toYXNoVHhuSnNvbjEubnVtU2lnbmF0dXJlcywgdGVzdERhdGEuU29sSW5wdXREYXRhLmR1cmFibGVOb25jZVNpZ25hdHVyZXMpO1xuXG4gICAgICBjb25zdCB0eG4yID0gcmVzLnRyYW5zYWN0aW9uc1sxXTtcbiAgICAgIGNvbnN0IGxhdGVzdEJsb2NraGFzaFR4bkRlc2VyaWFsaXplMiA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIGxhdGVzdEJsb2NraGFzaFR4bkRlc2VyaWFsaXplMi5mcm9tUmF3VHJhbnNhY3Rpb24oKHR4bjIgYXMgTVBDVHgpLnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBsYXRlc3RCbG9ja2hhc2hUeG5Kc29uMiA9IGxhdGVzdEJsb2NraGFzaFR4bkRlc2VyaWFsaXplMi50b0pzb24oKTtcblxuICAgICAgY29uc3Qgbm9uY2UyID0gdGVzdERhdGEuU29sUmVzcG9uc2VzLmdldEFjY291bnRJbmZvUmVzcG9uc2UyLmJvZHkucmVzdWx0LnZhbHVlLmRhdGEucGFyc2VkLmluZm8uYmxvY2toYXNoO1xuICAgICAgc2hvdWxkLmVxdWFsKGxhdGVzdEJsb2NraGFzaFR4bkpzb24yLm5vbmNlLCBub25jZTIpO1xuICAgICAgc2hvdWxkLmVxdWFsKGxhdGVzdEJsb2NraGFzaFR4bkpzb24yLmZlZVBheWVyLCB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MzKTtcbiAgICAgIHNob3VsZC5lcXVhbChsYXRlc3RCbG9ja2hhc2hUeG5Kc29uMi5udW1TaWduYXR1cmVzLCB0ZXN0RGF0YS5Tb2xJbnB1dERhdGEuZHVyYWJsZU5vbmNlU2lnbmF0dXJlcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc2lnbmVkIGNvbnNvbGlkYXRpb24gcmVjb3ZlcmllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IChhd2FpdCBiYXNlY29pbi5yZWNvdmVyQ29uc29saWRhdGlvbnMoe1xuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEud3J3VXNlci5iaXRnb0tleSxcbiAgICAgICAgc3RhcnRpbmdTY2FuSW5kZXg6IDEsXG4gICAgICAgIGVuZGluZ1NjYW5JbmRleDogNCxcbiAgICAgICAgZHVyYWJsZU5vbmNlczogZHVyYWJsZU5vbmNlcyxcbiAgICAgIH0pKSBhcyBNUENTd2VlcFR4cztcbiAgICAgIHJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICByZXMudHhSZXF1ZXN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuXG4gICAgICBjb25zdCB0eG4xID0gcmVzLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgICB0eG4xLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2VyaWFsaXplZFR4Jyk7XG4gICAgICB0eG4xLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2lnbmFibGVIZXgnKTtcbiAgICAgIHR4bjEuc2hvdWxkLmhhc093blByb3BlcnR5KCdzY2FuSW5kZXgnKTtcbiAgICAgICh0eG4xLnNjYW5JbmRleCA/PyAwKS5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eG4xLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnY29pbicpO1xuICAgICAgdHhuMS5jb2luPy5zaG91bGQuZXF1YWwoJ3Rzb2wnKTtcbiAgICAgIHR4bjEuc2hvdWxkLmhhc093blByb3BlcnR5KCdkZXJpdmF0aW9uUGF0aCcpO1xuICAgICAgdHhuMS5kZXJpdmF0aW9uUGF0aD8uc2hvdWxkLmVxdWFsKCdtLzInKTtcblxuICAgICAgdHhuMS5zaG91bGQuaGFzT3duUHJvcGVydHkoJ2NvaW5TcGVjaWZpYycpO1xuICAgICAgY29uc3QgY29pblNwZWNpZmljMSA9IHR4bjEuY29pblNwZWNpZmljO1xuICAgICAgY29pblNwZWNpZmljMT8uc2hvdWxkLmhhc093blByb3BlcnR5KCdjb21tb25LZXljaGFpbicpO1xuXG4gICAgICBjb25zdCBsYXRlc3RCbG9ja2hhc2hUeG5EZXNlcmlhbGl6ZTEgPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICBsYXRlc3RCbG9ja2hhc2hUeG5EZXNlcmlhbGl6ZTEuZnJvbVJhd1RyYW5zYWN0aW9uKCh0eG4xIGFzIE1QQ1R4KS5zZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgbGF0ZXN0QmxvY2toYXNoVHhuSnNvbjEgPSBsYXRlc3RCbG9ja2hhc2hUeG5EZXNlcmlhbGl6ZTEudG9Kc29uKCk7XG5cbiAgICAgIGNvbnN0IG5vbmNlMSA9IHRlc3REYXRhLlNvbFJlc3BvbnNlcy5nZXRBY2NvdW50SW5mb1Jlc3BvbnNlLmJvZHkucmVzdWx0LnZhbHVlLmRhdGEucGFyc2VkLmluZm8uYmxvY2toYXNoO1xuICAgICAgc2hvdWxkLmVxdWFsKGxhdGVzdEJsb2NraGFzaFR4bkpzb24xLm5vbmNlLCBub25jZTEpO1xuICAgICAgc2hvdWxkLmVxdWFsKGxhdGVzdEJsb2NraGFzaFR4bkpzb24xLmZlZVBheWVyLCB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MyKTtcbiAgICAgIHNob3VsZC5lcXVhbChsYXRlc3RCbG9ja2hhc2hUeG5Kc29uMS5udW1TaWduYXR1cmVzLCB0ZXN0RGF0YS5Tb2xJbnB1dERhdGEudW5zaWduZWRTd2VlcFNpZ25hdHVyZXMpO1xuXG4gICAgICBjb25zdCB0eG4yID0gcmVzLnR4UmVxdWVzdHNbMV0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgICB0eG4yLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2VyaWFsaXplZFR4Jyk7XG4gICAgICB0eG4yLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2lnbmFibGVIZXgnKTtcbiAgICAgIHR4bjIuc2hvdWxkLmhhc093blByb3BlcnR5KCdzY2FuSW5kZXgnKTtcbiAgICAgICh0eG4yLnNjYW5JbmRleCA/PyAwKS5zaG91bGQuZXF1YWwoMyk7XG4gICAgICB0eG4yLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnY29pbicpO1xuICAgICAgdHhuMi5jb2luPy5zaG91bGQuZXF1YWwoJ3Rzb2wnKTtcbiAgICAgIHR4bjIuc2hvdWxkLmhhc093blByb3BlcnR5KCdkZXJpdmF0aW9uUGF0aCcpO1xuICAgICAgdHhuMi5kZXJpdmF0aW9uUGF0aD8uc2hvdWxkLmVxdWFsKCdtLzMnKTtcblxuICAgICAgdHhuMi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ2NvaW5TcGVjaWZpYycpO1xuICAgICAgY29uc3QgY29pblNwZWNpZmljMiA9IHR4bjIuY29pblNwZWNpZmljO1xuICAgICAgY29pblNwZWNpZmljMj8uc2hvdWxkLmhhc093blByb3BlcnR5KCdjb21tb25LZXljaGFpbicpO1xuICAgICAgY29pblNwZWNpZmljMj8uc2hvdWxkLmhhc093blByb3BlcnR5KCdsYXN0U2NhbkluZGV4Jyk7XG4gICAgICBjb2luU3BlY2lmaWMyPy5sYXN0U2NhbkluZGV4Py5zaG91bGQuZXF1YWwoMyk7XG5cbiAgICAgIGNvbnN0IGxhdGVzdEJsb2NraGFzaFR4bkRlc2VyaWFsaXplMiA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIGxhdGVzdEJsb2NraGFzaFR4bkRlc2VyaWFsaXplMi5mcm9tUmF3VHJhbnNhY3Rpb24oKHR4bjIgYXMgTVBDVHgpLnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBsYXRlc3RCbG9ja2hhc2hUeG5Kc29uMiA9IGxhdGVzdEJsb2NraGFzaFR4bkRlc2VyaWFsaXplMi50b0pzb24oKTtcblxuICAgICAgY29uc3Qgbm9uY2UyID0gdGVzdERhdGEuU29sUmVzcG9uc2VzLmdldEFjY291bnRJbmZvUmVzcG9uc2UyLmJvZHkucmVzdWx0LnZhbHVlLmRhdGEucGFyc2VkLmluZm8uYmxvY2toYXNoO1xuICAgICAgc2hvdWxkLmVxdWFsKGxhdGVzdEJsb2NraGFzaFR4bkpzb24yLm5vbmNlLCBub25jZTIpO1xuICAgICAgc2hvdWxkLmVxdWFsKGxhdGVzdEJsb2NraGFzaFR4bkpzb24yLmZlZVBheWVyLCB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MzKTtcbiAgICAgIHNob3VsZC5lcXVhbChsYXRlc3RCbG9ja2hhc2hUeG5Kc29uMi5udW1TaWduYXR1cmVzLCB0ZXN0RGF0YS5Tb2xJbnB1dERhdGEudW5zaWduZWRTd2VlcFNpZ25hdHVyZXMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB1bnNpZ25lZCB0b2tlbiBjb25zb2xpZGF0aW9uIHJlY292ZXJpZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSAoYXdhaXQgYmFzZWNvaW4ucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLndyd1VzZXIuYml0Z29LZXksXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAzLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDUsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiB1c2R0TWludEFkZHJlc3MsXG4gICAgICAgIGR1cmFibGVOb25jZXM6IGR1cmFibGVOb25jZXMsXG4gICAgICB9KSkgYXMgTVBDU3dlZXBUeHM7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnR4UmVxdWVzdHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgY29uc3QgdHhuMSA9IHJlcy50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4O1xuICAgICAgdHhuMS5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NlcmlhbGl6ZWRUeCcpO1xuICAgICAgdHhuMS5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NpZ25hYmxlSGV4Jyk7XG4gICAgICB0eG4xLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2NhbkluZGV4Jyk7XG4gICAgICAodHhuMS5zY2FuSW5kZXggPz8gMCkuc2hvdWxkLmVxdWFsKDQpO1xuICAgICAgdHhuMS5zaG91bGQuaGFzT3duUHJvcGVydHkoJ2NvaW4nKTtcbiAgICAgIHR4bjEuY29pbj8uc2hvdWxkLmVxdWFsKCd0c29sJyk7XG4gICAgICB0eG4xLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnZGVyaXZhdGlvblBhdGgnKTtcbiAgICAgIHR4bjEuZGVyaXZhdGlvblBhdGg/LnNob3VsZC5lcXVhbCgnbS80Jyk7XG5cbiAgICAgIHR4bjEuc2hvdWxkLmhhc093blByb3BlcnR5KCdjb2luU3BlY2lmaWMnKTtcbiAgICAgIGNvbnN0IGNvaW5TcGVjaWZpYzEgPSB0eG4xLmNvaW5TcGVjaWZpYztcbiAgICAgIGNvaW5TcGVjaWZpYzE/LnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnY29tbW9uS2V5Y2hhaW4nKTtcblxuICAgICAgY29uc3QgbGF0ZXN0QmxvY2toYXNoVHhuRGVzZXJpYWxpemUxID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgbGF0ZXN0QmxvY2toYXNoVHhuRGVzZXJpYWxpemUxLmZyb21SYXdUcmFuc2FjdGlvbigodHhuMSBhcyBNUENUeCkuc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IGxhdGVzdEJsb2NraGFzaFR4bkpzb24xID0gbGF0ZXN0QmxvY2toYXNoVHhuRGVzZXJpYWxpemUxLnRvSnNvbigpO1xuXG4gICAgICBjb25zdCBub25jZTEgPSB0ZXN0RGF0YS5Tb2xSZXNwb25zZXMuZ2V0QWNjb3VudEluZm9SZXNwb25zZS5ib2R5LnJlc3VsdC52YWx1ZS5kYXRhLnBhcnNlZC5pbmZvLmJsb2NraGFzaDtcbiAgICAgIHNob3VsZC5lcXVhbChsYXRlc3RCbG9ja2hhc2hUeG5Kc29uMS5ub25jZSwgbm9uY2UxKTtcbiAgICAgIHNob3VsZC5lcXVhbChsYXRlc3RCbG9ja2hhc2hUeG5Kc29uMS5mZWVQYXllciwgdGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzNSk7XG4gICAgICBzaG91bGQuZXF1YWwobGF0ZXN0QmxvY2toYXNoVHhuSnNvbjEubnVtU2lnbmF0dXJlcywgdGVzdERhdGEuU29sSW5wdXREYXRhLnVuc2lnbmVkU3dlZXBTaWduYXR1cmVzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2tpcCBidWlsZGluZyBjb25zb2xpZGF0ZSB0cmFuc2FjdGlvbiBpZiBiYWxhbmNlIGlzIGVxdWFsIHRvIHplcm8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS53cndVc2VyLnVzZXJLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS53cndVc2VyLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleTogdGVzdERhdGEud3J3VXNlci5iaXRnb0tleSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS53cndVc2VyLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgc3RhcnRpbmdTY2FuSW5kZXg6IDEsXG4gICAgICAgICAgZW5kaW5nU2NhbkluZGV4OiAyLFxuICAgICAgICAgIGR1cmFibGVOb25jZXM6IGR1cmFibGVOb25jZXMsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKCdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIGZ1bmRzIHRvIHJlY292ZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgc3RhcnRpbmdTY2FuSW5kZXggaXMgbm90IGdlIHRvIDEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS53cndVc2VyLnVzZXJLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS53cndVc2VyLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleTogdGVzdERhdGEud3J3VXNlci5iaXRnb0tleSxcbiAgICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogLTEsXG4gICAgICAgICAgZHVyYWJsZU5vbmNlczogZHVyYWJsZU5vbmNlcyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ0ludmFsaWQgc3RhcnRpbmcgb3IgZW5kaW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3Nlcy4gc3RhcnRpbmdTY2FuSW5kZXg6IC0xLCBlbmRpbmdTY2FuSW5kZXg6IDE5LidcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgc2NhbiBmYWN0b3IgaXMgdG9vIGhpZ2gnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS53cndVc2VyLnVzZXJLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS53cndVc2VyLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleTogdGVzdERhdGEud3J3VXNlci5iaXRnb0tleSxcbiAgICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMwMCxcbiAgICAgICAgICBkdXJhYmxlTm9uY2VzOiBkdXJhYmxlTm9uY2VzLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnSW52YWxpZCBzdGFydGluZyBvciBlbmRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzLiBzdGFydGluZ1NjYW5JbmRleDogMSwgZW5kaW5nU2NhbkluZGV4OiAzMDAuJ1xuICAgICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnJvYWRjYXN0VHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2FuZEJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnJvYWRjYXN0IGEgdHJhbnNhY3Rpb24gc3VjY2VzZnVsbHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVkU2lnbmVkVHJhbnNhY3Rpb24gPSB0ZXN0RGF0YS5yYXdUcmFuc2FjdGlvbnMudHJhbnNmZXIuc2lnbmVkO1xuICAgICAgY29uc3QgYnJvYWRjYXN0U3R1YiA9IHNhbmRCb3hcbiAgICAgICAgLnN0dWIoU29sLnByb3RvdHlwZSwgJ2dldERhdGFGcm9tTm9kZScgYXMga2V5b2YgU29sKVxuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ3NlbmRUcmFuc2FjdGlvbicsXG4gICAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgICAgc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6ICdiYXNlNjQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXModGVzdERhdGEuU29sUmVzcG9uc2VzLmJyb2FkY2FzdFRyYW5zYWN0aW9uUmVzcG9uc2UpO1xuXG4gICAgICBjb25zdCBicm9hZGNhc3RUeG4gPSBhd2FpdCBiYXNlY29pbi5icm9hZGNhc3RUcmFuc2FjdGlvbih7IHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbiB9KTtcbiAgICAgIGFzc2VydC5vayhicm9hZGNhc3RUeG4pO1xuICAgICAgYXNzZXJ0Lm9rKGJyb2FkY2FzdFR4bi50eElkKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgYnJvYWRjYXN0VHhuLnR4SWQsXG4gICAgICAgICcyaWQzWUMyaks5RzVXbzJwaER4NGdKVkFldzhEY1k1TkFvam5WdWFvOHJreHdQWVBlOGNTd0U1R3poRWdKQTJ5OGZWakRFbzZpUjZ5a0J2RHhyVFFydHBiJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChicm9hZGNhc3RTdHViLmNhbGxDb3VudCwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGdvdCBhbiBlcnJvciBmcm9tIHRoZSBub2RlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uID0gdGVzdERhdGEucmF3VHJhbnNhY3Rpb25zLnRyYW5zZmVyLnNpZ25lZDtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdFN0dWIgPSBzYW5kQm94XG4gICAgICAgIC5zdHViKFNvbC5wcm90b3R5cGUsICdnZXREYXRhRnJvbU5vZGUnIGFzIGtleW9mIFNvbClcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdzZW5kVHJhbnNhY3Rpb24nLFxuICAgICAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAgICAgIHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiAnYmFzZTY0JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKHRlc3REYXRhLlNvbFJlc3BvbnNlcy5icm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlRXJyb3IpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGJhc2Vjb2luLmJyb2FkY2FzdFRyYW5zYWN0aW9uKHsgc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uIH0pO1xuICAgICAgICB9LFxuICAgICAgICB7IG1lc3NhZ2U6ICdFcnJvciBicm9hZGNhc3RpbmcgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uIHNpbXVsYXRpb24gZmFpbGVkOiBCbG9ja2hhc2ggbm90IGZvdW5kJyB9XG4gICAgICApO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJyb2FkY2FzdFN0dWIuY2FsbENvdW50LCAxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgaXMgbm90IGEgdmFsaWQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVkU2lnbmVkVHJhbnNhY3Rpb24gPSAncmFuZG9tc3RyaW5nJztcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBiYXNlY29pbi5icm9hZGNhc3RUcmFuc2FjdGlvbih7IHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbiB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgeyBtZXNzYWdlOiAnSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGlzIG5vdCBhIHNpZ25lZCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbiA9IHRlc3REYXRhLnJhd1RyYW5zYWN0aW9ucy50cmFuc2Zlci51bnNpZ25lZDtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBiYXNlY29pbi5icm9hZGNhc3RUcmFuc2FjdGlvbih7IHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbiB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgeyBtZXNzYWdlOiAnSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBdWRpdEtleScsICgpID0+IHtcbiAgICBjb25zdCB7IGtleToga2V5U3RyaW5nLCBjb21tb25LZXljaGFpbiB9ID0gc29sQmFja3VwS2V5O1xuICAgIGNvbnN0IGtleSA9IGtleVN0cmluZy5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAna0FtW0VGUTZvPVN4bGNMRkR3JSwnO1xuICAgIGNvbnN0IG11bHRpU2lnVHlwZSA9ICd0c3MnO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZm9yIHZhbGlkIGlucHV0cycsICgpID0+IHtcbiAgICAgIGJhc2Vjb2luLmFzc2VydElzVmFsaWRLZXkoe1xuICAgICAgICBlbmNyeXB0ZWRQcnY6IGtleSxcbiAgICAgICAgcHVibGljS2V5OiBjb21tb25LZXljaGFpbixcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgbXVsdGlTaWdUeXBlLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGlmIHRoZSBjb21tb25LZXljaGFpbiBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWx0ZXJlZENvbW1vbktleWNoYWluID0gZ2VuZXJhdGVSYW5kb21QYXNzd29yZCgxMCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJhc2Vjb2luLmFzc2VydElzVmFsaWRLZXkoe1xuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBrZXksXG4gICAgICAgICAgICBwdWJsaWNLZXk6IGFsdGVyZWRDb21tb25LZXljaGFpbixcbiAgICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgICBtdWx0aVNpZ1R5cGUsXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBjb21tb24ga2V5Y2hhaW4nLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbmNvcnJlY3RQYXNzcGhyYXNlID0gJ2Zvbyc7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJhc2Vjb2luLmFzc2VydElzVmFsaWRLZXkoe1xuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBrZXksXG4gICAgICAgICAgICBwdWJsaWNLZXk6IGNvbW1vbktleWNoYWluLFxuICAgICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogaW5jb3JyZWN0UGFzc3BocmFzZSxcbiAgICAgICAgICAgIG11bHRpU2lnVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6IFwiZmFpbGVkIHRvIGRlY3J5cHQgcHJ2OiBjY206IHRhZyBkb2Vzbid0IG1hdGNoXCIsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGlmIHRoZSBrZXkgaXMgYWx0ZXJlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGFsdGVyZWRLZXkgPSBrZXkucmVwbGFjZSgvWzAtOV0vZywgJzAnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgYmFzZWNvaW4uYXNzZXJ0SXNWYWxpZEtleSh7XG4gICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGFsdGVyZWRLZXksXG4gICAgICAgICAgICBwdWJsaWNLZXk6IGNvbW1vbktleWNoYWluLFxuICAgICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICAgIG11bHRpU2lnVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdmYWlsZWQgdG8gZGVjcnlwdCBwcnY6IGpzb24gZGVjcnlwdDogaW52YWxpZCBwYXJhbWV0ZXJzJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTZXQgdXAgd2FsbGV0IGRhdGFcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnLFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICAgIGtleXM6IFtcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzYwMDAwMDAwMCcsXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NzAwMDAwMDAwJyxcbiAgICAgICAgXSxcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgcm9vdEFkZHJlc3M6IHdhbGxldC5wdWIsXG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICB9O1xuICAgICAgY29uc3QgZmFrZVBydiA9IGVuY3J5cHQoJ3Bhc3N3b3JkJywgJ3BydicpO1xuXG4gICAgICBjb25zdCB3YWxsZXRPYmogPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG4gICAgICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbJ21vY2snXS51cmk7XG5cbiAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoJy9hcGkvdjIvdHNvbC9rZXkvNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnKVxuICAgICAgICAucmVwbHkoMjAwLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBmYWtlUHJ2LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAvLyBNb2NrIHRoZSBBUEkgcmVzcG9uc2UgZm9yIGJ1aWxkQWNjb3VudENvbnNvbGlkYXRpb25zXG4gICAgICBub2NrKGJnVXJsKVxuICAgICAgICAucG9zdCgnL2FwaS92Mi90c29sL3dhbGxldC81YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMC9jb25zb2xpZGF0ZUFjY291bnQvYnVpbGQnKVxuICAgICAgICAucmVwbHkoMjAwLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6ICc0ZmRkMGNhZS0yNTYzLTQzYjEtYjVjZi05NDg2NTE1OGNhMTAnLFxuICAgICAgICAgICAgd2FsbGV0SWQ6ICc2MzA2OGVkNGVmYTYzYTAwMDg3N2YwMmZkNGIwZmE2ZCcsXG4gICAgICAgICAgICB0eEhleDpcbiAgICAgICAgICAgICAgJzAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ZjUwMTMwYWJmOGQwZDg5NDNjNWI5YTUxYTU3NDg4NmE3ZDdiM2Q4ZGIxOGYwZGRiNGFiOGI2ZDNlYzI3ZTNjMmYzNmYzMzM5YmI5MmQ0Mjk2YWY2YWU0ZDNhYmZiYjA3ODc3Zjc3ZDAwMzNjODgzZGUwOGZhNGEyZWVhNjcwZDAyMDEwMjA2NzRhOWRmMmI5NGFhNGI0YWRhMTIwMmRjMjg5MWJlMzY2NTAxZDBhY2I0YTAxY2EzZTAyZTdmZDZjMWY1MDVhNzFjOTYxNzIwNDRmMTIxN2MzNzg0ZThmMDJmNDllMmM4ZmMzNTkxZTgxMjk0YWI1NDM5NGY5ZDIyZmQ3YjdhOGY4NDAxYzNmNjdjZmE1MjUxOGIzNGEwOWIwOGY0ZWE3N2UxYzRmYjlkODliZmFjY2RjMzNjZjhiOGE5Y2Y4ZDdiZjBlMDRjODljNTA0MjhlNGVkYTVjYmI3NTk0MjdjMzcwZjBhMjlhNTBiYjBkMTQwN2U1NzkyNGIwY2M1YjM2ZjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmE3ZDUxNzE5MmM1NjhlZTA4YTg0NWY3M2QyOTc4OGNmMDM1YzMxNDViMjFhYjM0NGQ4MDYyZWE5NDAwMDAwNDBjOTU2ODE5NWQ2N2ViNmIzOTZmZGJlOTdiYTJlMjc2NjIyZWYwMDIzYWYwOWYyM2U2ZTAyOTJhYmI2NzhkOTAyMDQwMzAzMDUwMTA0MDQwMDAwMDAwNDAyMDAwMjBjMDIwMDAwMDAwMTAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgZmVlOiAxMDAwMCxcbiAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMTAwMDAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR4SW5mbzoge1xuICAgICAgICAgICAgICBtaW5lckZlZTogJzEwMDAwJyxcbiAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcxNTQ3ODY0JyxcbiAgICAgICAgICAgICAgc3BlbmRBbW91bnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c29sJyxcbiAgICAgICAgICAgICAgICAgIGFtb3VudFN0cmluZzogJzE1NDc4NjQnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHBheUdvRmVlOiAnMCcsXG4gICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnOHJRWGVWRU1yS3Z0V0NFSmlyRU02Y0tZbmJadVRxVlRicVJQaU1NQUo4UjQnLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IDE1NDc4NjQsXG4gICAgICAgICAgICAgICAgICB3YWxsZXQ6ICc2MzA2OGVkNGVmYTYzYTAwMDg3N2YwMmYnLFxuICAgICAgICAgICAgICAgICAgd2FsbGV0czogWyc2MzA2OGVkNGVmYTYzYTAwMDg3N2YwMmYnXSxcbiAgICAgICAgICAgICAgICAgIGVudGVycHJpc2U6ICc2MmQ3MWE2Yjg2MDY4ZjAwMDhmMDI5ZmQnLFxuICAgICAgICAgICAgICAgICAgZW50ZXJwcmlzZXM6IFsnNjJkNzFhNmI4NjA2OGYwMDA4ZjAyOWZkJ10sXG4gICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE1NDc4NjQnLFxuICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c29sJyxcbiAgICAgICAgICAgICAgICAgIHdhbGxldFR5cGU6ICdob3QnLFxuICAgICAgICAgICAgICAgICAgd2FsbGV0VHlwZXM6IFsnaG90J10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDE1NDc4NjQsXG4gICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnQ21Zc04zZjhiY200QkRrRkpXTnN2WWdqUnhNVExINnZiSldOZllkbUg3R1UnLFxuICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxNTQ3ODY0JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAxMDAwMCxcbiAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICdDbVlzTjNmOGJjbTRCRGtGSldOc3ZZZ2pSeE1UTEg2dmJKV05mWWRtSDdHVScsXG4gICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzEwMDAwJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB0eXBlOiAnU2VuZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uc29saWRhdGVJZDogJzY4YTdkNWQwYzY2ZTc0ZTIxNmI5NzE3M2JkNTU4YzZkJyxcbiAgICAgICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gdG8gdGVzdFxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB3YWxsZXRPYmouc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3dvcmQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogJ3R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCBhZGRyZXNzJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHZhbGlkIGEgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UeCA9IHtcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICc0ZmRkMGNhZS0yNTYzLTQzYjEtYjVjZi05NDg2NTE1OGNhMTAnLFxuICAgICAgICB3YWxsZXRJZDogJzYzMDY4ZWQ0ZWZhNjNhMDAwODc3ZjAyZmQ0YjBmYTZkJyxcbiAgICAgICAgdHhIZXg6XG4gICAgICAgICAgJzAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDEwMjA2YWVkYTI1M2EzMzFkZTQ4OTgzODI0NmRmOTM4Nzk0NDBhZjhjNjJhYzQ5Njc2NThlZGMyYmI1ZDUyYjk3NTlkOTFjOTYxNzIwNDRmMTIxN2MzNzg0ZThmMDJmNDllMmM4ZmMzNTkxZTgxMjk0YWI1NDM5NGY5ZDIyZmQ3YjdhOGY3NGE5ZGYyYjk0YWE0YjRhZGExMjAyZGMyODkxYmUzNjY1MDFkMGFjYjRhMDFjYTNlMDJlN2ZkNmMxZjUwNWE3ZDI3MzRmMzk1MmYzZWI0YWVmY2Y2YzdhNjA5MmU5NzlkZDNmZTU1NjNjY2ZhY2ExY2M5MjY1MmExNWRkZDM5MzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmE3ZDUxNzE5MmM1NjhlZTA4YTg0NWY3M2QyOTc4OGNmMDM1YzMxNDViMjFhYjM0NGQ4MDYyZWE5NDAwMDAwNDI4ZGFkNDFiYmVkZWIzODAxODM3OWU0Y2VlYjdlODA3NTdkNzRkZDAwYWU4YzQ3YzM4ZDU5NzQ3NzMzOWFkODAyMDQwMzAzMDUwMTA0MDQwMDAwMDAwNDAyMDAwMjBjMDIwMDAwMDA1ODllMTcwMDAwMDAwMDAwJyxcbiAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgIGZlZTogMTAwMDAsXG4gICAgICAgICAgZmVlU3RyaW5nOiAnMTAwMDAnLFxuICAgICAgICB9LFxuICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICBtaW5lckZlZTogJzEwMDAwJyxcbiAgICAgICAgICBzcGVuZEFtb3VudDogJzE1NDc4NjQnLFxuICAgICAgICAgIHNwZW5kQW1vdW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2luTmFtZTogJ3Rzb2wnLFxuICAgICAgICAgICAgICBhbW91bnRTdHJpbmc6ICcxNTQ3ODY0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwYXlHb0ZlZTogJzAnLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJzhyUVhlVkVNckt2dFdDRUppckVNNmNLWW5iWnVUcVZUYnFSUGlNTUFKOFI0JyxcbiAgICAgICAgICAgICAgdmFsdWU6IDE1NDc4NjQsXG4gICAgICAgICAgICAgIHdhbGxldDogJzYzMDY4ZWQ0ZWZhNjNhMDAwODc3ZjAyZicsXG4gICAgICAgICAgICAgIHdhbGxldHM6IFsnNjMwNjhlZDRlZmE2M2EwMDA4NzdmMDJmJ10sXG4gICAgICAgICAgICAgIGVudGVycHJpc2U6ICc2MmQ3MWE2Yjg2MDY4ZjAwMDhmMDI5ZmQnLFxuICAgICAgICAgICAgICBlbnRlcnByaXNlczogWyc2MmQ3MWE2Yjg2MDY4ZjAwMDhmMDI5ZmQnXSxcbiAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxNTQ3ODY0JyxcbiAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c29sJyxcbiAgICAgICAgICAgICAgd2FsbGV0VHlwZTogJ2hvdCcsXG4gICAgICAgICAgICAgIHdhbGxldFR5cGVzOiBbJ2hvdCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogMTU0Nzg2NCxcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0NtWXNOM2Y4YmNtNEJEa0ZKV05zdllnalJ4TVRMSDZ2YkpXTmZZZG1IN0dVJyxcbiAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxNTQ3ODY0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAxMDAwMCxcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0NtWXNOM2Y4YmNtNEJEa0ZKV05zdllnalJ4TVRMSDZ2YkpXTmZZZG1IN0dVJyxcbiAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMDAwMCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHlwZTogJ1NlbmQnLFxuICAgICAgICB9LFxuICAgICAgICBjb25zb2xpZGF0ZUlkOiAnNjhhN2Q1ZDBjNjZlNzRlMjE2Yjk3MTczYmQ1NThjNmQnLFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtb2NrZWRXYWxsZXQ6IFBhcnRpYWw8SVdhbGxldD4gPSB7XG4gICAgICAgIGNvaW5TcGVjaWZpYzogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNzID0ge1xuICAgICAgICAgICAgcm9vdEFkZHJlc3M6ICc4clFYZVZFTXJLdnRXQ0VKaXJFTTZjS1luYlp1VHFWVGJxUlBpTU1BSjhSNCcsXG4gICAgICAgICAgfSBhcyBXYWxsZXRDb2luU3BlY2lmaWM7XG4gICAgICAgICAgcmV0dXJuIGNzO1xuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICEoYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgYmxvY2toYXNoOiAnJyxcbiAgICAgICAgICAgIGZlZVBheWVyOiAnJyxcbiAgICAgICAgICAgIHR4UGFyYW1zOiB7fSxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQ6IGNvbnNvbGlkYXRpb25UeCBhcyB1bmtub3duIGFzIFRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gICAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgICAgIHdhbGxldDogbW9ja2VkV2FsbGV0IGFzIElXYWxsZXQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKVxuICAgICAgICApIHtcbiAgICAgICAgICBhc3NlcnQuZmFpbCgnVHJhbnNhY3Rpb24gc2hvdWxkIHBhc3MgdmVyaWZpY2F0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXNzZXJ0LmZhaWwoJ1RyYW5zYWN0aW9uIHNob3VsZCBwYXNzIHZlcmlmaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB0b2tlbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29uc29saWRhdGlvblR4ID0ge1xuICAgICAgICB0eFJlcXVlc3RJZDogJzRmZGQwY2FlLTI1NjMtNDNiMS1iNWNmLTk0ODY1MTU4Y2ExMCcsXG4gICAgICAgIHdhbGxldElkOiAnNjMwNjhlZDRlZmE2M2EwMDA4NzdmMDJmZDRiMGZhNmQnLFxuICAgICAgICB0eEhleDpcbiAgICAgICAgICAnMDJiN2MyYzc4MjllZGVkNGU4Zjk0N2M5MGVkM2I5YWZjZTcxZjYxNmViNDdkZmNmYmY0Yjc2NTc3ODE0OTA2MDAxM2FjYjMzYjlmNjdmZGQ5YzI1MTJmNDhmYWM0ZTRjMDQ5ZWFiOTM4MjliNjk0MDRmM2JkMTY2ZmUzMjQyYzkwNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMTA0MDk2ZGE2OTBiZDU1OGZkODYzNGFjMTRmMTY0NWQ4MDk1YWZkMGNhZWE1OTUzNTc4YzU5NmUzYzBkZWEzODMwNWVlNzI5OGJmYWM1NTEwMWYxNzc3MzU2NTlkNDJlZDZiZTg5MGVmM2ExZDIwNGQ5ZTMzZjMyZTI0YzU2MzUzMjdjYTY2ZDFmZTAwODI2ZTVhNGY3NTlmODdiMjc5YzFhZWUxOWNjZTUzMDFhZjRlZDY2YWUxN2RiNDhiMjAxZWQ2YzJhMGU4YTI4YmY1NjU2MjdmMWFiOGEzNGIxYTk1ZWUxYjBhMmEzOTA4NGYxZjBlMmFjYjFjMzk0YjIwMTg1ZDhlMGIyMjY1N2M4ZDljNGNlNWY2NDk1ZWZiNjQxMGMxOTkwMTE1MzBmOTBlM2FiOWQ4ZDFlNDIwNmY5YWUwZmZlYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjNWY5ZmIzMmY0OTExMWFiMjBjMzNmMjU5OGZjODM2YzExM2UyOTE4ODFhYzIxZWUyOTE2OTM5NDAxMTI0NGU0MDZhN2Q1MTcxOTJjNTY4ZWUwOGE4NDVmNzNkMjk3ODhjZjAzNWMzMTQ1YjIxYWIzNDRkODA2MmVhOTQwMDAwMDA2ZGRmNmUxZDc2NWExOTNkOWNiZTE0NmNlZWI3OWFjMWNiNDg1ZWQ1ZjViMzc5MTNhOGNmNTg1N2VmZjAwYTlkZTEzYzc0ZDJiNGQ5NDhlMTYwOGVhNmVlYmRhZmU3NWJjMmY5OTVhYWQxMWIyMWQxZTJjOTRmMmEyZDEyZjY4MDIwNTAzMDMwNzAwMDQwNDAwMDAwMDA4MDQwMjA2MDQwMTBhMGNlMDA3NmJiMjA0MDAwMDAwMDYnLFxuICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgZmVlOiAxMDAwMCxcbiAgICAgICAgICBmZWVTdHJpbmc6ICcxMDAwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHR4SW5mbzoge1xuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnOGlMYTI2S1NiZHBCVXpOSzd1WXE4RnZ5dXlBNWg0azRlckRIc0RjUGJIdXMnLFxuICAgICAgICAgICAgICB2YWx1ZTogMi4wMTczMjI4ZTEwLFxuICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMTczMjI4MDAwJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICc4UDJrWDdUeWg5ZVMzUktkYUJocWJFdFFHQVg1OERYekw3bWhEUUFCR1gyZCcsXG4gICAgICAgICAgICAgIHZhbHVlOiAxMDAwMCxcbiAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMDAwMCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbWluZXJGZWU6ICcxMDAwMCcsXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnSEJ4WlNoY0U4NlVNbUY5M0tVTThlV0pLcWVFWGk1Y3FXQ0xZTE1NaHFNWW0nLFxuICAgICAgICAgICAgICBjb2luTmFtZTogJ3NvbDp3aWYnLFxuICAgICAgICAgICAgICBlbnRlcnByaXNlOiB7XG4gICAgICAgICAgICAgICAgJG9pZDogJzU1NTNiYThhZTdhNWM3NzAwNjcxOTY2MScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVudGVycHJpc2VzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgJG9pZDogJzU1NTNiYThhZTdhNWM3NzAwNjcxOTY2MScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgdmFsdWU6IDIuMDE3MzIyOGUxMCxcbiAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcyMDE3MzIyODAwMCcsXG4gICAgICAgICAgICAgIHdhbGxldDoge1xuICAgICAgICAgICAgICAgICRvaWQ6ICc2MmY0YzM3MjBkOTJjNTAwMDgyNTdlYjUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3YWxsZXRUeXBlOiAnaG90JyxcbiAgICAgICAgICAgICAgd2FsbGV0czogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICRvaWQ6ICc2MmY0YzM3MjBkOTJjNTAwMDgyNTdlYjUnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcGF5R29GZWU6ICcwJyxcbiAgICAgICAgICBzcGVuZEFtb3VudDogJzIwMTczMjI4MDAwJyxcbiAgICAgICAgICBzcGVuZEFtb3VudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYW1vdW50U3RyaW5nOiAnMjAxNzMyMjgwMDAnLFxuICAgICAgICAgICAgICBjb2luTmFtZTogJ3NvbDp3aWYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHR5cGU6ICdTZW5kJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29uc29saWRhdGVJZDogJzY3MTJkN2ZkYTZkZTQ5MDZkNjU4YzA0YWViYmY4ZjliJyxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9ja2VkV2FsbGV0OiBQYXJ0aWFsPElXYWxsZXQ+ID0ge1xuICAgICAgICBjb2luU3BlY2lmaWM6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjcyA9IHtcbiAgICAgICAgICAgIHJvb3RBZGRyZXNzOiAnSEJ4WlNoY0U4NlVNbUY5M0tVTThlV0pLcWVFWGk1Y3FXQ0xZTE1NaHFNWW0nLFxuICAgICAgICAgIH0gYXMgV2FsbGV0Q29pblNwZWNpZmljO1xuICAgICAgICAgIHJldHVybiBjcztcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhKGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIGJsb2NraGFzaDogJycsXG4gICAgICAgICAgICBmZWVQYXllcjogJycsXG4gICAgICAgICAgICB0eFBhcmFtczoge30sXG4gICAgICAgICAgICB0eFByZWJ1aWxkOiBjb25zb2xpZGF0aW9uVHggYXMgdW5rbm93biBhcyBUcmFuc2FjdGlvblByZWJ1aWxkLFxuICAgICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgICAgICB3YWxsZXQ6IG1vY2tlZFdhbGxldCBhcyBJV2FsbGV0LFxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXNzZXJ0LmZhaWwoJ1RyYW5zYWN0aW9uIHNob3VsZCBwYXNzIHZlcmlmaWNhdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGFzc2VydC5mYWlsKCdUcmFuc2FjdGlvbiBzaG91bGQgcGFzcyB2ZXJpZmljYXRpb24nKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGEgc3Bvb2ZlZCB0b2tlbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29uc29saWRhdGlvblR4ID0ge1xuICAgICAgICB0eFJlcXVlc3RJZDogJzRmZGQwY2FlLTI1NjMtNDNiMS1iNWNmLTk0ODY1MTU4Y2ExMCcsXG4gICAgICAgIHdhbGxldElkOiAnNjMwNjhlZDRlZmE2M2EwMDA4NzdmMDJmZDRiMGZhNmQnLFxuICAgICAgICB0eEhleDpcbiAgICAgICAgICAnMDJiN2MyYzc4MjllZGVkNGU4Zjk0N2M5MGVkM2I5YWZjZTcxZjYxNmViNDdkZmNmYmY0Yjc2NTc3ODE0OTA2MDAxM2FjYjMzYjlmNjdmZGQ5YzI1MTJmNDhmYWM0ZTRjMDQ5ZWFiOTM4MjliNjk0MDRmM2JkMTY2ZmUzMjQyYzkwNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMTA0MDk2ZGE2OTBiZDU1OGZkODYzNGFjMTRmMTY0NWQ4MDk1YWZkMGNhZWE1OTUzNTc4YzU5NmUzYzBkZWEzODMwNWVlNzI5OGJmYWM1NTEwMWYxNzc3MzU2NTlkNDJlZDZiZTg5MGVmM2ExZDIwNGQ5ZTMzZjMyZTI0YzU2MzUzMjdjYTY2ZDFmZTAwODI2ZTVhNGY3NTlmODdiMjc5YzFhZWUxOWNjZTUzMDFhZjRlZDY2YWUxN2RiNDhiMjAxZWQ2YzJhMGU4YTI4YmY1NjU2MjdmMWFiOGEzNGIxYTk1ZWUxYjBhMmEzOTA4NGYxZjBlMmFjYjFjMzk0YjIwMTg1ZDhlMGIyMjY1N2M4ZDljNGNlNWY2NDk1ZWZiNjQxMGMxOTkwMTE1MzBmOTBlM2FiOWQ4ZDFlNDIwNmY5YWUwZmZlYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjNWY5ZmIzMmY0OTExMWFiMjBjMzNmMjU5OGZjODM2YzExM2UyOTE4ODFhYzIxZWUyOTE2OTM5NDAxMTI0NGU0MDZhN2Q1MTcxOTJjNTY4ZWUwOGE4NDVmNzNkMjk3ODhjZjAzNWMzMTQ1YjIxYWIzNDRkODA2MmVhOTQwMDAwMDA2ZGRmNmUxZDc2NWExOTNkOWNiZTE0NmNlZWI3OWFjMWNiNDg1ZWQ1ZjViMzc5MTNhOGNmNTg1N2VmZjAwYTlkZTEzYzc0ZDJiNGQ5NDhlMTYwOGVhNmVlYmRhZmU3NWJjMmY5OTVhYWQxMWIyMWQxZTJjOTRmMmEyZDEyZjY4MDIwNTAzMDMwNzAwMDQwNDAwMDAwMDA4MDQwMjA2MDQwMTBhMGNlMDA3NmJiMjA0MDAwMDAwMDYnLFxuICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgZmVlOiAxMDAwMCxcbiAgICAgICAgICBmZWVTdHJpbmc6ICcxMDAwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHR4SW5mbzoge1xuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnOGlMYTI2S1NiZHBCVXpOSzd1WXE4RnZ5dXlBNWg0azRlckRIc0RjUGJIdXMnLFxuICAgICAgICAgICAgICB2YWx1ZTogMi4wMTczMjI4ZTEwLFxuICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMTczMjI4MDAwJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICc4UDJrWDdUeWg5ZVMzUktkYUJocWJFdFFHQVg1OERYekw3bWhEUUFCR1gyZCcsXG4gICAgICAgICAgICAgIHZhbHVlOiAxMDAwMCxcbiAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMDAwMCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbWluZXJGZWU6ICcxMDAwMCcsXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnSEJ4WlNoY0U4NlVNbUY5M0tVTThlV0pLcWVFWGk1Y3FXQ0xZTE1NaHFNWW0nLFxuICAgICAgICAgICAgICBjb2luTmFtZTogJ3NvbDp3aWYnLFxuICAgICAgICAgICAgICBlbnRlcnByaXNlOiB7XG4gICAgICAgICAgICAgICAgJG9pZDogJzU1NTNiYThhZTdhNWM3NzAwNjcxOTY2MScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVudGVycHJpc2VzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgJG9pZDogJzU1NTNiYThhZTdhNWM3NzAwNjcxOTY2MScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgdmFsdWU6IDIuMDE3MzIyOGUxMCxcbiAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcyMDE3MzIyODAwMCcsXG4gICAgICAgICAgICAgIHdhbGxldDoge1xuICAgICAgICAgICAgICAgICRvaWQ6ICc2MmY0YzM3MjBkOTJjNTAwMDgyNTdlYjUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3YWxsZXRUeXBlOiAnaG90JyxcbiAgICAgICAgICAgICAgd2FsbGV0czogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICRvaWQ6ICc2MmY0YzM3MjBkOTJjNTAwMDgyNTdlYjUnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcGF5R29GZWU6ICcwJyxcbiAgICAgICAgICBzcGVuZEFtb3VudDogJzIwMTczMjI4MDAwJyxcbiAgICAgICAgICBzcGVuZEFtb3VudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYW1vdW50U3RyaW5nOiAnMjAxNzMyMjgwMDAnLFxuICAgICAgICAgICAgICBjb2luTmFtZTogJ3NvbDp3aWYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHR5cGU6ICdTZW5kJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29uc29saWRhdGVJZDogJzY3MTJkN2ZkYTZkZTQ5MDZkNjU4YzA0YWViYmY4ZjliJyxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9ja2VkV2FsbGV0OiBQYXJ0aWFsPElXYWxsZXQ+ID0ge1xuICAgICAgICBjb2luU3BlY2lmaWM6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjcyA9IHtcbiAgICAgICAgICAgIHJvb3RBZGRyZXNzOiAnOHJRWGVWRU1yS3Z0V0NFSmlyRU02Y0tZbmJadVRxVlRicVJQaU1NQUo4UjQnLFxuICAgICAgICAgIH0gYXMgV2FsbGV0Q29pblNwZWNpZmljO1xuICAgICAgICAgIHJldHVybiBjcztcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICBhc3luYyAoKSA9PlxuICAgICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIGJsb2NraGFzaDogJycsXG4gICAgICAgICAgICBmZWVQYXllcjogJycsXG4gICAgICAgICAgICB0eFBhcmFtczoge30sXG4gICAgICAgICAgICB0eFByZWJ1aWxkOiBjb25zb2xpZGF0aW9uVHggYXMgdW5rbm93biBhcyBUcmFuc2FjdGlvblByZWJ1aWxkLFxuICAgICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgICAgICB3YWxsZXQ6IG1vY2tlZFdhbGxldCBhcyBJV2FsbGV0LFxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICd0eCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgYWRkcmVzcycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdibGluZCBzaWduaW5nIHRva2VuIGVuYWJsZW1lbnQgcHJvdGVjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhcyB2YWxpZCB0aGUgZW5hYmxldG9rZW4gaW50ZW50IHdoZW4gcHJlYnVpbGQgdHggbWF0Y2hzIHVzZXIgaW50ZW50ICcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGRSYXcsIHdhbGxldERhdGEgfSA9IHRlc3REYXRhLmVuYWJsZVRva2VuRml4dHVyZXM7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG4gICAgICBjb25zdCBzYW1lSW50ZW50VHggPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkOiB0eFByZWJ1aWxkUmF3LFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIHZlcmlmaWNhdGlvbjogeyB2ZXJpZnlUb2tlbkVuYWJsZW1lbnQ6IHRydWUgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBTb2xWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpO1xuXG4gICAgICBzYW1lSW50ZW50VHguc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvd24gYW4gZXJyb3Igd2hlbiB0YW1wZXJlZCBwcmVidWlsZCB0eCB0eXBlICcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGRSYXcsIHNlbmRUeEhleCwgd2FsbGV0RGF0YSB9ID0gdGVzdERhdGEuZW5hYmxlVG9rZW5GaXh0dXJlcztcbiAgICAgIGNvbnN0IHRhbXBlcmVkVHhQcmVidWlsZCA9IHsgLi4udHhQcmVidWlsZFJhdywgdHhIZXg6IHNlbmRUeEhleCB9O1xuXG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICBhc3luYyAoKSA9PlxuICAgICAgICAgIGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgICAgdHhQcmVidWlsZDogdGFtcGVyZWRUeFByZWJ1aWxkLFxuICAgICAgICAgICAgd2FsbGV0LFxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7IHZlcmlmeVRva2VuRW5hYmxlbWVudDogdHJ1ZSB9LFxuICAgICAgICAgIH0gYXMgdW5rbm93biBhcyBTb2xWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpLFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uIHR5cGUgb24gdG9rZW4gZW5hYmxlbWVudDogZXhwZWN0ZWQgXCJBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb25cIiwgZ290IFwiU2VuZFwiLicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB0aGF0IHRva2VuTmFtZSBtYXRjaGVzIGJldHdlZW4gdXNlciBpbnRlbnQgYW5kIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGRSYXcsIHdyb25nVG9rZW5OYW1lVHhIZXgsIHdhbGxldERhdGEgfSA9IHRlc3REYXRhLmVuYWJsZVRva2VuRml4dHVyZXM7XG4gICAgICBjb25zdCB0YW1wZXJlZFR4UHJlYnVpbGQgPSB7IC4uLnR4UHJlYnVpbGRSYXcsIHR4SGV4OiB3cm9uZ1Rva2VuTmFtZVR4SGV4IH07XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICBhc3luYyAoKSA9PlxuICAgICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgICAgdHhQcmVidWlsZDogdGFtcGVyZWRUeFByZWJ1aWxkLFxuICAgICAgICAgICAgd2FsbGV0LFxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7IHZlcmlmeVRva2VuRW5hYmxlbWVudDogdHJ1ZSB9LFxuICAgICAgICAgIH0gYXMgdW5rbm93biBhcyBTb2xWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpLFxuICAgICAgICB7IG1lc3NhZ2U6ICdJbnZhbGlkIHRva2VuIG5hbWU6IGV4cGVjdGVkIHRzb2w6cmF5LCBnb3QgdHNvbDp0MjJtaW50IG9uIHRva2VuIGVuYWJsZW1lbnQgdHgnIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB0aGF0IHRva2VuQWRkciBtYXRjaGVzIGJldHdlZW4gdXNlciBpbnRlbnQgYW5kIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGRSYXcsIHdyb25nQWRkclR4SGV4LCB3YWxsZXREYXRhIH0gPSB0ZXN0RGF0YS5lbmFibGVUb2tlbkZpeHR1cmVzO1xuICAgICAgY29uc3QgdGFtcGVyZWRUeFByZWJ1aWxkID0geyAuLi50eFByZWJ1aWxkUmF3LCB0eEhleDogd3JvbmdBZGRyVHhIZXggfTtcblxuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHdhbGxldERhdGEpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGFzeW5jICgpID0+XG4gICAgICAgICAgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgICB0eFByZWJ1aWxkOiB0YW1wZXJlZFR4UHJlYnVpbGQsXG4gICAgICAgICAgICB3YWxsZXQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb246IHsgdmVyaWZ5VG9rZW5FbmFibGVtZW50OiB0cnVlIH0sXG4gICAgICAgICAgfSBhcyB1bmtub3duIGFzIFNvbFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyksXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgJ0ludmFsaWQgdG9rZW4gYWRkcmVzczogZXhwZWN0ZWQgNGJUWXZ2djJIazR2MmtRVzhIWkZGUzRTellQenRRc2h3OUdtMXN1WG1hQmosIGdvdCBHMUxFZ0FOQXdLbzdiOE5meFRzTXpyYkJZRGtYcWk1UkVWSlk4dGhyTVJRbSBvbiB0b2tlbiBlbmFibGVtZW50IHR4JyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBzZW5kVG9rZW5FbmFibGVtZW50IGNhbGwgb24gc3Bvb2ZlZCBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyBzZW5kVG9rZW5FbmFibGVtZW50UGF5bG9hZCwgd2FsbGV0RGF0YSwgd3JvbmdUb2tlbk5hbWVUeEhleCB9ID0gdGVzdERhdGEuZW5hYmxlVG9rZW5GaXh0dXJlcztcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB3YWxsZXREYXRhKTtcbiAgICAgIG5vY2soJ2h0dHBzOi8vYml0Z28uZmFrZXVybCcpLmdldCgnL2FwaS92Mi90c29sL2tleS82OGJhZmVkNTg4NjcxY2Y5NGVkOGE1ZGJiYTg4MmFkMycpLnJlcGx5KDIwMCwge30pO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGFzeW5jICgpID0+XG4gICAgICAgICAgd2FsbGV0LnNlbmRUb2tlbkVuYWJsZW1lbnQoe1xuICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7IHZlcmlmeVRva2VuRW5hYmxlbWVudDogdHJ1ZSB9LFxuICAgICAgICAgICAgLi4uc2VuZFRva2VuRW5hYmxlbWVudFBheWxvYWQsXG4gICAgICAgICAgICBwcmVidWlsZFR4OiB7IC4uLnNlbmRUb2tlbkVuYWJsZW1lbnRQYXlsb2FkLnByZWJ1aWxkVHgsIHR4SGV4OiB3cm9uZ1Rva2VuTmFtZVR4SGV4IH0sXG4gICAgICAgICAgfSBhcyB1bmtub3duIGFzIFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyksXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b2tlbiBuYW1lOiBleHBlY3RlZCB0c29sOnJheSwgZ290IHRzb2w6dDIybWludCBvbiB0b2tlbiBlbmFibGVtZW50IHR4JyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzV2FsbGV0QWRkcmVzcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB2YWxpZCB3YWxsZXQgYWRkcmVzcyB3aXRoIGNvcnJlY3Qga2V5Y2hhaW4gYW5kIGluZGV4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICc3WUFlc2Z3UGs0MVZDaFVncjY1Ym04RkVlcDd5bVdxTFNXNXJwWUI1elpQWSc7XG4gICAgICBjb25zdCBjb21tb25LZXljaGFpbiA9XG4gICAgICAgICc4ZWEzMmVjYWNmYzgzZWZmYmQyZTI3OTBlZTQ0ZmE3YzU5YjRkODZjMjlhMTJmMDlmYjYxM2Q4MTk1ZjkzZjRlMjE4NzVjYWQzYjk4YWRhZGE0MGMwNDBjNTRjMzU2OTQ2N2RmNDFhMDIwODgxYTYxODQwOTYzNzg3MDE4NjJiZCc7XG4gICAgICBjb25zdCBpbmRleCA9ICcxJztcbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IFt7IGlkOiAnMScsIHR5cGU6ICd0c3MnIGFzIGNvbnN0LCBjb21tb25LZXljaGFpbiB9XTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsga2V5Y2hhaW5zLCBhZGRyZXNzLCBpbmRleCB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgYWRkcmVzcyB3aXRoIGluY29ycmVjdCBrZXljaGFpbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnN1lBZXNmd1BrNDFWQ2hVZ3I2NWJtOEZFZXA3eW1XcUxTVzVycFlCNXpaUFknO1xuICAgICAgY29uc3Qgd3JvbmdLZXljaGFpbiA9XG4gICAgICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICAgIGNvbnN0IGluZGV4ID0gJzEnO1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gW3sgaWQ6ICcxJywgdHlwZTogJ3RzcycgYXMgY29uc3QsIGNvbW1vbktleWNoYWluOiB3cm9uZ0tleWNoYWluIH1dO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MoeyBrZXljaGFpbnMsIGFkZHJlc3MsIGluZGV4IH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgYWRkcmVzcyB3aXRoIGluY29ycmVjdCBpbmRleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnN1lBZXNmd1BrNDFWQ2hVZ3I2NWJtOEZFZXA3eW1XcUxTVzVycFlCNXpaUFknO1xuICAgICAgY29uc3QgY29tbW9uS2V5Y2hhaW4gPVxuICAgICAgICAnOGVhMzJlY2FjZmM4M2VmZmJkMmUyNzkwZWU0NGZhN2M1OWI0ZDg2YzI5YTEyZjA5ZmI2MTNkODE5NWY5M2Y0ZTIxODc1Y2FkM2I5OGFkYWRhNDBjMDQwYzU0YzM1Njk0NjdkZjQxYTAyMDg4MWE2MTg0MDk2Mzc4NzAxODYyYmQnO1xuICAgICAgY29uc3Qgd3JvbmdJbmRleCA9ICc5OTknO1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gW3sgaWQ6ICcxJywgdHlwZTogJ3RzcycgYXMgY29uc3QsIGNvbW1vbktleWNoYWluIH1dO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MoeyBrZXljaGFpbnMsIGFkZHJlc3MsIGluZGV4OiB3cm9uZ0luZGV4IH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkQWRkcmVzcyA9ICdpbnZhbGlkYWRkcmVzcyc7XG4gICAgICBjb25zdCBjb21tb25LZXljaGFpbiA9XG4gICAgICAgICc4ZWEzMmVjYWNmYzgzZWZmYmQyZTI3OTBlZTQ0ZmE3YzU5YjRkODZjMjlhMTJmMDlmYjYxM2Q4MTk1ZjkzZjRlMjE4NzVjYWQzYjk4YWRhZGE0MGMwNDBjNTRjMzU2OTQ2N2RmNDFhMDIwODgxYTYxODQwOTYzNzg3MDE4NjJiZCc7XG4gICAgICBjb25zdCBpbmRleCA9ICcxJztcbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IFt7IGlkOiAnMScsIHR5cGU6ICd0c3MnIGFzIGNvbnN0LCBjb21tb25LZXljaGFpbiB9XTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsga2V5Y2hhaW5zLCBhZGRyZXNzOiBpbnZhbGlkQWRkcmVzcywgaW5kZXggfSksIHtcbiAgICAgICAgbWVzc2FnZTogYGludmFsaWQgYWRkcmVzczogJHtpbnZhbGlkQWRkcmVzc31gLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzRnJvbVB1YmxpY0tleScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgcHVibGljIGtleSB0byBiYXNlNTggYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHB1YmxpY0tleSA9ICc2MTIyMGE5Mzk0ODAyYjFkMWRmMzdiMzVmN2EzMTk3OTcwZjQ4MDgxMDkyY2VlMDExZmM5OGY3YjcxYjJiZDQzJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9ICc3WUFlc2Z3UGs0MVZDaFVncjY1Ym04RkVlcDd5bVdxTFNXNXJwWUI1elpQWSc7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBiYXNlY29pbi5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpO1xuICAgICAgYWRkcmVzcy5zaG91bGQuZXF1YWwoZXhwZWN0ZWRBZGRyZXNzKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==