@bitgo-beta/abstract-utxo 1.1.1-beta.222 → 1.1.1-beta.2221

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 (850) hide show
  1. package/README.md +76 -0
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts +458 -0
  3. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
  4. package/dist/cjs/src/abstractUtxoCoin.js +652 -0
  5. package/dist/cjs/src/address/fixedScript.d.ts +44 -0
  6. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
  7. package/dist/cjs/src/address/fixedScript.js +108 -0
  8. package/dist/cjs/src/address/index.d.ts +2 -0
  9. package/dist/cjs/src/address/index.d.ts.map +1 -0
  10. package/dist/cjs/src/address/index.js +8 -0
  11. package/dist/cjs/src/config.d.ts.map +1 -0
  12. package/dist/cjs/src/config.js +14 -0
  13. package/dist/cjs/src/deriveKeyWithSeed.d.ts +12 -0
  14. package/dist/cjs/src/deriveKeyWithSeed.d.ts.map +1 -0
  15. package/dist/cjs/src/deriveKeyWithSeed.js +17 -0
  16. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +19 -0
  17. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  18. package/dist/cjs/src/descriptor/NamedDescriptor.js +77 -0
  19. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  20. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  21. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +33 -0
  22. package/dist/cjs/src/descriptor/builder/builder.d.ts +17 -0
  23. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
  24. package/dist/cjs/src/descriptor/builder/builder.js +54 -0
  25. package/dist/cjs/src/descriptor/builder/index.d.ts +3 -0
  26. package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
  27. package/dist/cjs/src/descriptor/builder/index.js +8 -0
  28. package/dist/cjs/src/descriptor/builder/parse.d.ts +5 -0
  29. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
  30. package/dist/cjs/src/descriptor/builder/parse.js +148 -0
  31. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  32. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  33. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
  34. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +12 -0
  35. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  36. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
  37. package/dist/cjs/src/descriptor/createWallet/index.d.ts +3 -0
  38. package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
  39. package/dist/cjs/src/descriptor/createWallet/index.js +19 -0
  40. package/dist/cjs/src/descriptor/descriptorWallet.d.ts +19 -0
  41. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
  42. package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
  43. package/dist/cjs/src/descriptor/index.d.ts +9 -0
  44. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  45. package/dist/cjs/src/descriptor/index.js +53 -0
  46. package/dist/cjs/src/descriptor/validatePolicy.d.ts +22 -0
  47. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
  48. package/dist/cjs/src/descriptor/validatePolicy.js +94 -0
  49. package/dist/cjs/src/impl/bch/bch.d.ts +22 -0
  50. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
  51. package/dist/cjs/src/impl/bch/bch.js +43 -0
  52. package/dist/cjs/src/impl/bch/index.d.ts +3 -0
  53. package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
  54. package/dist/cjs/src/impl/bch/index.js +19 -0
  55. package/dist/cjs/src/impl/bch/tbch.d.ts +12 -0
  56. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
  57. package/dist/cjs/src/impl/bch/tbch.js +15 -0
  58. package/dist/cjs/src/impl/bcha/bcha.d.ts +9 -0
  59. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
  60. package/dist/cjs/src/impl/bcha/bcha.js +15 -0
  61. package/dist/cjs/src/impl/bcha/index.d.ts +3 -0
  62. package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
  63. package/dist/cjs/src/impl/bcha/index.js +19 -0
  64. package/dist/cjs/src/impl/bcha/tbcha.d.ts +12 -0
  65. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
  66. package/dist/cjs/src/impl/bcha/tbcha.js +15 -0
  67. package/dist/cjs/src/impl/bsv/bsv.d.ts +9 -0
  68. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
  69. package/dist/cjs/src/impl/bsv/bsv.js +15 -0
  70. package/dist/cjs/src/impl/bsv/index.d.ts +3 -0
  71. package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
  72. package/dist/cjs/src/impl/bsv/index.js +19 -0
  73. package/dist/cjs/src/impl/bsv/tbsv.d.ts +12 -0
  74. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
  75. package/dist/cjs/src/impl/bsv/tbsv.js +15 -0
  76. package/dist/cjs/src/impl/btc/btc.d.ts +15 -0
  77. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
  78. package/dist/cjs/src/impl/btc/btc.js +22 -0
  79. package/dist/cjs/src/impl/btc/index.d.ts +7 -0
  80. package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
  81. package/dist/cjs/src/impl/btc/index.js +23 -0
  82. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts +61 -0
  83. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  84. package/dist/cjs/src/impl/btc/inscriptionBuilder.js +170 -0
  85. package/dist/cjs/src/impl/btc/tbtc.d.ts +12 -0
  86. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
  87. package/dist/cjs/src/impl/btc/tbtc.js +15 -0
  88. package/dist/cjs/src/impl/btc/tbtc4.d.ts +12 -0
  89. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
  90. package/dist/cjs/src/impl/btc/tbtc4.js +15 -0
  91. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts +12 -0
  92. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
  93. package/dist/cjs/src/impl/btc/tbtcbgsig.js +15 -0
  94. package/dist/cjs/src/impl/btc/tbtcsig.d.ts +12 -0
  95. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
  96. package/dist/cjs/src/impl/btc/tbtcsig.js +15 -0
  97. package/dist/cjs/src/impl/btg/btg.d.ts +9 -0
  98. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
  99. package/dist/cjs/src/impl/btg/btg.js +15 -0
  100. package/dist/cjs/src/impl/btg/index.d.ts +2 -0
  101. package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
  102. package/dist/cjs/src/impl/btg/index.js +18 -0
  103. package/dist/cjs/src/impl/dash/dash.d.ts +9 -0
  104. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
  105. package/dist/cjs/src/impl/dash/dash.js +15 -0
  106. package/dist/cjs/src/impl/dash/index.d.ts +3 -0
  107. package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
  108. package/dist/cjs/src/impl/dash/index.js +19 -0
  109. package/dist/cjs/src/impl/dash/tdash.d.ts +12 -0
  110. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
  111. package/dist/cjs/src/impl/dash/tdash.js +15 -0
  112. package/dist/cjs/src/impl/doge/doge.d.ts +33 -0
  113. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
  114. package/dist/cjs/src/impl/doge/doge.js +76 -0
  115. package/dist/cjs/src/impl/doge/index.d.ts +3 -0
  116. package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
  117. package/dist/cjs/src/impl/doge/index.js +19 -0
  118. package/dist/cjs/src/impl/doge/tdoge.d.ts +12 -0
  119. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
  120. package/dist/cjs/src/impl/doge/tdoge.js +15 -0
  121. package/dist/cjs/src/impl/index.d.ts +11 -0
  122. package/dist/cjs/src/impl/index.d.ts.map +1 -0
  123. package/dist/cjs/src/impl/index.js +47 -0
  124. package/dist/cjs/src/impl/ltc/index.d.ts +3 -0
  125. package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
  126. package/dist/cjs/src/impl/ltc/index.js +19 -0
  127. package/dist/cjs/src/impl/ltc/ltc.d.ts +8 -0
  128. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
  129. package/dist/cjs/src/impl/ltc/ltc.js +15 -0
  130. package/dist/cjs/src/impl/ltc/tltc.d.ts +8 -0
  131. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
  132. package/dist/cjs/src/impl/ltc/tltc.js +15 -0
  133. package/dist/cjs/src/impl/pearl/index.d.ts +3 -0
  134. package/dist/cjs/src/impl/pearl/index.d.ts.map +1 -0
  135. package/dist/cjs/src/impl/pearl/index.js +19 -0
  136. package/dist/cjs/src/impl/pearl/pearl.d.ts +17 -0
  137. package/dist/cjs/src/impl/pearl/pearl.d.ts.map +1 -0
  138. package/dist/cjs/src/impl/pearl/pearl.js +24 -0
  139. package/dist/cjs/src/impl/pearl/tpearl.d.ts +8 -0
  140. package/dist/cjs/src/impl/pearl/tpearl.d.ts.map +1 -0
  141. package/dist/cjs/src/impl/pearl/tpearl.js +15 -0
  142. package/dist/cjs/src/impl/zec/index.d.ts +3 -0
  143. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
  144. package/dist/cjs/src/impl/zec/index.js +19 -0
  145. package/dist/cjs/src/impl/zec/tzec.d.ts +9 -0
  146. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
  147. package/dist/cjs/src/impl/zec/tzec.js +15 -0
  148. package/dist/cjs/src/impl/zec/zec.d.ts +12 -0
  149. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
  150. package/dist/cjs/src/impl/zec/zec.js +15 -0
  151. package/dist/cjs/src/index.d.ts +23 -0
  152. package/dist/cjs/src/index.d.ts.map +1 -0
  153. package/dist/cjs/src/index.js +62 -0
  154. package/dist/cjs/src/keychains.d.ts +55 -0
  155. package/dist/cjs/src/keychains.d.ts.map +1 -0
  156. package/dist/cjs/src/keychains.js +143 -0
  157. package/dist/cjs/src/names.d.ts +13 -0
  158. package/dist/cjs/src/names.d.ts.map +1 -0
  159. package/dist/cjs/src/names.js +96 -0
  160. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  161. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  162. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +22 -0
  163. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts +46 -0
  164. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  165. package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
  166. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts +16 -0
  167. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  168. package/dist/cjs/src/offlineVault/TransactionExplanation.js +15 -0
  169. package/dist/cjs/src/offlineVault/descriptor/index.d.ts +2 -0
  170. package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
  171. package/dist/cjs/src/offlineVault/descriptor/index.js +18 -0
  172. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +39 -0
  173. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  174. package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
  175. package/dist/cjs/src/offlineVault/index.d.ts +6 -0
  176. package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
  177. package/dist/cjs/src/offlineVault/index.js +44 -0
  178. package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +1 -3
  179. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
  180. package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
  181. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +172 -0
  182. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
  183. package/dist/cjs/src/recovery/backupKeyRecovery.js +415 -0
  184. package/dist/{src → cjs/src}/recovery/baseApi.d.ts +3 -6
  185. package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
  186. package/dist/cjs/src/recovery/baseApi.js +73 -0
  187. package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -3
  188. package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
  189. package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
  190. package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +21 -9
  191. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
  192. package/dist/cjs/src/recovery/crossChainRecovery.js +302 -0
  193. package/dist/{src → cjs/src}/recovery/index.d.ts +0 -1
  194. package/dist/cjs/src/recovery/index.d.ts.map +1 -0
  195. package/dist/{src → cjs/src}/recovery/index.js +6 -3
  196. package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
  197. package/dist/cjs/src/recovery/mempoolApi.js +36 -0
  198. package/dist/cjs/src/recovery/psbt.d.ts +68 -0
  199. package/dist/cjs/src/recovery/psbt.d.ts.map +1 -0
  200. package/dist/cjs/src/recovery/psbt.js +160 -0
  201. package/dist/cjs/src/tnumber.d.ts +4 -0
  202. package/dist/cjs/src/tnumber.d.ts.map +1 -0
  203. package/dist/cjs/src/tnumber.js +12 -0
  204. package/dist/cjs/src/transaction/bip322.d.ts +27 -0
  205. package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
  206. package/dist/cjs/src/transaction/bip322.js +139 -0
  207. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts +2 -0
  208. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  209. package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
  210. package/dist/cjs/src/transaction/decode.d.ts +21 -0
  211. package/dist/cjs/src/transaction/decode.d.ts.map +1 -0
  212. package/dist/cjs/src/transaction/decode.js +45 -0
  213. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +5 -0
  214. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  215. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +47 -0
  216. package/dist/cjs/src/transaction/descriptor/index.d.ts +7 -0
  217. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
  218. package/dist/cjs/src/transaction/descriptor/index.js +14 -0
  219. package/dist/cjs/src/transaction/descriptor/parse.d.ts +18 -0
  220. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
  221. package/dist/cjs/src/transaction/descriptor/parse.js +86 -0
  222. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts +14 -0
  223. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  224. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
  225. package/dist/cjs/src/transaction/descriptor/recipient.d.ts +5 -0
  226. package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
  227. package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
  228. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +25 -0
  229. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  230. package/dist/cjs/src/transaction/descriptor/signPsbt.js +44 -0
  231. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +36 -0
  232. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  233. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +90 -0
  234. package/dist/cjs/src/transaction/explainTransaction.d.ts +18 -0
  235. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
  236. package/dist/cjs/src/transaction/explainTransaction.js +84 -0
  237. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +24 -0
  238. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -0
  239. package/dist/cjs/src/transaction/fixedScript/SigningError.js +32 -0
  240. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
  241. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  242. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +149 -0
  243. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +47 -0
  244. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  245. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +3 -0
  246. package/dist/cjs/src/transaction/fixedScript/index.d.ts +8 -0
  247. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
  248. package/dist/cjs/src/transaction/fixedScript/index.js +30 -0
  249. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts +4 -0
  250. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts.map +1 -0
  251. package/dist/cjs/src/transaction/fixedScript/musig2.js +3 -0
  252. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts +28 -0
  253. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  254. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +216 -0
  255. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts +8 -0
  256. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  257. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +227 -0
  258. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts +10 -0
  259. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  260. package/dist/cjs/src/transaction/fixedScript/replayProtection.js +44 -0
  261. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  262. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  263. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +118 -0
  264. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +22 -0
  265. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  266. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +46 -0
  267. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  268. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  269. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +182 -0
  270. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  271. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  272. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.js +20 -0
  273. package/dist/cjs/src/transaction/index.d.ts +9 -0
  274. package/dist/cjs/src/transaction/index.d.ts.map +1 -0
  275. package/dist/cjs/src/transaction/index.js +52 -0
  276. package/dist/cjs/src/transaction/outputDifference.d.ts +44 -0
  277. package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
  278. package/dist/cjs/src/transaction/outputDifference.js +51 -0
  279. package/dist/cjs/src/transaction/parseTransaction.d.ts +4 -0
  280. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
  281. package/dist/cjs/src/transaction/parseTransaction.js +48 -0
  282. package/dist/cjs/src/transaction/recipient.d.ts +34 -0
  283. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
  284. package/dist/cjs/src/transaction/recipient.js +69 -0
  285. package/dist/cjs/src/transaction/signTransaction.d.ts +6 -0
  286. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
  287. package/dist/cjs/src/transaction/signTransaction.js +105 -0
  288. package/dist/cjs/src/transaction/types.d.ts +47 -0
  289. package/dist/cjs/src/transaction/types.d.ts.map +1 -0
  290. package/dist/cjs/src/transaction/types.js +3 -0
  291. package/dist/cjs/src/transaction/verifyTransaction.d.ts +4 -0
  292. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
  293. package/dist/cjs/src/transaction/verifyTransaction.js +50 -0
  294. package/dist/cjs/src/unspent.d.ts +59 -0
  295. package/dist/cjs/src/unspent.d.ts.map +1 -0
  296. package/dist/cjs/src/unspent.js +20 -0
  297. package/dist/cjs/src/verifyKey.d.ts +22 -0
  298. package/dist/cjs/src/verifyKey.d.ts.map +1 -0
  299. package/dist/cjs/src/verifyKey.js +110 -0
  300. package/dist/cjs/src/wallet.d.ts +15 -0
  301. package/dist/cjs/src/wallet.d.ts.map +1 -0
  302. package/dist/cjs/src/wallet.js +8 -0
  303. package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
  304. package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
  305. package/dist/cjs/test/integration/impl/bch/bch.js +76 -0
  306. package/dist/cjs/test/unit/address.d.ts +2 -0
  307. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  308. package/dist/cjs/test/unit/address.js +201 -0
  309. package/dist/cjs/test/unit/bip322.d.ts +2 -0
  310. package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
  311. package/dist/cjs/test/unit/bip322.js +481 -0
  312. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts +2 -0
  313. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts.map +1 -0
  314. package/dist/cjs/test/unit/buildSignSendLegacyFormat.js +102 -0
  315. package/dist/cjs/test/unit/coins.d.ts +2 -0
  316. package/dist/cjs/test/unit/coins.d.ts.map +1 -0
  317. package/dist/cjs/test/unit/coins.js +161 -0
  318. package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
  319. package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
  320. package/dist/cjs/test/unit/customChangeWallet.js +204 -0
  321. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts +2 -0
  322. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts.map +1 -0
  323. package/dist/cjs/test/unit/customChangeWalletFixtures.js +53 -0
  324. package/dist/cjs/test/unit/customSigner.d.ts +2 -0
  325. package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
  326. package/dist/cjs/test/unit/customSigner.js +99 -0
  327. package/dist/cjs/test/unit/deriveKeyWithSeed.d.ts +2 -0
  328. package/dist/cjs/test/unit/deriveKeyWithSeed.d.ts.map +1 -0
  329. package/dist/cjs/test/unit/deriveKeyWithSeed.js +56 -0
  330. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
  331. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
  332. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +51 -0
  333. package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
  334. package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
  335. package/dist/cjs/test/unit/descriptor/builder.js +92 -0
  336. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
  337. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  338. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +53 -0
  339. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
  340. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
  341. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +62 -0
  342. package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
  343. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
  344. package/dist/cjs/test/unit/descriptorAddress.js +103 -0
  345. package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
  346. package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
  347. package/dist/cjs/test/unit/explainTransaction.js +37 -0
  348. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
  349. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
  350. package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
  351. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
  352. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
  353. package/dist/cjs/test/unit/impl/bch/unit/bch.js +71 -0
  354. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
  355. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
  356. package/dist/cjs/test/unit/impl/bcha/unit/index.js +41 -0
  357. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
  358. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
  359. package/dist/cjs/test/unit/impl/bsv/unit/index.js +34 -0
  360. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
  361. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
  362. package/dist/cjs/test/unit/impl/btg/unit/index.js +33 -0
  363. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
  364. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
  365. package/dist/cjs/test/unit/impl/dash/unit/index.js +34 -0
  366. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
  367. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
  368. package/dist/cjs/test/unit/impl/doge/unit/index.js +34 -0
  369. package/dist/cjs/test/unit/impl/pearl/unit/index.d.ts +2 -0
  370. package/dist/cjs/test/unit/impl/pearl/unit/index.d.ts.map +1 -0
  371. package/dist/cjs/test/unit/impl/pearl/unit/index.js +111 -0
  372. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
  373. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
  374. package/dist/cjs/test/unit/impl/zec/unit/index.js +30 -0
  375. package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
  376. package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
  377. package/dist/cjs/test/unit/keySignatures.js +54 -0
  378. package/dist/cjs/test/unit/keychains.d.ts +2 -0
  379. package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
  380. package/dist/cjs/test/unit/keychains.js +87 -0
  381. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
  382. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
  383. package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
  384. package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
  385. package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
  386. package/dist/cjs/test/unit/parseTransaction.js +155 -0
  387. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts +2 -0
  388. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts.map +1 -0
  389. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.js +99 -0
  390. package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
  391. package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
  392. package/dist/cjs/test/unit/postProcessPrebuild.js +65 -0
  393. package/dist/cjs/test/unit/prebuildAndSign.d.ts +2 -0
  394. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
  395. package/dist/cjs/test/unit/prebuildAndSign.js +218 -0
  396. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
  397. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
  398. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +136 -0
  399. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
  400. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
  401. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +147 -0
  402. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
  403. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
  404. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +352 -0
  405. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
  406. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
  407. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +189 -0
  408. package/dist/cjs/test/unit/recovery/mock.d.ts +37 -0
  409. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
  410. package/dist/cjs/test/unit/recovery/mock.js +111 -0
  411. package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
  412. package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
  413. package/dist/cjs/test/unit/signTransaction.js +223 -0
  414. package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
  415. package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
  416. package/dist/cjs/test/unit/testSpoofTransaction.js +114 -0
  417. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
  418. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  419. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +64 -0
  420. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
  421. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
  422. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +51 -0
  423. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
  424. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
  425. package/dist/cjs/test/unit/transaction/descriptor/parse.js +138 -0
  426. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
  427. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
  428. package/dist/cjs/test/unit/transaction/descriptor/sign.js +76 -0
  429. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts +2 -0
  430. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts.map +1 -0
  431. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.js +100 -0
  432. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts +2 -0
  433. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts.map +1 -0
  434. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.js +84 -0
  435. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
  436. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
  437. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +81 -0
  438. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.d.ts +2 -0
  439. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.d.ts.map +1 -0
  440. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.js +102 -0
  441. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
  442. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
  443. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +171 -0
  444. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts +2 -0
  445. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts.map +1 -0
  446. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +222 -0
  447. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts +2 -0
  448. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  449. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.js +60 -0
  450. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts +2 -0
  451. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts.map +1 -0
  452. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +98 -0
  453. package/dist/cjs/test/unit/transaction/outputDifference.d.ts +2 -0
  454. package/dist/cjs/test/unit/transaction/outputDifference.d.ts.map +1 -0
  455. package/dist/cjs/test/unit/transaction/outputDifference.js +117 -0
  456. package/dist/cjs/test/unit/transaction/recipient.d.ts +2 -0
  457. package/dist/cjs/test/unit/transaction/recipient.d.ts.map +1 -0
  458. package/dist/cjs/test/unit/transaction/recipient.js +52 -0
  459. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  460. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  461. package/dist/cjs/test/unit/transaction.js +301 -0
  462. package/dist/cjs/test/unit/txFormat.d.ts +30 -0
  463. package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
  464. package/dist/cjs/test/unit/txFormat.js +161 -0
  465. package/dist/cjs/test/unit/util/address.d.ts +13 -0
  466. package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
  467. package/dist/cjs/test/unit/util/address.js +15 -0
  468. package/dist/cjs/test/unit/util/assert.d.ts +3 -0
  469. package/dist/cjs/test/unit/util/assert.d.ts.map +1 -0
  470. package/dist/cjs/test/unit/util/assert.js +24 -0
  471. package/dist/cjs/test/unit/util/fixtures.d.ts +13 -0
  472. package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
  473. package/dist/cjs/test/unit/util/fixtures.js +105 -0
  474. package/dist/cjs/test/unit/util/index.d.ts +11 -0
  475. package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
  476. package/dist/cjs/test/unit/util/index.js +27 -0
  477. package/dist/cjs/test/unit/util/keychains.d.ts +55 -0
  478. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
  479. package/dist/cjs/test/unit/util/keychains.js +122 -0
  480. package/dist/cjs/test/unit/util/nockBitGo.d.ts +10 -0
  481. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
  482. package/dist/cjs/test/unit/util/nockBitGo.js +27 -0
  483. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
  484. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
  485. package/dist/cjs/test/unit/util/nockIndexerAPI.js +23 -0
  486. package/dist/cjs/test/unit/util/psbt.d.ts +19 -0
  487. package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
  488. package/dist/cjs/test/unit/util/psbt.js +21 -0
  489. package/dist/cjs/test/unit/util/transaction.d.ts +28 -0
  490. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
  491. package/dist/cjs/test/unit/util/transaction.js +131 -0
  492. package/dist/cjs/test/unit/util/unspents.d.ts +71 -0
  493. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
  494. package/dist/cjs/test/unit/util/unspents.js +224 -0
  495. package/dist/cjs/test/unit/util/utxoCoins.d.ts +30 -0
  496. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
  497. package/dist/cjs/test/unit/util/utxoCoins.js +175 -0
  498. package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
  499. package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
  500. package/dist/cjs/test/unit/util/wallet.js +9 -0
  501. package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
  502. package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
  503. package/dist/cjs/test/unit/verifyTransaction.js +539 -0
  504. package/dist/cjs/test/unit/wallet.d.ts +2 -0
  505. package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
  506. package/dist/cjs/test/unit/wallet.js +251 -0
  507. package/dist/cjs/test/unit/webauthn.d.ts +2 -0
  508. package/dist/cjs/test/unit/webauthn.d.ts.map +1 -0
  509. package/dist/cjs/test/unit/webauthn.js +77 -0
  510. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  511. package/dist/esm/abstractUtxoCoin.d.ts +458 -0
  512. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
  513. package/dist/esm/abstractUtxoCoin.js +644 -0
  514. package/dist/esm/address/fixedScript.d.ts +44 -0
  515. package/dist/esm/address/fixedScript.d.ts.map +1 -0
  516. package/dist/esm/address/fixedScript.js +100 -0
  517. package/dist/esm/address/index.d.ts +2 -0
  518. package/dist/esm/address/index.d.ts.map +1 -0
  519. package/dist/esm/address/index.js +2 -0
  520. package/dist/esm/config.d.ts +9 -0
  521. package/dist/esm/config.js +11 -0
  522. package/dist/esm/deriveKeyWithSeed.d.ts +12 -0
  523. package/dist/esm/deriveKeyWithSeed.d.ts.map +1 -0
  524. package/dist/esm/deriveKeyWithSeed.js +14 -0
  525. package/dist/esm/descriptor/NamedDescriptor.d.ts +19 -0
  526. package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -0
  527. package/dist/esm/descriptor/NamedDescriptor.js +37 -0
  528. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  529. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  530. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
  531. package/dist/esm/descriptor/builder/builder.d.ts +17 -0
  532. package/dist/esm/descriptor/builder/builder.d.ts.map +1 -0
  533. package/dist/esm/descriptor/builder/builder.js +51 -0
  534. package/dist/esm/descriptor/builder/index.d.ts +3 -0
  535. package/dist/esm/descriptor/builder/index.d.ts.map +1 -0
  536. package/dist/esm/descriptor/builder/index.js +3 -0
  537. package/dist/esm/descriptor/builder/parse.d.ts +5 -0
  538. package/dist/esm/descriptor/builder/parse.d.ts.map +1 -0
  539. package/dist/esm/descriptor/builder/parse.js +144 -0
  540. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  541. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  542. package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
  543. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
  544. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  545. package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
  546. package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
  547. package/dist/esm/descriptor/createWallet/index.d.ts.map +1 -0
  548. package/dist/esm/descriptor/createWallet/index.js +3 -0
  549. package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
  550. package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -0
  551. package/dist/esm/descriptor/descriptorWallet.js +16 -0
  552. package/dist/esm/descriptor/index.d.ts +9 -0
  553. package/dist/esm/descriptor/index.d.ts.map +1 -0
  554. package/dist/esm/descriptor/index.js +7 -0
  555. package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
  556. package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -0
  557. package/dist/esm/descriptor/validatePolicy.js +82 -0
  558. package/dist/esm/impl/bch/bch.d.ts +22 -0
  559. package/dist/esm/impl/bch/bch.d.ts.map +1 -0
  560. package/dist/esm/impl/bch/bch.js +39 -0
  561. package/dist/esm/impl/bch/index.d.ts +3 -0
  562. package/dist/esm/impl/bch/index.d.ts.map +1 -0
  563. package/dist/esm/impl/bch/index.js +3 -0
  564. package/dist/esm/impl/bch/tbch.d.ts +12 -0
  565. package/dist/esm/impl/bch/tbch.d.ts.map +1 -0
  566. package/dist/esm/impl/bch/tbch.js +11 -0
  567. package/dist/esm/impl/bcha/bcha.d.ts +9 -0
  568. package/dist/esm/impl/bcha/bcha.d.ts.map +1 -0
  569. package/dist/esm/impl/bcha/bcha.js +11 -0
  570. package/dist/esm/impl/bcha/index.d.ts +3 -0
  571. package/dist/esm/impl/bcha/index.d.ts.map +1 -0
  572. package/dist/esm/impl/bcha/index.js +3 -0
  573. package/dist/esm/impl/bcha/tbcha.d.ts +12 -0
  574. package/dist/esm/impl/bcha/tbcha.d.ts.map +1 -0
  575. package/dist/esm/impl/bcha/tbcha.js +11 -0
  576. package/dist/esm/impl/bsv/bsv.d.ts +9 -0
  577. package/dist/esm/impl/bsv/bsv.d.ts.map +1 -0
  578. package/dist/esm/impl/bsv/bsv.js +11 -0
  579. package/dist/esm/impl/bsv/index.d.ts +3 -0
  580. package/dist/esm/impl/bsv/index.d.ts.map +1 -0
  581. package/dist/esm/impl/bsv/index.js +3 -0
  582. package/dist/esm/impl/bsv/tbsv.d.ts +12 -0
  583. package/dist/esm/impl/bsv/tbsv.d.ts.map +1 -0
  584. package/dist/esm/impl/bsv/tbsv.js +11 -0
  585. package/dist/esm/impl/btc/btc.d.ts +15 -0
  586. package/dist/esm/impl/btc/btc.d.ts.map +1 -0
  587. package/dist/esm/impl/btc/btc.js +18 -0
  588. package/dist/esm/impl/btc/index.d.ts +7 -0
  589. package/dist/esm/impl/btc/index.d.ts.map +1 -0
  590. package/dist/esm/impl/btc/index.js +7 -0
  591. package/dist/esm/impl/btc/inscriptionBuilder.d.ts +61 -0
  592. package/dist/esm/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  593. package/dist/esm/impl/btc/inscriptionBuilder.js +163 -0
  594. package/dist/esm/impl/btc/tbtc.d.ts +12 -0
  595. package/dist/esm/impl/btc/tbtc.d.ts.map +1 -0
  596. package/dist/esm/impl/btc/tbtc.js +11 -0
  597. package/dist/esm/impl/btc/tbtc4.d.ts +12 -0
  598. package/dist/esm/impl/btc/tbtc4.d.ts.map +1 -0
  599. package/dist/esm/impl/btc/tbtc4.js +11 -0
  600. package/dist/esm/impl/btc/tbtcbgsig.d.ts +12 -0
  601. package/dist/esm/impl/btc/tbtcbgsig.d.ts.map +1 -0
  602. package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
  603. package/dist/esm/impl/btc/tbtcsig.d.ts +12 -0
  604. package/dist/esm/impl/btc/tbtcsig.d.ts.map +1 -0
  605. package/dist/esm/impl/btc/tbtcsig.js +11 -0
  606. package/dist/esm/impl/btg/btg.d.ts +9 -0
  607. package/dist/esm/impl/btg/btg.d.ts.map +1 -0
  608. package/dist/esm/impl/btg/btg.js +11 -0
  609. package/dist/esm/impl/btg/index.d.ts +2 -0
  610. package/dist/esm/impl/btg/index.d.ts.map +1 -0
  611. package/dist/esm/impl/btg/index.js +2 -0
  612. package/dist/esm/impl/dash/dash.d.ts +9 -0
  613. package/dist/esm/impl/dash/dash.d.ts.map +1 -0
  614. package/dist/esm/impl/dash/dash.js +11 -0
  615. package/dist/esm/impl/dash/index.d.ts +3 -0
  616. package/dist/esm/impl/dash/index.d.ts.map +1 -0
  617. package/dist/esm/impl/dash/index.js +3 -0
  618. package/dist/esm/impl/dash/tdash.d.ts +12 -0
  619. package/dist/esm/impl/dash/tdash.d.ts.map +1 -0
  620. package/dist/esm/impl/dash/tdash.js +11 -0
  621. package/dist/esm/impl/doge/doge.d.ts +33 -0
  622. package/dist/esm/impl/doge/doge.d.ts.map +1 -0
  623. package/dist/esm/impl/doge/doge.js +72 -0
  624. package/dist/esm/impl/doge/index.d.ts +3 -0
  625. package/dist/esm/impl/doge/index.d.ts.map +1 -0
  626. package/dist/esm/impl/doge/index.js +3 -0
  627. package/dist/esm/impl/doge/tdoge.d.ts +12 -0
  628. package/dist/esm/impl/doge/tdoge.d.ts.map +1 -0
  629. package/dist/esm/impl/doge/tdoge.js +11 -0
  630. package/dist/esm/impl/index.d.ts +11 -0
  631. package/dist/esm/impl/index.d.ts.map +1 -0
  632. package/dist/esm/impl/index.js +11 -0
  633. package/dist/esm/impl/ltc/index.d.ts +3 -0
  634. package/dist/esm/impl/ltc/index.d.ts.map +1 -0
  635. package/dist/esm/impl/ltc/index.js +3 -0
  636. package/dist/esm/impl/ltc/ltc.d.ts +8 -0
  637. package/dist/esm/impl/ltc/ltc.d.ts.map +1 -0
  638. package/dist/esm/impl/ltc/ltc.js +11 -0
  639. package/dist/esm/impl/ltc/tltc.d.ts +8 -0
  640. package/dist/esm/impl/ltc/tltc.d.ts.map +1 -0
  641. package/dist/esm/impl/ltc/tltc.js +11 -0
  642. package/dist/esm/impl/pearl/index.d.ts +3 -0
  643. package/dist/esm/impl/pearl/index.d.ts.map +1 -0
  644. package/dist/esm/impl/pearl/index.js +3 -0
  645. package/dist/esm/impl/pearl/pearl.d.ts +17 -0
  646. package/dist/esm/impl/pearl/pearl.d.ts.map +1 -0
  647. package/dist/esm/impl/pearl/pearl.js +20 -0
  648. package/dist/esm/impl/pearl/tpearl.d.ts +8 -0
  649. package/dist/esm/impl/pearl/tpearl.d.ts.map +1 -0
  650. package/dist/esm/impl/pearl/tpearl.js +11 -0
  651. package/dist/esm/impl/zec/index.d.ts +3 -0
  652. package/dist/esm/impl/zec/index.d.ts.map +1 -0
  653. package/dist/esm/impl/zec/index.js +3 -0
  654. package/dist/esm/impl/zec/tzec.d.ts +9 -0
  655. package/dist/esm/impl/zec/tzec.d.ts.map +1 -0
  656. package/dist/esm/impl/zec/tzec.js +11 -0
  657. package/dist/esm/impl/zec/zec.d.ts +12 -0
  658. package/dist/esm/impl/zec/zec.d.ts.map +1 -0
  659. package/dist/esm/impl/zec/zec.js +11 -0
  660. package/dist/esm/index.d.ts +23 -0
  661. package/dist/esm/index.d.ts.map +1 -0
  662. package/dist/esm/index.js +23 -0
  663. package/dist/esm/keychains.d.ts +55 -0
  664. package/dist/esm/keychains.d.ts.map +1 -0
  665. package/dist/esm/keychains.js +98 -0
  666. package/dist/esm/names.d.ts +13 -0
  667. package/dist/esm/names.d.ts.map +1 -0
  668. package/dist/esm/names.js +86 -0
  669. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  670. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  671. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +19 -0
  672. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
  673. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  674. package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
  675. package/dist/esm/offlineVault/TransactionExplanation.d.ts +16 -0
  676. package/dist/esm/offlineVault/TransactionExplanation.d.ts.map +1 -0
  677. package/dist/esm/offlineVault/TransactionExplanation.js +12 -0
  678. package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
  679. package/dist/esm/offlineVault/descriptor/index.d.ts.map +1 -0
  680. package/dist/esm/offlineVault/descriptor/index.js +2 -0
  681. package/dist/esm/offlineVault/descriptor/transaction.d.ts +39 -0
  682. package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -0
  683. package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
  684. package/dist/esm/offlineVault/index.d.ts +6 -0
  685. package/dist/esm/offlineVault/index.d.ts.map +1 -0
  686. package/dist/esm/offlineVault/index.js +4 -0
  687. package/dist/esm/recovery/RecoveryProvider.d.ts +20 -0
  688. package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -0
  689. package/dist/esm/recovery/RecoveryProvider.js +19 -0
  690. package/dist/esm/recovery/backupKeyRecovery.d.ts +172 -0
  691. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -0
  692. package/dist/esm/recovery/backupKeyRecovery.js +404 -0
  693. package/dist/esm/recovery/baseApi.d.ts +24 -0
  694. package/dist/esm/recovery/baseApi.d.ts.map +1 -0
  695. package/dist/esm/recovery/baseApi.js +64 -0
  696. package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
  697. package/dist/esm/recovery/coingeckoApi.d.ts.map +1 -0
  698. package/dist/esm/recovery/coingeckoApi.js +40 -0
  699. package/dist/esm/recovery/crossChainRecovery.d.ts +97 -0
  700. package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -0
  701. package/dist/esm/recovery/crossChainRecovery.js +295 -0
  702. package/dist/esm/recovery/index.d.ts +7 -0
  703. package/dist/{src → esm}/recovery/index.d.ts.map +1 -1
  704. package/dist/esm/recovery/index.js +7 -0
  705. package/dist/esm/recovery/mempoolApi.d.ts +7 -0
  706. package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +1 -1
  707. package/dist/esm/recovery/mempoolApi.js +29 -0
  708. package/dist/esm/recovery/psbt.d.ts +68 -0
  709. package/dist/esm/recovery/psbt.d.ts.map +1 -0
  710. package/dist/esm/recovery/psbt.js +152 -0
  711. package/dist/esm/tnumber.d.ts +4 -0
  712. package/dist/esm/tnumber.d.ts.map +1 -0
  713. package/dist/esm/tnumber.js +9 -0
  714. package/dist/esm/transaction/bip322.d.ts +27 -0
  715. package/dist/esm/transaction/bip322.d.ts.map +1 -0
  716. package/dist/esm/transaction/bip322.js +100 -0
  717. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
  718. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  719. package/dist/esm/transaction/common/verifyPayGoAmount.js +1 -0
  720. package/dist/esm/transaction/decode.d.ts +21 -0
  721. package/dist/esm/transaction/decode.d.ts.map +1 -0
  722. package/dist/esm/transaction/decode.js +39 -0
  723. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
  724. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  725. package/dist/esm/transaction/descriptor/explainPsbt.js +44 -0
  726. package/dist/esm/transaction/descriptor/index.d.ts +7 -0
  727. package/dist/esm/transaction/descriptor/index.d.ts.map +1 -0
  728. package/dist/esm/transaction/descriptor/index.js +6 -0
  729. package/dist/esm/transaction/descriptor/parse.d.ts +18 -0
  730. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
  731. package/dist/esm/transaction/descriptor/parse.js +82 -0
  732. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +14 -0
  733. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  734. package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
  735. package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
  736. package/dist/esm/transaction/descriptor/recipient.d.ts.map +1 -0
  737. package/dist/esm/transaction/descriptor/recipient.js +2 -0
  738. package/dist/esm/transaction/descriptor/signPsbt.d.ts +25 -0
  739. package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -0
  740. package/dist/esm/transaction/descriptor/signPsbt.js +39 -0
  741. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +36 -0
  742. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  743. package/dist/esm/transaction/descriptor/verifyTransaction.js +80 -0
  744. package/dist/esm/transaction/explainTransaction.d.ts +18 -0
  745. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
  746. package/dist/esm/transaction/explainTransaction.js +48 -0
  747. package/dist/esm/transaction/fixedScript/SigningError.d.ts +24 -0
  748. package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -0
  749. package/dist/esm/transaction/fixedScript/SigningError.js +26 -0
  750. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
  751. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  752. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +144 -0
  753. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +47 -0
  754. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  755. package/dist/esm/transaction/fixedScript/explainTransaction.js +2 -0
  756. package/dist/esm/transaction/fixedScript/index.d.ts +8 -0
  757. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
  758. package/dist/esm/transaction/fixedScript/index.js +7 -0
  759. package/dist/esm/transaction/fixedScript/musig2.d.ts +4 -0
  760. package/dist/esm/transaction/fixedScript/musig2.d.ts.map +1 -0
  761. package/dist/esm/transaction/fixedScript/musig2.js +2 -0
  762. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +28 -0
  763. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  764. package/dist/esm/transaction/fixedScript/parseOutput.js +209 -0
  765. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +8 -0
  766. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  767. package/dist/esm/transaction/fixedScript/parseTransaction.js +221 -0
  768. package/dist/esm/transaction/fixedScript/replayProtection.d.ts +10 -0
  769. package/dist/esm/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  770. package/dist/esm/transaction/fixedScript/replayProtection.js +38 -0
  771. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  772. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  773. package/dist/esm/transaction/fixedScript/signPsbtWasm.js +111 -0
  774. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +22 -0
  775. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  776. package/dist/esm/transaction/fixedScript/signTransaction.js +39 -0
  777. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  778. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  779. package/dist/esm/transaction/fixedScript/verifyTransaction.js +176 -0
  780. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  781. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  782. package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
  783. package/dist/esm/transaction/index.d.ts +9 -0
  784. package/dist/esm/transaction/index.d.ts.map +1 -0
  785. package/dist/esm/transaction/index.js +9 -0
  786. package/dist/esm/transaction/outputDifference.d.ts +44 -0
  787. package/dist/esm/transaction/outputDifference.d.ts.map +1 -0
  788. package/dist/esm/transaction/outputDifference.js +45 -0
  789. package/dist/esm/transaction/parseTransaction.d.ts +4 -0
  790. package/dist/esm/transaction/parseTransaction.d.ts.map +1 -0
  791. package/dist/esm/transaction/parseTransaction.js +12 -0
  792. package/dist/esm/transaction/recipient.d.ts +34 -0
  793. package/dist/esm/transaction/recipient.d.ts.map +1 -0
  794. package/dist/esm/transaction/recipient.js +61 -0
  795. package/dist/esm/transaction/signTransaction.d.ts +6 -0
  796. package/dist/esm/transaction/signTransaction.d.ts.map +1 -0
  797. package/dist/esm/transaction/signTransaction.js +66 -0
  798. package/dist/esm/transaction/types.d.ts +47 -0
  799. package/dist/esm/transaction/types.d.ts.map +1 -0
  800. package/dist/esm/transaction/types.js +2 -0
  801. package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
  802. package/dist/esm/transaction/verifyTransaction.d.ts.map +1 -0
  803. package/dist/esm/transaction/verifyTransaction.js +14 -0
  804. package/dist/esm/unspent.d.ts +59 -0
  805. package/dist/esm/unspent.d.ts.map +1 -0
  806. package/dist/esm/unspent.js +15 -0
  807. package/dist/esm/verifyKey.d.ts +22 -0
  808. package/dist/esm/verifyKey.d.ts.map +1 -0
  809. package/dist/esm/verifyKey.js +102 -0
  810. package/dist/esm/wallet.d.ts +15 -0
  811. package/dist/esm/wallet.d.ts.map +1 -0
  812. package/dist/esm/wallet.js +5 -0
  813. package/package.json +48 -20
  814. package/.eslintignore +0 -5
  815. package/CHANGELOG.md +0 -253
  816. package/dist/src/abstractUtxoCoin.d.ts +0 -392
  817. package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
  818. package/dist/src/abstractUtxoCoin.js +0 -931
  819. package/dist/src/config.js +0 -14
  820. package/dist/src/index.d.ts +0 -6
  821. package/dist/src/index.d.ts.map +0 -1
  822. package/dist/src/index.js +0 -18
  823. package/dist/src/parseOutput.d.ts +0 -22
  824. package/dist/src/parseOutput.d.ts.map +0 -1
  825. package/dist/src/parseOutput.js +0 -181
  826. package/dist/src/recovery/RecoveryProvider.d.ts.map +0 -1
  827. package/dist/src/recovery/RecoveryProvider.js +0 -24
  828. package/dist/src/recovery/backupKeyRecovery.d.ts +0 -62
  829. package/dist/src/recovery/backupKeyRecovery.d.ts.map +0 -1
  830. package/dist/src/recovery/backupKeyRecovery.js +0 -293
  831. package/dist/src/recovery/baseApi.d.ts.map +0 -1
  832. package/dist/src/recovery/baseApi.js +0 -73
  833. package/dist/src/recovery/coingeckoApi.d.ts.map +0 -1
  834. package/dist/src/recovery/coingeckoApi.js +0 -47
  835. package/dist/src/recovery/crossChainRecovery.d.ts.map +0 -1
  836. package/dist/src/recovery/crossChainRecovery.js +0 -294
  837. package/dist/src/recovery/mempoolApi.js +0 -33
  838. package/dist/src/recovery/smartbitApi.d.ts +0 -11
  839. package/dist/src/recovery/smartbitApi.d.ts.map +0 -1
  840. package/dist/src/recovery/smartbitApi.js +0 -36
  841. package/dist/src/replayProtection.d.ts +0 -4
  842. package/dist/src/replayProtection.d.ts.map +0 -1
  843. package/dist/src/replayProtection.js +0 -21
  844. package/dist/src/sign.d.ts +0 -31
  845. package/dist/src/sign.d.ts.map +0 -1
  846. package/dist/src/sign.js +0 -104
  847. package/dist/tsconfig.tsbuildinfo +0 -8179
  848. /package/dist/{src → cjs/src}/config.d.ts +0 -0
  849. /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
  850. /package/dist/{src → esm}/config.d.ts.map +0 -0
