@bitgo/abstract-utxo 10.6.0 → 10.8.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 (785) hide show
  1. package/dist/{src → cjs/src}/abstractUtxoCoin.d.ts +18 -75
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
  3. package/dist/cjs/src/abstractUtxoCoin.js +630 -0
  4. package/dist/{src → cjs/src}/address/fixedScript.d.ts +2 -4
  5. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
  6. package/dist/cjs/src/address/fixedScript.js +155 -0
  7. package/dist/cjs/src/address/index.d.ts.map +1 -0
  8. package/dist/{src → cjs/src}/address/index.js +1 -1
  9. package/dist/cjs/src/config.d.ts.map +1 -0
  10. package/dist/cjs/src/config.js +14 -0
  11. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  12. package/dist/cjs/src/descriptor/NamedDescriptor.js +79 -0
  13. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  14. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +66 -0
  15. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
  16. package/dist/cjs/src/descriptor/builder/builder.js +37 -0
  17. package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
  18. package/dist/{src → cjs/src}/descriptor/builder/index.js +1 -1
  19. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
  20. package/dist/cjs/src/descriptor/builder/parse.js +116 -0
  21. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  22. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
  23. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  24. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
  25. package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
  26. package/dist/{src → cjs/src}/descriptor/createWallet/index.js +1 -1
  27. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
  28. package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
  29. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  30. package/dist/{src → cjs/src}/descriptor/index.js +1 -1
  31. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
  32. package/dist/cjs/src/descriptor/validatePolicy.js +92 -0
  33. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
  34. package/dist/cjs/src/impl/bch/bch.js +74 -0
  35. package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
  36. package/dist/{src → cjs/src}/impl/bch/index.js +1 -1
  37. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
  38. package/dist/{src → cjs/src}/impl/bch/tbch.js +1 -1
  39. package/dist/{src → cjs/src}/impl/bcha/bcha.d.ts +0 -1
  40. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
  41. package/dist/cjs/src/impl/bcha/bcha.js +48 -0
  42. package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
  43. package/dist/{src → cjs/src}/impl/bcha/index.js +1 -1
  44. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
  45. package/dist/{src → cjs/src}/impl/bcha/tbcha.js +1 -1
  46. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
  47. package/dist/{src → cjs/src}/impl/bsv/bsv.js +1 -1
  48. package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
  49. package/dist/{src → cjs/src}/impl/bsv/index.js +1 -1
  50. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
  51. package/dist/{src → cjs/src}/impl/bsv/tbsv.js +1 -1
  52. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
  53. package/dist/{src → cjs/src}/impl/btc/btc.js +1 -1
  54. package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
  55. package/dist/{src → cjs/src}/impl/btc/index.js +1 -1
  56. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  57. package/dist/cjs/src/impl/btc/inscriptionBuilder.js +183 -0
  58. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
  59. package/dist/{src → cjs/src}/impl/btc/tbtc.js +1 -1
  60. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
  61. package/dist/{src → cjs/src}/impl/btc/tbtc4.js +1 -1
  62. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
  63. package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.js +1 -1
  64. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
  65. package/dist/{src → cjs/src}/impl/btc/tbtcsig.js +1 -1
  66. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
  67. package/dist/{src → cjs/src}/impl/btg/btg.js +1 -1
  68. package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
  69. package/dist/{src → cjs/src}/impl/btg/index.js +1 -1
  70. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
  71. package/dist/{src → cjs/src}/impl/dash/dash.js +1 -1
  72. package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
  73. package/dist/{src → cjs/src}/impl/dash/index.js +1 -1
  74. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
  75. package/dist/{src → cjs/src}/impl/dash/tdash.js +1 -1
  76. package/dist/{src → cjs/src}/impl/doge/doge.d.ts +4 -2
  77. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
  78. package/dist/cjs/src/impl/doge/doge.js +79 -0
  79. package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
  80. package/dist/{src → cjs/src}/impl/doge/index.js +1 -1
  81. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
  82. package/dist/{src → cjs/src}/impl/doge/tdoge.js +1 -1
  83. package/dist/cjs/src/impl/index.d.ts.map +1 -0
  84. package/dist/{src → cjs/src}/impl/index.js +1 -1
  85. package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
  86. package/dist/{src → cjs/src}/impl/ltc/index.js +1 -1
  87. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
  88. package/dist/{src → cjs/src}/impl/ltc/ltc.js +1 -1
  89. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
  90. package/dist/{src → cjs/src}/impl/ltc/tltc.js +1 -1
  91. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
  92. package/dist/{src → cjs/src}/impl/zec/index.js +1 -1
  93. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
  94. package/dist/{src → cjs/src}/impl/zec/tzec.js +1 -1
  95. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
  96. package/dist/{src → cjs/src}/impl/zec/zec.js +1 -1
  97. package/dist/cjs/src/index.d.ts.map +1 -0
  98. package/dist/{src → cjs/src}/index.js +1 -1
  99. package/dist/{src → cjs/src}/keychains.d.ts +6 -2
  100. package/dist/cjs/src/keychains.d.ts.map +1 -0
  101. package/dist/cjs/src/keychains.js +136 -0
  102. package/dist/cjs/src/names.d.ts.map +1 -0
  103. package/dist/cjs/src/names.js +214 -0
  104. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  105. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +26 -0
  106. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  107. package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
  108. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  109. package/dist/cjs/src/offlineVault/TransactionExplanation.js +16 -0
  110. package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
  111. package/dist/{src → cjs/src}/offlineVault/descriptor/index.js +1 -1
  112. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  113. package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
  114. package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
  115. package/dist/{src → cjs/src}/offlineVault/index.js +1 -1
  116. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
  117. package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
  118. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
  119. package/dist/cjs/src/recovery/backupKeyRecovery.js +377 -0
  120. package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
  121. package/dist/cjs/src/recovery/baseApi.js +73 -0
  122. package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
  123. package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
  124. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
  125. package/dist/cjs/src/recovery/crossChainRecovery.js +364 -0
  126. package/dist/cjs/src/recovery/index.d.ts.map +1 -0
  127. package/dist/{src → cjs/src}/recovery/index.js +1 -1
  128. package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
  129. package/dist/cjs/src/recovery/mempoolApi.js +36 -0
  130. package/dist/{src → cjs/src}/replayProtection.d.ts +1 -0
  131. package/dist/cjs/src/replayProtection.d.ts.map +1 -0
  132. package/dist/cjs/src/replayProtection.js +58 -0
  133. package/dist/cjs/src/sign.d.ts.map +1 -0
  134. package/dist/cjs/src/sign.js +205 -0
  135. package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
  136. package/dist/cjs/src/transaction/bip322.js +125 -0
  137. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  138. package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
  139. package/dist/{src → cjs/src}/transaction/descriptor/explainPsbt.d.ts +2 -2
  140. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  141. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +80 -0
  142. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
  143. package/dist/{src → cjs/src}/transaction/descriptor/index.js +1 -1
  144. package/dist/{src → cjs/src}/transaction/descriptor/parse.d.ts +2 -1
  145. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
  146. package/dist/cjs/src/transaction/descriptor/parse.js +116 -0
  147. package/dist/{src → cjs/src}/transaction/descriptor/parseToAmountType.d.ts +2 -1
  148. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  149. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
  150. package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
  151. package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
  152. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  153. package/dist/cjs/src/transaction/descriptor/signPsbt.js +43 -0
  154. package/dist/{src → cjs/src}/transaction/descriptor/verifyTransaction.d.ts +2 -1
  155. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  156. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +108 -0
  157. package/dist/{src → cjs/src}/transaction/explainTransaction.d.ts +4 -3
  158. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
  159. package/dist/cjs/src/transaction/explainTransaction.js +88 -0
  160. package/dist/cjs/src/transaction/fetchInputs.d.ts.map +1 -0
  161. package/dist/cjs/src/transaction/fetchInputs.js +109 -0
  162. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +11 -0
  163. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  164. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +67 -0
  165. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +73 -0
  166. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  167. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +344 -0
  168. package/dist/{src → cjs/src}/transaction/fixedScript/index.d.ts +1 -0
  169. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
  170. package/dist/{src → cjs/src}/transaction/fixedScript/index.js +4 -2
  171. package/dist/{src → cjs/src}/transaction/fixedScript/parseOutput.d.ts +3 -1
  172. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  173. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +220 -0
  174. package/dist/{src → cjs/src}/transaction/fixedScript/parseTransaction.d.ts +2 -1
  175. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  176. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +215 -0
  177. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  178. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +101 -0
  179. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  180. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +198 -0
  181. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  182. package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.js +1 -1
  183. package/dist/{src → cjs/src}/transaction/index.d.ts +1 -0
  184. package/dist/cjs/src/transaction/index.d.ts.map +1 -0
  185. package/dist/{src → cjs/src}/transaction/index.js +2 -1
  186. package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
  187. package/dist/cjs/src/transaction/outputDifference.js +47 -0
  188. package/dist/{src → cjs/src}/transaction/parseTransaction.d.ts +2 -1
  189. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
  190. package/dist/{src → cjs/src}/transaction/parseTransaction.js +1 -1
  191. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
  192. package/dist/cjs/src/transaction/recipient.js +88 -0
  193. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
  194. package/dist/cjs/src/transaction/signTransaction.js +102 -0
  195. package/dist/cjs/src/transaction/types.d.ts +44 -0
  196. package/dist/cjs/src/transaction/types.d.ts.map +1 -0
  197. package/dist/cjs/src/transaction/types.js +3 -0
  198. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
  199. package/dist/{src → cjs/src}/transaction/verifyTransaction.js +1 -1
  200. package/dist/{src → cjs/src}/verifyKey.d.ts +2 -1
  201. package/dist/cjs/src/verifyKey.d.ts.map +1 -0
  202. package/dist/cjs/src/verifyKey.js +164 -0
  203. package/dist/cjs/src/wallet.d.ts.map +1 -0
  204. package/dist/cjs/src/wallet.js +8 -0
  205. package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
  206. package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
  207. package/dist/cjs/test/integration/impl/bch/bch.js +74 -0
  208. package/dist/cjs/test/unit/address.d.ts +2 -0
  209. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  210. package/dist/cjs/test/unit/address.js +182 -0
  211. package/dist/cjs/test/unit/bip322.d.ts +2 -0
  212. package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
  213. package/dist/cjs/test/unit/bip322.js +45 -0
  214. package/dist/cjs/test/unit/coins.d.ts +2 -0
  215. package/dist/cjs/test/unit/coins.d.ts.map +1 -0
  216. package/dist/cjs/test/unit/coins.js +97 -0
  217. package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
  218. package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
  219. package/dist/cjs/test/unit/customChangeWallet.js +154 -0
  220. package/dist/cjs/test/unit/customSigner.d.ts +3 -0
  221. package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
  222. package/dist/cjs/test/unit/customSigner.js +108 -0
  223. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
  224. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
  225. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +18 -0
  226. package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
  227. package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
  228. package/dist/cjs/test/unit/descriptor/builder.js +72 -0
  229. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
  230. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  231. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +20 -0
  232. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
  233. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
  234. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +28 -0
  235. package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
  236. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
  237. package/dist/cjs/test/unit/descriptorAddress.js +102 -0
  238. package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
  239. package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
  240. package/dist/cjs/test/unit/explainTransaction.js +74 -0
  241. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +15 -0
  242. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +1 -0
  243. package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +51 -0
  244. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
  245. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
  246. package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
  247. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
  248. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
  249. package/dist/cjs/test/unit/impl/bch/unit/bch.js +138 -0
  250. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
  251. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
  252. package/dist/cjs/test/unit/impl/bcha/unit/index.js +47 -0
  253. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
  254. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
  255. package/dist/cjs/test/unit/impl/bsv/unit/index.js +32 -0
  256. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +2 -0
  257. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +1 -0
  258. package/dist/cjs/test/unit/impl/btc/unit/btc.js +220 -0
  259. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +4 -0
  260. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +1 -0
  261. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +10 -0
  262. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +2 -0
  263. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +1 -0
  264. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +18 -0
  265. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
  266. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
  267. package/dist/cjs/test/unit/impl/btg/unit/index.js +29 -0
  268. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
  269. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
  270. package/dist/cjs/test/unit/impl/dash/unit/index.js +32 -0
  271. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
  272. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
  273. package/dist/cjs/test/unit/impl/doge/unit/index.js +32 -0
  274. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +2 -0
  275. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +1 -0
  276. package/dist/cjs/test/unit/impl/ltc/unit/index.js +39 -0
  277. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
  278. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
  279. package/dist/cjs/test/unit/impl/zec/unit/index.js +29 -0
  280. package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
  281. package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
  282. package/dist/cjs/test/unit/keySignatures.js +54 -0
  283. package/dist/cjs/test/unit/keychains.d.ts +2 -0
  284. package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
  285. package/dist/cjs/test/unit/keychains.js +49 -0
  286. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
  287. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
  288. package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
  289. package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
  290. package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
  291. package/dist/cjs/test/unit/parseTransaction.js +125 -0
  292. package/dist/cjs/test/unit/prebuildAndSign.d.ts +6 -0
  293. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
  294. package/dist/cjs/test/unit/prebuildAndSign.js +270 -0
  295. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
  296. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
  297. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +286 -0
  298. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
  299. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
  300. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +283 -0
  301. package/dist/cjs/test/unit/recovery/mock.d.ts +30 -0
  302. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
  303. package/dist/cjs/test/unit/recovery/mock.js +138 -0
  304. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
  305. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  306. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +30 -0
  307. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
  308. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
  309. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +17 -0
  310. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts +2 -0
  311. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts.map +1 -0
  312. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.js +76 -0
  313. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
  314. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
  315. package/dist/cjs/test/unit/transaction/descriptor/parse.js +135 -0
  316. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
  317. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
  318. package/dist/cjs/test/unit/transaction/descriptor/sign.js +32 -0
  319. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
  320. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
  321. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +48 -0
  322. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
  323. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
  324. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +132 -0
  325. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts +2 -0
  326. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts.map +1 -0
  327. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +288 -0
  328. package/dist/cjs/test/unit/transaction/fixedScript/util.d.ts +3 -0
  329. package/dist/cjs/test/unit/transaction/fixedScript/util.d.ts.map +1 -0
  330. package/dist/cjs/test/unit/transaction/fixedScript/util.js +46 -0
  331. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  332. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  333. package/dist/cjs/test/unit/transaction.js +501 -0
  334. package/dist/cjs/test/unit/txFormat.d.ts +30 -0
  335. package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
  336. package/dist/cjs/test/unit/txFormat.js +174 -0
  337. package/dist/cjs/test/unit/util/fixtures.d.ts +14 -0
  338. package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
  339. package/dist/cjs/test/unit/util/fixtures.js +102 -0
  340. package/dist/cjs/test/unit/util/index.d.ts +7 -0
  341. package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
  342. package/dist/cjs/test/unit/util/index.js +23 -0
  343. package/dist/cjs/test/unit/util/keychains.d.ts +26 -0
  344. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
  345. package/dist/cjs/test/unit/util/keychains.js +72 -0
  346. package/dist/cjs/test/unit/util/nockBitGo.d.ts +3 -0
  347. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
  348. package/dist/cjs/test/unit/util/nockBitGo.js +11 -0
  349. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
  350. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
  351. package/dist/cjs/test/unit/util/nockIndexerAPI.js +56 -0
  352. package/dist/cjs/test/unit/util/transaction.d.ts +24 -0
  353. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
  354. package/dist/cjs/test/unit/util/transaction.js +107 -0
  355. package/dist/cjs/test/unit/util/unspents.d.ts +13 -0
  356. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
  357. package/dist/cjs/test/unit/util/unspents.js +106 -0
  358. package/dist/cjs/test/unit/util/utxoCoins.d.ts +8 -0
  359. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
  360. package/dist/cjs/test/unit/util/utxoCoins.js +95 -0
  361. package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
  362. package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
  363. package/dist/cjs/test/unit/util/wallet.js +9 -0
  364. package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
  365. package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
  366. package/dist/cjs/test/unit/verifyTransaction.js +327 -0
  367. package/dist/cjs/test/unit/wallet.d.ts +2 -0
  368. package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
  369. package/dist/cjs/test/unit/wallet.js +248 -0
  370. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  371. package/dist/esm/abstractUtxoCoin.d.ts +418 -0
  372. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
  373. package/dist/esm/abstractUtxoCoin.js +589 -0
  374. package/dist/esm/address/fixedScript.d.ts +49 -0
  375. package/dist/esm/address/fixedScript.d.ts.map +1 -0
  376. package/dist/esm/address/fixedScript.js +114 -0
  377. package/dist/esm/address/index.d.ts +2 -0
  378. package/dist/esm/address/index.js +2 -0
  379. package/dist/esm/config.d.ts +9 -0
  380. package/dist/esm/config.js +11 -0
  381. package/dist/esm/descriptor/NamedDescriptor.d.ts +20 -0
  382. package/dist/esm/descriptor/NamedDescriptor.js +39 -0
  383. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  384. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
  385. package/dist/esm/descriptor/builder/builder.d.ts +13 -0
  386. package/dist/esm/descriptor/builder/builder.js +34 -0
  387. package/dist/esm/descriptor/builder/index.d.ts +3 -0
  388. package/dist/esm/descriptor/builder/index.js +3 -0
  389. package/dist/esm/descriptor/builder/parse.d.ts +5 -0
  390. package/dist/esm/descriptor/builder/parse.js +112 -0
  391. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  392. package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
  393. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
  394. package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
  395. package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
  396. package/dist/esm/descriptor/createWallet/index.js +3 -0
  397. package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
  398. package/dist/esm/descriptor/descriptorWallet.js +16 -0
  399. package/dist/esm/descriptor/index.d.ts +8 -0
  400. package/dist/esm/descriptor/index.js +7 -0
  401. package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
  402. package/dist/esm/descriptor/validatePolicy.js +80 -0
  403. package/dist/esm/impl/bch/bch.d.ts +20 -0
  404. package/dist/{src → esm}/impl/bch/bch.d.ts.map +1 -1
  405. package/dist/esm/impl/bch/bch.js +37 -0
  406. package/dist/esm/impl/bch/index.d.ts +3 -0
  407. package/dist/esm/impl/bch/index.js +3 -0
  408. package/dist/esm/impl/bch/tbch.d.ts +10 -0
  409. package/dist/esm/impl/bch/tbch.js +11 -0
  410. package/dist/esm/impl/bcha/bcha.d.ts +8 -0
  411. package/dist/{src → esm}/impl/bcha/bcha.d.ts.map +1 -1
  412. package/dist/esm/impl/bcha/bcha.js +11 -0
  413. package/dist/esm/impl/bcha/index.d.ts +3 -0
  414. package/dist/esm/impl/bcha/index.js +3 -0
  415. package/dist/esm/impl/bcha/tbcha.d.ts +10 -0
  416. package/dist/esm/impl/bcha/tbcha.js +11 -0
  417. package/dist/esm/impl/bsv/bsv.d.ts +8 -0
  418. package/dist/esm/impl/bsv/bsv.js +11 -0
  419. package/dist/esm/impl/bsv/index.d.ts +3 -0
  420. package/dist/esm/impl/bsv/index.js +3 -0
  421. package/dist/esm/impl/bsv/tbsv.d.ts +10 -0
  422. package/dist/esm/impl/bsv/tbsv.js +11 -0
  423. package/dist/esm/impl/btc/btc.d.ts +13 -0
  424. package/dist/esm/impl/btc/btc.js +18 -0
  425. package/dist/esm/impl/btc/index.d.ts +7 -0
  426. package/dist/esm/impl/btc/index.js +7 -0
  427. package/dist/esm/impl/btc/inscriptionBuilder.d.ts +51 -0
  428. package/dist/esm/impl/btc/inscriptionBuilder.js +143 -0
  429. package/dist/esm/impl/btc/tbtc.d.ts +10 -0
  430. package/dist/esm/impl/btc/tbtc.js +11 -0
  431. package/dist/esm/impl/btc/tbtc4.d.ts +10 -0
  432. package/dist/esm/impl/btc/tbtc4.js +11 -0
  433. package/dist/esm/impl/btc/tbtcbgsig.d.ts +10 -0
  434. package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
  435. package/dist/esm/impl/btc/tbtcsig.d.ts +10 -0
  436. package/dist/esm/impl/btc/tbtcsig.js +11 -0
  437. package/dist/esm/impl/btg/btg.d.ts +7 -0
  438. package/dist/esm/impl/btg/btg.js +11 -0
  439. package/dist/esm/impl/btg/index.d.ts +2 -0
  440. package/dist/esm/impl/btg/index.js +2 -0
  441. package/dist/esm/impl/dash/dash.d.ts +7 -0
  442. package/dist/esm/impl/dash/dash.js +11 -0
  443. package/dist/esm/impl/dash/index.d.ts +3 -0
  444. package/dist/esm/impl/dash/index.js +3 -0
  445. package/dist/esm/impl/dash/tdash.d.ts +10 -0
  446. package/dist/esm/impl/dash/tdash.js +11 -0
  447. package/dist/esm/impl/doge/doge.d.ts +32 -0
  448. package/dist/esm/impl/doge/doge.d.ts.map +1 -0
  449. package/dist/esm/impl/doge/doge.js +75 -0
  450. package/dist/esm/impl/doge/index.d.ts +3 -0
  451. package/dist/esm/impl/doge/index.js +3 -0
  452. package/dist/esm/impl/doge/tdoge.d.ts +10 -0
  453. package/dist/esm/impl/doge/tdoge.js +11 -0
  454. package/dist/esm/impl/index.d.ts +10 -0
  455. package/dist/esm/impl/index.js +10 -0
  456. package/dist/esm/impl/ltc/index.d.ts +3 -0
  457. package/dist/esm/impl/ltc/index.js +3 -0
  458. package/dist/esm/impl/ltc/ltc.d.ts +7 -0
  459. package/dist/esm/impl/ltc/ltc.js +15 -0
  460. package/dist/esm/impl/ltc/tltc.d.ts +7 -0
  461. package/dist/esm/impl/ltc/tltc.js +14 -0
  462. package/dist/esm/impl/zec/index.d.ts +3 -0
  463. package/dist/esm/impl/zec/index.js +3 -0
  464. package/dist/esm/impl/zec/tzec.d.ts +7 -0
  465. package/dist/esm/impl/zec/tzec.js +11 -0
  466. package/dist/esm/impl/zec/zec.d.ts +10 -0
  467. package/dist/esm/impl/zec/zec.js +11 -0
  468. package/dist/esm/index.d.ts +21 -0
  469. package/dist/esm/index.js +21 -0
  470. package/dist/esm/keychains.d.ts +52 -0
  471. package/dist/esm/keychains.d.ts.map +1 -0
  472. package/dist/esm/keychains.js +92 -0
  473. package/dist/esm/names.d.ts +26 -0
  474. package/dist/esm/names.js +171 -0
  475. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +8 -0
  476. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +23 -0
  477. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
  478. package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
  479. package/dist/esm/offlineVault/TransactionExplanation.d.ts +15 -0
  480. package/dist/esm/offlineVault/TransactionExplanation.js +13 -0
  481. package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
  482. package/dist/esm/offlineVault/descriptor/index.js +2 -0
  483. package/dist/esm/offlineVault/descriptor/transaction.d.ts +38 -0
  484. package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
  485. package/dist/esm/offlineVault/index.d.ts +6 -0
  486. package/dist/esm/offlineVault/index.js +4 -0
  487. package/dist/esm/recovery/RecoveryProvider.d.ts +22 -0
  488. package/dist/{src → esm}/recovery/RecoveryProvider.js +6 -9
  489. package/dist/esm/recovery/backupKeyRecovery.d.ts +88 -0
  490. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -0
  491. package/dist/esm/recovery/backupKeyRecovery.js +336 -0
  492. package/dist/esm/recovery/baseApi.d.ts +24 -0
  493. package/dist/esm/recovery/baseApi.js +64 -0
  494. package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
  495. package/dist/esm/recovery/coingeckoApi.js +40 -0
  496. package/dist/esm/recovery/crossChainRecovery.d.ts +86 -0
  497. package/dist/esm/recovery/crossChainRecovery.js +325 -0
  498. package/dist/esm/recovery/index.d.ts +7 -0
  499. package/dist/esm/recovery/index.js +7 -0
  500. package/dist/esm/recovery/mempoolApi.d.ts +7 -0
  501. package/dist/esm/recovery/mempoolApi.js +29 -0
  502. package/dist/esm/replayProtection.d.ts +5 -0
  503. package/dist/esm/replayProtection.d.ts.map +1 -0
  504. package/dist/esm/replayProtection.js +20 -0
  505. package/dist/esm/sign.d.ts +54 -0
  506. package/dist/esm/sign.js +162 -0
  507. package/dist/esm/transaction/bip322.d.ts +27 -0
  508. package/dist/esm/transaction/bip322.js +86 -0
  509. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
  510. package/dist/{src → esm}/transaction/common/verifyPayGoAmount.js +0 -2
  511. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
  512. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  513. package/dist/esm/transaction/descriptor/explainPsbt.js +44 -0
  514. package/dist/esm/transaction/descriptor/index.d.ts +7 -0
  515. package/dist/esm/transaction/descriptor/index.js +6 -0
  516. package/dist/esm/transaction/descriptor/parse.d.ts +16 -0
  517. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
  518. package/dist/esm/transaction/descriptor/parse.js +79 -0
  519. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +14 -0
  520. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  521. package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
  522. package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
  523. package/dist/{src → esm}/transaction/descriptor/recipient.js +1 -2
  524. package/dist/esm/transaction/descriptor/signPsbt.d.ts +25 -0
  525. package/dist/esm/transaction/descriptor/signPsbt.js +38 -0
  526. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +36 -0
  527. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  528. package/dist/esm/transaction/descriptor/verifyTransaction.js +65 -0
  529. package/dist/esm/transaction/explainTransaction.d.ts +18 -0
  530. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
  531. package/dist/esm/transaction/explainTransaction.js +52 -0
  532. package/dist/esm/transaction/fetchInputs.d.ts +26 -0
  533. package/dist/esm/transaction/fetchInputs.js +72 -0
  534. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +11 -0
  535. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  536. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +64 -0
  537. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +73 -0
  538. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  539. package/dist/esm/transaction/fixedScript/explainTransaction.js +307 -0
  540. package/dist/esm/transaction/fixedScript/index.d.ts +7 -0
  541. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
  542. package/dist/esm/transaction/fixedScript/index.js +6 -0
  543. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +28 -0
  544. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  545. package/dist/esm/transaction/fixedScript/parseOutput.js +213 -0
  546. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +8 -0
  547. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  548. package/dist/esm/transaction/fixedScript/parseTransaction.js +176 -0
  549. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +18 -0
  550. package/dist/esm/transaction/fixedScript/signTransaction.js +95 -0
  551. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  552. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  553. package/dist/esm/transaction/fixedScript/verifyTransaction.js +159 -0
  554. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  555. package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
  556. package/dist/esm/transaction/index.d.ts +8 -0
  557. package/dist/esm/transaction/index.d.ts.map +1 -0
  558. package/dist/esm/transaction/index.js +8 -0
  559. package/dist/esm/transaction/outputDifference.d.ts +40 -0
  560. package/dist/esm/transaction/outputDifference.js +42 -0
  561. package/dist/esm/transaction/parseTransaction.d.ts +4 -0
  562. package/dist/esm/transaction/parseTransaction.d.ts.map +1 -0
  563. package/dist/esm/transaction/parseTransaction.js +12 -0
  564. package/dist/esm/transaction/recipient.d.ts +29 -0
  565. package/dist/{src → esm}/transaction/recipient.d.ts.map +1 -1
  566. package/dist/esm/transaction/recipient.js +48 -0
  567. package/dist/esm/transaction/signTransaction.d.ts +6 -0
  568. package/dist/esm/transaction/signTransaction.js +63 -0
  569. package/dist/esm/transaction/types.d.ts +44 -0
  570. package/dist/esm/transaction/types.d.ts.map +1 -0
  571. package/dist/esm/transaction/types.js +2 -0
  572. package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
  573. package/dist/esm/transaction/verifyTransaction.js +14 -0
  574. package/dist/esm/verifyKey.d.ts +29 -0
  575. package/dist/esm/verifyKey.d.ts.map +1 -0
  576. package/dist/esm/verifyKey.js +123 -0
  577. package/dist/esm/wallet.d.ts +15 -0
  578. package/dist/esm/wallet.js +5 -0
  579. package/package.json +32 -15
  580. package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
  581. package/dist/src/abstractUtxoCoin.js +0 -634
  582. package/dist/src/address/fixedScript.d.ts.map +0 -1
  583. package/dist/src/address/fixedScript.js +0 -150
  584. package/dist/src/config.js +0 -14
  585. package/dist/src/descriptor/NamedDescriptor.js +0 -79
  586. package/dist/src/descriptor/assertDescriptorWalletAddress.js +0 -66
  587. package/dist/src/descriptor/builder/builder.js +0 -37
  588. package/dist/src/descriptor/builder/parse.js +0 -116
  589. package/dist/src/descriptor/createWallet/createDescriptorWallet.js +0 -41
  590. package/dist/src/descriptor/createWallet/createDescriptors.js +0 -33
  591. package/dist/src/descriptor/descriptorWallet.js +0 -54
  592. package/dist/src/descriptor/validatePolicy.js +0 -92
  593. package/dist/src/impl/bch/bch.js +0 -70
  594. package/dist/src/impl/bcha/bcha.js +0 -58
  595. package/dist/src/impl/btc/inscriptionBuilder.js +0 -183
  596. package/dist/src/impl/doge/doge.d.ts.map +0 -1
  597. package/dist/src/impl/doge/doge.js +0 -79
  598. package/dist/src/keychains.d.ts.map +0 -1
  599. package/dist/src/keychains.js +0 -104
  600. package/dist/src/names.js +0 -214
  601. package/dist/src/offlineVault/OfflineVaultHalfSigned.js +0 -26
  602. package/dist/src/offlineVault/OfflineVaultSignable.js +0 -55
  603. package/dist/src/offlineVault/TransactionExplanation.js +0 -16
  604. package/dist/src/offlineVault/descriptor/transaction.js +0 -80
  605. package/dist/src/recovery/backupKeyRecovery.d.ts.map +0 -1
  606. package/dist/src/recovery/backupKeyRecovery.js +0 -370
  607. package/dist/src/recovery/baseApi.js +0 -73
  608. package/dist/src/recovery/coingeckoApi.js +0 -44
  609. package/dist/src/recovery/crossChainRecovery.js +0 -364
  610. package/dist/src/recovery/mempoolApi.js +0 -36
  611. package/dist/src/replayProtection.d.ts.map +0 -1
  612. package/dist/src/replayProtection.js +0 -53
  613. package/dist/src/sign.js +0 -205
  614. package/dist/src/transaction/bip322.js +0 -125
  615. package/dist/src/transaction/descriptor/explainPsbt.d.ts.map +0 -1
  616. package/dist/src/transaction/descriptor/explainPsbt.js +0 -80
  617. package/dist/src/transaction/descriptor/parse.d.ts.map +0 -1
  618. package/dist/src/transaction/descriptor/parse.js +0 -116
  619. package/dist/src/transaction/descriptor/parseToAmountType.d.ts.map +0 -1
  620. package/dist/src/transaction/descriptor/parseToAmountType.js +0 -60
  621. package/dist/src/transaction/descriptor/signPsbt.js +0 -43
  622. package/dist/src/transaction/descriptor/verifyTransaction.d.ts.map +0 -1
  623. package/dist/src/transaction/descriptor/verifyTransaction.js +0 -108
  624. package/dist/src/transaction/explainTransaction.d.ts.map +0 -1
  625. package/dist/src/transaction/explainTransaction.js +0 -67
  626. package/dist/src/transaction/fetchInputs.js +0 -109
  627. package/dist/src/transaction/fixedScript/explainTransaction.d.ts +0 -29
  628. package/dist/src/transaction/fixedScript/explainTransaction.d.ts.map +0 -1
  629. package/dist/src/transaction/fixedScript/explainTransaction.js +0 -321
  630. package/dist/src/transaction/fixedScript/index.d.ts.map +0 -1
  631. package/dist/src/transaction/fixedScript/parseOutput.d.ts.map +0 -1
  632. package/dist/src/transaction/fixedScript/parseOutput.js +0 -213
  633. package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +0 -1
  634. package/dist/src/transaction/fixedScript/parseTransaction.js +0 -203
  635. package/dist/src/transaction/fixedScript/signTransaction.js +0 -101
  636. package/dist/src/transaction/fixedScript/verifyTransaction.d.ts.map +0 -1
  637. package/dist/src/transaction/fixedScript/verifyTransaction.js +0 -198
  638. package/dist/src/transaction/index.d.ts.map +0 -1
  639. package/dist/src/transaction/outputDifference.js +0 -47
  640. package/dist/src/transaction/parseTransaction.d.ts.map +0 -1
  641. package/dist/src/transaction/recipient.js +0 -88
  642. package/dist/src/transaction/signTransaction.js +0 -102
  643. package/dist/src/verifyKey.d.ts.map +0 -1
  644. package/dist/src/verifyKey.js +0 -164
  645. package/dist/src/wallet.js +0 -8
  646. /package/dist/{src → cjs/src}/address/index.d.ts +0 -0
  647. /package/dist/{src → cjs/src}/config.d.ts +0 -0
  648. /package/dist/{src → cjs/src}/descriptor/NamedDescriptor.d.ts +0 -0
  649. /package/dist/{src → cjs/src}/descriptor/assertDescriptorWalletAddress.d.ts +0 -0
  650. /package/dist/{src → cjs/src}/descriptor/builder/builder.d.ts +0 -0
  651. /package/dist/{src → cjs/src}/descriptor/builder/index.d.ts +0 -0
  652. /package/dist/{src → cjs/src}/descriptor/builder/parse.d.ts +0 -0
  653. /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptorWallet.d.ts +0 -0
  654. /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptors.d.ts +0 -0
  655. /package/dist/{src → cjs/src}/descriptor/createWallet/index.d.ts +0 -0
  656. /package/dist/{src → cjs/src}/descriptor/descriptorWallet.d.ts +0 -0
  657. /package/dist/{src → cjs/src}/descriptor/index.d.ts +0 -0
  658. /package/dist/{src → cjs/src}/descriptor/validatePolicy.d.ts +0 -0
  659. /package/dist/{src → cjs/src}/impl/bch/bch.d.ts +0 -0
  660. /package/dist/{src → cjs/src}/impl/bch/index.d.ts +0 -0
  661. /package/dist/{src → cjs/src}/impl/bch/tbch.d.ts +0 -0
  662. /package/dist/{src → cjs/src}/impl/bcha/index.d.ts +0 -0
  663. /package/dist/{src → cjs/src}/impl/bcha/tbcha.d.ts +0 -0
  664. /package/dist/{src → cjs/src}/impl/bsv/bsv.d.ts +0 -0
  665. /package/dist/{src → cjs/src}/impl/bsv/index.d.ts +0 -0
  666. /package/dist/{src → cjs/src}/impl/bsv/tbsv.d.ts +0 -0
  667. /package/dist/{src → cjs/src}/impl/btc/btc.d.ts +0 -0
  668. /package/dist/{src → cjs/src}/impl/btc/index.d.ts +0 -0
  669. /package/dist/{src → cjs/src}/impl/btc/inscriptionBuilder.d.ts +0 -0
  670. /package/dist/{src → cjs/src}/impl/btc/tbtc.d.ts +0 -0
  671. /package/dist/{src → cjs/src}/impl/btc/tbtc4.d.ts +0 -0
  672. /package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.d.ts +0 -0
  673. /package/dist/{src → cjs/src}/impl/btc/tbtcsig.d.ts +0 -0
  674. /package/dist/{src → cjs/src}/impl/btg/btg.d.ts +0 -0
  675. /package/dist/{src → cjs/src}/impl/btg/index.d.ts +0 -0
  676. /package/dist/{src → cjs/src}/impl/dash/dash.d.ts +0 -0
  677. /package/dist/{src → cjs/src}/impl/dash/index.d.ts +0 -0
  678. /package/dist/{src → cjs/src}/impl/dash/tdash.d.ts +0 -0
  679. /package/dist/{src → cjs/src}/impl/doge/index.d.ts +0 -0
  680. /package/dist/{src → cjs/src}/impl/doge/tdoge.d.ts +0 -0
  681. /package/dist/{src → cjs/src}/impl/index.d.ts +0 -0
  682. /package/dist/{src → cjs/src}/impl/ltc/index.d.ts +0 -0
  683. /package/dist/{src → cjs/src}/impl/ltc/ltc.d.ts +0 -0
  684. /package/dist/{src → cjs/src}/impl/ltc/tltc.d.ts +0 -0
  685. /package/dist/{src → cjs/src}/impl/zec/index.d.ts +0 -0
  686. /package/dist/{src → cjs/src}/impl/zec/tzec.d.ts +0 -0
  687. /package/dist/{src → cjs/src}/impl/zec/zec.d.ts +0 -0
  688. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  689. /package/dist/{src → cjs/src}/names.d.ts +0 -0
  690. /package/dist/{src → cjs/src}/offlineVault/OfflineVaultHalfSigned.d.ts +0 -0
  691. /package/dist/{src → cjs/src}/offlineVault/OfflineVaultSignable.d.ts +0 -0
  692. /package/dist/{src → cjs/src}/offlineVault/TransactionExplanation.d.ts +0 -0
  693. /package/dist/{src → cjs/src}/offlineVault/descriptor/index.d.ts +0 -0
  694. /package/dist/{src → cjs/src}/offlineVault/descriptor/transaction.d.ts +0 -0
  695. /package/dist/{src → cjs/src}/offlineVault/index.d.ts +0 -0
  696. /package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +0 -0
  697. /package/dist/{src → cjs/src}/recovery/backupKeyRecovery.d.ts +0 -0
  698. /package/dist/{src → cjs/src}/recovery/baseApi.d.ts +0 -0
  699. /package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -0
  700. /package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +0 -0
  701. /package/dist/{src → cjs/src}/recovery/index.d.ts +0 -0
  702. /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
  703. /package/dist/{src → cjs/src}/sign.d.ts +0 -0
  704. /package/dist/{src → cjs/src}/transaction/bip322.d.ts +0 -0
  705. /package/dist/{src → cjs/src}/transaction/common/verifyPayGoAmount.d.ts +0 -0
  706. /package/dist/{src → cjs/src}/transaction/descriptor/index.d.ts +0 -0
  707. /package/dist/{src → cjs/src}/transaction/descriptor/recipient.d.ts +0 -0
  708. /package/dist/{src → cjs/src}/transaction/descriptor/signPsbt.d.ts +0 -0
  709. /package/dist/{src → cjs/src}/transaction/fetchInputs.d.ts +0 -0
  710. /package/dist/{src → cjs/src}/transaction/fixedScript/signTransaction.d.ts +0 -0
  711. /package/dist/{src → cjs/src}/transaction/fixedScript/verifyTransaction.d.ts +0 -0
  712. /package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.d.ts +0 -0
  713. /package/dist/{src → cjs/src}/transaction/outputDifference.d.ts +0 -0
  714. /package/dist/{src → cjs/src}/transaction/recipient.d.ts +0 -0
  715. /package/dist/{src → cjs/src}/transaction/signTransaction.d.ts +0 -0
  716. /package/dist/{src → cjs/src}/transaction/verifyTransaction.d.ts +0 -0
  717. /package/dist/{src → cjs/src}/wallet.d.ts +0 -0
  718. /package/dist/{src → esm}/address/index.d.ts.map +0 -0
  719. /package/dist/{src → esm}/config.d.ts.map +0 -0
  720. /package/dist/{src → esm}/descriptor/NamedDescriptor.d.ts.map +0 -0
  721. /package/dist/{src → esm}/descriptor/assertDescriptorWalletAddress.d.ts.map +0 -0
  722. /package/dist/{src → esm}/descriptor/builder/builder.d.ts.map +0 -0
  723. /package/dist/{src → esm}/descriptor/builder/index.d.ts.map +0 -0
  724. /package/dist/{src → esm}/descriptor/builder/parse.d.ts.map +0 -0
  725. /package/dist/{src → esm}/descriptor/createWallet/createDescriptorWallet.d.ts.map +0 -0
  726. /package/dist/{src → esm}/descriptor/createWallet/createDescriptors.d.ts.map +0 -0
  727. /package/dist/{src → esm}/descriptor/createWallet/index.d.ts.map +0 -0
  728. /package/dist/{src → esm}/descriptor/descriptorWallet.d.ts.map +0 -0
  729. /package/dist/{src → esm}/descriptor/index.d.ts.map +0 -0
  730. /package/dist/{src → esm}/descriptor/validatePolicy.d.ts.map +0 -0
  731. /package/dist/{src → esm}/impl/bch/index.d.ts.map +0 -0
  732. /package/dist/{src → esm}/impl/bch/tbch.d.ts.map +0 -0
  733. /package/dist/{src → esm}/impl/bcha/index.d.ts.map +0 -0
  734. /package/dist/{src → esm}/impl/bcha/tbcha.d.ts.map +0 -0
  735. /package/dist/{src → esm}/impl/bsv/bsv.d.ts.map +0 -0
  736. /package/dist/{src → esm}/impl/bsv/index.d.ts.map +0 -0
  737. /package/dist/{src → esm}/impl/bsv/tbsv.d.ts.map +0 -0
  738. /package/dist/{src → esm}/impl/btc/btc.d.ts.map +0 -0
  739. /package/dist/{src → esm}/impl/btc/index.d.ts.map +0 -0
  740. /package/dist/{src → esm}/impl/btc/inscriptionBuilder.d.ts.map +0 -0
  741. /package/dist/{src → esm}/impl/btc/tbtc.d.ts.map +0 -0
  742. /package/dist/{src → esm}/impl/btc/tbtc4.d.ts.map +0 -0
  743. /package/dist/{src → esm}/impl/btc/tbtcbgsig.d.ts.map +0 -0
  744. /package/dist/{src → esm}/impl/btc/tbtcsig.d.ts.map +0 -0
  745. /package/dist/{src → esm}/impl/btg/btg.d.ts.map +0 -0
  746. /package/dist/{src → esm}/impl/btg/index.d.ts.map +0 -0
  747. /package/dist/{src → esm}/impl/dash/dash.d.ts.map +0 -0
  748. /package/dist/{src → esm}/impl/dash/index.d.ts.map +0 -0
  749. /package/dist/{src → esm}/impl/dash/tdash.d.ts.map +0 -0
  750. /package/dist/{src → esm}/impl/doge/index.d.ts.map +0 -0
  751. /package/dist/{src → esm}/impl/doge/tdoge.d.ts.map +0 -0
  752. /package/dist/{src → esm}/impl/index.d.ts.map +0 -0
  753. /package/dist/{src → esm}/impl/ltc/index.d.ts.map +0 -0
  754. /package/dist/{src → esm}/impl/ltc/ltc.d.ts.map +0 -0
  755. /package/dist/{src → esm}/impl/ltc/tltc.d.ts.map +0 -0
  756. /package/dist/{src → esm}/impl/zec/index.d.ts.map +0 -0
  757. /package/dist/{src → esm}/impl/zec/tzec.d.ts.map +0 -0
  758. /package/dist/{src → esm}/impl/zec/zec.d.ts.map +0 -0
  759. /package/dist/{src → esm}/index.d.ts.map +0 -0
  760. /package/dist/{src → esm}/names.d.ts.map +0 -0
  761. /package/dist/{src → esm}/offlineVault/OfflineVaultHalfSigned.d.ts.map +0 -0
  762. /package/dist/{src → esm}/offlineVault/OfflineVaultSignable.d.ts.map +0 -0
  763. /package/dist/{src → esm}/offlineVault/TransactionExplanation.d.ts.map +0 -0
  764. /package/dist/{src → esm}/offlineVault/descriptor/index.d.ts.map +0 -0
  765. /package/dist/{src → esm}/offlineVault/descriptor/transaction.d.ts.map +0 -0
  766. /package/dist/{src → esm}/offlineVault/index.d.ts.map +0 -0
  767. /package/dist/{src → esm}/recovery/RecoveryProvider.d.ts.map +0 -0
  768. /package/dist/{src → esm}/recovery/baseApi.d.ts.map +0 -0
  769. /package/dist/{src → esm}/recovery/coingeckoApi.d.ts.map +0 -0
  770. /package/dist/{src → esm}/recovery/crossChainRecovery.d.ts.map +0 -0
  771. /package/dist/{src → esm}/recovery/index.d.ts.map +0 -0
  772. /package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +0 -0
  773. /package/dist/{src → esm}/sign.d.ts.map +0 -0
  774. /package/dist/{src → esm}/transaction/bip322.d.ts.map +0 -0
  775. /package/dist/{src → esm}/transaction/common/verifyPayGoAmount.d.ts.map +0 -0
  776. /package/dist/{src → esm}/transaction/descriptor/index.d.ts.map +0 -0
  777. /package/dist/{src → esm}/transaction/descriptor/recipient.d.ts.map +0 -0
  778. /package/dist/{src → esm}/transaction/descriptor/signPsbt.d.ts.map +0 -0
  779. /package/dist/{src → esm}/transaction/fetchInputs.d.ts.map +0 -0
  780. /package/dist/{src → esm}/transaction/fixedScript/signTransaction.d.ts.map +0 -0
  781. /package/dist/{src → esm}/transaction/getPayGoVerificationPubkey.d.ts.map +0 -0
  782. /package/dist/{src → esm}/transaction/outputDifference.d.ts.map +0 -0
  783. /package/dist/{src → esm}/transaction/signTransaction.d.ts.map +0 -0
  784. /package/dist/{src → esm}/transaction/verifyTransaction.d.ts.map +0 -0
  785. /package/dist/{src → esm}/wallet.d.ts.map +0 -0
