@bitgo/abstract-utxo 10.17.0 → 10.18.0

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 (292) hide show
  1. package/dist/cjs/src/abstractUtxoCoin.d.ts +5 -6
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
  3. package/dist/cjs/src/abstractUtxoCoin.js +24 -5
  4. package/dist/cjs/src/address/fixedScript.d.ts +1 -5
  5. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -1
  6. package/dist/cjs/src/address/fixedScript.js +3 -5
  7. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +4 -5
  8. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -1
  9. package/dist/cjs/src/descriptor/NamedDescriptor.js +4 -6
  10. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +2 -2
  11. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -1
  12. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +3 -38
  13. package/dist/cjs/src/descriptor/builder/builder.d.ts +2 -3
  14. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -1
  15. package/dist/cjs/src/descriptor/builder/builder.js +1 -1
  16. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -1
  17. package/dist/cjs/src/descriptor/builder/parse.js +3 -3
  18. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +2 -2
  19. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -1
  20. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +1 -1
  21. package/dist/cjs/src/descriptor/descriptorWallet.d.ts +1 -1
  22. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -1
  23. package/dist/cjs/src/descriptor/descriptorWallet.js +1 -1
  24. package/dist/cjs/src/descriptor/index.d.ts +1 -1
  25. package/dist/cjs/src/descriptor/index.d.ts.map +1 -1
  26. package/dist/cjs/src/descriptor/index.js +1 -1
  27. package/dist/cjs/src/descriptor/validatePolicy.d.ts +3 -3
  28. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -1
  29. package/dist/cjs/src/descriptor/validatePolicy.js +3 -3
  30. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -1
  31. package/dist/cjs/src/impl/bch/bch.js +6 -38
  32. package/dist/cjs/src/impl/doge/doge.d.ts +2 -1
  33. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -1
  34. package/dist/cjs/src/impl/doge/doge.js +1 -1
  35. package/dist/cjs/src/impl/ltc/ltc.d.ts +0 -1
  36. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -1
  37. package/dist/cjs/src/impl/ltc/ltc.js +3 -41
  38. package/dist/cjs/src/impl/ltc/tltc.d.ts +0 -1
  39. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -1
  40. package/dist/cjs/src/impl/ltc/tltc.js +3 -40
  41. package/dist/cjs/src/index.d.ts +2 -0
  42. package/dist/cjs/src/index.d.ts.map +1 -1
  43. package/dist/cjs/src/index.js +3 -1
  44. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +2 -2
  45. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +3 -2
  46. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -1
  47. package/dist/cjs/src/offlineVault/descriptor/transaction.js +5 -8
  48. package/dist/cjs/src/recovery/RecoveryProvider.d.ts +1 -3
  49. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -1
  50. package/dist/cjs/src/recovery/RecoveryProvider.js +1 -1
  51. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +73 -4
  52. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -1
  53. package/dist/cjs/src/recovery/backupKeyRecovery.js +163 -129
  54. package/dist/cjs/src/recovery/crossChainRecovery.d.ts +5 -5
  55. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -1
  56. package/dist/cjs/src/recovery/crossChainRecovery.js +22 -121
  57. package/dist/cjs/src/recovery/psbt.d.ts +8 -31
  58. package/dist/cjs/src/recovery/psbt.d.ts.map +1 -1
  59. package/dist/cjs/src/recovery/psbt.js +14 -126
  60. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +3 -3
  61. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -1
  62. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +17 -54
  63. package/dist/cjs/src/transaction/descriptor/index.d.ts +1 -1
  64. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -1
  65. package/dist/cjs/src/transaction/descriptor/index.js +1 -1
  66. package/dist/cjs/src/transaction/descriptor/parse.d.ts +6 -4
  67. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -1
  68. package/dist/cjs/src/transaction/descriptor/parse.js +24 -50
  69. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +6 -7
  70. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -1
  71. package/dist/cjs/src/transaction/descriptor/signPsbt.js +19 -18
  72. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +4 -4
  73. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  74. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +10 -38
  75. package/dist/cjs/src/transaction/explainTransaction.d.ts +2 -1
  76. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -1
  77. package/dist/cjs/src/transaction/explainTransaction.js +3 -2
  78. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +1 -3
  79. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -1
  80. package/dist/cjs/src/transaction/fixedScript/SigningError.js +1 -1
  81. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +2 -1
  82. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
  83. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +1 -8
  84. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -1
  85. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +6 -11
  86. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts +2 -2
  87. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -1
  88. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.js +4 -2
  89. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts +1 -1
  90. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -1
  91. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +1 -1
  92. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +2 -2
  93. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
  94. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +4 -8
  95. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +6 -5
  96. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  97. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +42 -7
  98. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -1
  99. package/dist/cjs/src/transaction/signTransaction.js +10 -10
  100. package/dist/cjs/src/unspent.d.ts +55 -0
  101. package/dist/cjs/src/unspent.d.ts.map +1 -0
  102. package/dist/cjs/src/unspent.js +12 -0
  103. package/dist/cjs/src/wasmUtil.d.ts +29 -0
  104. package/dist/cjs/src/wasmUtil.d.ts.map +1 -0
  105. package/dist/cjs/src/wasmUtil.js +87 -0
  106. package/dist/cjs/test/unit/address.d.ts +1 -1
  107. package/dist/cjs/test/unit/address.d.ts.map +1 -1
  108. package/dist/cjs/test/unit/address.js +107 -137
  109. package/dist/cjs/test/unit/bip322.js +50 -1
  110. package/dist/cjs/test/unit/customSigner.js +5 -4
  111. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +37 -4
  112. package/dist/cjs/test/unit/descriptor/builder.js +10 -4
  113. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +37 -4
  114. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +40 -6
  115. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -1
  116. package/dist/cjs/test/unit/descriptorAddress.js +3 -3
  117. package/dist/cjs/test/unit/explainTransaction.js +26 -3
  118. package/dist/cjs/test/unit/keychains.js +40 -1
  119. package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
  120. package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
  121. package/dist/cjs/test/unit/postProcessPrebuild.js +62 -0
  122. package/dist/cjs/test/unit/prebuildAndSign.d.ts +0 -4
  123. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -1
  124. package/dist/cjs/test/unit/prebuildAndSign.js +12 -32
  125. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +82 -259
  126. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
  127. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
  128. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +144 -0
  129. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +38 -35
  130. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
  131. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
  132. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +186 -0
  133. package/dist/cjs/test/unit/recovery/mock.d.ts +15 -8
  134. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -1
  135. package/dist/cjs/test/unit/recovery/mock.js +49 -77
  136. package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
  137. package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
  138. package/dist/cjs/test/unit/signTransaction.js +244 -0
  139. package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
  140. package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
  141. package/dist/cjs/test/unit/testSpoofTransaction.js +114 -0
  142. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +46 -12
  143. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -1
  144. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +38 -4
  145. package/dist/cjs/test/unit/transaction/descriptor/parse.js +22 -19
  146. package/dist/cjs/test/unit/transaction/descriptor/sign.js +60 -16
  147. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +43 -10
  148. package/dist/cjs/test/unit/transaction.js +6 -225
  149. package/dist/cjs/test/unit/util/address.d.ts +13 -0
  150. package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
  151. package/dist/cjs/test/unit/util/address.js +15 -0
  152. package/dist/cjs/test/unit/util/index.d.ts +3 -0
  153. package/dist/cjs/test/unit/util/index.d.ts.map +1 -1
  154. package/dist/cjs/test/unit/util/index.js +4 -1
  155. package/dist/cjs/test/unit/util/keychains.d.ts +29 -0
  156. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -1
  157. package/dist/cjs/test/unit/util/keychains.js +51 -1
  158. package/dist/cjs/test/unit/util/nockBitGo.d.ts +8 -1
  159. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -1
  160. package/dist/cjs/test/unit/util/nockBitGo.js +17 -1
  161. package/dist/cjs/test/unit/util/psbt.d.ts +19 -0
  162. package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
  163. package/dist/cjs/test/unit/util/psbt.js +21 -0
  164. package/dist/cjs/test/unit/util/transaction.d.ts +8 -4
  165. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -1
  166. package/dist/cjs/test/unit/util/transaction.js +19 -1
  167. package/dist/cjs/test/unit/util/unspents.d.ts +66 -8
  168. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -1
  169. package/dist/cjs/test/unit/util/unspents.js +130 -15
  170. package/dist/cjs/test/unit/util/utxoCoins.d.ts +13 -0
  171. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -1
  172. package/dist/cjs/test/unit/util/utxoCoins.js +33 -2
  173. package/dist/cjs/test/unit/wallet.js +4 -4
  174. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  175. package/dist/esm/abstractUtxoCoin.d.ts +5 -6
  176. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
  177. package/dist/esm/abstractUtxoCoin.js +26 -7
  178. package/dist/esm/address/fixedScript.d.ts +1 -5
  179. package/dist/esm/address/fixedScript.d.ts.map +1 -1
  180. package/dist/esm/address/fixedScript.js +3 -5
  181. package/dist/esm/descriptor/NamedDescriptor.d.ts +4 -5
  182. package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -1
  183. package/dist/esm/descriptor/NamedDescriptor.js +5 -7
  184. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +2 -2
  185. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -1
  186. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +3 -5
  187. package/dist/esm/descriptor/builder/builder.d.ts +2 -3
  188. package/dist/esm/descriptor/builder/builder.d.ts.map +1 -1
  189. package/dist/esm/descriptor/builder/builder.js +1 -1
  190. package/dist/esm/descriptor/builder/parse.d.ts.map +1 -1
  191. package/dist/esm/descriptor/builder/parse.js +3 -3
  192. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +2 -2
  193. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -1
  194. package/dist/esm/descriptor/createWallet/createDescriptors.js +1 -1
  195. package/dist/esm/descriptor/descriptorWallet.d.ts +1 -1
  196. package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -1
  197. package/dist/esm/descriptor/descriptorWallet.js +1 -1
  198. package/dist/esm/descriptor/index.d.ts +1 -1
  199. package/dist/esm/descriptor/index.d.ts.map +1 -1
  200. package/dist/esm/descriptor/index.js +1 -1
  201. package/dist/esm/descriptor/validatePolicy.d.ts +3 -3
  202. package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -1
  203. package/dist/esm/descriptor/validatePolicy.js +3 -3
  204. package/dist/esm/impl/bch/bch.d.ts.map +1 -1
  205. package/dist/esm/impl/bch/bch.js +6 -5
  206. package/dist/esm/impl/doge/doge.d.ts +2 -1
  207. package/dist/esm/impl/doge/doge.d.ts.map +1 -1
  208. package/dist/esm/impl/doge/doge.js +1 -1
  209. package/dist/esm/impl/ltc/ltc.d.ts +0 -1
  210. package/dist/esm/impl/ltc/ltc.d.ts.map +1 -1
  211. package/dist/esm/impl/ltc/ltc.js +3 -8
  212. package/dist/esm/impl/ltc/tltc.d.ts +0 -1
  213. package/dist/esm/impl/ltc/tltc.d.ts.map +1 -1
  214. package/dist/esm/impl/ltc/tltc.js +3 -7
  215. package/dist/esm/index.d.ts +2 -0
  216. package/dist/esm/index.d.ts.map +1 -1
  217. package/dist/esm/index.js +3 -1
  218. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +2 -2
  219. package/dist/esm/offlineVault/descriptor/transaction.d.ts +3 -2
  220. package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -1
  221. package/dist/esm/offlineVault/descriptor/transaction.js +5 -8
  222. package/dist/esm/recovery/RecoveryProvider.d.ts +1 -3
  223. package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -1
  224. package/dist/esm/recovery/RecoveryProvider.js +1 -1
  225. package/dist/esm/recovery/backupKeyRecovery.d.ts +73 -4
  226. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -1
  227. package/dist/esm/recovery/backupKeyRecovery.js +165 -100
  228. package/dist/esm/recovery/crossChainRecovery.d.ts +5 -5
  229. package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -1
  230. package/dist/esm/recovery/crossChainRecovery.js +24 -90
  231. package/dist/esm/recovery/psbt.d.ts +8 -31
  232. package/dist/esm/recovery/psbt.d.ts.map +1 -1
  233. package/dist/esm/recovery/psbt.js +14 -91
  234. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +3 -3
  235. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -1
  236. package/dist/esm/transaction/descriptor/explainPsbt.js +14 -18
  237. package/dist/esm/transaction/descriptor/index.d.ts +1 -1
  238. package/dist/esm/transaction/descriptor/index.d.ts.map +1 -1
  239. package/dist/esm/transaction/descriptor/index.js +1 -1
  240. package/dist/esm/transaction/descriptor/parse.d.ts +6 -4
  241. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -1
  242. package/dist/esm/transaction/descriptor/parse.js +22 -15
  243. package/dist/esm/transaction/descriptor/signPsbt.d.ts +6 -7
  244. package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -1
  245. package/dist/esm/transaction/descriptor/signPsbt.js +19 -18
  246. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +4 -4
  247. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  248. package/dist/esm/transaction/descriptor/verifyTransaction.js +10 -5
  249. package/dist/esm/transaction/explainTransaction.d.ts +2 -1
  250. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -1
  251. package/dist/esm/transaction/explainTransaction.js +3 -2
  252. package/dist/esm/transaction/fixedScript/SigningError.d.ts +1 -3
  253. package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -1
  254. package/dist/esm/transaction/fixedScript/SigningError.js +1 -1
  255. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +2 -1
  256. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
  257. package/dist/esm/transaction/fixedScript/explainTransaction.js +1 -8
  258. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -1
  259. package/dist/esm/transaction/fixedScript/parseOutput.js +6 -11
  260. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts +2 -2
  261. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -1
  262. package/dist/esm/transaction/fixedScript/signLegacyTransaction.js +4 -2
  263. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts +1 -1
  264. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -1
  265. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +1 -1
  266. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +2 -2
  267. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
  268. package/dist/esm/transaction/fixedScript/signPsbtWasm.js +2 -6
  269. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +6 -5
  270. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  271. package/dist/esm/transaction/fixedScript/signTransaction.js +10 -8
  272. package/dist/esm/transaction/signTransaction.d.ts.map +1 -1
  273. package/dist/esm/transaction/signTransaction.js +10 -10
  274. package/dist/esm/unspent.d.ts +55 -0
  275. package/dist/esm/unspent.d.ts.map +1 -0
  276. package/dist/esm/unspent.js +8 -0
  277. package/dist/esm/wasmUtil.d.ts +29 -0
  278. package/dist/esm/wasmUtil.d.ts.map +1 -0
  279. package/dist/esm/wasmUtil.js +47 -0
  280. package/package.json +11 -12
  281. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +0 -2
  282. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +0 -1
  283. package/dist/cjs/test/unit/impl/btc/unit/btc.js +0 -220
  284. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +0 -4
  285. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +0 -1
  286. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +0 -10
  287. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +0 -2
  288. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +0 -1
  289. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +0 -18
  290. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +0 -2
  291. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +0 -1
  292. package/dist/cjs/test/unit/impl/ltc/unit/index.js +0 -39