@@ -0,0 +1,652 @@
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.AbstractUtxoCoin = exports.ErrorDeprecatedTxFormat = void 0;
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const crypto_1 = require("crypto");
9
+ const lodash_1 = __importDefault(require("lodash"));
10
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
11
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
12
+ const recovery_1 = require("./recovery");
13
+ const replayProtection_1 = require("./transaction/fixedScript/replayProtection");
14
+ const config_1 = require("./config");
15
+ const transaction_1 = require("./transaction");
16
+ const verifyTransaction_1 = require("./transaction/descriptor/verifyTransaction");
17
+ const descriptor_1 = require("./descriptor");
18
+ const names_1 = require("./names");
19
+ const fixedScript_1 = require("./address/fixedScript");
20
+ const decode_1 = require("./transaction/decode");
21
+ const keychains_1 = require("./keychains");
22
+ const verifyKey_1 = require("./verifyKey");
23
+ const validatePolicy_1 = require("./descriptor/validatePolicy");
24
+ const signTransaction_1 = require("./transaction/signTransaction");
25
+ const wallet_1 = require("./wallet");
26
+ const descriptorWallet_1 = require("./descriptor/descriptorWallet");
27
+ class ErrorDeprecatedTxFormat extends Error {
28
+ constructor(txFormat) {
29
+ super(`SDK support for txFormat=${txFormat} is deprecated on this environment. Please use psbt instead.`);
30
+ }
31
+ }
32
+ exports.ErrorDeprecatedTxFormat = ErrorDeprecatedTxFormat;
33
+ /**
34
+ * Check if a decoded transaction has at least one taproot key path spend (MuSig2) input.
35
+ */
36
+ function hasKeyPathSpendInput(tx, pubs, coinName) {
37
+ (0, assert_1.default)(pubs && (0, sdk_core_1.isTriple)(pubs), 'pub triple is required to check for key path spend inputs in wasm-utxo PSBT');
38
+ const rootWalletKeys = wasm_utxo_1.fixedScriptWallet.RootWalletKeys.fromXpubs(pubs);
39
+ const replayProtection = { publicKeys: (0, replayProtection_1.getReplayProtectionPubkeys)(coinName) };
40
+ const parsed = tx.parseTransactionWithWalletKeys(rootWalletKeys, { replayProtection });
41
+ return parsed.inputs.some((input) => input.scriptType === 'p2trMusig2KeyPath');
42
+ }
43
+ /**
44
+ * Convert ValidationError to TxIntentMismatchRecipientError with structured data
45
+ *
46
+ * This preserves the structured error information from the original ValidationError
47
+ * by extracting the mismatched outputs and converting them to the standardized format.
48
+ * The original error is preserved as the `cause` for debugging purposes.
49
+ */
50
+ function convertValidationErrorToTxIntentMismatch(error, reqId, txParams, txHex, txExplanation) {
51
+ const mismatchedRecipients = [];
52
+ for (const err of error.errors) {
53
+ if (err instanceof verifyTransaction_1.ErrorMissingOutputs) {
54
+ mismatchedRecipients.push(...err.missingOutputs.map((output) => ({
55
+ address: output.address,
56
+ amount: output.amount.toString(),
57
+ })));
58
+ }
59
+ else if (err instanceof verifyTransaction_1.ErrorImplicitExternalOutputs) {
60
+ mismatchedRecipients.push(...err.implicitExternalOutputs.map((output) => ({
61
+ address: output.address,
62
+ amount: output.amount.toString(),
63
+ })));
64
+ }
65
+ }
66
+ const txIntentError = new sdk_core_1.TxIntentMismatchRecipientError(error.message, reqId, [txParams], txHex, mismatchedRecipients, txExplanation);
67
+ // Preserve the original structured error as the cause for debugging
68
+ // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
69
+ txIntentError.cause = error;
70
+ return txIntentError;
71
+ }
72
+ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
73
+ /**
74
+ * Returns whether this coin is a mainnet coin.
75
+ * Default implementation uses the name property.
76
+ * Can be overridden by subclasses.
77
+ */
78
+ isMainnet() {
79
+ return (0, names_1.isMainnetCoin)(this.name);
80
+ }
81
+ constructor(bitgo, amountType = 'number') {
82
+ super(bitgo);
83
+ this.amountType = amountType;
84
+ }
85
+ getChain() {
86
+ return this.name;
87
+ }
88
+ getFamily() {
89
+ return (0, names_1.getMainnetCoinName)(this.name);
90
+ }
91
+ getFullName() {
92
+ return (0, names_1.getFullNameFromCoinName)(this.name);
93
+ }
94
+ /** Indicates whether the coin supports a block target */
95
+ supportsBlockTarget() {
96
+ // FIXME: the SDK does not seem to use this anywhere so it is unclear what the purpose of this method is
97
+ const mainnet = (0, names_1.getMainnetCoinName)(this.name);
98
+ return mainnet === 'btc' || mainnet === 'doge';
99
+ }
100
+ sweepWithSendMany() {
101
+ return true;
102
+ }
103
+ /** @deprecated */
104
+ static get validAddressTypes() {
105
+ return ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2'];
106
+ }
107
+ /**
108
+ * Returns the factor between the base unit and its smallest subdivison
109
+ * @return {number}
110
+ */
111
+ getBaseFactor() {
112
+ return 1e8;
113
+ }
114
+ /**
115
+ * Check if an address is valid
116
+ * @param address
117
+ * @param param
118
+ */
119
+ isValidAddress(address, param) {
120
+ if (typeof param === 'boolean' && param) {
121
+ throw new Error('deprecated');
122
+ }
123
+ const allowLightning = param?.allowLightning ?? false;
124
+ if (allowLightning) {
125
+ if (/^(02|03)[0-9a-fA-F]{64}$/.test(address)) {
126
+ return true;
127
+ }
128
+ if ((0, sdk_core_1.isBolt11Invoice)(address)) {
129
+ return true;
130
+ }
131
+ }
132
+ // By default, allow all address formats.
133
+ // At the time of writing, the only additional address format is bch cashaddr.
134
+ const anyFormat = param?.anyFormat ?? true;
135
+ try {
136
+ const script = wasm_utxo_1.address.toOutputScriptWithCoin(address, this.name);
137
+ // Determine which format the input address was in by round-tripping
138
+ // through each candidate and checking byte-equality. 'default' is tried
139
+ // first so canonical default-format addresses early-exit.
140
+ for (const format of ['default', 'cashaddr']) {
141
+ try {
142
+ if (wasm_utxo_1.address.fromOutputScriptWithCoin(script, this.name, format) === address) {
143
+ return anyFormat || format === 'default';
144
+ }
145
+ }
146
+ catch {
147
+ // coin doesn't support this format; try the next one
148
+ }
149
+ }
150
+ return false;
151
+ }
152
+ catch (e) {
153
+ return false;
154
+ }
155
+ }
156
+ /**
157
+ * Return boolean indicating whether input is valid public key for the coin.
158
+ *
159
+ * @param {String} pub the pub to be checked
160
+ * @returns {Boolean} is it valid?
161
+ */
162
+ isValidPub(pub) {
163
+ try {
164
+ return wasm_utxo_1.BIP32.fromBase58(pub).isNeutered();
165
+ }
166
+ catch (e) {
167
+ return false;
168
+ }
169
+ }
170
+ /**
171
+ * This is called before crafting the HTTP request to the BitGo API.
172
+ * It converts the recipient address `scriptPubKey:...` to { script: string } | { address: string }.
173
+ */
174
+ preprocessBuildParams(params) {
175
+ if (params.recipients !== undefined) {
176
+ params.recipients =
177
+ params.recipients instanceof Array
178
+ ? params?.recipients?.map((recipient) => {
179
+ const { address, ...rest } = recipient;
180
+ if (address === undefined) {
181
+ return recipient; // Already { script, amount } — pass through unchanged
182
+ }
183
+ return { ...rest, ...(0, transaction_1.fromExtendedAddressFormat)(address) };
184
+ })
185
+ : params.recipients;
186
+ }
187
+ return params;
188
+ }
189
+ /**
190
+ * Get the latest block height
191
+ * @param reqId
192
+ */
193
+ async getLatestBlockHeight(reqId) {
194
+ if (reqId) {
195
+ this.bitgo.setRequestTracer(reqId);
196
+ }
197
+ const chainhead = await this.bitgo.get(this.url('/public/block/latest')).result();
198
+ return chainhead.height;
199
+ }
200
+ checkRecipient(recipient) {
201
+ (0, transaction_1.assertValidTransactionRecipient)(recipient);
202
+ if (recipient.address && !(0, transaction_1.isScriptRecipient)(recipient.address)) {
203
+ super.checkRecipient({ address: recipient.address, amount: recipient.amount });
204
+ }
205
+ }
206
+ /**
207
+ * Run custom coin logic after a transaction prebuild has been received from BitGo
208
+ * @param prebuild
209
+ */
210
+ async postProcessPrebuild(prebuild) {
211
+ const tx = this.decodeTransactionFromPrebuild(prebuild);
212
+ if (lodash_1.default.isUndefined(prebuild.blockHeight)) {
213
+ prebuild.blockHeight = (await this.getLatestBlockHeight());
214
+ }
215
+ return lodash_1.default.extend({}, prebuild, { txHex: (0, decode_1.encodeTransaction)(tx).toString('hex') });
216
+ }
217
+ /**
218
+ * @deprecated - will be removed when we drop support for utxolib
219
+ * Determine an address' type based on its witness and redeem script presence
220
+ * @param addressDetails
221
+ */
222
+ static inferAddressType(addressDetails) {
223
+ return wasm_utxo_1.fixedScriptWallet.ChainCode.is(addressDetails.chain)
224
+ ? wasm_utxo_1.fixedScriptWallet.ChainCode.scriptType(addressDetails.chain)
225
+ : null;
226
+ }
227
+ decodeTransaction(input) {
228
+ const buffer = typeof input === 'string' ? (0, decode_1.stringToBufferTryFormats)(input, ['hex', 'base64']) : input;
229
+ if (!(0, wasm_utxo_1.hasPsbtMagic)(buffer)) {
230
+ throw new ErrorDeprecatedTxFormat('legacy');
231
+ }
232
+ return (0, decode_1.decodePsbt)(buffer, this.name);
233
+ }
234
+ decodeTransactionAsPsbt(input) {
235
+ return this.decodeTransaction(input);
236
+ }
237
+ decodeTransactionFromPrebuild(prebuild) {
238
+ const string = prebuild.txHexPsbt ?? prebuild.txHex ?? prebuild.txBase64;
239
+ if (!string) {
240
+ throw new Error('missing required txHex or txBase64 property');
241
+ }
242
+ return this.decodeTransaction(string);
243
+ }
244
+ /**
245
+ * Extract and fill transaction details such as internal/change spend, external spend (explicit vs. implicit), etc.
246
+ * @param params
247
+ * @returns {*}
248
+ */
249
+ async parseTransaction(params) {
250
+ return (0, transaction_1.parseTransaction)(this, params);
251
+ }
252
+ /**
253
+ * @deprecated - use the exported `verifyUserPublicKey` function instead
254
+ */
255
+ async verifyUserPublicKey(params) {
256
+ return await (0, verifyKey_1.verifyUserPublicKey)(this.bitgo, params);
257
+ }
258
+ /**
259
+ * @deprecated - use function verifyKeySignature instead
260
+ */
261
+ verifyKeySignature(params) {
262
+ return (0, verifyKey_1.verifyKeySignature)(params);
263
+ }
264
+ /**
265
+ * Verify that a transaction prebuild complies with the original intention
266
+ *
267
+ * @param params
268
+ * @param params.txParams params object passed to send
269
+ * @param params.txPrebuild prebuild object returned by server
270
+ * @param params.txPrebuild.txHex prebuilt transaction's txHex form
271
+ * @param params.wallet Wallet object to obtain keys to verify against
272
+ * @param params.verification Object specifying some verification parameters
273
+ * @param params.verification.disableNetworking Disallow fetching any data from the internet for verification purposes
274
+ * @param params.verification.keychains Pass keychains manually rather than fetching them by id
275
+ * @param params.verification.addresses Address details to pass in for out-of-band verification
276
+ * @returns {boolean} True if verification passes
277
+ * @throws {TxIntentMismatchError} if transaction validation fails
278
+ * @throws {TxIntentMismatchRecipientError} if transaction recipients don't match user intent
279
+ */
280
+ async verifyTransaction(params) {
281
+ try {
282
+ return await (0, transaction_1.verifyTransaction)(this, this.bitgo, params);
283
+ }
284
+ catch (error) {
285
+ if (error instanceof verifyTransaction_1.AggregateValidationError) {
286
+ const txExplanation = await sdk_core_1.TxIntentMismatchError.tryGetTxExplanation(this, params.txPrebuild);
287
+ throw convertValidationErrorToTxIntentMismatch(error, params.reqId, params.txParams, params.txPrebuild.txHex, txExplanation);
288
+ }
289
+ throw error;
290
+ }
291
+ }
292
+ /**
293
+ * Make sure an address is valid and throw an error if it's not.
294
+ * @param params.address The address string on the network
295
+ * @param params.addressType
296
+ * @param params.keychains Keychain objects with xpubs
297
+ * @param params.coinSpecific Coin-specific details for the address such as a witness script
298
+ * @param params.chain Derivation chain
299
+ * @param params.index Derivation index
300
+ * @throws {InvalidAddressError}
301
+ * @throws {InvalidAddressDerivationPropertyError}
302
+ * @throws {UnexpectedAddressError}
303
+ */
304
+ async isWalletAddress(params, wallet) {
305
+ const { address, keychains, chain, index } = params;
306
+ if (!this.isValidAddress(address)) {
307
+ throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}`);
308
+ }
309
+ if (wallet && (0, descriptor_1.isDescriptorWallet)(wallet)) {
310
+ if (!keychains) {
311
+ throw new Error('missing required param keychains');
312
+ }
313
+ if (!(0, sdk_core_1.isTriple)(keychains)) {
314
+ throw new Error('keychains must be a triple');
315
+ }
316
+ (0, descriptor_1.assertDescriptorWalletAddress)(this.name, params, (0, descriptor_1.getDescriptorMapFromWallet)(wallet, (0, keychains_1.toBip32Triple)(keychains), (0, validatePolicy_1.getPolicyForEnv)(this.bitgo.env)));
317
+ return true;
318
+ }
319
+ if ((lodash_1.default.isUndefined(chain) && lodash_1.default.isUndefined(index)) || !(lodash_1.default.isFinite(chain) && lodash_1.default.isFinite(index))) {
320
+ throw new sdk_core_1.InvalidAddressDerivationPropertyError(`address validation failure: invalid chain (${chain}) or index (${index})`);
321
+ }
322
+ if (!keychains) {
323
+ throw new Error('missing required param keychains');
324
+ }
325
+ (0, fixedScript_1.assertFixedScriptWalletAddress)(this.name, {
326
+ address,
327
+ keychains,
328
+ format: params.format ?? 'base58',
329
+ chain,
330
+ index,
331
+ });
332
+ return true;
333
+ }
334
+ /**
335
+ * Locally derive a fixed-script (2-of-3 multisig) wallet receive address from the xpub triple
336
+ * and a chain/index, using public keys only (no private keys, no network access). This is the
337
+ * inverse of {@link isWalletAddress}, delegating to the same `generateAddress` used by the
338
+ * verification path, so derive and verify can never diverge.
339
+ *
340
+ * The `chain` code selects the script type (e.g. 0/1 = P2SH, 20/21 = P2WSH/bech32, 30/31 = P2TR);
341
+ * an optional `format` overrides the address encoding.
342
+ * @param params keychains (xpub triple via `pub`), chain, index, and optional format
343
+ * @returns the derived address and the chain/index used
344
+ */
345
+ async deriveAddress(params) {
346
+ const { keychains, chain, index, format } = params;
347
+ if (!keychains) {
348
+ throw new Error('missing required param keychains');
349
+ }
350
+ const address = (0, fixedScript_1.generateAddress)(this.name, {
351
+ // fixed-script (multisig) coins derive from the xpub triple via `pub`
352
+ keychains: keychains,
353
+ chain,
354
+ index,
355
+ format,
356
+ });
357
+ return { address, chain, index };
358
+ }
359
+ /**
360
+ * @param addressType
361
+ * @returns true iff coin supports spending from unspentType
362
+ */
363
+ supportsAddressType(addressType) {
364
+ return wasm_utxo_1.fixedScriptWallet.supportsScriptType(this.name, addressType);
365
+ }
366
+ /** inherited doc */
367
+ getDefaultMultisigType() {
368
+ return sdk_core_1.multisigTypes.onchain;
369
+ }
370
+ /**
371
+ * @param chain
372
+ * @return true iff coin supports spending from chain
373
+ */
374
+ supportsAddressChain(chain) {
375
+ return (wasm_utxo_1.fixedScriptWallet.ChainCode.is(chain) &&
376
+ this.supportsAddressType(wasm_utxo_1.fixedScriptWallet.ChainCode.scriptType(chain)));
377
+ }
378
+ keyIdsForSigning() {
379
+ return [sdk_core_1.KeyIndices.USER, sdk_core_1.KeyIndices.BACKUP, sdk_core_1.KeyIndices.BITGO];
380
+ }
381
+ /**
382
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs.
383
+ * @param psbt all MuSig2 inputs should contain user MuSig2 nonce
384
+ * @param walletId
385
+ */
386
+ async getMusig2Nonces(psbt, walletId) {
387
+ const buffer = (0, decode_1.encodeTransaction)(psbt);
388
+ const response = await this.bitgo
389
+ .post(this.url('/wallet/' + walletId + '/tx/signpsbt'))
390
+ .send({ psbt: buffer.toString('hex') })
391
+ .result();
392
+ return (0, decode_1.decodePsbt)(response.psbt, this.name);
393
+ }
394
+ /**
395
+ * @deprecated Use getMusig2Nonces instead
396
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs.
397
+ * @param psbtHex all MuSig2 inputs should contain user MuSig2 nonce
398
+ * @param walletId
399
+ */
400
+ async signPsbt(psbtHex, walletId) {
401
+ const psbt = await this.getMusig2Nonces(this.decodeTransactionAsPsbt(psbtHex), walletId);
402
+ return { psbt: (0, decode_1.encodeTransaction)(psbt).toString('hex') };
403
+ }
404
+ /**
405
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs from OVC.
406
+ * @param ovcJson JSON object provided by OVC with fields psbtHex and walletId
407
+ */
408
+ async signPsbtFromOVC(ovcJson) {
409
+ (0, assert_1.default)(ovcJson['psbtHex'], 'ovcJson must contain psbtHex');
410
+ (0, assert_1.default)(ovcJson['walletId'], 'ovcJson must contain walletId');
411
+ const hex = ovcJson['psbtHex'];
412
+ const walletId = ovcJson['walletId'];
413
+ const psbt = await this.getMusig2Nonces(this.decodeTransactionAsPsbt(hex), walletId);
414
+ return lodash_1.default.extend(ovcJson, { txHex: (0, decode_1.encodeTransaction)(psbt).toString('hex') });
415
+ }
416
+ /**
417
+ * Assemble keychain and half-sign prebuilt transaction
418
+ * @param params - {@see SignTransactionOptions}
419
+ * @returns {Promise<SignedTransaction | HalfSignedUtxoTransaction>}
420
+ */
421
+ async signTransaction(params) {
422
+ return (0, signTransaction_1.signTransaction)(this, this.bitgo, params);
423
+ }
424
+ /**
425
+ * Sign a transaction with a custom signing function. Example use case is express external signer
426
+ * @param customSigningFunction custom signing function that returns a single signed transaction
427
+ * @param signTransactionParams parameters for custom signing function. Includes txPrebuild and pubs
428
+ *
429
+ * @returns signed transaction as hex string
430
+ */
431
+ async signWithCustomSigningFunction(customSigningFunction, signTransactionParams) {
432
+ const txHex = signTransactionParams.txPrebuild.txHex;
433
+ (0, assert_1.default)(txHex, 'missing txHex parameter');
434
+ const tx = this.decodeTransaction(txHex);
435
+ const isTxWithKeyPathSpendInput = hasKeyPathSpendInput(tx, signTransactionParams.pubs, this.name);
436
+ if (!isTxWithKeyPathSpendInput) {
437
+ return await customSigningFunction({ ...signTransactionParams, coin: this });
438
+ }
439
+ const getTxHex = (v) => {
440
+ if ('txHex' in v) {
441
+ return v.txHex;
442
+ }
443
+ throw new Error('txHex not found in signTransaction result');
444
+ };
445
+ const signerNonceTx = await customSigningFunction({
446
+ ...signTransactionParams,
447
+ signingStep: 'signerNonce',
448
+ coin: this,
449
+ });
450
+ const { pubs } = signTransactionParams;
451
+ (0, assert_1.default)(pubs === undefined || (0, sdk_core_1.isTriple)(pubs));
452
+ const cosignerNonceTx = await this.signTransaction({
453
+ ...signTransactionParams,
454
+ pubs,
455
+ txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(signerNonceTx) },
456
+ signingStep: 'cosignerNonce',
457
+ });
458
+ return await customSigningFunction({
459
+ ...signTransactionParams,
460
+ txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(cosignerNonceTx) },
461
+ signingStep: 'signerSignature',
462
+ coin: this,
463
+ });
464
+ }
465
+ /**
466
+ * @param unspent
467
+ * @returns {boolean}
468
+ */
469
+ isBitGoTaintedUnspent(unspent) {
470
+ return (0, replayProtection_1.isReplayProtectionUnspent)(unspent, this.name);
471
+ }
472
+ /**
473
+ * Decompose a raw psbt/transaction into useful information, such as the total amounts,
474
+ * change amounts, and transaction outputs.
475
+ * @param params
476
+ */
477
+ async explainTransaction(params, wallet) {
478
+ if (!params.pubs) {
479
+ // if no pubs are provided, opportunistically fetch the keychains from the wallet
480
+ if (wallet) {
481
+ const keychains = await (0, keychains_1.fetchKeychains)(this, wallet);
482
+ params.pubs = (0, keychains_1.toBip32Triple)(keychains).map((k) => k.neutered().toBase58());
483
+ }
484
+ }
485
+ if (wallet && (0, descriptor_1.isDescriptorWallet)(wallet)) {
486
+ // Descriptor wallets decode prebuild bytes straight into the wasm-utxo
487
+ // descriptor Psbt, skipping the fixedScriptWallet.BitGoPsbt intermediate.
488
+ return (0, transaction_1.explainTx)((0, decode_1.decodeDescriptorPsbt)(params), { ...params, wallet }, this.name);
489
+ }
490
+ return (0, transaction_1.explainTx)(this.decodeTransactionFromPrebuild(params), { ...params, wallet }, this.name);
491
+ }
492
+ /**
493
+ * @deprecated - use {@see backupKeyRecovery}
494
+ * Builds a funds recovery transaction without BitGo
495
+ * @param params - {@see backupKeyRecovery}
496
+ */
497
+ async recover(params) {
498
+ return (0, recovery_1.backupKeyRecovery)(this, this.bitgo, params);
499
+ }
500
+ async recoverV1(params) {
501
+ return (0, recovery_1.v1BackupKeyRecovery)(this, this.bitgo, params);
502
+ }
503
+ async sweepV1(params) {
504
+ return (0, recovery_1.v1Sweep)(this, this.bitgo, params);
505
+ }
506
+ /**
507
+ * Recover coin that was sent to wrong chain
508
+ * @param params
509
+ * @param params.txid The txid of the faulty transaction
510
+ * @param params.recoveryAddress address to send recovered funds to
511
+ * @param params.wallet the wallet that received the funds
512
+ * @param params.recoveryCoin the coin type of the wallet that received the funds
513
+ * @param params.signed return a half-signed transaction (default=true)
514
+ * @param params.walletPassphrase the wallet passphrase
515
+ * @param params.xprv the unencrypted xprv (used instead of wallet passphrase)
516
+ * @param params.apiKey for utxo coins other than [BTC,TBTC] this is a Block Chair api key
517
+ * @returns {*}
518
+ */
519
+ async recoverFromWrongChain(params) {
520
+ const { txid, recoveryAddress, wallet, walletPassphrase, xprv, apiKey } = params;
521
+ // params.recoveryCoin used to be params.coin, backwards compatibility
522
+ const recoveryCoin = params.coin || params.recoveryCoin;
523
+ if (!recoveryCoin) {
524
+ throw new Error('missing required object recoveryCoin');
525
+ }
526
+ // signed should default to true, and only be disabled if explicitly set to false (not undefined)
527
+ const signed = params.signed !== false;
528
+ const sourceCoinFamily = this.getFamily();
529
+ const recoveryCoinFamily = recoveryCoin.getFamily();
530
+ const supportedRecoveryCoins = config_1.supportedCrossChainRecoveries[sourceCoinFamily];
531
+ if (lodash_1.default.isUndefined(supportedRecoveryCoins) || !supportedRecoveryCoins.includes(recoveryCoinFamily)) {
532
+ throw new Error(`Recovery of ${sourceCoinFamily} balances from ${recoveryCoinFamily} wallets is not supported.`);
533
+ }
534
+ return await (0, recovery_1.recoverCrossChain)(this.bitgo, {
535
+ sourceCoin: this,
536
+ recoveryCoin,
537
+ walletId: wallet,
538
+ txid,
539
+ recoveryAddress,
540
+ walletPassphrase: signed ? walletPassphrase : undefined,
541
+ xprv: signed ? xprv : undefined,
542
+ apiKey,
543
+ });
544
+ }
545
+ /**
546
+ * Generate bip32 key pair
547
+ *
548
+ * @param seed
549
+ * @returns {Object} object with generated pub and prv
550
+ */
551
+ generateKeyPair(seed) {
552
+ if (!seed) {
553
+ // An extended private key has both a normal 256 bit private key and a 256
554
+ // bit chain code, both of which must be random. 512 bits is therefore the
555
+ // maximum entropy and gives us maximum security against cracking.
556
+ seed = (0, crypto_1.randomBytes)(512 / 8);
557
+ }
558
+ const extendedKey = wasm_utxo_1.BIP32.fromSeed(seed);
559
+ return {
560
+ pub: extendedKey.neutered().toBase58(),
561
+ prv: extendedKey.toBase58(),
562
+ };
563
+ }
564
+ /**
565
+ * Determines the default transaction format based on wallet properties and network
566
+ * @param wallet - The wallet to check
567
+ * @param requestedFormat - Optional explicitly requested format
568
+ * @returns The transaction format to use, or undefined if no default applies
569
+ */
570
+ getDefaultTxFormat(wallet, requestedFormat) {
571
+ if (requestedFormat === 'legacy') {
572
+ return 'psbt-lite';
573
+ }
574
+ return requestedFormat ?? 'psbt-lite';
575
+ }
576
+ async getExtraPrebuildParams(buildParams) {
577
+ const requestedFormat = buildParams.txFormat;
578
+ const txFormat = this.getDefaultTxFormat(buildParams.wallet, requestedFormat);
579
+ let changeAddressType = buildParams.changeAddressType;
580
+ // if the addressType is not specified, we need to default to p2trMusig2 for testnet hot wallets for staged rollout of p2trMusig2
581
+ if (buildParams.addressType === undefined && // addressType is deprecated and replaced by `changeAddress`
582
+ buildParams.changeAddressType === undefined &&
583
+ buildParams.changeAddress === undefined &&
584
+ buildParams.wallet.type() === 'hot') {
585
+ changeAddressType = ['p2trMusig2', 'p2wsh', 'p2shP2wsh', 'p2sh', 'p2tr'];
586
+ }
587
+ // getHalfSignedLegacyFormat() only supports p2ms-based types (p2sh, p2shP2wsh, p2wsh).
588
+ // Filter change outputs and restrict input selection to these types.
589
+ const legacyCompatibleTypes = ['p2sh', 'p2shP2wsh', 'p2wsh'];
590
+ let allowedInputScriptTypes;
591
+ if (requestedFormat === 'legacy') {
592
+ allowedInputScriptTypes = legacyCompatibleTypes;
593
+ if (Array.isArray(changeAddressType)) {
594
+ changeAddressType = changeAddressType.filter((t) => legacyCompatibleTypes.includes(t));
595
+ }
596
+ else if (changeAddressType !== undefined && !legacyCompatibleTypes.includes(changeAddressType)) {
597
+ changeAddressType = legacyCompatibleTypes;
598
+ }
599
+ }
600
+ return {
601
+ txFormat,
602
+ changeAddressType,
603
+ allowedInputScriptTypes,
604
+ };
605
+ }
606
+ preCreateBitGo(params) {
607
+ return;
608
+ }
609
+ async presignTransaction(params) {
610
+ if (params.walletData && (0, wallet_1.isUtxoWalletData)(params.walletData) && (0, descriptorWallet_1.isDescriptorWalletData)(params.walletData)) {
611
+ return params;
612
+ }
613
+ const returnLegacyFormat = params.txFormat === 'legacy';
614
+ return { ...params, returnLegacyFormat };
615
+ }
616
+ async supplementGenerateWallet(walletParams, keychains) {
617
+ return walletParams;
618
+ }
619
+ transactionDataAllowed() {
620
+ return false;
621
+ }
622
+ valuelessTransferAllowed() {
623
+ return false;
624
+ }
625
+ prepareColdTransaction(txPrebuild, keychains) {
626
+ // PSBTs already carry BIP-32 derivation info inline, so offline signers do not need the extra information
627
+ if (typeof txPrebuild.txHex === 'string' && (0, wasm_utxo_1.hasPsbtMagic)((0, decode_1.stringToBufferTryFormats)(txPrebuild.txHex, ['hex']))) {
628
+ return txPrebuild;
629
+ }
630
+ return super.prepareColdTransaction(txPrebuild, keychains);
631
+ }
632
+ getRecoveryProvider(apiToken) {
633
+ return (0, recovery_1.forCoin)(this.getChain(), apiToken);
634
+ }
635
+ /** @inheritDoc */
636
+ auditDecryptedKey({ multiSigType, publicKey, prv, }) {
637
+ if (multiSigType === 'tss') {
638
+ throw new Error('tss auditing is not supported for this coin');
639
+ }
640
+ if (!(0, sdk_core_1.isValidPrv)(prv) && !(0, sdk_core_1.isValidXprv)(prv)) {
641
+ throw new Error('invalid private key');
642
+ }
643
+ if (publicKey) {
644
+ const genPubKey = wasm_utxo_1.BIP32.fromBase58(prv).neutered().toBase58();
645
+ if (genPubKey !== publicKey) {
646
+ throw new Error('public key does not match private key');
647
+ }
648
+ }
649
+ }
650
+ }
651
+ exports.AbstractUtxoCoin = AbstractUtxoCoin;
652
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBcUM7QUFFckMsb0RBQXVCO0FBQ3ZCLGdEQUFrRztBQUNsRyxtREEwQzhCO0FBRTlCLHlDQVlvQjtBQUNwQixpRkFBbUg7QUFDbkgscUNBQXlEO0FBQ3pELCtDQU91QjtBQUd2QixrRkFJb0Q7QUFDcEQsNkNBQTZHO0FBQzdHLG1DQUF3SDtBQUN4SCx1REFBd0Y7QUFFeEYsaURBQXFIO0FBQ3JILDJDQUEwRTtBQUMxRSwyQ0FBc0U7QUFDdEUsZ0VBQThEO0FBQzlELG1FQUFnRTtBQUNoRSxxQ0FBd0Q7QUFDeEQsb0VBQXVFO0FBa0J2RSxNQUFhLHVCQUF3QixTQUFRLEtBQUs7SUFDaEQsWUFBWSxRQUFrQjtRQUM1QixLQUFLLENBQUMsNEJBQTRCLFFBQVEsOERBQThELENBQUMsQ0FBQztJQUM1RyxDQUFDO0NBQ0Y7QUFKRCwwREFJQztBQTJCRDs7R0FFRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLEVBQStCLEVBQy9CLElBQTBCLEVBQzFCLFFBQXNCO0lBRXRCLElBQUEsZ0JBQU0sRUFBQyxJQUFJLElBQUksSUFBQSxtQkFBUSxFQUFDLElBQUksQ0FBQyxFQUFFLDZFQUE2RSxDQUFDLENBQUM7SUFDOUcsTUFBTSxjQUFjLEdBQUcsNkJBQWlCLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RSxNQUFNLGdCQUFnQixHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUEsNkNBQTBCLEVBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUM5RSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsOEJBQThCLENBQUMsY0FBYyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLE9BQU8sTUFBTSxDQUFD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SUFDbEIsaUJBQWlCLENBQUMsRUFDaEIsWUFBWSxFQUNaLFNBQVMsRUFDVCxHQUFHLEdBS0o7UUFDQyxJQUFJLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFBLHFCQUFVLEVBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBLHNCQUFXLEVBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLFNBQVMsR0FBRyxpQkFBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5RCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBL3NCRCw0Q0Erc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcywgQklQMzIsIGZpeGVkU2NyaXB0V2FsbGV0LCBoYXNQc2J0TWFnaWMgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7XG4gIEFkZHJlc3NDb2luU3BlY2lmaWMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIENvbGRUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBDcmVhdGVBZGRyZXNzRm9ybWF0LFxuICBFeHRyYVByZWJ1aWxkUGFyYW1zT3B0aW9ucyxcbiAgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbixcbiAgSUJhc2VDb2luLFxuICBpc0JvbHQxMUludm9pY2UsXG4gIEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBpc1RyaXBsZSxcbiAgSVdhbGxldCxcbiAgS2V5Y2hhaW4sXG4gIEtleWNoYWluc1RyaXBsZXQsXG4gIEtleUluZGljZXMsXG4gIE1pc21hdGNoZWRSZWNpcGllbnQsXG4gIE11bHRpc2lnVHlwZSxcbiAgbXVsdGlzaWdUeXBlcyxcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVjcmVhdGVCaXRHb09wdGlvbnMsXG4gIFByZXNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEJyaWRnaW5nUGFyYW1zLFxuICBSZXF1ZXN0VHJhY2VyLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgVHhJbnRlbnRNaXNtYXRjaEVycm9yLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICBUcmFuc2FjdGlvblBhcmFtcyBhcyBCYXNlVHJhbnNhY3Rpb25QYXJhbXMsXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQgYXMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFRyaXBsZSxcbiAgVHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yLFxuICBWZXJpZmljYXRpb25PcHRpb25zLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyBhcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXQsXG4gIGlzVmFsaWRQcnYsXG4gIGlzVmFsaWRYcHJ2LFxuICBEZXJpdmVBZGRyZXNzT3B0aW9ucyxcbiAgRGVyaXZlQWRkcmVzc1Jlc3VsdCxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQge1xuICBiYWNrdXBLZXlSZWNvdmVyeSxcbiAgQ3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkLFxuICBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZCxcbiAgZm9yQ29pbixcbiAgcmVjb3ZlckNyb3NzQ2hhaW4sXG4gIFJlY292ZXJQYXJhbXMsXG4gIFJlY292ZXJ5UHJvdmlkZXIsXG4gIHYxQmFja3VwS2V5UmVjb3ZlcnksXG4gIFYxUmVjb3ZlclBhcmFtcyxcbiAgdjFTd2VlcCxcbiAgVjFTd2VlcFBhcmFtcyxcbn0gZnJvbSAnLi9yZWNvdmVyeSc7XG5pbXBvcnQgeyBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cywgaXNSZXBsYXlQcm90ZWN0aW9uVW5zcGVudCB9IGZyb20gJy4vdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvcmVwbGF5UHJvdGVjdGlvbic7XG5pbXBvcnQgeyBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3ZlcmllcyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7XG4gIGFzc2VydFZhbGlkVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIGV4cGxhaW5UeCxcbiAgZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdCxcbiAgaXNTY3JpcHRSZWNpcGllbnQsXG4gIHBhcnNlVHJhbnNhY3Rpb24sXG4gIHZlcmlmeVRyYW5zYWN0aW9uLFxufSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB0eXBlIHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvZXhwbGFpblRyYW5zYWN0aW9uJztcbmltcG9ydCB7IE11c2lnMlBhcnRpY2lwYW50IH0gZnJvbSAnLi90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9tdXNpZzInO1xuaW1wb3J0IHtcbiAgQWdncmVnYXRlVmFsaWRhdGlvbkVycm9yLFxuICBFcnJvck1pc3NpbmdPdXRwdXRzLFxuICBFcnJvckltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzLFxufSBmcm9tICcuL3RyYW5zYWN0aW9uL2Rlc2NyaXB0b3IvdmVyaWZ5VHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgYXNzZXJ0RGVzY3JpcHRvcldhbGxldEFkZHJlc3MsIGdldERlc2NyaXB0b3JNYXBGcm9tV2FsbGV0LCBpc0Rlc2NyaXB0b3JXYWxsZXQgfSBmcm9tICcuL2Rlc2NyaXB0b3InO1xuaW1wb3J0IHsgZ2V0RnVsbE5hbWVGcm9tQ29pbk5hbWUsIGdldE1haW5uZXRDb2luTmFtZSwgaXNNYWlubmV0Q29pbiwgVXR4b0NvaW5OYW1lLCBVdHhvQ29pbk5hbWVNYWlubmV0IH0gZnJvbSAnLi9uYW1lcyc7XG5pbXBvcnQgeyBhc3NlcnRGaXhlZFNjcmlwdFdhbGxldEFkZHJlc3MsIGdlbmVyYXRlQWRkcmVzcyB9IGZyb20gJy4vYWRkcmVzcy9maXhlZFNjcmlwdCc7XG5pbXBvcnQgeyBQYXJzZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24vdHlwZXMnO1xuaW1wb3J0IHsgZGVjb2RlRGVzY3JpcHRvclBzYnQsIGRlY29kZVBzYnQsIGVuY29kZVRyYW5zYWN0aW9uLCBzdHJpbmdUb0J1ZmZlclRyeUZvcm1hdHMgfSBmcm9tICcuL3RyYW5zYWN0aW9uL2RlY29kZSc7XG5pbXBvcnQgeyBmZXRjaEtleWNoYWlucywgdG9CaXAzMlRyaXBsZSwgVXR4b0tleWNoYWluIH0gZnJvbSAnLi9rZXljaGFpbnMnO1xuaW1wb3J0IHsgdmVyaWZ5S2V5U2lnbmF0dXJlLCB2ZXJpZnlVc2VyUHVibGljS2V5IH0gZnJvbSAnLi92ZXJpZnlLZXknO1xuaW1wb3J0IHsgZ2V0UG9saWN5Rm9yRW52IH0gZnJvbSAnLi9kZXNjcmlwdG9yL3ZhbGlkYXRlUG9saWN5JztcbmltcG9ydCB7IHNpZ25UcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24vc2lnblRyYW5zYWN0aW9uJztcbmltcG9ydCB7IGlzVXR4b1dhbGxldERhdGEsIFV0eG9XYWxsZXQgfSBmcm9tICcuL3dhbGxldCc7XG5pbXBvcnQgeyBpc0Rlc2NyaXB0b3JXYWxsZXREYXRhIH0gZnJvbSAnLi9kZXNjcmlwdG9yL2Rlc2NyaXB0b3JXYWxsZXQnO1xuaW1wb3J0IHR5cGUgeyBVbnNwZW50IH0gZnJvbSAnLi91bnNwZW50JztcblxudHlwZSBTY3JpcHRUeXBlMk9mMyA9ICdwMnNoJyB8ICdwMnNoUDJ3c2gnIHwgJ3Ayd3NoJyB8ICdwMnRyJyB8ICdwMnRyTXVzaWcyJztcblxuZXhwb3J0IHR5cGUgVHhGb3JtYXQgPVxuICAvLyBUaGlzIGlzIGEgbGVnYWN5IHRyYW5zYWN0aW9uIGZvcm1hdCBiYXNlZCBhcm91bmQgdGhlIGJpdGNvaW5qcy1saWIgc2VyaWFsaXphdGlvbiBvZiB1bnNpZ25lZCB0cmFuc2FjdGlvbnNcbiAgLy8gZG9lcyBub3QgaW5jbHVkZSBwcmV2T3V0IGRhdGEgYW5kIGlzIGEgYml0IHBhaW5mdWwgdG8gd29yayB3aXRoXG4gIC8vIGdvaW5nIHRvIGJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgcHNidFxuICAvLyBAZGVwcmVjYXRlZFxuICB8ICdsZWdhY3knXG4gIC8vIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHBzYnQgZm9ybWF0LCBpbmNsdWRpbmcgdGhlIGZ1bGwgcHJldlR4IGRhdGEgZm9yIGxlZ2FjeSB0cmFuc2FjdGlvbnMuXG4gIC8vIFRoaXMgd2lsbCByZW1haW4gc3VwcG9ydGVkIGJ1dCBpcyBub3QgdGhlIGRlZmF1bHQsIHNpbmNlIHRoZSBkYXRhIHNpemVzIGNhbiBiZWNvbWUgcHJvaGliaXRpdmVseSBsYXJnZS5cbiAgfCAncHNidCdcbiAgLy8gVGhpcyBpcyBhIG5vbnN0YW5kYXJkIHBzYnQgdmVyc2lvbiB3aGVyZSBsZWdhY3kgaW5wdXRzIGFyZSBzZXJpYWxpemVkIGFzIGlmIHRoZXkgd2VyZSBzZWd3aXQgaW5wdXRzLlxuICAvLyBXaGlsZSB0aGlzIHByZXZlbnRzIHVzIHRvIGZ1bGx5IHZlcmlmeSB0aGUgdHJhbnNhY3Rpb24gZmVlLCB3ZSBoYXZlIG90aGVyIGNoZWNrcyBpbiBwbGFjZSB0byBlbnN1cmUgdGhlIGZlZSBpcyB3aXRoaW4gYm91bmRzLlxuICB8ICdwc2J0LWxpdGUnO1xuXG5leHBvcnQgY2xhc3MgRXJyb3JEZXByZWNhdGVkVHhGb3JtYXQgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHR4Rm9ybWF0OiBUeEZvcm1hdCkge1xuICAgIHN1cGVyKGBTREsgc3VwcG9ydCBmb3IgdHhGb3JtYXQ9JHt0eEZvcm1hdH0gaXMgZGVwcmVjYXRlZCBvbiB0aGlzIGVudmlyb25tZW50LiBQbGVhc2UgdXNlIHBzYnQgaW5zdGVhZC5gKTtcbiAgfVxufVxuXG50eXBlIFV0eG9DdXN0b21TaWduaW5nRnVuY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4gPSB7XG4gIChwYXJhbXM6IHtcbiAgICBjb2luOiBJQmFzZUNvaW47XG4gICAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjtcbiAgICBwdWJzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogc2lnbmluZ1N0ZXAgZmxhZyBiZWNvbWVzIGFwcGxpY2FibGUgd2hlbiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICAgICAqIDEpIFdoZW4gdGhlIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIGlzIGFjdGl2YXRlZFxuICAgICAqIDIpIFdoZW4gdGhlIFBTQlQgaW5jbHVkZXMgYXQgbGVhc3Qgb25lIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXQuXG4gICAgICpcbiAgICAgKiBUaGUgc2lnbmluZyBwcm9jZXNzIG9mIGEgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dCBpcyBhIDQtc3RlcCBzZXF1ZW5jZTpcbiAgICAgKiBpKSB1c2VyIG5vbmNlIGdlbmVyYXRpb24gLSBzaWduZXJOb25jZSAtIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8gZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgc2lnblRyYW5zYWN0aW9uXG4gICAgICogaWkpIGJpdGdvIG5vbmNlIGdlbmVyYXRpb24gLSBjb3NpZ25lck5vbmNlIC0gdGhpcyBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgY2FsbCB0byBsb2NhbCBzaWduVHJhbnNhY3Rpb25cbiAgICAgKiBpaWkpIHVzZXIgc2lnbmF0dXJlIC0gc2lnbmVyU2lnbmF0dXJlIC0gdGhpcyBpcyB0aGUgc2Vjb25kIGNhbGwgdG8gZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgc2lnblRyYW5zYWN0aW9uXG4gICAgICogaXYpIGJpdGdvIHNpZ25hdHVyZSAtIG5vdCBpbiBzaWduVHJhbnNhY3Rpb24gbWV0aG9k4oCZcyBzY29wZVxuICAgICAqXG4gICAgICogSW4gdGhlIGFic2VuY2Ugb2YgdGhpcyBmbGFnLCB0aGUgYWZvcmVtZW50aW9uZWQgZmlyc3QgdGhyZWUgc2VxdWVuY2UgaXMgZXhlY3V0ZWQgaW4gYSBzaW5nbGUgc2lnblRyYW5zYWN0aW9uIGNhbGwuXG4gICAgICpcbiAgICAgKiBOT1RFOiBXZSBtYWtlIGEgc3Ryb25nIGFzc3VtcHRpb24gdGhhdCB0aGUgZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgYW5kIGl0cyBjYWxsZXIgdXNlcyBzdGlja3kgc2Vzc2lvbnMsXG4gICAgICogc2luY2UgUFNCVHMgYXJlIGNhY2hlZCBpbiBzdGVwIDEgdG8gYmUgdXNlZCBpbiBzdGVwIDMgZm9yIE11U2lnMiB1c2VyIHNlY3VyZSBub25jZSBhY2Nlc3MuXG4gICAgICovXG4gICAgc2lnbmluZ1N0ZXA/OiAnc2lnbmVyTm9uY2UnIHwgJ3NpZ25lclNpZ25hdHVyZScgfCAnY29zaWduZXJOb25jZSc7XG4gIH0pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPjtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBkZWNvZGVkIHRyYW5zYWN0aW9uIGhhcyBhdCBsZWFzdCBvbmUgdGFwcm9vdCBrZXkgcGF0aCBzcGVuZCAoTXVTaWcyKSBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gaGFzS2V5UGF0aFNwZW5kSW5wdXQoXG4gIHR4OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIHB1YnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICBjb2luTmFtZTogVXR4b0NvaW5OYW1lXG4pOiBib29sZWFuIHtcbiAgYXNzZXJ0KHB1YnMgJiYgaXNUcmlwbGUocHVicyksICdwdWIgdHJpcGxlIGlzIHJlcXVpcmVkIHRvIGNoZWNrIGZvciBrZXkgcGF0aCBzcGVuZCBpbnB1dHMgaW4gd2FzbS11dHhvIFBTQlQnKTtcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cy5mcm9tWHB1YnMocHVicyk7XG4gIGNvbnN0IHJlcGxheVByb3RlY3Rpb24gPSB7IHB1YmxpY0tleXM6IGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzKGNvaW5OYW1lKSB9O1xuICBjb25zdCBwYXJzZWQgPSB0eC5wYXJzZVRyYW5zYWN0aW9uV2l0aFdhbGxldEtleXMocm9vdFdhbGxldEtleXMsIHsgcmVwbGF5UHJvdGVjdGlvbiB9KTtcbiAgcmV0dXJuIHBhcnNlZC5pbnB1dHMuc29tZSgoaW5wdXQpID0+IGlucHV0LnNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyS2V5UGF0aCcpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgVmFsaWRhdGlvbkVycm9yIHRvIFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvciB3aXRoIHN0cnVjdHVyZWQgZGF0YVxuICpcbiAqIFRoaXMgcHJlc2VydmVzIHRoZSBzdHJ1Y3R1cmVkIGVycm9yIGluZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIFZhbGlkYXRpb25FcnJvclxuICogYnkgZXh0cmFjdGluZyB0aGUgbWlzbWF0Y2hlZCBvdXRwdXRzIGFuZCBjb252ZXJ0aW5nIHRoZW0gdG8gdGhlIHN0YW5kYXJkaXplZCBmb3JtYXQuXG4gKiBUaGUgb3JpZ2luYWwgZXJyb3IgaXMgcHJlc2VydmVkIGFzIHRoZSBgY2F1c2VgIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRWYWxpZGF0aW9uRXJyb3JUb1R4SW50ZW50TWlzbWF0Y2goXG4gIGVycm9yOiBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIHJlcUlkOiBzdHJpbmcgfCBJUmVxdWVzdFRyYWNlciB8IHVuZGVmaW5lZCxcbiAgdHhQYXJhbXM6IEJhc2VUcmFuc2FjdGlvblBhcmFtcyxcbiAgdHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHhFeHBsYW5hdGlvbj86IHVua25vd25cbik6IFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvciB7XG4gIGNvbnN0IG1pc21hdGNoZWRSZWNpcGllbnRzOiBNaXNtYXRjaGVkUmVjaXBpZW50W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVyciBvZiBlcnJvci5lcnJvcnMpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3JNaXNzaW5nT3V0cHV0cykge1xuICAgICAgbWlzbWF0Y2hlZFJlY2lwaWVudHMucHVzaChcbiAgICAgICAgLi4uZXJyLm1pc3NpbmdPdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogb3V0cHV0LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvckltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzKSB7XG4gICAgICBtaXNtYXRjaGVkUmVjaXBpZW50cy5wdXNoKFxuICAgICAgICAuLi5lcnIuaW1wbGljaXRFeHRlcm5hbE91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiBvdXRwdXQuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIH0pKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0eEludGVudEVycm9yID0gbmV3IFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcihcbiAgICBlcnJvci5tZXNzYWdlLFxuICAgIHJlcUlkLFxuICAgIFt0eFBhcmFtc10sXG4gICAgdHhIZXgsXG4gICAgbWlzbWF0Y2hlZFJlY2lwaWVudHMsXG4gICAgdHhFeHBsYW5hdGlvblxuICApO1xuICAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc3RydWN0dXJlZCBlcnJvciBhcyB0aGUgY2F1c2UgZm9yIGRlYnVnZ2luZ1xuICAvLyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yL2NhdXNlXG4gICh0eEludGVudEVycm9yIGFzIEVycm9yICYgeyBjYXVzZT86IEVycm9yIH0pLmNhdXNlID0gZXJyb3I7XG4gIHJldHVybiB0eEludGVudEVycm9yO1xufVxuXG5leHBvcnQgdHlwZSB7IERlY29kZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBVdHhvQ29pblNwZWNpZmljID0gQWRkcmVzc0NvaW5TcGVjaWZpYyB8IERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUFkZHJlc3NPcHRpb25zPFRDb2luU3BlY2lmaWMgZXh0ZW5kcyBVdHhvQ29pblNwZWNpZmljPiBleHRlbmRzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyB7XG4gIGNoYWluPzogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xuICBjb2luU3BlY2lmaWM/OiBUQ29pblNwZWNpZmljO1xufVxuXG5leHBvcnQgdHlwZSBCaXAzMjJNZXNzYWdlID0ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25JbmZvPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgLyoqIE1hcHMgdHhpZCB0byB0eGhleC4gUmVxdWlyZWQgZm9yIG9mZmxpbmUgc2lnbmluZy4gKi9cbiAgdHhIZXhlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNoYW5nZUFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuICAvKiogcHNidCBkb2VzIG5vdCByZXF1aXJlIHVuc3BlbnRzLiAqL1xuICB1bnNwZW50cz86IFVuc3BlbnQ8VE51bWJlcj5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBmZWVJbmZvPzogc3RyaW5nO1xuICBwdWJzPzogVHJpcGxlPHN0cmluZz47XG4gIGN1c3RvbUNoYW5nZVhwdWJzPzogVHJpcGxlPHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdGVkRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj4ge1xuICBjaGFuZ2VJbmZvPzogeyBhZGRyZXNzOiBzdHJpbmc7IGNoYWluOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25QcmVidWlsZCB7XG4gIHR4SW5mbz86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgYmxvY2tIZWlnaHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQU0JULWxpdGUgaGV4IHByZXNlbnQgb25seSBpbiBwZW5kaW5nIGFwcHJvdmFsIGZsb3dzLCB3aGVyZSBhbm90aGVyIHVzZXIncyBzZW5kIGZpeGVkIHRoZSBmb3JtYXQuXG4gICAqIE5vdCBzZXQgaW4gcmVndWxhciAvdHgvYnVpbGQgcmVzcG9uc2VzICh3aGVyZSB0aGUgY2FsbGVyIGNvbnRyb2xzIHRoZSBidWlsZCBwYXJhbWV0ZXJzKS5cbiAgICogUHJlZmVycmVkIG92ZXIgdHhIZXggd2hlbiBwcmVzZW50LCBhcyBpdCBjYXJyaWVzIHJpY2hlciBkYXRhIChub25XaXRuZXNzVXR4bywgcmVkZWVtU2NyaXB0LCBCSVAtMzIgcGF0aHMpLlxuICAgKi9cbiAgdHhIZXhQc2J0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUGFyYW1zIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUGFyYW1zIHtcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3M/OiBib29sZWFuO1xuICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xuICByYmZUeElkcz86IHN0cmluZ1tdO1xuICAvKiogUGFyYW1ldGVycyBmb3IgYnJpZGdpbmcgaW50ZW50cyAoZS5nLiBCVEMgLT4gc0JUQyBwZWctaW4pLCBwcmVzZW50IHdoZW4gYHR5cGUgPT09ICdicmlkZ2luZydgLiAqL1xuICBicmlkZ2luZ1BhcmFtcz86IEJyaWRnaW5nUGFyYW1zO1xuICBxcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHdhbGxldDogVXR4b1dhbGxldDtcbiAgdmVyaWZpY2F0aW9uPzogVmVyaWZpY2F0aW9uT3B0aW9ucztcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUFkZHJlc3NPcHRpb25zIHtcbiAgYWRkcmVzc1R5cGU/OiBTY3JpcHRUeXBlMk9mMztcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICBjaGFpbj86IG51bWJlcjtcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHNlZ3dpdD86IGJvb2xlYW47XG4gIGJlY2gzMj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVGaXhlZFNjcmlwdEFkZHJlc3NPcHRpb25zIGV4dGVuZHMgR2VuZXJhdGVBZGRyZXNzT3B0aW9ucyB7XG4gIGZvcm1hdD86IENyZWF0ZUFkZHJlc3NGb3JtYXQ7XG4gIGtleWNoYWluczoge1xuICAgIHB1Yjogc3RyaW5nO1xuICAgIGFzcEtleUlkPzogc3RyaW5nO1xuICB9W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RldGFpbHMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG4gIGNvaW46IHN0cmluZztcbiAgY29pblNwZWNpZmljOiBBZGRyZXNzQ29pblNwZWNpZmljIHwgRGVzY3JpcHRvckFkZHJlc3NDb2luU3BlY2lmaWM7XG4gIGFkZHJlc3NUeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljIGV4dGVuZHMgQWRkcmVzc0NvaW5TcGVjaWZpYyB7XG4gIGRlc2NyaXB0b3JOYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0b3JDaGVja3N1bTogc3RyaW5nO1xufVxuXG50eXBlIFV0eG9CYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zICYge1xuICAvKiogVHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBiaXRnbyBzZXJ2ZXIgKi9cbiAgdHhQcmVidWlsZDoge1xuICAgIC8qKlxuICAgICAqIHdhbGxldElkIGlzIHJlcXVpcmVkIGluIGZvbGxvd2luZyAyIHNjZW5hcmlvcy5cbiAgICAgKiAxLiBFeHRlcm5hbCBzaWduZXIgZXhwcmVzcyBtb2RlIGlzIHVzZWQuXG4gICAgICogMi4gYml0Z28gTXVTaWcyIG5vbmNlIGlzIHJlcXVlc3RlZFxuICAgICAqL1xuICAgIHdhbGxldElkPzogc3RyaW5nO1xuICAgIHR4SGV4OiBzdHJpbmc7XG4gICAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB9O1xuICAvKiogeHB1YnMgdHJpcGxlIGZvciB3YWxsZXQgKHVzZXIsIGJhY2t1cCwgYml0Z28pLiBSZXF1aXJlZCBvbmx5IHdoZW4gdHhQcmVidWlsZC50eEhleCBpcyBub3QgYSBQU0JUICovXG4gIHB1YnM/OiBUcmlwbGU8c3RyaW5nPjtcbiAgLyoqIHhwdWIgZm9yIGNvc2lnbmVyIChkZWZhdWx0cyB0byBiaXRnbykgKi9cbiAgY29zaWduZXJQdWI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGNyZWF0ZXMgZnVsbC1zaWduZWQgdHJhbnNhY3Rpb24gd2l0aG91dCBwbGFjZWhvbGRlciBzaWduYXR1cmVzLlxuICAgKiBXaGVuIGZhbHNlLCBjcmVhdGVzIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlcy5cbiAgICovXG4gIGlzTGFzdFNpZ25hdHVyZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoZSBzaWduZWQgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSBQU0JUIHRvIGxlZ2FjeSBmb3JtYXQgYmVmb3JlIHJldHVybmluZy5cbiAgICogU2V0IGF1dG9tYXRpY2FsbHkgYnkgcHJlc2lnblRyYW5zYWN0aW9uKCkgd2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHR4Rm9ybWF0OiAnbGVnYWN5Jy5cbiAgICovXG4gIHJldHVybkxlZ2FjeUZvcm1hdD86IGJvb2xlYW47XG4gIHdhbGxldD86IFV0eG9XYWxsZXQ7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUgKGRlZmF1bHQpLCBleHRyYWN0IGZpbmFsaXplZCBQU0JUIHRvIGxlZ2FjeSB0cmFuc2FjdGlvbiBmb3JtYXQuXG4gICAqIFdoZW4gZmFsc2UsIHJldHVybiBmaW5hbGl6ZWQgUFNCVC4gVXNlZnVsIGZvciB0ZXN0aW5nIHRvIGtlZXAgdHJhbnNhY3Rpb25zIGluIFBTQlQgZm9ybWF0LlxuICAgKi9cbiAgZXh0cmFjdFRyYW5zYWN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgZW1iZWRzIFdBU00tVVRYTyB2ZXJzaW9uIG1ldGFkYXRhIGludG8gdGhlIHNpZ25lZCBQU0JULiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgd3JpdGVTaWduZWRXaXRoPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSBVdHhvQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj4gJlxuICAoXG4gICAgfCB7XG4gICAgICAgIHBydjogc3RyaW5nO1xuICAgICAgICBzaWduaW5nU3RlcD86ICdzaWduZXJOb25jZScgfCAnc2lnbmVyU2lnbmF0dXJlJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgc2lnbmluZ1N0ZXA6ICdjb3NpZ25lck5vbmNlJztcbiAgICAgIH1cbiAgKTtcblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aVNpZ0FkZHJlc3Mge1xuICBvdXRwdXRTY3JpcHQ6IEJ1ZmZlcjtcbiAgcmVkZWVtU2NyaXB0PzogQnVmZmVyO1xuICB3aXRuZXNzU2NyaXB0PzogQnVmZmVyO1xuICBhZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlckZyb21Xcm9uZ0NoYWluT3B0aW9ucyB7XG4gIHR4aWQ6IHN0cmluZztcbiAgcmVjb3ZlcnlBZGRyZXNzOiBzdHJpbmc7XG4gIHdhbGxldDogc3RyaW5nO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICB4cHJ2Pzogc3RyaW5nO1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBjb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgcmVjb3ZlcnlDb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgc2lnbmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlLZXlTaWduYXR1cmVzT3B0aW9ucyB7XG4gIHVzZXJLZXljaGFpbjogeyBwdWI/OiBzdHJpbmcgfTtcbiAga2V5Y2hhaW5Ub1ZlcmlmeTogeyBwdWI/OiBzdHJpbmcgfTtcbiAga2V5U2lnbmF0dXJlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VXNlclB1YmxpY0tleU9wdGlvbnMge1xuICB1c2VyS2V5Y2hhaW4/OiBVdHhvS2V5Y2hhaW47XG4gIGRpc2FibGVOZXR3b3JraW5nOiBib29sZWFuO1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+XG4gIGV4dGVuZHMgQmFzZVZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcztcbiAgd2FsbGV0OiBVdHhvV2FsbGV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25Qc2J0UmVxdWVzdCB7XG4gIHBzYnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduUHNidFJlc3BvbnNlIHtcbiAgcHNidDogc3RyaW5nO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVdHhvQ29pbiBleHRlbmRzIEJhc2VDb2luIGltcGxlbWVudHMgTXVzaWcyUGFydGljaXBhbnQ8Zml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0PiB7XG4gIGFic3RyYWN0IG5hbWU6IFV0eG9Db2luTmFtZTtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29pbiBpcyBhIG1haW5uZXQgY29pbi5cbiAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBuYW1lIHByb3BlcnR5LlxuICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzTWFpbm5ldCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNNYWlubmV0Q29pbih0aGlzLm5hbWUpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCc7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJykge1xuICAgIHN1cGVyKGJpdGdvKTtcbiAgICB0aGlzLmFtb3VudFR5cGUgPSBhbW91bnRUeXBlO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogVXR4b0NvaW5OYW1lIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IFV0eG9Db2luTmFtZU1haW5uZXQge1xuICAgIHJldHVybiBnZXRNYWlubmV0Q29pbk5hbWUodGhpcy5uYW1lKTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldEZ1bGxOYW1lRnJvbUNvaW5OYW1lKHRoaXMubmFtZSk7XG4gIH1cblxuICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvaW4gc3VwcG9ydHMgYSBibG9jayB0YXJnZXQgKi9cbiAgc3VwcG9ydHNCbG9ja1RhcmdldCgpOiBib29sZWFuIHtcbiAgICAvLyBGSVhNRTogdGhlIFNESyBkb2VzIG5vdCBzZWVtIHRvIHVzZSB0aGlzIGFueXdoZXJlIHNvIGl0IGlzIHVuY2xlYXIgd2hhdCB0aGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpc1xuICAgIGNvbnN0IG1haW5uZXQgPSBnZXRNYWlubmV0Q29pbk5hbWUodGhpcy5uYW1lKTtcbiAgICByZXR1cm4gbWFpbm5ldCA9PT0gJ2J0YycgfHwgbWFpbm5ldCA9PT0gJ2RvZ2UnO1xuICB9XG5cbiAgc3dlZXBXaXRoU2VuZE1hbnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgc3RhdGljIGdldCB2YWxpZEFkZHJlc3NUeXBlcygpOiBTY3JpcHRUeXBlMk9mM1tdIHtcbiAgICByZXR1cm4gWydwMnNoJywgJ3Ayc2hQMndzaCcsICdwMndzaCcsICdwMnRyJywgJ3AydHJNdXNpZzInXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmYWN0b3IgYmV0d2VlbiB0aGUgYmFzZSB1bml0IGFuZCBpdHMgc21hbGxlc3Qgc3ViZGl2aXNvblxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDFlODtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqIEBwYXJhbSBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbVxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIHBhcmFtPzogeyBhbnlGb3JtYXQ/OiBib29sZWFuOyBhbGxvd0xpZ2h0bmluZz86IGJvb2xlYW4gfSB8IC8qIGxlZ2FjeSBwYXJhbWV0ZXIgKi8gYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnYm9vbGVhbicgJiYgcGFyYW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVwcmVjYXRlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbG93TGlnaHRuaW5nID0gKHBhcmFtIGFzIHsgYWxsb3dMaWdodG5pbmc/OiBib29sZWFuIH0gfCB1bmRlZmluZWQpPy5hbGxvd0xpZ2h0bmluZyA/PyBmYWxzZTtcbiAgICBpZiAoYWxsb3dMaWdodG5pbmcpIHtcbiAgICAgIGlmICgvXigwMnwwMylbMC05YS1mQS1GXXs2NH0kLy50ZXN0KGFkZHJlc3MpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQm9sdDExSW52b2ljZShhZGRyZXNzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCBhbGxvdyBhbGwgYWRkcmVzcyBmb3JtYXRzLlxuICAgIC8vIEF0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIHRoZSBvbmx5IGFkZGl0aW9uYWwgYWRkcmVzcyBmb3JtYXQgaXMgYmNoIGNhc2hhZGRyLlxuICAgIGNvbnN0IGFueUZvcm1hdCA9IChwYXJhbSBhcyB7IGFueUZvcm1hdDogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKT8uYW55Rm9ybWF0ID8/IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IHdhc21BZGRyZXNzLnRvT3V0cHV0U2NyaXB0V2l0aENvaW4oYWRkcmVzcywgdGhpcy5uYW1lKTtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBmb3JtYXQgdGhlIGlucHV0IGFkZHJlc3Mgd2FzIGluIGJ5IHJvdW5kLXRyaXBwaW5nXG4gICAgICAvLyB0aHJvdWdoIGVhY2ggY2FuZGlkYXRlIGFuZCBjaGVja2luZyBieXRlLWVxdWFsaXR5LiAnZGVmYXVsdCcgaXMgdHJpZWRcbiAgICAgIC8vIGZpcnN0IHNvIGNhbm9uaWNhbCBkZWZhdWx0LWZvcm1hdCBhZGRyZXNzZXMgZWFybHktZXhpdC5cbiAgICAgIGZvciAoY29uc3QgZm9ybWF0IG9mIFsnZGVmYXVsdCcsICdjYXNoYWRkciddIGFzIGNvbnN0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHdhc21BZGRyZXNzLmZyb21PdXRwdXRTY3JpcHRXaXRoQ29pbihzY3JpcHQsIHRoaXMubmFtZSwgZm9ybWF0KSA9PT0gYWRkcmVzcykge1xuICAgICAgICAgICAgcmV0dXJuIGFueUZvcm1hdCB8fCBmb3JtYXQgPT09ICdkZWZhdWx0JztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGNvaW4gZG9lc24ndCBzdXBwb3J0IHRoaXMgZm9ybWF0OyB0cnkgdGhlIG5leHQgb25lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gQklQMzIuZnJvbUJhc2U1OChwdWIpLmlzTmV1dGVyZWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBjcmFmdGluZyB0aGUgSFRUUCByZXF1ZXN0IHRvIHRoZSBCaXRHbyBBUEkuXG4gICAqIEl0IGNvbnZlcnRzIHRoZSByZWNpcGllbnQgYWRkcmVzcyBgc2NyaXB0UHViS2V5Oi4uLmAgdG8geyBzY3JpcHQ6IHN0cmluZyB9IHwgeyBhZGRyZXNzOiBzdHJpbmcgfS5cbiAgICovXG4gIG92ZXJyaWRlIHByZXByb2Nlc3NCdWlsZFBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnJlY2lwaWVudHMgPVxuICAgICAgICBwYXJhbXMucmVjaXBpZW50cyBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgPyBwYXJhbXM/LnJlY2lwaWVudHM/Lm1hcCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgYWRkcmVzcywgLi4ucmVzdCB9ID0gcmVjaXBpZW50O1xuICAgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY2lwaWVudDsgLy8gQWxyZWFkeSB7IHNjcmlwdCwgYW1vdW50IH0g4oCUIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4geyAuLi5yZXN0LCAuLi5mcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0KGFkZHJlc3MpIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogcGFyYW1zLnJlY2lwaWVudHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxhdGVzdCBibG9jayBoZWlnaHRcbiAgICogQHBhcmFtIHJlcUlkXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RCbG9ja0hlaWdodChyZXFJZD86IFJlcXVlc3RUcmFjZXIpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmIChyZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICB9XG4gICAgY29uc3QgY2hhaW5oZWFkID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wdWJsaWMvYmxvY2svbGF0ZXN0JykpLnJlc3VsdCgpO1xuICAgIHJldHVybiAoY2hhaW5oZWFkIGFzIGFueSkuaGVpZ2h0O1xuICB9XG5cbiAgY2hlY2tSZWNpcGllbnQocmVjaXBpZW50OiB7IGFkZHJlc3M/OiBzdHJpbmc7IGFtb3VudDogbnVtYmVyIHwgc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBhc3NlcnRWYWxpZFRyYW5zYWN0aW9uUmVjaXBpZW50KHJlY2lwaWVudCk7XG4gICAgaWYgKHJlY2lwaWVudC5hZGRyZXNzICYmICFpc1NjcmlwdFJlY2lwaWVudChyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgIHN1cGVyLmNoZWNrUmVjaXBpZW50KHsgYWRkcmVzczogcmVjaXBpZW50LmFkZHJlc3MsIGFtb3VudDogcmVjaXBpZW50LmFtb3VudCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuIGN1c3RvbSBjb2luIGxvZ2ljIGFmdGVyIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSBCaXRHb1xuICAgKiBAcGFyYW0gcHJlYnVpbGRcbiAgICovXG4gIGFzeW5jIHBvc3RQcm9jZXNzUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gICAgcHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+PiB7XG4gICAgY29uc3QgdHggPSB0aGlzLmRlY29kZVRyYW5zYWN0aW9uRnJvbVByZWJ1aWxkKHByZWJ1aWxkKTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwcmVidWlsZC5ibG9ja0hlaWdodCkpIHtcbiAgICAgIHByZWJ1aWxkLmJsb2NrSGVpZ2h0ID0gKGF3YWl0IHRoaXMuZ2V0TGF0ZXN0QmxvY2tIZWlnaHQoKSkgYXMgbnVtYmVyO1xuICAgIH1cbiAgICByZXR1cm4gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHR4SGV4OiBlbmNvZGVUcmFuc2FjdGlvbih0eCkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gd2lsbCBiZSByZW1vdmVkIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciB1dHhvbGliXG4gICAqIERldGVybWluZSBhbiBhZGRyZXNzJyB0eXBlIGJhc2VkIG9uIGl0cyB3aXRuZXNzIGFuZCByZWRlZW0gc2NyaXB0IHByZXNlbmNlXG4gICAqIEBwYXJhbSBhZGRyZXNzRGV0YWlsc1xuICAgKi9cbiAgc3RhdGljIGluZmVyQWRkcmVzc1R5cGUoYWRkcmVzc0RldGFpbHM6IHsgY2hhaW46IG51bWJlciB9KTogU2NyaXB0VHlwZTJPZjMgfCBudWxsIHtcbiAgICByZXR1cm4gZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlLmlzKGFkZHJlc3NEZXRhaWxzLmNoYWluKVxuICAgICAgPyAoZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlLnNjcmlwdFR5cGUoYWRkcmVzc0RldGFpbHMuY2hhaW4pIGFzIFNjcmlwdFR5cGUyT2YzKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgZGVjb2RlVHJhbnNhY3Rpb24oaW5wdXQ6IEJ1ZmZlciB8IHN0cmluZyk6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB7XG4gICAgY29uc3QgYnVmZmVyID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHN0cmluZ1RvQnVmZmVyVHJ5Rm9ybWF0cyhpbnB1dCwgWydoZXgnLCAnYmFzZTY0J10pIDogaW5wdXQ7XG4gICAgaWYgKCFoYXNQc2J0TWFnaWMoYnVmZmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yRGVwcmVjYXRlZFR4Rm9ybWF0KCdsZWdhY3knKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY29kZVBzYnQoYnVmZmVyLCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgZGVjb2RlVHJhbnNhY3Rpb25Bc1BzYnQoaW5wdXQ6IEJ1ZmZlciB8IHN0cmluZyk6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlVHJhbnNhY3Rpb24oaW5wdXQpO1xuICB9XG5cbiAgZGVjb2RlVHJhbnNhY3Rpb25Gcm9tUHJlYnVpbGQocHJlYnVpbGQ6IHtcbiAgICB0eEhleD86IHN0cmluZztcbiAgICB0eEJhc2U2ND86IHN0cmluZztcbiAgICAvKiogU2VlIFRyYW5zYWN0aW9uUHJlYnVpbGQudHhIZXhQc2J0IOKAlCBvbmx5IHByZXNlbnQgaW4gcGVuZGluZyBhcHByb3ZhbCBmbG93cy4gKi9cbiAgICB0eEhleFBzYnQ/OiBzdHJpbmc7XG4gIH0pOiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQge1xuICAgIGNvbnN0IHN0cmluZyA9IHByZWJ1aWxkLnR4SGV4UHNidCA/PyBwcmVidWlsZC50eEhleCA/PyBwcmVidWlsZC50eEJhc2U2NDtcbiAgICBpZiAoIXN0cmluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4SGV4IG9yIHR4QmFzZTY0IHByb3BlcnR5Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRlY29kZVRyYW5zYWN0aW9uKHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBhbmQgZmlsbCB0cmFuc2FjdGlvbiBkZXRhaWxzIHN1Y2ggYXMgaW50ZXJuYWwvY2hhbmdlIHNwZW5kLCBleHRlcm5hbCBzcGVuZCAoZXhwbGljaXQgdnMuIGltcGxpY2l0KSwgZXRjLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4+IHtcbiAgICByZXR1cm4gcGFyc2VUcmFuc2FjdGlvbih0aGlzLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIHRoZSBleHBvcnRlZCBgdmVyaWZ5VXNlclB1YmxpY0tleWAgZnVuY3Rpb24gaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHZlcmlmeVVzZXJQdWJsaWNLZXkocGFyYW1zOiBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCB2ZXJpZnlVc2VyUHVibGljS2V5KHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgZnVuY3Rpb24gdmVyaWZ5S2V5U2lnbmF0dXJlIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyB2ZXJpZnlLZXlTaWduYXR1cmUocGFyYW1zOiBWZXJpZnlLZXlTaWduYXR1cmVzT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2ZXJpZnlLZXlTaWduYXR1cmUocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGNvbXBsaWVzIHdpdGggdGhlIG9yaWdpbmFsIGludGVudGlvblxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQYXJhbXMgcGFyYW1zIG9iamVjdCBwYXNzZWQgdG8gc2VuZFxuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQgcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHNlcnZlclxuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQudHhIZXggcHJlYnVpbHQgdHJhbnNhY3Rpb24ncyB0eEhleCBmb3JtXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0IFdhbGxldCBvYmplY3QgdG8gb2J0YWluIGtleXMgdG8gdmVyaWZ5IGFnYWluc3RcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24gT2JqZWN0IHNwZWNpZnlpbmcgc29tZSB2ZXJpZmljYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZyBEaXNhbGxvdyBmZXRjaGluZyBhbnkgZGF0YSBmcm9tIHRoZSBpbnRlcm5ldCBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzXG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uLmtleWNoYWlucyBQYXNzIGtleWNoYWlucyBtYW51YWxseSByYXRoZXIgdGhhbiBmZXRjaGluZyB0aGVtIGJ5IGlkXG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uLmFkZHJlc3NlcyBBZGRyZXNzIGRldGFpbHMgdG8gcGFzcyBpbiBmb3Igb3V0LW9mLWJhbmQgdmVyaWZpY2F0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZlcmlmaWNhdGlvbiBwYXNzZXNcbiAgICogQHRocm93cyB7VHhJbnRlbnRNaXNtYXRjaEVycm9yfSBpZiB0cmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqIEB0aHJvd3Mge1R4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcn0gaWYgdHJhbnNhY3Rpb24gcmVjaXBpZW50cyBkb24ndCBtYXRjaCB1c2VyIGludGVudFxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB2ZXJpZnlUcmFuc2FjdGlvbih0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgY29uc3QgdHhFeHBsYW5hdGlvbiA9IGF3YWl0IFR4SW50ZW50TWlzbWF0Y2hFcnJvci50cnlHZXRUeEV4cGxhbmF0aW9uKFxuICAgICAgICAgIHRoaXMgYXMgdW5rbm93biBhcyBJQmFzZUNvaW4sXG4gICAgICAgICAgcGFyYW1zLnR4UHJlYnVpbGRcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgY29udmVydFZhbGlkYXRpb25FcnJvclRvVHhJbnRlbnRNaXNtYXRjaChcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgcGFyYW1zLnR4UGFyYW1zLFxuICAgICAgICAgIHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4LFxuICAgICAgICAgIHR4RXhwbGFuYXRpb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHN1cmUgYW4gYWRkcmVzcyBpcyB2YWxpZCBhbmQgdGhyb3cgYW4gZXJyb3IgaWYgaXQncyBub3QuXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyBUaGUgYWRkcmVzcyBzdHJpbmcgb24gdGhlIG5ldHdvcmtcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzVHlwZVxuICAgKiBAcGFyYW0gcGFyYW1zLmtleWNoYWlucyBLZXljaGFpbiBvYmplY3RzIHdpdGggeHB1YnNcbiAgICogQHBhcmFtIHBhcmFtcy5jb2luU3BlY2lmaWMgQ29pbi1zcGVjaWZpYyBkZXRhaWxzIGZvciB0aGUgYWRkcmVzcyBzdWNoIGFzIGEgd2l0bmVzcyBzY3JpcHRcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFpbiBEZXJpdmF0aW9uIGNoYWluXG4gICAqIEBwYXJhbSBwYXJhbXMuaW5kZXggRGVyaXZhdGlvbiBpbmRleFxuICAgKiBAdGhyb3dzIHtJbnZhbGlkQWRkcmVzc0Vycm9yfVxuICAgKiBAdGhyb3dzIHtJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yfVxuICAgKiBAdGhyb3dzIHtVbmV4cGVjdGVkQWRkcmVzc0Vycm9yfVxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVmVyaWZ5QWRkcmVzc09wdGlvbnM8VXR4b0NvaW5TcGVjaWZpYz4sIHdhbGxldD86IElXYWxsZXQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGFkZHJlc3MsIGtleWNoYWlucywgY2hhaW4sIGluZGV4IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBpZiAod2FsbGV0ICYmIGlzRGVzY3JpcHRvcldhbGxldCh3YWxsZXQpKSB7XG4gICAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0ga2V5Y2hhaW5zJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzVHJpcGxlKGtleWNoYWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbnMgbXVzdCBiZSBhIHRyaXBsZScpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0RGVzY3JpcHRvcldhbGxldEFkZHJlc3MoXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBnZXREZXNjcmlwdG9yTWFwRnJvbVdhbGxldCh3YWxsZXQsIHRvQmlwMzJUcmlwbGUoa2V5Y2hhaW5zKSwgZ2V0UG9saWN5Rm9yRW52KHRoaXMuYml0Z28uZW52KSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoKF8uaXNVbmRlZmluZWQoY2hhaW4pICYmIF8uaXNVbmRlZmluZWQoaW5kZXgpKSB8fCAhKF8uaXNGaW5pdGUoY2hhaW4pICYmIF8uaXNGaW5pdGUoaW5kZXgpKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IoXG4gICAgICAgIGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogaW52YWxpZCBjaGFpbiAoJHtjaGFpbn0pIG9yIGluZGV4ICgke2luZGV4fSlgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0ga2V5Y2hhaW5zJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0Rml4ZWRTY3JpcHRXYWxsZXRBZGRyZXNzKHRoaXMubmFtZSwge1xuICAgICAgYWRkcmVzcyxcbiAgICAgIGtleWNoYWlucyxcbiAgICAgIGZvcm1hdDogcGFyYW1zLmZvcm1hdCA/PyAnYmFzZTU4JyxcbiAgICAgIGNoYWluLFxuICAgICAgaW5kZXgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NhbGx5IGRlcml2ZSBhIGZpeGVkLXNjcmlwdCAoMi1vZi0zIG11bHRpc2lnKSB3YWxsZXQgcmVjZWl2ZSBhZGRyZXNzIGZyb20gdGhlIHhwdWIgdHJpcGxlXG4gICAqIGFuZCBhIGNoYWluL2luZGV4LCB1c2luZyBwdWJsaWMga2V5cyBvbmx5IChubyBwcml2YXRlIGtleXMsIG5vIG5ldHdvcmsgYWNjZXNzKS4gVGhpcyBpcyB0aGVcbiAgICogaW52ZXJzZSBvZiB7QGxpbmsgaXNXYWxsZXRBZGRyZXNzfSwgZGVsZWdhdGluZyB0byB0aGUgc2FtZSBgZ2VuZXJhdGVBZGRyZXNzYCB1c2VkIGJ5IHRoZVxuICAgKiB2ZXJpZmljYXRpb24gcGF0aCwgc28gZGVyaXZlIGFuZCB2ZXJpZnkgY2FuIG5ldmVyIGRpdmVyZ2UuXG4gICAqXG4gICAqIFRoZSBgY2hhaW5gIGNvZGUgc2VsZWN0cyB0aGUgc2NyaXB0IHR5cGUgKGUuZy4gMC8xID0gUDJTSCwgMjAvMjEgPSBQMldTSC9iZWNoMzIsIDMwLzMxID0gUDJUUik7XG4gICAqIGFuIG9wdGlvbmFsIGBmb3JtYXRgIG92ZXJyaWRlcyB0aGUgYWRkcmVzcyBlbmNvZGluZy5cbiAgICogQHBhcmFtIHBhcmFtcyBrZXljaGFpbnMgKHhwdWIgdHJpcGxlIHZpYSBgcHViYCksIGNoYWluLCBpbmRleCwgYW5kIG9wdGlvbmFsIGZvcm1hdFxuICAgKiBAcmV0dXJucyB0aGUgZGVyaXZlZCBhZGRyZXNzIGFuZCB0aGUgY2hhaW4vaW5kZXggdXNlZFxuICAgKi9cbiAgYXN5bmMgZGVyaXZlQWRkcmVzcyhwYXJhbXM6IERlcml2ZUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxEZXJpdmVBZGRyZXNzUmVzdWx0PiB7XG4gICAgY29uc3QgeyBrZXljaGFpbnMsIGNoYWluLCBpbmRleCwgZm9ybWF0IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGtleWNoYWlucycpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3MgPSBnZW5lcmF0ZUFkZHJlc3ModGhpcy5uYW1lLCB7XG4gICAgICAvLyBmaXhlZC1zY3JpcHQgKG11bHRpc2lnKSBjb2lucyBkZXJpdmUgZnJvbSB0aGUgeHB1YiB0cmlwbGUgdmlhIGBwdWJgXG4gICAgICBrZXljaGFpbnM6IGtleWNoYWlucyBhcyB7IHB1Yjogc3RyaW5nIH1bXSxcbiAgICAgIGNoYWluLFxuICAgICAgaW5kZXgsXG4gICAgICBmb3JtYXQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBhZGRyZXNzLCBjaGFpbiwgaW5kZXggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWRkcmVzc1R5cGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgY29pbiBzdXBwb3J0cyBzcGVuZGluZyBmcm9tIHVuc3BlbnRUeXBlXG4gICAqL1xuICBzdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlOiBTY3JpcHRUeXBlMk9mMyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmaXhlZFNjcmlwdFdhbGxldC5zdXBwb3J0c1NjcmlwdFR5cGUodGhpcy5uYW1lLCBhZGRyZXNzVHlwZSk7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMub25jaGFpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHJldHVybiB0cnVlIGlmZiBjb2luIHN1cHBvcnRzIHNwZW5kaW5nIGZyb20gY2hhaW5cbiAgICovXG4gIHN1cHBvcnRzQWRkcmVzc0NoYWluKGNoYWluOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlLmlzKGNoYWluKSAmJlxuICAgICAgdGhpcy5zdXBwb3J0c0FkZHJlc3NUeXBlKGZpeGVkU2NyaXB0V2FsbGV0LkNoYWluQ29kZS5zY3JpcHRUeXBlKGNoYWluKSBhcyBTY3JpcHRUeXBlMk9mMylcbiAgICApO1xuICB9XG5cbiAga2V5SWRzRm9yU2lnbmluZygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFtLZXlJbmRpY2VzLlVTRVIsIEtleUluZGljZXMuQkFDS1VQLCBLZXlJbmRpY2VzLkJJVEdPXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBpbnB1dCBwc2J0IGFkZGVkIHdpdGggZGV0ZXJtaW5pc3RpYyBNdVNpZzIgbm9uY2UgZm9yIGJpdGdvIGtleSBmb3IgZWFjaCBNdVNpZzIgaW5wdXRzLlxuICAgKiBAcGFyYW0gcHNidCBhbGwgTXVTaWcyIGlucHV0cyBzaG91bGQgY29udGFpbiB1c2VyIE11U2lnMiBub25jZVxuICAgKiBAcGFyYW0gd2FsbGV0SWRcbiAgICovXG4gIGFzeW5jIGdldE11c2lnMk5vbmNlcyhwc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsIHdhbGxldElkOiBzdHJpbmcpOiBQcm9taXNlPGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidD4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGVuY29kZVRyYW5zYWN0aW9uKHBzYnQpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoJy93YWxsZXQvJyArIHdhbGxldElkICsgJy90eC9zaWducHNidCcpKVxuICAgICAgLnNlbmQoeyBwc2J0OiBidWZmZXIudG9TdHJpbmcoJ2hleCcpIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVBzYnQocmVzcG9uc2UucHNidCwgdGhpcy5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0TXVzaWcyTm9uY2VzIGluc3RlYWRcbiAgICogQHJldHVybnMgaW5wdXQgcHNidCBhZGRlZCB3aXRoIGRldGVybWluaXN0aWMgTXVTaWcyIG5vbmNlIGZvciBiaXRnbyBrZXkgZm9yIGVhY2ggTXVTaWcyIGlucHV0cy5cbiAgICogQHBhcmFtIHBzYnRIZXggYWxsIE11U2lnMiBpbnB1dHMgc2hvdWxkIGNvbnRhaW4gdXNlciBNdVNpZzIgbm9uY2VcbiAgICogQHBhcmFtIHdhbGxldElkXG4gICAqL1xuICBhc3luYyBzaWduUHNidChwc2J0SGV4OiBzdHJpbmcsIHdhbGxldElkOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25Qc2J0UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwc2J0ID0gYXdhaXQgdGhpcy5nZXRNdXNpZzJOb25jZXModGhpcy5kZWNvZGVUcmFuc2FjdGlvbkFzUHNidChwc2J0SGV4KSwgd2FsbGV0SWQpO1xuICAgIHJldHVybiB7IHBzYnQ6IGVuY29kZVRyYW5zYWN0aW9uKHBzYnQpLnRvU3RyaW5nKCdoZXgnKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGlucHV0IHBzYnQgYWRkZWQgd2l0aCBkZXRlcm1pbmlzdGljIE11U2lnMiBub25jZSBmb3IgYml0Z28ga2V5IGZvciBlYWNoIE11U2lnMiBpbnB1dHMgZnJvbSBPVkMuXG4gICAqIEBwYXJhbSBvdmNKc29uIEpTT04gb2JqZWN0IHByb3ZpZGVkIGJ5IE9WQyB3aXRoIGZpZWxkcyBwc2J0SGV4IGFuZCB3YWxsZXRJZFxuICAgKi9cbiAgYXN5bmMgc2lnblBzYnRGcm9tT1ZDKG92Y0pzb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIGFzc2VydChvdmNKc29uWydwc2J0SGV4J10sICdvdmNKc29uIG11c3QgY29udGFpbiBwc2J0SGV4Jyk7XG4gICAgYXNzZXJ0KG92Y0pzb25bJ3dhbGxldElkJ10sICdvdmNKc29uIG11c3QgY29udGFpbiB3YWxsZXRJZCcpO1xuICAgIGNvbnN0IGhleCA9IG92Y0pzb25bJ3BzYnRIZXgnXSBhcyBzdHJpbmc7XG4gICAgY29uc3Qgd2FsbGV0SWQgPSBvdmNKc29uWyd3YWxsZXRJZCddIGFzIHN0cmluZztcbiAgICBjb25zdCBwc2J0ID0gYXdhaXQgdGhpcy5nZXRNdXNpZzJOb25jZXModGhpcy5kZWNvZGVUcmFuc2FjdGlvbkFzUHNidChoZXgpLCB3YWxsZXRJZCk7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKG92Y0pzb24sIHsgdHhIZXg6IGVuY29kZVRyYW5zYWN0aW9uKHBzYnQpLnRvU3RyaW5nKCdoZXgnKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBrZXljaGFpbiBhbmQgaGFsZi1zaWduIHByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSB7QHNlZSBTaWduVHJhbnNhY3Rpb25PcHRpb25zfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+fVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiBzaWduVHJhbnNhY3Rpb248VE51bWJlcj4odGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb24gd2l0aCBhIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uLiBFeGFtcGxlIHVzZSBjYXNlIGlzIGV4cHJlc3MgZXh0ZXJuYWwgc2lnbmVyXG4gICAqIEBwYXJhbSBjdXN0b21TaWduaW5nRnVuY3Rpb24gY3VzdG9tIHNpZ25pbmcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2luZ2xlIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gc2lnblRyYW5zYWN0aW9uUGFyYW1zIHBhcmFtZXRlcnMgZm9yIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uLiBJbmNsdWRlcyB0eFByZWJ1aWxkIGFuZCBwdWJzXG4gICAqXG4gICAqIEByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbiBhcyBoZXggc3RyaW5nXG4gICAqL1xuICBhc3luYyBzaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IFV0eG9DdXN0b21TaWduaW5nRnVuY3Rpb248VE51bWJlcj4sXG4gICAgc2lnblRyYW5zYWN0aW9uUGFyYW1zOiB7IHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47IHB1YnM6IHN0cmluZ1tdIH1cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gc2lnblRyYW5zYWN0aW9uUGFyYW1zLnR4UHJlYnVpbGQudHhIZXg7XG4gICAgYXNzZXJ0KHR4SGV4LCAnbWlzc2luZyB0eEhleCBwYXJhbWV0ZXInKTtcblxuICAgIGNvbnN0IHR4ID0gdGhpcy5kZWNvZGVUcmFuc2FjdGlvbih0eEhleCk7XG5cbiAgICBjb25zdCBpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0ID0gaGFzS2V5UGF0aFNwZW5kSW5wdXQodHgsIHNpZ25UcmFuc2FjdGlvblBhcmFtcy5wdWJzLCB0aGlzLm5hbWUpO1xuXG4gICAgaWYgKCFpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0KSB7XG4gICAgICByZXR1cm4gYXdhaXQgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHsgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLCBjb2luOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdldFR4SGV4ID0gKHY6IFNpZ25lZFRyYW5zYWN0aW9uKTogc3RyaW5nID0+IHtcbiAgICAgIGlmICgndHhIZXgnIGluIHYpIHtcbiAgICAgICAgcmV0dXJuIHYudHhIZXg7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4SGV4IG5vdCBmb3VuZCBpbiBzaWduVHJhbnNhY3Rpb24gcmVzdWx0Jyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNpZ25lck5vbmNlVHggPSBhd2FpdCBjdXN0b21TaWduaW5nRnVuY3Rpb24oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgc2lnbmluZ1N0ZXA6ICdzaWduZXJOb25jZScsXG4gICAgICBjb2luOiB0aGlzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwdWJzIH0gPSBzaWduVHJhbnNhY3Rpb25QYXJhbXM7XG4gICAgYXNzZXJ0KHB1YnMgPT09IHVuZGVmaW5lZCB8fCBpc1RyaXBsZShwdWJzKSk7XG5cbiAgICBjb25zdCBjb3NpZ25lck5vbmNlVHggPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwdWJzLFxuICAgICAgdHhQcmVidWlsZDogeyAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMudHhQcmVidWlsZCwgdHhIZXg6IGdldFR4SGV4KHNpZ25lck5vbmNlVHgpIH0sXG4gICAgICBzaWduaW5nU3RlcDogJ2Nvc2lnbmVyTm9uY2UnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IGN1c3RvbVNpZ25pbmdGdW5jdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcy50eFByZWJ1aWxkLCB0eEhleDogZ2V0VHhIZXgoY29zaWduZXJOb25jZVR4KSB9LFxuICAgICAgc2lnbmluZ1N0ZXA6ICdzaWduZXJTaWduYXR1cmUnLFxuICAgICAgY29pbjogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gdW5zcGVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQml0R29UYWludGVkVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50Pih1bnNwZW50OiBVbnNwZW50PFROdW1iZXI+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQodW5zcGVudCwgdGhpcy5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXBvc2UgYSByYXcgcHNidC90cmFuc2FjdGlvbiBpbnRvIHVzZWZ1bCBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdG90YWwgYW1vdW50cyxcbiAgICogY2hhbmdlIGFtb3VudHMsIGFuZCB0cmFuc2FjdGlvbiBvdXRwdXRzLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBleHBsYWluVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+LFxuICAgIHdhbGxldD86IElXYWxsZXRcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMucHVicykge1xuICAgICAgLy8gaWYgbm8gcHVicyBhcmUgcHJvdmlkZWQsIG9wcG9ydHVuaXN0aWNhbGx5IGZldGNoIHRoZSBrZXljaGFpbnMgZnJvbSB0aGUgd2FsbGV0XG4gICAgICBpZiAod2FsbGV0KSB7XG4gICAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKHRoaXMsIHdhbGxldCk7XG4gICAgICAgIHBhcmFtcy5wdWJzID0gdG9CaXAzMlRyaXBsZShrZXljaGFpbnMpLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAod2FsbGV0ICYmIGlzRGVzY3JpcHRvcldhbGxldCh3YWxsZXQpKSB7XG4gICAgICAvLyBEZXNjcmlwdG9yIHdhbGxldHMgZGVjb2RlIHByZWJ1aWxkIGJ5dGVzIHN0cmFpZ2h0IGludG8gdGhlIHdhc20tdXR4b1xuICAgICAgLy8gZGVzY3JpcHRvciBQc2J0LCBza2lwcGluZyB0aGUgZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0IGludGVybWVkaWF0ZS5cbiAgICAgIHJldHVybiBleHBsYWluVHgoZGVjb2RlRGVzY3JpcHRvclBzYnQocGFyYW1zKSwgeyAuLi5wYXJhbXMsIHdhbGxldCB9LCB0aGlzLm5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwbGFpblR4KHRoaXMuZGVjb2RlVHJhbnNhY3Rpb25Gcm9tUHJlYnVpbGQocGFyYW1zKSwgeyAuLi5wYXJhbXMsIHdhbGxldCB9LCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIHtAc2VlIGJhY2t1cEtleVJlY292ZXJ5fVxuICAgKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXMgLSB7QHNlZSBiYWNrdXBLZXlSZWNvdmVyeX1cbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyUGFyYW1zKTogUmV0dXJuVHlwZTx0eXBlb2YgYmFja3VwS2V5UmVjb3Zlcnk+IHtcbiAgICByZXR1cm4gYmFja3VwS2V5UmVjb3ZlcnkodGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIGFzeW5jIHJlY292ZXJWMShwYXJhbXM6IFYxUmVjb3ZlclBhcmFtcyk6IFJldHVyblR5cGU8dHlwZW9mIHYxQmFja3VwS2V5UmVjb3Zlcnk+IHtcbiAgICByZXR1cm4gdjFCYWNrdXBLZXlSZWNvdmVyeSh0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICB9XG5cbiAgYXN5bmMgc3dlZXBWMShwYXJhbXM6IFYxU3dlZXBQYXJhbXMpOiBSZXR1cm5UeXBlPHR5cGVvZiB2MVN3ZWVwPiB7XG4gICAgcmV0dXJuIHYxU3dlZXAodGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGNvaW4gdGhhdCB3YXMgc2VudCB0byB3cm9uZyBjaGFpblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudHhpZCBUaGUgdHhpZCBvZiB0aGUgZmF1bHR5IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMucmVjb3ZlcnlBZGRyZXNzIGFkZHJlc3MgdG8gc2VuZCByZWNvdmVyZWQgZnVuZHMgdG9cbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXQgdGhlIHdhbGxldCB0aGF0IHJlY2VpdmVkIHRoZSBmdW5kc1xuICAgKiBAcGFyYW0gcGFyYW1zLnJlY292ZXJ5Q29pbiB0aGUgY29pbiB0eXBlIG9mIHRoZSB3YWxsZXQgdGhhdCByZWNlaXZlZCB0aGUgZnVuZHNcbiAgICogQHBhcmFtIHBhcmFtcy5zaWduZWQgcmV0dXJuIGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gKGRlZmF1bHQ9dHJ1ZSlcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0gcGFyYW1zLnhwcnYgdGhlIHVuZW5jcnlwdGVkIHhwcnYgKHVzZWQgaW5zdGVhZCBvZiB3YWxsZXQgcGFzc3BocmFzZSlcbiAgICogQHBhcmFtIHBhcmFtcy5hcGlLZXkgZm9yIHV0eG8gY29pbnMgb3RoZXIgdGhhbiBbQlRDLFRCVENdIHRoaXMgaXMgYSBCbG9jayBDaGFpciBhcGkga2V5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckZyb21Xcm9uZ0NoYWluPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogUmVjb3ZlckZyb21Xcm9uZ0NoYWluT3B0aW9uc1xuICApOiBQcm9taXNlPENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZDxUTnVtYmVyPiB8IENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkPFROdW1iZXI+PiB7XG4gICAgY29uc3QgeyB0eGlkLCByZWNvdmVyeUFkZHJlc3MsIHdhbGxldCwgd2FsbGV0UGFzc3BocmFzZSwgeHBydiwgYXBpS2V5IH0gPSBwYXJhbXM7XG5cbiAgICAvLyBwYXJhbXMucmVjb3ZlcnlDb2luIHVzZWQgdG8gYmUgcGFyYW1zLmNvaW4sIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgcmVjb3ZlcnlDb2luID0gcGFyYW1zLmNvaW4gfHwgcGFyYW1zLnJlY292ZXJ5Q29pbjtcbiAgICBpZiAoIXJlY292ZXJ5Q29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIG9iamVjdCByZWNvdmVyeUNvaW4nKTtcbiAgICB9XG4gICAgLy8gc2lnbmVkIHNob3VsZCBkZWZhdWx0IHRvIHRydWUsIGFuZCBvbmx5IGJlIGRpc2FibGVkIGlmIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlIChub3QgdW5kZWZpbmVkKVxuICAgIGNvbnN0IHNpZ25lZCA9IHBhcmFtcy5zaWduZWQgIT09IGZhbHNlO1xuXG4gICAgY29uc3Qgc291cmNlQ29pbkZhbWlseSA9IHRoaXMuZ2V0RmFtaWx5KCk7XG4gICAgY29uc3QgcmVjb3ZlcnlDb2luRmFtaWx5ID0gcmVjb3ZlcnlDb2luLmdldEZhbWlseSgpO1xuICAgIGNvbnN0IHN1cHBvcnRlZFJlY292ZXJ5Q29pbnMgPSBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3Zlcmllc1tzb3VyY2VDb2luRmFtaWx5XTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHN1cHBvcnRlZFJlY292ZXJ5Q29pbnMpIHx8ICFzdXBwb3J0ZWRSZWNvdmVyeUNvaW5zLmluY2x1ZGVzKHJlY292ZXJ5Q29pbkZhbWlseSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjb3Zlcnkgb2YgJHtzb3VyY2VDb2luRmFtaWx5fSBiYWxhbmNlcyBmcm9tICR7cmVjb3ZlcnlDb2luRmFtaWx5fSB3YWxsZXRzIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlY292ZXJDcm9zc0NoYWluPFROdW1iZXI+KHRoaXMuYml0Z28sIHtcbiAgICAgIHNvdXJjZUNvaW46IHRoaXMsXG4gICAgICByZWNvdmVyeUNvaW4sXG4gICAgICB3YWxsZXRJZDogd2FsbGV0LFxuICAgICAgdHhpZCxcbiAgICAgIHJlY292ZXJ5QWRkcmVzcyxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHNpZ25lZCA/IHdhbGxldFBhc3NwaHJhc2UgOiB1bmRlZmluZWQsXG4gICAgICB4cHJ2OiBzaWduZWQgPyB4cHJ2IDogdW5kZWZpbmVkLFxuICAgICAgYXBpS2V5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGJpcDMyIGtleSBwYWlyXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCB3aXRoIGdlbmVyYXRlZCBwdWIgYW5kIHBydlxuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ6IEJ1ZmZlcik6IHsgcHViOiBzdHJpbmc7IHBydjogc3RyaW5nIH0ge1xuICAgIGlmICghc2VlZCkge1xuICAgICAgLy8gQW4gZXh0ZW5kZWQgcHJpdmF0ZSBrZXkgaGFzIGJvdGggYSBub3JtYWwgMjU2IGJpdCBwcml2YXRlIGtleSBhbmQgYSAyNTZcbiAgICAgIC8vIGJpdCBjaGFpbiBjb2RlLCBib3RoIG9mIHdoaWNoIG11c3QgYmUgcmFuZG9tLiA1MTIgYml0cyBpcyB0aGVyZWZvcmUgdGhlXG4gICAgICAvLyBtYXhpbXVtIGVudHJvcHkgYW5kIGdpdmVzIHVzIG1heGltdW0gc2VjdXJpdHkgYWdhaW5zdCBjcmFja2luZy5cbiAgICAgIHNlZWQgPSByYW5kb21CeXRlcyg1MTIgLyA4KTtcbiAgICB9XG4gICAgY29uc3QgZXh0ZW5kZWRLZXkgPSBCSVAzMi5mcm9tU2VlZChzZWVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBleHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICBwcnY6IGV4dGVuZGVkS2V5LnRvQmFzZTU4KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIGZvcm1hdCBiYXNlZCBvbiB3YWxsZXQgcHJvcGVydGllcyBhbmQgbmV0d29ya1xuICAgKiBAcGFyYW0gd2FsbGV0IC0gVGhlIHdhbGxldCB0byBjaGVja1xuICAgKiBAcGFyYW0gcmVxdWVzdGVkRm9ybWF0IC0gT3B0aW9uYWwgZXhwbGljaXRseSByZXF1ZXN0ZWQgZm9ybWF0XG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2FjdGlvbiBmb3JtYXQgdG8gdXNlLCBvciB1bmRlZmluZWQgaWYgbm8gZGVmYXVsdCBhcHBsaWVzXG4gICAqL1xuICBnZXREZWZhdWx0VHhGb3JtYXQod2FsbGV0OiBXYWxsZXQsIHJlcXVlc3RlZEZvcm1hdD86IFR4Rm9ybWF0KTogVHhGb3JtYXQge1xuICAgIGlmIChyZXF1ZXN0ZWRGb3JtYXQgPT09ICdsZWdhY3knKSB7XG4gICAgICByZXR1cm4gJ3BzYnQtbGl0ZSc7XG4gICAgfVxuICAgIHJldHVybiByZXF1ZXN0ZWRGb3JtYXQgPz8gJ3BzYnQtbGl0ZSc7XG4gIH1cblxuICBhc3luYyBnZXRFeHRyYVByZWJ1aWxkUGFyYW1zKGJ1aWxkUGFyYW1zOiBFeHRyYVByZWJ1aWxkUGFyYW1zT3B0aW9ucyAmIHsgd2FsbGV0OiBXYWxsZXQgfSk6IFByb21pc2U8e1xuICAgIHR4Rm9ybWF0PzogVHhGb3JtYXQ7XG4gICAgY2hhbmdlQWRkcmVzc1R5cGU/OiBTY3JpcHRUeXBlMk9mM1tdIHwgU2NyaXB0VHlwZTJPZjM7XG4gICAgYWxsb3dlZElucHV0U2NyaXB0VHlwZXM/OiBTY3JpcHRUeXBlMk9mM1tdO1xuICB9PiB7XG4gICAgY29uc3QgcmVxdWVzdGVkRm9ybWF0ID0gYnVpbGRQYXJhbXMudHhGb3JtYXQgYXMgVHhGb3JtYXQgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHhGb3JtYXQgPSB0aGlzLmdldERlZmF1bHRUeEZvcm1hdChidWlsZFBhcmFtcy53YWxsZXQsIHJlcXVlc3RlZEZvcm1hdCk7XG4gICAgbGV0IGNoYW5nZUFkZHJlc3NUeXBlID0gYnVpbGRQYXJhbXMuY2hhbmdlQWRkcmVzc1R5cGUgYXMgU2NyaXB0VHlwZTJPZjNbXSB8IFNjcmlwdFR5cGUyT2YzIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gaWYgdGhlIGFkZHJlc3NUeXBlIGlzIG5vdCBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gZGVmYXVsdCB0byBwMnRyTXVzaWcyIGZvciB0ZXN0bmV0IGhvdCB3YWxsZXRzIGZvciBzdGFnZWQgcm9sbG91dCBvZiBwMnRyTXVzaWcyXG4gICAgaWYgKFxuICAgICAgYnVpbGRQYXJhbXMuYWRkcmVzc1R5cGUgPT09IHVuZGVmaW5lZCAmJiAvLyBhZGRyZXNzVHlwZSBpcyBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgY2hhbmdlQWRkcmVzc2BcbiAgICAgIGJ1aWxkUGFyYW1zLmNoYW5nZUFkZHJlc3NUeXBlID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGJ1aWxkUGFyYW1zLmNoYW5nZUFkZHJlc3MgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgYnVpbGRQYXJhbXMud2FsbGV0LnR5cGUoKSA9PT0gJ2hvdCdcbiAgICApIHtcbiAgICAgIGNoYW5nZUFkZHJlc3NUeXBlID0gWydwMnRyTXVzaWcyJywgJ3Ayd3NoJywgJ3Ayc2hQMndzaCcsICdwMnNoJywgJ3AydHInXTtcbiAgICB9XG5cbiAgICAvLyBnZXRIYWxmU2lnbmVkTGVnYWN5Rm9ybWF0KCkgb25seSBzdXBwb3J0cyBwMm1zLWJhc2VkIHR5cGVzIChwMnNoLCBwMnNoUDJ3c2gsIHAyd3NoKS5cbiAgICAvLyBGaWx0ZXIgY2hhbmdlIG91dHB1dHMgYW5kIHJlc3RyaWN0IGlucHV0IHNlbGVjdGlvbiB0byB0aGVzZSB0eXBlcy5cbiAgICBjb25zdCBsZWdhY3lDb21wYXRpYmxlVHlwZXM6IFNjcmlwdFR5cGUyT2YzW10gPSBbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJ107XG4gICAgbGV0IGFsbG93ZWRJbnB1dFNjcmlwdFR5cGVzOiBTY3JpcHRUeXBlMk9mM1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHJlcXVlc3RlZEZvcm1hdCA9PT0gJ2xlZ2FjeScpIHtcbiAgICAgIGFsbG93ZWRJbnB1dFNjcmlwdFR5cGVzID0gbGVnYWN5Q29tcGF0aWJsZVR5cGVzO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlQWRkcmVzc1R5cGUpKSB7XG4gICAgICAgIGNoYW5nZUFkZHJlc3NUeXBlID0gY2hhbmdlQWRkcmVzc1R5cGUuZmlsdGVyKCh0KTogdCBpcyBTY3JpcHRUeXBlMk9mMyA9PlxuICAgICAgICAgIGxlZ2FjeUNvbXBhdGlibGVUeXBlcy5pbmNsdWRlcyh0IGFzIFNjcmlwdFR5cGUyT2YzKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VBZGRyZXNzVHlwZSAhPT0gdW5kZWZpbmVkICYmICFsZWdhY3lDb21wYXRpYmxlVHlwZXMuaW5jbHVkZXMoY2hhbmdlQWRkcmVzc1R5cGUpKSB7XG4gICAgICAgIGNoYW5nZUFkZHJlc3NUeXBlID0gbGVnYWN5Q29tcGF0aWJsZVR5cGVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eEZvcm1hdCxcbiAgICAgIGNoYW5nZUFkZHJlc3NUeXBlLFxuICAgICAgYWxsb3dlZElucHV0U2NyaXB0VHlwZXMsXG4gICAgfTtcbiAgfVxuXG4gIHByZUNyZWF0ZUJpdEdvKHBhcmFtczogUHJlY3JlYXRlQml0R29PcHRpb25zKTogdm9pZCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXN5bmMgcHJlc2lnblRyYW5zYWN0aW9uKHBhcmFtczogUHJlc2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHBhcmFtcy53YWxsZXREYXRhICYmIGlzVXR4b1dhbGxldERhdGEocGFyYW1zLndhbGxldERhdGEpICYmIGlzRGVzY3JpcHRvcldhbGxldERhdGEocGFyYW1zLndhbGxldERhdGEpKSB7XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIGNvbnN0IHJldHVybkxlZ2FjeUZvcm1hdCA9IChwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnR4Rm9ybWF0ID09PSAnbGVnYWN5JztcbiAgICByZXR1cm4geyAuLi5wYXJhbXMsIHJldHVybkxlZ2FjeUZvcm1hdCB9O1xuICB9XG5cbiAgYXN5bmMgc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KFxuICAgIHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgICBrZXljaGFpbnM6IEtleWNoYWluc1RyaXBsZXRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gd2FsbGV0UGFyYW1zO1xuICB9XG5cbiAgdHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJlcGFyZUNvbGRUcmFuc2FjdGlvbjxUIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQ+KFxuICAgIHR4UHJlYnVpbGQ6IFQsXG4gICAga2V5Y2hhaW5zOiBUcmlwbGU8S2V5Y2hhaW4+XG4gICk6IFQgJiBDb2xkVHJhbnNhY3Rpb25QcmVidWlsZCB7XG4gICAgLy8gUFNCVHMgYWxyZWFkeSBjYXJyeSBCSVAtMzIgZGVyaXZhdGlvbiBpbmZvIGlubGluZSwgc28gb2ZmbGluZSBzaWduZXJzIGRvIG5vdCBuZWVkIHRoZSBleHRyYSBpbmZvcm1hdGlvblxuICAgIGlmICh0eXBlb2YgdHhQcmVidWlsZC50eEhleCA9PT0gJ3N0cmluZycgJiYgaGFzUHNidE1hZ2ljKHN0cmluZ1RvQnVmZmVyVHJ5Rm9ybWF0cyh0eFByZWJ1aWxkLnR4SGV4LCBbJ2hleCddKSkpIHtcbiAgICAgIHJldHVybiB0eFByZWJ1aWxkIGFzIFQgJiBDb2xkVHJhbnNhY3Rpb25QcmVidWlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnByZXBhcmVDb2xkVHJhbnNhY3Rpb24odHhQcmVidWlsZCwga2V5Y2hhaW5zKTtcbiAgfVxuXG4gIGdldFJlY292ZXJ5UHJvdmlkZXIoYXBpVG9rZW4/OiBzdHJpbmcpOiBSZWNvdmVyeVByb3ZpZGVyIHtcbiAgICByZXR1cm4gZm9yQ29pbih0aGlzLmdldENoYWluKCksIGFwaVRva2VuKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleSh7XG4gICAgbXVsdGlTaWdUeXBlLFxuICAgIHB1YmxpY0tleSxcbiAgICBwcnYsXG4gIH06IHtcbiAgICBtdWx0aVNpZ1R5cGU6IE11bHRpc2lnVHlwZTtcbiAgICBwdWJsaWNLZXk6IHN0cmluZztcbiAgICBwcnY6IHN0cmluZztcbiAgfSk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RzcyBhdWRpdGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGNvaW4nKTtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJ2KHBydikgJiYgIWlzVmFsaWRYcHJ2KHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAocHVibGljS2V5KSB7XG4gICAgICBjb25zdCBnZW5QdWJLZXkgPSBCSVAzMi5mcm9tQmFzZTU4KHBydikubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuICAgICAgaWYgKGdlblB1YktleSAhPT0gcHVibGljS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHVibGljIGtleSBkb2VzIG5vdCBtYXRjaCBwcml2YXRlIGtleScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19