@@ -1,634 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.AbstractUtxoCoin = void 0;
40
- exports.isWalletOutput = isWalletOutput;
41
- const assert_1 = __importDefault(require("assert"));
42
- const crypto_1 = require("crypto");
43
- const lodash_1 = __importDefault(require("lodash"));
44
- const utxolib = __importStar(require("@bitgo/utxo-lib"));
45
- const secp256k1_1 = require("@bitgo/secp256k1");
46
- const utxo_lib_1 = require("@bitgo/utxo-lib");
47
- const sdk_core_1 = require("@bitgo/sdk-core");
48
- const recovery_1 = require("./recovery");
49
- const replayProtection_1 = require("./replayProtection");
50
- const config_1 = require("./config");
51
- const transaction_1 = require("./transaction");
52
- const verifyTransaction_1 = require("./transaction/descriptor/verifyTransaction");
53
- const descriptor_1 = require("./descriptor");
54
- const names_1 = require("./names");
55
- const fixedScript_1 = require("./address/fixedScript");
56
- const keychains_1 = require("./keychains");
57
- const verifyKey_1 = require("./verifyKey");
58
- const validatePolicy_1 = require("./descriptor/validatePolicy");
59
- const signTransaction_1 = require("./transaction/signTransaction");
60
- const wallet_1 = require("./wallet");
61
- const descriptorWallet_1 = require("./descriptor/descriptorWallet");
62
- const { isChainCode, scriptTypeForChain, outputScripts } = utxo_lib_1.bitgo;
63
- /**
64
- * Convert ValidationError to TxIntentMismatchRecipientError with structured data
65
- *
66
- * This preserves the structured error information from the original ValidationError
67
- * by extracting the mismatched outputs and converting them to the standardized format.
68
- * The original error is preserved as the `cause` for debugging purposes.
69
- */
70
- function convertValidationErrorToTxIntentMismatch(error, reqId, txParams, txHex) {
71
- const mismatchedRecipients = [];
72
- for (const err of error.errors) {
73
- if (err instanceof verifyTransaction_1.ErrorMissingOutputs) {
74
- mismatchedRecipients.push(...err.missingOutputs.map((output) => ({
75
- address: output.address,
76
- amount: output.amount.toString(),
77
- })));
78
- }
79
- else if (err instanceof verifyTransaction_1.ErrorImplicitExternalOutputs) {
80
- mismatchedRecipients.push(...err.implicitExternalOutputs.map((output) => ({
81
- address: output.address,
82
- amount: output.amount.toString(),
83
- })));
84
- }
85
- }
86
- const txIntentError = new sdk_core_1.TxIntentMismatchRecipientError(error.message, reqId, [txParams], txHex, mismatchedRecipients);
87
- // Preserve the original structured error as the cause for debugging
88
- // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
89
- txIntentError.cause = error;
90
- return txIntentError;
91
- }
92
- function isWalletOutput(output) {
93
- return (output.chain !== undefined && output.index !== undefined);
94
- }
95
- class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
96
- constructor(bitgo, network, amountType = 'number') {
97
- super(bitgo);
98
- if (!utxolib.isValidNetwork(network)) {
99
- throw new Error('invalid network: please make sure to use the same version of ' +
100
- '@bitgo/utxo-lib as this library when initializing an instance of this class');
101
- }
102
- this.amountType = amountType;
103
- this._network = network;
104
- }
105
- get network() {
106
- return this._network;
107
- }
108
- getChain() {
109
- return (0, names_1.getChainFromNetwork)(this.network);
110
- }
111
- getFamily() {
112
- return (0, names_1.getFamilyFromNetwork)(this.network);
113
- }
114
- getFullName() {
115
- return (0, names_1.getFullNameFromNetwork)(this.network);
116
- }
117
- /** Indicates whether the coin supports a block target */
118
- supportsBlockTarget() {
119
- // FIXME: the SDK does not seem to use this anywhere so it is unclear what the purpose of this method is
120
- switch ((0, utxo_lib_1.getMainnet)(this.network)) {
121
- case utxolib.networks.bitcoin:
122
- case utxolib.networks.dogecoin:
123
- return true;
124
- default:
125
- return false;
126
- }
127
- }
128
- sweepWithSendMany() {
129
- return true;
130
- }
131
- /** @deprecated */
132
- static get validAddressTypes() {
133
- return [...outputScripts.scriptTypes2Of3];
134
- }
135
- /**
136
- * Returns the factor between the base unit and its smallest subdivison
137
- * @return {number}
138
- */
139
- getBaseFactor() {
140
- return 1e8;
141
- }
142
- /**
143
- * Check if an address is valid
144
- * @param address
145
- * @param param
146
- */
147
- isValidAddress(address, param) {
148
- if (typeof param === 'boolean' && param) {
149
- throw new Error('deprecated');
150
- }
151
- // By default, allow all address formats.
152
- // At the time of writing, the only additional address format is bch cashaddr.
153
- const anyFormat = param?.anyFormat ?? true;
154
- try {
155
- // Find out if the address is valid for any format. Tries all supported formats by default.
156
- // Throws if address cannot be decoded with any format.
157
- const [format, script] = utxolib.addressFormat.toOutputScriptAndFormat(address, this.network);
158
- // unless anyFormat is set, only 'default' is allowed.
159
- if (!anyFormat && format !== 'default') {
160
- return false;
161
- }
162
- // make sure that address is in normal representation for given format.
163
- return address === utxolib.addressFormat.fromOutputScriptWithFormat(script, format, this.network);
164
- }
165
- catch (e) {
166
- return false;
167
- }
168
- }
169
- /**
170
- * Return boolean indicating whether input is valid public key for the coin.
171
- *
172
- * @param {String} pub the pub to be checked
173
- * @returns {Boolean} is it valid?
174
- */
175
- isValidPub(pub) {
176
- try {
177
- return secp256k1_1.bip32.fromBase58(pub).isNeutered();
178
- }
179
- catch (e) {
180
- return false;
181
- }
182
- }
183
- preprocessBuildParams(params) {
184
- if (params.recipients !== undefined) {
185
- params.recipients =
186
- params.recipients instanceof Array
187
- ? params?.recipients?.map((recipient) => {
188
- const { address, ...rest } = recipient;
189
- return { ...rest, ...(0, transaction_1.fromExtendedAddressFormat)(address) };
190
- })
191
- : params.recipients;
192
- }
193
- return params;
194
- }
195
- /**
196
- * Get the latest block height
197
- * @param reqId
198
- */
199
- async getLatestBlockHeight(reqId) {
200
- if (reqId) {
201
- this.bitgo.setRequestTracer(reqId);
202
- }
203
- const chainhead = await this.bitgo.get(this.url('/public/block/latest')).result();
204
- return chainhead.height;
205
- }
206
- checkRecipient(recipient) {
207
- (0, transaction_1.assertValidTransactionRecipient)(recipient);
208
- if (!(0, transaction_1.isScriptRecipient)(recipient.address)) {
209
- super.checkRecipient(recipient);
210
- }
211
- }
212
- /**
213
- * Run custom coin logic after a transaction prebuild has been received from BitGo
214
- * @param prebuild
215
- */
216
- async postProcessPrebuild(prebuild) {
217
- const tx = this.decodeTransactionFromPrebuild(prebuild);
218
- if (lodash_1.default.isUndefined(prebuild.blockHeight)) {
219
- prebuild.blockHeight = (await this.getLatestBlockHeight());
220
- }
221
- return lodash_1.default.extend({}, prebuild, { txHex: tx.toHex() });
222
- }
223
- /**
224
- * Determine an address' type based on its witness and redeem script presence
225
- * @param addressDetails
226
- */
227
- static inferAddressType(addressDetails) {
228
- return isChainCode(addressDetails.chain) ? scriptTypeForChain(addressDetails.chain) : null;
229
- }
230
- createTransactionFromHex(hex) {
231
- return utxolib.bitgo.createTransactionFromHex(hex, this.network, this.amountType);
232
- }
233
- decodeTransaction(input) {
234
- if (typeof input === 'string') {
235
- for (const format of ['hex', 'base64']) {
236
- const buffer = Buffer.from(input, format);
237
- const bufferToString = buffer.toString(format);
238
- if ((format === 'base64' && bufferToString === input) ||
239
- (format === 'hex' && bufferToString === input.toLowerCase())) {
240
- return this.decodeTransaction(buffer);
241
- }
242
- }
243
- throw new Error('input must be a valid hex or base64 string');
244
- }
245
- if (utxolib.bitgo.isPsbt(input)) {
246
- return utxolib.bitgo.createPsbtFromBuffer(input, this.network);
247
- }
248
- else {
249
- return utxolib.bitgo.createTransactionFromBuffer(input, this.network, {
250
- amountType: this.amountType,
251
- });
252
- }
253
- }
254
- decodeTransactionFromPrebuild(prebuild) {
255
- const string = prebuild.txHex ?? prebuild.txBase64;
256
- if (!string) {
257
- throw new Error('missing required txHex or txBase64 property');
258
- }
259
- return this.decodeTransaction(string);
260
- }
261
- toCanonicalTransactionRecipient(output) {
262
- const amount = BigInt(output.valueString);
263
- (0, transaction_1.assertValidTransactionRecipient)({ amount, address: output.address });
264
- if (!output.address) {
265
- return { amount };
266
- }
267
- return { amount, address: this.canonicalAddress(output.address) };
268
- }
269
- /**
270
- * Extract and fill transaction details such as internal/change spend, external spend (explicit vs. implicit), etc.
271
- * @param params
272
- * @returns {*}
273
- */
274
- async parseTransaction(params) {
275
- return (0, transaction_1.parseTransaction)(this, params);
276
- }
277
- /**
278
- * @deprecated - use function verifyUserPublicKey instead
279
- */
280
- verifyUserPublicKey(params) {
281
- return (0, verifyKey_1.verifyUserPublicKey)(this.bitgo, params);
282
- }
283
- /**
284
- * @deprecated - use function verifyKeySignature instead
285
- */
286
- verifyKeySignature(params) {
287
- return (0, verifyKey_1.verifyKeySignature)(params);
288
- }
289
- /**
290
- * Verify that a transaction prebuild complies with the original intention
291
- *
292
- * @param params
293
- * @param params.txParams params object passed to send
294
- * @param params.txPrebuild prebuild object returned by server
295
- * @param params.txPrebuild.txHex prebuilt transaction's txHex form
296
- * @param params.wallet Wallet object to obtain keys to verify against
297
- * @param params.verification Object specifying some verification parameters
298
- * @param params.verification.disableNetworking Disallow fetching any data from the internet for verification purposes
299
- * @param params.verification.keychains Pass keychains manually rather than fetching them by id
300
- * @param params.verification.addresses Address details to pass in for out-of-band verification
301
- * @returns {boolean} True if verification passes
302
- * @throws {TxIntentMismatchError} if transaction validation fails
303
- * @throws {TxIntentMismatchRecipientError} if transaction recipients don't match user intent
304
- */
305
- async verifyTransaction(params) {
306
- try {
307
- return await (0, transaction_1.verifyTransaction)(this, this.bitgo, params);
308
- }
309
- catch (error) {
310
- if (error instanceof verifyTransaction_1.AggregateValidationError) {
311
- throw convertValidationErrorToTxIntentMismatch(error, params.reqId, params.txParams, params.txPrebuild.txHex);
312
- }
313
- throw error;
314
- }
315
- }
316
- /**
317
- * Make sure an address is valid and throw an error if it's not.
318
- * @param params.address The address string on the network
319
- * @param params.addressType
320
- * @param params.keychains Keychain objects with xpubs
321
- * @param params.coinSpecific Coin-specific details for the address such as a witness script
322
- * @param params.chain Derivation chain
323
- * @param params.index Derivation index
324
- * @throws {InvalidAddressError}
325
- * @throws {InvalidAddressDerivationPropertyError}
326
- * @throws {UnexpectedAddressError}
327
- */
328
- async isWalletAddress(params, wallet) {
329
- const { address, keychains, chain, index } = params;
330
- if (!this.isValidAddress(address)) {
331
- throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}`);
332
- }
333
- if (wallet && (0, descriptor_1.isDescriptorWallet)(wallet)) {
334
- if (!keychains) {
335
- throw new Error('missing required param keychains');
336
- }
337
- if (!(0, sdk_core_1.isTriple)(keychains)) {
338
- throw new Error('keychains must be a triple');
339
- }
340
- (0, descriptor_1.assertDescriptorWalletAddress)(this.network, params, (0, descriptor_1.getDescriptorMapFromWallet)(wallet, (0, keychains_1.toBip32Triple)(keychains), (0, validatePolicy_1.getPolicyForEnv)(this.bitgo.env)));
341
- return true;
342
- }
343
- if ((lodash_1.default.isUndefined(chain) && lodash_1.default.isUndefined(index)) || !(lodash_1.default.isFinite(chain) && lodash_1.default.isFinite(index))) {
344
- throw new sdk_core_1.InvalidAddressDerivationPropertyError(`address validation failure: invalid chain (${chain}) or index (${index})`);
345
- }
346
- if (!keychains) {
347
- throw new Error('missing required param keychains');
348
- }
349
- (0, fixedScript_1.assertFixedScriptWalletAddress)(this.network, {
350
- address,
351
- keychains,
352
- format: params.format ?? 'base58',
353
- addressType: params.addressType,
354
- chain,
355
- index,
356
- });
357
- return true;
358
- }
359
- /**
360
- * @param addressType
361
- * @returns true iff coin supports spending from unspentType
362
- */
363
- supportsAddressType(addressType) {
364
- return utxolib.bitgo.outputScripts.isSupportedScriptType(this.network, addressType);
365
- }
366
- /** inherited doc */
367
- getDefaultMultisigType() {
368
- return sdk_core_1.multisigTypes.onchain;
369
- }
370
- /**
371
- * @param chain
372
- * @return true iff coin supports spending from chain
373
- */
374
- supportsAddressChain(chain) {
375
- return isChainCode(chain) && this.supportsAddressType(utxolib.bitgo.scriptTypeForChain(chain));
376
- }
377
- keyIdsForSigning() {
378
- return [sdk_core_1.KeyIndices.USER, sdk_core_1.KeyIndices.BACKUP, sdk_core_1.KeyIndices.BITGO];
379
- }
380
- /**
381
- * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs.
382
- * @param psbtHex all MuSig2 inputs should contain user MuSig2 nonce
383
- * @param walletId
384
- */
385
- async signPsbt(psbtHex, walletId) {
386
- const params = { psbt: psbtHex };
387
- return await this.bitgo
388
- .post(this.url('/wallet/' + walletId + '/tx/signpsbt'))
389
- .send(params)
390
- .result();
391
- }
392
- /**
393
- * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs from OVC.
394
- * @param ovcJson JSON object provided by OVC with fields psbtHex and walletId
395
- */
396
- async signPsbtFromOVC(ovcJson) {
397
- (0, assert_1.default)(ovcJson['psbtHex'], 'ovcJson must contain psbtHex');
398
- (0, assert_1.default)(ovcJson['walletId'], 'ovcJson must contain walletId');
399
- const psbt = (await this.signPsbt(ovcJson['psbtHex'], ovcJson['walletId'])).psbt;
400
- (0, assert_1.default)(psbt, 'psbt not found');
401
- return lodash_1.default.extend(ovcJson, { txHex: psbt });
402
- }
403
- /**
404
- * Assemble keychain and half-sign prebuilt transaction
405
- * @param params - {@see SignTransactionOptions}
406
- * @returns {Promise<SignedTransaction | HalfSignedUtxoTransaction>}
407
- */
408
- async signTransaction(params) {
409
- return (0, signTransaction_1.signTransaction)(this, this.bitgo, params);
410
- }
411
- /**
412
- * Sign a transaction with a custom signing function. Example use case is express external signer
413
- * @param customSigningFunction custom signing function that returns a single signed transaction
414
- * @param signTransactionParams parameters for custom signing function. Includes txPrebuild and pubs (for legacy tx only).
415
- *
416
- * @returns signed transaction as hex string
417
- */
418
- async signWithCustomSigningFunction(customSigningFunction, signTransactionParams) {
419
- const txHex = signTransactionParams.txPrebuild.txHex;
420
- (0, assert_1.default)(txHex, 'missing txHex parameter');
421
- const tx = this.decodeTransaction(txHex);
422
- const isTxWithKeyPathSpendInput = tx instanceof utxo_lib_1.bitgo.UtxoPsbt && utxo_lib_1.bitgo.isTransactionWithKeyPathSpendInput(tx);
423
- if (!isTxWithKeyPathSpendInput) {
424
- return await customSigningFunction({ ...signTransactionParams, coin: this });
425
- }
426
- const getTxHex = (v) => {
427
- if ('txHex' in v) {
428
- return v.txHex;
429
- }
430
- throw new Error('txHex not found in signTransaction result');
431
- };
432
- const signerNonceTx = await customSigningFunction({
433
- ...signTransactionParams,
434
- signingStep: 'signerNonce',
435
- coin: this,
436
- });
437
- const { pubs } = signTransactionParams;
438
- (0, assert_1.default)(pubs === undefined || (0, sdk_core_1.isTriple)(pubs));
439
- const cosignerNonceTx = await this.signTransaction({
440
- ...signTransactionParams,
441
- pubs,
442
- txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(signerNonceTx) },
443
- signingStep: 'cosignerNonce',
444
- });
445
- return await customSigningFunction({
446
- ...signTransactionParams,
447
- txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(cosignerNonceTx) },
448
- signingStep: 'signerSignature',
449
- coin: this,
450
- });
451
- }
452
- /**
453
- * @param unspent
454
- * @returns {boolean}
455
- */
456
- isBitGoTaintedUnspent(unspent) {
457
- return (0, replayProtection_1.isReplayProtectionUnspent)(unspent, this.network);
458
- }
459
- /**
460
- * Decompose a raw psbt/transaction into useful information, such as the total amounts,
461
- * change amounts, and transaction outputs.
462
- * @param params
463
- */
464
- async explainTransaction(params) {
465
- return (0, transaction_1.explainTx)(this.decodeTransactionFromPrebuild(params), params, this.network);
466
- }
467
- /**
468
- * Create a multisig address of a given type from a list of keychains and a signing threshold
469
- * @param addressType
470
- * @param signatureThreshold
471
- * @param keys
472
- */
473
- createMultiSigAddress(addressType, signatureThreshold, keys) {
474
- const { scriptPubKey: outputScript, redeemScript, witnessScript, } = utxolib.bitgo.outputScripts.createOutputScript2of3(keys, addressType);
475
- return {
476
- outputScript,
477
- redeemScript,
478
- witnessScript,
479
- address: utxolib.address.fromOutputScript(outputScript, this.network),
480
- };
481
- }
482
- /**
483
- * @deprecated - use {@see backupKeyRecovery}
484
- * Builds a funds recovery transaction without BitGo
485
- * @param params - {@see backupKeyRecovery}
486
- */
487
- async recover(params) {
488
- return (0, recovery_1.backupKeyRecovery)(this, this.bitgo, params);
489
- }
490
- async recoverV1(params) {
491
- return (0, recovery_1.v1BackupKeyRecovery)(this, this.bitgo, params);
492
- }
493
- async sweepV1(params) {
494
- return (0, recovery_1.v1Sweep)(this, this.bitgo, params);
495
- }
496
- /**
497
- * Recover coin that was sent to wrong chain
498
- * @param params
499
- * @param params.txid The txid of the faulty transaction
500
- * @param params.recoveryAddress address to send recovered funds to
501
- * @param params.wallet the wallet that received the funds
502
- * @param params.recoveryCoin the coin type of the wallet that received the funds
503
- * @param params.signed return a half-signed transaction (default=true)
504
- * @param params.walletPassphrase the wallet passphrase
505
- * @param params.xprv the unencrypted xprv (used instead of wallet passphrase)
506
- * @param params.apiKey for utxo coins other than [BTC,TBTC] this is a Block Chair api key
507
- * @returns {*}
508
- */
509
- async recoverFromWrongChain(params) {
510
- const { txid, recoveryAddress, wallet, walletPassphrase, xprv, apiKey } = params;
511
- // params.recoveryCoin used to be params.coin, backwards compatibility
512
- const recoveryCoin = params.coin || params.recoveryCoin;
513
- if (!recoveryCoin) {
514
- throw new Error('missing required object recoveryCoin');
515
- }
516
- // signed should default to true, and only be disabled if explicitly set to false (not undefined)
517
- const signed = params.signed !== false;
518
- const sourceCoinFamily = this.getFamily();
519
- const recoveryCoinFamily = recoveryCoin.getFamily();
520
- const supportedRecoveryCoins = config_1.supportedCrossChainRecoveries[sourceCoinFamily];
521
- if (lodash_1.default.isUndefined(supportedRecoveryCoins) || !supportedRecoveryCoins.includes(recoveryCoinFamily)) {
522
- throw new Error(`Recovery of ${sourceCoinFamily} balances from ${recoveryCoinFamily} wallets is not supported.`);
523
- }
524
- return await (0, recovery_1.recoverCrossChain)(this.bitgo, {
525
- sourceCoin: this,
526
- recoveryCoin,
527
- walletId: wallet,
528
- txid,
529
- recoveryAddress,
530
- walletPassphrase: signed ? walletPassphrase : undefined,
531
- xprv: signed ? xprv : undefined,
532
- apiKey,
533
- });
534
- }
535
- /**
536
- * Generate bip32 key pair
537
- *
538
- * @param seed
539
- * @returns {Object} object with generated pub and prv
540
- */
541
- generateKeyPair(seed) {
542
- if (!seed) {
543
- // An extended private key has both a normal 256 bit private key and a 256
544
- // bit chain code, both of which must be random. 512 bits is therefore the
545
- // maximum entropy and gives us maximum security against cracking.
546
- seed = (0, crypto_1.randomBytes)(512 / 8);
547
- }
548
- const extendedKey = secp256k1_1.bip32.fromSeed(seed);
549
- return {
550
- pub: extendedKey.neutered().toBase58(),
551
- prv: extendedKey.toBase58(),
552
- };
553
- }
554
- shouldDefaultToPsbtTxFormat(buildParams) {
555
- const walletFlagMusigKp = buildParams.wallet.flag('musigKp') === 'true';
556
- const isHotWallet = buildParams.wallet.type() === 'hot';
557
- // if not txFormat is already specified figure out if we should default to psbt format
558
- return (buildParams.txFormat === undefined &&
559
- (buildParams.wallet.subType() === 'distributedCustody' ||
560
- // default to testnet for all utxo coins except zcash
561
- ((0, utxo_lib_1.isTestnet)(this.network) &&
562
- // FIXME(BTC-1322): fix zcash PSBT support
563
- (0, utxo_lib_1.getMainnet)(this.network) !== utxolib.networks.zcash &&
564
- isHotWallet) ||
565
- // if mainnet, only default to psbt for btc hot wallets
566
- ((0, utxo_lib_1.isMainnet)(this.network) && (0, utxo_lib_1.getMainnet)(this.network) === utxolib.networks.bitcoin && isHotWallet) ||
567
- // default to psbt if it has the wallet flag
568
- walletFlagMusigKp));
569
- }
570
- async getExtraPrebuildParams(buildParams) {
571
- let txFormat = buildParams.txFormat;
572
- let changeAddressType = buildParams.changeAddressType;
573
- if (this.shouldDefaultToPsbtTxFormat(buildParams)) {
574
- txFormat = 'psbt';
575
- }
576
- // if the addressType is not specified, we need to default to p2trMusig2 for testnet hot wallets for staged rollout of p2trMusig2
577
- if (buildParams.addressType === undefined && // addressType is deprecated and replaced by `changeAddress`
578
- buildParams.changeAddressType === undefined &&
579
- buildParams.changeAddress === undefined &&
580
- buildParams.wallet.type() === 'hot') {
581
- changeAddressType = ['p2trMusig2', 'p2wsh', 'p2shP2wsh', 'p2sh', 'p2tr'];
582
- }
583
- return {
584
- txFormat,
585
- changeAddressType,
586
- };
587
- }
588
- preCreateBitGo(params) {
589
- return;
590
- }
591
- async presignTransaction(params) {
592
- if (params.walletData && (0, wallet_1.isUtxoWalletData)(params.walletData) && (0, descriptorWallet_1.isDescriptorWalletData)(params.walletData)) {
593
- return params;
594
- }
595
- // In the case that we have a 'psbt-lite' transaction format, we want to indicate in signing to not fail
596
- const txHex = (params.txHex ?? params.txPrebuild?.txHex);
597
- if (txHex &&
598
- utxolib.bitgo.isPsbt(txHex) &&
599
- utxolib.bitgo.isPsbtLite(utxolib.bitgo.createPsbtFromHex(txHex, this.network)) &&
600
- params.allowNonSegwitSigningWithoutPrevTx === undefined) {
601
- return { ...params, allowNonSegwitSigningWithoutPrevTx: true };
602
- }
603
- return params;
604
- }
605
- async supplementGenerateWallet(walletParams, keychains) {
606
- return walletParams;
607
- }
608
- transactionDataAllowed() {
609
- return false;
610
- }
611
- valuelessTransferAllowed() {
612
- return false;
613
- }
614
- getRecoveryProvider(apiToken) {
615
- return (0, recovery_1.forCoin)(this.getChain(), apiToken);
616
- }
617
- /** @inheritDoc */
618
- auditDecryptedKey({ multiSigType, publicKey, prv }) {
619
- if (multiSigType === 'tss') {
620
- throw new Error('tss auditing is not supported for this coin');
621
- }
622
- if (!(0, sdk_core_1.isValidPrv)(prv) && !(0, sdk_core_1.isValidXprv)(prv)) {
623
- throw new Error('invalid private key');
624
- }
625
- if (publicKey) {
626
- const genPubKey = secp256k1_1.bip32.fromBase58(prv).neutered().toBase58();
627
- if (genPubKey !== publicKey) {
628
- throw new Error('public key does not match private key');
629
- }
630
- }
631
- }
632
- }
633
- exports.AbstractUtxoCoin = AbstractUtxoCoin;
634
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9NQSx3Q0FJQztBQXhNRCxvREFBNEI7QUFDNUIsbUNBQXFDO0FBRXJDLG9EQUF1QjtBQUN2Qix5REFBMkM7QUFDM0MsZ0RBQXlDO0FBQ3pDLDhDQUEwRTtBQUMxRSw4Q0FvQ3lCO0FBRXpCLHlDQVlvQjtBQUNwQix5REFBK0Q7QUFDL0QscUNBQXlEO0FBQ3pELCtDQU91QjtBQUN2QixrRkFJb0Q7QUFDcEQsNkNBQTZHO0FBQzdHLG1DQUE0RjtBQUM1Rix1REFBdUU7QUFFdkUsMkNBQThFO0FBQzlFLDJDQUFzRTtBQUN0RSxnRUFBOEQ7QUFDOUQsbUVBQWdFO0FBQ2hFLHFDQUF3RDtBQUN4RCxvRUFBdUU7QUE2QnZFLE1BQU0sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLEdBQUcsZ0JBQUssQ0FBQztBQUlqRTs7Ozs7O0dBTUc7QUFDSCxTQUFTLHdDQUF3QyxDQUMvQyxLQUErQixFQUMvQixLQUEwQyxFQUMxQyxRQUErQixFQUMvQixLQUF5QjtJQUV6QixNQUFNLG9CQUFvQixHQUEwQixFQUFFLENBQUM7SUFFdkQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0IsSUFBSSxHQUFHLFlBQVksdUNBQW1CLEVBQUUsQ0FBQztZQUN2QyxvQkFBb0IsQ0FBQyxJQUFJLENBQ3ZCLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztnQkFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2FBQ2pDLENB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LElBQUEsc0JBQVcsRUFBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sU0FBUyxHQUFHLGlCQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF2cEJELDRDQXVwQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby9zZWNwMjU2azEnO1xuaW1wb3J0IHsgYml0Z28sIGdldE1haW5uZXQsIGlzTWFpbm5ldCwgaXNUZXN0bmV0IH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7XG4gIEFkZHJlc3NDb2luU3BlY2lmaWMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIENyZWF0ZUFkZHJlc3NGb3JtYXQsXG4gIEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zLFxuICBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICBJQmFzZUNvaW4sXG4gIEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBpc1RyaXBsZSxcbiAgSVRyYW5zYWN0aW9uRXhwbGFuYXRpb24gYXMgQmFzZVRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIElXYWxsZXQsXG4gIEtleWNoYWluc1RyaXBsZXQsXG4gIEtleUluZGljZXMsXG4gIE1pc21hdGNoZWRSZWNpcGllbnQsXG4gIE11bHRpc2lnVHlwZSxcbiAgbXVsdGlzaWdUeXBlcyxcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVjcmVhdGVCaXRHb09wdGlvbnMsXG4gIFByZXNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICBUcmFuc2FjdGlvblBhcmFtcyBhcyBCYXNlVHJhbnNhY3Rpb25QYXJhbXMsXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQgYXMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFRyaXBsZSxcbiAgVHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yLFxuICBWZXJpZmljYXRpb25PcHRpb25zLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyBhcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXQsXG4gIGlzVmFsaWRQcnYsXG4gIGlzVmFsaWRYcHJ2LFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQge1xuICBiYWNrdXBLZXlSZWNvdmVyeSxcbiAgQ3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkLFxuICBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZCxcbiAgZm9yQ29pbixcbiAgcmVjb3ZlckNyb3NzQ2hhaW4sXG4gIFJlY292ZXJQYXJhbXMsXG4gIFJlY292ZXJ5UHJvdmlkZXIsXG4gIHYxQmFja3VwS2V5UmVjb3ZlcnksXG4gIFYxUmVjb3ZlclBhcmFtcyxcbiAgdjFTd2VlcCxcbiAgVjFTd2VlcFBhcmFtcyxcbn0gZnJvbSAnLi9yZWNvdmVyeSc7XG5pbXBvcnQgeyBpc1JlcGxheVByb3RlY3Rpb25VbnNwZW50IH0gZnJvbSAnLi9yZXBsYXlQcm90ZWN0aW9uJztcbmltcG9ydCB7IHN1cHBvcnRlZENyb3NzQ2hhaW5SZWNvdmVyaWVzIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0VmFsaWRUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgZXhwbGFpblR4LFxuICBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0LFxuICBpc1NjcmlwdFJlY2lwaWVudCxcbiAgcGFyc2VUcmFuc2FjdGlvbixcbiAgdmVyaWZ5VHJhbnNhY3Rpb24sXG59IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgQWdncmVnYXRlVmFsaWRhdGlvbkVycm9yLFxuICBFcnJvck1pc3NpbmdPdXRwdXRzLFxuICBFcnJvckltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzLFxufSBmcm9tICcuL3RyYW5zYWN0aW9uL2Rlc2NyaXB0b3IvdmVyaWZ5VHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgYXNzZXJ0RGVzY3JpcHRvcldhbGxldEFkZHJlc3MsIGdldERlc2NyaXB0b3JNYXBGcm9tV2FsbGV0LCBpc0Rlc2NyaXB0b3JXYWxsZXQgfSBmcm9tICcuL2Rlc2NyaXB0b3InO1xuaW1wb3J0IHsgZ2V0Q2hhaW5Gcm9tTmV0d29yaywgZ2V0RmFtaWx5RnJvbU5ldHdvcmssIGdldEZ1bGxOYW1lRnJvbU5ldHdvcmsgfSBmcm9tICcuL25hbWVzJztcbmltcG9ydCB7IGFzc2VydEZpeGVkU2NyaXB0V2FsbGV0QWRkcmVzcyB9IGZyb20gJy4vYWRkcmVzcy9maXhlZFNjcmlwdCc7XG5pbXBvcnQgeyBDdXN0b21DaGFuZ2VPcHRpb25zIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9maXhlZFNjcmlwdCc7XG5pbXBvcnQgeyB0b0JpcDMyVHJpcGxlLCBVdHhvS2V5Y2hhaW4sIFV0eG9OYW1lZEtleWNoYWlucyB9IGZyb20gJy4va2V5Y2hhaW5zJztcbmltcG9ydCB7IHZlcmlmeUtleVNpZ25hdHVyZSwgdmVyaWZ5VXNlclB1YmxpY0tleSB9IGZyb20gJy4vdmVyaWZ5S2V5JztcbmltcG9ydCB7IGdldFBvbGljeUZvckVudiB9IGZyb20gJy4vZGVzY3JpcHRvci92YWxpZGF0ZVBvbGljeSc7XG5pbXBvcnQgeyBzaWduVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uL3NpZ25UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBpc1V0eG9XYWxsZXREYXRhLCBVdHhvV2FsbGV0IH0gZnJvbSAnLi93YWxsZXQnO1xuaW1wb3J0IHsgaXNEZXNjcmlwdG9yV2FsbGV0RGF0YSB9IGZyb20gJy4vZGVzY3JpcHRvci9kZXNjcmlwdG9yV2FsbGV0JztcblxuaW1wb3J0IFNjcmlwdFR5cGUyT2YzID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLlNjcmlwdFR5cGUyT2YzO1xuXG50eXBlIFV0eG9DdXN0b21TaWduaW5nRnVuY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4gPSB7XG4gIChwYXJhbXM6IHtcbiAgICBjb2luOiBJQmFzZUNvaW47XG4gICAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjtcbiAgICBwdWJzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogc2lnbmluZ1N0ZXAgZmxhZyBiZWNvbWVzIGFwcGxpY2FibGUgd2hlbiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICAgICAqIDEpIFdoZW4gdGhlIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIGlzIGFjdGl2YXRlZFxuICAgICAqIDIpIFdoZW4gdGhlIFBTQlQgaW5jbHVkZXMgYXQgbGVhc3Qgb25lIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXQuXG4gICAgICpcbiAgICAgKiBUaGUgc2lnbmluZyBwcm9jZXNzIG9mIGEgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dCBpcyBhIDQtc3RlcCBzZXF1ZW5jZTpcbiAgICAgKiBpKSB1c2VyIG5vbmNlIGdlbmVyYXRpb24gLSBzaWduZXJOb25jZSAtIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8gZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgc2lnblRyYW5zYWN0aW9uXG4gICAgICogaWkpIGJpdGdvIG5vbmNlIGdlbmVyYXRpb24gLSBjb3NpZ25lck5vbmNlIC0gdGhpcyBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgY2FsbCB0byBsb2NhbCBzaWduVHJhbnNhY3Rpb25cbiAgICAgKiBpaWkpIHVzZXIgc2lnbmF0dXJlIC0gc2lnbmVyU2lnbmF0dXJlIC0gdGhpcyBpcyB0aGUgc2Vjb25kIGNhbGwgdG8gZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgc2lnblRyYW5zYWN0aW9uXG4gICAgICogaXYpIGJpdGdvIHNpZ25hdHVyZSAtIG5vdCBpbiBzaWduVHJhbnNhY3Rpb24gbWV0aG9k4oCZcyBzY29wZVxuICAgICAqXG4gICAgICogSW4gdGhlIGFic2VuY2Ugb2YgdGhpcyBmbGFnLCB0aGUgYWZvcmVtZW50aW9uZWQgZmlyc3QgdGhyZWUgc2VxdWVuY2UgaXMgZXhlY3V0ZWQgaW4gYSBzaW5nbGUgc2lnblRyYW5zYWN0aW9uIGNhbGwuXG4gICAgICpcbiAgICAgKiBOT1RFOiBXZSBtYWtlIGEgc3Ryb25nIGFzc3VtcHRpb24gdGhhdCB0aGUgZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgYW5kIGl0cyBjYWxsZXIgdXNlcyBzdGlja3kgc2Vzc2lvbnMsXG4gICAgICogc2luY2UgUFNCVHMgYXJlIGNhY2hlZCBpbiBzdGVwIDEgdG8gYmUgdXNlZCBpbiBzdGVwIDMgZm9yIE11U2lnMiB1c2VyIHNlY3VyZSBub25jZSBhY2Nlc3MuXG4gICAgICovXG4gICAgc2lnbmluZ1N0ZXA/OiAnc2lnbmVyTm9uY2UnIHwgJ3NpZ25lclNpZ25hdHVyZScgfCAnY29zaWduZXJOb25jZSc7XG4gIH0pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPjtcbn07XG5cbmNvbnN0IHsgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiwgb3V0cHV0U2NyaXB0cyB9ID0gYml0Z287XG5cbnR5cGUgVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IGJpdGdvLlVuc3BlbnQ8VE51bWJlcj47XG5cbi8qKlxuICogQ29udmVydCBWYWxpZGF0aW9uRXJyb3IgdG8gVHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yIHdpdGggc3RydWN0dXJlZCBkYXRhXG4gKlxuICogVGhpcyBwcmVzZXJ2ZXMgdGhlIHN0cnVjdHVyZWQgZXJyb3IgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3JpZ2luYWwgVmFsaWRhdGlvbkVycm9yXG4gKiBieSBleHRyYWN0aW5nIHRoZSBtaXNtYXRjaGVkIG91dHB1dHMgYW5kIGNvbnZlcnRpbmcgdGhlbSB0byB0aGUgc3RhbmRhcmRpemVkIGZvcm1hdC5cbiAqIFRoZSBvcmlnaW5hbCBlcnJvciBpcyBwcmVzZXJ2ZWQgYXMgdGhlIGBjYXVzZWAgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAqL1xuZnVuY3Rpb24gY29udmVydFZhbGlkYXRpb25FcnJvclRvVHhJbnRlbnRNaXNtYXRjaChcbiAgZXJyb3I6IEFnZ3JlZ2F0ZVZhbGlkYXRpb25FcnJvcixcbiAgcmVxSWQ6IHN0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkLFxuICB0eFBhcmFtczogQmFzZVRyYW5zYWN0aW9uUGFyYW1zLFxuICB0eEhleDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3Ige1xuICBjb25zdCBtaXNtYXRjaGVkUmVjaXBpZW50czogTWlzbWF0Y2hlZFJlY2lwaWVudFtdID0gW107XG5cbiAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3IuZXJyb3JzKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yTWlzc2luZ091dHB1dHMpIHtcbiAgICAgIG1pc21hdGNoZWRSZWNpcGllbnRzLnB1c2goXG4gICAgICAgIC4uLmVyci5taXNzaW5nT3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IG91dHB1dC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3JJbXBsaWNpdEV4dGVybmFsT3V0cHV0cykge1xuICAgICAgbWlzbWF0Y2hlZFJlY2lwaWVudHMucHVzaChcbiAgICAgICAgLi4uZXJyLmltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogb3V0cHV0LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdHhJbnRlbnRFcnJvciA9IG5ldyBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3IoXG4gICAgZXJyb3IubWVzc2FnZSxcbiAgICByZXFJZCxcbiAgICBbdHhQYXJhbXNdLFxuICAgIHR4SGV4LFxuICAgIG1pc21hdGNoZWRSZWNpcGllbnRzXG4gICk7XG4gIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBzdHJ1Y3R1cmVkIGVycm9yIGFzIHRoZSBjYXVzZSBmb3IgZGVidWdnaW5nXG4gIC8vIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IvY2F1c2VcbiAgKHR4SW50ZW50RXJyb3IgYXMgRXJyb3IgJiB7IGNhdXNlPzogRXJyb3IgfSkuY2F1c2UgPSBlcnJvcjtcbiAgcmV0dXJuIHR4SW50ZW50RXJyb3I7XG59XG5cbmV4cG9ydCB0eXBlIERlY29kZWRUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9XG4gIHwgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj5cbiAgfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuXG5leHBvcnQgdHlwZSBSb290V2FsbGV0S2V5cyA9IGJpdGdvLlJvb3RXYWxsZXRLZXlzO1xuXG5leHBvcnQgdHlwZSBVdHhvQ29pblNwZWNpZmljID0gQWRkcmVzc0NvaW5TcGVjaWZpYyB8IERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUFkZHJlc3NPcHRpb25zPFRDb2luU3BlY2lmaWMgZXh0ZW5kcyBVdHhvQ29pblNwZWNpZmljPiBleHRlbmRzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyB7XG4gIGNoYWluPzogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xuICBjb2luU3BlY2lmaWM/OiBUQ29pblNwZWNpZmljO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VPdXRwdXQ8VEFtb3VudCA9IHN0cmluZyB8IG51bWJlcj4ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGFtb3VudDogVEFtb3VudDtcbiAgLy8gRXZlbiB0aG91Z2ggdGhpcyBleHRlcm5hbCBmbGFnIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBjaGFpbiBwcm9wZXJ0eSwgaXQgaXMgbmVjZXNzYXJ5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAvLyB3aXRoIGxlZ2FjeSB0cmFuc2FjdGlvbiBmb3JtYXQuXG4gIGV4dGVybmFsPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaXhlZFNjcmlwdFdhbGxldE91dHB1dDxUQW1vdW50ID0gc3RyaW5nIHwgbnVtYmVyPiBleHRlbmRzIEJhc2VPdXRwdXQ8VEFtb3VudD4ge1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbj86IGJvb2xlYW47XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIE91dHB1dDxUQW1vdW50ID0gc3RyaW5nIHwgbnVtYmVyPiA9IEJhc2VPdXRwdXQ8VEFtb3VudD4gfCBGaXhlZFNjcmlwdFdhbGxldE91dHB1dDxUQW1vdW50PjtcblxuZXhwb3J0IHR5cGUgQmlwMzIyTWVzc2FnZSA9IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNXYWxsZXRPdXRwdXQob3V0cHV0OiBPdXRwdXQpOiBvdXRwdXQgaXMgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQge1xuICByZXR1cm4gKFxuICAgIChvdXRwdXQgYXMgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQpLmNoYWluICE9PSB1bmRlZmluZWQgJiYgKG91dHB1dCBhcyBGaXhlZFNjcmlwdFdhbGxldE91dHB1dCkuaW5kZXggIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRXhwbGFuYXRpb248VEZlZSA9IHN0cmluZz4gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjxURmVlLCBzdHJpbmc+IHtcbiAgbG9ja3RpbWU/OiBudW1iZXI7XG4gIC8qKiBOT1RFOiB0aGlzIGFjdHVhbGx5IG9ubHkgY2FwdHVyZXMgZXh0ZXJuYWwgb3V0cHV0cyAqL1xuICBvdXRwdXRzOiBPdXRwdXRbXTtcbiAgY2hhbmdlT3V0cHV0czogT3V0cHV0W107XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBpbnB1dCBzaWduYXR1cmVzIHBlciBpbnB1dC5cbiAgICovXG4gIGlucHV0U2lnbmF0dXJlczogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIEhpZ2hlc3QgaW5wdXQgc2lnbmF0dXJlIGNvdW50IGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIHNpZ25hdHVyZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQklQMzIyIG1lc3NhZ2VzIGV4dHJhY3RlZCBmcm9tIHRoZSB0cmFuc2FjdGlvbiBpbnB1dHMuXG4gICAqIFRoZXNlIG1lc3NhZ2VzIGFyZSB1c2VkIGZvciB2ZXJpZnlpbmcgdGhlIHRyYW5zYWN0aW9uIGFnYWluc3QgdGhlIEJJUDMyMiBzdGFuZGFyZC5cbiAgICovXG4gIG1lc3NhZ2VzPzogQmlwMzIyTWVzc2FnZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIC8qKiBNYXBzIHR4aWQgdG8gdHhoZXguIFJlcXVpcmVkIGZvciBvZmZsaW5lIHNpZ25pbmcuICovXG4gIHR4SGV4ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjaGFuZ2VBZGRyZXNzZXM/OiBzdHJpbmdbXTtcbiAgLyoqIHBzYnQgZG9lcyBub3QgcmVxdWlyZSB1bnNwZW50cy4gKi9cbiAgdW5zcGVudHM/OiBVbnNwZW50PFROdW1iZXI+W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIHR4SW5mbz86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgZmVlSW5mbz86IHN0cmluZztcbiAgcHVicz86IFRyaXBsZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlY29yYXRlZEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj5cbiAgZXh0ZW5kcyBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+IHtcbiAgY2hhbmdlSW5mbz86IHsgYWRkcmVzczogc3RyaW5nOyBjaGFpbjogbnVtYmVyOyBpbmRleDogbnVtYmVyIH1bXTtcbn1cblxuZXhwb3J0IHR5cGUgVXR4b05ldHdvcmsgPSB1dHhvbGliLk5ldHdvcms7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkIHtcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBibG9ja0hlaWdodD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblBhcmFtcyBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblBhcmFtcyB7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGFsbG93RXh0ZXJuYWxDaGFuZ2VBZGRyZXNzPzogYm9vbGVhbjtcbiAgY2hhbmdlQWRkcmVzcz86IHN0cmluZztcbiAgcmJmVHhJZHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcztcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjtcbiAgd2FsbGV0OiBVdHhvV2FsbGV0O1xuICB2ZXJpZmljYXRpb24/OiBWZXJpZmljYXRpb25PcHRpb25zO1xuICByZXFJZD86IElSZXF1ZXN0VHJhY2VyO1xufVxuXG5leHBvcnQgdHlwZSBCYXNlUGFyc2VkVHJhbnNhY3Rpb25PdXRwdXRzPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQsIFRPdXRwdXQ+ID0ge1xuICAvKiogYWxsIHRyYW5zYWN0aW9uIG91dHB1dHMgKi9cbiAgb3V0cHV0czogVE91dHB1dFtdO1xuICAvKiogdHJhbnNhY3Rpb24gb3V0cHV0cyB0aGF0IHdlcmUgc3BlY2lmaWVkIGFzIHJlY2lwaWVudHMgYnV0IGFyZSBtaXNzaW5nIGZyb20gdGhlIHRyYW5zYWN0aW9uICovXG4gIG1pc3NpbmdPdXRwdXRzOiBUT3V0cHV0W107XG4gIC8qKiB0cmFuc2FjdGlvbiBvdXRwdXRzIHRoYXQgd2VyZSBzcGVjaWZpZWQgYXMgcmVjaXBpZW50cyBhbmQgYXJlIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uICovXG4gIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBUT3V0cHV0W107XG4gIC8qKiB0cmFuc2FjdGlvbiBvdXRwdXRzIHRoYXQgd2VyZSBub3Qgc3BlY2lmaWVkIGFzIHJlY2lwaWVudHMgYnV0IGFyZSBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbiAqL1xuICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogVE91dHB1dFtdO1xuICAvKiogdHJhbnNhY3Rpb24gb3V0cHV0cyB0aGF0IGFyZSBjaGFuZ2Ugb3V0cHV0cyAqL1xuICBjaGFuZ2VPdXRwdXRzOiBUT3V0cHV0W107XG4gIC8qKiBzdW0gb2YgYWxsIGV4cGxpY2l0IGV4dGVybmFsIG91dHB1dHMgKi9cbiAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiBUTnVtYmVyO1xuICAvKiogc3VtIG9mIGFsbCBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzICovXG4gIGltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogVE51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEJhc2VQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50LCBUT3V0cHV0PiA9IEJhc2VQYXJzZWRUcmFuc2FjdGlvbk91dHB1dHM8XG4gIFROdW1iZXIsXG4gIFRPdXRwdXRcbj4gLyoqIFNvbWUgZXh0cmEgcHJvcGVydGllcyB0aGF0IGhhdmUgbm90aGluZyB0byBkbyB3aXRoIGFuIGluZGl2aWR1YWwgdHJhbnNhY3Rpb24gKi8gJiB7XG4gIGtleWNoYWluczogVXR4b05hbWVkS2V5Y2hhaW5zO1xuICBrZXlTaWduYXR1cmVzOiB7XG4gICAgYmFja3VwUHViPzogc3RyaW5nO1xuICAgIGJpdGdvUHViPzogc3RyaW5nO1xuICB9O1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbjogYm9vbGVhbjtcbiAgY3VzdG9tQ2hhbmdlPzogQ3VzdG9tQ2hhbmdlT3B0aW9ucztcbn07XG5cbi8qKlxuICogVGhpcyB0eXBlIGlzIGEgYml0IHNpbGx5IGJlY2F1c2UgaXQgYWxsb3dzIHRoZSB0eXBlIGZvciB0aGUgYWdncmVnYXRlIGFtb3VudHMgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIHR5cGUgb2ZcbiAqIGluZGl2aWR1YWwgYW1vdW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSBCYXNlUGFyc2VkVHJhbnNhY3Rpb248VE51bWJlciwgT3V0cHV0PjtcblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUFkZHJlc3NPcHRpb25zIHtcbiAgYWRkcmVzc1R5cGU/OiBTY3JpcHRUeXBlMk9mMztcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICBjaGFpbj86IG51bWJlcjtcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHNlZ3dpdD86IGJvb2xlYW47XG4gIGJlY2gzMj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVGaXhlZFNjcmlwdEFkZHJlc3NPcHRpb25zIGV4dGVuZHMgR2VuZXJhdGVBZGRyZXNzT3B0aW9ucyB7XG4gIGZvcm1hdD86IENyZWF0ZUFkZHJlc3NGb3JtYXQ7XG4gIGtleWNoYWluczoge1xuICAgIHB1Yjogc3RyaW5nO1xuICAgIGFzcEtleUlkPzogc3RyaW5nO1xuICB9W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RldGFpbHMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG4gIGNvaW46IHN0cmluZztcbiAgY29pblNwZWNpZmljOiBBZGRyZXNzQ29pblNwZWNpZmljIHwgRGVzY3JpcHRvckFkZHJlc3NDb2luU3BlY2lmaWM7XG4gIGFkZHJlc3NUeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljIGV4dGVuZHMgQWRkcmVzc0NvaW5TcGVjaWZpYyB7XG4gIGRlc2NyaXB0b3JOYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0b3JDaGVja3N1bTogc3RyaW5nO1xufVxuXG50eXBlIFV0eG9CYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zICYge1xuICAvKiogVHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBiaXRnbyBzZXJ2ZXIgKi9cbiAgdHhQcmVidWlsZDoge1xuICAgIC8qKlxuICAgICAqIHdhbGxldElkIGlzIHJlcXVpcmVkIGluIGZvbGxvd2luZyAyIHNjZW5hcmlvcy5cbiAgICAgKiAxLiBFeHRlcm5hbCBzaWduZXIgZXhwcmVzcyBtb2RlIGlzIHVzZWQuXG4gICAgICogMi4gYml0Z28gTXVTaWcyIG5vbmNlIGlzIHJlcXVlc3RlZFxuICAgICAqL1xuICAgIHdhbGxldElkPzogc3RyaW5nO1xuICAgIHR4SGV4OiBzdHJpbmc7XG4gICAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB9O1xuICAvKiogeHB1YnMgdHJpcGxlIGZvciB3YWxsZXQgKHVzZXIsIGJhY2t1cCwgYml0Z28pLiBSZXF1aXJlZCBvbmx5IHdoZW4gdHhQcmVidWlsZC50eEhleCBpcyBub3QgYSBQU0JUICovXG4gIHB1YnM/OiBUcmlwbGU8c3RyaW5nPjtcbiAgLyoqIHhwdWIgZm9yIGNvc2lnbmVyIChkZWZhdWx0cyB0byBiaXRnbykgKi9cbiAgY29zaWduZXJQdWI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGNyZWF0ZXMgZnVsbC1zaWduZWQgdHJhbnNhY3Rpb24gd2l0aG91dCBwbGFjZWhvbGRlciBzaWduYXR1cmVzLlxuICAgKiBXaGVuIGZhbHNlLCBjcmVhdGVzIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlcy5cbiAgICovXG4gIGlzTGFzdFNpZ25hdHVyZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiB0cnVlLCBhbGxvd3Mgc2lnbmluZyBhIG5vbi1zZWd3aXQgaW5wdXQgd2l0aCBhIHdpdG5lc3NVdHhvIGluc3RlYWQgcmVxdWlyaW5nIGEgcHJldmlvdXNcbiAgICogdHJhbnNhY3Rpb24gKG5vbldpdG5lc3NVdHhvKVxuICAgKi9cbiAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeD86IGJvb2xlYW47XG4gIHdhbGxldD86IFV0eG9XYWxsZXQ7XG59O1xuXG5leHBvcnQgdHlwZSBTaWduVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gVXR4b0Jhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+ICZcbiAgKFxuICAgIHwge1xuICAgICAgICBwcnY6IHN0cmluZztcbiAgICAgICAgc2lnbmluZ1N0ZXA/OiAnc2lnbmVyTm9uY2UnIHwgJ3NpZ25lclNpZ25hdHVyZSc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHNpZ25pbmdTdGVwOiAnY29zaWduZXJOb25jZSc7XG4gICAgICB9XG4gICk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlTaWdBZGRyZXNzIHtcbiAgb3V0cHV0U2NyaXB0OiBCdWZmZXI7XG4gIHJlZGVlbVNjcmlwdD86IEJ1ZmZlcjtcbiAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcjtcbiAgYWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJGcm9tV3JvbmdDaGFpbk9wdGlvbnMge1xuICB0eGlkOiBzdHJpbmc7XG4gIHJlY292ZXJ5QWRkcmVzczogc3RyaW5nO1xuICB3YWxsZXQ6IHN0cmluZztcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgeHBydj86IHN0cmluZztcbiAgYXBpS2V5Pzogc3RyaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgY29pbj86IEFic3RyYWN0VXR4b0NvaW47XG4gIHJlY292ZXJ5Q29pbj86IEFic3RyYWN0VXR4b0NvaW47XG4gIHNpZ25lZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnMge1xuICB1c2VyS2V5Y2hhaW46IHsgcHViPzogc3RyaW5nIH07XG4gIGtleWNoYWluVG9WZXJpZnk6IHsgcHViPzogc3RyaW5nIH07XG4gIGtleVNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVVzZXJQdWJsaWNLZXlPcHRpb25zIHtcbiAgdXNlcktleWNoYWluPzogVXR4b0tleWNoYWluO1xuICBkaXNhYmxlTmV0d29ya2luZzogYm9vbGVhbjtcbiAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIEJhc2VWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+O1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG4gIHdhbGxldDogVXR4b1dhbGxldDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduUHNidFJlcXVlc3Qge1xuICBwc2J0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblBzYnRSZXNwb25zZSB7XG4gIHBzYnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VXR4b0NvaW4gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHB1YmxpYyBhbHRTY3JpcHRIYXNoPzogbnVtYmVyO1xuICBwdWJsaWMgc3VwcG9ydEFsdFNjcmlwdERlc3RpbmF0aW9uPzogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25ldHdvcms6IHV0eG9saWIuTmV0d29yaztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLCBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcicpIHtcbiAgICBzdXBlcihiaXRnbyk7XG4gICAgaWYgKCF1dHhvbGliLmlzVmFsaWROZXR3b3JrKG5ldHdvcmspKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdpbnZhbGlkIG5ldHdvcms6IHBsZWFzZSBtYWtlIHN1cmUgdG8gdXNlIHRoZSBzYW1lIHZlcnNpb24gb2YgJyArXG4gICAgICAgICAgJ0BiaXRnby91dHhvLWxpYiBhcyB0aGlzIGxpYnJhcnkgd2hlbiBpbml0aWFsaXppbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcydcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYW1vdW50VHlwZSA9IGFtb3VudFR5cGU7XG4gICAgdGhpcy5fbmV0d29yayA9IG5ldHdvcms7XG4gIH1cblxuICBnZXQgbmV0d29yaygpIHtcbiAgICByZXR1cm4gdGhpcy5fbmV0d29yaztcbiAgfVxuXG4gIGdldENoYWluKCkge1xuICAgIHJldHVybiBnZXRDaGFpbkZyb21OZXR3b3JrKHRoaXMubmV0d29yayk7XG4gIH1cblxuICBnZXRGYW1pbHkoKSB7XG4gICAgcmV0dXJuIGdldEZhbWlseUZyb21OZXR3b3JrKHRoaXMubmV0d29yayk7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpIHtcbiAgICByZXR1cm4gZ2V0RnVsbE5hbWVGcm9tTmV0d29yayh0aGlzLm5ldHdvcmspO1xuICB9XG5cbiAgLyoqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2luIHN1cHBvcnRzIGEgYmxvY2sgdGFyZ2V0ICovXG4gIHN1cHBvcnRzQmxvY2tUYXJnZXQoKSB7XG4gICAgLy8gRklYTUU6IHRoZSBTREsgZG9lcyBub3Qgc2VlbSB0byB1c2UgdGhpcyBhbnl3aGVyZSBzbyBpdCBpcyB1bmNsZWFyIHdoYXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXNcbiAgICBzd2l0Y2ggKGdldE1haW5uZXQodGhpcy5uZXR3b3JrKSkge1xuICAgICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW46XG4gICAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuZG9nZWNvaW46XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN3ZWVwV2l0aFNlbmRNYW55KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIHN0YXRpYyBnZXQgdmFsaWRBZGRyZXNzVHlwZXMoKTogU2NyaXB0VHlwZTJPZjNbXSB7XG4gICAgcmV0dXJuIFsuLi5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mM107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmFjdG9yIGJldHdlZW4gdGhlIGJhc2UgdW5pdCBhbmQgaXRzIHNtYWxsZXN0IHN1YmRpdmlzb25cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0QmFzZUZhY3RvcigpIHtcbiAgICByZXR1cm4gMWU4O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFkZHJlc3MgaXMgdmFsaWRcbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIHBhcmFtPzogeyBhbnlGb3JtYXQ6IGJvb2xlYW4gfSB8IC8qIGxlZ2FjeSBwYXJhbWV0ZXIgKi8gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdib29sZWFuJyAmJiBwYXJhbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXByZWNhdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgYWxsb3cgYWxsIGFkZHJlc3MgZm9ybWF0cy5cbiAgICAvLyBBdCB0aGUgdGltZSBvZiB3cml0aW5nLCB0aGUgb25seSBhZGRpdGlvbmFsIGFkZHJlc3MgZm9ybWF0IGlzIGJjaCBjYXNoYWRkci5cbiAgICBjb25zdCBhbnlGb3JtYXQgPSAocGFyYW0gYXMgeyBhbnlGb3JtYXQ6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCk/LmFueUZvcm1hdCA/PyB0cnVlO1xuICAgIHRyeSB7XG4gICAgICAvLyBGaW5kIG91dCBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCBmb3IgYW55IGZvcm1hdC4gVHJpZXMgYWxsIHN1cHBvcnRlZCBmb3JtYXRzIGJ5IGRlZmF1bHQuXG4gICAgICAvLyBUaHJvd3MgaWYgYWRkcmVzcyBjYW5ub3QgYmUgZGVjb2RlZCB3aXRoIGFueSBmb3JtYXQuXG4gICAgICBjb25zdCBbZm9ybWF0LCBzY3JpcHRdID0gdXR4b2xpYi5hZGRyZXNzRm9ybWF0LnRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0KGFkZHJlc3MsIHRoaXMubmV0d29yayk7XG4gICAgICAvLyB1bmxlc3MgYW55Rm9ybWF0IGlzIHNldCwgb25seSAnZGVmYXVsdCcgaXMgYWxsb3dlZC5cbiAgICAgIGlmICghYW55Rm9ybWF0ICYmIGZvcm1hdCAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFkZHJlc3MgaXMgaW4gbm9ybWFsIHJlcHJlc2VudGF0aW9uIGZvciBnaXZlbiBmb3JtYXQuXG4gICAgICByZXR1cm4gYWRkcmVzcyA9PT0gdXR4b2xpYi5hZGRyZXNzRm9ybWF0LmZyb21PdXRwdXRTY3JpcHRXaXRoRm9ybWF0KHNjcmlwdCwgZm9ybWF0LCB0aGlzLm5ldHdvcmspO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiaXAzMi5mcm9tQmFzZTU4KHB1YikuaXNOZXV0ZXJlZCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcmVwcm9jZXNzQnVpbGRQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5yZWNpcGllbnRzID1cbiAgICAgICAgcGFyYW1zLnJlY2lwaWVudHMgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgID8gcGFyYW1zPy5yZWNpcGllbnRzPy5tYXAoKHJlY2lwaWVudCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB7IGFkZHJlc3MsIC4uLnJlc3QgfSA9IHJlY2lwaWVudDtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ucmVzdCwgLi4uZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdChhZGRyZXNzKSB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHBhcmFtcy5yZWNpcGllbnRzO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXRlc3QgYmxvY2sgaGVpZ2h0XG4gICAqIEBwYXJhbSByZXFJZFxuICAgKi9cbiAgYXN5bmMgZ2V0TGF0ZXN0QmxvY2tIZWlnaHQocmVxSWQ/OiBSZXF1ZXN0VHJhY2VyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAocmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGNoYWluaGVhZCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcHVibGljL2Jsb2NrL2xhdGVzdCcpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gKGNoYWluaGVhZCBhcyBhbnkpLmhlaWdodDtcbiAgfVxuXG4gIGNoZWNrUmVjaXBpZW50KHJlY2lwaWVudDogeyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogbnVtYmVyIHwgc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBhc3NlcnRWYWxpZFRyYW5zYWN0aW9uUmVjaXBpZW50KHJlY2lwaWVudCk7XG4gICAgaWYgKCFpc1NjcmlwdFJlY2lwaWVudChyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgIHN1cGVyLmNoZWNrUmVjaXBpZW50KHJlY2lwaWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBjdXN0b20gY29pbiBsb2dpYyBhZnRlciBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGhhcyBiZWVuIHJlY2VpdmVkIGZyb20gQml0R29cbiAgICogQHBhcmFtIHByZWJ1aWxkXG4gICAqL1xuICBhc3luYyBwb3N0UHJvY2Vzc1ByZWJ1aWxkPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICAgIHByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPj4ge1xuICAgIGNvbnN0IHR4ID0gdGhpcy5kZWNvZGVUcmFuc2FjdGlvbkZyb21QcmVidWlsZChwcmVidWlsZCk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocHJlYnVpbGQuYmxvY2tIZWlnaHQpKSB7XG4gICAgICBwcmVidWlsZC5ibG9ja0hlaWdodCA9IChhd2FpdCB0aGlzLmdldExhdGVzdEJsb2NrSGVpZ2h0KCkpIGFzIG51bWJlcjtcbiAgICB9XG4gICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB0eEhleDogdHgudG9IZXgoKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgYW4gYWRkcmVzcycgdHlwZSBiYXNlZCBvbiBpdHMgd2l0bmVzcyBhbmQgcmVkZWVtIHNjcmlwdCBwcmVzZW5jZVxuICAgKiBAcGFyYW0gYWRkcmVzc0RldGFpbHNcbiAgICovXG4gIHN0YXRpYyBpbmZlckFkZHJlc3NUeXBlKGFkZHJlc3NEZXRhaWxzOiB7IGNoYWluOiBudW1iZXIgfSk6IFNjcmlwdFR5cGUyT2YzIHwgbnVsbCB7XG4gICAgcmV0dXJuIGlzQ2hhaW5Db2RlKGFkZHJlc3NEZXRhaWxzLmNoYWluKSA/IHNjcmlwdFR5cGVGb3JDaGFpbihhZGRyZXNzRGV0YWlscy5jaGFpbikgOiBudWxsO1xuICB9XG5cbiAgY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIGhleDogc3RyaW5nXG4gICk6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICByZXR1cm4gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4oaGV4LCB0aGlzLm5ldHdvcmssIHRoaXMuYW1vdW50VHlwZSk7XG4gIH1cblxuICBkZWNvZGVUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihpbnB1dDogQnVmZmVyIHwgc3RyaW5nKTogRGVjb2RlZFRyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgZm9yIChjb25zdCBmb3JtYXQgb2YgWydoZXgnLCAnYmFzZTY0J10gYXMgY29uc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oaW5wdXQsIGZvcm1hdCk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclRvU3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKGZvcm1hdCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZm9ybWF0ID09PSAnYmFzZTY0JyAmJiBidWZmZXJUb1N0cmluZyA9PT0gaW5wdXQpIHx8XG4gICAgICAgICAgKGZvcm1hdCA9PT0gJ2hleCcgJiYgYnVmZmVyVG9TdHJpbmcgPT09IGlucHV0LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmRlY29kZVRyYW5zYWN0aW9uKGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnB1dCBtdXN0IGJlIGEgdmFsaWQgaGV4IG9yIGJhc2U2NCBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAodXR4b2xpYi5iaXRnby5pc1BzYnQoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUJ1ZmZlcihpbnB1dCwgdGhpcy5uZXR3b3JrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGlucHV0LCB0aGlzLm5ldHdvcmssIHtcbiAgICAgICAgYW1vdW50VHlwZTogdGhpcy5hbW91bnRUeXBlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGVjb2RlVHJhbnNhY3Rpb25Gcm9tUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4ocHJlYnVpbGQ6IHtcbiAgICB0eEhleD86IHN0cmluZztcbiAgICB0eEJhc2U2ND86IHN0cmluZztcbiAgfSk6IERlY29kZWRUcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgY29uc3Qgc3RyaW5nID0gcHJlYnVpbGQudHhIZXggPz8gcHJlYnVpbGQudHhCYXNlNjQ7XG4gICAgaWYgKCFzdHJpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eEhleCBvciB0eEJhc2U2NCBwcm9wZXJ0eScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZWNvZGVUcmFuc2FjdGlvbihzdHJpbmcpO1xuICB9XG5cbiAgdG9DYW5vbmljYWxUcmFuc2FjdGlvblJlY2lwaWVudChvdXRwdXQ6IHsgdmFsdWVTdHJpbmc6IHN0cmluZzsgYWRkcmVzcz86IHN0cmluZyB9KToge1xuICAgIGFtb3VudDogYmlnaW50O1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IGFtb3VudCA9IEJpZ0ludChvdXRwdXQudmFsdWVTdHJpbmcpO1xuICAgIGFzc2VydFZhbGlkVHJhbnNhY3Rpb25SZWNpcGllbnQoeyBhbW91bnQsIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzIH0pO1xuICAgIGlmICghb3V0cHV0LmFkZHJlc3MpIHtcbiAgICAgIHJldHVybiB7IGFtb3VudCB9O1xuICAgIH1cbiAgICByZXR1cm4geyBhbW91bnQsIGFkZHJlc3M6IHRoaXMuY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcykgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGFuZCBmaWxsIHRyYW5zYWN0aW9uIGRldGFpbHMgc3VjaCBhcyBpbnRlcm5hbC9jaGFuZ2Ugc3BlbmQsIGV4dGVybmFsIHNwZW5kIChleHBsaWNpdCB2cy4gaW1wbGljaXQpLCBldGMuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyPj4ge1xuICAgIHJldHVybiBwYXJzZVRyYW5zYWN0aW9uKHRoaXMsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgZnVuY3Rpb24gdmVyaWZ5VXNlclB1YmxpY0tleSBpbnN0ZWFkXG4gICAqL1xuICBwcm90ZWN0ZWQgdmVyaWZ5VXNlclB1YmxpY0tleShwYXJhbXM6IFZlcmlmeVVzZXJQdWJsaWNLZXlPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZlcmlmeVVzZXJQdWJsaWNLZXkodGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBmdW5jdGlvbiB2ZXJpZnlLZXlTaWduYXR1cmUgaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHZlcmlmeUtleVNpZ25hdHVyZShwYXJhbXM6IFZlcmlmeUtleVNpZ25hdHVyZXNPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZlcmlmeUtleVNpZ25hdHVyZShwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgY29tcGxpZXMgd2l0aCB0aGUgb3JpZ2luYWwgaW50ZW50aW9uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50eFBhcmFtcyBwYXJhbXMgb2JqZWN0IHBhc3NlZCB0byBzZW5kXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQcmVidWlsZCBwcmVidWlsZCBvYmplY3QgcmV0dXJuZWQgYnkgc2VydmVyXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQcmVidWlsZC50eEhleCBwcmVidWlsdCB0cmFuc2FjdGlvbidzIHR4SGV4IGZvcm1cbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXQgV2FsbGV0IG9iamVjdCB0byBvYnRhaW4ga2V5cyB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbiBPYmplY3Qgc3BlY2lmeWluZyBzb21lIHZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nIERpc2FsbG93IGZldGNoaW5nIGFueSBkYXRhIGZyb20gdGhlIGludGVybmV0IGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXNcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24ua2V5Y2hhaW5zIFBhc3Mga2V5Y2hhaW5zIG1hbnVhbGx5IHJhdGhlciB0aGFuIGZldGNoaW5nIHRoZW0gYnkgaWRcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24uYWRkcmVzc2VzIEFkZHJlc3MgZGV0YWlscyB0byBwYXNzIGluIGZvciBvdXQtb2YtYmFuZCB2ZXJpZmljYXRpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmVyaWZpY2F0aW9uIHBhc3Nlc1xuICAgKiBAdGhyb3dzIHtUeEludGVudE1pc21hdGNoRXJyb3J9IGlmIHRyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbHNcbiAgICogQHRocm93cyB7VHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yfSBpZiB0cmFuc2FjdGlvbiByZWNpcGllbnRzIGRvbid0IG1hdGNoIHVzZXIgaW50ZW50XG4gICAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHZlcmlmeVRyYW5zYWN0aW9uKHRoaXMsIHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICB0aHJvdyBjb252ZXJ0VmFsaWRhdGlvbkVycm9yVG9UeEludGVudE1pc21hdGNoKGVycm9yLCBwYXJhbXMucmVxSWQsIHBhcmFtcy50eFBhcmFtcywgcGFyYW1zLnR4UHJlYnVpbGQudHhIZXgpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ha2Ugc3VyZSBhbiBhZGRyZXNzIGlzIHZhbGlkIGFuZCB0aHJvdyBhbiBlcnJvciBpZiBpdCdzIG5vdC5cbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIFRoZSBhZGRyZXNzIHN0cmluZyBvbiB0aGUgbmV0d29ya1xuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3NUeXBlXG4gICAqIEBwYXJhbSBwYXJhbXMua2V5Y2hhaW5zIEtleWNoYWluIG9iamVjdHMgd2l0aCB4cHVic1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvaW5TcGVjaWZpYyBDb2luLXNwZWNpZmljIGRldGFpbHMgZm9yIHRoZSBhZGRyZXNzIHN1Y2ggYXMgYSB3aXRuZXNzIHNjcmlwdFxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYWluIERlcml2YXRpb24gY2hhaW5cbiAgICogQHBhcmFtIHBhcmFtcy5pbmRleCBEZXJpdmF0aW9uIGluZGV4XG4gICAqIEB0aHJvd3Mge0ludmFsaWRBZGRyZXNzRXJyb3J9XG4gICAqIEB0aHJvd3Mge0ludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3J9XG4gICAqIEB0aHJvd3Mge1VuZXhwZWN0ZWRBZGRyZXNzRXJyb3J9XG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBWZXJpZnlBZGRyZXNzT3B0aW9uczxVdHhvQ29pblNwZWNpZmljPiwgd2FsbGV0PzogSVdhbGxldCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgYWRkcmVzcywga2V5Y2hhaW5zLCBjaGFpbiwgaW5kZXggfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGlmICh3YWxsZXQgJiYgaXNEZXNjcmlwdG9yV2FsbGV0KHdhbGxldCkpIHtcbiAgICAgIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBrZXljaGFpbnMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNUcmlwbGUoa2V5Y2hhaW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWlucyBtdXN0IGJlIGEgdHJpcGxlJyk7XG4gICAgICB9XG4gICAgICBhc3NlcnREZXNjcmlwdG9yV2FsbGV0QWRkcmVzcyhcbiAgICAgICAgdGhpcy5uZXR3b3JrLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGdldERlc2NyaXB0b3JNYXBGcm9tV2FsbGV0KHdhbGxldCwgdG9CaXAzMlRyaXBsZShrZXljaGFpbnMpLCBnZXRQb2xpY3lGb3JFbnYodGhpcy5iaXRnby5lbnYpKVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICgoXy5pc1VuZGVmaW5lZChjaGFpbikgJiYgXy5pc1VuZGVmaW5lZChpbmRleCkpIHx8ICEoXy5pc0Zpbml0ZShjaGFpbikgJiYgXy5pc0Zpbml0ZShpbmRleCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvcihcbiAgICAgICAgYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBpbnZhbGlkIGNoYWluICgke2NoYWlufSkgb3IgaW5kZXggKCR7aW5kZXh9KWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBrZXljaGFpbnMnKTtcbiAgICB9XG5cbiAgICBhc3NlcnRGaXhlZFNjcmlwdFdhbGxldEFkZHJlc3ModGhpcy5uZXR3b3JrLCB7XG4gICAgICBhZGRyZXNzLFxuICAgICAga2V5Y2hhaW5zLFxuICAgICAgZm9ybWF0OiBwYXJhbXMuZm9ybWF0ID8/ICdiYXNlNTgnLFxuICAgICAgYWRkcmVzc1R5cGU6IHBhcmFtcy5hZGRyZXNzVHlwZSxcbiAgICAgIGNoYWluLFxuICAgICAgaW5kZXgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWRkcmVzc1R5cGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgY29pbiBzdXBwb3J0cyBzcGVuZGluZyBmcm9tIHVuc3BlbnRUeXBlXG4gICAqL1xuICBzdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlOiBTY3JpcHRUeXBlMk9mMyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuaXNTdXBwb3J0ZWRTY3JpcHRUeXBlKHRoaXMubmV0d29yaywgYWRkcmVzc1R5cGUpO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLm9uY2hhaW47XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEByZXR1cm4gdHJ1ZSBpZmYgY29pbiBzdXBwb3J0cyBzcGVuZGluZyBmcm9tIGNoYWluXG4gICAqL1xuICBzdXBwb3J0c0FkZHJlc3NDaGFpbihjaGFpbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQ2hhaW5Db2RlKGNoYWluKSAmJiB0aGlzLnN1cHBvcnRzQWRkcmVzc1R5cGUodXR4b2xpYi5iaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pKTtcbiAgfVxuXG4gIGtleUlkc0ZvclNpZ25pbmcoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBbS2V5SW5kaWNlcy5VU0VSLCBLZXlJbmRpY2VzLkJBQ0tVUCwgS2V5SW5kaWNlcy5CSVRHT107XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgaW5wdXQgcHNidCBhZGRlZCB3aXRoIGRldGVybWluaXN0aWMgTXVTaWcyIG5vbmNlIGZvciBiaXRnbyBrZXkgZm9yIGVhY2ggTXVTaWcyIGlucHV0cy5cbiAgICogQHBhcmFtIHBzYnRIZXggYWxsIE11U2lnMiBpbnB1dHMgc2hvdWxkIGNvbnRhaW4gdXNlciBNdVNpZzIgbm9uY2VcbiAgICogQHBhcmFtIHdhbGxldElkXG4gICAqL1xuICBhc3luYyBzaWduUHNidChwc2J0SGV4OiBzdHJpbmcsIHdhbGxldElkOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25Qc2J0UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwYXJhbXM6IFNpZ25Qc2J0UmVxdWVzdCA9IHsgcHNidDogcHNidEhleCB9O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dhbGxldC8nICsgd2FsbGV0SWQgKyAnL3R4L3NpZ25wc2J0JykpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgaW5wdXQgcHNidCBhZGRlZCB3aXRoIGRldGVybWluaXN0aWMgTXVTaWcyIG5vbmNlIGZvciBiaXRnbyBrZXkgZm9yIGVhY2ggTXVTaWcyIGlucHV0cyBmcm9tIE9WQy5cbiAgICogQHBhcmFtIG92Y0pzb24gSlNPTiBvYmplY3QgcHJvdmlkZWQgYnkgT1ZDIHdpdGggZmllbGRzIHBzYnRIZXggYW5kIHdhbGxldElkXG4gICAqL1xuICBhc3luYyBzaWduUHNidEZyb21PVkMob3ZjSnNvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgYXNzZXJ0KG92Y0pzb25bJ3BzYnRIZXgnXSwgJ292Y0pzb24gbXVzdCBjb250YWluIHBzYnRIZXgnKTtcbiAgICBhc3NlcnQob3ZjSnNvblsnd2FsbGV0SWQnXSwgJ292Y0pzb24gbXVzdCBjb250YWluIHdhbGxldElkJyk7XG4gICAgY29uc3QgcHNidCA9IChhd2FpdCB0aGlzLnNpZ25Qc2J0KG92Y0pzb25bJ3BzYnRIZXgnXSBhcyBzdHJpbmcsIG92Y0pzb25bJ3dhbGxldElkJ10gYXMgc3RyaW5nKSkucHNidDtcbiAgICBhc3NlcnQocHNidCwgJ3BzYnQgbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKG92Y0pzb24sIHsgdHhIZXg6IHBzYnQgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zIC0ge0BzZWUgU2lnblRyYW5zYWN0aW9uT3B0aW9uc31cbiAgICogQHJldHVybnMge1Byb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPn1cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4gc2lnblRyYW5zYWN0aW9uPFROdW1iZXI+KHRoaXMsIHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHRyYW5zYWN0aW9uIHdpdGggYSBjdXN0b20gc2lnbmluZyBmdW5jdGlvbi4gRXhhbXBsZSB1c2UgY2FzZSBpcyBleHByZXNzIGV4dGVybmFsIHNpZ25lclxuICAgKiBAcGFyYW0gY3VzdG9tU2lnbmluZ0Z1bmN0aW9uIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHNpbmdsZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHNpZ25UcmFuc2FjdGlvblBhcmFtcyBwYXJhbWV0ZXJzIGZvciBjdXN0b20gc2lnbmluZyBmdW5jdGlvbi4gSW5jbHVkZXMgdHhQcmVidWlsZCBhbmQgcHVicyAoZm9yIGxlZ2FjeSB0eCBvbmx5KS5cbiAgICpcbiAgICogQHJldHVybnMgc2lnbmVkIHRyYW5zYWN0aW9uIGFzIGhleCBzdHJpbmdcbiAgICovXG4gIGFzeW5jIHNpZ25XaXRoQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbjogVXR4b0N1c3RvbVNpZ25pbmdGdW5jdGlvbjxUTnVtYmVyPixcbiAgICBzaWduVHJhbnNhY3Rpb25QYXJhbXM6IHsgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjsgcHVicz86IHN0cmluZ1tdIH1cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gc2lnblRyYW5zYWN0aW9uUGFyYW1zLnR4UHJlYnVpbGQudHhIZXg7XG4gICAgYXNzZXJ0KHR4SGV4LCAnbWlzc2luZyB0eEhleCBwYXJhbWV0ZXInKTtcblxuICAgIGNvbnN0IHR4ID0gdGhpcy5kZWNvZGVUcmFuc2FjdGlvbih0eEhleCk7XG5cbiAgICBjb25zdCBpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0ID0gdHggaW5zdGFuY2VvZiBiaXRnby5VdHhvUHNidCAmJiBiaXRnby5pc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZElucHV0KHR4KTtcblxuICAgIGlmICghaXNUeFdpdGhLZXlQYXRoU3BlbmRJbnB1dCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGN1c3RvbVNpZ25pbmdGdW5jdGlvbih7IC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcywgY29pbjogdGhpcyB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBnZXRUeEhleCA9ICh2OiBTaWduZWRUcmFuc2FjdGlvbik6IHN0cmluZyA9PiB7XG4gICAgICBpZiAoJ3R4SGV4JyBpbiB2KSB7XG4gICAgICAgIHJldHVybiB2LnR4SGV4O1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eEhleCBub3QgZm91bmQgaW4gc2lnblRyYW5zYWN0aW9uIHJlc3VsdCcpO1xuICAgIH07XG5cbiAgICBjb25zdCBzaWduZXJOb25jZVR4ID0gYXdhaXQgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHtcbiAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyTm9uY2UnLFxuICAgICAgY29pbjogdGhpcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcHVicyB9ID0gc2lnblRyYW5zYWN0aW9uUGFyYW1zO1xuICAgIGFzc2VydChwdWJzID09PSB1bmRlZmluZWQgfHwgaXNUcmlwbGUocHVicykpO1xuXG4gICAgY29uc3QgY29zaWduZXJOb25jZVR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgcHVicyxcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLnR4UHJlYnVpbGQsIHR4SGV4OiBnZXRUeEhleChzaWduZXJOb25jZVR4KSB9LFxuICAgICAgc2lnbmluZ1N0ZXA6ICdjb3NpZ25lck5vbmNlJyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhd2FpdCBjdXN0b21TaWduaW5nRnVuY3Rpb24oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogeyAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMudHhQcmVidWlsZCwgdHhIZXg6IGdldFR4SGV4KGNvc2lnbmVyTm9uY2VUeCkgfSxcbiAgICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyU2lnbmF0dXJlJyxcbiAgICAgIGNvaW46IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHVuc3BlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0JpdEdvVGFpbnRlZFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4odW5zcGVudDogVW5zcGVudDxUTnVtYmVyPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1JlcGxheVByb3RlY3Rpb25VbnNwZW50PFROdW1iZXI+KHVuc3BlbnQsIHRoaXMubmV0d29yayk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wb3NlIGEgcmF3IHBzYnQvdHJhbnNhY3Rpb24gaW50byB1c2VmdWwgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHRvdGFsIGFtb3VudHMsXG4gICAqIGNoYW5nZSBhbW91bnRzLCBhbmQgdHJhbnNhY3Rpb24gb3V0cHV0cy5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZXhwbGFpblRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb248c3RyaW5nIHwgdW5kZWZpbmVkPj4ge1xuICAgIHJldHVybiBleHBsYWluVHgodGhpcy5kZWNvZGVUcmFuc2FjdGlvbkZyb21QcmVidWlsZChwYXJhbXMpLCBwYXJhbXMsIHRoaXMubmV0d29yayk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbXVsdGlzaWcgYWRkcmVzcyBvZiBhIGdpdmVuIHR5cGUgZnJvbSBhIGxpc3Qgb2Yga2V5Y2hhaW5zIGFuZCBhIHNpZ25pbmcgdGhyZXNob2xkXG4gICAqIEBwYXJhbSBhZGRyZXNzVHlwZVxuICAgKiBAcGFyYW0gc2lnbmF0dXJlVGhyZXNob2xkXG4gICAqIEBwYXJhbSBrZXlzXG4gICAqL1xuICBjcmVhdGVNdWx0aVNpZ0FkZHJlc3MoYWRkcmVzc1R5cGU6IFNjcmlwdFR5cGUyT2YzLCBzaWduYXR1cmVUaHJlc2hvbGQ6IG51bWJlciwga2V5czogQnVmZmVyW10pOiBNdWx0aVNpZ0FkZHJlc3Mge1xuICAgIGNvbnN0IHtcbiAgICAgIHNjcmlwdFB1YktleTogb3V0cHV0U2NyaXB0LFxuICAgICAgcmVkZWVtU2NyaXB0LFxuICAgICAgd2l0bmVzc1NjcmlwdCxcbiAgICB9ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoa2V5cywgYWRkcmVzc1R5cGUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG91dHB1dFNjcmlwdCxcbiAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgICBhZGRyZXNzOiB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvdXRwdXRTY3JpcHQsIHRoaXMubmV0d29yayksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSB7QHNlZSBiYWNrdXBLZXlSZWNvdmVyeX1cbiAgICogQnVpbGRzIGEgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBCaXRHb1xuICAgKiBAcGFyYW0gcGFyYW1zIC0ge0BzZWUgYmFja3VwS2V5UmVjb3Zlcnl9XG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogUmVjb3ZlclBhcmFtcyk6IFJldHVyblR5cGU8dHlwZW9mIGJhY2t1cEtleVJlY292ZXJ5PiB7XG4gICAgcmV0dXJuIGJhY2t1cEtleVJlY292ZXJ5KHRoaXMsIHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICBhc3luYyByZWNvdmVyVjEocGFyYW1zOiBWMVJlY292ZXJQYXJhbXMpOiBSZXR1cm5UeXBlPHR5cGVvZiB2MUJhY2t1cEtleVJlY292ZXJ5PiB7XG4gICAgcmV0dXJuIHYxQmFja3VwS2V5UmVjb3ZlcnkodGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIGFzeW5jIHN3ZWVwVjEocGFyYW1zOiBWMVN3ZWVwUGFyYW1zKTogUmV0dXJuVHlwZTx0eXBlb2YgdjFTd2VlcD4ge1xuICAgIHJldHVybiB2MVN3ZWVwKHRoaXMsIHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBjb2luIHRoYXQgd2FzIHNlbnQgdG8gd3JvbmcgY2hhaW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4aWQgVGhlIHR4aWQgb2YgdGhlIGZhdWx0eSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY292ZXJ5QWRkcmVzcyBhZGRyZXNzIHRvIHNlbmQgcmVjb3ZlcmVkIGZ1bmRzIHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0IHRoZSB3YWxsZXQgdGhhdCByZWNlaXZlZCB0aGUgZnVuZHNcbiAgICogQHBhcmFtIHBhcmFtcy5yZWNvdmVyeUNvaW4gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0IHRoYXQgcmVjZWl2ZWQgdGhlIGZ1bmRzXG4gICAqIEBwYXJhbSBwYXJhbXMuc2lnbmVkIHJldHVybiBhIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIChkZWZhdWx0PXRydWUpXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy54cHJ2IHRoZSB1bmVuY3J5cHRlZCB4cHJ2ICh1c2VkIGluc3RlYWQgb2Ygd2FsbGV0IHBhc3NwaHJhc2UpXG4gICAqIEBwYXJhbSBwYXJhbXMuYXBpS2V5IGZvciB1dHhvIGNvaW5zIG90aGVyIHRoYW4gW0JUQyxUQlRDXSB0aGlzIGlzIGEgQmxvY2sgQ2hhaXIgYXBpIGtleVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlY292ZXJGcm9tV3JvbmdDaGFpbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFJlY292ZXJGcm9tV3JvbmdDaGFpbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlcj4gfCBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyPj4ge1xuICAgIGNvbnN0IHsgdHhpZCwgcmVjb3ZlcnlBZGRyZXNzLCB3YWxsZXQsIHdhbGxldFBhc3NwaHJhc2UsIHhwcnYsIGFwaUtleSB9ID0gcGFyYW1zO1xuXG4gICAgLy8gcGFyYW1zLnJlY292ZXJ5Q29pbiB1c2VkIHRvIGJlIHBhcmFtcy5jb2luLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IHJlY292ZXJ5Q29pbiA9IHBhcmFtcy5jb2luIHx8IHBhcmFtcy5yZWNvdmVyeUNvaW47XG4gICAgaWYgKCFyZWNvdmVyeUNvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBvYmplY3QgcmVjb3ZlcnlDb2luJyk7XG4gICAgfVxuICAgIC8vIHNpZ25lZCBzaG91bGQgZGVmYXVsdCB0byB0cnVlLCBhbmQgb25seSBiZSBkaXNhYmxlZCBpZiBleHBsaWNpdGx5IHNldCB0byBmYWxzZSAobm90IHVuZGVmaW5lZClcbiAgICBjb25zdCBzaWduZWQgPSBwYXJhbXMuc2lnbmVkICE9PSBmYWxzZTtcblxuICAgIGNvbnN0IHNvdXJjZUNvaW5GYW1pbHkgPSB0aGlzLmdldEZhbWlseSgpO1xuICAgIGNvbnN0IHJlY292ZXJ5Q29pbkZhbWlseSA9IHJlY292ZXJ5Q29pbi5nZXRGYW1pbHkoKTtcbiAgICBjb25zdCBzdXBwb3J0ZWRSZWNvdmVyeUNvaW5zID0gc3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJpZXNbc291cmNlQ29pbkZhbWlseV07XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChzdXBwb3J0ZWRSZWNvdmVyeUNvaW5zKSB8fCAhc3VwcG9ydGVkUmVjb3ZlcnlDb2lucy5pbmNsdWRlcyhyZWNvdmVyeUNvaW5GYW1pbHkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY292ZXJ5IG9mICR7c291cmNlQ29pbkZhbWlseX0gYmFsYW5jZXMgZnJvbSAke3JlY292ZXJ5Q29pbkZhbWlseX0gd2FsbGV0cyBpcyBub3Qgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZWNvdmVyQ3Jvc3NDaGFpbjxUTnVtYmVyPih0aGlzLmJpdGdvLCB7XG4gICAgICBzb3VyY2VDb2luOiB0aGlzLFxuICAgICAgcmVjb3ZlcnlDb2luLFxuICAgICAgd2FsbGV0SWQ6IHdhbGxldCxcbiAgICAgIHR4aWQsXG4gICAgICByZWNvdmVyeUFkZHJlc3MsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBzaWduZWQgPyB3YWxsZXRQYXNzcGhyYXNlIDogdW5kZWZpbmVkLFxuICAgICAgeHBydjogc2lnbmVkID8geHBydiA6IHVuZGVmaW5lZCxcbiAgICAgIGFwaUtleSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBiaXAzMiBrZXkgcGFpclxuICAgKlxuICAgKiBAcGFyYW0gc2VlZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3Qgd2l0aCBnZW5lcmF0ZWQgcHViIGFuZCBwcnZcbiAgICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkOiBCdWZmZXIpOiB7IHB1Yjogc3RyaW5nOyBwcnY6IHN0cmluZyB9IHtcbiAgICBpZiAoIXNlZWQpIHtcbiAgICAgIC8vIEFuIGV4dGVuZGVkIHByaXZhdGUga2V5IGhhcyBib3RoIGEgbm9ybWFsIDI1NiBiaXQgcHJpdmF0ZSBrZXkgYW5kIGEgMjU2XG4gICAgICAvLyBiaXQgY2hhaW4gY29kZSwgYm90aCBvZiB3aGljaCBtdXN0IGJlIHJhbmRvbS4gNTEyIGJpdHMgaXMgdGhlcmVmb3JlIHRoZVxuICAgICAgLy8gbWF4aW11bSBlbnRyb3B5IGFuZCBnaXZlcyB1cyBtYXhpbXVtIHNlY3VyaXR5IGFnYWluc3QgY3JhY2tpbmcuXG4gICAgICBzZWVkID0gcmFuZG9tQnl0ZXMoNTEyIC8gOCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dGVuZGVkS2V5ID0gYmlwMzIuZnJvbVNlZWQoc2VlZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YjogZXh0ZW5kZWRLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgcHJ2OiBleHRlbmRlZEtleS50b0Jhc2U1OCgpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNob3VsZERlZmF1bHRUb1BzYnRUeEZvcm1hdChidWlsZFBhcmFtczogRXh0cmFQcmVidWlsZFBhcmFtc09wdGlvbnMgJiB7IHdhbGxldDogV2FsbGV0IH0pIHtcbiAgICBjb25zdCB3YWxsZXRGbGFnTXVzaWdLcCA9IGJ1aWxkUGFyYW1zLndhbGxldC5mbGFnKCdtdXNpZ0twJykgPT09ICd0cnVlJztcbiAgICBjb25zdCBpc0hvdFdhbGxldCA9IGJ1aWxkUGFyYW1zLndhbGxldC50eXBlKCkgPT09ICdob3QnO1xuXG4gICAgLy8gaWYgbm90IHR4Rm9ybWF0IGlzIGFscmVhZHkgc3BlY2lmaWVkIGZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGRlZmF1bHQgdG8gcHNidCBmb3JtYXRcbiAgICByZXR1cm4gKFxuICAgICAgYnVpbGRQYXJhbXMudHhGb3JtYXQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGJ1aWxkUGFyYW1zLndhbGxldC5zdWJUeXBlKCkgPT09ICdkaXN0cmlidXRlZEN1c3RvZHknIHx8XG4gICAgICAgIC8vIGRlZmF1bHQgdG8gdGVzdG5ldCBmb3IgYWxsIHV0eG8gY29pbnMgZXhjZXB0IHpjYXNoXG4gICAgICAgIChpc1Rlc3RuZXQodGhpcy5uZXR3b3JrKSAmJlxuICAgICAgICAgIC8vIEZJWE1FKEJUQy0xMzIyKTogZml4IHpjYXNoIFBTQlQgc3VwcG9ydFxuICAgICAgICAgIGdldE1haW5uZXQodGhpcy5uZXR3b3JrKSAhPT0gdXR4b2xpYi5uZXR3b3Jrcy56Y2FzaCAmJlxuICAgICAgICAgIGlzSG90V2FsbGV0KSB8fFxuICAgICAgICAvLyBpZiBtYWlubmV0LCBvbmx5IGRlZmF1bHQgdG8gcHNidCBmb3IgYnRjIGhvdCB3YWxsZXRzXG4gICAgICAgIChpc01haW5uZXQodGhpcy5uZXR3b3JrKSAmJiBnZXRNYWlubmV0KHRoaXMubmV0d29yaykgPT09IHV0eG9saWIubmV0d29ya3MuYml0Y29pbiAmJiBpc0hvdFdhbGxldCkgfHxcbiAgICAgICAgLy8gZGVmYXVsdCB0byBwc2J0IGlmIGl0IGhhcyB0aGUgd2FsbGV0IGZsYWdcbiAgICAgICAgd2FsbGV0RmxhZ011c2lnS3ApXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEV4dHJhUHJlYnVpbGRQYXJhbXMoYnVpbGRQYXJhbXM6IEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zICYgeyB3YWxsZXQ6IFdhbGxldCB9KTogUHJvbWlzZTx7XG4gICAgdHhGb3JtYXQ/OiAnbGVnYWN5JyB8ICdwc2J0JztcbiAgICBjaGFuZ2VBZGRyZXNzVHlwZT86IFNjcmlwdFR5cGUyT2YzW10gfCBTY3JpcHRUeXBlMk9mMztcbiAgfT4ge1xuICAgIGxldCB0eEZvcm1hdCA9IGJ1aWxkUGFyYW1zLnR4Rm9ybWF0IGFzICdsZWdhY3knIHwgJ3BzYnQnIHwgdW5kZWZpbmVkO1xuICAgIGxldCBjaGFuZ2VBZGRyZXNzVHlwZSA9IGJ1aWxkUGFyYW1zLmNoYW5nZUFkZHJlc3NUeXBlIGFzIFNjcmlwdFR5cGUyT2YzW10gfCBTY3JpcHRUeXBlMk9mMyB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0aGlzLnNob3VsZERlZmF1bHRUb1BzYnRUeEZvcm1hdChidWlsZFBhcmFtcykpIHtcbiAgICAgIHR4Rm9ybWF0ID0gJ3BzYnQnO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBhZGRyZXNzVHlwZSBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGRlZmF1bHQgdG8gcDJ0ck11c2lnMiBmb3IgdGVzdG5ldCBob3Qgd2FsbGV0cyBmb3Igc3RhZ2VkIHJvbGxvdXQgb2YgcDJ0ck11c2lnMlxuICAgIGlmIChcbiAgICAgIGJ1aWxkUGFyYW1zLmFkZHJlc3NUeXBlID09PSB1bmRlZmluZWQgJiYgLy8gYWRkcmVzc1R5cGUgaXMgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYGNoYW5nZUFkZHJlc3NgXG4gICAgICBidWlsZFBhcmFtcy5jaGFuZ2VBZGRyZXNzVHlwZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBidWlsZFBhcmFtcy5jaGFuZ2VBZGRyZXNzID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGJ1aWxkUGFyYW1zLndhbGxldC50eXBlKCkgPT09ICdob3QnXG4gICAgKSB7XG4gICAgICBjaGFuZ2VBZGRyZXNzVHlwZSA9IFsncDJ0ck11c2lnMicsICdwMndzaCcsICdwMnNoUDJ3c2gnLCAncDJzaCcsICdwMnRyJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4Rm9ybWF0LFxuICAgICAgY2hhbmdlQWRkcmVzc1R5cGUsXG4gICAgfTtcbiAgfVxuXG4gIHByZUNyZWF0ZUJpdEdvKHBhcmFtczogUHJlY3JlYXRlQml0R29PcHRpb25zKTogdm9pZCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXN5bmMgcHJlc2lnblRyYW5zYWN0aW9uKHBhcmFtczogUHJlc2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHBhcmFtcy53YWxsZXREYXRhICYmIGlzVXR4b1dhbGxldERhdGEocGFyYW1zLndhbGxldERhdGEpICYmIGlzRGVzY3JpcHRvcldhbGxldERhdGEocGFyYW1zLndhbGxldERhdGEpKSB7XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHdlIGhhdmUgYSAncHNidC1saXRlJyB0cmFuc2FjdGlvbiBmb3JtYXQsIHdlIHdhbnQgdG8gaW5kaWNhdGUgaW4gc2lnbmluZyB0byBub3QgZmFpbFxuICAgIGNvbnN0IHR4SGV4ID0gKHBhcmFtcy50eEhleCA/PyBwYXJhbXMudHhQcmVidWlsZD8udHhIZXgpIGFzIHN0cmluZztcbiAgICBpZiAoXG4gICAgICB0eEhleCAmJlxuICAgICAgdXR4b2xpYi5iaXRnby5pc1BzYnQodHhIZXggYXMgc3RyaW5nKSAmJlxuICAgICAgdXR4b2xpYi5iaXRnby5pc1BzYnRMaXRlKHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21IZXgodHhIZXgsIHRoaXMubmV0d29yaykpICYmXG4gICAgICBwYXJhbXMuYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeCA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4geyAuLi5wYXJhbXMsIGFsbG93Tm9uU2Vnd2l0U2lnbmluZ1dpdGhvdXRQcmV2VHg6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIGFzeW5jIHN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldChcbiAgICB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gICAga2V5Y2hhaW5zOiBLZXljaGFpbnNUcmlwbGV0XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHdhbGxldFBhcmFtcztcbiAgfVxuXG4gIHRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFJlY292ZXJ5UHJvdmlkZXIoYXBpVG9rZW4/OiBzdHJpbmcpOiBSZWNvdmVyeVByb3ZpZGVyIHtcbiAgICByZXR1cm4gZm9yQ29pbih0aGlzLmdldENoYWluKCksIGFwaVRva2VuKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleSh7IG11bHRpU2lnVHlwZSwgcHVibGljS2V5LCBwcnYgfSkge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RzcyBhdWRpdGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGNvaW4nKTtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJ2KHBydikgJiYgIWlzVmFsaWRYcHJ2KHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAocHVibGljS2V5KSB7XG4gICAgICBjb25zdCBnZW5QdWJLZXkgPSBiaXAzMi5mcm9tQmFzZTU4KHBydikubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuICAgICAgaWYgKGdlblB1YktleSAhPT0gcHVibGljS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHVibGljIGtleSBkb2VzIG5vdCBtYXRjaCBwcml2YXRlIGtleScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19