@bitgo-beta/sdk-coin-sol 7.6.4-beta.6 → 7.6.4-beta.600

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 (415) hide show
  1. package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
  2. package/dist/cjs/src/bigint-buffer-guard.js +29 -0
  3. package/dist/cjs/src/config/token2022StaticConfig.d.ts.map +1 -0
  4. package/dist/cjs/src/config/token2022StaticConfig.js +50 -0
  5. package/dist/cjs/src/index.d.ts.map +1 -0
  6. package/dist/{src → cjs/src}/index.js +1 -1
  7. package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
  8. package/dist/cjs/src/lib/ataInitializationBuilder.js +201 -0
  9. package/dist/cjs/src/lib/closeAtaBuilder.d.ts +51 -0
  10. package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
  11. package/dist/cjs/src/lib/closeAtaBuilder.js +147 -0
  12. package/dist/{src → cjs/src}/lib/constants.d.ts +24 -0
  13. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  14. package/dist/cjs/src/lib/constants.js +196 -0
  15. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/customInstructionBuilder.js +289 -0
  17. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  18. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/explainTransactionWasm.js +264 -0
  20. package/dist/{src → cjs/src}/lib/iface.d.ts +22 -2
  21. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/iface.js +7 -0
  23. package/dist/{src → cjs/src}/lib/index.d.ts +2 -0
  24. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  25. package/dist/{src → cjs/src}/lib/index.js +10 -2
  26. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +1 -0
  27. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  28. package/dist/cjs/src/lib/instructionParamsFactory.js +1081 -0
  29. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  30. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  31. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  32. package/dist/cjs/src/lib/keyPair.js +63 -0
  33. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  34. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  35. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  36. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  37. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  38. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  40. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  41. package/dist/cjs/src/lib/solInstructionFactory.js +609 -0
  42. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/stakingActivateBuilder.js +120 -0
  44. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  45. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  46. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  47. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +208 -0
  48. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/stakingDelegateBuilder.js +120 -0
  50. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  51. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  52. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  53. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +78 -0
  54. package/dist/cjs/src/lib/token2022Config.d.ts.map +1 -0
  55. package/dist/cjs/src/lib/token2022Config.js +27 -0
  56. package/dist/cjs/src/lib/tokenExtensions.d.ts +31 -0
  57. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  58. package/dist/cjs/src/lib/tokenExtensions.js +112 -0
  59. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  60. package/dist/cjs/src/lib/tokenTransferBuilder.js +196 -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.map +1 -0
  71. package/dist/cjs/src/lib/transferBuilderV2.js +213 -0
  72. package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
  73. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  74. package/dist/cjs/src/lib/utils.js +632 -0
  75. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  76. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  77. package/dist/cjs/src/register.d.ts +5 -0
  78. package/dist/cjs/src/register.d.ts.map +1 -0
  79. package/dist/cjs/src/register.js +29 -0
  80. package/dist/{src → cjs/src}/sol.d.ts +68 -2
  81. package/dist/cjs/src/sol.d.ts.map +1 -0
  82. package/dist/cjs/src/sol.js +1533 -0
  83. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  84. package/dist/cjs/src/solToken.d.ts.map +1 -0
  85. package/dist/cjs/src/solToken.js +79 -0
  86. package/dist/cjs/src/tsol.d.ts.map +1 -0
  87. package/dist/cjs/src/tsol.js +24 -0
  88. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  89. package/dist/cjs/test/fixtures/sol.js +1433 -0
  90. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  91. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  92. package/dist/cjs/test/resources/sol.js +320 -0
  93. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  94. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  95. package/dist/cjs/test/unit/explainTransactionWasm.js +26 -0
  96. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  97. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  98. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  99. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  100. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  101. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  102. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  103. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  104. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  105. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  106. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  107. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  108. package/dist/cjs/test/unit/keyPair.js +177 -0
  109. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  110. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  111. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  112. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  113. package/dist/cjs/test/unit/register.d.ts +2 -0
  114. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  115. package/dist/cjs/test/unit/register.js +65 -0
  116. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  117. package/dist/cjs/test/unit/sol.js +4477 -0
  118. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  119. package/dist/cjs/test/unit/solInstructionFactory.js +501 -0
  120. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  121. package/dist/cjs/test/unit/solToken.js +37 -0
  122. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  123. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  124. package/dist/cjs/test/unit/tokenExtensions.js +32 -0
  125. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  126. package/dist/cjs/test/unit/transaction.js +1108 -0
  127. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  128. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  129. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  130. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
  131. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  132. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  133. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +333 -0
  134. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  135. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  136. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  137. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  138. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  139. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  140. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  141. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  142. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  143. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  144. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  145. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  146. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  147. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +827 -0
  148. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  149. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  150. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  151. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +286 -0
  152. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  153. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  154. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  155. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  156. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  157. package/dist/cjs/test/unit/utils.js +557 -0
  158. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  159. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  160. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  161. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  162. package/dist/esm/config/token2022StaticConfig.d.ts +3 -0
  163. package/dist/esm/config/token2022StaticConfig.js +47 -0
  164. package/dist/esm/index.d.ts +7 -0
  165. package/dist/esm/index.js +7 -0
  166. package/dist/esm/lib/ataInitializationBuilder.d.ts +47 -0
  167. package/dist/{src → esm}/lib/ataInitializationBuilder.d.ts.map +1 -1
  168. package/dist/esm/lib/ataInitializationBuilder.js +161 -0
  169. package/dist/esm/lib/closeAtaBuilder.d.ts +51 -0
  170. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  171. package/dist/esm/lib/closeAtaBuilder.js +140 -0
  172. package/dist/esm/lib/constants.d.ts +164 -0
  173. package/dist/esm/lib/constants.d.ts.map +1 -0
  174. package/dist/esm/lib/constants.js +193 -0
  175. package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
  176. package/dist/esm/lib/customInstructionBuilder.js +282 -0
  177. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  178. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  179. package/dist/esm/lib/explainTransactionWasm.js +261 -0
  180. package/dist/esm/lib/iface.d.ts +264 -0
  181. package/dist/esm/lib/iface.d.ts.map +1 -0
  182. package/dist/esm/lib/iface.js +3 -0
  183. package/dist/esm/lib/index.d.ts +24 -0
  184. package/dist/{src → esm}/lib/index.d.ts.map +1 -1
  185. package/dist/esm/lib/index.js +24 -0
  186. package/dist/esm/lib/instructionParamsFactory.d.ts +13 -0
  187. package/dist/{src → esm}/lib/instructionParamsFactory.d.ts.map +1 -1
  188. package/dist/esm/lib/instructionParamsFactory.js +1074 -0
  189. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  190. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  191. package/dist/esm/lib/keyPair.d.ts +26 -0
  192. package/dist/esm/lib/keyPair.js +59 -0
  193. package/dist/esm/lib/messages/index.d.ts +2 -0
  194. package/dist/esm/lib/messages/index.js +2 -0
  195. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  196. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  197. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  198. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  199. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  200. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  201. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  202. package/dist/esm/lib/solInstructionFactory.js +603 -0
  203. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  204. package/dist/esm/lib/stakingActivateBuilder.js +113 -0
  205. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  206. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  207. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  208. package/dist/{src → esm}/lib/stakingDeactivateBuilder.js +31 -38
  209. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  210. package/dist/esm/lib/stakingDelegateBuilder.js +113 -0
  211. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  212. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  213. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  214. package/dist/esm/lib/stakingWithdrawBuilder.js +71 -0
  215. package/dist/esm/lib/token2022Config.d.ts +44 -0
  216. package/dist/esm/lib/token2022Config.js +23 -0
  217. package/dist/esm/lib/tokenExtensions.d.ts +31 -0
  218. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  219. package/dist/esm/lib/tokenExtensions.js +105 -0
  220. package/dist/esm/lib/tokenTransferBuilder.d.ts +41 -0
  221. package/dist/{src → esm}/lib/tokenTransferBuilder.d.ts.map +1 -1
  222. package/dist/esm/lib/tokenTransferBuilder.js +189 -0
  223. package/dist/esm/lib/transaction.d.ts +103 -0
  224. package/dist/esm/lib/transaction.d.ts.map +1 -0
  225. package/dist/esm/lib/transaction.js +605 -0
  226. package/dist/esm/lib/transactionBuilder.d.ts +128 -0
  227. package/dist/esm/lib/transactionBuilder.js +373 -0
  228. package/dist/esm/lib/transactionBuilderFactory.d.ts +120 -0
  229. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  230. package/dist/esm/lib/transactionBuilderFactory.js +205 -0
  231. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  232. package/dist/esm/lib/transferBuilder.js +63 -0
  233. package/dist/esm/lib/transferBuilderV2.d.ts +43 -0
  234. package/dist/{src → esm}/lib/transferBuilderV2.d.ts.map +1 -1
  235. package/dist/esm/lib/transferBuilderV2.js +206 -0
  236. package/dist/esm/lib/utils.d.ts +205 -0
  237. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  238. package/dist/esm/lib/utils.js +594 -0
  239. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  240. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  241. package/dist/esm/register.d.ts +5 -0
  242. package/dist/esm/register.d.ts.map +1 -0
  243. package/dist/esm/register.js +24 -0
  244. package/dist/esm/sol.d.ts +293 -0
  245. package/dist/esm/sol.d.ts.map +1 -0
  246. package/dist/esm/sol.js +1492 -0
  247. package/dist/esm/solToken.d.ts +44 -0
  248. package/dist/esm/solToken.d.ts.map +1 -0
  249. package/dist/esm/solToken.js +75 -0
  250. package/dist/esm/tsol.d.ts +11 -0
  251. package/dist/esm/tsol.js +20 -0
  252. package/package.json +35 -16
  253. package/dist/src/config/token2022StaticConfig.js +0 -50
  254. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  255. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  256. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  257. package/dist/src/lib/closeAtaBuilder.js +0 -69
  258. package/dist/src/lib/constants.d.ts.map +0 -1
  259. package/dist/src/lib/constants.js +0 -171
  260. package/dist/src/lib/customInstructionBuilder.js +0 -289
  261. package/dist/src/lib/iface.d.ts.map +0 -1
  262. package/dist/src/lib/iface.js +0 -7
  263. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  264. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  265. package/dist/src/lib/keyPair.js +0 -63
  266. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  267. package/dist/src/lib/solInstructionFactory.js +0 -572
  268. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  269. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  270. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  271. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  272. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  273. package/dist/src/lib/token2022Config.js +0 -27
  274. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  275. package/dist/src/lib/transaction.d.ts.map +0 -1
  276. package/dist/src/lib/transaction.js +0 -595
  277. package/dist/src/lib/transactionBuilder.js +0 -380
  278. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  279. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  280. package/dist/src/lib/transferBuilder.js +0 -70
  281. package/dist/src/lib/transferBuilderV2.js +0 -210
  282. package/dist/src/lib/utils.js +0 -586
  283. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  284. package/dist/src/register.d.ts +0 -3
  285. package/dist/src/register.d.ts.map +0 -1
  286. package/dist/src/register.js +0 -15
  287. package/dist/src/sol.d.ts.map +0 -1
  288. package/dist/src/sol.js +0 -1285
  289. package/dist/src/solToken.d.ts.map +0 -1
  290. package/dist/src/solToken.js +0 -69
  291. package/dist/src/tsol.js +0 -24
  292. package/dist/test/fixtures/sol.js +0 -1433
  293. package/dist/test/resources/sol.d.ts.map +0 -1
  294. package/dist/test/resources/sol.js +0 -320
  295. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  296. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  297. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  298. package/dist/test/unit/getBuilderFactory.js +0 -10
  299. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  300. package/dist/test/unit/instructionParamsFactory.js +0 -412
  301. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  302. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  303. package/dist/test/unit/keyPair.js +0 -177
  304. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  305. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  306. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  307. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  308. package/dist/test/unit/sol.js +0 -3108
  309. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  310. package/dist/test/unit/solInstructionFactory.js +0 -454
  311. package/dist/test/unit/solToken.d.ts.map +0 -1
  312. package/dist/test/unit/solToken.js +0 -31
  313. package/dist/test/unit/transaction.d.ts.map +0 -1
  314. package/dist/test/unit/transaction.js +0 -983
  315. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  316. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  317. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  318. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  319. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  320. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  321. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  322. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  323. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  324. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  325. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  326. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  327. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  328. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  329. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  330. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  331. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  332. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  333. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  334. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  335. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  336. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  337. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  338. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  339. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  340. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  341. package/dist/test/unit/utils.js +0 -517
  342. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  343. package/dist/test/unit/versionedTransaction.js +0 -207
  344. package/dist/tsconfig.tsbuildinfo +0 -1
  345. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  346. /package/dist/{src → cjs/src}/config/token2022StaticConfig.d.ts +0 -0
  347. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  348. /package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +0 -0
  349. /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
  350. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  351. /package/dist/{src → cjs/src}/lib/keyPair.d.ts +0 -0
  352. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  353. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  354. /package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +0 -0
  355. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  356. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  357. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  358. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  359. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  360. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  361. /package/dist/{src → cjs/src}/lib/token2022Config.d.ts +0 -0
  362. /package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +0 -0
  363. /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
  364. /package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -0
  365. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  366. /package/dist/{src → cjs/src}/lib/transferBuilderV2.d.ts +0 -0
  367. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  368. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  369. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  370. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  371. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  372. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  373. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  374. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  375. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  376. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  377. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  378. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  379. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  380. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  381. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  382. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  383. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  384. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  385. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  386. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  387. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  388. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  389. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  390. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  391. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  392. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  393. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  394. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  395. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  396. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  397. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  398. /package/dist/{src → esm}/config/token2022StaticConfig.d.ts.map +0 -0
  399. /package/dist/{src → esm}/index.d.ts.map +0 -0
  400. /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
  401. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  402. /package/dist/{src → esm}/lib/keyPair.d.ts.map +0 -0
  403. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  404. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  405. /package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +0 -0
  406. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  407. /package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +0 -0
  408. /package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +0 -0
  409. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  410. /package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +0 -0
  411. /package/dist/{src → esm}/lib/token2022Config.d.ts.map +0 -0
  412. /package/dist/{src → esm}/lib/transactionBuilder.d.ts.map +0 -0
  413. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  414. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  415. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,632 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isIdempotentAtaInstruction = isIdempotentAtaInstruction;
