@bitgo-beta/sdk-coin-sol 7.6.4-beta.62 → 7.6.4-beta.621

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 (421) 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/index.d.ts.map +1 -0
  4. package/dist/{src → cjs/src}/index.js +1 -1
  5. package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
  6. package/dist/cjs/src/lib/ataInitializationBuilder.js +201 -0
  7. package/dist/cjs/src/lib/closeAtaBuilder.d.ts +51 -0
  8. package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
  9. package/dist/cjs/src/lib/closeAtaBuilder.js +147 -0
  10. package/dist/{src → cjs/src}/lib/constants.d.ts +45 -2
  11. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  12. package/dist/cjs/src/lib/constants.js +216 -0
  13. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  14. package/dist/cjs/src/lib/customInstructionBuilder.js +289 -0
  15. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  16. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  17. package/dist/cjs/src/lib/explainTransactionWasm.js +264 -0
  18. package/dist/{src → cjs/src}/lib/iface.d.ts +79 -2
  19. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  20. package/dist/cjs/src/lib/iface.js +7 -0
  21. package/dist/{src → cjs/src}/lib/index.d.ts +3 -0
  22. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  23. package/dist/cjs/src/lib/index.js +89 -0
  24. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
  25. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  26. package/dist/cjs/src/lib/instructionParamsFactory.js +1122 -0
  27. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  28. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  29. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  30. package/dist/cjs/src/lib/keyPair.js +63 -0
  31. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  32. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  33. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  34. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  35. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  36. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  37. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  38. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/solInstructionFactory.js +649 -0
  40. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  41. package/dist/cjs/src/lib/stakingActivateBuilder.js +120 -0
  42. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  44. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  45. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +208 -0
  46. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  47. package/dist/cjs/src/lib/stakingDelegateBuilder.js +120 -0
  48. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  50. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  51. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +78 -0
  52. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  53. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  54. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  55. package/dist/cjs/src/lib/tokenExtensions.d.ts +31 -0
  56. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  57. package/dist/cjs/src/lib/tokenExtensions.js +112 -0
  58. package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
  59. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  60. package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
  61. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  62. package/dist/cjs/src/lib/transaction.js +612 -0
  63. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  64. package/dist/cjs/src/lib/transactionBuilder.js +380 -0
  65. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +5 -0
  66. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  67. package/dist/cjs/src/lib/transactionBuilderFactory.js +209 -0
  68. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  69. package/dist/cjs/src/lib/transferBuilder.js +70 -0
  70. package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
  71. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  72. package/dist/cjs/src/lib/transferBuilderV2.js +254 -0
  73. package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
  74. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  75. package/dist/cjs/src/lib/utils.js +635 -0
  76. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  77. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  78. package/dist/cjs/src/register.d.ts +5 -0
  79. package/dist/cjs/src/register.d.ts.map +1 -0
  80. package/dist/cjs/src/register.js +29 -0
  81. package/dist/{src → cjs/src}/sol.d.ts +112 -3
  82. package/dist/cjs/src/sol.d.ts.map +1 -0
  83. package/dist/cjs/src/sol.js +1617 -0
  84. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  85. package/dist/cjs/src/solToken.d.ts.map +1 -0
  86. package/dist/cjs/src/solToken.js +79 -0
  87. package/dist/cjs/src/tsol.d.ts.map +1 -0
  88. package/dist/cjs/src/tsol.js +24 -0
  89. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  90. package/dist/cjs/test/fixtures/sol.js +1433 -0
  91. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  92. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  93. package/dist/cjs/test/resources/sol.js +320 -0
  94. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  95. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  96. package/dist/cjs/test/unit/explainTransactionWasm.js +26 -0
  97. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  98. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  99. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  100. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  101. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  102. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  103. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  104. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  105. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  106. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  107. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  108. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  109. package/dist/cjs/test/unit/keyPair.js +177 -0
  110. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  111. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  112. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  113. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  114. package/dist/cjs/test/unit/register.d.ts +2 -0
  115. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  116. package/dist/cjs/test/unit/register.js +65 -0
  117. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  118. package/dist/cjs/test/unit/sol.js +4790 -0
  119. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  120. package/dist/cjs/test/unit/solInstructionFactory.js +611 -0
  121. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  122. package/dist/cjs/test/unit/solToken.js +37 -0
  123. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  124. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  125. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  126. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  127. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  128. package/dist/cjs/test/unit/tokenExtensions.js +32 -0
  129. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  130. package/dist/cjs/test/unit/transaction.js +1108 -0
  131. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  132. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  133. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  134. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
  135. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  136. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  137. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +333 -0
  138. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  139. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  140. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  141. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  142. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  143. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  144. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  145. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  146. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  147. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  148. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  149. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  150. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  151. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  152. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  153. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  154. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  155. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +286 -0
  156. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  157. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  158. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  159. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  160. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  161. package/dist/cjs/test/unit/utils.js +557 -0
  162. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  163. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  164. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  165. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  166. package/dist/esm/index.d.ts +7 -0
  167. package/dist/esm/index.js +7 -0
  168. package/dist/esm/lib/ataInitializationBuilder.d.ts +47 -0
  169. package/dist/{src → esm}/lib/ataInitializationBuilder.d.ts.map +1 -1
  170. package/dist/esm/lib/ataInitializationBuilder.js +161 -0
  171. package/dist/esm/lib/closeAtaBuilder.d.ts +51 -0
  172. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  173. package/dist/esm/lib/closeAtaBuilder.js +140 -0
  174. package/dist/esm/lib/constants.d.ts +183 -0
  175. package/dist/esm/lib/constants.d.ts.map +1 -0
  176. package/dist/esm/lib/constants.js +213 -0
  177. package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
  178. package/dist/esm/lib/customInstructionBuilder.js +282 -0
  179. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  180. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  181. package/dist/esm/lib/explainTransactionWasm.js +261 -0
  182. package/dist/esm/lib/iface.d.ts +321 -0
  183. package/dist/esm/lib/iface.d.ts.map +1 -0
  184. package/dist/esm/lib/iface.js +3 -0
  185. package/dist/esm/lib/index.d.ts +25 -0
  186. package/dist/{src → esm}/lib/index.d.ts.map +1 -1
  187. package/dist/esm/lib/index.js +25 -0
  188. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  189. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  190. package/dist/esm/lib/instructionParamsFactory.js +1114 -0
  191. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  192. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  193. package/dist/esm/lib/keyPair.d.ts +26 -0
  194. package/dist/esm/lib/keyPair.js +59 -0
  195. package/dist/esm/lib/messages/index.d.ts +2 -0
  196. package/dist/esm/lib/messages/index.js +2 -0
  197. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  198. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  199. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  200. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  201. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  202. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  203. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  204. package/dist/esm/lib/solInstructionFactory.js +643 -0
  205. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  206. package/dist/esm/lib/stakingActivateBuilder.js +113 -0
  207. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  208. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  209. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  210. package/dist/{src → esm}/lib/stakingDeactivateBuilder.js +31 -38
  211. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  212. package/dist/esm/lib/stakingDelegateBuilder.js +113 -0
  213. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  214. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  215. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  216. package/dist/esm/lib/stakingWithdrawBuilder.js +71 -0
  217. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  218. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  219. package/dist/esm/lib/token2022Resolve.js +194 -0
  220. package/dist/esm/lib/tokenExtensions.d.ts +31 -0
  221. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  222. package/dist/esm/lib/tokenExtensions.js +105 -0
  223. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  224. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  225. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  226. package/dist/esm/lib/transaction.d.ts +103 -0
  227. package/dist/esm/lib/transaction.d.ts.map +1 -0
  228. package/dist/esm/lib/transaction.js +605 -0
  229. package/dist/esm/lib/transactionBuilder.d.ts +128 -0
  230. package/dist/esm/lib/transactionBuilder.js +373 -0
  231. package/dist/esm/lib/transactionBuilderFactory.d.ts +120 -0
  232. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  233. package/dist/esm/lib/transactionBuilderFactory.js +205 -0
  234. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  235. package/dist/esm/lib/transferBuilder.js +63 -0
  236. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  237. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  238. package/dist/esm/lib/transferBuilderV2.js +247 -0
  239. package/dist/esm/lib/utils.d.ts +205 -0
  240. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  241. package/dist/esm/lib/utils.js +597 -0
  242. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  243. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  244. package/dist/esm/register.d.ts +5 -0
  245. package/dist/esm/register.d.ts.map +1 -0
  246. package/dist/esm/register.js +24 -0
  247. package/dist/esm/sol.d.ts +349 -0
  248. package/dist/esm/sol.d.ts.map +1 -0
  249. package/dist/esm/sol.js +1576 -0
  250. package/dist/esm/solToken.d.ts +44 -0
  251. package/dist/esm/solToken.d.ts.map +1 -0
  252. package/dist/esm/solToken.js +75 -0
  253. package/dist/esm/tsol.d.ts +11 -0
  254. package/dist/esm/tsol.js +20 -0
  255. package/package.json +35 -16
  256. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  257. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  258. package/dist/src/config/token2022StaticConfig.js +0 -50
  259. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  260. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  261. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  262. package/dist/src/lib/closeAtaBuilder.js +0 -69
  263. package/dist/src/lib/constants.d.ts.map +0 -1
  264. package/dist/src/lib/constants.js +0 -171
  265. package/dist/src/lib/customInstructionBuilder.js +0 -289
  266. package/dist/src/lib/iface.d.ts.map +0 -1
  267. package/dist/src/lib/iface.js +0 -7
  268. package/dist/src/lib/index.js +0 -77
  269. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  270. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  271. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  272. package/dist/src/lib/keyPair.js +0 -63
  273. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  274. package/dist/src/lib/solInstructionFactory.js +0 -572
  275. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  276. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  277. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  278. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  279. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  280. package/dist/src/lib/token2022Config.d.ts +0 -44
  281. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  282. package/dist/src/lib/token2022Config.js +0 -27
  283. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  284. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  285. package/dist/src/lib/transaction.d.ts.map +0 -1
  286. package/dist/src/lib/transaction.js +0 -595
  287. package/dist/src/lib/transactionBuilder.js +0 -380
  288. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  289. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  290. package/dist/src/lib/transferBuilder.js +0 -70
  291. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  292. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  293. package/dist/src/lib/transferBuilderV2.js +0 -210
  294. package/dist/src/lib/utils.js +0 -589
  295. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  296. package/dist/src/register.d.ts +0 -3
  297. package/dist/src/register.d.ts.map +0 -1
  298. package/dist/src/register.js +0 -15
  299. package/dist/src/sol.d.ts.map +0 -1
  300. package/dist/src/sol.js +0 -1324
  301. package/dist/src/solToken.d.ts.map +0 -1
  302. package/dist/src/solToken.js +0 -69
  303. package/dist/src/tsol.js +0 -24
  304. package/dist/test/fixtures/sol.js +0 -1433
  305. package/dist/test/resources/sol.d.ts.map +0 -1
  306. package/dist/test/resources/sol.js +0 -320
  307. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  308. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  309. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  310. package/dist/test/unit/getBuilderFactory.js +0 -10
  311. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  312. package/dist/test/unit/instructionParamsFactory.js +0 -412
  313. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  314. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  315. package/dist/test/unit/keyPair.js +0 -177
  316. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  317. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  318. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  319. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  320. package/dist/test/unit/sol.js +0 -3180
  321. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  322. package/dist/test/unit/solInstructionFactory.js +0 -454
  323. package/dist/test/unit/solToken.d.ts.map +0 -1
  324. package/dist/test/unit/solToken.js +0 -31
  325. package/dist/test/unit/transaction.d.ts.map +0 -1
  326. package/dist/test/unit/transaction.js +0 -983
  327. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  328. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  329. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  330. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  331. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  332. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  333. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  334. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  335. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  336. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  337. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  338. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  339. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  340. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  341. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  342. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  343. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  344. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  345. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  346. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  347. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  348. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  349. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  350. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  351. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  352. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  353. package/dist/test/unit/utils.js +0 -517
  354. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  355. package/dist/test/unit/versionedTransaction.js +0 -207
  356. package/dist/tsconfig.tsbuildinfo +0 -1
  357. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  358. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  359. /package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +0 -0
  360. /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
  361. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  362. /package/dist/{src → cjs/src}/lib/keyPair.d.ts +0 -0
  363. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  364. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  365. /package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +0 -0
  366. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  367. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  368. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  369. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  370. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  371. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  372. /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
  373. /package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -0
  374. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  375. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  376. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  377. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  378. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  379. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  380. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  381. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  382. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  383. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  384. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  385. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  386. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  387. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  388. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  389. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  390. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  391. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  392. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  393. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  394. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  395. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  396. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  397. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  398. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  399. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  400. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  401. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  402. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  403. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  404. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  405. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  406. /package/dist/{src → esm}/index.d.ts.map +0 -0
  407. /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
  408. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  409. /package/dist/{src → esm}/lib/keyPair.d.ts.map +0 -0
  410. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  411. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  412. /package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +0 -0
  413. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  414. /package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +0 -0
  415. /package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +0 -0
  416. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  417. /package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +0 -0
  418. /package/dist/{src → esm}/lib/transactionBuilder.d.ts.map +0 -0
  419. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  420. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  421. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,926 @@
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 getBuilderFactory_1 = require("../getBuilderFactory");
40
+ const src_1 = require("../../../src");
41
+ const should_1 = __importDefault(require("should"));
42
+ const testData = __importStar(require("../../resources/sol"));
43
+ const spl_token_1 = require("@solana/spl-token");
44
+ describe('Sol Token Transfer Builder', () => {
45
+ let ataAddress;
46
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
47
+ const tokenTransferBuilder = () => {
48
+ const txBuilder = factory.getTokenTransferBuilder();
49
+ txBuilder.nonce(recentBlockHash);
50
+ txBuilder.sender(authAccount.pub);
51
+ return txBuilder;
52
+ };
53
+ const authAccount = new src_1.KeyPair(testData.authAccount).getKeys();
54
+ const nonceAccount = new src_1.KeyPair(testData.nonceAccount).getKeys();
55
+ const otherAccount = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
56
+ const invalidPubKey = testData.pubKeys.invalidPubKeys[0];
57
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
58
+ const amount = testData.tokenTransfers.amount.toString();
59
+ const memo = testData.tokenTransfers.memo;
60
+ const nameUSDC = testData.tokenTransfers.nameUSDC;
61
+ const mintUSDC = testData.tokenTransfers.mintUSDC;
62
+ const owner = testData.tokenTransfers.owner;
63
+ const nameAMS = testData.amsTokenTransfers.nameAMSToken;
64
+ const mintAMS = testData.amsTokenTransfers.mintAMS;
65
+ const amsProgramID = testData.amsTokenTransfers.programID;
66
+ const walletPK = testData.associatedTokenAccounts.accounts[0].pub;
67
+ const walletSK = testData.associatedTokenAccounts.accounts[0].prv;
68
+ const prioFeeMicroLamports = '10000000';
69
+ const priorityFee = {
70
+ amount: prioFeeMicroLamports,
71
+ };
72
+ describe('Succeed', () => {
73
+ before(async () => {
74
+ ataAddress = await src_1.Utils.getAssociatedTokenAccountAddress(mintUSDC, otherAccount.pub);
75
+ });
76
+ it('build a token transfer tx unsigned with memo', async () => {
77
+ const txBuilder = factory.getTokenTransferBuilder();
78
+ txBuilder.nonce(recentBlockHash);
79
+ txBuilder.sender(walletPK);
80
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
81
+ txBuilder.memo(memo);
82
+ txBuilder.setPriorityFee(priorityFee);
83
+ const tx = await txBuilder.build();
84
+ tx.inputs.length.should.equal(1);
85
+ tx.inputs[0].should.deepEqual({
86
+ address: walletPK,
87
+ value: amount,
88
+ coin: nameUSDC,
89
+ });
90
+ tx.outputs.length.should.equal(1);
91
+ tx.outputs[0].should.deepEqual({
92
+ address: otherAccount.pub,
93
+ value: amount,
94
+ coin: nameUSDC,
95
+ });
96
+ const rawTx = tx.toBroadcastFormat();
97
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
98
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFER_UNSIGNED_TX_WITH_MEMO);
99
+ });
100
+ it('build a token transfer tx unsigned with durable nonce', async () => {
101
+ const txBuilder = factory.getTokenTransferBuilder();
102
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
103
+ txBuilder.sender(walletPK);
104
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
105
+ txBuilder.setPriorityFee(priorityFee);
106
+ const tx = await txBuilder.build();
107
+ tx.inputs.length.should.equal(1);
108
+ tx.inputs[0].should.deepEqual({
109
+ address: walletPK,
110
+ value: amount,
111
+ coin: nameUSDC,
112
+ });
113
+ tx.outputs.length.should.equal(1);
114
+ tx.outputs[0].should.deepEqual({
115
+ address: otherAccount.pub,
116
+ value: amount,
117
+ coin: nameUSDC,
118
+ });
119
+ const rawTx = tx.toBroadcastFormat();
120
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
121
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFER_UNSIGNED_TX_WITH_DURABLE_NONCE);
122
+ const txJson = tx.toJson();
123
+ txJson.durableNonce.should.deepEqual({
124
+ walletNonceAddress: nonceAccount.pub,
125
+ authWalletAddress: walletPK,
126
+ });
127
+ });
128
+ it('build a token transfer tx unsigned with memo and durable nonce', async () => {
129
+ const txBuilder = factory.getTokenTransferBuilder();
130
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
131
+ txBuilder.sender(walletPK);
132
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
133
+ txBuilder.memo(memo);
134
+ txBuilder.setPriorityFee(priorityFee);
135
+ const tx = await txBuilder.build();
136
+ tx.inputs.length.should.equal(1);
137
+ tx.inputs[0].should.deepEqual({
138
+ address: walletPK,
139
+ value: amount,
140
+ coin: nameUSDC,
141
+ });
142
+ tx.outputs.length.should.equal(1);
143
+ tx.outputs[0].should.deepEqual({
144
+ address: otherAccount.pub,
145
+ value: amount,
146
+ coin: nameUSDC,
147
+ });
148
+ const rawTx = tx.toBroadcastFormat();
149
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
150
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFER_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
151
+ });
152
+ it('build a token transfer tx unsigned without memo or durable nonce', async () => {
153
+ const txBuilder = factory.getTokenTransferBuilder();
154
+ txBuilder.nonce(recentBlockHash);
155
+ txBuilder.sender(walletPK);
156
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
157
+ txBuilder.setPriorityFee(priorityFee);
158
+ const tx = await txBuilder.build();
159
+ tx.inputs.length.should.equal(1);
160
+ tx.inputs[0].should.deepEqual({
161
+ address: walletPK,
162
+ value: amount,
163
+ coin: nameUSDC,
164
+ });
165
+ tx.outputs.length.should.equal(1);
166
+ tx.outputs[0].should.deepEqual({
167
+ address: otherAccount.pub,
168
+ value: amount,
169
+ coin: nameUSDC,
170
+ });
171
+ const rawTx = tx.toBroadcastFormat();
172
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
173
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFER_UNSIGNED_TX_WITHOUT_MEMO);
174
+ });
175
+ it('build a token transfer tx signed with memo and durable nonce', async () => {
176
+ const txBuilder = factory.getTokenTransferBuilder();
177
+ txBuilder.nonce(recentBlockHash, {
178
+ walletNonceAddress: nonceAccount.pub,
179
+ authWalletAddress: walletPK,
180
+ });
181
+ txBuilder.sender(walletPK);
182
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
183
+ txBuilder.memo(memo);
184
+ txBuilder.sign({ key: walletSK });
185
+ txBuilder.setPriorityFee(priorityFee);
186
+ const tx = await txBuilder.build();
187
+ tx.id.should.not.equal(undefined);
188
+ tx.inputs.length.should.equal(1);
189
+ tx.inputs[0].should.deepEqual({
190
+ address: walletPK,
191
+ value: amount,
192
+ coin: nameUSDC,
193
+ });
194
+ tx.outputs.length.should.equal(1);
195
+ tx.outputs[0].should.deepEqual({
196
+ address: otherAccount.pub,
197
+ value: amount,
198
+ coin: nameUSDC,
199
+ });
200
+ const rawTx = tx.toBroadcastFormat();
201
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
202
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
203
+ });
204
+ it('build a token multi transfer tx signed with memo and durable nonce', async () => {
205
+ const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
206
+ const account2 = new src_1.KeyPair({ prv: testData.extraAccounts.prv2 }).getKeys();
207
+ const account3 = new src_1.KeyPair({ prv: testData.extraAccounts.prv3 }).getKeys();
208
+ const account4 = new src_1.KeyPair({ prv: testData.extraAccounts.prv4 }).getKeys();
209
+ const account5 = new src_1.KeyPair({ prv: testData.extraAccounts.prv5 }).getKeys();
210
+ const txBuilder = factory.getTokenTransferBuilder();
211
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
212
+ txBuilder.sender(owner);
213
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
214
+ txBuilder.send({ address: account1.pub, amount, tokenName: nameUSDC });
215
+ txBuilder.send({ address: account2.pub, amount, tokenName: nameUSDC });
216
+ txBuilder.send({ address: account3.pub, amount, tokenName: nameUSDC });
217
+ txBuilder.send({ address: account4.pub, amount, tokenName: nameUSDC });
218
+ txBuilder.send({ address: account5.pub, amount, tokenName: nameUSDC });
219
+ txBuilder.memo(memo);
220
+ txBuilder.sign({ key: authAccount.prv });
221
+ txBuilder.setPriorityFee(priorityFee);
222
+ const tx = await txBuilder.build();
223
+ tx.inputs.length.should.equal(6);
224
+ tx.inputs[0].should.deepEqual({
225
+ address: owner,
226
+ value: amount,
227
+ coin: nameUSDC,
228
+ });
229
+ tx.inputs[1].should.deepEqual({
230
+ address: owner,
231
+ value: amount,
232
+ coin: nameUSDC,
233
+ });
234
+ tx.inputs[2].should.deepEqual({
235
+ address: owner,
236
+ value: amount,
237
+ coin: nameUSDC,
238
+ });
239
+ tx.inputs[3].should.deepEqual({
240
+ address: owner,
241
+ value: amount,
242
+ coin: nameUSDC,
243
+ });
244
+ tx.inputs[4].should.deepEqual({
245
+ address: owner,
246
+ value: amount,
247
+ coin: nameUSDC,
248
+ });
249
+ tx.inputs[5].should.deepEqual({
250
+ address: owner,
251
+ value: amount,
252
+ coin: nameUSDC,
253
+ });
254
+ tx.outputs.length.should.equal(6);
255
+ tx.outputs[0].should.deepEqual({
256
+ address: otherAccount.pub,
257
+ value: amount,
258
+ coin: nameUSDC,
259
+ });
260
+ tx.outputs[1].should.deepEqual({
261
+ address: account1.pub,
262
+ value: amount,
263
+ coin: nameUSDC,
264
+ });
265
+ tx.outputs[2].should.deepEqual({
266
+ address: account2.pub,
267
+ value: amount,
268
+ coin: nameUSDC,
269
+ });
270
+ tx.outputs[3].should.deepEqual({
271
+ address: account3.pub,
272
+ value: amount,
273
+ coin: nameUSDC,
274
+ });
275
+ tx.outputs[4].should.deepEqual({
276
+ address: account4.pub,
277
+ value: amount,
278
+ coin: nameUSDC,
279
+ });
280
+ tx.outputs[5].should.deepEqual({
281
+ address: account5.pub,
282
+ value: amount,
283
+ coin: nameUSDC,
284
+ });
285
+ const rawTx = tx.toBroadcastFormat();
286
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
287
+ should_1.default.equal(rawTx, testData.MULTI_TOKEN_TRANSFER_SIGNED);
288
+ });
289
+ it('build a token multi asset transfer tx unsigned', async () => {
290
+ const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
291
+ const account2 = new src_1.KeyPair({ prv: testData.extraAccounts.prv2 }).getKeys();
292
+ const account3 = new src_1.KeyPair({ prv: testData.extraAccounts.prv3 }).getKeys();
293
+ const txBuilder = factory.getTokenTransferBuilder();
294
+ const nameSRM = 'tsol:srm';
295
+ const nameRAY = 'tsol:ray';
296
+ txBuilder.nonce(recentBlockHash);
297
+ txBuilder.sender(owner);
298
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
299
+ txBuilder.send({ address: account1.pub, amount, tokenName: nameUSDC });
300
+ txBuilder.send({ address: account2.pub, amount, tokenName: nameSRM });
301
+ txBuilder.send({ address: account3.pub, amount, tokenName: nameRAY });
302
+ txBuilder.setPriorityFee(priorityFee);
303
+ const tx = await txBuilder.build();
304
+ tx.inputs.length.should.equal(4);
305
+ tx.inputs[0].should.deepEqual({
306
+ address: owner,
307
+ value: amount,
308
+ coin: nameUSDC,
309
+ });
310
+ tx.inputs[1].should.deepEqual({
311
+ address: owner,
312
+ value: amount,
313
+ coin: nameUSDC,
314
+ });
315
+ tx.inputs[2].should.deepEqual({
316
+ address: owner,
317
+ value: amount,
318
+ coin: nameSRM,
319
+ });
320
+ tx.inputs[3].should.deepEqual({
321
+ address: owner,
322
+ value: amount,
323
+ coin: nameRAY,
324
+ });
325
+ tx.outputs.length.should.equal(4);
326
+ tx.outputs[0].should.deepEqual({
327
+ address: otherAccount.pub,
328
+ value: amount,
329
+ coin: nameUSDC,
330
+ });
331
+ tx.outputs[1].should.deepEqual({
332
+ address: account1.pub,
333
+ value: amount,
334
+ coin: nameUSDC,
335
+ });
336
+ tx.outputs[2].should.deepEqual({
337
+ address: account2.pub,
338
+ value: amount,
339
+ coin: nameSRM,
340
+ });
341
+ tx.outputs[3].should.deepEqual({
342
+ address: account3.pub,
343
+ value: amount,
344
+ coin: nameRAY,
345
+ });
346
+ const txJson = tx.toJson();
347
+ txJson.instructionsData.length.should.equal(5);
348
+ txJson.instructionsData[0].type.should.equal('SetPriorityFee');
349
+ txJson.instructionsData[1].params.sourceAddress.should.equal(testData.tokenTransfers.sourceUSDC);
350
+ txJson.instructionsData[2].params.sourceAddress.should.equal(testData.tokenTransfers.sourceUSDC);
351
+ txJson.instructionsData[3].params.sourceAddress.should.equal(testData.tokenTransfers.sourceSRM);
352
+ txJson.instructionsData[4].params.sourceAddress.should.equal(testData.tokenTransfers.sourceRAY);
353
+ const rawTx = tx.toBroadcastFormat();
354
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
355
+ should_1.default.equal(rawTx, testData.MULTI_ASSET_TOKEN_TRANSFER_UNSIGNED);
356
+ });
357
+ it('build a transfer with large amount', async () => {
358
+ const amount = '18446744073709551615';
359
+ const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
360
+ const txBuilder = factory.getTokenTransferBuilder();
361
+ txBuilder.nonce(recentBlockHash);
362
+ txBuilder.sender(owner);
363
+ txBuilder.send({ address: account1.pub, amount, tokenName: nameUSDC });
364
+ txBuilder.setPriorityFee(priorityFee);
365
+ const tx = await txBuilder.build();
366
+ tx.outputs.should.deepEqual([
367
+ {
368
+ address: account1.pub,
369
+ value: amount,
370
+ coin: nameUSDC,
371
+ },
372
+ ]);
373
+ });
374
+ it('build a token transfer tx unsigned with create ATA, memo and durable nonce', async () => {
375
+ const txBuilder = factory.getTokenTransferBuilder();
376
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
377
+ txBuilder.sender(walletPK);
378
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
379
+ txBuilder.memo(memo);
380
+ txBuilder.createAssociatedTokenAccount({
381
+ ownerAddress: otherAccount.pub,
382
+ tokenName: nameUSDC,
383
+ ataAddress: ataAddress,
384
+ });
385
+ const prioFeeMicroLamports = '0';
386
+ const priorityFee = {
387
+ amount: prioFeeMicroLamports,
388
+ };
389
+ txBuilder.setPriorityFee(priorityFee);
390
+ const tx = await txBuilder.build();
391
+ tx.inputs.length.should.equal(1);
392
+ tx.inputs[0].should.deepEqual({
393
+ address: walletPK,
394
+ value: amount,
395
+ coin: nameUSDC,
396
+ });
397
+ tx.outputs.length.should.equal(1);
398
+ tx.outputs[0].should.deepEqual({
399
+ address: otherAccount.pub,
400
+ value: amount,
401
+ coin: nameUSDC,
402
+ });
403
+ const txJson = tx.toJson();
404
+ // Since prio fee is 0, we are not adding compute unit price instruction
405
+ txJson.instructionsData.length.should.equal(3);
406
+ txJson.instructionsData[0].type.should.equal('CreateAssociatedTokenAccount');
407
+ txJson.instructionsData[0].params.should.deepEqual({
408
+ mintAddress: mintUSDC,
409
+ ataAddress: ataAddress,
410
+ ownerAddress: otherAccount.pub,
411
+ payerAddress: walletPK,
412
+ tokenName: nameUSDC,
413
+ programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
414
+ });
415
+ txJson.instructionsData[1].type.should.equal('TokenTransfer');
416
+ txJson.instructionsData[1].params.should.deepEqual({
417
+ fromAddress: walletPK,
418
+ toAddress: otherAccount.pub,
419
+ amount: amount,
420
+ tokenName: nameUSDC,
421
+ sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
422
+ tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
423
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
424
+ decimalPlaces: 9,
425
+ });
426
+ txJson.instructionsData[2].type.should.equal('Memo');
427
+ txJson.instructionsData[2].params.memo.should.equal(memo);
428
+ const rawTx = tx.toBroadcastFormat();
429
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
430
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFER_UNSIGNED_WITH_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE);
431
+ });
432
+ it('build a token transfer tx unsigned with create ATA, memo and durable nonce with optional param', async () => {
433
+ const txBuilder = factory.getTokenTransferBuilder();
434
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
435
+ txBuilder.sender(walletPK);
436
+ txBuilder.send({
437
+ address: otherAccount.pub,
438
+ amount,
439
+ tokenName: nameAMS,
440
+ tokenAddress: mintAMS,
441
+ programId: amsProgramID,
442
+ decimalPlaces: 9,
443
+ });
444
+ txBuilder.memo(memo);
445
+ txBuilder.createAssociatedTokenAccount({
446
+ ownerAddress: otherAccount.pub,
447
+ tokenName: nameAMS,
448
+ tokenAddress: mintAMS,
449
+ programId: amsProgramID,
450
+ });
451
+ const prioFeeMicroLamports = '0';
452
+ const priorityFee = {
453
+ amount: prioFeeMicroLamports,
454
+ };
455
+ txBuilder.setPriorityFee(priorityFee);
456
+ const tx = await txBuilder.build();
457
+ tx.inputs.length.should.equal(1);
458
+ tx.inputs[0].should.deepEqual({
459
+ address: walletPK,
460
+ value: amount,
461
+ coin: nameAMS,
462
+ });
463
+ tx.outputs.length.should.equal(1);
464
+ tx.outputs[0].should.deepEqual({
465
+ address: otherAccount.pub,
466
+ value: amount,
467
+ coin: nameAMS,
468
+ });
469
+ const txJson = tx.toJson();
470
+ // Since prio fee is 0, we are not adding compute unit price instruction
471
+ txJson.instructionsData.length.should.equal(3);
472
+ txJson.instructionsData[0].type.should.equal('CreateAssociatedTokenAccount');
473
+ txJson.instructionsData[0].params.should.deepEqual({
474
+ mintAddress: mintAMS,
475
+ ataAddress: '8KLnroP6hHkr1ZsQL4k6A3i2yhhnv2kr2Teedx7a26Eg',
476
+ ownerAddress: otherAccount.pub,
477
+ payerAddress: walletPK,
478
+ tokenName: nameAMS,
479
+ programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
480
+ });
481
+ txJson.instructionsData[1].type.should.equal('TokenTransfer');
482
+ txJson.instructionsData[1].params.should.deepEqual({
483
+ fromAddress: walletPK,
484
+ toAddress: otherAccount.pub,
485
+ amount: amount,
486
+ tokenName: nameAMS,
487
+ sourceAddress: 'EytHm3gWSmaTkuF1datepgDzx7grGuDG7ws5QA7tCmU4',
488
+ tokenAddress: 'F4uLeXioFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
489
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
490
+ decimalPlaces: 9,
491
+ });
492
+ txJson.instructionsData[2].type.should.equal('Memo');
493
+ txJson.instructionsData[2].params.memo.should.equal(memo);
494
+ const rawTx = tx.toBroadcastFormat();
495
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
496
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFER_UNSIGNED_WITH_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE_WITH_OPTIONAL_PARAMS);
497
+ });
498
+ it('build a multi token transfer tx unsigned with multi create ATA, memo and durable nonce', async () => {
499
+ const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
500
+ const account2 = new src_1.KeyPair({ prv: testData.extraAccounts.prv2 }).getKeys();
501
+ const ataAddress1 = await src_1.Utils.getAssociatedTokenAccountAddress(mintUSDC, account1.pub);
502
+ const ataAddress2 = await src_1.Utils.getAssociatedTokenAccountAddress(mintUSDC, account2.pub);
503
+ const txBuilder = factory.getTokenTransferBuilder();
504
+ txBuilder.sender(walletPK);
505
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
506
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
507
+ txBuilder.send({ address: account1.pub, amount, tokenName: nameUSDC });
508
+ txBuilder.send({ address: account2.pub, amount, tokenName: nameUSDC });
509
+ txBuilder.memo(memo);
510
+ txBuilder.createAssociatedTokenAccount({
511
+ ownerAddress: otherAccount.pub,
512
+ tokenName: nameUSDC,
513
+ ataAddress: ataAddress,
514
+ });
515
+ txBuilder.createAssociatedTokenAccount({
516
+ ownerAddress: account1.pub,
517
+ tokenName: nameUSDC,
518
+ ataAddress: ataAddress1,
519
+ });
520
+ txBuilder.createAssociatedTokenAccount({
521
+ ownerAddress: account2.pub,
522
+ tokenName: nameUSDC,
523
+ ataAddress: ataAddress2,
524
+ });
525
+ txBuilder.setPriorityFee(priorityFee);
526
+ const tx = await txBuilder.build();
527
+ tx.inputs.length.should.equal(3);
528
+ tx.inputs[0].should.deepEqual({
529
+ address: walletPK,
530
+ value: amount,
531
+ coin: nameUSDC,
532
+ });
533
+ tx.inputs[1].should.deepEqual({
534
+ address: walletPK,
535
+ value: amount,
536
+ coin: nameUSDC,
537
+ });
538
+ tx.inputs[2].should.deepEqual({
539
+ address: walletPK,
540
+ value: amount,
541
+ coin: nameUSDC,
542
+ });
543
+ tx.outputs.length.should.equal(3);
544
+ tx.outputs[0].should.deepEqual({
545
+ address: otherAccount.pub,
546
+ value: amount,
547
+ coin: nameUSDC,
548
+ });
549
+ tx.outputs[1].should.deepEqual({
550
+ address: account1.pub,
551
+ value: amount,
552
+ coin: nameUSDC,
553
+ });
554
+ tx.outputs[2].should.deepEqual({
555
+ address: account2.pub,
556
+ value: amount,
557
+ coin: nameUSDC,
558
+ });
559
+ const txJson = tx.toJson();
560
+ txJson.instructionsData.length.should.equal(8);
561
+ txJson.instructionsData[0].type.should.equal('SetPriorityFee');
562
+ txJson.instructionsData[1].type.should.equal('CreateAssociatedTokenAccount');
563
+ txJson.instructionsData[1].params.should.deepEqual({
564
+ mintAddress: mintUSDC,
565
+ ataAddress: ataAddress,
566
+ ownerAddress: otherAccount.pub,
567
+ payerAddress: walletPK,
568
+ tokenName: nameUSDC,
569
+ programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
570
+ });
571
+ txJson.instructionsData[2].type.should.equal('CreateAssociatedTokenAccount');
572
+ txJson.instructionsData[2].params.should.deepEqual({
573
+ mintAddress: mintUSDC,
574
+ ataAddress: ataAddress1,
575
+ ownerAddress: account1.pub,
576
+ payerAddress: walletPK,
577
+ tokenName: nameUSDC,
578
+ programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
579
+ });
580
+ txJson.instructionsData[2].type.should.equal('CreateAssociatedTokenAccount');
581
+ txJson.instructionsData[3].params.should.deepEqual({
582
+ mintAddress: mintUSDC,
583
+ ataAddress: ataAddress2,
584
+ ownerAddress: account2.pub,
585
+ payerAddress: walletPK,
586
+ tokenName: nameUSDC,
587
+ programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
588
+ });
589
+ txJson.instructionsData.length.should.equal(8);
590
+ txJson.instructionsData[4].type.should.equal('TokenTransfer');
591
+ txJson.instructionsData[4].params.should.deepEqual({
592
+ fromAddress: walletPK,
593
+ toAddress: otherAccount.pub,
594
+ amount: amount,
595
+ tokenName: nameUSDC,
596
+ sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
597
+ tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
598
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
599
+ decimalPlaces: 9,
600
+ });
601
+ txJson.instructionsData[5].type.should.equal('TokenTransfer');
602
+ txJson.instructionsData[5].params.should.deepEqual({
603
+ fromAddress: walletPK,
604
+ toAddress: account1.pub,
605
+ amount: amount,
606
+ tokenName: nameUSDC,
607
+ sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
608
+ tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
609
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
610
+ decimalPlaces: 9,
611
+ });
612
+ txJson.instructionsData[6].type.should.equal('TokenTransfer');
613
+ txJson.instructionsData[6].params.should.deepEqual({
614
+ fromAddress: walletPK,
615
+ toAddress: account2.pub,
616
+ amount: amount,
617
+ tokenName: nameUSDC,
618
+ sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
619
+ tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
620
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
621
+ decimalPlaces: 9,
622
+ });
623
+ txJson.instructionsData[7].type.should.equal('Memo');
624
+ txJson.instructionsData[7].params.memo.should.equal(memo);
625
+ const rawTx = tx.toBroadcastFormat();
626
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
627
+ should_1.default.equal(rawTx, testData.MULTI_TOKEN_TRANSFER_UNSIGNED_WITH_MULTI_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE);
628
+ });
629
+ it('build a multi token transfer tx unsigned with unique create ATA, memo and durable nonce', async () => {
630
+ const txBuilder = factory.getTokenTransferBuilder();
631
+ txBuilder.sender(walletPK);
632
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
633
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
634
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
635
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
636
+ txBuilder.memo(memo);
637
+ txBuilder.createAssociatedTokenAccount({
638
+ ownerAddress: otherAccount.pub,
639
+ tokenName: nameUSDC,
640
+ ataAddress: ataAddress,
641
+ });
642
+ txBuilder.createAssociatedTokenAccount({
643
+ ownerAddress: otherAccount.pub,
644
+ tokenName: nameUSDC,
645
+ ataAddress: ataAddress,
646
+ });
647
+ txBuilder.createAssociatedTokenAccount({
648
+ ownerAddress: otherAccount.pub,
649
+ tokenName: nameUSDC,
650
+ ataAddress: ataAddress,
651
+ });
652
+ txBuilder.setPriorityFee(priorityFee);
653
+ const tx = await txBuilder.build();
654
+ tx.inputs.length.should.equal(3);
655
+ tx.inputs[0].should.deepEqual({
656
+ address: walletPK,
657
+ value: amount,
658
+ coin: nameUSDC,
659
+ });
660
+ tx.inputs[1].should.deepEqual({
661
+ address: walletPK,
662
+ value: amount,
663
+ coin: nameUSDC,
664
+ });
665
+ tx.inputs[2].should.deepEqual({
666
+ address: walletPK,
667
+ value: amount,
668
+ coin: nameUSDC,
669
+ });
670
+ tx.outputs.length.should.equal(3);
671
+ tx.outputs[0].should.deepEqual({
672
+ address: otherAccount.pub,
673
+ value: amount,
674
+ coin: nameUSDC,
675
+ });
676
+ tx.outputs[1].should.deepEqual({
677
+ address: otherAccount.pub,
678
+ value: amount,
679
+ coin: nameUSDC,
680
+ });
681
+ tx.outputs[2].should.deepEqual({
682
+ address: otherAccount.pub,
683
+ value: amount,
684
+ coin: nameUSDC,
685
+ });
686
+ const txJson = tx.toJson();
687
+ txJson.instructionsData.length.should.equal(6);
688
+ txJson.instructionsData[0].type.should.equal('SetPriorityFee');
689
+ txJson.instructionsData[1].type.should.equal('CreateAssociatedTokenAccount');
690
+ txJson.instructionsData[1].params.should.deepEqual({
691
+ mintAddress: mintUSDC,
692
+ ataAddress: ataAddress,
693
+ ownerAddress: otherAccount.pub,
694
+ payerAddress: walletPK,
695
+ tokenName: nameUSDC,
696
+ programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
697
+ });
698
+ txJson.instructionsData[2].type.should.equal('TokenTransfer');
699
+ txJson.instructionsData[2].params.should.deepEqual({
700
+ fromAddress: walletPK,
701
+ toAddress: otherAccount.pub,
702
+ amount: amount,
703
+ tokenName: nameUSDC,
704
+ sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
705
+ tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
706
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
707
+ decimalPlaces: 9,
708
+ });
709
+ txJson.instructionsData[3].type.should.equal('TokenTransfer');
710
+ txJson.instructionsData[3].params.should.deepEqual({
711
+ fromAddress: walletPK,
712
+ toAddress: otherAccount.pub,
713
+ amount: amount,
714
+ tokenName: nameUSDC,
715
+ sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
716
+ tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
717
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
718
+ decimalPlaces: 9,
719
+ });
720
+ txJson.instructionsData[4].type.should.equal('TokenTransfer');
721
+ txJson.instructionsData[4].params.should.deepEqual({
722
+ fromAddress: walletPK,
723
+ toAddress: otherAccount.pub,
724
+ amount: amount,
725
+ tokenName: nameUSDC,
726
+ sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
727
+ tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
728
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
729
+ decimalPlaces: 9,
730
+ });
731
+ txJson.instructionsData[5].type.should.equal('Memo');
732
+ txJson.instructionsData[5].params.memo.should.equal(memo);
733
+ const rawTx = tx.toBroadcastFormat();
734
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
735
+ should_1.default.equal(rawTx, testData.MULTI_TOKEN_TRANSFER_UNSIGNED_WITH_UNIQUE_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE);
736
+ });
737
+ });
738
+ describe('Fail', () => {
739
+ it('for invalid sender', () => {
740
+ const txBuilder = tokenTransferBuilder();
741
+ (0, should_1.default)(() => txBuilder.sender(invalidPubKey)).throwError('Invalid or missing sender, got: ' + invalidPubKey);
742
+ });
743
+ it('for invalid toAddress', () => {
744
+ const txBuilder = tokenTransferBuilder();
745
+ (0, should_1.default)(() => txBuilder.send({ address: invalidPubKey, amount, tokenName: nameUSDC })).throwError('Invalid or missing address, got: ' + invalidPubKey);
746
+ });
747
+ it('for invalid amount', () => {
748
+ const invalidAmount = 'randomstring';
749
+ const txBuilder = tokenTransferBuilder();
750
+ (0, should_1.default)(() => txBuilder.send({
751
+ address: nonceAccount.pub,
752
+ amount: invalidAmount,
753
+ tokenName: nameUSDC,
754
+ })).throwError('Invalid or missing amount, got: ' + invalidAmount);
755
+ const excessiveAmount = '18446744073709551616';
756
+ (0, should_1.default)(() => txBuilder.send({
757
+ address: nonceAccount.pub,
758
+ amount: excessiveAmount,
759
+ tokenName: nameUSDC,
760
+ })).throwError(`input amount ${excessiveAmount} exceeds big int limit 18446744073709551615`);
761
+ });
762
+ it('for invalid rent amount', () => {
763
+ const invalidAmount = 'randomstring';
764
+ const txBuilder = tokenTransferBuilder();
765
+ (0, should_1.default)(() => txBuilder.associatedTokenAccountRent(invalidAmount)).throwError('Invalid tokenAccountRentExemptAmount, got: ' + invalidAmount);
766
+ const negativeAmount = '-111';
767
+ (0, should_1.default)(() => txBuilder.associatedTokenAccountRent(negativeAmount)).throwError('Invalid tokenAccountRentExemptAmount, got: ' + negativeAmount);
768
+ });
769
+ it('for invalid ownerAddress', () => {
770
+ const txBuilder = tokenTransferBuilder();
771
+ (0, should_1.default)(() => txBuilder.createAssociatedTokenAccount({
772
+ ownerAddress: invalidPubKey,
773
+ tokenName: nameUSDC,
774
+ ataAddress: ataAddress,
775
+ })).throwError('Invalid or missing ownerAddress, got: ' + invalidPubKey);
776
+ });
777
+ it('for invalid tokenName', () => {
778
+ const invalidTokenName = 'tsol:random';
779
+ const txBuilder = tokenTransferBuilder();
780
+ (0, should_1.default)(() => txBuilder.createAssociatedTokenAccount({
781
+ ownerAddress: nonceAccount.pub,
782
+ tokenName: invalidTokenName,
783
+ ataAddress: ataAddress,
784
+ })).throwError('Invalid token name, got: ' + invalidTokenName);
785
+ });
786
+ });
787
+ describe('Create ATA rent payer selection', () => {
788
+ const feePayerAccount = new src_1.KeyPair(testData.feePayerAccount).getKeys();
789
+ before(async () => {
790
+ ataAddress = await src_1.Utils.getAssociatedTokenAccountAddress(mintUSDC, otherAccount.pub);
791
+ });
792
+ it('uses feePayer as Create-ATA rent payer when feePayer is set', async () => {
793
+ const txBuilder = factory.getTokenTransferBuilder();
794
+ txBuilder.nonce(recentBlockHash);
795
+ txBuilder.feePayer(feePayerAccount.pub);
796
+ txBuilder.sender(walletPK);
797
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
798
+ txBuilder.createAssociatedTokenAccount({
799
+ ownerAddress: otherAccount.pub,
800
+ tokenName: nameUSDC,
801
+ ataAddress,
802
+ });
803
+ txBuilder.setPriorityFee(priorityFee);
804
+ const tx = await txBuilder.build();
805
+ const createAta = tx.toJson().instructionsData.find((i) => i.type === 'CreateAssociatedTokenAccount');
806
+ should_1.default.exist(createAta);
807
+ createAta.params.payerAddress.should.equal(feePayerAccount.pub);
808
+ createAta.params.payerAddress.should.not.equal(walletPK);
809
+ });
810
+ it('falls back to sender as Create-ATA rent payer when feePayer is unset', async () => {
811
+ const txBuilder = factory.getTokenTransferBuilder();
812
+ txBuilder.nonce(recentBlockHash);
813
+ txBuilder.sender(walletPK);
814
+ txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
815
+ txBuilder.createAssociatedTokenAccount({
816
+ ownerAddress: otherAccount.pub,
817
+ tokenName: nameUSDC,
818
+ ataAddress,
819
+ });
820
+ txBuilder.setPriorityFee(priorityFee);
821
+ const tx = await txBuilder.build();
822
+ const createAta = tx.toJson().instructionsData.find((i) => i.type === 'CreateAssociatedTokenAccount');
823
+ should_1.default.exist(createAta);
824
+ createAta.params.payerAddress.should.equal(walletPK);
825
+ });
826
+ });
827
+ describe('Transfer Hook accounts', () => {
828
+ const t22Name = testData.sol2022TokenTransfers.name;
829
+ const t22Mint = testData.sol2022TokenTransfers.mint;
830
+ const t22Decimals = 6;
831
+ const transferHookAccounts = [
832
+ { pubkey: '98wFF5MpMjMQbfDF2MPzo8LCGX37unZR1ohRA1mU9GmJ', isSigner: false, isWritable: true },
833
+ { pubkey: '48n7YGEww7fKMfJ5gJ3sQC3rM6RWGjpUsghqVfXVkR5A', isSigner: false, isWritable: false },
834
+ { pubkey: '9sQhAH7vV3RKTCK13VY4EiNjs3qBq1srSYxdNufdAAXm', isSigner: false, isWritable: false },
835
+ ];
836
+ const buildToken2022Transfer = () => {
837
+ const txBuilder = factory.getTokenTransferBuilder();
838
+ txBuilder.nonce(recentBlockHash);
839
+ txBuilder.sender(walletPK);
840
+ txBuilder.send({
841
+ address: otherAccount.pub,
842
+ amount,
843
+ tokenName: t22Name,
844
+ tokenAddress: t22Mint,
845
+ programId: spl_token_1.TOKEN_2022_PROGRAM_ID.toString(),
846
+ decimalPlaces: t22Decimals,
847
+ });
848
+ return txBuilder;
849
+ };
850
+ it('threads resolved transfer hook accounts into the built TokenTransfer params', async () => {
851
+ const txBuilder = buildToken2022Transfer();
852
+ txBuilder.transferHookAccounts(transferHookAccounts);
853
+ const tx = await txBuilder.build();
854
+ const tokenTransfer = tx.toJson().instructionsData.find((i) => i.type === 'TokenTransfer');
855
+ should_1.default.exist(tokenTransfer);
856
+ tokenTransfer.params.transferHookAccounts.should.deepEqual(transferHookAccounts);
857
+ });
858
+ it('omits transfer hook accounts and matches the plain transfer when none are set', async () => {
859
+ const withHooks = await buildToken2022Transfer().transferHookAccounts(transferHookAccounts).build();
860
+ const withoutHooks = await buildToken2022Transfer().build();
861
+ const plainTransfer = withoutHooks.toJson().instructionsData.find((i) => i.type === 'TokenTransfer');
862
+ should_1.default.exist(plainTransfer);
863
+ should_1.default.equal(plainTransfer.params.transferHookAccounts, undefined);
864
+ // Appending the resolved hook accounts changes the serialized transaction.
865
+ withHooks.toBroadcastFormat().should.not.equal(withoutHooks.toBroadcastFormat());
866
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(withoutHooks.toBroadcastFormat()), true);
867
+ });
868
+ });
869
+ describe('Permissionless thaw bundling', () => {
870
+ const t22Name = testData.sol2022TokenTransfers.name;
871
+ const t22Mint = testData.sol2022TokenTransfers.mint;
872
+ const t22Decimals = 6;
873
+ // Resolved thaw params (as produced by Sol.resolvePermissionlessThaw). Arbitrary but valid
874
+ // base58 pubkeys used purely as fixtures — the offline builder never fetches them.
875
+ const thawParams = {
876
+ authority: walletPK,
877
+ mint: t22Mint,
878
+ tokenAccount: '98wFF5MpMjMQbfDF2MPzo8LCGX37unZR1ohRA1mU9GmJ',
879
+ tokenAccountOwner: otherAccount.pub,
880
+ gatingProgram: 'GbQ8ZiEFzGGTeYoXwtZtcoxwPcMyUcmZDduMVNdUPKpX',
881
+ flagAccount: '48n7YGEww7fKMfJ5gJ3sQC3rM6RWGjpUsghqVfXVkR5A',
882
+ mintConfig: '9sQhAH7vV3RKTCK13VY4EiNjs3qBq1srSYxdNufdAAXm',
883
+ extraAccounts: [{ pubkey: nonceAccount.pub, isSigner: false, isWritable: false }],
884
+ };
885
+ const buildToken2022TransferWithAta = () => {
886
+ const txBuilder = factory.getTokenTransferBuilder();
887
+ txBuilder.nonce(recentBlockHash);
888
+ txBuilder.sender(walletPK);
889
+ txBuilder.send({
890
+ address: otherAccount.pub,
891
+ amount,
892
+ tokenName: t22Name,
893
+ tokenAddress: t22Mint,
894
+ programId: spl_token_1.TOKEN_2022_PROGRAM_ID.toString(),
895
+ decimalPlaces: t22Decimals,
896
+ });
897
+ txBuilder.createAssociatedTokenAccount({
898
+ ownerAddress: otherAccount.pub,
899
+ tokenName: t22Name,
900
+ tokenAddress: t22Mint,
901
+ programId: spl_token_1.TOKEN_2022_PROGRAM_ID.toString(),
902
+ });
903
+ return txBuilder;
904
+ };
905
+ it('bundles instructions in the order [create, thaw, transfer]', async () => {
906
+ const txBuilder = buildToken2022TransferWithAta();
907
+ txBuilder.permissionlessThaw(thawParams);
908
+ const tx = await txBuilder.build();
909
+ const types = tx.toJson().instructionsData.map((i) => i.type);
910
+ types.should.deepEqual(['CreateAssociatedTokenAccount', 'PermissionlessThawIdempotent', 'TokenTransfer']);
911
+ const thaw = tx.toJson().instructionsData.find((i) => i.type === 'PermissionlessThawIdempotent');
912
+ should_1.default.exist(thaw);
913
+ thaw.params.gatingProgram.should.equal(thawParams.gatingProgram);
914
+ thaw.params.mintConfig.should.equal(thawParams.mintConfig);
915
+ thaw.params.flagAccount.should.equal(thawParams.flagAccount);
916
+ thaw.params.extraAccounts.should.deepEqual(thawParams.extraAccounts);
917
+ });
918
+ it('omits the thaw instruction when permissionlessThaw is not set', async () => {
919
+ const tx = await buildToken2022TransferWithAta().build();
920
+ const types = tx.toJson().instructionsData.map((i) => i.type);
921
+ types.should.deepEqual(['CreateAssociatedTokenAccount', 'TokenTransfer']);
922
+ should_1.default.equal(tx.toJson().instructionsData.find((i) => i.type === 'PermissionlessThawIdempotent'), undefined);
923
+ });
924
+ });
925
+ });
926
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNERBQXlEO0FBQ3pELHNDQUE4QztBQUM5QyxvREFBNEI7QUFDNUIsOERBQWdEO0FBRWhELGlEQUEwRDtBQUcxRCxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLElBQUksVUFBVSxDQUFDO0lBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUUxQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsRUFBRTtRQUNoQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNwRCxTQUFTLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoRSxNQUFNLFlBQVksR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyRixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGNB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RUFBRTtZQUM3RSxNQUFNLEVBQUUsR0FBRyxNQUFNLDZCQUE2QixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlELEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsOEJBQThCLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUMxRSxnQkFBTSxDQUFDLEtBQUssQ0FDVixFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDhCQUE4QixDQUFDLEVBQ25GLFNBQVMsQ0FDVixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBLZXlQYWlyLCBVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IEZlZU9wdGlvbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUT0tFTl8yMDIyX1BST0dSQU1fSUQgfSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQgeyBFeHRyYUFjY291bnRNZXRhIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5cbmRlc2NyaWJlKCdTb2wgVG9rZW4gVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgbGV0IGF0YUFkZHJlc3M7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHNvbCcpO1xuXG4gIGNvbnN0IHRva2VuVHJhbnNmZXJCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VG9rZW5UcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBhdXRoQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmF1dGhBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IG5vbmNlQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLm5vbmNlQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBvdGhlckFjY291bnQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KS5nZXRLZXlzKCk7XG4gIGNvbnN0IGludmFsaWRQdWJLZXkgPSB0ZXN0RGF0YS5wdWJLZXlzLmludmFsaWRQdWJLZXlzWzBdO1xuICBjb25zdCByZWNlbnRCbG9ja0hhc2ggPSAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknO1xuICBjb25zdCBhbW91bnQgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5hbW91bnQudG9TdHJpbmcoKTtcbiAgY29uc3QgbWVtbyA9IHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLm1lbW87XG4gIGNvbnN0IG5hbWVVU0RDID0gdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMubmFtZVVTREM7XG4gIGNvbnN0IG1pbnRVU0RDID0gdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMubWludFVTREM7XG4gIGNvbnN0IG93bmVyID0gdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMub3duZXI7XG4gIGNvbnN0IG5hbWVBTVMgPSB0ZXN0RGF0YS5hbXNUb2tlblRyYW5zZmVycy5uYW1lQU1TVG9rZW47XG4gIGNvbnN0IG1pbnRBTVMgPSB0ZXN0RGF0YS5hbXNUb2tlblRyYW5zZmVycy5taW50QU1TO1xuICBjb25zdCBhbXNQcm9ncmFtSUQgPSB0ZXN0RGF0YS5hbXNUb2tlblRyYW5zZmVycy5wcm9ncmFtSUQ7XG4gIGNvbnN0IHdhbGxldFBLID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViO1xuICBjb25zdCB3YWxsZXRTSyA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnBydjtcbiAgY29uc3QgcHJpb0ZlZU1pY3JvTGFtcG9ydHMgPSAnMTAwMDAwMDAnO1xuICBjb25zdCBwcmlvcml0eUZlZTogRmVlT3B0aW9ucyA9IHtcbiAgICBhbW91bnQ6IHByaW9GZWVNaWNyb0xhbXBvcnRzLFxuICB9O1xuICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICBiZWZvcmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXRhQWRkcmVzcyA9IGF3YWl0IFV0aWxzLmdldEFzc29jaWF0ZWRUb2tlbkFjY291bnRBZGRyZXNzKG1pbnRVU0RDLCBvdGhlckFjY291bnQucHViKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIHRyYW5zZmVyIHR4IHVuc2lnbmVkIHdpdGggbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VG9rZW5UcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5UT0tFTl9UUkFOU0ZFUl9VTlNJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdG9rZW4gdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiB3YWxsZXRQSyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0UEspO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSX1VOU0lHTkVEX1RYX1dJVEhfRFVSQUJMRV9OT05DRSk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5kdXJhYmxlTm9uY2Uuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0b2tlbiB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRoIG1lbW8gYW5kIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5UT0tFTl9UUkFOU0ZFUl9VTlNJR05FRF9UWF9XSVRIX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdG9rZW4gdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aG91dCBtZW1vIG9yIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0UEspO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSX1VOU0lHTkVEX1RYX1dJVEhPVVRfTUVNTyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0b2tlbiB0cmFuc2ZlciB0eCBzaWduZWQgd2l0aCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwge1xuICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHdhbGxldFNLIH0pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pZC5zaG91bGQubm90LmVxdWFsKHVuZGVmaW5lZCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5UT0tFTl9UUkFOU0ZFUl9TSUdORURfVFhfV0lUSF9NRU1PX0FORF9EVVJBQkxFX05PTkNFKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIG11bHRpIHRyYW5zZmVyIHR4IHNpZ25lZCB3aXRoIG1lbW8gYW5kIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhY2NvdW50MSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjEgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgYWNjb3VudDIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnYyIH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQzID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MyB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50NCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjQgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgYWNjb3VudDUgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnY1IH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VG9rZW5UcmFuc2ZlckJ1aWxkZXIoKTtcblxuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKG93bmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50MS5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDIucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGFjY291bnQzLnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50NC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDUucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhdXRoQWNjb3VudC5wcnYgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDYpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvd25lcixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG93bmVyLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzNdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvd25lcixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1s0XS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbNV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG93bmVyLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDYpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQxLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQyLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbM10uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQzLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbNF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQ0LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbNV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQ1LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTVVMVElfVE9LRU5fVFJBTlNGRVJfU0lHTkVEKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIG11bHRpIGFzc2V0IHRyYW5zZmVyIHR4IHVuc2lnbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWNjb3VudDEgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnYxIH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MiB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50MyA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjMgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgY29uc3QgbmFtZVNSTSA9ICd0c29sOnNybSc7XG4gICAgICBjb25zdCBuYW1lUkFZID0gJ3Rzb2w6cmF5JztcblxuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKG93bmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50MS5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDIucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVNSTSB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDMucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVJBWSB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNCk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG93bmVyLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzFdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvd25lcixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1syXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVTUk0sXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVSQVksXG4gICAgICB9KTtcblxuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDQpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQxLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQyLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVNSTSxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogYWNjb3VudDMucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lUkFZLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCg1KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdTZXRQcmlvcml0eUZlZScpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMV0ucGFyYW1zLnNvdXJjZUFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLnNvdXJjZVVTREMpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0ucGFyYW1zLnNvdXJjZUFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLnNvdXJjZVVTREMpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbM10ucGFyYW1zLnNvdXJjZUFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLnNvdXJjZVNSTSk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVs0XS5wYXJhbXMuc291cmNlQWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEudG9rZW5UcmFuc2ZlcnMuc291cmNlUkFZKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5NVUxUSV9BU1NFVF9UT0tFTl9UUkFOU0ZFUl9VTlNJR05FRCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0cmFuc2ZlciB3aXRoIGxhcmdlIGFtb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxODQ0Njc0NDA3MzcwOTU1MTYxNSc7XG4gICAgICBjb25zdCBhY2NvdW50MSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjEgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuXG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIob3duZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50MS5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICB0eC5vdXRwdXRzLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogYWNjb3VudDEucHViLFxuICAgICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIHRyYW5zZmVyIHR4IHVuc2lnbmVkIHdpdGggY3JlYXRlIEFUQSwgbWVtbyBhbmQgZHVyYWJsZSBub25jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VG9rZW5UcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhdXRoV2FsbGV0QWRkcmVzczogd2FsbGV0UEsgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldFBLKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCh7XG4gICAgICAgIG93bmVyQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgYXRhQWRkcmVzczogYXRhQWRkcmVzcyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJpb0ZlZU1pY3JvTGFtcG9ydHMgPSAnMCc7XG4gICAgICBjb25zdCBwcmlvcml0eUZlZTogRmVlT3B0aW9ucyA9IHtcbiAgICAgICAgYW1vdW50OiBwcmlvRmVlTWljcm9MYW1wb3J0cyxcbiAgICAgIH07XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIC8vIFNpbmNlIHByaW8gZmVlIGlzIDAsIHdlIGFyZSBub3QgYWRkaW5nIGNvbXB1dGUgdW5pdCBwcmljZSBpbnN0cnVjdGlvblxuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdDcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50Jyk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVswXS5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIG1pbnRBZGRyZXNzOiBtaW50VVNEQyxcbiAgICAgICAgYXRhQWRkcmVzczogYXRhQWRkcmVzcyxcbiAgICAgICAgb3duZXJBZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICBwYXllckFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB0b2tlbk5hbWU6IG5hbWVVU0RDLFxuICAgICAgICBwcm9ncmFtSWQ6ICdBVG9rZW5HUHZiZEdWeHIxYjJodlpic2lxVzV4V0gyNWVmVE5zTEpBOGtuTCcsXG4gICAgICB9KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnR5cGUuc2hvdWxkLmVxdWFsKCdUb2tlblRyYW5zZmVyJyk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVsxXS5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGZyb21BZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdG9BZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICBhbW91bnQ6IGFtb3VudCxcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgc291cmNlQWRkcmVzczogJ0I1ckpqdVZpN0VuNjNpSzZvM2lqS2RKd0FvVGUyZ3dDWW1Kc1ZkSFEyYUtWJyxcbiAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYSm9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogOSxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0udHlwZS5zaG91bGQuZXF1YWwoJ01lbW8nKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzJdLnBhcmFtcy5tZW1vLnNob3VsZC5lcXVhbChtZW1vKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5UT0tFTl9UUkFOU0ZFUl9VTlNJR05FRF9XSVRIX0NSRUFURV9BVEFfQU5EX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdG9rZW4gdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aCBjcmVhdGUgQVRBLCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlIHdpdGggb3B0aW9uYWwgcGFyYW0nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lQU1TLFxuICAgICAgICB0b2tlbkFkZHJlc3M6IG1pbnRBTVMsXG4gICAgICAgIHByb2dyYW1JZDogYW1zUHJvZ3JhbUlELFxuICAgICAgICBkZWNpbWFsUGxhY2VzOiA5LFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIHR4QnVpbGRlci5jcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHtcbiAgICAgICAgb3duZXJBZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB0b2tlbk5hbWU6IG5hbWVBTVMsXG4gICAgICAgIHRva2VuQWRkcmVzczogbWludEFNUyxcbiAgICAgICAgcHJvZ3JhbUlkOiBhbXNQcm9ncmFtSUQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHByaW9GZWVNaWNyb0xhbXBvcnRzID0gJzAnO1xuICAgICAgY29uc3QgcHJpb3JpdHlGZWU6IEZlZU9wdGlvbnMgPSB7XG4gICAgICAgIGFtb3VudDogcHJpb0ZlZU1pY3JvTGFtcG9ydHMsXG4gICAgICB9O1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVBTVMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVBTVMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgLy8gU2luY2UgcHJpbyBmZWUgaXMgMCwgd2UgYXJlIG5vdCBhZGRpbmcgY29tcHV0ZSB1bml0IHByaWNlIGluc3RydWN0aW9uXG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMF0udHlwZS5zaG91bGQuZXF1YWwoJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzBdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgbWludEFkZHJlc3M6IG1pbnRBTVMsXG4gICAgICAgIGF0YUFkZHJlc3M6ICc4S0xucm9QNmhIa3IxWnNRTDRrNkEzaTJ5aGhudjJrcjJUZWVkeDdhMjZFZycsXG4gICAgICAgIG93bmVyQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgcGF5ZXJBZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lQU1TLFxuICAgICAgICBwcm9ncmFtSWQ6ICdBVG9rZW5HUHZiZEdWeHIxYjJodlpic2lxVzV4V0gyNWVmVE5zTEpBOGtuTCcsXG4gICAgICB9KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnR5cGUuc2hvdWxkLmVxdWFsKCdUb2tlblRyYW5zZmVyJyk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVsxXS5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGZyb21BZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdG9BZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICBhbW91bnQ6IGFtb3VudCxcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lQU1TLFxuICAgICAgICBzb3VyY2VBZGRyZXNzOiAnRXl0SG0zZ1dTbWFUa3VGMWRhdGVwZ0R6eDdnckd1REc3d3M1UUE3dENtVTQnLFxuICAgICAgICB0b2tlbkFkZHJlc3M6ICdGNHVMZVhpb0Z6M2h3MTNNcG9zdXdhUWJNY1piQ2pxdkVHUFBlUlJCMUJ5ZicsXG4gICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICBkZWNpbWFsUGxhY2VzOiA5LFxuICAgICAgfSk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVsyXS50eXBlLnNob3VsZC5lcXVhbCgnTWVtbycpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0ucGFyYW1zLm1lbW8uc2hvdWxkLmVxdWFsKG1lbW8pO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIHJhd1R4LFxuICAgICAgICB0ZXN0RGF0YS5UT0tFTl9UUkFOU0ZFUl9VTlNJR05FRF9XSVRIX0NSRUFURV9BVEFfQU5EX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0VfV0lUSF9PUFRJT05BTF9QQVJBTVNcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSBtdWx0aSB0b2tlbiB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRoIG11bHRpIGNyZWF0ZSBBVEEsIG1lbW8gYW5kIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhY2NvdW50MSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjEgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgYWNjb3VudDIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnYyIH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGF0YUFkZHJlc3MxID0gYXdhaXQgVXRpbHMuZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MobWludFVTREMsIGFjY291bnQxLnB1Yik7XG4gICAgICBjb25zdCBhdGFBZGRyZXNzMiA9IGF3YWl0IFV0aWxzLmdldEFzc29jaWF0ZWRUb2tlbkFjY291bnRBZGRyZXNzKG1pbnRVU0RDLCBhY2NvdW50Mi5wdWIpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldFBLKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhdXRoV2FsbGV0QWRkcmVzczogd2FsbGV0UEsgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDEucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGFjY291bnQyLnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCh7XG4gICAgICAgIG93bmVyQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgYXRhQWRkcmVzczogYXRhQWRkcmVzcyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQoe1xuICAgICAgICBvd25lckFkZHJlc3M6IGFjY291bnQxLnB1YixcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgYXRhQWRkcmVzczogYXRhQWRkcmVzczEsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5jcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHtcbiAgICAgICAgb3duZXJBZGRyZXNzOiBhY2NvdW50Mi5wdWIsXG4gICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIGF0YUFkZHJlc3M6IGF0YUFkZHJlc3MyLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQxLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQyLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCg4KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdTZXRQcmlvcml0eUZlZScpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMV0udHlwZS5zaG91bGQuZXF1YWwoJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgbWludEFkZHJlc3M6IG1pbnRVU0RDLFxuICAgICAgICBhdGFBZGRyZXNzOiBhdGFBZGRyZXNzLFxuICAgICAgICBvd25lckFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHBheWVyQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIHByb2dyYW1JZDogJ0FUb2tlbkdQdmJkR1Z4cjFiMmh2WmJzaXFXNXhXSDI1ZWZUTnNMSkE4a25MJyxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0udHlwZS5zaG91bGQuZXF1YWwoJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzJdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgbWludEFkZHJlc3M6IG1pbnRVU0RDLFxuICAgICAgICBhdGFBZGRyZXNzOiBhdGFBZGRyZXNzMSxcbiAgICAgICAgb3duZXJBZGRyZXNzOiBhY2NvdW50MS5wdWIsXG4gICAgICAgIHBheWVyQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIHByb2dyYW1JZDogJ0FUb2tlbkdQdmJkR1Z4cjFiMmh2WmJzaXFXNXhXSDI1ZWZUTnNMSkE4a25MJyxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0udHlwZS5zaG91bGQuZXF1YWwoJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzNdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgbWludEFkZHJlc3M6IG1pbnRVU0RDLFxuICAgICAgICBhdGFBZGRyZXNzOiBhdGFBZGRyZXNzMixcbiAgICAgICAgb3duZXJBZGRyZXNzOiBhY2NvdW50Mi5wdWIsXG4gICAgICAgIHBheWVyQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIHByb2dyYW1JZDogJ0FUb2tlbkdQdmJkR1Z4cjFiMmh2WmJzaXFXNXhXSDI1ZWZUTnNMSkE4a25MJyxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCg4KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzRdLnR5cGUuc2hvdWxkLmVxdWFsKCdUb2tlblRyYW5zZmVyJyk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVs0XS5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGZyb21BZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdG9BZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICBhbW91bnQ6IGFtb3VudCxcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgc291cmNlQWRkcmVzczogJ0I1ckpqdVZpN0VuNjNpSzZvM2lqS2RKd0FvVGUyZ3dDWW1Kc1ZkSFEyYUtWJyxcbiAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYSm9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogOSxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbNV0udHlwZS5zaG91bGQuZXF1YWwoJ1Rva2VuVHJhbnNmZXInKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzVdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZnJvbUFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB0b0FkZHJlc3M6IGFjY291bnQxLnB1YixcbiAgICAgICAgYW1vdW50OiBhbW91bnQsXG4gICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIHNvdXJjZUFkZHJlc3M6ICdCNXJKanVWaTdFbjYzaUs2bzNpaktkSndBb1RlMmd3Q1ltSnNWZEhRMmFLVicsXG4gICAgICAgIHRva2VuQWRkcmVzczogJ0Y0dUxlWEpvRnozaHcxM01wb3N1d2FRYk1jWmJDanF2RUdQUGVSUkIxQnlmJyxcbiAgICAgICAgcHJvZ3JhbUlkOiAnVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQScsXG4gICAgICAgIGRlY2ltYWxQbGFjZXM6IDksXG4gICAgICB9KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzZdLnR5cGUuc2hvdWxkLmVxdWFsKCdUb2tlblRyYW5zZmVyJyk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVs2XS5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGZyb21BZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdG9BZGRyZXNzOiBhY2NvdW50Mi5wdWIsXG4gICAgICAgIGFtb3VudDogYW1vdW50LFxuICAgICAgICB0b2tlbk5hbWU6IG5hbWVVU0RDLFxuICAgICAgICBzb3VyY2VBZGRyZXNzOiAnQjVySmp1Vmk3RW42M2lLNm8zaWpLZEp3QW9UZTJnd0NZbUpzVmRIUTJhS1YnLFxuICAgICAgICB0b2tlbkFkZHJlc3M6ICdGNHVMZVhKb0Z6M2h3MTNNcG9zdXdhUWJNY1piQ2pxdkVHUFBlUlJCMUJ5ZicsXG4gICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICBkZWNpbWFsUGxhY2VzOiA5LFxuICAgICAgfSk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVs3XS50eXBlLnNob3VsZC5lcXVhbCgnTWVtbycpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbN10ucGFyYW1zLm1lbW8uc2hvdWxkLmVxdWFsKG1lbW8pO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX1RPS0VOX1RSQU5TRkVSX1VOU0lHTkVEX1dJVEhfTVVMVElfQ1JFQVRFX0FUQV9BTkRfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSBtdWx0aSB0b2tlbiB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRoIHVuaXF1ZSBjcmVhdGUgQVRBLCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCh7XG4gICAgICAgIG93bmVyQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgYXRhQWRkcmVzczogYXRhQWRkcmVzcyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQoe1xuICAgICAgICBvd25lckFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIGF0YUFkZHJlc3M6IGF0YUFkZHJlc3MsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5jcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHtcbiAgICAgICAgb3duZXJBZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB0b2tlbk5hbWU6IG5hbWVVU0RDLFxuICAgICAgICBhdGFBZGRyZXNzOiBhdGFBZGRyZXNzLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzJdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDYpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMF0udHlwZS5zaG91bGQuZXF1YWwoJ1NldFByaW9yaXR5RmVlJyk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVsxXS50eXBlLnNob3VsZC5lcXVhbCgnQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCcpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMV0ucGFyYW1zLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBtaW50QWRkcmVzczogbWludFVTREMsXG4gICAgICAgIGF0YUFkZHJlc3M6IGF0YUFkZHJlc3MsXG4gICAgICAgIG93bmVyQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgcGF5ZXJBZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgcHJvZ3JhbUlkOiAnQVRva2VuR1B2YmRHVnhyMWIyaHZaYnNpcVc1eFdIMjVlZlROc0xKQThrbkwnLFxuICAgICAgfSk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVsyXS50eXBlLnNob3VsZC5lcXVhbCgnVG9rZW5UcmFuc2ZlcicpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0ucGFyYW1zLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBmcm9tQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRvQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgYW1vdW50OiBhbW91bnQsXG4gICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIHNvdXJjZUFkZHJlc3M6ICdCNXJKanVWaTdFbjYzaUs2bzNpaktkSndBb1RlMmd3Q1ltSnNWZEhRMmFLVicsXG4gICAgICAgIHRva2VuQWRkcmVzczogJ0Y0dUxlWEpvRnozaHcxM01wb3N1d2FRYk1jWmJDanF2RUdQUGVSUkIxQnlmJyxcbiAgICAgICAgcHJvZ3JhbUlkOiAnVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQScsXG4gICAgICAgIGRlY2ltYWxQbGFjZXM6IDksXG4gICAgICB9KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzNdLnR5cGUuc2hvdWxkLmVxdWFsKCdUb2tlblRyYW5zZmVyJyk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVszXS5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGZyb21BZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdG9BZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICBhbW91bnQ6IGFtb3VudCxcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgc291cmNlQWRkcmVzczogJ0I1ckpqdVZpN0VuNjNpSzZvM2lqS2RKd0FvVGUyZ3dDWW1Kc1ZkSFEyYUtWJyxcbiAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYSm9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogOSxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbNF0udHlwZS5zaG91bGQuZXF1YWwoJ1Rva2VuVHJhbnNmZXInKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzRdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZnJvbUFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB0b0FkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIGFtb3VudDogYW1vdW50LFxuICAgICAgICB0b2tlbk5hbWU6IG5hbWVVU0RDLFxuICAgICAgICBzb3VyY2VBZGRyZXNzOiAnQjVySmp1Vmk3RW42M2lLNm8zaWpLZEp3QW9UZTJnd0NZbUpzVmRIUTJhS1YnLFxuICAgICAgICB0b2tlbkFkZHJlc3M6ICdGNHVMZVhKb0Z6M2h3MTNNcG9zdXdhUWJNY1piQ2pxdkVHUFBlUlJCMUJ5ZicsXG4gICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICBkZWNpbWFsUGxhY2VzOiA5LFxuICAgICAgfSk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVs1XS50eXBlLnNob3VsZC5lcXVhbCgnTWVtbycpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbNV0ucGFyYW1zLm1lbW8uc2hvdWxkLmVxdWFsKG1lbW8pO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX1RPS0VOX1RSQU5TRkVSX1VOU0lHTkVEX1dJVEhfVU5JUVVFX0NSRUFURV9BVEFfQU5EX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0UpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgaXQoJ2ZvciBpbnZhbGlkIHNlbmRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHRva2VuVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLnNlbmRlcihpbnZhbGlkUHViS2V5KSkudGhyb3dFcnJvcignSW52YWxpZCBvciBtaXNzaW5nIHNlbmRlciwgZ290OiAnICsgaW52YWxpZFB1YktleSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGludmFsaWQgdG9BZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdG9rZW5UcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGludmFsaWRQdWJLZXksIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgb3IgbWlzc2luZyBhZGRyZXNzLCBnb3Q6ICcgKyBpbnZhbGlkUHViS2V5XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvciBpbnZhbGlkIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRBbW91bnQgPSAncmFuZG9tc3RyaW5nJztcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHRva2VuVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgYW1vdW50OiBpbnZhbGlkQW1vdW50LFxuICAgICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBhbW91bnQsIGdvdDogJyArIGludmFsaWRBbW91bnQpO1xuXG4gICAgICBjb25zdCBleGNlc3NpdmVBbW91bnQgPSAnMTg0NDY3NDQwNzM3MDk1NTE2MTYnO1xuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5zZW5kKHtcbiAgICAgICAgICBhZGRyZXNzOiBub25jZUFjY291bnQucHViLFxuICAgICAgICAgIGFtb3VudDogZXhjZXNzaXZlQW1vdW50LFxuICAgICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoYGlucHV0IGFtb3VudCAke2V4Y2Vzc2l2ZUFtb3VudH0gZXhjZWVkcyBiaWcgaW50IGxpbWl0IDE4NDQ2NzQ0MDczNzA5NTUxNjE1YCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGludmFsaWQgcmVudCBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkQW1vdW50ID0gJ3JhbmRvbXN0cmluZyc7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0b2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hc3NvY2lhdGVkVG9rZW5BY2NvdW50UmVudChpbnZhbGlkQW1vdW50KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCwgZ290OiAnICsgaW52YWxpZEFtb3VudFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbmVnYXRpdmVBbW91bnQgPSAnLTExMSc7XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFzc29jaWF0ZWRUb2tlbkFjY291bnRSZW50KG5lZ2F0aXZlQW1vdW50KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCwgZ290OiAnICsgbmVnYXRpdmVBbW91bnRcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGludmFsaWQgb3duZXJBZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdG9rZW5UcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCh7XG4gICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnZhbGlkUHViS2V5LFxuICAgICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgICAgYXRhQWRkcmVzczogYXRhQWRkcmVzcyxcbiAgICAgICAgfSlcbiAgICAgICkudGhyb3dFcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG93bmVyQWRkcmVzcywgZ290OiAnICsgaW52YWxpZFB1YktleSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGludmFsaWQgdG9rZW5OYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZFRva2VuTmFtZSA9ICd0c29sOnJhbmRvbSc7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0b2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5jcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHtcbiAgICAgICAgICBvd25lckFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgdG9rZW5OYW1lOiBpbnZhbGlkVG9rZW5OYW1lLFxuICAgICAgICAgIGF0YUFkZHJlc3M6IGF0YUFkZHJlc3MsXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoJ0ludmFsaWQgdG9rZW4gbmFtZSwgZ290OiAnICsgaW52YWxpZFRva2VuTmFtZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDcmVhdGUgQVRBIHJlbnQgcGF5ZXIgc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IGZlZVBheWVyQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmZlZVBheWVyQWNjb3VudCkuZ2V0S2V5cygpO1xuXG4gICAgYmVmb3JlKGFzeW5jICgpID0+IHtcbiAgICAgIGF0YUFkZHJlc3MgPSBhd2FpdCBVdGlscy5nZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyhtaW50VVNEQywgb3RoZXJBY2NvdW50LnB1Yik7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBmZWVQYXllciBhcyBDcmVhdGUtQVRBIHJlbnQgcGF5ZXIgd2hlbiBmZWVQYXllciBpcyBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0UEspO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCh7XG4gICAgICAgIG93bmVyQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgYXRhQWRkcmVzcyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBjcmVhdGVBdGEgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhLmZpbmQoKGkpID0+IGkudHlwZSA9PT0gJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHNob3VsZC5leGlzdChjcmVhdGVBdGEpO1xuICAgICAgY3JlYXRlQXRhLnBhcmFtcy5wYXllckFkZHJlc3Muc2hvdWxkLmVxdWFsKGZlZVBheWVyQWNjb3VudC5wdWIpO1xuICAgICAgY3JlYXRlQXRhLnBhcmFtcy5wYXllckFkZHJlc3Muc2hvdWxkLm5vdC5lcXVhbCh3YWxsZXRQSyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmFsbHMgYmFjayB0byBzZW5kZXIgYXMgQ3JlYXRlLUFUQSByZW50IHBheWVyIHdoZW4gZmVlUGF5ZXIgaXMgdW5zZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0UEspO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCh7XG4gICAgICAgIG93bmVyQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgYXRhQWRkcmVzcyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBjcmVhdGVBdGEgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhLmZpbmQoKGkpID0+IGkudHlwZSA9PT0gJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHNob3VsZC5leGlzdChjcmVhdGVBdGEpO1xuICAgICAgY3JlYXRlQXRhLnBhcmFtcy5wYXllckFkZHJlc3Muc2hvdWxkLmVxdWFsKHdhbGxldFBLKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zZmVyIEhvb2sgYWNjb3VudHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdDIyTmFtZSA9IHRlc3REYXRhLnNvbDIwMjJUb2tlblRyYW5zZmVycy5uYW1lO1xuICAgIGNvbnN0IHQyMk1pbnQgPSB0ZXN0RGF0YS5zb2wyMDIyVG9rZW5UcmFuc2ZlcnMubWludDtcbiAgICBjb25zdCB0MjJEZWNpbWFscyA9IDY7XG4gICAgY29uc3QgdHJhbnNmZXJIb29rQWNjb3VudHM6IEV4dHJhQWNjb3VudE1ldGFbXSA9IFtcbiAgICAgIHsgcHVia2V5OiAnOTh3RkY1TXBNak1RYmZERjJNUHpvOExDR1gzN3VuWlIxb2hSQTFtVTlHbUonLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiAnNDhuN1lHRXd3N2ZLTWZKNWdKM3NRQzNyTTZSV0dqcFVzZ2hxVmZYVmtSNUEnLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICB7IHB1YmtleTogJzlzUWhBSDd2VjNSS1RDSzEzVlk0RWlOanMzcUJxMXNyU1l4ZE51ZmRBQVhtJywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIF07XG5cbiAgICBjb25zdCBidWlsZFRva2VuMjAyMlRyYW5zZmVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldFBLKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgYW1vdW50LFxuICAgICAgICB0b2tlbk5hbWU6IHQyMk5hbWUsXG4gICAgICAgIHRva2VuQWRkcmVzczogdDIyTWludCxcbiAgICAgICAgcHJvZ3JhbUlkOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogdDIyRGVjaW1hbHMsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gICAgfTtcblxuICAgIGl0KCd0aHJlYWRzIHJlc29sdmVkIHRyYW5zZmVyIGhvb2sgYWNjb3VudHMgaW50byB0aGUgYnVpbHQgVG9rZW5UcmFuc2ZlciBwYXJhbXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBidWlsZFRva2VuMjAyMlRyYW5zZmVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHJhbnNmZXJIb29rQWNjb3VudHModHJhbnNmZXJIb29rQWNjb3VudHMpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgdG9rZW5UcmFuc2ZlciA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGEuZmluZCgoaSkgPT4gaS50eXBlID09PSAnVG9rZW5UcmFuc2ZlcicpO1xuICAgICAgc2hvdWxkLmV4aXN0KHRva2VuVHJhbnNmZXIpO1xuICAgICAgdG9rZW5UcmFuc2Zlci5wYXJhbXMudHJhbnNmZXJIb29rQWNjb3VudHMuc2hvdWxkLmRlZXBFcXVhbCh0cmFuc2Zlckhvb2tBY2NvdW50cyk7XG4gICAgfSk7XG5cbiAgICBpdCgnb21pdHMgdHJhbnNmZXIgaG9vayBhY2NvdW50cyBhbmQgbWF0Y2hlcyB0aGUgcGxhaW4gdHJhbnNmZXIgd2hlbiBub25lIGFyZSBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB3aXRoSG9va3MgPSBhd2FpdCBidWlsZFRva2VuMjAyMlRyYW5zZmVyKCkudHJhbnNmZXJIb29rQWNjb3VudHModHJhbnNmZXJIb29rQWNjb3VudHMpLmJ1aWxkKCk7XG4gICAgICBjb25zdCB3aXRob3V0SG9va3MgPSBhd2FpdCBidWlsZFRva2VuMjAyMlRyYW5zZmVyKCkuYnVpbGQoKTtcblxuICAgICAgY29uc3QgcGxhaW5UcmFuc2ZlciA9IHdpdGhvdXRIb29rcy50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhLmZpbmQoKGkpID0+IGkudHlwZSA9PT0gJ1Rva2VuVHJhbnNmZXInKTtcbiAgICAgIHNob3VsZC5leGlzdChwbGFpblRyYW5zZmVyKTtcbiAgICAgIHNob3VsZC5lcXVhbChwbGFpblRyYW5zZmVyLnBhcmFtcy50cmFuc2Zlckhvb2tBY2NvdW50cywgdW5kZWZpbmVkKTtcblxuICAgICAgLy8gQXBwZW5kaW5nIHRoZSByZXNvbHZlZCBob29rIGFjY291bnRzIGNoYW5nZXMgdGhlIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAgICB3aXRoSG9va3MudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQubm90LmVxdWFsKHdpdGhvdXRIb29rcy50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24od2l0aG91dEhvb2tzLnRvQnJvYWRjYXN0Rm9ybWF0KCkpLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Blcm1pc3Npb25sZXNzIHRoYXcgYnVuZGxpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgdDIyTmFtZSA9IHRlc3REYXRhLnNvbDIwMjJUb2tlblRyYW5zZmVycy5uYW1lO1xuICAgIGNvbnN0IHQyMk1pbnQgPSB0ZXN0RGF0YS5zb2wyMDIyVG9rZW5UcmFuc2ZlcnMubWludDtcbiAgICBjb25zdCB0MjJEZWNpbWFscyA9IDY7XG4gICAgLy8gUmVzb2x2ZWQgdGhhdyBwYXJhbXMgKGFzIHByb2R1Y2VkIGJ5IFNvbC5yZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3KS4gQXJiaXRyYXJ5IGJ1dCB2YWxpZFxuICAgIC8vIGJhc2U1OCBwdWJrZXlzIHVzZWQgcHVyZWx5IGFzIGZpeHR1cmVzIOKAlCB0aGUgb2ZmbGluZSBidWlsZGVyIG5ldmVyIGZldGNoZXMgdGhlbS5cbiAgICBjb25zdCB0aGF3UGFyYW1zID0ge1xuICAgICAgYXV0aG9yaXR5OiB3YWxsZXRQSyxcbiAgICAgIG1pbnQ6IHQyMk1pbnQsXG4gICAgICB0b2tlbkFjY291bnQ6ICc5OHdGRjVNcE1qTVFiZkRGMk1Qem84TENHWDM3dW5aUjFvaFJBMW1VOUdtSicsXG4gICAgICB0b2tlbkFjY291bnRPd25lcjogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgIGdhdGluZ1Byb2dyYW06ICdHYlE4WmlFRnpHR1RlWW9Yd3RadGNveHdQY015VWNtWkRkdU1WTmRVUEtwWCcsXG4gICAgICBmbGFnQWNjb3VudDogJzQ4bjdZR0V3dzdmS01mSjVnSjNzUUMzck02UldHanBVc2docVZmWFZrUjVBJyxcbiAgICAgIG1pbnRDb25maWc6ICc5c1FoQUg3dlYzUktUQ0sxM1ZZNEVpTmpzM3FCcTFzclNZeGROdWZkQUFYbScsXG4gICAgICBleHRyYUFjY291bnRzOiBbeyBwdWJrZXk6IG5vbmNlQWNjb3VudC5wdWIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfV0sXG4gICAgfTtcblxuICAgIGNvbnN0IGJ1aWxkVG9rZW4yMDIyVHJhbnNmZXJXaXRoQXRhID0gKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldFBLKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgYW1vdW50LFxuICAgICAgICB0b2tlbk5hbWU6IHQyMk5hbWUsXG4gICAgICAgIHRva2VuQWRkcmVzczogdDIyTWludCxcbiAgICAgICAgcHJvZ3JhbUlkOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogdDIyRGVjaW1hbHMsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5jcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHtcbiAgICAgICAgb3duZXJBZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB0b2tlbk5hbWU6IHQyMk5hbWUsXG4gICAgICAgIHRva2VuQWRkcmVzczogdDIyTWludCxcbiAgICAgICAgcHJvZ3JhbUlkOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgICB9O1xuXG4gICAgaXQoJ2J1bmRsZXMgaW5zdHJ1Y3Rpb25zIGluIHRoZSBvcmRlciBbY3JlYXRlLCB0aGF3LCB0cmFuc2Zlcl0nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBidWlsZFRva2VuMjAyMlRyYW5zZmVyV2l0aEF0YSgpO1xuICAgICAgdHhCdWlsZGVyLnBlcm1pc3Npb25sZXNzVGhhdyh0aGF3UGFyYW1zKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR5cGVzID0gdHgudG9Kc29uKCkuaW5zdHJ1Y3Rpb25zRGF0YS5tYXAoKGkpID0+IGkudHlwZSk7XG4gICAgICB0eXBlcy5zaG91bGQuZGVlcEVxdWFsKFsnQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCcsICdQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50JywgJ1Rva2VuVHJhbnNmZXInXSk7XG5cbiAgICAgIGNvbnN0IHRoYXcgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhLmZpbmQoKGkpID0+IGkudHlwZSA9PT0gJ1Blcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQnKTtcbiAgICAgIHNob3VsZC5leGlzdCh0aGF3KTtcbiAgICAgIHRoYXcucGFyYW1zLmdhdGluZ1Byb2dyYW0uc2hvdWxkLmVxdWFsKHRoYXdQYXJhbXMuZ2F0aW5nUHJvZ3JhbSk7XG4gICAgICB0aGF3LnBhcmFtcy5taW50Q29uZmlnLnNob3VsZC5lcXVhbCh0aGF3UGFyYW1zLm1pbnRDb25maWcpO1xuICAgICAgdGhhdy5wYXJhbXMuZmxhZ0FjY291bnQuc2hvdWxkLmVxdWFsKHRoYXdQYXJhbXMuZmxhZ0FjY291bnQpO1xuICAgICAgdGhhdy5wYXJhbXMuZXh0cmFBY2NvdW50cy5zaG91bGQuZGVlcEVxdWFsKHRoYXdQYXJhbXMuZXh0cmFBY2NvdW50cyk7XG4gICAgfSk7XG5cbiAgICBpdCgnb21pdHMgdGhlIHRoYXcgaW5zdHJ1Y3Rpb24gd2hlbiBwZXJtaXNzaW9ubGVzc1RoYXcgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRUb2tlbjIwMjJUcmFuc2ZlcldpdGhBdGEoKS5idWlsZCgpO1xuICAgICAgY29uc3QgdHlwZXMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhLm1hcCgoaSkgPT4gaS50eXBlKTtcbiAgICAgIHR5cGVzLnNob3VsZC5kZWVwRXF1YWwoWydDcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50JywgJ1Rva2VuVHJhbnNmZXInXSk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGEuZmluZCgoaSkgPT4gaS50eXBlID09PSAnUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCcpLFxuICAgICAgICB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=