@@ -1 +1 @@
1
- {"version":3,"file":"backupKeyRecovery.d.ts","sourceRoot":"","sources":["../../../../src/recovery/backupKeyRecovery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EACL,SAAS,EAQV,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAOvD,OAAO,EAAW,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAK/D,KAAK,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC;AAIjE,KAAK,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAKF,eAAO,MAAM,qCAAqC,KAAK,CAAC;AAGxD,eAAO,MAAM,2CAA2C,MAAM,CAAC;AAG/D,eAAO,MAAM,qCAAqC,KAAK,CAAC;AACxD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE;QACN,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;KAChC,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AA0CD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,cAAc,EAAE,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAmID,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,+BAA+B,GAAG,2BAA2B,CAAC,CAgKxE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,OAAO,CAC3B,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC;IACT,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAoBD"}
1
+ {"version":3,"file":"backupKeyRecovery.d.ts","sourceRoot":"","sources":["../../../../src/recovery/backupKeyRecovery.ts"],"names":[],"mappings":"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"}
@@ -1,60 +1,27 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
39
6
  exports.DEFAULT_RECOVERY_FEERATE_SAT_VBYTE_V2 = exports.DEFAULT_RECOVERY_FEERATE_SAT_VBYTE_V1_SWEEP = exports.DEFAULT_RECOVERY_FEERATE_SAT_VBYTE_V1 = void 0;
7
+ exports.backupKeyRecoveryWithWalletUnspents = backupKeyRecoveryWithWalletUnspents;
8
+ exports.formatBackupKeyRecoveryResult = formatBackupKeyRecoveryResult;
40
9
  exports.backupKeyRecovery = backupKeyRecovery;
41
10
  exports.v1BackupKeyRecovery = v1BackupKeyRecovery;
42
11
  exports.v1Sweep = v1Sweep;
43
12
  const lodash_1 = __importDefault(require("lodash"));
44
- const utxolib = __importStar(require("@bitgo/utxo-lib"));
45
13
  const sdk_core_1 = require("@bitgo/sdk-core");
46
- const utxo_lib_1 = require("@bitgo/utxo-lib");
47
14
  const wasm_utxo_1 = require("@bitgo/wasm-utxo");
48
15
  const signTransaction_1 = require("../transaction/fixedScript/signTransaction");
49
16
  const address_1 = require("../address");
50
17
  const decode_1 = require("../transaction/decode");
51
18
  const replayProtection_1 = require("../transaction/fixedScript/replayProtection");
52
19
  const names_1 = require("../names");
20
+ const unspent_1 = require("../unspent");
53
21
  const RecoveryProvider_1 = require("./RecoveryProvider");
54
22
  const mempoolApi_1 = require("./mempoolApi");
55
23
  const coingeckoApi_1 = require("./coingeckoApi");
56
24
  const psbt_1 = require("./psbt");
57
- const { getInternalChainCode, scriptTypeForChain, outputScripts, getExternalChainCode } = utxolib.bitgo;
58
25
  // V1 only deals with BTC. 50 sat/vbyte is very arbitrary.
59
26
  exports.DEFAULT_RECOVERY_FEERATE_SAT_VBYTE_V1 = 50;
60
27
  // FIXME(BTC-2691): it is unclear why sweeps have a different default than regular recovery. 100 sat/vbyte is extremely high.
@@ -112,9 +79,12 @@ function getFormattedAddress(coin, coinName, walletKeys, chain, addrIndex) {
112
79
  // Blockchair uses cashaddr format when querying the API for address information. Strip the prefix for BCH/BCHA.
113
80
  return format === 'cashaddr' ? address.split(':')[1] : address;
114
81
  }
82
+ function hasWitnessData(scriptType) {
83
+ return scriptType !== 'p2sh';
84
+ }
115
85
  async function queryBlockchainUnspentsPath(coin, params, walletKeys, chain) {
116
- const scriptType = scriptTypeForChain(chain);
117
- const fetchPrevTx = !utxolib.bitgo.outputScripts.hasWitnessData(scriptType) && (0, utxo_lib_1.getMainnet)(coin.network) !== utxo_lib_1.networks.zcash;
86
+ const scriptType = wasm_utxo_1.fixedScriptWallet.ChainCode.scriptType(chain);
87
+ const fetchPrevTx = !hasWitnessData(scriptType) && (0, names_1.getMainnetCoinName)(coin.name) !== 'zec';
118
88
  const recoveryProvider = params.recoveryProvider ?? (0, RecoveryProvider_1.forCoin)(coin.getChain(), params.apiKey);
119
89
  const MAX_SEQUENTIAL_ADDRESSES_WITHOUT_TXS = params.scan || 20;
120
90
  let numSequentialAddressesWithoutTxs = 0;
@@ -140,7 +110,7 @@ async function queryBlockchainUnspentsPath(coin, params, walletKeys, chain) {
140
110
  console.log(`Found an address with balance: ${formattedAddress} with balance ${addrInfo.balance}`);
141
111
  const addressUnspents = await recoveryProvider.getUnspentsForAddresses([formattedAddress]);
142
112
  const processedUnspents = await Promise.all(addressUnspents.map(async (u) => {
143
- const { txid, vout } = utxolib.bitgo.parseOutputId(u.id);
113
+ const { txid, vout } = (0, unspent_1.parseOutputId)(u.id);
144
114
  let val = BigInt(u.value);
145
115
  if (coin.amountType === 'bigint') {
146
116
  // blockchair returns the number with the correct precision, but in number format
@@ -196,6 +166,117 @@ async function getRecoveryFeePerBytes(coin, { defaultValue }) {
196
166
  return defaultValue;
197
167
  }
198
168
  }
169
+ function hasPrivateKey(key) {
170
+ return key.privateKey !== undefined;
171
+ }
172
+ /**
173
+ * Builds a funds recovery PSBT without BitGo, using provided unspents.
174
+ *
175
+ * This is the core transaction building logic, separated from unspent gathering
176
+ * and output formatting. Returns a PSBT at the appropriate signing stage.
177
+ *
178
+ * Signing behavior is determined by the keys:
179
+ * - If user key has no private key: unsigned PSBT
180
+ * - If user key has private key but backup doesn't: half-signed PSBT (user signature only)
181
+ * - If both user and backup keys have private keys: fully signed PSBT (not finalized)
182
+ *
183
+ * @param coinName - The coin name for the PSBT
184
+ * @param params - Recovery parameters with pre-derived keys
185
+ * @param unspents - The wallet unspents to recover (must be non-empty)
186
+ * @returns The PSBT at the appropriate signing stage (never finalized)
187
+ */
188
+ function backupKeyRecoveryWithWalletUnspents(coinName, params, unspents) {
189
+ const { walletKeys, keys, recoveryDestination, feeRateSatVB, krsFee, krsFeeAddress } = params;
190
+ const totalInputAmount = (0, unspent_1.unspentSum)(unspents);
191
+ if (totalInputAmount <= BigInt(0)) {
192
+ throw new sdk_core_1.ErrorNoInputToRecover();
193
+ }
194
+ let psbt = (0, psbt_1.createBackupKeyRecoveryPsbt)(coinName, walletKeys, unspents, {
195
+ feeRateSatVB: feeRateSatVB,
196
+ recoveryDestination: recoveryDestination,
197
+ keyRecoveryServiceFee: krsFee ?? BigInt(0),
198
+ keyRecoveryServiceFeeAddress: krsFeeAddress,
199
+ });
200
+ const userHasPrivateKey = hasPrivateKey(keys[0]);
201
+ const backupHasPrivateKey = hasPrivateKey(keys[1]);
202
+ if (!userHasPrivateKey) {
203
+ // Unsigned sweep - return unsigned PSBT
204
+ return psbt;
205
+ }
206
+ const replayProtection = { publicKeys: (0, replayProtection_1.getReplayProtectionPubkeys)(coinName) };
207
+ // Sign with user key
208
+ psbt = (0, signTransaction_1.signAndVerifyPsbt)(psbt, keys[0], walletKeys, replayProtection);
209
+ if (backupHasPrivateKey) {
210
+ // Full recovery - sign with backup key too
211
+ psbt = (0, signTransaction_1.signAndVerifyPsbt)(psbt, keys[1], walletKeys, replayProtection);
212
+ }
213
+ // Return PSBT (not finalized - let caller decide how to format)
214
+ return psbt;
215
+ }
216
+ /**
217
+ * Formats a backup key recovery PSBT into the appropriate response format.
218
+ *
219
+ * Output format depends on signing state and KRS provider:
220
+ * - Unsigned sweep: FormattedOfflineVaultTxInfo with PSBT hex
221
+ * - KRS keyternal: BackupKeyRecoveryTransansaction with legacy half-signed tx hex
222
+ * - KRS other: BackupKeyRecoveryTransansaction with PSBT hex
223
+ * - Full recovery: BackupKeyRecoveryTransansaction with finalized tx hex
224
+ *
225
+ * @param coin - The coin instance
226
+ * @param psbt - The PSBT to format (at appropriate signing stage)
227
+ * @param params - Formatting parameters
228
+ * @returns The formatted recovery result
229
+ */
230
+ function formatBackupKeyRecoveryResult(coin, psbt, params) {
231
+ const { walletKeys, keys, recoveryDestination, krsProvider, backupKey, unspents } = params;
232
+ const userHasPrivateKey = hasPrivateKey(keys[0]);
233
+ const backupHasPrivateKey = hasPrivateKey(keys[1]);
234
+ const isUnsignedSweep = !userHasPrivateKey && !backupHasPrivateKey;
235
+ const isKrsRecovery = krsProvider !== undefined && userHasPrivateKey && !backupHasPrivateKey;
236
+ const isFullRecovery = userHasPrivateKey && backupHasPrivateKey;
237
+ // Unsigned sweep - return FormattedOfflineVaultTxInfo
238
+ if (isUnsignedSweep) {
239
+ return {
240
+ txHex: (0, decode_1.encodeTransaction)(psbt).toString('hex'),
241
+ txInfo: {},
242
+ feeInfo: {},
243
+ coin: coin.getChain(),
244
+ };
245
+ }
246
+ const responseTxFormat = !isKrsRecovery || krsProvider === 'keyternal' ? 'legacy' : 'psbt';
247
+ const txInfo = {};
248
+ // Include inputs array for legacy format responses
249
+ txInfo.inputs =
250
+ responseTxFormat === 'legacy'
251
+ ? unspents.map((u) => ({ ...u, value: Number(u.value), valueString: u.value.toString(), prevTx: undefined }))
252
+ : undefined;
253
+ if (isKrsRecovery) {
254
+ // KRS recovery - half-signed
255
+ // keyternal uses legacy format, other KRS providers use PSBT format
256
+ txInfo.transactionHex =
257
+ krsProvider === 'keyternal'
258
+ ? Buffer.from(psbt.getHalfSignedLegacyFormat()).toString('hex')
259
+ : (0, decode_1.encodeTransaction)(psbt).toString('hex');
260
+ txInfo.coin = coin.getChain();
261
+ txInfo.backupKey = backupKey ?? '';
262
+ const recoveryAmount = (0, psbt_1.getRecoveryAmount)(psbt, walletKeys, recoveryDestination);
263
+ txInfo.recoveryAmount = Number(recoveryAmount);
264
+ txInfo.recoveryAmountString = recoveryAmount.toString();
265
+ }
266
+ else if (isFullRecovery) {
267
+ // Full recovery - finalize and extract transaction
268
+ psbt.finalizeAllInputs();
269
+ txInfo.transactionHex = Buffer.from(psbt.extractTransaction().toBytes()).toString('hex');
270
+ }
271
+ return txInfo;
272
+ }
273
+ function getBip32Keys(bitgo, params) {
274
+ const keys = (0, sdk_core_1.getBip32Keys)(bitgo, params, { requireBitGoXpub: true });
275
+ if (!(0, sdk_core_1.isTriple)(keys)) {
276
+ throw new Error(`expected key triple`);
277
+ }
278
+ return keys.map((k) => wasm_utxo_1.BIP32.from(k.toBase58()));
279
+ }
199
280
  /**
200
281
  * Builds a funds recovery transaction without BitGo.
201
282
  *
@@ -235,41 +316,29 @@ async function backupKeyRecovery(coin, bitgo, params) {
235
316
  if (params.feeRate !== undefined && (!Number.isFinite(params.feeRate) || params.feeRate <= 0)) {
236
317
  throw new Error('feeRate must be a positive number');
237
318
  }
238
- const isKrsRecovery = (0, sdk_core_1.getIsKrsRecovery)(params);
239
- const isUnsignedSweep = (0, sdk_core_1.getIsUnsignedSweep)(params);
240
- const responseTxFormat = !isKrsRecovery || params.krsProvider === 'keyternal' ? 'legacy' : 'psbt';
241
- const krsProvider = isKrsRecovery ? (0, sdk_core_1.getKrsProvider)(coin, params.krsProvider) : undefined;
242
319
  // check whether key material and password authenticate the users and return parent keys of all three keys of the wallet
243
- const keys = (0, sdk_core_1.getBip32Keys)(bitgo, params, { requireBitGoXpub: true });
244
- if (!(0, sdk_core_1.isTriple)(keys)) {
245
- throw new Error(`expected key triple`);
246
- }
247
- const walletKeys = new utxolib.bitgo.RootWalletKeys(keys, [
248
- params.userKeyPath || utxolib.bitgo.RootWalletKeys.defaultPrefix,
249
- utxolib.bitgo.RootWalletKeys.defaultPrefix,
250
- utxolib.bitgo.RootWalletKeys.defaultPrefix,
251
- ]);
252
- const unspents = (await Promise.all(outputScripts.scriptTypes2Of3
253
- .filter((addressType) => coin.supportsAddressType(addressType) && !params.ignoreAddressTypes?.includes(addressType))
320
+ const keys = getBip32Keys(bitgo, params);
321
+ const walletKeys = wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from({
322
+ triple: keys,
323
+ derivationPrefixes: [params.userKeyPath || 'm/0/0', 'm/0/0', 'm/0/0'],
324
+ });
325
+ const unspents = (await Promise.all(wasm_utxo_1.fixedScriptWallet.outputScriptTypes
326
+ .filter((addressType) => wasm_utxo_1.fixedScriptWallet.supportsScriptType(coin.name, addressType) &&
327
+ !params.ignoreAddressTypes?.includes(addressType))
254
328
  .reduce((queries, addressType) => [
255
329
  ...queries,
256
- queryBlockchainUnspentsPath(coin, params, walletKeys, getExternalChainCode(addressType)),
257
- queryBlockchainUnspentsPath(coin, params, walletKeys, getInternalChainCode(addressType)),
330
+ queryBlockchainUnspentsPath(coin, params, walletKeys, wasm_utxo_1.fixedScriptWallet.ChainCode.value(addressType, 'external')),
331
+ queryBlockchainUnspentsPath(coin, params, walletKeys, wasm_utxo_1.fixedScriptWallet.ChainCode.value(addressType, 'internal')),
258
332
  ], []))).flat();
259
- // Execute the queries and gather the unspents
260
- const totalInputAmount = utxolib.bitgo.unspentSum(unspents, 'bigint');
261
- if (totalInputAmount <= BigInt(0)) {
262
- throw new sdk_core_1.ErrorNoInputToRecover();
263
- }
264
- const txInfo = {};
265
- const feePerByte = params.feeRate !== undefined
333
+ const feeRateSatVB = params.feeRate !== undefined
266
334
  ? params.feeRate
267
335
  : await getRecoveryFeePerBytes(coin, { defaultValue: exports.DEFAULT_RECOVERY_FEERATE_SAT_VBYTE_V2 });
268
- txInfo.inputs =
269
- responseTxFormat === 'legacy'
270
- ? unspents.map((u) => ({ ...u, value: Number(u.value), valueString: u.value.toString(), prevTx: undefined }))
271
- : undefined;
336
+ // Calculate KRS fee if needed
337
+ const userHasPrivateKey = hasPrivateKey(keys[0]);
338
+ const backupHasPrivateKey = hasPrivateKey(keys[1]);
339
+ const isKrsRecovery = params.krsProvider !== undefined && userHasPrivateKey && !backupHasPrivateKey;
272
340
  let krsFee = BigInt(0);
341
+ let krsFeeAddress;
273
342
  if (isKrsRecovery && params.krsProvider) {
274
343
  try {
275
344
  krsFee = BigInt(await calculateFeeAmount(coin, { provider: params.krsProvider }));
@@ -278,70 +347,35 @@ async function backupKeyRecovery(coin, bitgo, params) {
278
347
  // Don't let this error block the recovery -
279
348
  console.dir(err);
280
349
  }
281
- }
282
- let krsFeeAddress;
283
- if (krsProvider && krsFee > BigInt(0)) {
284
- if (!krsProvider.feeAddresses) {
285
- throw new Error(`keyProvider must define feeAddresses`);
286
- }
287
- krsFeeAddress = krsProvider.feeAddresses[coin.getChain()];
288
- if (!krsFeeAddress) {
289
- throw new Error('this KRS provider has not configured their fee structure yet - recovery cannot be completed');
350
+ if (krsFee > BigInt(0)) {
351
+ const krsProviderConfig = (0, sdk_core_1.getKrsProvider)(coin, params.krsProvider);
352
+ if (!krsProviderConfig.feeAddresses) {
353
+ throw new Error(`keyProvider must define feeAddresses`);
354
+ }
355
+ krsFeeAddress = krsProviderConfig.feeAddresses[coin.getChain()];
356
+ if (!krsFeeAddress) {
357
+ throw new Error('this KRS provider has not configured their fee structure yet - recovery cannot be completed');
358
+ }
290
359
  }
291
360
  }
292
- // Use wasm-utxo for testnet coins only, utxolib for mainnet
293
- const backend = (0, names_1.isTestnetCoin)(coin.name) ? 'wasm-utxo' : 'utxolib';
294
- let psbt = (0, psbt_1.createBackupKeyRecoveryPsbt)(coin.getChain(), walletKeys, unspents, {
295
- feeRateSatVB: feePerByte,
361
+ // Build and sign PSBT
362
+ const psbt = backupKeyRecoveryWithWalletUnspents(coin.name, {
363
+ walletKeys,
364
+ keys,
296
365
  recoveryDestination: params.recoveryDestination,
297
- keyRecoveryServiceFee: krsFee,
298
- keyRecoveryServiceFeeAddress: krsFeeAddress,
299
- }, backend);
300
- if (isUnsignedSweep) {
301
- return {
302
- txHex: (0, decode_1.encodeTransaction)(psbt).toString('hex'),
303
- txInfo: {},
304
- feeInfo: {},
305
- coin: coin.getChain(),
306
- };
307
- }
308
- const rootWalletKeysWasm = wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from(walletKeys);
309
- const replayProtection = { publicKeys: (0, replayProtection_1.getReplayProtectionPubkeys)(coin.name) };
310
- // Sign with user key first
311
- psbt = (0, signTransaction_1.signAndVerifyPsbt)(psbt, walletKeys.user, rootWalletKeysWasm, replayProtection);
312
- if (isKrsRecovery) {
313
- // The KRS provider keyternal solely supports P2SH, P2WSH, and P2SH-P2WSH input script types.
314
- // It currently uses an outdated BitGoJS SDK, which relies on a legacy transaction builder for cosigning.
315
- // Unfortunately, upgrading the keyternal code presents challenges,
316
- // which hinders the integration of the latest BitGoJS SDK with PSBT signing support.
317
- txInfo.transactionHex =
318
- params.krsProvider === 'keyternal'
319
- ? utxolib.bitgo.extractP2msOnlyHalfSignedTx((0, psbt_1.toPsbtToUtxolibPsbt)(psbt, coin.name)).toBuffer().toString('hex')
320
- : (0, decode_1.encodeTransaction)(psbt).toString('hex');
321
- }
322
- else {
323
- // Sign with backup key
324
- psbt = (0, signTransaction_1.signAndVerifyPsbt)(psbt, walletKeys.backup, rootWalletKeysWasm, replayProtection);
325
- // Finalize and extract transaction
326
- psbt.finalizeAllInputs();
327
- if (psbt instanceof utxolib.bitgo.UtxoPsbt) {
328
- txInfo.transactionHex = psbt.extractTransaction().toBuffer().toString('hex');
329
- }
330
- else if (psbt instanceof wasm_utxo_1.fixedScriptWallet.BitGoPsbt) {
331
- txInfo.transactionHex = Buffer.from(psbt.extractTransaction()).toString('hex');
332
- }
333
- else {
334
- throw new Error('expected a UtxoPsbt or BitGoPsbt object');
335
- }
336
- }
337
- if (isKrsRecovery) {
338
- txInfo.coin = coin.getChain();
339
- txInfo.backupKey = params.backupKey;
340
- const recoveryAmount = (0, psbt_1.getRecoveryAmount)(psbt, walletKeys, params.recoveryDestination);
341
- txInfo.recoveryAmount = Number(recoveryAmount);
342
- txInfo.recoveryAmountString = recoveryAmount.toString();
343
- }
344
- return txInfo;
366
+ feeRateSatVB,
367
+ krsFee,
368
+ krsFeeAddress,
369
+ }, unspents);
370
+ // Format the result
371
+ return formatBackupKeyRecoveryResult(coin, psbt, {
372
+ walletKeys,
373
+ keys,
374
+ recoveryDestination: params.recoveryDestination,
375
+ krsProvider: params.krsProvider,
376
+ backupKey: params.backupKey,
377
+ unspents,
378
+ });
345
379
  }
346
380
  async function v1BackupKeyRecovery(coin, bitgo, params) {
347
381
  if (lodash_1.default.isUndefined(params.recoveryDestination) ||
@@ -374,4 +408,4 @@ async function v1Sweep(coin, bitgo, params) {
374
408
  feeRate: recoveryFeePerByte,
375
409
  });
376
410
  }
377
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOFFBLDhDQW9LQztBQXFCRCxrREFvQkM7QUFFRCwwQkE0QkM7QUF6ZkQsb0RBQXVCO0FBQ3ZCLHlEQUEyQztBQUMzQyw4Q0FTeUI7QUFDekIsOENBQXVEO0FBQ3ZELGdEQUFxRDtBQUdyRCxnRkFBK0U7QUFDL0Usd0NBQThEO0FBQzlELGtEQUEwRDtBQUMxRCxrRkFBeUY7QUFDekYsb0NBQXVEO0FBRXZELHlEQUErRDtBQUMvRCw2Q0FBMEM7QUFDMUMsaURBQThDO0FBQzlDLGlDQUEwRztBQVUxRyxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUV4RywwREFBMEQ7QUFDN0MsUUFBQSxxQ0FBcUMsR0FBRyxFQUFFLENBQUM7QUFFeEQsNkhBQTZIO0FBQ2hILFFBQUEsMkNBQTJDLEdBQUcsR0FBRyxDQUFDO0FBRS9ELGtGQUFrRjtBQUNyRSxRQUFBLHFDQUFxQyxHQUFHLEVBQUUsQ0FBQztBQVV4RDs7Ozs7Ozs7OztHQVVHO0FBQ0gsS0FBSyxVQUFVLHNCQUFzQixDQUFDLElBQXNCO0lBQzFELE9BQU8sTUFBTSxJQUFJLDJCQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxJQUFzQixFQUFFLE1BQTRCO0lBQ3BGLE1BQU0sV0FBVyxHQUFHLHVCQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxJQUFJLFdBQVcsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUMzQyxNQUFNLFlBQVksR0FBVyxNQUFNLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO1NBQU0sQ0FBQztRQUNOLCtHQUErRztRQUMvRyxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbkQsQ0FBQztBQUNILENBQUM7QUFrQkQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLG1CQUFtQixDQUMxQixJQUFzQixFQUN0QixRQUFzQixFQUN0QixVQUEwQixFQUMxQixLQUFnQixFQUNoQixTQUFpQjtJQUVqQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hHLE1BQU0sT0FBTyxHQUFHLElBQUEsMENBQWdDLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRWpHLGdIQUFnSDtJQUNoSCxPQUFPLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUNqRSxDQUFDO0FBRUQsS0FBSyxVQUFVLDJCQUEyQixDQUN4QyxJQUFzQixFQUN0QixNQUFxQixFQUNyQixVQUEwQixFQUMxQixLQUFnQjtJQUVoQixNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxNQUFNLFdBQVcsR0FDZixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFBLHFCQUFVLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLG1CQUFRLENBQUMsS0FBSyxDQUFDO0lBQ3pHLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixJQUFJLElBQUEsMEJBQU8sRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVGLE1BQU0sb0NBQW9DLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDL0QsSUFBSSxnQ0FBZ0MsR0FBRyxDQUFDLENBQUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFOUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxJQUFZO1FBQ25DLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsU0FBUyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0QsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLLFVBQVUsY0FBYyxDQUFDLFNBQWlCO1FBQzdDLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1RixNQUFNLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pFLG9HQUFvRztRQUNwRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsZ0NBQWdDLEVBQUUsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLGdDQUFnQyxHQUFHLENBQUMsQ0FBQztZQUVyQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLGdCQUFnQixpQkFBaUIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ25HLE1BQU0sZUFBZSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN6QyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQWtDLEVBQUU7b0JBQzlELE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN6RCxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ2pDLGlGQUFpRjt3QkFDakYsNEZBQTRGO3dCQUM1RixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDbkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3BDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBUyxLQUFLLENBQUMsQ0FBQzs0QkFDeEQsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUM1QixDQUFDO29CQUNILENBQUM7b0JBQ0QsbUVBQW1FO29CQUNuRSxzREFBc0Q7b0JBQ3RELENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ3hELE9BQU87d0JBQ0wsR0FBRyxDQUFDO3dCQUNKLEtBQUssRUFBRSxHQUFHO3dCQUNWLEtBQUssRUFBRSxLQUFLO3dCQUNaLEtBQUssRUFBRSxTQUFTO3dCQUNoQixNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO3FCQUNuRCxDQUFDO2dCQUM3QixDQUFDLENBQUMsQ0FDSCxDQUFDO2dCQUVGLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxnQ0FBZ0MsSUFBSSxvQ0FBb0MsRUFBRSxDQUFDO1lBQzdFLDZIQUE2SDtZQUM3SCxjQUFjO1lBQ2QsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELG1DQUFtQztJQUVuQyxNQUFNLGNBQWMsR0FBNEIsRUFBRSxDQUFDO0lBQ25ELHFDQUFxQztJQUNyQyxNQUFNLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4QixJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMseUNBQXlDO1FBQ3pDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxLQUFLLFVBQVUsc0JBQXNCLENBQ25DLElBQXNCLEVBQ3RCLEVBQUUsWUFBWSxFQUE0QjtJQUUxQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNoQyw2RUFBNkU7UUFDN0UsbUJBQW1CO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDO0FBV0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsSUFBc0IsRUFDdEIsS0FBZ0IsRUFDaEIsTUFBcUI7SUFFckIsSUFBSSxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUNFLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUN6QyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQ3JFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUYsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFBLDJCQUFnQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sZUFBZSxHQUFHLElBQUEsNkJBQWtCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFFbEcsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFBLHlCQUFjLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRXpGLHdIQUF3SDtJQUN4SCxNQUFNLElBQUksR0FBRyxJQUFBLHVCQUFZLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckUsSUFBSSxDQUFDLElBQUEsbUJBQVEsRUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUU7UUFDeEQsTUFBTSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFhO1FBQ2hFLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLGFBQWE7UUFDMUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsYUFBYTtLQUMzQyxDQUFDLENBQUM7SUFFSCxNQUFNLFFBQVEsR0FBNEIsQ0FDeEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLGFBQWEsQ0FBQyxlQUFlO1NBQzFCLE1BQU0sQ0FDTCxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FDNUc7U0FDQSxNQUFNLENBQ0wsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUN4QixHQUFHLE9BQU87UUFDViwyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RiwyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztLQUN6RixFQUNELEVBQXdDLENBQ3pDLENBQ0osQ0FDRixDQUFDLElBQUksRUFBRSxDQUFDO0lBRVQsOENBQThDO0lBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RFLElBQUksZ0JBQWdCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLGdDQUFxQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEVBQXFDLENBQUM7SUFDckQsTUFBTSxVQUFVLEdBQ2QsTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQzFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTztRQUNoQixDQUFDLENBQUMsTUFBTSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsNkNBQXFDLEVBQUUsQ0FBQyxDQUFDO0lBRWxHLE1BQU0sQ0FBQyxNQUFNO1FBQ1gsZ0JBQWdCLEtBQUssUUFBUTtZQUMzQixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzdHLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFaEIsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLElBQUksYUFBYSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYiw0Q0FBNEM7WUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksYUFBaUMsQ0FBQztJQUN0QyxJQUFJLFdBQVcsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUVELGFBQWEsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLDZGQUE2RixDQUFDLENBQUM7UUFDakgsQ0FBQztJQUNILENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsTUFBTSxPQUFPLEdBQWdCLElBQUEscUJBQWEsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hGLElBQUksSUFBSSxHQUFHLElBQUEsa0NBQTJCLEVBQ3BDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDZixVQUFVLEVBQ1YsUUFBUSxFQUNSO1FBQ0UsWUFBWSxFQUFFLFVBQVU7UUFDeEIsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQjtRQUMvQyxxQkFBcUIsRUFBRSxNQUFNO1FBQzdCLDRCQUE0QixFQUFFLGFBQWE7S0FDNUMsRUFDRCxPQUFPLENBQ1IsQ0FBQztJQUVGLElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFBLDBCQUFpQixFQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDOUMsTUFBTSxFQUFFLEVBQUU7WUFDVixPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyw2QkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBQSw2Q0FBMEIsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUUvRSwyQkFBMkI7SUFDM0IsSUFBSSxHQUFHLElBQUEsbUNBQWlCLEVBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUV0RixJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLDZGQUE2RjtRQUM3Rix5R0FBeUc7UUFDekcsbUVBQW1FO1FBQ25FLHFGQUFxRjtRQUNyRixNQUFNLENBQUMsY0FBYztZQUNuQixNQUFNLENBQUMsV0FBVyxLQUFLLFdBQVc7Z0JBQ2hDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLElBQUEsMEJBQW1CLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQzVHLENBQUMsQ0FBQyxJQUFBLDBCQUFpQixFQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO1NBQU0sQ0FBQztRQUNOLHVCQUF1QjtRQUN2QixJQUFJLEdBQUcsSUFBQSxtQ0FBaUIsRUFBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hGLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9FLENBQUM7YUFBTSxJQUFJLElBQUksWUFBWSw2QkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2RCxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakYsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNwQyxNQUFNLGNBQWMsR0FBRyxJQUFBLHdCQUFpQixFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkYsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQXFCTSxLQUFLLFVBQVUsbUJBQW1CLENBQ3ZDLElBQXNCLEVBQ3RCLEtBQWdCLEVBQ2hCLE1BQXVCO0lBRXZCLElBQ0UsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1FBQ3pDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFDckUsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLHNCQUFzQixDQUFDLElBQUksRUFBRTtRQUM1RCxZQUFZLEVBQUUsNkNBQXFDO0tBQ3BELENBQUMsQ0FBQztJQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNwRSxPQUFPLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUM1QixHQUFHLE1BQU07UUFDVCxPQUFPLEVBQUUsa0JBQWtCO0tBQzVCLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFTSxLQUFLLFVBQVUsT0FBTyxDQUMzQixJQUFzQixFQUN0QixLQUFnQixFQUNoQixNQUFxQjtJQU1yQixJQUNFLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUN6QyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQ3JFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN6QixrQkFBa0IsR0FBRyxNQUFNLHNCQUFzQixDQUFDLElBQUksRUFBRTtZQUN0RCxZQUFZLEVBQUUsbURBQTJDO1NBQzFELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEUsT0FBTyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDMUIsR0FBRyxNQUFNO1FBQ1QsT0FBTyxFQUFFLGtCQUFrQjtLQUM1QixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7XG4gIEJpdEdvQmFzZSxcbiAgRXJyb3JOb0lucHV0VG9SZWNvdmVyLFxuICBnZXRLcnNQcm92aWRlcixcbiAgZ2V0QmlwMzJLZXlzLFxuICBnZXRJc0tyc1JlY292ZXJ5LFxuICBnZXRJc1Vuc2lnbmVkU3dlZXAsXG4gIGlzVHJpcGxlLFxuICBrcnNQcm92aWRlcnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBnZXRNYWlubmV0LCBuZXR3b3JrcyB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luIH0gZnJvbSAnLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5pbXBvcnQgeyBzaWduQW5kVmVyaWZ5UHNidCB9IGZyb20gJy4uL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3NpZ25UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBnZW5lcmF0ZUFkZHJlc3NXaXRoQ2hhaW5BbmRJbmRleCB9IGZyb20gJy4uL2FkZHJlc3MnO1xuaW1wb3J0IHsgZW5jb2RlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbi9kZWNvZGUnO1xuaW1wb3J0IHsgZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMgfSBmcm9tICcuLi90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9yZXBsYXlQcm90ZWN0aW9uJztcbmltcG9ydCB7IGlzVGVzdG5ldENvaW4sIFV0eG9Db2luTmFtZSB9IGZyb20gJy4uL25hbWVzJztcblxuaW1wb3J0IHsgZm9yQ29pbiwgUmVjb3ZlcnlQcm92aWRlciB9IGZyb20gJy4vUmVjb3ZlcnlQcm92aWRlcic7XG5pbXBvcnQgeyBNZW1wb29sQXBpIH0gZnJvbSAnLi9tZW1wb29sQXBpJztcbmltcG9ydCB7IENvaW5nZWNrb0FwaSB9IGZyb20gJy4vY29pbmdlY2tvQXBpJztcbmltcG9ydCB7IGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidCwgZ2V0UmVjb3ZlcnlBbW91bnQsIFBzYnRCYWNrZW5kLCB0b1BzYnRUb1V0eG9saWJQc2J0IH0gZnJvbSAnLi9wc2J0JztcblxudHlwZSBTY3JpcHRUeXBlMk9mMyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcbnR5cGUgQ2hhaW5Db2RlID0gdXR4b2xpYi5iaXRnby5DaGFpbkNvZGU7XG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcbnR5cGUgV2FsbGV0VW5zcGVudEpTT04gPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQgJiB7XG4gIHZhbHVlU3RyaW5nOiBzdHJpbmc7XG59O1xuXG5jb25zdCB7IGdldEludGVybmFsQ2hhaW5Db2RlLCBzY3JpcHRUeXBlRm9yQ2hhaW4sIG91dHB1dFNjcmlwdHMsIGdldEV4dGVybmFsQ2hhaW5Db2RlIH0gPSB1dHhvbGliLmJpdGdvO1xuXG4vLyBWMSBvbmx5IGRlYWxzIHdpdGggQlRDLiA1MCBzYXQvdmJ5dGUgaXMgdmVyeSBhcmJpdHJhcnkuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUNPVkVSWV9GRUVSQVRFX1NBVF9WQllURV9WMSA9IDUwO1xuXG4vLyBGSVhNRShCVEMtMjY5MSk6IGl0IGlzIHVuY2xlYXIgd2h5IHN3ZWVwcyBoYXZlIGEgZGlmZmVyZW50IGRlZmF1bHQgdGhhbiByZWd1bGFyIHJlY292ZXJ5LiAxMDAgc2F0L3ZieXRlIGlzIGV4dHJlbWVseSBoaWdoLlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVDT1ZFUllfRkVFUkFURV9TQVRfVkJZVEVfVjFfU1dFRVAgPSAxMDA7XG5cbi8vIEZJWE1FKEJUQy0yNjkxKTogaXQgbWFrZXMgbGl0dGxlIHNlbnNlIHRvIGhhdmUgYSBzaW5nbGUgZGVmYXVsdCBmb3IgZXZlcnkgY29pbi5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JFQ09WRVJZX0ZFRVJBVEVfU0FUX1ZCWVRFX1YyID0gNTA7XG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbyB7XG4gIHR4SW5mbzoge1xuICAgIHVuc3BlbnRzPzogV2FsbGV0VW5zcGVudEpTT05bXTtcbiAgfTtcbiAgdHhIZXg6IHN0cmluZztcbiAgZmVlSW5mbzogUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuICBjb2luOiBzdHJpbmc7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IG1hcmtldCBwcmljZSBmcm9tIGEgdGhpcmQgcGFydHkgdG8gYmUgdXNlZCBmb3IgcmVjb3ZlcnlcbiAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCBmb3Igbm9uLWJpdGdvIHJlY292ZXJ5IHRyYW5zYWN0aW9ucywgd2hlbiBpdCBpcyBuZWNlc3NhcnlcbiAqIHRvIGNhbGN1bGF0ZSB0aGUgcm91Z2ggZmVlIG5lZWRlZCB0byBwYXkgdG8gS2V5dGVybmFsLiBXZSBhcmUgb2theSB3aXRoIGFwcHJveGltYXRpbmcsXG4gKiBiZWNhdXNlIHRoZSByZXN1bHRpbmcgcHJpY2Ugb2YgdGhpcyBmdW5jdGlvbiBvbmx5IGhhcyBsZXNzIHRoYW4gMSBkb2xsYXIgaW5mbHVlbmNlIG9uIHRoZVxuICogZmVlIHRoYXQgbmVlZHMgdG8gYmUgcGFpZCB0byBLZXl0ZXJuYWwuXG4gKlxuICogU2VlIGNhbGN1bGF0ZUZlZUFtb3VudCBmdW5jdGlvbjogIHJldHVybiBNYXRoLnJvdW5kKGZlZUFtb3VudFVzZCAvIGN1cnJlbnRQcmljZSAqIHNlbGYuZ2V0QmFzZUZhY3RvcigpKTtcbiAqXG4gKiBUaGlzIGVuZCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgYXMgYW4gYWNjdXJhdGUgZW5kcG9pbnQsIHNpbmNlIHNvbWUgY29pbnMnIHByaWNlcyBhcmUgbWlzc2luZyBmcm9tIHRoZSBwcm92aWRlclxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWNvdmVyeU1hcmtldFByaWNlKGNvaW46IEFic3RyYWN0VXR4b0NvaW4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gYXdhaXQgbmV3IENvaW5nZWNrb0FwaSgpLmdldFVTRFByaWNlKGNvaW4uZ2V0RmFtaWx5KCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFtb3VudCAoaW4gYmFzZSB1bml0cykgdG8gcGF5IGEgS1JTIHByb3ZpZGVyIHdoZW4gYnVpbGRpbmcgYSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICogQHBhcmFtIGNvaW5cbiAqIEBwYXJhbSBwYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXMucHJvdmlkZXIge1N0cmluZ30gdGhlIEtSUyBwcm92aWRlciB0aGF0IGhvbGRzIHRoZSBiYWNrdXAga2V5XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlRmVlQW1vdW50KGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHBhcmFtczogeyBwcm92aWRlcjogc3RyaW5nIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBrcnNQcm92aWRlciA9IGtyc1Byb3ZpZGVyc1twYXJhbXMucHJvdmlkZXJdO1xuXG4gIGlmIChrcnNQcm92aWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBmZWUgc3RydWN0dXJlIHNwZWNpZmllZCBmb3IgcHJvdmlkZXIgJHtwYXJhbXMucHJvdmlkZXJ9YCk7XG4gIH1cblxuICBpZiAoa3JzUHJvdmlkZXIuZmVlVHlwZSA9PT0gJ2ZsYXRVc2QnKSB7XG4gICAgY29uc3QgZmVlQW1vdW50VXNkID0ga3JzUHJvdmlkZXIuZmVlQW1vdW50O1xuICAgIGNvbnN0IGN1cnJlbnRQcmljZTogbnVtYmVyID0gYXdhaXQgZ2V0UmVjb3ZlcnlNYXJrZXRQcmljZShjb2luKTtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKChmZWVBbW91bnRVc2QgLyBjdXJyZW50UHJpY2UpICogY29pbi5nZXRCYXNlRmFjdG9yKCkpO1xuICB9IGVsc2Uge1xuICAgIC8vIHdlIGNhbiBhZGQgbW9yZSBmZWUgc3RydWN0dXJlcyBoZXJlIGFzIG5lZWRlZCBmb3IgZGlmZmVyZW50IHByb3ZpZGVycywgc3VjaCBhcyBwZXJjZW50YWdlIG9mIHJlY292ZXJ5IGFtb3VudFxuICAgIHRocm93IG5ldyBFcnJvcignRmVlIHN0cnVjdHVyZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJQYXJhbXMge1xuICBzY2FuPzogbnVtYmVyO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xuICByZWNvdmVyeURlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIGtyc1Byb3ZpZGVyPzogc3RyaW5nO1xuICBpZ25vcmVBZGRyZXNzVHlwZXM6IFNjcmlwdFR5cGUyT2YzW107XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGFwaUtleT86IHN0cmluZztcbiAgdXNlcktleVBhdGg/OiBzdHJpbmc7XG4gIHJlY292ZXJ5UHJvdmlkZXI/OiBSZWNvdmVyeVByb3ZpZGVyO1xuICAvKiogU2F0b3NoaSBwZXIgYnl0ZSAqL1xuICBmZWVSYXRlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIGFkZHJlc3MgYW5kIGZvcm1hdCBpdCBmb3IgQVBJIHF1ZXJpZXNcbiAqIEBwYXJhbSBjb2luIC0gVGhlIGNvaW4gaW5zdGFuY2VcbiAqIEBwYXJhbSBjb2luTmFtZSAtIFRoZSBjb2luIG5hbWVcbiAqIEBwYXJhbSB3YWxsZXRLZXlzIC0gVGhlIHdhbGxldCBrZXlzXG4gKiBAcGFyYW0gY2hhaW4gLSBUaGUgY2hhaW4gY29kZVxuICogQHBhcmFtIGFkZHJJbmRleCAtIFRoZSBhZGRyZXNzIGluZGV4XG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGFkZHJlc3MgKHdpdGggY2FzaGFkZHIgcHJlZml4IHN0cmlwcGVkIGZvciBCQ0gvQkNIQSlcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkQWRkcmVzcyhcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgY29pbk5hbWU6IFV0eG9Db2luTmFtZSxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIGNoYWluOiBDaGFpbkNvZGUsXG4gIGFkZHJJbmRleDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBjb25zdCBmb3JtYXQgPSBjb2luLmdldENoYWluKCkgPT09ICdiY2gnIHx8IGNvaW4uZ2V0Q2hhaW4oKSA9PT0gJ2JjaGEnID8gJ2Nhc2hhZGRyJyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYWRkcmVzcyA9IGdlbmVyYXRlQWRkcmVzc1dpdGhDaGFpbkFuZEluZGV4KGNvaW5OYW1lLCB3YWxsZXRLZXlzLCBjaGFpbiwgYWRkckluZGV4LCBmb3JtYXQpO1xuXG4gIC8vIEJsb2NrY2hhaXIgdXNlcyBjYXNoYWRkciBmb3JtYXQgd2hlbiBxdWVyeWluZyB0aGUgQVBJIGZvciBhZGRyZXNzIGluZm9ybWF0aW9uLiBTdHJpcCB0aGUgcHJlZml4IGZvciBCQ0gvQkNIQS5cbiAgcmV0dXJuIGZvcm1hdCA9PT0gJ2Nhc2hhZGRyJyA/IGFkZHJlc3Muc3BsaXQoJzonKVsxXSA6IGFkZHJlc3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHF1ZXJ5QmxvY2tjaGFpblVuc3BlbnRzUGF0aChcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcGFyYW1zOiBSZWNvdmVyUGFyYW1zLFxuICB3YWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgY2hhaW46IENoYWluQ29kZVxuKTogUHJvbWlzZTxXYWxsZXRVbnNwZW50PGJpZ2ludD5bXT4ge1xuICBjb25zdCBzY3JpcHRUeXBlID0gc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKTtcbiAgY29uc3QgZmV0Y2hQcmV2VHggPVxuICAgICF1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuaGFzV2l0bmVzc0RhdGEoc2NyaXB0VHlwZSkgJiYgZ2V0TWFpbm5ldChjb2luLm5ldHdvcmspICE9PSBuZXR3b3Jrcy56Y2FzaDtcbiAgY29uc3QgcmVjb3ZlcnlQcm92aWRlciA9IHBhcmFtcy5yZWNvdmVyeVByb3ZpZGVyID8/IGZvckNvaW4oY29pbi5nZXRDaGFpbigpLCBwYXJhbXMuYXBpS2V5KTtcbiAgY29uc3QgTUFYX1NFUVVFTlRJQUxfQUREUkVTU0VTX1dJVEhPVVRfVFhTID0gcGFyYW1zLnNjYW4gfHwgMjA7XG4gIGxldCBudW1TZXF1ZW50aWFsQWRkcmVzc2VzV2l0aG91dFR4cyA9IDA7XG4gIGNvbnN0IHByZXZUeENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBhc3luYyBmdW5jdGlvbiBnZXRQcmV2VHgodHhpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcHJldlR4SGV4ID0gcHJldlR4Q2FjaGUuZ2V0KHR4aWQpO1xuICAgIGlmICghcHJldlR4SGV4KSB7XG4gICAgICBwcmV2VHhIZXggPSBhd2FpdCByZWNvdmVyeVByb3ZpZGVyLmdldFRyYW5zYWN0aW9uSGV4KHR4aWQpO1xuICAgICAgcHJldlR4Q2FjaGUuc2V0KHR4aWQsIHByZXZUeEhleCk7XG4gICAgfVxuICAgIHJldHVybiBwcmV2VHhIZXg7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnYXRoZXJVbnNwZW50cyhhZGRySW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGZvcm1hdHRlZEFkZHJlc3MgPSBnZXRGb3JtYXR0ZWRBZGRyZXNzKGNvaW4sIGNvaW4ubmFtZSwgd2FsbGV0S2V5cywgY2hhaW4sIGFkZHJJbmRleCk7XG4gICAgY29uc3QgYWRkckluZm8gPSBhd2FpdCByZWNvdmVyeVByb3ZpZGVyLmdldEFkZHJlc3NJbmZvKGZvcm1hdHRlZEFkZHJlc3MpO1xuICAgIC8vIHdlIHVzZSB0eENvdW50IGhlcmUgYmVjYXVzZSBpdCBpbXBsaWVzIHVzYWdlIC0gaGF2aW5nIHR4J2VzIG1lYW5zIHRoZSBhZGRyIHdhcyBnZW5lcmF0ZWQgYW5kIHVzZWRcbiAgICBpZiAoYWRkckluZm8udHhDb3VudCA9PT0gMCkge1xuICAgICAgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPSAwO1xuXG4gICAgICBpZiAoYWRkckluZm8uYmFsYW5jZSA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYEZvdW5kIGFuIGFkZHJlc3Mgd2l0aCBiYWxhbmNlOiAke2Zvcm1hdHRlZEFkZHJlc3N9IHdpdGggYmFsYW5jZSAke2FkZHJJbmZvLmJhbGFuY2V9YCk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3NVbnNwZW50cyA9IGF3YWl0IHJlY292ZXJ5UHJvdmlkZXIuZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXMoW2Zvcm1hdHRlZEFkZHJlc3NdKTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkVW5zcGVudHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBhZGRyZXNzVW5zcGVudHMubWFwKGFzeW5jICh1KTogUHJvbWlzZTxXYWxsZXRVbnNwZW50PGJpZ2ludD4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdHhpZCwgdm91dCB9ID0gdXR4b2xpYi5iaXRnby5wYXJzZU91dHB1dElkKHUuaWQpO1xuICAgICAgICAgICAgbGV0IHZhbCA9IEJpZ0ludCh1LnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjb2luLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgICAgIC8vIGJsb2NrY2hhaXIgcmV0dXJucyB0aGUgbnVtYmVyIHdpdGggdGhlIGNvcnJlY3QgcHJlY2lzaW9uLCBidXQgaW4gbnVtYmVyIGZvcm1hdFxuICAgICAgICAgICAgICAvLyBqc29uIHBhcnNlIHdvbid0IHBhcnNlIGl0IGNvcnJlY3RseSwgc28gd2UgcmVxdWVyeSB0aGUgdHhpZCBmb3IgdGhlIHR4IGhleCB0byBkZWNvZGUgaGVyZVxuICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBnZXRQcmV2VHgodHhpZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHggPSBjb2luLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxiaWdpbnQ+KHR4SGV4KTtcbiAgICAgICAgICAgICAgICB2YWwgPSB0eC5vdXRzW3ZvdXRdLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0aGUgYXBpIG1heSByZXR1cm4gY2FzaGFkZHIncyBpbnN0ZWFkIG9mIGxlZ2FjeSBmb3IgQkNIIGFuZCBCQ0hBXG4gICAgICAgICAgICAvLyBkb3duc3RyZWFtIHByb2Nlc3NlcydzIG9ubHkgZXhwZWN0IGxlZ2FjeSBhZGRyZXNzZXNcbiAgICAgICAgICAgIHUgPSB7IC4uLnUsIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyh1LmFkZHJlc3MpIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi51LFxuICAgICAgICAgICAgICB2YWx1ZTogdmFsLFxuICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG4gICAgICAgICAgICAgIGluZGV4OiBhZGRySW5kZXgsXG4gICAgICAgICAgICAgIHByZXZUeDogZmV0Y2hQcmV2VHggPyBCdWZmZXIuZnJvbShhd2FpdCBnZXRQcmV2VHgodHhpZCksICdoZXgnKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0gYXMgV2FsbGV0VW5zcGVudDxiaWdpbnQ+O1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgd2FsbGV0VW5zcGVudHMucHVzaCguLi5wcm9jZXNzZWRVbnNwZW50cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG51bVNlcXVlbnRpYWxBZGRyZXNzZXNXaXRob3V0VHhzID49IE1BWF9TRVFVRU5USUFMX0FERFJFU1NFU19XSVRIT1VUX1RYUykge1xuICAgICAgLy8gc3RvcCBzZWFyY2hpbmcgZm9yIGFkZHJlc3NlcyB3aXRoIHVuc3BlbnRzIGluIHRoZW0sIHdlJ3ZlIGZvdW5kICR7TUFYX1NFUVVFTlRJQUxfQUREUkVTU0VTX1dJVEhPVVRfVFhTfSBpbiBhIHJvdyB3aXRoIG5vbmVcbiAgICAgIC8vIHdlIGFyZSBkb25lXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGhlclVuc3BlbnRzKGFkZHJJbmRleCArIDEpO1xuICB9XG5cbiAgLy8gZ2V0IHVuc3BlbnRzIGZvciB0aGVzZSBhZGRyZXNzZXNcblxuICBjb25zdCB3YWxsZXRVbnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10gPSBbXTtcbiAgLy8gVGhpcyB3aWxsIHBvcHVsYXRlIHdhbGxldEFkZHJlc3Nlc1xuICBhd2FpdCBnYXRoZXJVbnNwZW50cygwKTtcblxuICBpZiAod2FsbGV0VW5zcGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gQ291bGRuJ3QgZmluZCBhbnkgYWRkcmVzc2VzIHdpdGggZnVuZHNcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gd2FsbGV0VW5zcGVudHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlY292ZXJ5RmVlUGVyQnl0ZXMoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHsgZGVmYXVsdFZhbHVlIH06IHsgZGVmYXVsdFZhbHVlOiBudW1iZXIgfVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKGNvaW4uZ2V0RmFtaWx5KCkgPT09ICdkb2dlJykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kb2dlY29pbi9kb2dlY29pbi9ibG9iL21hc3Rlci9kb2MvZmVlLXJlY29tbWVuZGF0aW9uLm1kXG4gICAgLy8gMC4wMSBET0dFIHBlciBLQlxuICAgIHJldHVybiAxMDAwO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgTWVtcG9vbEFwaS5mb3JDb2luKGNvaW4uZ2V0Q2hhaW4oKSkuZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5kaXIoZSk7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uID0ge1xuICBpbnB1dHM/OiBXYWxsZXRVbnNwZW50SlNPTltdO1xuICB0cmFuc2FjdGlvbkhleDogc3RyaW5nO1xuICBjb2luOiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICByZWNvdmVyeUFtb3VudDogbnVtYmVyO1xuICByZWNvdmVyeUFtb3VudFN0cmluZzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvLlxuICpcbiAqIFJldHVybnMgdHJhbnNhY3Rpb24gaGV4IGluIGxlZ2FjeSBmb3JtYXQgZm9yIHVuc2lnbmVkIHN3ZWVwIHRyYW5zYWN0aW9uLCBoYWxmIHNpZ25lZCBiYWNrdXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aCBLUlMgcHJvdmlkZXIgKG9ubHkga2V5dGVybmFsKSxcbiAqIGZ1bGx5IHNpZ25lZCBiYWNrdXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBhIEtSUyBwcm92aWRlci5cbiAqXG4gKiBSZXR1cm5zIFBTQlQgaGV4IGZvciBoYWxmIHNpZ25lZCBiYWNrdXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aCBLUlMgcHJvdmlkZXIgKGV4Y2x1ZGluZyBrZXl0ZXJuYWwpXG4gKiBGb3IgUFNCVCBoZXggY2FzZXMsIFVuc3BlbnRzIGFyZSBub3QgcmVxdWlyZWQgaW4gcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIGNvaW5cbiAqIEBwYXJhbSBiaXRnb1xuICogQHBhcmFtIHBhcmFtc1xuICogLSB1c2VyS2V5OiBbZW5jcnlwdGVkXSB4cHJ2LCBvciB4cHViXG4gKiAtIGJhY2t1cEtleTogW2VuY3J5cHRlZF0geHBydiwgb3IgeHB1YiBpZiB0aGUgeHBydiBpcyBoZWxkIGJ5IGEgS1JTIHByb3ZpZGVyXG4gKiAtIHdhbGxldFBhc3NwaHJhc2U6IG5lY2Vzc2FyeSBpZiBvbmUgb2YgdGhlIHhwcnZzIGlzIGVuY3J5cHRlZFxuICogLSBiaXRnb0tleTogeHB1YlxuICogLSBrcnNQcm92aWRlcjogbmVjZXNzYXJ5IGlmIGJhY2t1cCBrZXkgaXMgaGVsZCBieSBLUlNcbiAqIC0gcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGFyZ2V0IGFkZHJlc3MgdG8gc2VuZCByZWNvdmVyZWQgZnVuZHMgdG9cbiAqIC0gc2NhbjogdGhlIGFtb3VudCBvZiBjb25zZWN1dGl2ZSBhZGRyZXNzZXMgd2l0aG91dCB1bnNwZW50cyB0byBzY2FuIHRocm91Z2ggYmVmb3JlIHN0b3BwaW5nXG4gKiAtIGlnbm9yZUFkZHJlc3NUeXBlczogKG9wdGlvbmFsKSBzY3JpcHRzIHRvIGlnbm9yZVxuICogICAgICAgIGZvciBleGFtcGxlOiBbJ3Ayc2hQMndzaCcsICdwMndzaCddIHdpbGwgcHJldmVudCBjb2RlIGZyb20gY2hlY2tpbmcgZm9yIHdyYXBwZWQtc2Vnd2l0IGFuZCBuYXRpdmUtc2Vnd2l0IGNoYWlucyBvbiB0aGUgcHVibGljIGJsb2NrIGV4cGxvcmVyc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmFja3VwS2V5UmVjb3ZlcnkoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogUmVjb3ZlclBhcmFtc1xuKTogUHJvbWlzZTxCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uIHwgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvPiB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyS2V5Jyk7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYmFja3VwS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgfVxuXG4gIGlmIChcbiAgICBfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSB8fFxuICAgICFjb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCB7IGFueUZvcm1hdDogdHJ1ZSB9KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zY2FuKSAmJiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5zY2FuKSB8fCBwYXJhbXMuc2NhbiA8IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY2FuIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmZlZVJhdGUgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0Zpbml0ZShwYXJhbXMuZmVlUmF0ZSkgfHwgcGFyYW1zLmZlZVJhdGUgPD0gMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZlZVJhdGUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB9XG5cbiAgY29uc3QgaXNLcnNSZWNvdmVyeSA9IGdldElzS3JzUmVjb3ZlcnkocGFyYW1zKTtcbiAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gZ2V0SXNVbnNpZ25lZFN3ZWVwKHBhcmFtcyk7XG4gIGNvbnN0IHJlc3BvbnNlVHhGb3JtYXQgPSAhaXNLcnNSZWNvdmVyeSB8fCBwYXJhbXMua3JzUHJvdmlkZXIgPT09ICdrZXl0ZXJuYWwnID8gJ2xlZ2FjeScgOiAncHNidCc7XG5cbiAgY29uc3Qga3JzUHJvdmlkZXIgPSBpc0tyc1JlY292ZXJ5ID8gZ2V0S3JzUHJvdmlkZXIoY29pbiwgcGFyYW1zLmtyc1Byb3ZpZGVyKSA6IHVuZGVmaW5lZDtcblxuICAvLyBjaGVjayB3aGV0aGVyIGtleSBtYXRlcmlhbCBhbmQgcGFzc3dvcmQgYXV0aGVudGljYXRlIHRoZSB1c2VycyBhbmQgcmV0dXJuIHBhcmVudCBrZXlzIG9mIGFsbCB0aHJlZSBrZXlzIG9mIHRoZSB3YWxsZXRcbiAgY29uc3Qga2V5cyA9IGdldEJpcDMyS2V5cyhiaXRnbywgcGFyYW1zLCB7IHJlcXVpcmVCaXRHb1hwdWI6IHRydWUgfSk7XG4gIGlmICghaXNUcmlwbGUoa2V5cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGtleSB0cmlwbGVgKTtcbiAgfVxuICBjb25zdCB3YWxsZXRLZXlzID0gbmV3IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMoa2V5cywgW1xuICAgIHBhcmFtcy51c2VyS2V5UGF0aCB8fCB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLmRlZmF1bHRQcmVmaXgsXG4gICAgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuICAgIHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgXSk7XG5cbiAgY29uc3QgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgb3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoYWRkcmVzc1R5cGUpID0+IGNvaW4uc3VwcG9ydHNBZGRyZXNzVHlwZShhZGRyZXNzVHlwZSkgJiYgIXBhcmFtcy5pZ25vcmVBZGRyZXNzVHlwZXM/LmluY2x1ZGVzKGFkZHJlc3NUeXBlKVxuICAgICAgICApXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKHF1ZXJpZXMsIGFkZHJlc3NUeXBlKSA9PiBbXG4gICAgICAgICAgICAuLi5xdWVyaWVzLFxuICAgICAgICAgICAgcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoKGNvaW4sIHBhcmFtcywgd2FsbGV0S2V5cywgZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoYWRkcmVzc1R5cGUpKSxcbiAgICAgICAgICAgIHF1ZXJ5QmxvY2tjaGFpblVuc3BlbnRzUGF0aChjb2luLCBwYXJhbXMsIHdhbGxldEtleXMsIGdldEludGVybmFsQ2hhaW5Db2RlKGFkZHJlc3NUeXBlKSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSBhcyBQcm9taXNlPFdhbGxldFVuc3BlbnQ8YmlnaW50PltdPltdXG4gICAgICAgIClcbiAgICApXG4gICkuZmxhdCgpO1xuXG4gIC8vIEV4ZWN1dGUgdGhlIHF1ZXJpZXMgYW5kIGdhdGhlciB0aGUgdW5zcGVudHNcbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHV0eG9saWIuYml0Z28udW5zcGVudFN1bSh1bnNwZW50cywgJ2JpZ2ludCcpO1xuICBpZiAodG90YWxJbnB1dEFtb3VudCA8PSBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKCk7XG4gIH1cblxuICBjb25zdCB0eEluZm8gPSB7fSBhcyBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uO1xuICBjb25zdCBmZWVQZXJCeXRlOiBudW1iZXIgPVxuICAgIHBhcmFtcy5mZWVSYXRlICE9PSB1bmRlZmluZWRcbiAgICAgID8gcGFyYW1zLmZlZVJhdGVcbiAgICAgIDogYXdhaXQgZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcyhjb2luLCB7IGRlZmF1bHRWYWx1ZTogREVGQVVMVF9SRUNPVkVSWV9GRUVSQVRFX1NBVF9WQllURV9WMiB9KTtcblxuICB0eEluZm8uaW5wdXRzID1cbiAgICByZXNwb25zZVR4Rm9ybWF0ID09PSAnbGVnYWN5J1xuICAgICAgPyB1bnNwZW50cy5tYXAoKHUpID0+ICh7IC4uLnUsIHZhbHVlOiBOdW1iZXIodS52YWx1ZSksIHZhbHVlU3RyaW5nOiB1LnZhbHVlLnRvU3RyaW5nKCksIHByZXZUeDogdW5kZWZpbmVkIH0pKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgbGV0IGtyc0ZlZSA9IEJpZ0ludCgwKTtcbiAgaWYgKGlzS3JzUmVjb3ZlcnkgJiYgcGFyYW1zLmtyc1Byb3ZpZGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGtyc0ZlZSA9IEJpZ0ludChhd2FpdCBjYWxjdWxhdGVGZWVBbW91bnQoY29pbiwgeyBwcm92aWRlcjogcGFyYW1zLmtyc1Byb3ZpZGVyIH0pKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIERvbid0IGxldCB0aGlzIGVycm9yIGJsb2NrIHRoZSByZWNvdmVyeSAtXG4gICAgICBjb25zb2xlLmRpcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBrcnNGZWVBZGRyZXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChrcnNQcm92aWRlciAmJiBrcnNGZWUgPiBCaWdJbnQoMCkpIHtcbiAgICBpZiAoIWtyc1Byb3ZpZGVyLmZlZUFkZHJlc3Nlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBrZXlQcm92aWRlciBtdXN0IGRlZmluZSBmZWVBZGRyZXNzZXNgKTtcbiAgICB9XG5cbiAgICBrcnNGZWVBZGRyZXNzID0ga3JzUHJvdmlkZXIuZmVlQWRkcmVzc2VzW2NvaW4uZ2V0Q2hhaW4oKV07XG5cbiAgICBpZiAoIWtyc0ZlZUFkZHJlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhpcyBLUlMgcHJvdmlkZXIgaGFzIG5vdCBjb25maWd1cmVkIHRoZWlyIGZlZSBzdHJ1Y3R1cmUgeWV0IC0gcmVjb3ZlcnkgY2Fubm90IGJlIGNvbXBsZXRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVzZSB3YXNtLXV0eG8gZm9yIHRlc3RuZXQgY29pbnMgb25seSwgdXR4b2xpYiBmb3IgbWFpbm5ldFxuICBjb25zdCBiYWNrZW5kOiBQc2J0QmFja2VuZCA9IGlzVGVzdG5ldENvaW4oY29pbi5uYW1lKSA/ICd3YXNtLXV0eG8nIDogJ3V0eG9saWInO1xuICBsZXQgcHNidCA9IGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidChcbiAgICBjb2luLmdldENoYWluKCksXG4gICAgd2FsbGV0S2V5cyxcbiAgICB1bnNwZW50cyxcbiAgICB7XG4gICAgICBmZWVSYXRlU2F0VkI6IGZlZVBlckJ5dGUsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIGtleVJlY292ZXJ5U2VydmljZUZlZToga3JzRmVlLFxuICAgICAga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzczoga3JzRmVlQWRkcmVzcyxcbiAgICB9LFxuICAgIGJhY2tlbmRcbiAgKTtcblxuICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4SGV4OiBlbmNvZGVUcmFuc2FjdGlvbihwc2J0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0eEluZm86IHt9LFxuICAgICAgZmVlSW5mbzoge30sXG4gICAgICBjb2luOiBjb2luLmdldENoYWluKCksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJvb3RXYWxsZXRLZXlzV2FzbSA9IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzLmZyb20od2FsbGV0S2V5cyk7XG4gIGNvbnN0IHJlcGxheVByb3RlY3Rpb24gPSB7IHB1YmxpY0tleXM6IGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzKGNvaW4ubmFtZSkgfTtcblxuICAvLyBTaWduIHdpdGggdXNlciBrZXkgZmlyc3RcbiAgcHNidCA9IHNpZ25BbmRWZXJpZnlQc2J0KHBzYnQsIHdhbGxldEtleXMudXNlciwgcm9vdFdhbGxldEtleXNXYXNtLCByZXBsYXlQcm90ZWN0aW9uKTtcblxuICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgIC8vIFRoZSBLUlMgcHJvdmlkZXIga2V5dGVybmFsIHNvbGVseSBzdXBwb3J0cyBQMlNILCBQMldTSCwgYW5kIFAyU0gtUDJXU0ggaW5wdXQgc2NyaXB0IHR5cGVzLlxuICAgIC8vIEl0IGN1cnJlbnRseSB1c2VzIGFuIG91dGRhdGVkIEJpdEdvSlMgU0RLLCB3aGljaCByZWxpZXMgb24gYSBsZWdhY3kgdHJhbnNhY3Rpb24gYnVpbGRlciBmb3IgY29zaWduaW5nLlxuICAgIC8vIFVuZm9ydHVuYXRlbHksIHVwZ3JhZGluZyB0aGUga2V5dGVybmFsIGNvZGUgcHJlc2VudHMgY2hhbGxlbmdlcyxcbiAgICAvLyB3aGljaCBoaW5kZXJzIHRoZSBpbnRlZ3JhdGlvbiBvZiB0aGUgbGF0ZXN0IEJpdEdvSlMgU0RLIHdpdGggUFNCVCBzaWduaW5nIHN1cHBvcnQuXG4gICAgdHhJbmZvLnRyYW5zYWN0aW9uSGV4ID1cbiAgICAgIHBhcmFtcy5rcnNQcm92aWRlciA9PT0gJ2tleXRlcm5hbCdcbiAgICAgICAgPyB1dHhvbGliLmJpdGdvLmV4dHJhY3RQMm1zT25seUhhbGZTaWduZWRUeCh0b1BzYnRUb1V0eG9saWJQc2J0KHBzYnQsIGNvaW4ubmFtZSkpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgIDogZW5jb2RlVHJhbnNhY3Rpb24ocHNidCkudG9TdHJpbmcoJ2hleCcpO1xuICB9IGVsc2Uge1xuICAgIC8vIFNpZ24gd2l0aCBiYWNrdXAga2V5XG4gICAgcHNidCA9IHNpZ25BbmRWZXJpZnlQc2J0KHBzYnQsIHdhbGxldEtleXMuYmFja3VwLCByb290V2FsbGV0S2V5c1dhc20sIHJlcGxheVByb3RlY3Rpb24pO1xuICAgIC8vIEZpbmFsaXplIGFuZCBleHRyYWN0IHRyYW5zYWN0aW9uXG4gICAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICAgIGlmIChwc2J0IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCkge1xuICAgICAgdHhJbmZvLnRyYW5zYWN0aW9uSGV4ID0gcHNidC5leHRyYWN0VHJhbnNhY3Rpb24oKS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB9IGVsc2UgaWYgKHBzYnQgaW5zdGFuY2VvZiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQpIHtcbiAgICAgIHR4SW5mby50cmFuc2FjdGlvbkhleCA9IEJ1ZmZlci5mcm9tKHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBhIFV0eG9Qc2J0IG9yIEJpdEdvUHNidCBvYmplY3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgIHR4SW5mby5jb2luID0gY29pbi5nZXRDaGFpbigpO1xuICAgIHR4SW5mby5iYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5O1xuICAgIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gZ2V0UmVjb3ZlcnlBbW91bnQocHNidCwgd2FsbGV0S2V5cywgcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pO1xuICAgIHR4SW5mby5yZWNvdmVyeUFtb3VudCA9IE51bWJlcihyZWNvdmVyeUFtb3VudCk7XG4gICAgdHhJbmZvLnJlY292ZXJ5QW1vdW50U3RyaW5nID0gcmVjb3ZlcnlBbW91bnQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiB0eEluZm87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQml0R29WMVVuc3BlbnQge1xuICB0eF9oYXNoOiBzdHJpbmc7XG4gIHR4X291dHB1dF9uOiBudW1iZXI7XG4gIHZhbHVlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjFTd2VlcFBhcmFtcyB7XG4gIHdhbGxldElkOiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgdW5zcGVudHM6IEJpdEdvVjFVbnNwZW50W107XG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbiAgdXNlcktleTogc3RyaW5nO1xuICBvdHA6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWMVJlY292ZXJQYXJhbXMgZXh0ZW5kcyBPbWl0PFYxU3dlZXBQYXJhbXMsICdvdHAnPiB7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdjFCYWNrdXBLZXlSZWNvdmVyeShcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgcGFyYW1zOiBWMVJlY292ZXJQYXJhbXNcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChcbiAgICBfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSB8fFxuICAgICFjb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCB7IGFueUZvcm1hdDogdHJ1ZSB9KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG5cbiAgY29uc3QgcmVjb3ZlcnlGZWVQZXJCeXRlID0gYXdhaXQgZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcyhjb2luLCB7XG4gICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX1JFQ09WRVJZX0ZFRVJBVEVfU0FUX1ZCWVRFX1YxLFxuICB9KTtcbiAgY29uc3QgdjF3YWxsZXQgPSBhd2FpdCBiaXRnby53YWxsZXRzKCkuZ2V0KHsgaWQ6IHBhcmFtcy53YWxsZXRJZCB9KTtcbiAgcmV0dXJuIGF3YWl0IHYxd2FsbGV0LnJlY292ZXIoe1xuICAgIC4uLnBhcmFtcyxcbiAgICBmZWVSYXRlOiByZWNvdmVyeUZlZVBlckJ5dGUsXG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdjFTd2VlcChcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgcGFyYW1zOiBWMVN3ZWVwUGFyYW1zXG4pOiBQcm9taXNlPHtcbiAgdHg6IHN0cmluZztcbiAgaGFzaDogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbn0+IHtcbiAgaWYgKFxuICAgIF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pIHx8XG4gICAgIWNvaW4uaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIHsgYW55Rm9ybWF0OiB0cnVlIH0pXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gIH1cblxuICBsZXQgcmVjb3ZlcnlGZWVQZXJCeXRlID0gMTAwO1xuICBpZiAoYml0Z28uZW52ID09PSAncHJvZCcpIHtcbiAgICByZWNvdmVyeUZlZVBlckJ5dGUgPSBhd2FpdCBnZXRSZWNvdmVyeUZlZVBlckJ5dGVzKGNvaW4sIHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9SRUNPVkVSWV9GRUVSQVRFX1NBVF9WQllURV9WMV9TV0VFUCxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHYxd2FsbGV0ID0gYXdhaXQgYml0Z28ud2FsbGV0cygpLmdldCh7IGlkOiBwYXJhbXMud2FsbGV0SWQgfSk7XG4gIHJldHVybiBhd2FpdCB2MXdhbGxldC5zd2VlcCh7XG4gICAgLi4ucGFyYW1zLFxuICAgIGZlZVJhdGU6IHJlY292ZXJ5RmVlUGVyQnl0ZSxcbiAgfSk7XG59XG4iXX0=
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBNFJBLGtGQXVDQztBQWtDRCxzRUFxREM7QUFnQ0QsOENBMEhDO0FBcUJELGtEQW9CQztBQUVELDBCQTRCQztBQTNuQkQsb0RBQXVCO0FBQ3ZCLDhDQVF5QjtBQUN6QixnREFBNEQ7QUFHNUQsZ0ZBQStFO0FBQy9FLHdDQUE4RDtBQUM5RCxrREFBMEQ7QUFDMUQsa0ZBQXlGO0FBQ3pGLG9DQUE0RDtBQUM1RCx3Q0FBMkU7QUFFM0UseURBQStEO0FBQy9ELDZDQUEwQztBQUMxQyxpREFBOEM7QUFDOUMsaUNBQXdFO0FBUXhFLDBEQUEwRDtBQUM3QyxRQUFBLHFDQUFxQyxHQUFHLEVBQUUsQ0FBQztBQUV4RCw2SEFBNkg7QUFDaEgsUUFBQSwyQ0FBMkMsR0FBRyxHQUFHLENBQUM7QUFFL0Qsa0ZBQWtGO0FBQ3JFLFFBQUEscUNBQXFDLEdBQUcsRUFBRSxDQUFDO0FBVXhEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxLQUFLLFVBQVUsc0JBQXNCLENBQUMsSUFBc0I7SUFDMUQsT0FBTyxNQUFNLElBQUksMkJBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUFDLElBQXNCLEVBQUUsTUFBNEI7SUFDcEYsTUFBTSxXQUFXLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbEQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVELElBQUksV0FB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e1xuICBCaXRHb0Jhc2UsXG4gIEVycm9yTm9JbnB1dFRvUmVjb3ZlcixcbiAgZ2V0S3JzUHJvdmlkZXIsXG4gIGdldEJpcDMyS2V5cyBhcyBnZXRCaXAzMktleXNGcm9tU2RrQ29yZSxcbiAgaXNUcmlwbGUsXG4gIGtyc1Byb3ZpZGVycyxcbiAgVHJpcGxlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQklQMzIsIGZpeGVkU2NyaXB0V2FsbGV0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4gfSBmcm9tICcuLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB7IHNpZ25BbmRWZXJpZnlQc2J0IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvc2lnblRyYW5zYWN0aW9uJztcbmltcG9ydCB7IGdlbmVyYXRlQWRkcmVzc1dpdGhDaGFpbkFuZEluZGV4IH0gZnJvbSAnLi4vYWRkcmVzcyc7XG5pbXBvcnQgeyBlbmNvZGVUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3RyYW5zYWN0aW9uL2RlY29kZSc7XG5pbXBvcnQgeyBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyB9IGZyb20gJy4uL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3JlcGxheVByb3RlY3Rpb24nO1xuaW1wb3J0IHsgZ2V0TWFpbm5ldENvaW5OYW1lLCBVdHhvQ29pbk5hbWUgfSBmcm9tICcuLi9uYW1lcyc7XG5pbXBvcnQgeyBwYXJzZU91dHB1dElkLCB1bnNwZW50U3VtLCB0eXBlIFdhbGxldFVuc3BlbnQgfSBmcm9tICcuLi91bnNwZW50JztcblxuaW1wb3J0IHsgZm9yQ29pbiwgUmVjb3ZlcnlQcm92aWRlciB9IGZyb20gJy4vUmVjb3ZlcnlQcm92aWRlcic7XG5pbXBvcnQgeyBNZW1wb29sQXBpIH0gZnJvbSAnLi9tZW1wb29sQXBpJztcbmltcG9ydCB7IENvaW5nZWNrb0FwaSB9IGZyb20gJy4vY29pbmdlY2tvQXBpJztcbmltcG9ydCB7IGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidCwgZ2V0UmVjb3ZlcnlBbW91bnQgfSBmcm9tICcuL3BzYnQnO1xuXG50eXBlIFNjcmlwdFR5cGUyT2YzID0gZml4ZWRTY3JpcHRXYWxsZXQuT3V0cHV0U2NyaXB0VHlwZTtcbnR5cGUgQ2hhaW5Db2RlID0gZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlO1xudHlwZSBXYWxsZXRVbnNwZW50SlNPTiA9IFdhbGxldFVuc3BlbnQgJiB7XG4gIHZhbHVlU3RyaW5nOiBzdHJpbmc7XG59O1xuXG4vLyBWMSBvbmx5IGRlYWxzIHdpdGggQlRDLiA1MCBzYXQvdmJ5dGUgaXMgdmVyeSBhcmJpdHJhcnkuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUNPVkVSWV9GRUVSQVRFX1NBVF9WQllURV9WMSA9IDUwO1xuXG4vLyBGSVhNRShCVEMtMjY5MSk6IGl0IGlzIHVuY2xlYXIgd2h5IHN3ZWVwcyBoYXZlIGEgZGlmZmVyZW50IGRlZmF1bHQgdGhhbiByZWd1bGFyIHJlY292ZXJ5LiAxMDAgc2F0L3ZieXRlIGlzIGV4dHJlbWVseSBoaWdoLlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVDT1ZFUllfRkVFUkFURV9TQVRfVkJZVEVfVjFfU1dFRVAgPSAxMDA7XG5cbi8vIEZJWE1FKEJUQy0yNjkxKTogaXQgbWFrZXMgbGl0dGxlIHNlbnNlIHRvIGhhdmUgYSBzaW5nbGUgZGVmYXVsdCBmb3IgZXZlcnkgY29pbi5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JFQ09WRVJZX0ZFRVJBVEVfU0FUX1ZCWVRFX1YyID0gNTA7XG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbyB7XG4gIHR4SW5mbzoge1xuICAgIHVuc3BlbnRzPzogV2FsbGV0VW5zcGVudEpTT05bXTtcbiAgfTtcbiAgdHhIZXg6IHN0cmluZztcbiAgZmVlSW5mbzogUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuICBjb2luOiBzdHJpbmc7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IG1hcmtldCBwcmljZSBmcm9tIGEgdGhpcmQgcGFydHkgdG8gYmUgdXNlZCBmb3IgcmVjb3ZlcnlcbiAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCBmb3Igbm9uLWJpdGdvIHJlY292ZXJ5IHRyYW5zYWN0aW9ucywgd2hlbiBpdCBpcyBuZWNlc3NhcnlcbiAqIHRvIGNhbGN1bGF0ZSB0aGUgcm91Z2ggZmVlIG5lZWRlZCB0byBwYXkgdG8gS2V5dGVybmFsLiBXZSBhcmUgb2theSB3aXRoIGFwcHJveGltYXRpbmcsXG4gKiBiZWNhdXNlIHRoZSByZXN1bHRpbmcgcHJpY2Ugb2YgdGhpcyBmdW5jdGlvbiBvbmx5IGhhcyBsZXNzIHRoYW4gMSBkb2xsYXIgaW5mbHVlbmNlIG9uIHRoZVxuICogZmVlIHRoYXQgbmVlZHMgdG8gYmUgcGFpZCB0byBLZXl0ZXJuYWwuXG4gKlxuICogU2VlIGNhbGN1bGF0ZUZlZUFtb3VudCBmdW5jdGlvbjogIHJldHVybiBNYXRoLnJvdW5kKGZlZUFtb3VudFVzZCAvIGN1cnJlbnRQcmljZSAqIHNlbGYuZ2V0QmFzZUZhY3RvcigpKTtcbiAqXG4gKiBUaGlzIGVuZCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgYXMgYW4gYWNjdXJhdGUgZW5kcG9pbnQsIHNpbmNlIHNvbWUgY29pbnMnIHByaWNlcyBhcmUgbWlzc2luZyBmcm9tIHRoZSBwcm92aWRlclxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWNvdmVyeU1hcmtldFByaWNlKGNvaW46IEFic3RyYWN0VXR4b0NvaW4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gYXdhaXQgbmV3IENvaW5nZWNrb0FwaSgpLmdldFVTRFByaWNlKGNvaW4uZ2V0RmFtaWx5KCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFtb3VudCAoaW4gYmFzZSB1bml0cykgdG8gcGF5IGEgS1JTIHByb3ZpZGVyIHdoZW4gYnVpbGRpbmcgYSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICogQHBhcmFtIGNvaW5cbiAqIEBwYXJhbSBwYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXMucHJvdmlkZXIge1N0cmluZ30gdGhlIEtSUyBwcm92aWRlciB0aGF0IGhvbGRzIHRoZSBiYWNrdXAga2V5XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlRmVlQW1vdW50KGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHBhcmFtczogeyBwcm92aWRlcjogc3RyaW5nIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBrcnNQcm92aWRlciA9IGtyc1Byb3ZpZGVyc1twYXJhbXMucHJvdmlkZXJdO1xuXG4gIGlmIChrcnNQcm92aWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBmZWUgc3RydWN0dXJlIHNwZWNpZmllZCBmb3IgcHJvdmlkZXIgJHtwYXJhbXMucHJvdmlkZXJ9YCk7XG4gIH1cblxuICBpZiAoa3JzUHJvdmlkZXIuZmVlVHlwZSA9PT0gJ2ZsYXRVc2QnKSB7XG4gICAgY29uc3QgZmVlQW1vdW50VXNkID0ga3JzUHJvdmlkZXIuZmVlQW1vdW50O1xuICAgIGNvbnN0IGN1cnJlbnRQcmljZTogbnVtYmVyID0gYXdhaXQgZ2V0UmVjb3ZlcnlNYXJrZXRQcmljZShjb2luKTtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKChmZWVBbW91bnRVc2QgLyBjdXJyZW50UHJpY2UpICogY29pbi5nZXRCYXNlRmFjdG9yKCkpO1xuICB9IGVsc2Uge1xuICAgIC8vIHdlIGNhbiBhZGQgbW9yZSBmZWUgc3RydWN0dXJlcyBoZXJlIGFzIG5lZWRlZCBmb3IgZGlmZmVyZW50IHByb3ZpZGVycywgc3VjaCBhcyBwZXJjZW50YWdlIG9mIHJlY292ZXJ5IGFtb3VudFxuICAgIHRocm93IG5ldyBFcnJvcignRmVlIHN0cnVjdHVyZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJQYXJhbXMge1xuICBzY2FuPzogbnVtYmVyO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xuICByZWNvdmVyeURlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIGtyc1Byb3ZpZGVyPzogc3RyaW5nO1xuICBpZ25vcmVBZGRyZXNzVHlwZXM6IFNjcmlwdFR5cGUyT2YzW107XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGFwaUtleT86IHN0cmluZztcbiAgdXNlcktleVBhdGg/OiBzdHJpbmc7XG4gIHJlY292ZXJ5UHJvdmlkZXI/OiBSZWNvdmVyeVByb3ZpZGVyO1xuICAvKiogU2F0b3NoaSBwZXIgYnl0ZSAqL1xuICBmZWVSYXRlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIGFkZHJlc3MgYW5kIGZvcm1hdCBpdCBmb3IgQVBJIHF1ZXJpZXNcbiAqIEBwYXJhbSBjb2luIC0gVGhlIGNvaW4gaW5zdGFuY2VcbiAqIEBwYXJhbSBjb2luTmFtZSAtIFRoZSBjb2luIG5hbWVcbiAqIEBwYXJhbSB3YWxsZXRLZXlzIC0gVGhlIHdhbGxldCBrZXlzXG4gKiBAcGFyYW0gY2hhaW4gLSBUaGUgY2hhaW4gY29kZVxuICogQHBhcmFtIGFkZHJJbmRleCAtIFRoZSBhZGRyZXNzIGluZGV4XG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGFkZHJlc3MgKHdpdGggY2FzaGFkZHIgcHJlZml4IHN0cmlwcGVkIGZvciBCQ0gvQkNIQSlcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkQWRkcmVzcyhcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgY29pbk5hbWU6IFV0eG9Db2luTmFtZSxcbiAgd2FsbGV0S2V5czogZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMsXG4gIGNoYWluOiBDaGFpbkNvZGUsXG4gIGFkZHJJbmRleDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBjb25zdCBmb3JtYXQgPSBjb2luLmdldENoYWluKCkgPT09ICdiY2gnIHx8IGNvaW4uZ2V0Q2hhaW4oKSA9PT0gJ2JjaGEnID8gJ2Nhc2hhZGRyJyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYWRkcmVzcyA9IGdlbmVyYXRlQWRkcmVzc1dpdGhDaGFpbkFuZEluZGV4KGNvaW5OYW1lLCB3YWxsZXRLZXlzLCBjaGFpbiwgYWRkckluZGV4LCBmb3JtYXQpO1xuXG4gIC8vIEJsb2NrY2hhaXIgdXNlcyBjYXNoYWRkciBmb3JtYXQgd2hlbiBxdWVyeWluZyB0aGUgQVBJIGZvciBhZGRyZXNzIGluZm9ybWF0aW9uLiBTdHJpcCB0aGUgcHJlZml4IGZvciBCQ0gvQkNIQS5cbiAgcmV0dXJuIGZvcm1hdCA9PT0gJ2Nhc2hhZGRyJyA/IGFkZHJlc3Muc3BsaXQoJzonKVsxXSA6IGFkZHJlc3M7XG59XG5cbmZ1bmN0aW9uIGhhc1dpdG5lc3NEYXRhKHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUyT2YzKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHRUeXBlICE9PSAncDJzaCc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHF1ZXJ5QmxvY2tjaGFpblVuc3BlbnRzUGF0aChcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcGFyYW1zOiBSZWNvdmVyUGFyYW1zLFxuICB3YWxsZXRLZXlzOiBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cyxcbiAgY2hhaW46IENoYWluQ29kZVxuKTogUHJvbWlzZTxXYWxsZXRVbnNwZW50PGJpZ2ludD5bXT4ge1xuICBjb25zdCBzY3JpcHRUeXBlID0gZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlLnNjcmlwdFR5cGUoY2hhaW4pO1xuICBjb25zdCBmZXRjaFByZXZUeCA9ICFoYXNXaXRuZXNzRGF0YShzY3JpcHRUeXBlKSAmJiBnZXRNYWlubmV0Q29pbk5hbWUoY29pbi5uYW1lKSAhPT0gJ3plYyc7XG4gIGNvbnN0IHJlY292ZXJ5UHJvdmlkZXIgPSBwYXJhbXMucmVjb3ZlcnlQcm92aWRlciA/PyBmb3JDb2luKGNvaW4uZ2V0Q2hhaW4oKSwgcGFyYW1zLmFwaUtleSk7XG4gIGNvbnN0IE1BWF9TRVFVRU5USUFMX0FERFJFU1NFU19XSVRIT1VUX1RYUyA9IHBhcmFtcy5zY2FuIHx8IDIwO1xuICBsZXQgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPSAwO1xuICBjb25zdCBwcmV2VHhDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UHJldlR4KHR4aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHByZXZUeEhleCA9IHByZXZUeENhY2hlLmdldCh0eGlkKTtcbiAgICBpZiAoIXByZXZUeEhleCkge1xuICAgICAgcHJldlR4SGV4ID0gYXdhaXQgcmVjb3ZlcnlQcm92aWRlci5nZXRUcmFuc2FjdGlvbkhleCh0eGlkKTtcbiAgICAgIHByZXZUeENhY2hlLnNldCh0eGlkLCBwcmV2VHhIZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcHJldlR4SGV4O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2F0aGVyVW5zcGVudHMoYWRkckluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWRBZGRyZXNzID0gZ2V0Rm9ybWF0dGVkQWRkcmVzcyhjb2luLCBjb2luLm5hbWUsIHdhbGxldEtleXMsIGNoYWluLCBhZGRySW5kZXgpO1xuICAgIGNvbnN0IGFkZHJJbmZvID0gYXdhaXQgcmVjb3ZlcnlQcm92aWRlci5nZXRBZGRyZXNzSW5mbyhmb3JtYXR0ZWRBZGRyZXNzKTtcbiAgICAvLyB3ZSB1c2UgdHhDb3VudCBoZXJlIGJlY2F1c2UgaXQgaW1wbGllcyB1c2FnZSAtIGhhdmluZyB0eCdlcyBtZWFucyB0aGUgYWRkciB3YXMgZ2VuZXJhdGVkIGFuZCB1c2VkXG4gICAgaWYgKGFkZHJJbmZvLnR4Q291bnQgPT09IDApIHtcbiAgICAgIG51bVNlcXVlbnRpYWxBZGRyZXNzZXNXaXRob3V0VHhzKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIG51bVNlcXVlbnRpYWxBZGRyZXNzZXNXaXRob3V0VHhzID0gMDtcblxuICAgICAgaWYgKGFkZHJJbmZvLmJhbGFuY2UgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCBhbiBhZGRyZXNzIHdpdGggYmFsYW5jZTogJHtmb3JtYXR0ZWRBZGRyZXNzfSB3aXRoIGJhbGFuY2UgJHthZGRySW5mby5iYWxhbmNlfWApO1xuICAgICAgICBjb25zdCBhZGRyZXNzVW5zcGVudHMgPSBhd2FpdCByZWNvdmVyeVByb3ZpZGVyLmdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKFtmb3JtYXR0ZWRBZGRyZXNzXSk7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZFVuc3BlbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgYWRkcmVzc1Vuc3BlbnRzLm1hcChhc3luYyAodSk6IFByb21pc2U8V2FsbGV0VW5zcGVudDxiaWdpbnQ+PiA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHR4aWQsIHZvdXQgfSA9IHBhcnNlT3V0cHV0SWQodS5pZCk7XG4gICAgICAgICAgICBsZXQgdmFsID0gQmlnSW50KHUudmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNvaW4uYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgICAgLy8gYmxvY2tjaGFpciByZXR1cm5zIHRoZSBudW1iZXIgd2l0aCB0aGUgY29ycmVjdCBwcmVjaXNpb24sIGJ1dCBpbiBudW1iZXIgZm9ybWF0XG4gICAgICAgICAgICAgIC8vIGpzb24gcGFyc2Ugd29uJ3QgcGFyc2UgaXQgY29ycmVjdGx5LCBzbyB3ZSByZXF1ZXJ5IHRoZSB0eGlkIGZvciB0aGUgdHggaGV4IHRvIGRlY29kZSBoZXJlXG4gICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGdldFByZXZUeCh0eGlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0eCA9IGNvaW4uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PGJpZ2ludD4odHhIZXgpO1xuICAgICAgICAgICAgICAgIHZhbCA9IHR4Lm91dHNbdm91dF0udmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoZSBhcGkgbWF5IHJldHVybiBjYXNoYWRkcidzIGluc3RlYWQgb2YgbGVnYWN5IGZvciBCQ0ggYW5kIEJDSEFcbiAgICAgICAgICAgIC8vIGRvd25zdHJlYW0gcHJvY2Vzc2VzJ3Mgb25seSBleHBlY3QgbGVnYWN5IGFkZHJlc3Nlc1xuICAgICAgICAgICAgdSA9IHsgLi4udSwgYWRkcmVzczogY29pbi5jYW5vbmljYWxBZGRyZXNzKHUuYWRkcmVzcykgfTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnUsXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcbiAgICAgICAgICAgICAgaW5kZXg6IGFkZHJJbmRleCxcbiAgICAgICAgICAgICAgcHJldlR4OiBmZXRjaFByZXZUeCA/IEJ1ZmZlci5mcm9tKGF3YWl0IGdldFByZXZUeCh0eGlkKSwgJ2hleCcpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSBhcyBXYWxsZXRVbnNwZW50PGJpZ2ludD47XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB3YWxsZXRVbnNwZW50cy5wdXNoKC4uLnByb2Nlc3NlZFVuc3BlbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPj0gTUFYX1NFUVVFTlRJQUxfQUREUkVTU0VTX1dJVEhPVVRfVFhTKSB7XG4gICAgICAvLyBzdG9wIHNlYXJjaGluZyBmb3IgYWRkcmVzc2VzIHdpdGggdW5zcGVudHMgaW4gdGhlbSwgd2UndmUgZm91bmQgJHtNQVhfU0VRVUVOVElBTF9BRERSRVNTRVNfV0lUSE9VVF9UWFN9IGluIGEgcm93IHdpdGggbm9uZVxuICAgICAgLy8gd2UgYXJlIGRvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0aGVyVW5zcGVudHMoYWRkckluZGV4ICsgMSk7XG4gIH1cblxuICAvLyBnZXQgdW5zcGVudHMgZm9yIHRoZXNlIGFkZHJlc3Nlc1xuXG4gIGNvbnN0IHdhbGxldFVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PGJpZ2ludD5bXSA9IFtdO1xuICAvLyBUaGlzIHdpbGwgcG9wdWxhdGUgd2FsbGV0QWRkcmVzc2VzXG4gIGF3YWl0IGdhdGhlclVuc3BlbnRzKDApO1xuXG4gIGlmICh3YWxsZXRVbnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBDb3VsZG4ndCBmaW5kIGFueSBhZGRyZXNzZXMgd2l0aCBmdW5kc1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiB3YWxsZXRVbnNwZW50cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcyhcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgeyBkZWZhdWx0VmFsdWUgfTogeyBkZWZhdWx0VmFsdWU6IG51bWJlciB9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAoY29pbi5nZXRGYW1pbHkoKSA9PT0gJ2RvZ2UnKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RvZ2Vjb2luL2RvZ2Vjb2luL2Jsb2IvbWFzdGVyL2RvYy9mZWUtcmVjb21tZW5kYXRpb24ubWRcbiAgICAvLyAwLjAxIERPR0UgcGVyIEtCXG4gICAgcmV0dXJuIDEwMDA7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBNZW1wb29sQXBpLmZvckNvaW4oY29pbi5nZXRDaGFpbigpKS5nZXRSZWNvdmVyeUZlZVBlckJ5dGVzKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmRpcihlKTtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24gPSB7XG4gIGlucHV0cz86IFdhbGxldFVuc3BlbnRKU09OW107XG4gIHRyYW5zYWN0aW9uSGV4OiBzdHJpbmc7XG4gIGNvaW46IHN0cmluZztcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIHJlY292ZXJ5QW1vdW50OiBudW1iZXI7XG4gIHJlY292ZXJ5QW1vdW50U3RyaW5nOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIGJhY2t1cCBrZXkgcmVjb3ZlcnkgUFNCVCBjcmVhdGlvbi5cbiAqIEFsbCBmaWVsZHMgYXJlIHByZS12YWxpZGF0ZWQgYW5kIGRlcml2ZWQgLSBubyBzdHJpbmcga2V5IHBhcnNpbmcgbmVlZGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJXaXRoVW5zcGVudHNQYXJhbXMge1xuICAvKiogUHJlLWRlcml2ZWQgd2FsbGV0IGtleXMgKi9cbiAgd2FsbGV0S2V5czogZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXM7XG4gIC8qKiBQcmUtZGVyaXZlZCBrZXkgdHJpcGxlICh1c2VyLCBiYWNrdXAsIGJpdGdvKS4gQ2hlY2sgcHJpdmF0ZUtleSB0byBkZXRlcm1pbmUgc2lnbmluZyBjYXBhYmlsaXR5LiAqL1xuICBrZXlzOiBUcmlwbGU8QklQMzI+O1xuICAvKiogVmFsaWRhdGVkIHJlY292ZXJ5IGRlc3RpbmF0aW9uIGFkZHJlc3MgKi9cbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICAvKiogRmVlIHJhdGUgaW4gc2F0b3NoaSBwZXIgdmJ5dGUgKi9cbiAgZmVlUmF0ZVNhdFZCOiBudW1iZXI7XG4gIC8qKiBLUlMgZmVlIGFtb3VudCBpbiBzYXRvc2hpcyAoMCBpZiBub3QgS1JTIHJlY292ZXJ5KSAqL1xuICBrcnNGZWU/OiBiaWdpbnQ7XG4gIC8qKiBLUlMgZmVlIGFkZHJlc3MgKHJlcXVpcmVkIGlmIGtyc0ZlZSA+IDApICovXG4gIGtyc0ZlZUFkZHJlc3M/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGhhc1ByaXZhdGVLZXkoa2V5OiBCSVAzMik6IGJvb2xlYW4ge1xuICByZXR1cm4ga2V5LnByaXZhdGVLZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSBQU0JUIHdpdGhvdXQgQml0R28sIHVzaW5nIHByb3ZpZGVkIHVuc3BlbnRzLlxuICpcbiAqIFRoaXMgaXMgdGhlIGNvcmUgdHJhbnNhY3Rpb24gYnVpbGRpbmcgbG9naWMsIHNlcGFyYXRlZCBmcm9tIHVuc3BlbnQgZ2F0aGVyaW5nXG4gKiBhbmQgb3V0cHV0IGZvcm1hdHRpbmcuIFJldHVybnMgYSBQU0JUIGF0IHRoZSBhcHByb3ByaWF0ZSBzaWduaW5nIHN0YWdlLlxuICpcbiAqIFNpZ25pbmcgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUga2V5czpcbiAqIC0gSWYgdXNlciBrZXkgaGFzIG5vIHByaXZhdGUga2V5OiB1bnNpZ25lZCBQU0JUXG4gKiAtIElmIHVzZXIga2V5IGhhcyBwcml2YXRlIGtleSBidXQgYmFja3VwIGRvZXNuJ3Q6IGhhbGYtc2lnbmVkIFBTQlQgKHVzZXIgc2lnbmF0dXJlIG9ubHkpXG4gKiAtIElmIGJvdGggdXNlciBhbmQgYmFja3VwIGtleXMgaGF2ZSBwcml2YXRlIGtleXM6IGZ1bGx5IHNpZ25lZCBQU0JUIChub3QgZmluYWxpemVkKVxuICpcbiAqIEBwYXJhbSBjb2luTmFtZSAtIFRoZSBjb2luIG5hbWUgZm9yIHRoZSBQU0JUXG4gKiBAcGFyYW0gcGFyYW1zIC0gUmVjb3ZlcnkgcGFyYW1ldGVycyB3aXRoIHByZS1kZXJpdmVkIGtleXNcbiAqIEBwYXJhbSB1bnNwZW50cyAtIFRoZSB3YWxsZXQgdW5zcGVudHMgdG8gcmVjb3ZlciAobXVzdCBiZSBub24tZW1wdHkpXG4gKiBAcmV0dXJucyBUaGUgUFNCVCBhdCB0aGUgYXBwcm9wcmlhdGUgc2lnbmluZyBzdGFnZSAobmV2ZXIgZmluYWxpemVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFja3VwS2V5UmVjb3ZlcnlXaXRoV2FsbGV0VW5zcGVudHMoXG4gIGNvaW5OYW1lOiBVdHhvQ29pbk5hbWUsXG4gIHBhcmFtczogUmVjb3ZlcldpdGhVbnNwZW50c1BhcmFtcyxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdXG4pOiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQge1xuICBjb25zdCB7IHdhbGxldEtleXMsIGtleXMsIHJlY292ZXJ5RGVzdGluYXRpb24sIGZlZVJhdGVTYXRWQiwga3JzRmVlLCBrcnNGZWVBZGRyZXNzIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHVuc3BlbnRTdW0odW5zcGVudHMpO1xuICBpZiAodG90YWxJbnB1dEFtb3VudCA8PSBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKCk7XG4gIH1cblxuICBsZXQgcHNidCA9IGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidChjb2luTmFtZSwgd2FsbGV0S2V5cywgdW5zcGVudHMsIHtcbiAgICBmZWVSYXRlU2F0VkI6IGZlZVJhdGVTYXRWQixcbiAgICByZWNvdmVyeURlc3RpbmF0aW9uOiByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgIGtleVJlY292ZXJ5U2VydmljZUZlZToga3JzRmVlID8/IEJpZ0ludCgwKSxcbiAgICBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzOiBrcnNGZWVBZGRyZXNzLFxuICB9KTtcblxuICBjb25zdCB1c2VySGFzUHJpdmF0ZUtleSA9IGhhc1ByaXZhdGVLZXkoa2V5c1swXSk7XG4gIGNvbnN0IGJhY2t1cEhhc1ByaXZhdGVLZXkgPSBoYXNQcml2YXRlS2V5KGtleXNbMV0pO1xuXG4gIGlmICghdXNlckhhc1ByaXZhdGVLZXkpIHtcbiAgICAvLyBVbnNpZ25lZCBzd2VlcCAtIHJldHVybiB1bnNpZ25lZCBQU0JUXG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBjb25zdCByZXBsYXlQcm90ZWN0aW9uID0geyBwdWJsaWNLZXlzOiBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyhjb2luTmFtZSkgfTtcblxuICAvLyBTaWduIHdpdGggdXNlciBrZXlcbiAgcHNidCA9IHNpZ25BbmRWZXJpZnlQc2J0KHBzYnQsIGtleXNbMF0sIHdhbGxldEtleXMsIHJlcGxheVByb3RlY3Rpb24pO1xuXG4gIGlmIChiYWNrdXBIYXNQcml2YXRlS2V5KSB7XG4gICAgLy8gRnVsbCByZWNvdmVyeSAtIHNpZ24gd2l0aCBiYWNrdXAga2V5IHRvb1xuICAgIHBzYnQgPSBzaWduQW5kVmVyaWZ5UHNidChwc2J0LCBrZXlzWzFdLCB3YWxsZXRLZXlzLCByZXBsYXlQcm90ZWN0aW9uKTtcbiAgfVxuXG4gIC8vIFJldHVybiBQU0JUIChub3QgZmluYWxpemVkIC0gbGV0IGNhbGxlciBkZWNpZGUgaG93IHRvIGZvcm1hdClcbiAgcmV0dXJuIHBzYnQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgZm9ybWF0dGluZyBhIGJhY2t1cCBrZXkgcmVjb3ZlcnkgcmVzdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEJhY2t1cEtleVJlY292ZXJ5UGFyYW1zIHtcbiAgLyoqIFByZS1kZXJpdmVkIHdhbGxldCBrZXlzICovXG4gIHdhbGxldEtleXM6IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzO1xuICAvKiogUHJlLWRlcml2ZWQga2V5IHRyaXBsZSAodXNlciwgYmFja3VwLCBiaXRnbykuIENoZWNrIHByaXZhdGVLZXkgdG8gZGV0ZXJtaW5lIHNpZ25pbmcgY2FwYWJpbGl0eS4gKi9cbiAga2V5czogVHJpcGxlPEJJUDMyPjtcbiAgLyoqIFJlY292ZXJ5IGRlc3RpbmF0aW9uIGFkZHJlc3MgKi9cbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICAvKiogS1JTIHByb3ZpZGVyIG5hbWUgKGlmIGJhY2t1cCBrZXkgaXMgaGVsZCBieSBLUlMpICovXG4gIGtyc1Byb3ZpZGVyPzogc3RyaW5nO1xuICAvKiogT3JpZ2luYWwgYmFja3VwIGtleSBzdHJpbmcgKG5lZWRlZCBmb3IgS1JTIHJlY292ZXJ5IHJlc3BvbnNlKSAqL1xuICBiYWNrdXBLZXk/OiBzdHJpbmc7XG4gIC8qKiBUaGUgd2FsbGV0IHVuc3BlbnRzIChuZWVkZWQgZm9yIGlucHV0cyBhcnJheSBpbiByZXNwb25zZSkgKi9cbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBiYWNrdXAga2V5IHJlY292ZXJ5IFBTQlQgaW50byB0aGUgYXBwcm9wcmlhdGUgcmVzcG9uc2UgZm9ybWF0LlxuICpcbiAqIE91dHB1dCBmb3JtYXQgZGVwZW5kcyBvbiBzaWduaW5nIHN0YXRlIGFuZCBLUlMgcHJvdmlkZXI6XG4gKiAtIFVuc2lnbmVkIHN3ZWVwOiBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8gd2l0aCBQU0JUIGhleFxuICogLSBLUlMga2V5dGVybmFsOiBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uIHdpdGggbGVnYWN5IGhhbGYtc2lnbmVkIHR4IGhleFxuICogLSBLUlMgb3RoZXI6IEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24gd2l0aCBQU0JUIGhleFxuICogLSBGdWxsIHJlY292ZXJ5OiBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uIHdpdGggZmluYWxpemVkIHR4IGhleFxuICpcbiAqIEBwYXJhbSBjb2luIC0gVGhlIGNvaW4gaW5zdGFuY2VcbiAqIEBwYXJhbSBwc2J0IC0gVGhlIFBTQlQgdG8gZm9ybWF0IChhdCBhcHByb3ByaWF0ZSBzaWduaW5nIHN0YWdlKVxuICogQHBhcmFtIHBhcmFtcyAtIEZvcm1hdHRpbmcgcGFyYW1ldGVyc1xuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCByZWNvdmVyeSByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJhY2t1cEtleVJlY292ZXJ5UmVzdWx0KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBwc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIHBhcmFtczogRm9ybWF0QmFja3VwS2V5UmVjb3ZlcnlQYXJhbXNcbik6IEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24gfCBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8ge1xuICBjb25zdCB7IHdhbGxldEtleXMsIGtleXMsIHJlY292ZXJ5RGVzdGluYXRpb24sIGtyc1Byb3ZpZGVyLCBiYWNrdXBLZXksIHVuc3BlbnRzIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgdXNlckhhc1ByaXZhdGVLZXkgPSBoYXNQcml2YXRlS2V5KGtleXNbMF0pO1xuICBjb25zdCBiYWNrdXBIYXNQcml2YXRlS2V5ID0gaGFzUHJpdmF0ZUtleShrZXlzWzFdKTtcblxuICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhdXNlckhhc1ByaXZhdGVLZXkgJiYgIWJhY2t1cEhhc1ByaXZhdGVLZXk7XG4gIGNvbnN0IGlzS3JzUmVjb3ZlcnkgPSBrcnNQcm92aWRlciAhPT0gdW5kZWZpbmVkICYmIHVzZXJIYXNQcml2YXRlS2V5ICYmICFiYWNrdXBIYXNQcml2YXRlS2V5O1xuICBjb25zdCBpc0Z1bGxSZWNvdmVyeSA9IHVzZXJIYXNQcml2YXRlS2V5ICYmIGJhY2t1cEhhc1ByaXZhdGVLZXk7XG5cbiAgLy8gVW5zaWduZWQgc3dlZXAgLSByZXR1cm4gRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvXG4gIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHhIZXg6IGVuY29kZVRyYW5zYWN0aW9uKHBzYnQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHR4SW5mbzoge30sXG4gICAgICBmZWVJbmZvOiB7fSxcbiAgICAgIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2VUeEZvcm1hdCA9ICFpc0tyc1JlY292ZXJ5IHx8IGtyc1Byb3ZpZGVyID09PSAna2V5dGVybmFsJyA/ICdsZWdhY3knIDogJ3BzYnQnO1xuICBjb25zdCB0eEluZm8gPSB7fSBhcyBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uO1xuXG4gIC8vIEluY2x1ZGUgaW5wdXRzIGFycmF5IGZvciBsZWdhY3kgZm9ybWF0IHJlc3BvbnNlc1xuICB0eEluZm8uaW5wdXRzID1cbiAgICByZXNwb25zZVR4Rm9ybWF0ID09PSAnbGVnYWN5J1xuICAgICAgPyB1bnNwZW50cy5tYXAoKHUpID0+ICh7IC4uLnUsIHZhbHVlOiBOdW1iZXIodS52YWx1ZSksIHZhbHVlU3RyaW5nOiB1LnZhbHVlLnRvU3RyaW5nKCksIHByZXZUeDogdW5kZWZpbmVkIH0pKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAvLyBLUlMgcmVjb3ZlcnkgLSBoYWxmLXNpZ25lZFxuICAgIC8vIGtleXRlcm5hbCB1c2VzIGxlZ2FjeSBmb3JtYXQsIG90aGVyIEtSUyBwcm92aWRlcnMgdXNlIFBTQlQgZm9ybWF0XG4gICAgdHhJbmZvLnRyYW5zYWN0aW9uSGV4ID1cbiAgICAgIGtyc1Byb3ZpZGVyID09PSAna2V5dGVybmFsJ1xuICAgICAgICA/IEJ1ZmZlci5mcm9tKHBzYnQuZ2V0SGFsZlNpZ25lZExlZ2FjeUZvcm1hdCgpKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgOiBlbmNvZGVUcmFuc2FjdGlvbihwc2J0KS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICB0eEluZm8uY29pbiA9IGNvaW4uZ2V0Q2hhaW4oKTtcbiAgICB0eEluZm8uYmFja3VwS2V5ID0gYmFja3VwS2V5ID8/ICcnO1xuICAgIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gZ2V0UmVjb3ZlcnlBbW91bnQocHNidCwgd2FsbGV0S2V5cywgcmVjb3ZlcnlEZXN0aW5hdGlvbik7XG4gICAgdHhJbmZvLnJlY292ZXJ5QW1vdW50ID0gTnVtYmVyKHJlY292ZXJ5QW1vdW50KTtcbiAgICB0eEluZm8ucmVjb3ZlcnlBbW91bnRTdHJpbmcgPSByZWNvdmVyeUFtb3VudC50b1N0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzRnVsbFJlY292ZXJ5KSB7XG4gICAgLy8gRnVsbCByZWNvdmVyeSAtIGZpbmFsaXplIGFuZCBleHRyYWN0IHRyYW5zYWN0aW9uXG4gICAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICAgIHR4SW5mby50cmFuc2FjdGlvbkhleCA9IEJ1ZmZlci5mcm9tKHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCkudG9CeXRlcygpKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICByZXR1cm4gdHhJbmZvO1xufVxuXG5mdW5jdGlvbiBnZXRCaXAzMktleXMoYml0Z286IEJpdEdvQmFzZSwgcGFyYW1zOiBSZWNvdmVyUGFyYW1zKTogVHJpcGxlPEJJUDMyPiB7XG4gIGNvbnN0IGtleXMgPSBnZXRCaXAzMktleXNGcm9tU2RrQ29yZShiaXRnbywgcGFyYW1zLCB7IHJlcXVpcmVCaXRHb1hwdWI6IHRydWUgfSk7XG4gIGlmICghaXNUcmlwbGUoa2V5cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGtleSB0cmlwbGVgKTtcbiAgfVxuICByZXR1cm4ga2V5cy5tYXAoKGspID0+IEJJUDMyLmZyb20oay50b0Jhc2U1OCgpKSkgYXMgVHJpcGxlPEJJUDMyPjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvLlxuICpcbiAqIFJldHVybnMgdHJhbnNhY3Rpb24gaGV4IGluIGxlZ2FjeSBmb3JtYXQgZm9yIHVuc2lnbmVkIHN3ZWVwIHRyYW5zYWN0aW9uLCBoYWxmIHNpZ25lZCBiYWNrdXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aCBLUlMgcHJvdmlkZXIgKG9ubHkga2V5dGVybmFsKSxcbiAqIGZ1bGx5IHNpZ25lZCBiYWNrdXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBhIEtSUyBwcm92aWRlci5cbiAqXG4gKiBSZXR1cm5zIFBTQlQgaGV4IGZvciBoYWxmIHNpZ25lZCBiYWNrdXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aCBLUlMgcHJvdmlkZXIgKGV4Y2x1ZGluZyBrZXl0ZXJuYWwpXG4gKiBGb3IgUFNCVCBoZXggY2FzZXMsIFVuc3BlbnRzIGFyZSBub3QgcmVxdWlyZWQgaW4gcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIGNvaW5cbiAqIEBwYXJhbSBiaXRnb1xuICogQHBhcmFtIHBhcmFtc1xuICogLSB1c2VyS2V5OiBbZW5jcnlwdGVkXSB4cHJ2LCBvciB4cHViXG4gKiAtIGJhY2t1cEtleTogW2VuY3J5cHRlZF0geHBydiwgb3IgeHB1YiBpZiB0aGUgeHBydiBpcyBoZWxkIGJ5IGEgS1JTIHByb3ZpZGVyXG4gKiAtIHdhbGxldFBhc3NwaHJhc2U6IG5lY2Vzc2FyeSBpZiBvbmUgb2YgdGhlIHhwcnZzIGlzIGVuY3J5cHRlZFxuICogLSBiaXRnb0tleTogeHB1YlxuICogLSBrcnNQcm92aWRlcjogbmVjZXNzYXJ5IGlmIGJhY2t1cCBrZXkgaXMgaGVsZCBieSBLUlNcbiAqIC0gcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGFyZ2V0IGFkZHJlc3MgdG8gc2VuZCByZWNvdmVyZWQgZnVuZHMgdG9cbiAqIC0gc2NhbjogdGhlIGFtb3VudCBvZiBjb25zZWN1dGl2ZSBhZGRyZXNzZXMgd2l0aG91dCB1bnNwZW50cyB0byBzY2FuIHRocm91Z2ggYmVmb3JlIHN0b3BwaW5nXG4gKiAtIGlnbm9yZUFkZHJlc3NUeXBlczogKG9wdGlvbmFsKSBzY3JpcHRzIHRvIGlnbm9yZVxuICogICAgICAgIGZvciBleGFtcGxlOiBbJ3Ayc2hQMndzaCcsICdwMndzaCddIHdpbGwgcHJldmVudCBjb2RlIGZyb20gY2hlY2tpbmcgZm9yIHdyYXBwZWQtc2Vnd2l0IGFuZCBuYXRpdmUtc2Vnd2l0IGNoYWlucyBvbiB0aGUgcHVibGljIGJsb2NrIGV4cGxvcmVyc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmFja3VwS2V5UmVjb3ZlcnkoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogUmVjb3ZlclBhcmFtc1xuKTogUHJvbWlzZTxCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uIHwgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvPiB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyS2V5Jyk7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYmFja3VwS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgfVxuXG4gIGlmIChcbiAgICBfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSB8fFxuICAgICFjb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCB7IGFueUZvcm1hdDogdHJ1ZSB9KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zY2FuKSAmJiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5zY2FuKSB8fCBwYXJhbXMuc2NhbiA8IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY2FuIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmZlZVJhdGUgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0Zpbml0ZShwYXJhbXMuZmVlUmF0ZSkgfHwgcGFyYW1zLmZlZVJhdGUgPD0gMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZlZVJhdGUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB9XG5cbiAgLy8gY2hlY2sgd2hldGhlciBrZXkgbWF0ZXJpYWwgYW5kIHBhc3N3b3JkIGF1dGhlbnRpY2F0ZSB0aGUgdXNlcnMgYW5kIHJldHVybiBwYXJlbnQga2V5cyBvZiBhbGwgdGhyZWUga2V5cyBvZiB0aGUgd2FsbGV0XG4gIGNvbnN0IGtleXMgPSBnZXRCaXAzMktleXMoYml0Z28sIHBhcmFtcyk7XG4gIGNvbnN0IHdhbGxldEtleXMgPSBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cy5mcm9tKHtcbiAgICB0cmlwbGU6IGtleXMsXG4gICAgZGVyaXZhdGlvblByZWZpeGVzOiBbcGFyYW1zLnVzZXJLZXlQYXRoIHx8ICdtLzAvMCcsICdtLzAvMCcsICdtLzAvMCddLFxuICB9KTtcblxuICBjb25zdCB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10gPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaXhlZFNjcmlwdFdhbGxldC5vdXRwdXRTY3JpcHRUeXBlc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChhZGRyZXNzVHlwZSkgPT5cbiAgICAgICAgICAgIGZpeGVkU2NyaXB0V2FsbGV0LnN1cHBvcnRzU2NyaXB0VHlwZShjb2luLm5hbWUsIGFkZHJlc3NUeXBlKSAmJlxuICAgICAgICAgICAgIXBhcmFtcy5pZ25vcmVBZGRyZXNzVHlwZXM/LmluY2x1ZGVzKGFkZHJlc3NUeXBlKVxuICAgICAgICApXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKHF1ZXJpZXMsIGFkZHJlc3NUeXBlKSA9PiBbXG4gICAgICAgICAgICAuLi5xdWVyaWVzLFxuICAgICAgICAgICAgcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoKFxuICAgICAgICAgICAgICBjb2luLFxuICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgIHdhbGxldEtleXMsXG4gICAgICAgICAgICAgIGZpeGVkU2NyaXB0V2FsbGV0LkNoYWluQ29kZS52YWx1ZShhZGRyZXNzVHlwZSwgJ2V4dGVybmFsJylcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBxdWVyeUJsb2NrY2hhaW5VbnNwZW50c1BhdGgoXG4gICAgICAgICAgICAgIGNvaW4sXG4gICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgd2FsbGV0S2V5cyxcbiAgICAgICAgICAgICAgZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlLnZhbHVlKGFkZHJlc3NUeXBlLCAnaW50ZXJuYWwnKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIFtdIGFzIFByb21pc2U8V2FsbGV0VW5zcGVudDxiaWdpbnQ+W10+W11cbiAgICAgICAgKVxuICAgIClcbiAgKS5mbGF0KCk7XG5cbiAgY29uc3QgZmVlUmF0ZVNhdFZCID1cbiAgICBwYXJhbXMuZmVlUmF0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHBhcmFtcy5mZWVSYXRlXG4gICAgICA6IGF3YWl0IGdldFJlY292ZXJ5RmVlUGVyQnl0ZXMoY29pbiwgeyBkZWZhdWx0VmFsdWU6IERFRkFVTFRfUkVDT1ZFUllfRkVFUkFURV9TQVRfVkJZVEVfVjIgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIEtSUyBmZWUgaWYgbmVlZGVkXG4gIGNvbnN0IHVzZXJIYXNQcml2YXRlS2V5ID0gaGFzUHJpdmF0ZUtleShrZXlzWzBdKTtcbiAgY29uc3QgYmFja3VwSGFzUHJpdmF0ZUtleSA9IGhhc1ByaXZhdGVLZXkoa2V5c1sxXSk7XG4gIGNvbnN0IGlzS3JzUmVjb3ZlcnkgPSBwYXJhbXMua3JzUHJvdmlkZXIgIT09IHVuZGVmaW5lZCAmJiB1c2VySGFzUHJpdmF0ZUtleSAmJiAhYmFja3VwSGFzUHJpdmF0ZUtleTtcblxuICBsZXQga3JzRmVlID0gQmlnSW50KDApO1xuICBsZXQga3JzRmVlQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChpc0tyc1JlY292ZXJ5ICYmIHBhcmFtcy5rcnNQcm92aWRlcikge1xuICAgIHRyeSB7XG4gICAgICBrcnNGZWUgPSBCaWdJbnQoYXdhaXQgY2FsY3VsYXRlRmVlQW1vdW50KGNvaW4sIHsgcHJvdmlkZXI6IHBhcmFtcy5rcnNQcm92aWRlciB9KSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBEb24ndCBsZXQgdGhpcyBlcnJvciBibG9jayB0aGUgcmVjb3ZlcnkgLVxuICAgICAgY29uc29sZS5kaXIoZXJyKTtcbiAgICB9XG5cbiAgICBpZiAoa3JzRmVlID4gQmlnSW50KDApKSB7XG4gICAgICBjb25zdCBrcnNQcm92aWRlckNvbmZpZyA9IGdldEtyc1Byb3ZpZGVyKGNvaW4sIHBhcmFtcy5rcnNQcm92aWRlcik7XG4gICAgICBpZiAoIWtyc1Byb3ZpZGVyQ29uZmlnLmZlZUFkZHJlc3Nlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGtleVByb3ZpZGVyIG11c3QgZGVmaW5lIGZlZUFkZHJlc3Nlc2ApO1xuICAgICAgfVxuXG4gICAgICBrcnNGZWVBZGRyZXNzID0ga3JzUHJvdmlkZXJDb25maWcuZmVlQWRkcmVzc2VzW2NvaW4uZ2V0Q2hhaW4oKV07XG5cbiAgICAgIGlmICgha3JzRmVlQWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgS1JTIHByb3ZpZGVyIGhhcyBub3QgY29uZmlndXJlZCB0aGVpciBmZWUgc3RydWN0dXJlIHlldCAtIHJlY292ZXJ5IGNhbm5vdCBiZSBjb21wbGV0ZWQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCBhbmQgc2lnbiBQU0JUXG4gIGNvbnN0IHBzYnQgPSBiYWNrdXBLZXlSZWNvdmVyeVdpdGhXYWxsZXRVbnNwZW50cyhcbiAgICBjb2luLm5hbWUsXG4gICAge1xuICAgICAgd2FsbGV0S2V5cyxcbiAgICAgIGtleXMsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIGZlZVJhdGVTYXRWQixcbiAgICAgIGtyc0ZlZSxcbiAgICAgIGtyc0ZlZUFkZHJlc3MsXG4gICAgfSxcbiAgICB1bnNwZW50c1xuICApO1xuXG4gIC8vIEZvcm1hdCB0aGUgcmVzdWx0XG4gIHJldHVybiBmb3JtYXRCYWNrdXBLZXlSZWNvdmVyeVJlc3VsdChjb2luLCBwc2J0LCB7XG4gICAgd2FsbGV0S2V5cyxcbiAgICBrZXlzLFxuICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgIGtyc1Byb3ZpZGVyOiBwYXJhbXMua3JzUHJvdmlkZXIsXG4gICAgYmFja3VwS2V5OiBwYXJhbXMuYmFja3VwS2V5LFxuICAgIHVuc3BlbnRzLFxuICB9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCaXRHb1YxVW5zcGVudCB7XG4gIHR4X2hhc2g6IHN0cmluZztcbiAgdHhfb3V0cHV0X246IG51bWJlcjtcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWMVN3ZWVwUGFyYW1zIHtcbiAgd2FsbGV0SWQ6IHN0cmluZztcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICB1bnNwZW50czogQml0R29WMVVuc3BlbnRbXTtcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIG90cDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFYxUmVjb3ZlclBhcmFtcyBleHRlbmRzIE9taXQ8VjFTd2VlcFBhcmFtcywgJ290cCc+IHtcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2MUJhY2t1cEtleVJlY292ZXJ5KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBiaXRnbzogQml0R29CYXNlLFxuICBwYXJhbXM6IFYxUmVjb3ZlclBhcmFtc1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKFxuICAgIF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pIHx8XG4gICAgIWNvaW4uaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIHsgYW55Rm9ybWF0OiB0cnVlIH0pXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gIH1cblxuICBjb25zdCByZWNvdmVyeUZlZVBlckJ5dGUgPSBhd2FpdCBnZXRSZWNvdmVyeUZlZVBlckJ5dGVzKGNvaW4sIHtcbiAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfUkVDT1ZFUllfRkVFUkFURV9TQVRfVkJZVEVfVjEsXG4gIH0pO1xuICBjb25zdCB2MXdhbGxldCA9IGF3YWl0IGJpdGdvLndhbGxldHMoKS5nZXQoeyBpZDogcGFyYW1zLndhbGxldElkIH0pO1xuICByZXR1cm4gYXdhaXQgdjF3YWxsZXQucmVjb3Zlcih7XG4gICAgLi4ucGFyYW1zLFxuICAgIGZlZVJhdGU6IHJlY292ZXJ5RmVlUGVyQnl0ZSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2MVN3ZWVwKFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBiaXRnbzogQml0R29CYXNlLFxuICBwYXJhbXM6IFYxU3dlZXBQYXJhbXNcbik6IFByb21pc2U8e1xuICB0eDogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xufT4ge1xuICBpZiAoXG4gICAgXy5pc1VuZGVmaW5lZChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikgfHxcbiAgICAhY29pbi5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgeyBhbnlGb3JtYXQ6IHRydWUgfSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuXG4gIGxldCByZWNvdmVyeUZlZVBlckJ5dGUgPSAxMDA7XG4gIGlmIChiaXRnby5lbnYgPT09ICdwcm9kJykge1xuICAgIHJlY292ZXJ5RmVlUGVyQnl0ZSA9IGF3YWl0IGdldFJlY292ZXJ5RmVlUGVyQnl0ZXMoY29pbiwge1xuICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX1JFQ09WRVJZX0ZFRVJBVEVfU0FUX1ZCWVRFX1YxX1NXRUVQLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgdjF3YWxsZXQgPSBhd2FpdCBiaXRnby53YWxsZXRzKCkuZ2V0KHsgaWQ6IHBhcmFtcy53YWxsZXRJZCB9KTtcbiAgcmV0dXJuIGF3YWl0IHYxd2FsbGV0LnN3ZWVwKHtcbiAgICAuLi5wYXJhbXMsXG4gICAgZmVlUmF0ZTogcmVjb3ZlcnlGZWVQZXJCeXRlLFxuICB9KTtcbn1cbiJdfQ==
@@ -1,8 +1,7 @@
1
- import * as utxolib from '@bitgo/utxo-lib';
1
+ import { fixedScriptWallet } from '@bitgo/wasm-utxo';
2
2
  import { BitGoBase, IWallet } from '@bitgo/sdk-core';
3
3
  import { AbstractUtxoCoin, TransactionInfo } from '../abstractUtxoCoin';
4
4
  import { UtxoCoinName } from '../names';
5
- type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
6
5
  export interface BuildRecoveryTransactionOptions {
7
6
  wallet: string;
8
7
  faultyTxId: string;
@@ -52,11 +51,12 @@ export declare function getWallet(bitgo: BitGoBase, coin: AbstractUtxoCoin, wall
52
51
  * @param wallet
53
52
  * @return wallet pubkeys
54
53
  */
55
- export declare function getWalletKeys(recoveryCoin: AbstractUtxoCoin, wallet: IWallet | WalletV1): Promise<RootWalletKeys>;
54
+ export declare function getWalletKeys(recoveryCoin: AbstractUtxoCoin, wallet: IWallet | WalletV1): Promise<fixedScriptWallet.RootWalletKeys>;
56
55
  export declare function isWalletAddress(wallet: IWallet | WalletV1, address: string): Promise<boolean>;
57
56
  /**
58
- * Convert a Litecoin P2SH address from M... format (scriptHash 0x32) to the legacy 3... format (scriptHash 0x05).
59
- * This is needed for cross-chain recovery when LTC was sent to a BTC address, because the BTC wallet
57
+ * Convert a Litecoin P2SH address from M... format (scriptHash 0x32) to the legacy 3... format (scriptHash 0x05)
58
+ * and Q... format (scriptHash 0x32) to the legacy 2... format (scriptHash 0x05).
59
+ * This is needed for cross-chain recovery when (T)LTC was sent to a (T)BTC address, because the (T)BTC wallet
60
60
  * stores addresses in the 3... format while the LTC blockchain returns addresses in M... format.
61
61
  *
62
62
  * @param address - LTC address to convert
@@ -1 +1 @@
1
- {"version":3,"file":"crossChainRecovery.d.ts","sourceRoot":"","sources":["../../../../src/recovery/crossChainRecovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crossChainRecovery.d.ts","sourceRoot":"","sources":["../../../../src/recovery/crossChainRecovery.ts"],"names":[],"mappings":"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"}