7
+ exports.isValidAddress = isValidAddress;
8
+ exports.isValidBlockId = isValidBlockId;
9
+ exports.isValidPrivateKey = isValidPrivateKey;
10
+ exports.isValidPublicKey = isValidPublicKey;
11
+ exports.isValidSignature = isValidSignature;
12
+ exports.isValidTransactionId = isValidTransactionId;
13
+ exports.isValidAmount = isValidAmount;
14
+ exports.isValidStakingAmount = isValidStakingAmount;
15
+ exports.isValidMemo = isValidMemo;
16
+ exports.isValidBase64 = isValidBase64;
17
+ exports.isValidHex = isValidHex;
18
+ exports.isValidRawTransaction = isValidRawTransaction;
19
+ exports.verifySignature = verifySignature;
20
+ exports.base58ToUint8Array = base58ToUint8Array;
21
+ exports.Uint8ArrayTobase58 = Uint8ArrayTobase58;
22
+ exports.countNotNullSignatures = countNotNullSignatures;
23
+ exports.requiresAllSignatures = requiresAllSignatures;
24
+ exports.matchTransactionTypeByInstructionsOrder = matchTransactionTypeByInstructionsOrder;
25
+ exports.getTransactionType = getTransactionType;
26
+ exports.getInstructionType = getInstructionType;
27
+ exports.validateIntructionTypes = validateIntructionTypes;
28
+ exports.validateRawMsgInstruction = validateRawMsgInstruction;
29
+ exports.validateRawTransaction = validateRawTransaction;
30
+ exports.validateAddress = validateAddress;
31
+ exports.getSolTokenFromAddress = getSolTokenFromAddress;
32
+ exports.getSolTokenFromAddressOnly = getSolTokenFromAddressOnly;
33
+ exports.getSolTokenFromTokenName = getSolTokenFromTokenName;
34
+ exports.getAssociatedTokenAccountAddress = getAssociatedTokenAccountAddress;
35
+ exports.validateMintAddress = validateMintAddress;
36
+ exports.validateOwnerAddress = validateOwnerAddress;
37
+ exports.isSolLegacyInstruction = isSolLegacyInstruction;
38
+ exports.computeTransferFee = computeTransferFee;
39
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
40
+ const statics_1 = require("@bitgo-beta/statics");
41
+ const spl_token_1 = require("@solana/spl-token");
42
+ const web3_js_1 = require("@solana/web3.js");
43
+ const assert_1 = __importDefault(require("assert"));
44
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
45
+ const bs58_1 = __importDefault(require("bs58"));
46
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
47
+ const constants_1 = require("./constants");
48
+ const spl_stake_pool_1 = require("@solana/spl-stake-pool");
49
+ const DECODED_BLOCK_HASH_LENGTH = 32; // https://docs.solana.com/developing/programming-model/transactions#blockhash-format
50
+ const DECODED_SIGNATURE_LENGTH = 64; // https://docs.solana.com/terminology#signature
51
+ const BASE_58_ENCONDING_REGEX = '[1-9A-HJ-NP-Za-km-z]';
52
+ const COMPUTE_BUDGET = 'ComputeBudget111111111111111111111111111111';
53
+ /**
54
+ * Checks if an ATA instruction is idempotent (discriminator byte = 1).
55
+ *
56
+ * Idempotent ATA instructions use Buffer.from([1]) as instruction data, created by
57
+ * @solana/spl-token's createAssociatedTokenAccountIdempotentInstruction() (v0.4.1+).
58
+ * An idempotent ATA instruction succeed even if account exists,
59
+ * preventing race condition errors in concurrent scenarios.
60
+ *
61
+ * @param {TransactionInstruction} instruction - The instruction to validate
62
+ * @returns {boolean} True if instruction data is a single byte with value 1
63
+ */
64
+ function isIdempotentAtaInstruction(instruction) {
65
+ return instruction.data.length === 1 && instruction.data[0] === 1;
66
+ }
67
+ /** @inheritdoc */
68
+ function isValidAddress(address) {
69
+ return isValidPublicKey(address);
70
+ }
71
+ /** @inheritdoc */
72
+ function isValidBlockId(hash) {
73
+ try {
74
+ return (!!hash && new RegExp(BASE_58_ENCONDING_REGEX).test(hash) && bs58_1.default.decode(hash).length === DECODED_BLOCK_HASH_LENGTH);
75
+ }
76
+ catch (e) {
77
+ return false;
78
+ }
79
+ }
80
+ /** @inheritdoc */
81
+ function isValidPrivateKey(prvKey) {
82
+ try {
83
+ const key = typeof prvKey === 'string' ? base58ToUint8Array(prvKey) : prvKey;
84
+ return !!web3_js_1.Keypair.fromSecretKey(key);
85
+ }
86
+ catch (e) {
87
+ return false;
88
+ }
89
+ }
90
+ /** @inheritdoc */
91
+ function isValidPublicKey(pubKey) {
92
+ try {
93
+ if ((0, sdk_core_1.isValidXpub)(pubKey))
94
+ return true;
95
+ new web3_js_1.PublicKey(pubKey);
96
+ return true;
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ /** @inheritdoc */
103
+ function isValidSignature(signature) {
104
+ try {
105
+ return !!signature && bs58_1.default.decode(signature).length === DECODED_SIGNATURE_LENGTH;
106
+ }
107
+ catch (e) {
108
+ return false;
109
+ }
110
+ }
111
+ /** @inheritdoc */
112
+ // TransactionId are the first signature on a Transaction
113
+ function isValidTransactionId(txId) {
114
+ return isValidSignature(txId);
115
+ }
116
+ /**
117
+ * Returns whether or not the string is a valid amount of lamports number
118
+ *
119
+ * @param {string} amount - the string to validate
120
+ * @returns {boolean} - the validation result
121
+ */
122
+ function isValidAmount(amount) {
123
+ const bigNumberAmount = new bignumber_js_1.default(amount);
124
+ return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThanOrEqualTo(0);
125
+ }
126
+ /**
127
+ * Check if the string is a valid amount of lamports number on staking
128
+ *
129
+ * @param {string} amount - the string to validate
130
+ * @returns {boolean} - the validation result
131
+ */
132
+ function isValidStakingAmount(amount) {
133
+ const bigNumberAmount = new bignumber_js_1.default(amount);
134
+ return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThan(0);
135
+ }
136
+ /**
137
+ * Check if this is a valid memo or not.
138
+ *
139
+ * @param memo - the memo string
140
+ * @returns {boolean} - the validation result
141
+ */
142
+ function isValidMemo(memo) {
143
+ return Buffer.from(memo).length <= constants_1.MAX_MEMO_LENGTH;
144
+ }
145
+ /**
146
+ * Checks if a string is valid base64 encoded data
147
+ * @param str - The string to validate
148
+ * @returns True if the string is valid base64, false otherwise
149
+ */
150
+ function isValidBase64(str) {
151
+ try {
152
+ const decoded = Buffer.from(str, 'base64').toString('base64');
153
+ return decoded === str;
154
+ }
155
+ catch {
156
+ return false;
157
+ }
158
+ }
159
+ /**
160
+ * Checks if a string is valid hexadecimal data
161
+ * @param str - The string to validate
162
+ * @returns True if the string is valid hex, false otherwise
163
+ */
164
+ function isValidHex(str) {
165
+ return /^[0-9A-Fa-f]*$/.test(str) && str.length % 2 === 0;
166
+ }
167
+ /**
168
+ * Checks if raw transaction can be deserialized
169
+ *
170
+ * @param {string} rawTransaction - transaction in base64 string format
171
+ * @param {boolean} requireAllSignatures - require all signatures to be present
172
+ * @param {boolean} verifySignatures - verify signatures
173
+ * @returns {boolean} - the validation result
174
+ */
175
+ function isValidRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
176
+ try {
177
+ const tx = web3_js_1.Transaction.from(Buffer.from(rawTransaction, 'base64'));
178
+ tx.serialize({ requireAllSignatures, verifySignatures });
179
+ return true;
180
+ }
181
+ catch (e) {
182
+ return false;
183
+ }
184
+ }
185
+ /**
186
+ * Verifies if signature for message is valid.
187
+ *
188
+ * @param {Buffer} serializedTx - tx as a base64 string
189
+ * @param {string} signature - signature as a string
190
+ * @param {string} publicKey - public key as base 58
191
+ * @returns {Boolean} true if signature is valid.
192
+ */
193
+ function verifySignature(serializedTx, signature, publicKey) {
194
+ if (!isValidRawTransaction(serializedTx)) {
195
+ throw new sdk_core_1.UtilsError('Invalid serializedTx');
196
+ }
197
+ if (!isValidPublicKey(publicKey)) {
198
+ throw new sdk_core_1.UtilsError('Invalid publicKey');
199
+ }
200
+ if (!isValidSignature(signature)) {
201
+ throw new sdk_core_1.UtilsError('Invalid signature');
202
+ }
203
+ const msg = web3_js_1.Transaction.from(Buffer.from(serializedTx, 'base64')).serializeMessage();
204
+ const sig = base58ToUint8Array(signature);
205
+ const pub = new web3_js_1.PublicKey(publicKey);
206
+ return tweetnacl_1.default.sign.detached.verify(msg, sig, pub.toBuffer());
207
+ }
208
+ /**
209
+ * Converts a base58 string into a Uint8Array.
210
+ *
211
+ * @param {string} input - a string in base58
212
+ * @returns {Uint8Array} - an Uint8Array
213
+ */
214
+ function base58ToUint8Array(input) {
215
+ return new Uint8Array(bs58_1.default.decode(input));
216
+ }
217
+ /**
218
+ * Converts a Uint8Array to a base58 string.
219
+ *
220
+ * @param {Uint8Array} input - an Uint8Array
221
+ * @returns {string} - a string in base58
222
+ */
223
+ function Uint8ArrayTobase58(input) {
224
+ return bs58_1.default.encode(input);
225
+ }
226
+ /**
227
+ * Count the amount of signatures are not null.
228
+ *
229
+ * @param {SignaturePubkeyPair[]} signatures - an array of SignaturePubkeyPair
230
+ * @returns {number} - the amount of valid signatures
231
+ */
232
+ function countNotNullSignatures(signatures) {
233
+ return signatures.filter((sig) => !!sig.signature).length;
234
+ }
235
+ /**
236
+ * Check if all signatures are completed.
237
+ *
238
+ * @param {SignaturePubkeyPair[]} signatures - signatures
239
+ * @returns {boolean}
240
+ */
241
+ function requiresAllSignatures(signatures) {
242
+ return signatures.length > 0 && countNotNullSignatures(signatures) === signatures.length;
243
+ }
244
+ /**
245
+ * Check the transaction type matching instructions by order. Memo and AdvanceNonceAccount instructions
246
+ * are ignored.
247
+ *
248
+ * @param {TransactionInstruction[]} instructions - the array of supported Solana instructions to be parsed
249
+ * @param {Record<string, number>} instructionIndexes - the instructions indexes of the current transaction
250
+ * @returns true if it matches by order.
251
+ */
252
+ function matchTransactionTypeByInstructionsOrder(instructions, instructionIndexes) {
253
+ const instructionsCopy = [...instructions]; // Make a copy since we may modify the array below
254
+ // AdvanceNonceAccount is optional and the first instruction added, it does not matter to match the type
255
+ if (instructionsCopy.length > 0) {
256
+ if (getInstructionType(instructions[0]) === 'AdvanceNonceAccount') {
257
+ instructionsCopy.shift();
258
+ }
259
+ }
260
+ // Memo is optional and the last instruction added, it does not matter to match the type
261
+ // Why have it in instructionKeys if we are going to ignore it?
262
+ const instructionsKeys = Object.keys(instructionIndexes);
263
+ if (instructionsKeys[instructionsKeys.length - 1] === 'Memo') {
264
+ instructionsKeys.pop();
265
+ }
266
+ // Check instructions by order using the index.
267
+ for (const keyName of instructionsKeys) {
268
+ const index = instructionIndexes[keyName];
269
+ if (index >= instructionsCopy.length) {
270
+ return false;
271
+ }
272
+ const result = getInstructionType(instructionsCopy[index]);
273
+ if (result !== keyName) {
274
+ return false;
275
+ }
276
+ }
277
+ return true;
278
+ }
279
+ /**
280
+ * Returns the transaction Type based on the transaction instructions.
281
+ * Wallet initialization, Transfer and Staking transactions are supported.
282
+ *
283
+ * @param {SolTransaction} transaction - the solana transaction
284
+ * @returns {TransactionType} - the type of transaction
285
+ */
286
+ function getTransactionType(transaction) {
287
+ const { instructions } = transaction;
288
+ if (validateRawMsgInstruction(instructions)) {
289
+ return sdk_core_1.TransactionType.StakingAuthorizeRaw;
290
+ }
291
+ validateIntructionTypes(instructions);
292
+ // check if deactivate instruction does not exist because deactivate can be include a transfer instruction
293
+ const memoInstruction = instructions.find((instruction) => getInstructionType(instruction) === 'Memo');
294
+ const memoData = memoInstruction?.data.toString('utf-8');
295
+ if (memoData?.includes('WalletConnectDefiCustomTx')) {
296
+ return sdk_core_1.TransactionType.CustomTx;
297
+ }
298
+ // Check for close ATA instructions before classifying as Send.
299
+ // A bulk close-ATA tx contains only closeAccount instructions (zero-balance ATAs).
300
+ // Note: This assumes close-ATA transactions never contain TokenTransfer instructions.
301
+ // This holds for Phase 1 where non-zero balance ATAs are rejected (user must consolidate first).
302
+ // If atomic transfer+close is added in the future, this detection needs refinement.
303
+ const hasCloseAta = instructions.some((instruction) => getInstructionType(instruction) === constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount);
304
+ if (hasCloseAta) {
305
+ return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
306
+ }
307
+ if (instructions.filter((instruction) => getInstructionType(instruction) === 'Deactivate').length === 0) {
308
+ for (const instruction of instructions) {
309
+ const instructionType = getInstructionType(instruction);
310
+ // Check if memo instruction is there and if it contains 'PrepareForRevoke' because Marinade staking deactivate transaction will have this
311
+ if ((instructionType === constants_1.ValidInstructionTypesEnum.Transfer && !memoData?.includes('PrepareForRevoke')) ||
312
+ instructionType === constants_1.ValidInstructionTypesEnum.TokenTransfer) {
313
+ return sdk_core_1.TransactionType.Send;
314
+ }
315
+ }
316
+ }
317
+ if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.walletInitInstructionIndexes)) {
318
+ return sdk_core_1.TransactionType.WalletInitialization;
319
+ }
320
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingActivateInstructionsIndexes) ||
321
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingActivateInstructionsIndexes) ||
322
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingActivateWithATAInstructionsIndexes) ||
323
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingActivateInstructionsIndexes)) {
324
+ return sdk_core_1.TransactionType.StakingActivate;
325
+ }
326
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingAuthorizeInstructionsIndexes)) {
327
+ return sdk_core_1.TransactionType.StakingAuthorize;
328
+ }
329
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDelegateInstructionsIndexes)) {
330
+ return sdk_core_1.TransactionType.StakingDelegate;
331
+ }
332
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingDeactivateInstructionsIndexes) ||
333
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDeactivateInstructionsIndexes) ||
334
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingPartialDeactivateInstructionsIndexes) ||
335
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingDeactivateInstructionsIndexes)) {
336
+ return sdk_core_1.TransactionType.StakingDeactivate;
337
+ }
338
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingWithdrawInstructionsIndexes)) {
339
+ return sdk_core_1.TransactionType.StakingWithdraw;
340
+ }
341
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataInitInstructionIndexes)) {
342
+ return sdk_core_1.TransactionType.AssociatedTokenAccountInitialization;
343
+ }
344
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataCloseInstructionIndexes)) {
345
+ return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
346
+ }
347
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataRecoverNestedInstructionIndexes)) {
348
+ return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
349
+ }
350
+ else {
351
+ return sdk_core_1.TransactionType.CustomTx;
352
+ }
353
+ }
354
+ /**
355
+ * Returns the instruction Type based on the solana instructions.
356
+ * Throws if the solana instruction program is not supported
357
+ *
358
+ * @param {TransactionInstruction} instruction - a solana instruction
359
+ * @returns {ValidInstructionTypes} - a solana instruction type
360
+ */
361
+ function getInstructionType(instruction) {
362
+ switch (instruction.programId.toString()) {
363
+ case new web3_js_1.PublicKey(constants_1.MEMO_PROGRAM_PK).toString():
364
+ return 'Memo';
365
+ case web3_js_1.SystemProgram.programId.toString():
366
+ return web3_js_1.SystemInstruction.decodeInstructionType(instruction);
367
+ case spl_token_1.TOKEN_PROGRAM_ID.toString():
368
+ case spl_token_1.TOKEN_2022_PROGRAM_ID.toString():
369
+ if (instruction.programId.equals(spl_token_1.TOKEN_2022_PROGRAM_ID) &&
370
+ instruction.data.length >= 2 &&
371
+ instruction.data[0] === spl_token_1.TokenInstruction.TransferFeeExtension &&
372
+ instruction.data[1] === spl_token_1.TransferFeeInstruction.TransferCheckedWithFee) {
373
+ return 'TokenTransfer';
374
+ }
375
+ let decodedInstruction;
376
+ try {
377
+ decodedInstruction = (0, spl_token_1.decodeInstruction)(instruction, instruction.programId);
378
+ }
379
+ catch (e) {
380
+ // decodeInstruction only supports the base token instruction set —
381
+ // extension-family instructions (Pause, PermissionedBurn, transfer
382
+ // fee ops, ...) throw TokenInvalidInstructionTypeError at EVERY
383
+ // @solana/spl-token version. Those must not crash classification:
384
+ // fall back to CustomInstruction, the same path used below for
385
+ // decodable-but-unmapped instruction types.
386
+ return 'CustomInstruction';
387
+ }
388
+ const instructionTypeMap = new Map();
389
+ instructionTypeMap.set(spl_token_1.TokenInstruction.CloseAccount, 'CloseAssociatedTokenAccount');
390
+ instructionTypeMap.set(spl_token_1.TokenInstruction.Burn, 'Burn');
391
+ instructionTypeMap.set(spl_token_1.TokenInstruction.MintTo, 'MintTo');
392
+ instructionTypeMap.set(spl_token_1.TokenInstruction.Approve, 'Approve');
393
+ instructionTypeMap.set(spl_token_1.TokenInstruction.TransferChecked, 'TokenTransfer');
394
+ const validInstruction = instructionTypeMap.get(decodedInstruction.data.instruction);
395
+ if (!validInstruction) {
396
+ return 'CustomInstruction';
397
+ }
398
+ return validInstruction;
399
+ case spl_stake_pool_1.STAKE_POOL_PROGRAM_ID.toString():
400
+ const discriminator = instruction.data.readUint8(0);
401
+ const layoutKey = Object.entries(spl_stake_pool_1.STAKE_POOL_INSTRUCTION_LAYOUTS).find(([_, v]) => v.index === discriminator)?.[0];
402
+ if (layoutKey === undefined) {
403
+ throw new Error('Instruction type incorrect; unknown discriminator');
404
+ }
405
+ const instructionKey = layoutKey;
406
+ return instructionKey;
407
+ case web3_js_1.StakeProgram.programId.toString():
408
+ return web3_js_1.StakeInstruction.decodeInstructionType(instruction);
409
+ case spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID.toString():
410
+ // TODO: change this when @spl-token supports decoding associated token instructions
411
+ // Support both legacy ATA creation (data.length === 0) and idempotent ATA creation (discriminator = 1)
412
+ // Both instruction types are treated as 'InitializeAssociatedTokenAccount' for compatibility
413
+ if (instruction.data.length === 0 || isIdempotentAtaInstruction(instruction)) {
414
+ return 'InitializeAssociatedTokenAccount';
415
+ }
416
+ else if (instruction.data.length === 1 && instruction.data[0] === 2) {
417
+ return 'RecoverNestedAssociatedTokenAccount';
418
+ }
419
+ else {
420
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction program id not supported: ' + instruction.programId.toString());
421
+ }
422
+ case COMPUTE_BUDGET:
423
+ if (web3_js_1.ComputeBudgetInstruction.decodeInstructionType(instruction) === 'SetComputeUnitLimit') {
424
+ return 'SetComputeUnitLimit';
425
+ }
426
+ return 'SetPriorityFee';
427
+ default:
428
+ return 'CustomInstruction';
429
+ }
430
+ }
431
+ /**
432
+ * Validate solana instructions types to see if they are supported by the builder.
433
+ * Throws if the instruction type is invalid.
434
+ *
435
+ * @param {TransactionInstruction} instructions - a solana instruction
436
+ * @returns {void}
437
+ */
438
+ function validateIntructionTypes(instructions) {
439
+ for (const instruction of instructions) {
440
+ if (!constants_1.VALID_SYSTEM_INSTRUCTION_TYPES.includes(getInstructionType(instruction))) {
441
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
442
+ }
443
+ }
444
+ }
445
+ /**
446
+ * Validate solana instructions match raw msg authorize transaction
447
+ *
448
+ * @param {TransactionInstruction} instructions - a solana instruction
449
+ * @returns {boolean} true if the instructions match the raw msg authorize transaction
450
+ */
451
+ function validateRawMsgInstruction(instructions) {
452
+ // as web3.js cannot decode authorize instruction from CLI, we need to check it manually first
453
+ if (instructions.length === 2) {
454
+ const programId1 = instructions[0].programId.toString();
455
+ const programId2 = instructions[1].programId.toString();
456
+ if (programId1 === web3_js_1.SystemProgram.programId.toString() && programId2 === web3_js_1.StakeProgram.programId.toString()) {
457
+ const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
458
+ const data = instructions[1].data.toString('hex');
459
+ if (instructionName1 === constants_1.nonceAdvanceInstruction &&
460
+ (data === constants_1.validInstructionData || data === constants_1.validInstructionData2)) {
461
+ return true;
462
+ }
463
+ }
464
+ }
465
+ if (instructions.length === 3) {
466
+ const programId1 = instructions[0].programId.toString();
467
+ const programId2 = instructions[1].programId.toString();
468
+ const programId3 = instructions[2].programId.toString();
469
+ if (programId1 === web3_js_1.SystemProgram.programId.toString() &&
470
+ programId2 === web3_js_1.StakeProgram.programId.toString() &&
471
+ programId3 === web3_js_1.StakeProgram.programId.toString()) {
472
+ const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
473
+ const data = instructions[1].data.toString('hex');
474
+ const data2 = instructions[2].data.toString('hex');
475
+ if (instructionName1 === constants_1.nonceAdvanceInstruction &&
476
+ (data === constants_1.validInstructionData || data === constants_1.validInstructionData2) &&
477
+ (data2 === constants_1.validInstructionData || data2 === constants_1.validInstructionData2)) {
478
+ return true;
479
+ }
480
+ }
481
+ }
482
+ return false;
483
+ }
484
+ /**
485
+ * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
486
+ *
487
+ * @param {string} rawTransaction - Transaction in base64 string format
488
+ */
489
+ function validateRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
490
+ if (!rawTransaction) {
491
+ throw new sdk_core_1.ParseTransactionError('Invalid raw transaction: Undefined');
492
+ }
493
+ if (!isValidRawTransaction(rawTransaction, requireAllSignatures, verifySignatures)) {
494
+ throw new sdk_core_1.ParseTransactionError('Invalid raw transaction');
495
+ }
496
+ }
497
+ /**
498
+ * Validates address to check if it exists and is a valid Solana public key
499
+ *
500
+ * @param {string} address The address to be validated
501
+ * @param {string} fieldName Name of the field to validate, its needed to return which field is failing on case of error.
502
+ */
503
+ function validateAddress(address, fieldName) {
504
+ if (!address || !isValidPublicKey(address)) {
505
+ throw new sdk_core_1.BuildTransactionError(`Invalid or missing ${fieldName}, got: ${address}`);
506
+ }
507
+ }
508
+ /**
509
+ * Get the statics coin object matching a given Solana token address if it exists
510
+ *
511
+ * @param tokenAddress The token address to match against
512
+ * @param network Solana Mainnet or Testnet
513
+ * @returns statics BaseCoin object for the matching token
514
+ */
515
+ function getSolTokenFromAddress(tokenAddress, network) {
516
+ const tokens = statics_1.coins.filter((coin) => {
517
+ if (coin instanceof statics_1.SolCoin) {
518
+ return coin.network.type === network.type && coin.tokenAddress.toLowerCase() === tokenAddress.toLowerCase();
519
+ }
520
+ return false;
521
+ });
522
+ const tokensArray = tokens.map((token) => token);
523
+ if (tokensArray.length >= 1) {
524
+ // there should never be two tokens with the same contract address, so we assert that here
525
+ (0, assert_1.default)(tokensArray.length === 1);
526
+ return tokensArray[0];
527
+ }
528
+ return undefined;
529
+ }
530
+ /**
531
+ * Get the statics coin object matching a given Solana token address if it exists
532
+ *
533
+ * @param tokenAddress The token address to match against
534
+ * @param network Solana Mainnet or Testnet
535
+ * @returns statics BaseCoin object for the matching token
536
+ */
537
+ function getSolTokenFromAddressOnly(tokenAddress) {
538
+ const tokens = statics_1.coins.filter((coin) => {
539
+ if (coin instanceof statics_1.SolCoin) {
540
+ return coin.tokenAddress.toLowerCase() === tokenAddress.toLowerCase();
541
+ }
542
+ return false;
543
+ });
544
+ const tokensArray = tokens.map((token) => token);
545
+ if (tokensArray.length >= 1) {
546
+ // there should never be two tokens with the same contract address, so we assert that here
547
+ (0, assert_1.default)(tokensArray.length === 1);
548
+ return tokensArray[0];
549
+ }
550
+ return undefined;
551
+ }
552
+ /**
553
+ * Get the solana token object from token name
554
+ * @param tokenName The token name to match against
555
+ * */
556
+ function getSolTokenFromTokenName(tokenName) {
557
+ try {
558
+ const token = statics_1.coins.get(tokenName);
559
+ if (!(token.isToken && token instanceof statics_1.SolCoin)) {
560
+ return undefined;
561
+ }
562
+ return token;
563
+ }
564
+ catch (e) {
565
+ if (!(e instanceof statics_1.CoinNotDefinedError)) {
566
+ throw e;
567
+ }
568
+ return undefined;
569
+ }
570
+ }
571
+ /**
572
+ * Get the solana associated token account address
573
+ * @param tokenAddress token mint address
574
+ * @param ownerAddress The owner of the associated token account
575
+ * @returns The associated token account address
576
+ * */
577
+ async function getAssociatedTokenAccountAddress(tokenMintAddress, ownerAddress, allowOwnerOffCurve = false, programId) {
578
+ const mintPublicKey = new web3_js_1.PublicKey(tokenMintAddress);
579
+ const ownerPublicKey = new web3_js_1.PublicKey(ownerAddress);
580
+ // tokenAddress are not on ed25519 curve, so they can't be used as ownerAddress
581
+ if (!allowOwnerOffCurve && !web3_js_1.PublicKey.isOnCurve(ownerPublicKey.toBuffer())) {
582
+ throw new sdk_core_1.UtilsError('Invalid ownerAddress - address off ed25519 curve, got: ' + ownerAddress);
583
+ }
584
+ if (!programId) {
585
+ const coin = getSolTokenFromAddressOnly(tokenMintAddress);
586
+ if (coin && coin instanceof statics_1.SolCoin && 'programId' in coin && coin.programId) {
587
+ programId = coin.programId.toString();
588
+ }
589
+ else {
590
+ programId = spl_token_1.TOKEN_PROGRAM_ID.toString();
591
+ }
592
+ }
593
+ let ataAddress;
594
+ if (programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
595
+ ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, allowOwnerOffCurve, spl_token_1.TOKEN_2022_PROGRAM_ID);
596
+ }
597
+ else {
598
+ ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, allowOwnerOffCurve);
599
+ }
600
+ return ataAddress.toString();
601
+ }
602
+ function validateMintAddress(mintAddress) {
603
+ if (!mintAddress || !isValidAddress(mintAddress)) {
604
+ throw new sdk_core_1.BuildTransactionError('Invalid or missing mintAddress, got: ' + mintAddress);
605
+ }
606
+ }
607
+ function validateOwnerAddress(ownerAddress) {
608
+ if (!ownerAddress || !isValidAddress(ownerAddress)) {
609
+ throw new sdk_core_1.BuildTransactionError('Invalid or missing ownerAddress, got: ' + ownerAddress);
610
+ }
611
+ }
612
+ /**
613
+ * Type predicate to check if an instruction is a legacy SolInstruction.
614
+ * Uses 'programId' property as the discriminator since it's unique to legacy instructions
615
+ * Versioned instructions have 'programIdIndex' property.
616
+ *
617
+ * @param instruction - The instruction to check
618
+ * @returns True if the instruction is a SolInstruction (has programId field)
619
+ */
620
+ function isSolLegacyInstruction(instruction) {
621
+ return 'programId' in instruction;
622
+ }
623
+ /**
624
+ * Token-2022 transfer fee: min(amount * basisPoints / 10000, maximumFee), in raw base units.
625
+ * All math in BigInt to avoid precision loss.
626
+ */
627
+ function computeTransferFee(amount, basisPoints, maximumFee) {
628
+ const raw = (BigInt(amount) * BigInt(basisPoints)) / 10000n;
629
+ const cap = BigInt(maximumFee);
630
+ return (raw < cap ? raw : cap).toString();
631
+ }
632
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0ZBLGdFQUVDO0FBR0Qsd0NBRUM7QUFHRCx3Q0FRQztBQUdELDhDQU9DO0FBR0QsNENBUUM7QUFHRCw0Q0FNQztBQUlELG9EQUVDO0FBUUQsc0NBR0M7QUFRRCxvREFHQztBQVFELGtDQUVDO0FBT0Qsc0NBT0M7QUFPRCxnQ0FFQztBQVVELHNEQVlDO0FBVUQsMENBY0M7QUFRRCxnREFFQztBQVFELGdEQUVDO0FBUUQsd0RBRUM7QUFRRCxzREFFQztBQVVELDBGQStCQztBQVNELGdEQW1FQztBQVNELGdEQXNFQztBQVNELDBEQU1DO0FBUUQsOERBc0NDO0FBTUQsd0RBV0M7QUFRRCwwQ0FJQztBQVNELHdEQWNDO0FBU0QsZ0VBY0M7QUFNRCw0REFhQztBQVFELDRFQW1DQztBQUVELGtEQUlDO0FBRUQsb0RBSUM7QUFVRCx3REFJQztBQU1ELGdEQUlDO0FBanNCRCxtREFTOEI7QUFDOUIsaURBQWlHO0FBQ2pHLGlEQVMyQjtBQUMzQiw2Q0FXeUI7QUFDekIsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUNyQyxnREFBd0I7QUFDeEIsMERBQTZCO0FBQzdCLDJDQXVCcUI7QUFFckIsMkRBQStGO0FBRS9GLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUMscUZBQXFGO0FBQzNILE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDLENBQUMsZ0RBQWdEO0FBQ3JGLE1BQU0sdUJBQXVCLEdBQUcsc0JBQXNCLENBQUM7QUFDdkQsTUFBTSxjQUFjLEdBQUcsNkNBQTZDLENBQUM7QUFFckU7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLDBCQUEwQixDQUFDLFdBQW1DO0lBQzVFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FB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O0FBQ0gsQ0FBQztBQUVELFNBQWdCLG9CQUFvQixDQUFDLFlBQW9CO0lBQ3ZELElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksZ0NBQXFCLENBQUMsd0NBQXdDLEdBQUcsWUFBWSxDQUFDLENBQUM7SUFDM0YsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQ3BDLFdBQXFEO0lBRXJELE9BQU8sV0FBVyxJQUFJLFdBQVcsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLFdBQW1CLEVBQUUsVUFBa0I7SUFDeEYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQixPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkWHB1YixcbiAgTm90U3VwcG9ydGVkLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFNvbEluc3RydWN0aW9uLFxuICBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbixcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBVdGlsc0Vycm9yLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiwgQmFzZU5ldHdvcmssIENvaW5Ob3REZWZpbmVkRXJyb3IsIGNvaW5zLCBTb2xDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQsXG4gIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MsXG4gIFRPS0VOX1BST0dSQU1fSUQsXG4gIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgZGVjb2RlSW5zdHJ1Y3Rpb24sXG4gIERlY29kZWRJbnN0cnVjdGlvbixcbiAgVG9rZW5JbnN0cnVjdGlvbixcbiAgVHJhbnNmZXJGZWVJbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHtcbiAgS2V5cGFpcixcbiAgUHVibGljS2V5LFxuICBTaWduYXR1cmVQdWJrZXlQYWlyLFxuICBUcmFuc2FjdGlvbiBhcyBTb2xUcmFuc2FjdGlvbixcbiAgU3Rha2VJbnN0cnVjdGlvbixcbiAgU3Rha2VQcm9ncmFtLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbixcbiAgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHtcbiAgYXRhQ2xvc2VJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIGF0YUluaXRJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIGF0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIE1BWF9NRU1PX0xFTkdUSCxcbiAgTUVNT19QUk9HUkFNX1BLLFxuICBub25jZUFkdmFuY2VJbnN0cnVjdGlvbixcbiAgc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgbWFyaW5hZGVTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBtYXJpbmFkZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ1BhcnRpYWxEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgVkFMSURfU1lTVEVNX0lOU1RSVUNUSU9OX1RZUEVTLFxuICB2YWxpZEluc3RydWN0aW9uRGF0YSxcbiAgdmFsaWRJbnN0cnVjdGlvbkRhdGEyLFxuICBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLFxuICB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLFxuICBqaXRvU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgaml0b1N0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgaml0b1N0YWtpbmdBY3RpdmF0ZVdpdGhBVEFJbnN0cnVjdGlvbnNJbmRleGVzLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBWYWxpZEluc3RydWN0aW9uVHlwZXMgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IFNUQUtFX1BPT0xfSU5TVFJVQ1RJT05fTEFZT1VUUywgU1RBS0VfUE9PTF9QUk9HUkFNX0lEIH0gZnJvbSAnQHNvbGFuYS9zcGwtc3Rha2UtcG9vbCc7XG5cbmNvbnN0IERFQ09ERURfQkxPQ0tfSEFTSF9MRU5HVEggPSAzMjsgLy8gaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vZGV2ZWxvcGluZy9wcm9ncmFtbWluZy1tb2RlbC90cmFuc2FjdGlvbnMjYmxvY2toYXNoLWZvcm1hdFxuY29uc3QgREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIID0gNjQ7IC8vIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL3Rlcm1pbm9sb2d5I3NpZ25hdHVyZVxuY29uc3QgQkFTRV81OF9FTkNPTkRJTkdfUkVHRVggPSAnWzEtOUEtSEotTlAtWmEta20tel0nO1xuY29uc3QgQ09NUFVURV9CVURHRVQgPSAnQ29tcHV0ZUJ1ZGdldDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIEFUQSBpbnN0cnVjdGlvbiBpcyBpZGVtcG90ZW50IChkaXNjcmltaW5hdG9yIGJ5dGUgPSAxKS5cbiAqXG4gKiBJZGVtcG90ZW50IEFUQSBpbnN0cnVjdGlvbnMgdXNlIEJ1ZmZlci5mcm9tKFsxXSkgYXMgaW5zdHJ1Y3Rpb24gZGF0YSwgY3JlYXRlZCBieVxuICogQHNvbGFuYS9zcGwtdG9rZW4ncyBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKCkgKHYwLjQuMSspLlxuICogQW4gaWRlbXBvdGVudCBBVEEgaW5zdHJ1Y3Rpb24gc3VjY2VlZCBldmVuIGlmIGFjY291bnQgZXhpc3RzLFxuICogcHJldmVudGluZyByYWNlIGNvbmRpdGlvbiBlcnJvcnMgaW4gY29uY3VycmVudCBzY2VuYXJpb3MuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbiAtIFRoZSBpbnN0cnVjdGlvbiB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgaW5zdHJ1Y3Rpb24gZGF0YSBpcyBhIHNpbmdsZSBieXRlIHdpdGggdmFsdWUgMVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVtcG90ZW50QXRhSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGluc3RydWN0aW9uLmRhdGEubGVuZ3RoID09PSAxICYmIGluc3RydWN0aW9uLmRhdGFbMF0gPT09IDE7XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZFB1YmxpY0tleShhZGRyZXNzKTtcbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhaGFzaCAmJiBuZXcgUmVnRXhwKEJBU0VfNThfRU5DT05ESU5HX1JFR0VYKS50ZXN0KGhhc2gpICYmIGJzNTguZGVjb2RlKGhhc2gpLmxlbmd0aCA9PT0gREVDT0RFRF9CTE9DS19IQVNIX0xFTkdUSFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByaXZhdGVLZXkocHJ2S2V5OiBzdHJpbmcgfCBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5OiBVaW50OEFycmF5ID0gdHlwZW9mIHBydktleSA9PT0gJ3N0cmluZycgPyBiYXNlNThUb1VpbnQ4QXJyYXkocHJ2S2V5KSA6IHBydktleTtcbiAgICByZXR1cm4gISFLZXlwYWlyLmZyb21TZWNyZXRLZXkoa2V5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHVibGljS2V5KHB1YktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgaWYgKGlzVmFsaWRYcHViKHB1YktleSkpIHJldHVybiB0cnVlO1xuICAgIG5ldyBQdWJsaWNLZXkocHViS2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFzaWduYXR1cmUgJiYgYnM1OC5kZWNvZGUoc2lnbmF0dXJlKS5sZW5ndGggPT09IERFQ09ERURfU0lHTkFUVVJFX0xFTkdUSDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbi8vIFRyYW5zYWN0aW9uSWQgYXJlIHRoZSBmaXJzdCBzaWduYXR1cmUgb24gYSBUcmFuc2FjdGlvblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZFNpZ25hdHVyZSh0eElkKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBhbW91bnQgb2YgbGFtcG9ydHMgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFtb3VudChhbW91bnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCk7XG4gIHJldHVybiBiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgJiYgYmlnTnVtYmVyQW1vdW50LmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXIgb24gc3Rha2luZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSB0aGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTdGFraW5nQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbigwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgbWVtbyBvciBub3QuXG4gKlxuICogQHBhcmFtIG1lbW8gLSB0aGUgbWVtbyBzdHJpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lbW8obWVtbzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShtZW1vKS5sZW5ndGggPD0gTUFYX01FTU9fTEVOR1RIO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0cmluZyBpcyB2YWxpZCBiYXNlNjQgZW5jb2RlZCBkYXRhXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIHZhbGlkIGJhc2U2NCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmFzZTY0KHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICByZXR1cm4gZGVjb2RlZCA9PT0gc3RyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzdHJpbmcgaXMgdmFsaWQgaGV4YWRlY2ltYWwgZGF0YVxuICogQHBhcmFtIHN0ciAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN0cmluZyBpcyB2YWxpZCBoZXgsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEhleChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bMC05QS1GYS1mXSokLy50ZXN0KHN0cikgJiYgc3RyLmxlbmd0aCAlIDIgPT09IDA7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJhdyB0cmFuc2FjdGlvbiBjYW4gYmUgZGVzZXJpYWxpemVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyBmb3JtYXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVxdWlyZUFsbFNpZ25hdHVyZXMgLSByZXF1aXJlIGFsbCBzaWduYXR1cmVzIHRvIGJlIHByZXNlbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmVyaWZ5U2lnbmF0dXJlcyAtIHZlcmlmeSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRSYXdUcmFuc2FjdGlvbihcbiAgcmF3VHJhbnNhY3Rpb246IHN0cmluZyxcbiAgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSBmYWxzZSxcbiAgdmVyaWZ5U2lnbmF0dXJlcyA9IGZhbHNlXG4pOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0eCA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgdHguc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXMsIHZlcmlmeVNpZ25hdHVyZXMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyBpZiBzaWduYXR1cmUgZm9yIG1lc3NhZ2UgaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IHNlcmlhbGl6ZWRUeCAtIHR4IGFzIGEgYmFzZTY0IHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSAtIHNpZ25hdHVyZSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY0tleSAtIHB1YmxpYyBrZXkgYXMgYmFzZSA1OFxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHNlcmlhbGl6ZWRUeDogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgcHVibGljS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpc1ZhbGlkUmF3VHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNlcmlhbGl6ZWRUeCcpO1xuICB9XG4gIGlmICghaXNWYWxpZFB1YmxpY0tleShwdWJsaWNLZXkpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgcHVibGljS2V5Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBzaWduYXR1cmUnKTtcbiAgfVxuICBjb25zdCBtc2cgPSBTb2xUcmFuc2FjdGlvbi5mcm9tKEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2Jhc2U2NCcpKS5zZXJpYWxpemVNZXNzYWdlKCk7XG4gIGNvbnN0IHNpZyA9IGJhc2U1OFRvVWludDhBcnJheShzaWduYXR1cmUpO1xuICBjb25zdCBwdWIgPSBuZXcgUHVibGljS2V5KHB1YmxpY0tleSk7XG4gIHJldHVybiBuYWNsLnNpZ24uZGV0YWNoZWQudmVyaWZ5KG1zZywgc2lnLCBwdWIudG9CdWZmZXIoKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBiYXNlNTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gYW4gVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTU4VG9VaW50OEFycmF5KGlucHV0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJzNTguZGVjb2RlKGlucHV0KSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBVaW50OEFycmF5IHRvIGEgYmFzZTU4IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0IC0gYW4gVWludDhBcnJheVxuICogQHJldHVybnMge3N0cmluZ30gLSBhIHN0cmluZyBpbiBiYXNlNThcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVpbnQ4QXJyYXlUb2Jhc2U1OChpbnB1dDogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBiczU4LmVuY29kZShpbnB1dCk7XG59XG5cbi8qKlxuICogQ291bnQgdGhlIGFtb3VudCBvZiBzaWduYXR1cmVzIGFyZSBub3QgbnVsbC5cbiAqXG4gKiBAcGFyYW0ge1NpZ25hdHVyZVB1YmtleVBhaXJbXX0gc2lnbmF0dXJlcyAtIGFuIGFycmF5IG9mIFNpZ25hdHVyZVB1YmtleVBhaXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gdGhlIGFtb3VudCBvZiB2YWxpZCBzaWduYXR1cmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXM6IFNpZ25hdHVyZVB1YmtleVBhaXJbXSk6IG51bWJlciB7XG4gIHJldHVybiBzaWduYXR1cmVzLmZpbHRlcigoc2lnKSA9PiAhIXNpZy5zaWduYXR1cmUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbGwgc2lnbmF0dXJlcyBhcmUgY29tcGxldGVkLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gc2lnbmF0dXJlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlc0FsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaWduYXR1cmVzLmxlbmd0aCA+IDAgJiYgY291bnROb3ROdWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzKSA9PT0gc2lnbmF0dXJlcy5sZW5ndGg7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHR5cGUgbWF0Y2hpbmcgaW5zdHJ1Y3Rpb25zIGJ5IG9yZGVyLiBNZW1vIGFuZCBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uc1xuICogYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9ucyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gaW5zdHJ1Y3Rpb25JbmRleGVzIC0gdGhlIGluc3RydWN0aW9ucyBpbmRleGVzIG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGl0IG1hdGNoZXMgYnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnN0cnVjdGlvbnNDb3B5ID0gWy4uLmluc3RydWN0aW9uc107IC8vIE1ha2UgYSBjb3B5IHNpbmNlIHdlIG1heSBtb2RpZnkgdGhlIGFycmF5IGJlbG93XG4gIC8vIEFkdmFuY2VOb25jZUFjY291bnQgaXMgb3B0aW9uYWwgYW5kIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBhZGRlZCwgaXQgZG9lcyBub3QgbWF0dGVyIHRvIG1hdGNoIHRoZSB0eXBlXG4gIGlmIChpbnN0cnVjdGlvbnNDb3B5Lmxlbmd0aCA+IDApIHtcbiAgICBpZiAoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc1swXSkgPT09ICdBZHZhbmNlTm9uY2VBY2NvdW50Jykge1xuICAgICAgaW5zdHJ1Y3Rpb25zQ29weS5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1lbW8gaXMgb3B0aW9uYWwgYW5kIHRoZSBsYXN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgLy8gV2h5IGhhdmUgaXQgaW4gaW5zdHJ1Y3Rpb25LZXlzIGlmIHdlIGFyZSBnb2luZyB0byBpZ25vcmUgaXQ/XG4gIGNvbnN0IGluc3RydWN0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhpbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAoaW5zdHJ1Y3Rpb25zS2V5c1tpbnN0cnVjdGlvbnNLZXlzLmxlbmd0aCAtIDFdID09PSAnTWVtbycpIHtcbiAgICBpbnN0cnVjdGlvbnNLZXlzLnBvcCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaW5zdHJ1Y3Rpb25zIGJ5IG9yZGVyIHVzaW5nIHRoZSBpbmRleC5cbiAgZm9yIChjb25zdCBrZXlOYW1lIG9mIGluc3RydWN0aW9uc0tleXMpIHtcbiAgICBjb25zdCBpbmRleCA9IGluc3RydWN0aW9uSW5kZXhlc1trZXlOYW1lXTtcbiAgICBpZiAoaW5kZXggPj0gaW5zdHJ1Y3Rpb25zQ29weS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc0NvcHlbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ICE9PSBrZXlOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHRyYW5zYWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlICB0cmFuc2FjdGlvbiBpbnN0cnVjdGlvbnMuXG4gKiBXYWxsZXQgaW5pdGlhbGl6YXRpb24sIFRyYW5zZmVyIGFuZCBTdGFraW5nIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7U29sVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uIC0gdGhlIHNvbGFuYSB0cmFuc2FjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uVHlwZX0gLSB0aGUgdHlwZSBvZiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBTb2xUcmFuc2FjdGlvbik6IFRyYW5zYWN0aW9uVHlwZSB7XG4gIGNvbnN0IHsgaW5zdHJ1Y3Rpb25zIH0gPSB0cmFuc2FjdGlvbjtcbiAgaWYgKHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdztcbiAgfVxuICB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnMpO1xuICAvLyBjaGVjayBpZiBkZWFjdGl2YXRlIGluc3RydWN0aW9uIGRvZXMgbm90IGV4aXN0IGJlY2F1c2UgZGVhY3RpdmF0ZSBjYW4gYmUgaW5jbHVkZSBhIHRyYW5zZmVyIGluc3RydWN0aW9uXG4gIGNvbnN0IG1lbW9JbnN0cnVjdGlvbiA9IGluc3RydWN0aW9ucy5maW5kKChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ01lbW8nKTtcbiAgY29uc3QgbWVtb0RhdGEgPSBtZW1vSW5zdHJ1Y3Rpb24/LmRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIGlmIChtZW1vRGF0YT8uaW5jbHVkZXMoJ1dhbGxldENvbm5lY3REZWZpQ3VzdG9tVHgnKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGNsb3NlIEFUQSBpbnN0cnVjdGlvbnMgYmVmb3JlIGNsYXNzaWZ5aW5nIGFzIFNlbmQuXG4gIC8vIEEgYnVsayBjbG9zZS1BVEEgdHggY29udGFpbnMgb25seSBjbG9zZUFjY291bnQgaW5zdHJ1Y3Rpb25zICh6ZXJvLWJhbGFuY2UgQVRBcykuXG4gIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjbG9zZS1BVEEgdHJhbnNhY3Rpb25zIG5ldmVyIGNvbnRhaW4gVG9rZW5UcmFuc2ZlciBpbnN0cnVjdGlvbnMuXG4gIC8vIFRoaXMgaG9sZHMgZm9yIFBoYXNlIDEgd2hlcmUgbm9uLXplcm8gYmFsYW5jZSBBVEFzIGFyZSByZWplY3RlZCAodXNlciBtdXN0IGNvbnNvbGlkYXRlIGZpcnN0KS5cbiAgLy8gSWYgYXRvbWljIHRyYW5zZmVyK2Nsb3NlIGlzIGFkZGVkIGluIHRoZSBmdXR1cmUsIHRoaXMgZGV0ZWN0aW9uIG5lZWRzIHJlZmluZW1lbnQuXG4gIGNvbnN0IGhhc0Nsb3NlQXRhID0gaW5zdHJ1Y3Rpb25zLnNvbWUoXG4gICAgKGluc3RydWN0aW9uKSA9PiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudFxuICApO1xuICBpZiAoaGFzQ2xvc2VBdGEpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDtcbiAgfVxuXG4gIGlmIChpbnN0cnVjdGlvbnMuZmlsdGVyKChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ0RlYWN0aXZhdGUnKS5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICAgIC8vIENoZWNrIGlmIG1lbW8gaW5zdHJ1Y3Rpb24gaXMgdGhlcmUgYW5kIGlmIGl0IGNvbnRhaW5zICdQcmVwYXJlRm9yUmV2b2tlJyBiZWNhdXNlIE1hcmluYWRlIHN0YWtpbmcgZGVhY3RpdmF0ZSB0cmFuc2FjdGlvbiB3aWxsIGhhdmUgdGhpc1xuICAgICAgaWYgKFxuICAgICAgICAoaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyICYmICFtZW1vRGF0YT8uaW5jbHVkZXMoJ1ByZXBhcmVGb3JSZXZva2UnKSkgfHxcbiAgICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb247XG4gIH0gZWxzZSBpZiAoXG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgbWFyaW5hZGVTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGppdG9TdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGppdG9TdGFraW5nQWN0aXZhdGVXaXRoQVRBSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKVxuICApIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZTtcbiAgfSBlbHNlIGlmIChcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBtYXJpbmFkZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ1BhcnRpYWxEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBqaXRvU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKVxuICApIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFDbG9zZUluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiBUeXBlIGJhc2VkIG9uIHRoZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zLlxuICogVGhyb3dzIGlmIHRoZSBzb2xhbmEgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpcyBub3Qgc3VwcG9ydGVkXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbiAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7VmFsaWRJbnN0cnVjdGlvblR5cGVzfSAtIGEgc29sYW5hIGluc3RydWN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlcyB7XG4gIHN3aXRjaCAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkpIHtcbiAgICBjYXNlIG5ldyBQdWJsaWNLZXkoTUVNT19QUk9HUkFNX1BLKS50b1N0cmluZygpOlxuICAgICAgcmV0dXJuICdNZW1vJztcbiAgICBjYXNlIFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBjYXNlIFRPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICBjYXNlIFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbi5wcm9ncmFtSWQuZXF1YWxzKFRPS0VOXzIwMjJfUFJPR1JBTV9JRCkgJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPj0gMiAmJlxuICAgICAgICBpbnN0cnVjdGlvbi5kYXRhWzBdID09PSBUb2tlbkluc3RydWN0aW9uLlRyYW5zZmVyRmVlRXh0ZW5zaW9uICYmXG4gICAgICAgIGluc3RydWN0aW9uLmRhdGFbMV0gPT09IFRyYW5zZmVyRmVlSW5zdHJ1Y3Rpb24uVHJhbnNmZXJDaGVja2VkV2l0aEZlZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAnVG9rZW5UcmFuc2Zlcic7XG4gICAgICB9XG4gICAgICBsZXQgZGVjb2RlZEluc3RydWN0aW9uOiBEZWNvZGVkSW5zdHJ1Y3Rpb247XG4gICAgICB0cnkge1xuICAgICAgICBkZWNvZGVkSW5zdHJ1Y3Rpb24gPSBkZWNvZGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZGVjb2RlSW5zdHJ1Y3Rpb24gb25seSBzdXBwb3J0cyB0aGUgYmFzZSB0b2tlbiBpbnN0cnVjdGlvbiBzZXQg4oCUXG4gICAgICAgIC8vIGV4dGVuc2lvbi1mYW1pbHkgaW5zdHJ1Y3Rpb25zIChQYXVzZSwgUGVybWlzc2lvbmVkQnVybiwgdHJhbnNmZXJcbiAgICAgICAgLy8gZmVlIG9wcywgLi4uKSB0aHJvdyBUb2tlbkludmFsaWRJbnN0cnVjdGlvblR5cGVFcnJvciBhdCBFVkVSWVxuICAgICAgICAvLyBAc29sYW5hL3NwbC10b2tlbiB2ZXJzaW9uLiBUaG9zZSBtdXN0IG5vdCBjcmFzaCBjbGFzc2lmaWNhdGlvbjpcbiAgICAgICAgLy8gZmFsbCBiYWNrIHRvIEN1c3RvbUluc3RydWN0aW9uLCB0aGUgc2FtZSBwYXRoIHVzZWQgYmVsb3cgZm9yXG4gICAgICAgIC8vIGRlY29kYWJsZS1idXQtdW5tYXBwZWQgaW5zdHJ1Y3Rpb24gdHlwZXMuXG4gICAgICAgIHJldHVybiAnQ3VzdG9tSW5zdHJ1Y3Rpb24nO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlTWFwOiBNYXA8VG9rZW5JbnN0cnVjdGlvbiwgVmFsaWRJbnN0cnVjdGlvblR5cGVzPiA9IG5ldyBNYXAoKTtcbiAgICAgIGluc3RydWN0aW9uVHlwZU1hcC5zZXQoVG9rZW5JbnN0cnVjdGlvbi5DbG9zZUFjY291bnQsICdDbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIGluc3RydWN0aW9uVHlwZU1hcC5zZXQoVG9rZW5JbnN0cnVjdGlvbi5CdXJuLCAnQnVybicpO1xuICAgICAgaW5zdHJ1Y3Rpb25UeXBlTWFwLnNldChUb2tlbkluc3RydWN0aW9uLk1pbnRUbywgJ01pbnRUbycpO1xuICAgICAgaW5zdHJ1Y3Rpb25UeXBlTWFwLnNldChUb2tlbkluc3RydWN0aW9uLkFwcHJvdmUsICdBcHByb3ZlJyk7XG4gICAgICBpbnN0cnVjdGlvblR5cGVNYXAuc2V0KFRva2VuSW5zdHJ1Y3Rpb24uVHJhbnNmZXJDaGVja2VkLCAnVG9rZW5UcmFuc2ZlcicpO1xuICAgICAgY29uc3QgdmFsaWRJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uVHlwZU1hcC5nZXQoZGVjb2RlZEluc3RydWN0aW9uLmRhdGEuaW5zdHJ1Y3Rpb24pO1xuICAgICAgaWYgKCF2YWxpZEluc3RydWN0aW9uKSB7XG4gICAgICAgIHJldHVybiAnQ3VzdG9tSW5zdHJ1Y3Rpb24nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbGlkSW5zdHJ1Y3Rpb247XG4gICAgY2FzZSBTVEFLRV9QT09MX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSBpbnN0cnVjdGlvbi5kYXRhLnJlYWRVaW50OCgwKTtcbiAgICAgIGNvbnN0IGxheW91dEtleSA9IE9iamVjdC5lbnRyaWVzKFNUQUtFX1BPT0xfSU5TVFJVQ1RJT05fTEFZT1VUUykuZmluZCgoW18sIHZdKSA9PiB2LmluZGV4ID09PSBkaXNjcmltaW5hdG9yKT8uWzBdO1xuICAgICAgaWYgKGxheW91dEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5zdHJ1Y3Rpb24gdHlwZSBpbmNvcnJlY3Q7IHVua25vd24gZGlzY3JpbWluYXRvcicpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25LZXkgPSBsYXlvdXRLZXkgYXMga2V5b2YgdHlwZW9mIFNUQUtFX1BPT0xfSU5TVFJVQ1RJT05fTEFZT1VUUztcbiAgICAgIHJldHVybiBpbnN0cnVjdGlvbktleTtcbiAgICBjYXNlIFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiBTdGFrZUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgY2FzZSBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIHdoZW4gQHNwbC10b2tlbiBzdXBwb3J0cyBkZWNvZGluZyBhc3NvY2lhdGVkIHRva2VuIGluc3RydWN0aW9uc1xuICAgICAgLy8gU3VwcG9ydCBib3RoIGxlZ2FjeSBBVEEgY3JlYXRpb24gKGRhdGEubGVuZ3RoID09PSAwKSBhbmQgaWRlbXBvdGVudCBBVEEgY3JlYXRpb24gKGRpc2NyaW1pbmF0b3IgPSAxKVxuICAgICAgLy8gQm90aCBpbnN0cnVjdGlvbiB0eXBlcyBhcmUgdHJlYXRlZCBhcyAnSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnIGZvciBjb21wYXRpYmlsaXR5XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPT09IDAgfHwgaXNJZGVtcG90ZW50QXRhSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKSB7XG4gICAgICAgIHJldHVybiAnSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnO1xuICAgICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA9PT0gMSAmJiBpbnN0cnVjdGlvbi5kYXRhWzBdID09PSAyKSB7XG4gICAgICAgIHJldHVybiAnUmVjb3Zlck5lc3RlZEFzc29jaWF0ZWRUb2tlbkFjY291bnQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpZCBub3Qgc3VwcG9ydGVkOiAnICsgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICBjYXNlIENPTVBVVEVfQlVER0VUOlxuICAgICAgaWYgKENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pID09PSAnU2V0Q29tcHV0ZVVuaXRMaW1pdCcpIHtcbiAgICAgICAgcmV0dXJuICdTZXRDb21wdXRlVW5pdExpbWl0JztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnU2V0UHJpb3JpdHlGZWUnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ0N1c3RvbUluc3RydWN0aW9uJztcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNvbGFuYSBpbnN0cnVjdGlvbnMgdHlwZXMgdG8gc2VlIGlmIHRoZXkgYXJlIHN1cHBvcnRlZCBieSB0aGUgYnVpbGRlci5cbiAqIFRocm93cyBpZiB0aGUgaW5zdHJ1Y3Rpb24gdHlwZSBpcyBpbnZhbGlkLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb25zIC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJbnRydWN0aW9uVHlwZXMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBpZiAoIVZBTElEX1NZU1RFTV9JTlNUUlVDVElPTl9UWVBFUy5pbmNsdWRlcyhnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pKSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc29sYW5hIGluc3RydWN0aW9ucyBtYXRjaCByYXcgbXNnIGF1dGhvcml6ZSB0cmFuc2FjdGlvblxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb25zIC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbnMgbWF0Y2ggdGhlIHJhdyBtc2cgYXV0aG9yaXplIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJhd01zZ0luc3RydWN0aW9uKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogYm9vbGVhbiB7XG4gIC8vIGFzIHdlYjMuanMgY2Fubm90IGRlY29kZSBhdXRob3JpemUgaW5zdHJ1Y3Rpb24gZnJvbSBDTEksIHdlIG5lZWQgdG8gY2hlY2sgaXQgbWFudWFsbHkgZmlyc3RcbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCBwcm9ncmFtSWQxID0gaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGNvbnN0IHByb2dyYW1JZDIgPSBpbnN0cnVjdGlvbnNbMV0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgaWYgKHByb2dyYW1JZDEgPT09IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgJiYgcHJvZ3JhbUlkMiA9PT0gU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpKSB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbk5hbWUxID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc1swXSk7XG4gICAgICBjb25zdCBkYXRhID0gaW5zdHJ1Y3Rpb25zWzFdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbk5hbWUxID09PSBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiAmJlxuICAgICAgICAoZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEgfHwgZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEyKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMykge1xuICAgIGNvbnN0IHByb2dyYW1JZDEgPSBpbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcHJvZ3JhbUlkMiA9IGluc3RydWN0aW9uc1sxXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwcm9ncmFtSWQzID0gaW5zdHJ1Y3Rpb25zWzJdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGlmIChcbiAgICAgIHByb2dyYW1JZDEgPT09IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgJiZcbiAgICAgIHByb2dyYW1JZDIgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSAmJlxuICAgICAgcHJvZ3JhbUlkMyA9PT0gU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbk5hbWUxID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc1swXSk7XG4gICAgICBjb25zdCBkYXRhID0gaW5zdHJ1Y3Rpb25zWzFdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgZGF0YTIgPSBpbnN0cnVjdGlvbnNbMl0uZGF0YS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uTmFtZTEgPT09IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uICYmXG4gICAgICAgIChkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YSB8fCBkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpICYmXG4gICAgICAgIChkYXRhMiA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEgfHwgZGF0YTIgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMilcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBDaGVjayB0aGUgcmF3IHRyYW5zYWN0aW9uIGhhcyBhIHZhbGlkIGZvcm1hdCBpbiB0aGUgYmxvY2tjaGFpbiBjb250ZXh0LCB0aHJvdyBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gVHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyAgZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKFxuICByYXdUcmFuc2FjdGlvbjogc3RyaW5nLFxuICByZXF1aXJlQWxsU2lnbmF0dXJlcyA9IGZhbHNlLFxuICB2ZXJpZnlTaWduYXR1cmVzID0gZmFsc2Vcbik6IHZvaWQge1xuICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb246IFVuZGVmaW5lZCcpO1xuICB9XG4gIGlmICghaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uLCByZXF1aXJlQWxsU2lnbmF0dXJlcywgdmVyaWZ5U2lnbmF0dXJlcykpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFkZHJlc3MgdG8gY2hlY2sgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIFNvbGFuYSBwdWJsaWMga2V5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHZhbGlkYXRlLCBpdHMgbmVlZGVkIHRvIHJldHVybiB3aGljaCBmaWVsZCBpcyBmYWlsaW5nIG9uIGNhc2Ugb2YgZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWFkZHJlc3MgfHwgIWlzVmFsaWRQdWJsaWNLZXkoYWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIG9yIG1pc3NpbmcgJHtmaWVsZE5hbWV9LCBnb3Q6ICR7YWRkcmVzc31gKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdGljcyBjb2luIG9iamVjdCBtYXRjaGluZyBhIGdpdmVuIFNvbGFuYSB0b2tlbiBhZGRyZXNzIGlmIGl0IGV4aXN0c1xuICpcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVGhlIHRva2VuIGFkZHJlc3MgdG8gbWF0Y2ggYWdhaW5zdFxuICogQHBhcmFtIG5ldHdvcmsgU29sYW5hIE1haW5uZXQgb3IgVGVzdG5ldFxuICogQHJldHVybnMgc3RhdGljcyBCYXNlQ29pbiBvYmplY3QgZm9yIHRoZSBtYXRjaGluZyB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29sVG9rZW5Gcm9tQWRkcmVzcyh0b2tlbkFkZHJlc3M6IHN0cmluZywgbmV0d29yazogQmFzZU5ldHdvcmspOiBSZWFkb25seTxCYXNlQ29pbj4gfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+IHtcbiAgICBpZiAoY29pbiBpbnN0YW5jZW9mIFNvbENvaW4pIHtcbiAgICAgIHJldHVybiBjb2luLm5ldHdvcmsudHlwZSA9PT0gbmV0d29yay50eXBlICYmIGNvaW4udG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkgPT09IHRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuICBjb25zdCB0b2tlbnNBcnJheSA9IHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbik7XG4gIGlmICh0b2tlbnNBcnJheS5sZW5ndGggPj0gMSkge1xuICAgIC8vIHRoZXJlIHNob3VsZCBuZXZlciBiZSB0d28gdG9rZW5zIHdpdGggdGhlIHNhbWUgY29udHJhY3QgYWRkcmVzcywgc28gd2UgYXNzZXJ0IHRoYXQgaGVyZVxuICAgIGFzc2VydCh0b2tlbnNBcnJheS5sZW5ndGggPT09IDEpO1xuICAgIHJldHVybiB0b2tlbnNBcnJheVswXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdGljcyBjb2luIG9iamVjdCBtYXRjaGluZyBhIGdpdmVuIFNvbGFuYSB0b2tlbiBhZGRyZXNzIGlmIGl0IGV4aXN0c1xuICpcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVGhlIHRva2VuIGFkZHJlc3MgdG8gbWF0Y2ggYWdhaW5zdFxuICogQHBhcmFtIG5ldHdvcmsgU29sYW5hIE1haW5uZXQgb3IgVGVzdG5ldFxuICogQHJldHVybnMgc3RhdGljcyBCYXNlQ29pbiBvYmplY3QgZm9yIHRoZSBtYXRjaGluZyB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29sVG9rZW5Gcm9tQWRkcmVzc09ubHkodG9rZW5BZGRyZXNzOiBzdHJpbmcpOiBSZWFkb25seTxCYXNlQ29pbj4gfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+IHtcbiAgICBpZiAoY29pbiBpbnN0YW5jZW9mIFNvbENvaW4pIHtcbiAgICAgIHJldHVybiBjb2luLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSB0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbiAgY29uc3QgdG9rZW5zQXJyYXkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW4pO1xuICBpZiAodG9rZW5zQXJyYXkubGVuZ3RoID49IDEpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICBhc3NlcnQodG9rZW5zQXJyYXkubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdG9rZW5zQXJyYXlbMF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNvbGFuYSB0b2tlbiBvYmplY3QgZnJvbSB0b2tlbiBuYW1lXG4gKiBAcGFyYW0gdG9rZW5OYW1lIFRoZSB0b2tlbiBuYW1lIHRvIG1hdGNoIGFnYWluc3RcbiAqICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHRva2VuTmFtZTogc3RyaW5nKTogUmVhZG9ubHk8U29sQ29pbj4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHRva2VuID0gY29pbnMuZ2V0KHRva2VuTmFtZSk7XG4gICAgaWYgKCEodG9rZW4uaXNUb2tlbiAmJiB0b2tlbiBpbnN0YW5jZW9mIFNvbENvaW4pKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW47XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIShlIGluc3RhbmNlb2YgQ29pbk5vdERlZmluZWRFcnJvcikpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNvbGFuYSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQWRkcmVzcyB0b2tlbiBtaW50IGFkZHJlc3NcbiAqIEBwYXJhbSBvd25lckFkZHJlc3MgVGhlIG93bmVyIG9mIHRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnRcbiAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgYWRkcmVzc1xuICogKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyhcbiAgdG9rZW5NaW50QWRkcmVzczogc3RyaW5nLFxuICBvd25lckFkZHJlc3M6IHN0cmluZyxcbiAgYWxsb3dPd25lck9mZkN1cnZlID0gZmFsc2UsXG4gIHByb2dyYW1JZD86IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbWludFB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkodG9rZW5NaW50QWRkcmVzcyk7XG4gIGNvbnN0IG93bmVyUHVibGljS2V5ID0gbmV3IFB1YmxpY0tleShvd25lckFkZHJlc3MpO1xuXG4gIC8vIHRva2VuQWRkcmVzcyBhcmUgbm90IG9uIGVkMjU1MTkgY3VydmUsIHNvIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBvd25lckFkZHJlc3NcbiAgaWYgKCFhbGxvd093bmVyT2ZmQ3VydmUgJiYgIVB1YmxpY0tleS5pc09uQ3VydmUob3duZXJQdWJsaWNLZXkudG9CdWZmZXIoKSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBvd25lckFkZHJlc3MgLSBhZGRyZXNzIG9mZiBlZDI1NTE5IGN1cnZlLCBnb3Q6ICcgKyBvd25lckFkZHJlc3MpO1xuICB9XG5cbiAgaWYgKCFwcm9ncmFtSWQpIHtcbiAgICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tQWRkcmVzc09ubHkodG9rZW5NaW50QWRkcmVzcyk7XG4gICAgaWYgKGNvaW4gJiYgY29pbiBpbnN0YW5jZW9mIFNvbENvaW4gJiYgJ3Byb2dyYW1JZCcgaW4gY29pbiAmJiBjb2luLnByb2dyYW1JZCkge1xuICAgICAgcHJvZ3JhbUlkID0gY29pbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3JhbUlkID0gVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBhdGFBZGRyZXNzOiBQdWJsaWNLZXk7XG4gIGlmIChwcm9ncmFtSWQgPT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgYXRhQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MoXG4gICAgICBtaW50UHVibGljS2V5LFxuICAgICAgb3duZXJQdWJsaWNLZXksXG4gICAgICBhbGxvd093bmVyT2ZmQ3VydmUsXG4gICAgICBUT0tFTl8yMDIyX1BST0dSQU1fSURcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGF0YUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzKG1pbnRQdWJsaWNLZXksIG93bmVyUHVibGljS2V5LCBhbGxvd093bmVyT2ZmQ3VydmUpO1xuICB9XG4gIHJldHVybiBhdGFBZGRyZXNzLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1pbnRBZGRyZXNzKG1pbnRBZGRyZXNzOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFtaW50QWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3MobWludEFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG1pbnRBZGRyZXNzLCBnb3Q6ICcgKyBtaW50QWRkcmVzcyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3duZXJBZGRyZXNzKG93bmVyQWRkcmVzczogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghb3duZXJBZGRyZXNzIHx8ICFpc1ZhbGlkQWRkcmVzcyhvd25lckFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG93bmVyQWRkcmVzcywgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgcHJlZGljYXRlIHRvIGNoZWNrIGlmIGFuIGluc3RydWN0aW9uIGlzIGEgbGVnYWN5IFNvbEluc3RydWN0aW9uLlxuICogVXNlcyAncHJvZ3JhbUlkJyBwcm9wZXJ0eSBhcyB0aGUgZGlzY3JpbWluYXRvciBzaW5jZSBpdCdzIHVuaXF1ZSB0byBsZWdhY3kgaW5zdHJ1Y3Rpb25zXG4gKiBWZXJzaW9uZWQgaW5zdHJ1Y3Rpb25zIGhhdmUgJ3Byb2dyYW1JZEluZGV4JyBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gaW5zdHJ1Y3Rpb24gLSBUaGUgaW5zdHJ1Y3Rpb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgU29sSW5zdHJ1Y3Rpb24gKGhhcyBwcm9ncmFtSWQgZmllbGQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NvbExlZ2FjeUluc3RydWN0aW9uKFxuICBpbnN0cnVjdGlvbjogU29sSW5zdHJ1Y3Rpb24gfCBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvblxuKTogaW5zdHJ1Y3Rpb24gaXMgU29sSW5zdHJ1Y3Rpb24ge1xuICByZXR1cm4gJ3Byb2dyYW1JZCcgaW4gaW5zdHJ1Y3Rpb247XG59XG5cbi8qKlxuICogVG9rZW4tMjAyMiB0cmFuc2ZlciBmZWU6IG1pbihhbW91bnQgKiBiYXNpc1BvaW50cyAvIDEwMDAwLCBtYXhpbXVtRmVlKSwgaW4gcmF3IGJhc2UgdW5pdHMuXG4gKiBBbGwgbWF0aCBpbiBCaWdJbnQgdG8gYXZvaWQgcHJlY2lzaW9uIGxvc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlVHJhbnNmZXJGZWUoYW1vdW50OiBzdHJpbmcsIGJhc2lzUG9pbnRzOiBudW1iZXIsIG1heGltdW1GZWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJhdyA9IChCaWdJbnQoYW1vdW50KSAqIEJpZ0ludChiYXNpc1BvaW50cykpIC8gMTAwMDBuO1xuICBjb25zdCBjYXAgPSBCaWdJbnQobWF4aW11bUZlZSk7XG4gIHJldHVybiAocmF3IDwgY2FwID8gcmF3IDogY2FwKS50b1N0cmluZygpO1xufVxuIl19