@bitgo-beta/sdk-core 8.2.1-beta.202 → 8.2.1-beta.2021

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 (732) hide show
  1. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
  2. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
  4. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
  5. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
  6. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
  7. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
  8. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +41 -29
  9. package/dist/src/account-lib/baseCoin/enum.d.ts +58 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +109 -10
  12. package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
  13. package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
  14. package/dist/src/account-lib/baseCoin/errors.js +8 -2
  15. package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
  16. package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
  17. package/dist/src/account-lib/baseCoin/iface.js +26 -18
  18. package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
  19. package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
  20. package/dist/src/account-lib/baseCoin/index.js +8 -5
  21. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
  22. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  23. package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
  24. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
  25. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  26. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
  27. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
  28. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  29. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
  30. package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
  31. package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
  32. package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
  33. package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
  34. package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
  35. package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
  36. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
  37. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
  38. package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
  39. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
  40. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
  41. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
  42. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
  43. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
  44. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
  45. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
  46. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
  47. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
  48. package/dist/src/account-lib/index.js +23 -9
  49. package/dist/src/account-lib/mpc/index.d.ts +1 -1
  50. package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
  51. package/dist/src/account-lib/mpc/index.js +6 -2
  52. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
  53. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  54. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
  55. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
  56. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
  57. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  58. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
  59. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
  60. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  61. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  62. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
  63. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
  64. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
  65. package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
  66. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
  67. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
  68. package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
  69. package/dist/src/account-lib/mpc/tss/index.js +23 -9
  70. package/dist/src/account-lib/mpc/util.d.ts +7 -1
  71. package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
  72. package/dist/src/account-lib/mpc/util.js +24 -1
  73. package/dist/src/account-lib/staking/index.js +6 -2
  74. package/dist/src/account-lib/staking/utils.js +3 -3
  75. package/dist/src/account-lib/util/crypto.d.ts +8 -2
  76. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  77. package/dist/src/account-lib/util/crypto.js +69 -38
  78. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
  79. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  80. package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
  81. package/dist/src/api/bip32path.js +2 -3
  82. package/dist/src/api/index.js +6 -2
  83. package/dist/src/api/types.d.ts +31 -0
  84. package/dist/src/api/types.d.ts.map +1 -1
  85. package/dist/src/api/types.js +1 -1
  86. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -1
  87. package/dist/src/bitgo/address-book/address-book.js +20 -12
  88. package/dist/src/bitgo/address-book/index.js +6 -2
  89. package/dist/src/bitgo/address-book/types.d.ts +36 -36
  90. package/dist/src/bitgo/address-book/types.d.ts.map +1 -1
  91. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +123 -12
  92. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  93. package/dist/src/bitgo/baseCoin/baseCoin.js +203 -16
  94. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +290 -27
  95. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  96. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  97. package/dist/src/bitgo/baseCoin/index.js +6 -2
  98. package/dist/src/bitgo/bip32util.d.ts +3 -16
  99. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  100. package/dist/src/bitgo/bip32util.js +4 -56
  101. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  102. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  103. package/dist/src/bitgo/bitcoin.js +26 -13
  104. package/dist/src/bitgo/bitgoBase.d.ts +17 -4
  105. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  106. package/dist/src/bitgo/bitgoBase.js +1 -1
  107. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  108. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  109. package/dist/src/bitgo/coinFactory.js +26 -3
  110. package/dist/src/bitgo/config.d.ts +3 -101
  111. package/dist/src/bitgo/config.d.ts.map +1 -1
  112. package/dist/src/bitgo/config.js +26 -15
  113. package/dist/src/bitgo/defi/defiVault.d.ts +137 -0
  114. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  115. package/dist/src/bitgo/defi/defiVault.js +379 -0
  116. package/dist/src/bitgo/defi/iDefiVault.d.ts +81 -0
  117. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  118. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  119. package/dist/src/bitgo/defi/index.d.ts +3 -0
  120. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  121. package/dist/src/bitgo/defi/index.js +22 -0
  122. package/dist/src/bitgo/ecdh.d.ts +0 -1
  123. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  124. package/dist/src/bitgo/ecdh.js +26 -13
  125. package/dist/src/bitgo/enterprise/enterprise.d.ts +9 -4
  126. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  127. package/dist/src/bitgo/enterprise/enterprise.js +47 -21
  128. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  129. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +5 -3
  130. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  131. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  132. package/dist/src/bitgo/enterprise/index.js +6 -2
  133. package/dist/src/bitgo/environments.d.ts +68 -3
  134. package/dist/src/bitgo/environments.d.ts.map +1 -1
  135. package/dist/src/bitgo/environments.js +414 -34
  136. package/dist/src/bitgo/errors.d.ts +182 -1
  137. package/dist/src/bitgo/errors.d.ts.map +1 -1
  138. package/dist/src/bitgo/errors.js +177 -3
  139. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  140. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  141. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  142. package/dist/src/bitgo/index.d.ts +5 -1
  143. package/dist/src/bitgo/index.d.ts.map +1 -1
  144. package/dist/src/bitgo/index.js +31 -11
  145. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  146. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  147. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  148. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  149. package/dist/src/bitgo/internal/index.js +6 -2
  150. package/dist/src/bitgo/internal/internal.js +5 -6
  151. package/dist/src/bitgo/internal/keycard.d.ts +12 -8
  152. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  153. package/dist/src/bitgo/internal/keycard.js +60 -48
  154. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +14 -0
  155. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  156. package/dist/src/bitgo/keychain/decryptKeychain.js +36 -0
  157. package/dist/src/bitgo/keychain/iKeychains.d.ts +128 -11
  158. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  159. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  160. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  161. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  162. package/dist/src/bitgo/keychain/index.js +7 -2
  163. package/dist/src/bitgo/keychain/keychains.d.ts +55 -7
  164. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  165. package/dist/src/bitgo/keychain/keychains.js +282 -52
  166. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  167. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  168. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  169. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  170. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  171. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  172. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  173. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  174. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  175. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  176. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  177. package/dist/src/bitgo/market/index.js +6 -2
  178. package/dist/src/bitgo/market/markets.js +23 -9
  179. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +5 -1
  180. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  181. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  182. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  183. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  184. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  185. package/dist/src/bitgo/pendingApproval/pendingApproval.js +246 -111
  186. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  187. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  188. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  189. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  190. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  191. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  192. package/dist/src/bitgo/proofs/index.js +6 -0
  193. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  194. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  195. package/dist/src/bitgo/proofs/types.js +80 -0
  196. package/dist/src/bitgo/recovery/index.js +6 -2
  197. package/dist/src/bitgo/recovery/initiate.d.ts +13 -3
  198. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  199. package/dist/src/bitgo/recovery/initiate.js +49 -41
  200. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +88 -0
  201. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  202. package/dist/src/bitgo/safe/derivableEd25519Pub.js +204 -0
  203. package/dist/src/bitgo/safe/iSafe.d.ts +87 -0
  204. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
  205. package/dist/src/bitgo/safe/iSafe.js +3 -0
  206. package/dist/src/bitgo/safe/iSafes.d.ts +94 -0
  207. package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
  208. package/dist/src/bitgo/safe/iSafes.js +3 -0
  209. package/dist/src/bitgo/safe/index.d.ts +7 -0
  210. package/dist/src/bitgo/safe/index.d.ts.map +1 -0
  211. package/dist/src/bitgo/safe/index.js +23 -0
  212. package/dist/src/bitgo/safe/safe.d.ts +61 -0
  213. package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
  214. package/dist/src/bitgo/safe/safe.js +230 -0
  215. package/dist/src/bitgo/safe/safeDerivation.d.ts +30 -0
  216. package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -0
  217. package/dist/src/bitgo/safe/safeDerivation.js +122 -0
  218. package/dist/src/bitgo/safe/safes.d.ts +107 -0
  219. package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
  220. package/dist/src/bitgo/safe/safes.js +315 -0
  221. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
  222. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  223. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  224. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  225. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  226. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  227. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  228. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  229. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  230. package/dist/src/bitgo/staking/iStakingWallet.d.ts +157 -8
  231. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  232. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  233. package/dist/src/bitgo/staking/index.d.ts +3 -0
  234. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  235. package/dist/src/bitgo/staking/index.js +9 -2
  236. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  237. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  238. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  239. package/dist/src/bitgo/trading/iTradingAccount.d.ts +13 -1
  240. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  241. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  242. package/dist/src/bitgo/trading/index.d.ts +1 -0
  243. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  244. package/dist/src/bitgo/trading/index.js +7 -2
  245. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  246. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  247. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  248. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  249. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  250. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  251. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  252. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  253. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  254. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  255. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  256. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  257. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  258. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  259. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  260. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  261. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  262. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  263. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  264. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  265. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  266. package/dist/src/bitgo/trading/network/index.d.ts +2 -0
  267. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -1
  268. package/dist/src/bitgo/trading/network/index.js +8 -2
  269. package/dist/src/bitgo/trading/network/network.d.ts +4 -3
  270. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
  271. package/dist/src/bitgo/trading/network/network.js +24 -27
  272. package/dist/src/bitgo/trading/network/types.d.ts +79 -46
  273. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
  274. package/dist/src/bitgo/trading/network/types.js +1 -1
  275. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  276. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  277. package/dist/src/bitgo/trading/network/utils.js +54 -0
  278. package/dist/src/bitgo/trading/tradingAccount.d.ts +15 -1
  279. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  280. package/dist/src/bitgo/trading/tradingAccount.js +55 -7
  281. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +49 -0
  282. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  283. package/dist/src/bitgo/tss/bitgoPubKeys.js +92 -0
  284. package/dist/src/bitgo/tss/common.d.ts +41 -6
  285. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  286. package/dist/src/bitgo/tss/common.js +124 -17
  287. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  288. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  289. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  290. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  291. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  292. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  293. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  294. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  295. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  296. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  297. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  298. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  299. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  300. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  301. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  302. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +42 -0
  303. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  304. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +104 -0
  305. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  306. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  307. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  308. package/dist/src/bitgo/tss/index.d.ts +3 -2
  309. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  310. package/dist/src/bitgo/tss/index.js +26 -10
  311. package/dist/src/bitgo/tss/types.d.ts +3 -3
  312. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  313. package/dist/src/bitgo/tss/types.js +2 -2
  314. package/dist/src/bitgo/types.d.ts +3 -3
  315. package/dist/src/bitgo/types.d.ts.map +1 -1
  316. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +10 -0
  317. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  318. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +76 -14
  319. package/dist/src/bitgo/utils/codecProps.js +24 -11
  320. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  321. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  322. package/dist/src/bitgo/utils/codecs.js +59 -0
  323. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  324. package/dist/src/bitgo/utils/decode.js +30 -16
  325. package/dist/src/bitgo/utils/index.d.ts +4 -2
  326. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  327. package/dist/src/bitgo/utils/index.js +27 -11
  328. package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
  329. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  330. package/dist/src/bitgo/utils/messageTypes.js +17 -0
  331. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  332. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  333. package/dist/src/bitgo/utils/mpcUtils.js +175 -14
  334. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  335. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  336. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  337. package/dist/src/bitgo/utils/opengpgUtils.d.ts +11 -7
  338. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  339. package/dist/src/bitgo/utils/opengpgUtils.js +79 -62
  340. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  341. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  342. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  343. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  344. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  345. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  346. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  347. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  348. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  349. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  350. package/dist/src/bitgo/utils/triple.js +2 -3
  351. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
  352. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  353. package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
  354. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +94 -17
  355. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  356. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +305 -45
  357. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +432 -55
  358. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  359. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  360. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  361. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  362. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  363. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  364. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  365. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  366. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +25 -51
  367. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  368. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +173 -246
  369. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +216 -0
  370. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  371. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1053 -0
  372. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  373. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  374. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +16 -0
  375. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  376. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  377. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  378. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  379. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  380. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  381. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  382. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  383. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  384. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  385. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  386. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
  387. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  388. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  389. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  390. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +38 -11
  391. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  392. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +254 -96
  393. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +204 -0
  394. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  395. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +862 -0
  396. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  397. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  398. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +16 -0
  399. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
  400. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  401. package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
  402. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +12 -7
  403. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  404. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  405. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  406. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  407. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  408. package/dist/src/bitgo/utils/tss/index.d.ts +5 -0
  409. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  410. package/dist/src/bitgo/utils/tss/index.js +29 -10
  411. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  412. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  413. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  414. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +41 -0
  415. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  416. package/dist/src/bitgo/utils/tss/recipientUtils.js +142 -0
  417. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts +29 -0
  418. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts.map +1 -0
  419. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.js +126 -0
  420. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts +4 -0
  421. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts.map +1 -0
  422. package/dist/src/bitgo/utils/tss/redpallas/index.js +20 -0
  423. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +27 -0
  424. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  425. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.js +43 -0
  426. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts +45 -0
  427. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts.map +1 -0
  428. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.js +55 -0
  429. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts +8 -0
  430. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts.map +1 -0
  431. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.js +13 -0
  432. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts +12 -0
  433. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts.map +1 -0
  434. package/dist/src/bitgo/utils/tss/signableConsistency.js +9 -0
  435. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  436. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  437. package/dist/src/bitgo/utils/txRequest.js +49 -0
  438. package/dist/src/bitgo/utils/util.js +24 -10
  439. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  440. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  441. package/dist/src/bitgo/utils/wallet.js +48 -0
  442. package/dist/src/bitgo/v1Wallets.d.ts +170 -0
  443. package/dist/src/bitgo/v1Wallets.d.ts.map +1 -0
  444. package/dist/src/bitgo/v1Wallets.js +3 -0
  445. package/dist/src/bitgo/wallet/BuildParams.d.ts +81 -1
  446. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  447. package/dist/src/bitgo/wallet/BuildParams.js +85 -11
  448. package/dist/src/bitgo/wallet/iWallet.d.ts +580 -31
  449. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  450. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  451. package/dist/src/bitgo/wallet/iWallets.d.ts +310 -16
  452. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  453. package/dist/src/bitgo/wallet/iWallets.js +84 -3
  454. package/dist/src/bitgo/wallet/index.d.ts +1 -0
  455. package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
  456. package/dist/src/bitgo/wallet/index.js +7 -2
  457. package/dist/src/bitgo/wallet/safeKeychain.d.ts +52 -0
  458. package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -0
  459. package/dist/src/bitgo/wallet/safeKeychain.js +97 -0
  460. package/dist/src/bitgo/wallet/wallet.d.ts +365 -28
  461. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  462. package/dist/src/bitgo/wallet/wallet.js +2202 -381
  463. package/dist/src/bitgo/wallet/wallets.d.ts +93 -4
  464. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  465. package/dist/src/bitgo/wallet/wallets.js +1242 -155
  466. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  467. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  468. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  469. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  470. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  471. package/dist/src/bitgo/walletUtil/index.js +19 -0
  472. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  473. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  474. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  475. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  476. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  477. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  478. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  479. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  480. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  481. package/dist/src/bitgo/webhook/index.js +6 -2
  482. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  483. package/dist/src/coins/fiat.d.ts +45 -0
  484. package/dist/src/coins/fiat.d.ts.map +1 -0
  485. package/dist/src/coins/fiat.js +94 -0
  486. package/dist/src/coins/index.d.ts +1 -6
  487. package/dist/src/coins/index.d.ts.map +1 -1
  488. package/dist/src/coins/index.js +7 -8
  489. package/dist/src/coins/ofc.d.ts +21 -2
  490. package/dist/src/coins/ofc.d.ts.map +1 -1
  491. package/dist/src/coins/ofc.js +29 -3
  492. package/dist/src/coins/ofcToken.d.ts +15 -4
  493. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  494. package/dist/src/coins/ofcToken.js +43 -5
  495. package/dist/src/coins/susd.d.ts +3 -2
  496. package/dist/src/coins/susd.d.ts.map +1 -1
  497. package/dist/src/coins/susd.js +5 -1
  498. package/dist/src/common.js +27 -13
  499. package/dist/src/index.d.ts +9 -1
  500. package/dist/src/index.d.ts.map +1 -1
  501. package/dist/src/index.js +40 -11
  502. package/dist/src/lightning.d.ts +20 -0
  503. package/dist/src/lightning.d.ts.map +1 -0
  504. package/dist/src/lightning.js +13 -0
  505. package/dist/src/units.js +5 -6
  506. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  507. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  508. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  509. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  510. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  511. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  512. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  513. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  514. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  515. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  516. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  517. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  518. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  519. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  520. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  521. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  522. package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
  523. package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
  524. package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
  525. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  526. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  527. package/dist/test/unit/bitgo/defi/defiVault.js +600 -0
  528. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  529. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  530. package/dist/test/unit/bitgo/environment.js +38 -0
  531. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  532. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  533. package/dist/test/unit/bitgo/errors.js +262 -0
  534. package/dist/test/unit/bitgo/keychain/keychains.d.ts +2 -0
  535. package/dist/test/unit/bitgo/keychain/keychains.d.ts.map +1 -0
  536. package/dist/test/unit/bitgo/keychain/keychains.js +138 -0
  537. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  538. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  539. package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
  540. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts +2 -0
  541. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  542. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +137 -0
  543. package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +197 -0
  544. package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
  545. package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
  546. package/dist/test/unit/bitgo/safe/safe.js +277 -0
  547. package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
  548. package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
  549. package/dist/test/unit/bitgo/safe/safes.js +364 -0
  550. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  551. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  552. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  553. package/dist/test/unit/bitgo/trading/network/network.test.d.ts +2 -0
  554. package/dist/test/unit/bitgo/trading/network/network.test.d.ts.map +1 -0
  555. package/dist/test/unit/bitgo/trading/network/network.test.js +136 -0
  556. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  557. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  558. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  559. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts +2 -0
  560. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  561. package/dist/test/unit/bitgo/tss/bitgoPubKeys.js +66 -0
  562. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +45 -4
  563. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  564. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  565. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  566. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts +2 -0
  567. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts.map +1 -0
  568. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.js +106 -0
  569. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  570. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  571. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  572. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  573. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  574. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  575. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
  576. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  577. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  578. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +348 -0
  579. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  580. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  581. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  582. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  583. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  584. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +999 -0
  585. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  586. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  587. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  588. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  589. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  590. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  591. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  592. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  593. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1918 -0
  594. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  595. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  596. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
  597. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  598. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  599. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  600. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  601. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  602. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +374 -0
  603. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +2 -0
  604. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  605. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.js +80 -0
  606. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts +2 -0
  607. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts.map +1 -0
  608. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.js +279 -0
  609. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts +2 -0
  610. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts.map +1 -0
  611. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.js +111 -0
  612. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  613. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  614. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  615. package/dist/test/unit/bitgo/utils/wallet.d.ts +2 -0
  616. package/dist/test/unit/bitgo/utils/wallet.d.ts.map +1 -0
  617. package/dist/test/unit/bitgo/utils/wallet.js +55 -0
  618. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  619. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  620. package/dist/test/unit/bitgo/wallet/BuildParams.js +141 -0
  621. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +79 -9
  622. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  623. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  624. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  625. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts +2 -0
  626. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts.map +1 -0
  627. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.js +88 -0
  628. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  629. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  630. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  631. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  632. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  633. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  634. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  635. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  636. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  637. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts +2 -0
  638. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts.map +1 -0
  639. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.js +20 -0
  640. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  641. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  642. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  643. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts +5 -0
  644. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts.map +1 -0
  645. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +671 -0
  646. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  647. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  648. package/dist/test/unit/bitgo/wallet/tokenApproval.js +201 -0
  649. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  650. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  651. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  652. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  653. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  654. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +69 -0
  655. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  656. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  657. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  658. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  659. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  660. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +293 -0
  661. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  662. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  663. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  664. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  665. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  666. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +675 -0
  667. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts +2 -0
  668. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts.map +1 -0
  669. package/dist/test/unit/bitgo/wallet/walletsGoAccount.js +150 -0
  670. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  671. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  672. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
  673. package/dist/test/unit/coins/ofc.d.ts +2 -0
  674. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  675. package/dist/test/unit/coins/ofc.js +124 -0
  676. package/dist/test/unit/lightning.d.ts +2 -0
  677. package/dist/test/unit/lightning.d.ts.map +1 -0
  678. package/dist/test/unit/lightning.js +23 -0
  679. package/dist/test/unit/units.d.ts.map +1 -1
  680. package/dist/test/unit/units.js +64 -64
  681. package/dist/tsconfig.tsbuildinfo +1 -1
  682. package/package.json +23 -21
  683. package/.eslintignore +0 -5
  684. package/CHANGELOG.md +0 -1712
  685. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  686. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  687. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  688. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  689. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  690. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  691. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  692. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  693. package/dist/src/bitgo/lightning/index.js +0 -17
  694. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  695. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  696. package/dist/src/bitgo/lightning/lightning.js +0 -111
  697. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  698. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  699. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  700. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  701. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  702. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  703. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  704. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  705. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  706. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  707. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  708. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  709. package/dist/src/coins/fiateur.d.ts +0 -31
  710. package/dist/src/coins/fiateur.d.ts.map +0 -1
  711. package/dist/src/coins/fiateur.js +0 -57
  712. package/dist/src/coins/fiatgbp.d.ts +0 -31
  713. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  714. package/dist/src/coins/fiatgbp.js +0 -57
  715. package/dist/src/coins/fiatusd.d.ts +0 -31
  716. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  717. package/dist/src/coins/fiatusd.js +0 -57
  718. package/dist/src/coins/tfiateur.d.ts +0 -11
  719. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  720. package/dist/src/coins/tfiateur.js +0 -17
  721. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  722. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  723. package/dist/src/coins/tfiatgbp.js +0 -17
  724. package/dist/src/coins/tfiatusd.d.ts +0 -11
  725. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  726. package/dist/src/coins/tfiatusd.js +0 -17
  727. package/dist/src/openssl/index.d.ts +0 -5
  728. package/dist/src/openssl/index.d.ts.map +0 -1
  729. package/dist/src/openssl/index.js +0 -9
  730. package/dist/test/unit/openssl.d.ts +0 -2
  731. package/dist/test/unit/openssl.d.ts.map +0 -1
  732. package/dist/test/unit/openssl.js +0 -39
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[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);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -11,23 +15,34 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
11
15
  }) : function(o, v) {
12
16
  o["default"] = v;
13
17
  });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
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
+ })();
21
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
22
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
37
  };
24
38
  Object.defineProperty(exports, "__esModule", { value: true });
25
39
  exports.Keychains = void 0;
26
- const _ = __importStar(require("lodash"));
27
40
  const assert_1 = __importDefault(require("assert"));
41
+ const _ = __importStar(require("lodash"));
28
42
  const common = __importStar(require("../../common"));
43
+ const errors_1 = require("../errors");
44
+ const derivableEd25519Pub_1 = require("../safe/derivableEd25519Pub");
29
45
  const utils_1 = require("../utils");
30
- const decode_1 = require("../utils/decode");
31
46
  const ovcJsonCodec_1 = require("./ovcJsonCodec");
32
47
  class Keychains {
33
48
  constructor(bitgo, baseCoin) {
@@ -107,21 +122,28 @@ class Keychains {
107
122
  continue;
108
123
  }
109
124
  try {
110
- const updatedKeychain = this.updateSingleKeychainPassword({
125
+ const updatedKeychain = await this.updateSingleKeychainPassword({
111
126
  keychain: key,
112
127
  oldPassword: params.oldPassword,
113
128
  newPassword: params.newPassword,
129
+ encryptionVersion: params.encryptionVersion,
114
130
  });
115
131
  if (updatedKeychain.encryptedPrv) {
116
- const changedKeyIdentifier = updatedKeychain.type === 'tss' ? updatedKeychain.commonKeychain : updatedKeychain.pub;
132
+ // Both TSS and multi-user-ofc keys have multiple public keys in their key document and thus need to use objectID
133
+ const changedKeyIdentifier = updatedKeychain.type === 'tss' || Keychains.isMultiUserKey(updatedKeychain)
134
+ ? updatedKeychain.id
135
+ : updatedKeychain.pub;
117
136
  if (changedKeyIdentifier) {
118
137
  changedKeys[changedKeyIdentifier] = updatedKeychain.encryptedPrv;
119
138
  }
120
139
  }
121
140
  }
122
141
  catch (e) {
123
- // if the password was incorrect, silence the error, throw otherwise
124
- if (!e.message.includes('private key is incorrect')) {
142
+ // if the password was incorrect, silence the error, throw otherwise.
143
+ // updateSingleKeychainPassword wraps a wrong-password (or corrupt input) failure as
144
+ // 'failed to update keychain password: ...', so treat that as a skip-able error.
145
+ if (!e.message.includes('private key is incorrect') &&
146
+ !e.message.includes('failed to update keychain password')) {
125
147
  throw e;
126
148
  }
127
149
  }
@@ -136,14 +158,41 @@ class Keychains {
136
158
  return changedKeys;
137
159
  }
138
160
  /**
139
- * Update the password used to decrypt a single keychain
161
+ * Determine the encryption version of a ciphertext by inspecting its "v" field.
162
+ * - v1 (SJCL / PBKDF2-SHA256 + AES-256-CCM): "v" absent or explicitly 1
163
+ * - v2 (Argon2id + AES-256-GCM): "v" === 2
164
+ * Throws on unrecognized values so callers cannot silently mis-handle unknown envelopes.
165
+ */
166
+ getEncryptionVersion(ciphertext) {
167
+ let envelope;
168
+ try {
169
+ envelope = JSON.parse(ciphertext);
170
+ }
171
+ catch (e) {
172
+ throw new Error(`Failed to parse ciphertext envelope: ${e.message}`);
173
+ }
174
+ if (envelope.v === 2) {
175
+ return 2;
176
+ }
177
+ if (envelope.v === undefined || envelope.v === 1) {
178
+ return 1;
179
+ }
180
+ throw new Error(`Unrecognized encryption version: ${String(envelope.v)}`);
181
+ }
182
+ /**
183
+ * Update the password used to decrypt a single keychain. Defaults to preserving the
184
+ * source envelope version (v1 stays v1, v2 stays v2), so this is a no-op with respect to
185
+ * encryption version unless the caller opts in. Pass `encryptionVersion: 2` to explicitly
186
+ * upgrade a v1 (SJCL) keychain to v2 (Argon2id + AES-256-GCM) as part of the password change
187
+ * (e.g. once a caller is ready, after the Sept 15 breaking-change window closes).
140
188
  * @param params
141
189
  * @param params.keychain - The keychain whose password should be updated
142
190
  * @param params.oldPassword - The old password used for encrypting the key
143
191
  * @param params.newPassword - The new password to be used for encrypting the key
144
- * @returns {object}
192
+ * @param params.encryptionVersion - Optional envelope version to emit; defaults to the source envelope's version
193
+ * @returns {Promise<Keychain>}
145
194
  */
146
- updateSingleKeychainPassword(params = {}) {
195
+ async updateSingleKeychainPassword(params = {}) {
147
196
  if (!_.isString(params.oldPassword)) {
148
197
  throw new Error('expected old password to be a string');
149
198
  }
@@ -155,20 +204,44 @@ class Keychains {
155
204
  }
156
205
  const oldEncryptedPrv = params.keychain.encryptedPrv;
157
206
  try {
158
- const decryptedPrv = this.bitgo.decrypt({ input: oldEncryptedPrv, password: params.oldPassword });
159
- const newEncryptedPrv = this.bitgo.encrypt({ input: decryptedPrv, password: params.newPassword });
207
+ const decryptedPrv = await this.bitgo.decrypt({ input: oldEncryptedPrv, password: params.oldPassword });
208
+ const newEncryptedPrv = await this.bitgo.encrypt({
209
+ input: decryptedPrv,
210
+ password: params.newPassword,
211
+ encryptionVersion: params.encryptionVersion ?? this.getEncryptionVersion(oldEncryptedPrv),
212
+ });
160
213
  return _.assign({}, params.keychain, { encryptedPrv: newEncryptedPrv });
161
214
  }
162
215
  catch (e) {
163
216
  // catching an error here means that the password was incorrect or, less likely, the input to decrypt is corrupted
164
- throw new Error('password used to decrypt keychain private key is incorrect');
217
+ const errorDetail = e instanceof Error ? e.message : String(e);
218
+ throw new Error(`failed to update keychain password: ${errorDetail}`);
165
219
  }
166
220
  }
221
+ /**
222
+ * Decrypt an encrypted private key with `passphrase` and re-encrypt it as a v2
223
+ * (Argon2id + AES-256-GCM) envelope with the same passphrase.
224
+ *
225
+ * Used to upgrade legacy v1 (SJCL) envelopes to v2 without changing the passphrase.
226
+ * Callers that need to try a fallback passphrase (e.g. an original passphrase from
227
+ * before a password rotation) should handle that themselves — this primitive does one
228
+ * thing and lets decryption errors surface directly.
229
+ */
230
+ async reencryptAsV2(encryptedPrv, passphrase) {
231
+ const prv = await this.bitgo.decrypt({ input: encryptedPrv, password: passphrase });
232
+ return this.bitgo.encrypt({ input: prv, password: passphrase, encryptionVersion: 2 });
233
+ }
167
234
  /**
168
235
  * Create a public/private key pair
169
- * @param params.seed
236
+ * @param params - optional params
237
+ * @param params.seed optional - seed to use for keypair generation
238
+ * @param params.isRootKey optional - whether the resulting keypair should be a root key
239
+ * @returns {KeyPair} - the generated keypair
170
240
  */
171
241
  create(params = {}) {
242
+ if (params?.isRootKey) {
243
+ return this.baseCoin.generateRootKeyPair(params.seed);
244
+ }
172
245
  return this.baseCoin.generateKeyPair(params.seed);
173
246
  }
174
247
  /**
@@ -186,6 +259,9 @@ class Keychains {
186
259
  'originalPasscodeEncryptionCode',
187
260
  'enterprise',
188
261
  'derivedFromParentWithSeed',
262
+ 'derivedFromParentWithHardenedPath',
263
+ 'parent',
264
+ 'safeId',
189
265
  ]);
190
266
  if (!_.isUndefined(params.disableKRSEmail)) {
191
267
  if (!_.isBoolean(params.disableKRSEmail)) {
@@ -209,6 +285,8 @@ class Keychains {
209
285
  originalPasscodeEncryptionCode: params.originalPasscodeEncryptionCode,
210
286
  enterprise: params.enterprise,
211
287
  derivedFromParentWithSeed: params.derivedFromParentWithSeed,
288
+ derivedFromParentWithHardenedPath: params.derivedFromParentWithHardenedPath,
289
+ parent: params.parent,
212
290
  disableKRSEmail: params.disableKRSEmail,
213
291
  krsSpecific: params.krsSpecific,
214
292
  keyShares: params.keyShares,
@@ -216,6 +294,11 @@ class Keychains {
216
294
  backupGPGPublicKey: params.backupGPGPublicKey,
217
295
  algoUsed: params.algoUsed,
218
296
  isDistributedCustody: params.isDistributedCustody,
297
+ isMPCv2: params.isMPCv2,
298
+ coinSpecific: params.coinSpecific,
299
+ webauthnDevices: params.webauthnDevices,
300
+ webauthnInfo: params.webauthnInfo,
301
+ safeId: params.safeId,
219
302
  })
220
303
  .result();
221
304
  }
@@ -240,6 +323,27 @@ class Keychains {
240
323
  // if the provider is undefined, we generate a local key and add the source details
241
324
  const key = this.create();
242
325
  _.extend(params, key);
326
+ if (params.passphrase !== undefined) {
327
+ _.extend(params, {
328
+ encryptedPrv: await this.bitgo.encrypt({
329
+ input: key.prv,
330
+ password: params.passphrase,
331
+ encryptionVersion: params.encryptionVersion,
332
+ }),
333
+ });
334
+ }
335
+ }
336
+ // Wallet Safes v1 slot ④ (`ed25519Multisig`): make the backup root soft-derivable by folding a
337
+ // fresh chain code into `pub`. Nothing else on the wire changes — the chain code has no field of
338
+ // its own, and callers recover it with `decodeDerivableEd25519Pub` on the returned pub.
339
+ //
340
+ // The slot is identified from the generated pub itself: `safeId` marks it as a safe root, and a
341
+ // StrKey ed25519 pub narrows it to slot ④. That is exact — slot ① roots are secp256k1 (an xpub,
342
+ // which already carries its own chain code) and slots ②③ are MPC, which run through `createMpc`
343
+ // and never reach here.
344
+ const withKey = params;
345
+ if (params.safeId !== undefined && withKey.pub !== undefined && (0, derivableEd25519Pub_1.isValidEd25519StrKeyPublicKey)(withKey.pub)) {
346
+ withKey.pub = (0, derivableEd25519Pub_1.encodeDerivableEd25519Pub)(withKey.pub, (0, derivableEd25519Pub_1.generateEd25519ChainCodeBase32)());
243
347
  }
244
348
  const serverResponse = await this.add(params);
245
349
  return _.extend({}, serverResponse, _.pick(params, ['prv', 'encryptedPrv', 'provider', 'source']));
@@ -265,26 +369,75 @@ class Keychains {
265
369
  * @return {Promise<KeychainsTriplet>} newly created User, Backup, and BitGo keys
266
370
  */
267
371
  async createMpc(params) {
372
+ if (params.multisigType !== 'tss') {
373
+ throw new Error('Unsupported multi-sig type');
374
+ }
375
+ const tssSettings = await this.bitgo
376
+ .get(this.bitgo.microservicesUrl('/api/v2/tss/settings'))
377
+ .query({ enterprise: params.enterprise })
378
+ .result();
379
+ const multisigTypeVersion = tssSettings.coinSettings[this.baseCoin.getFamily()]?.walletCreationSettings?.multiSigTypeVersion;
380
+ const isMPCv2 = multisigTypeVersion === 'MPCv2';
381
+ if (params.safeId && !isMPCv2) {
382
+ // The legacy MPCv1 ceremonies accept a safeId for signature compatibility but silently
383
+ // ignore it (see EDDSAUtils.default.createKeychains / ECDSAUtils.EcdsaUtils.createKeychains),
384
+ // so the resulting keys never get tagged with the safe and WP's finalize step rejects them
385
+ // with a generic 400. Fail fast here instead of letting that confusing error surface later.
386
+ throw new errors_1.SafeMpcCeremonyUnsupportedError(this.baseCoin.getFamily());
387
+ }
268
388
  let MpcUtils;
269
- switch (params.multisigType) {
270
- case 'tss':
271
- MpcUtils = this.baseCoin.getMPCAlgorithm() === 'ecdsa' ? utils_1.ECDSAUtils.EcdsaUtils : utils_1.EDDSAUtils.default;
272
- break;
273
- case 'blsdkg':
274
- if (_.isUndefined(params.passphrase)) {
275
- throw new Error('missing required param passphrase');
276
- }
277
- MpcUtils = utils_1.BlsUtils;
278
- break;
279
- default:
280
- throw new Error('Unsupported multi-sig type');
389
+ if (this.baseCoin.getMPCAlgorithm() === 'eddsa') {
390
+ MpcUtils = isMPCv2 ? utils_1.EDDSAUtils.EddsaMPCv2Utils : utils_1.EDDSAUtils.default;
391
+ }
392
+ else {
393
+ MpcUtils = isMPCv2 ? utils_1.ECDSAUtils.EcdsaMPCv2Utils : utils_1.ECDSAUtils.EcdsaUtils;
281
394
  }
282
395
  const mpcUtils = new MpcUtils(this.bitgo, this.baseCoin);
283
396
  return await mpcUtils.createKeychains({
284
397
  passphrase: params.passphrase,
285
398
  enterprise: params.enterprise,
286
399
  originalPasscodeEncryptionCode: params.originalPasscodeEncryptionCode,
287
- backupProvider: params.backupProvider,
400
+ retrofit: params.retrofit,
401
+ webauthnInfo: params.webauthnInfo,
402
+ encryptionVersion: params.encryptionVersion,
403
+ safeId: params.safeId,
404
+ });
405
+ }
406
+ async recreateMpc(params) {
407
+ (0, assert_1.default)(params.coin, new Error('missing required param coin'));
408
+ (0, assert_1.default)(params.walletId, new Error('missing required param walletId'));
409
+ (0, assert_1.default)(params.otp, new Error('missing required param otp'));
410
+ (0, assert_1.default)(params.passphrase, new Error('missing required param passphrase'));
411
+ (0, assert_1.default)(params.encryptedMaterial.encryptedWalletPassphrase, new Error('missing required param encryptedWalletPassphrase'));
412
+ (0, assert_1.default)(params.encryptedMaterial.encryptedUserKey, new Error('missing required param encryptedUserKey'));
413
+ (0, assert_1.default)(params.encryptedMaterial.encryptedBackupKey, new Error('missing required param encryptedBackupKey'));
414
+ await this.bitgo.post(this.bitgo.microservicesUrl('/api/v1/user/unlock')).send({ otp: params.otp }).result();
415
+ const { recoveryInfo } = await this.bitgo
416
+ .post(this.bitgo.microservicesUrl(`/api/v2/${params.coin}/wallet/${params.walletId}/passcoderecovery`))
417
+ .result();
418
+ if (!recoveryInfo || !('passcodeEncryptionCode' in recoveryInfo)) {
419
+ throw new Error('failed to get recovery info');
420
+ }
421
+ const decryptedWalletPassphrase = await this.bitgo.decrypt({
422
+ input: params.encryptedMaterial.encryptedWalletPassphrase,
423
+ password: recoveryInfo.passcodeEncryptionCode,
424
+ });
425
+ const decryptedUserKey = await this.bitgo.decrypt({
426
+ input: params.encryptedMaterial.encryptedUserKey,
427
+ password: decryptedWalletPassphrase,
428
+ });
429
+ const decryptedBackupKey = await this.bitgo.decrypt({
430
+ input: params.encryptedMaterial.encryptedBackupKey,
431
+ password: decryptedWalletPassphrase,
432
+ });
433
+ return this.createMpc({
434
+ ...params,
435
+ multisigType: 'tss',
436
+ retrofit: {
437
+ decryptedUserKey,
438
+ decryptedBackupKey,
439
+ walletId: params.walletId,
440
+ },
288
441
  });
289
442
  }
290
443
  /**
@@ -292,11 +445,11 @@ class Keychains {
292
445
  * and creates a corresponding TSS BitGo key. It also returns the JSON that needs
293
446
  * to be uploaded back to the OVCs containing the BitGo -> OVC shares.
294
447
  * @param ovcOutputJson JSON format of the file downloaded from the OVC for platform
448
+ * @param enterprise Optional enterprise ID associated with the key
295
449
  * @returns {BitGoKeyFromOvcShares}
296
450
  */
297
- async createTssBitGoKeyFromOvcShares(ovcOutputJson) {
298
- var _a, _b, _c, _d;
299
- const decodedOvcOutput = decode_1.decodeOrElse(ovcJsonCodec_1.OvcToBitGoJSON.name, ovcJsonCodec_1.OvcToBitGoJSON, ovcOutputJson, (errors) => {
451
+ async createTssBitGoKeyFromOvcShares(ovcOutputJson, enterprise) {
452
+ const decodedOvcOutput = (0, utils_1.decodeOrElse)(ovcJsonCodec_1.OvcToBitGoJSON.name, ovcJsonCodec_1.OvcToBitGoJSON, ovcOutputJson, (errors) => {
300
453
  throw new Error(`Error(s) parsing OVC JSON: ${errors}`);
301
454
  });
302
455
  if (decodedOvcOutput.state !== 1) {
@@ -312,16 +465,16 @@ class Keychains {
312
465
  to: 'bitgo',
313
466
  publicShare: ovc1.ovcToBitgoShare.publicShare,
314
467
  privateShare: ovc1.ovcToBitgoShare.privateShare,
315
- privateShareProof: (_a = ovc1.ovcToBitgoShare.uSig.toString()) !== null && _a !== void 0 ? _a : '',
316
- vssProof: (_b = ovc1.ovcToBitgoShare.vssProof) !== null && _b !== void 0 ? _b : '',
468
+ privateShareProof: ovc1.ovcToBitgoShare.uSig.toString() ?? '',
469
+ vssProof: ovc1.ovcToBitgoShare.vssProof ?? '',
317
470
  },
318
471
  {
319
472
  from: 'backup',
320
473
  to: 'bitgo',
321
474
  publicShare: ovc2.ovcToBitgoShare.publicShare,
322
475
  privateShare: ovc2.ovcToBitgoShare.privateShare,
323
- privateShareProof: (_c = ovc2.ovcToBitgoShare.uSig.toString()) !== null && _c !== void 0 ? _c : '',
324
- vssProof: (_d = ovc2.ovcToBitgoShare.vssProof) !== null && _d !== void 0 ? _d : '',
476
+ privateShareProof: ovc2.ovcToBitgoShare.uSig.toString() ?? '',
477
+ vssProof: ovc2.ovcToBitgoShare.vssProof ?? '',
325
478
  },
326
479
  ];
327
480
  const key = await this.baseCoin.keychains().add({
@@ -330,18 +483,19 @@ class Keychains {
330
483
  keyType: 'tss',
331
484
  userGPGPublicKey: ovc1.gpgPubKey,
332
485
  backupGPGPublicKey: ovc2.gpgPubKey,
486
+ enterprise,
333
487
  });
334
- assert_1.default(key.keyShares);
335
- assert_1.default(key.commonKeychain);
336
- assert_1.default(key.walletHSMGPGPublicKeySigs);
488
+ (0, assert_1.default)(key.keyShares);
489
+ (0, assert_1.default)(key.commonKeychain);
490
+ (0, assert_1.default)(key.walletHSMGPGPublicKeySigs);
337
491
  const bitgoToUserShare = key.keyShares.find((value) => value.from === 'bitgo' && value.to === 'user');
338
- assert_1.default(bitgoToUserShare);
339
- assert_1.default(bitgoToUserShare.vssProof);
340
- assert_1.default(bitgoToUserShare.paillierPublicKey);
492
+ (0, assert_1.default)(bitgoToUserShare);
493
+ (0, assert_1.default)(bitgoToUserShare.vssProof);
494
+ (0, assert_1.default)(bitgoToUserShare.paillierPublicKey);
341
495
  const bitgoToBackupShare = key.keyShares.find((value) => value.from === 'bitgo' && value.to === 'backup');
342
- assert_1.default(bitgoToBackupShare);
343
- assert_1.default(bitgoToBackupShare.vssProof);
344
- assert_1.default(bitgoToBackupShare.paillierPublicKey);
496
+ (0, assert_1.default)(bitgoToBackupShare);
497
+ (0, assert_1.default)(bitgoToBackupShare.vssProof);
498
+ (0, assert_1.default)(bitgoToBackupShare.paillierPublicKey);
345
499
  // Create JSON data with platform shares for OVC-1 and OVC-2
346
500
  const bitgoToOvcOutput = {
347
501
  wallet: {
@@ -382,10 +536,86 @@ class Keychains {
382
536
  bitGoKeyId: key.id,
383
537
  bitGoOutputJsonForOvc: bitgoToOvcOutput,
384
538
  };
385
- return decode_1.decodeOrElse(ovcJsonCodec_1.BitGoKeyFromOvcShares.name, ovcJsonCodec_1.BitGoKeyFromOvcShares, output, (errors) => {
539
+ return (0, utils_1.decodeOrElse)(ovcJsonCodec_1.BitGoKeyFromOvcShares.name, ovcJsonCodec_1.BitGoKeyFromOvcShares, output, (errors) => {
386
540
  throw new Error(`Error producing the output: ${errors}`);
387
541
  });
388
542
  }
543
+ /**
544
+ * Create user keychain, encrypt the private key with the wallet passphrase and store it in BitGo.
545
+ * @param walletPassphrase
546
+ * @returns Keychain including the decrypted private key
547
+ */
548
+ async createUserKeychain(walletPassphrase, encryptionVersion, session) {
549
+ const keychains = this.baseCoin.keychains();
550
+ const newKeychain = keychains.create();
551
+ const originalPasscodeEncryptionCode = (0, utils_1.generateRandomPassword)(5);
552
+ // When a session is threaded in (typically from a bulk operation that already ran the KDF
553
+ // once), reuse it so this envelope's AES key derives via HKDF instead of another Argon2.
554
+ const encryptedPrv = session
555
+ ? await session.encrypt(newKeychain.prv)
556
+ : await this.bitgo.encrypt({
557
+ password: walletPassphrase,
558
+ input: newKeychain.prv,
559
+ encryptionVersion,
560
+ });
561
+ return {
562
+ ...(await keychains.add({
563
+ encryptedPrv,
564
+ originalPasscodeEncryptionCode,
565
+ pub: newKeychain.pub,
566
+ source: 'user',
567
+ })),
568
+ prv: newKeychain.prv,
569
+ };
570
+ }
571
+ /**
572
+ * Rotate an ofc multi-user-keychain by recreating a new keypair, encrypt it using the user password and sent it to WP
573
+ * This is only meant to be called by ofc multi-user-wallet's key, and will throw if otherwise.
574
+ *
575
+ * Requires 2fa auth before calling. Call the bitgo.unlock() SDK method to unlock the session first.
576
+ * @param params parameters for the rotate keychain method
577
+ * @return rotatedKeychain
578
+ */
579
+ async rotateKeychain(params) {
580
+ const keyChain = await this.get({ id: params.id });
581
+ if (!Keychains.isMultiUserKey(keyChain)) {
582
+ throw new Error(`rotateKeychain is only permitted for ofc multi-user-key wallet`);
583
+ }
584
+ let pub, encryptedPrv;
585
+ if ('encryptedPrv' in params) {
586
+ // client passed in pub and encryptedPrv directly
587
+ pub = params.pub;
588
+ encryptedPrv = params.encryptedPrv;
589
+ }
590
+ else {
591
+ // bitgo generate pub and prv and encrypt it
592
+ const { pub: keyPub, prv: keyPrv } = this.create();
593
+ if (!keyPub) {
594
+ throw Error('Expected a public key to be generated');
595
+ }
596
+ pub = keyPub;
597
+ encryptedPrv = await this.bitgo.encrypt({
598
+ input: keyPrv,
599
+ password: params.password,
600
+ encryptionVersion: params.encryptionVersion,
601
+ });
602
+ }
603
+ return this.bitgo
604
+ .put(this.baseCoin.url(`/key/${params.id}`))
605
+ .send({
606
+ encryptedPrv,
607
+ pub,
608
+ reqId: params.reqId,
609
+ })
610
+ .result();
611
+ }
612
+ /**
613
+ * Static helper method to determine if a keychain is a ofc multi-user-key
614
+ * @param keychain
615
+ */
616
+ static isMultiUserKey(keychain) {
617
+ return (keychain.coinSpecific?.ofc?.['features'] ?? []).includes('multi-user-key');
618
+ }
389
619
  }
390
620
  exports.Keychains = Keychains;
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMENBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixxREFBdUM7QUFHdkMsb0NBQTJFO0FBaUIzRSw0Q0FBK0M7QUFDL0MsaURBQXVGO0FBRXZGLE1BQWEsU0FBUztJQUlwQixZQUFZLEtBQWdCLEVBQUUsUUFBbUI7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQTBCO1FBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0M7UUFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM1RixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lB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LENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQS9ZRCw4QkErWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IElCYXNlQ29pbiwgS2V5Y2hhaW5zVHJpcGxldCwgS2V5UGFpciB9IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBCbHNVdGlscywgUmVxdWVzdFRyYWNlciwgRUREU0FVdGlscywgRUNEU0FVdGlscyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIEFkZEtleWNoYWluT3B0aW9ucyxcbiAgQXBpS2V5U2hhcmUsXG4gIENoYW5nZWRLZXljaGFpbnMsXG4gIENyZWF0ZUJhY2t1cE9wdGlvbnMsXG4gIENyZWF0ZUJpdEdvT3B0aW9ucyxcbiAgQ3JlYXRlTXBjT3B0aW9ucyxcbiAgR2V0S2V5Y2hhaW5PcHRpb25zLFxuICBHZXRLZXlzRm9yU2lnbmluZ09wdGlvbnMsXG4gIElLZXljaGFpbnMsXG4gIEtleWNoYWluLFxuICBMaXN0S2V5Y2hhaW5PcHRpb25zLFxuICBMaXN0S2V5Y2hhaW5zUmVzdWx0LFxuICBVcGRhdGVQYXNzd29yZE9wdGlvbnMsXG4gIFVwZGF0ZVNpbmdsZUtleWNoYWluUGFzc3dvcmRPcHRpb25zLFxufSBmcm9tICcuL2lLZXljaGFpbnMnO1xuaW1wb3J0IHsgZGVjb2RlT3JFbHNlIH0gZnJvbSAnLi4vdXRpbHMvZGVjb2RlJztcbmltcG9ydCB7IEJpdEdvS2V5RnJvbU92Y1NoYXJlcywgQml0R29Ub092Y0pTT04sIE92Y1RvQml0R29KU09OIH0gZnJvbSAnLi9vdmNKc29uQ29kZWMnO1xuXG5leHBvcnQgY2xhc3MgS2V5Y2hhaW5zIGltcGxlbWVudHMgSUtleWNoYWlucyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlQ29pbjogSUJhc2VDb2luO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4pIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleWNoYWluIGJ5IElEXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5pZFxuICAgKiBAcGFyYW0gcGFyYW1zLnhwdWIgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0gcGFyYW1zLmV0aEFkZHJlc3MgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0gcGFyYW1zLnJlcUlkIChvcHRpb25hbClcbiAgICovXG4gIGFzeW5jIGdldChwYXJhbXM6IEdldEtleWNoYWluT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd4cHViJywgJ2V0aEFkZHJlc3MnXSk7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lkIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gcGFyYW1zLmlkO1xuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy9rZXkvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBsaXN0IHRoZSB1c2VycyBrZXljaGFpbnNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmxpbWl0IC0gTWF4IG51bWJlciBvZiByZXN1bHRzIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqIEBwYXJhbSBwYXJhbXMucHJldklkIC0gQ29udGludWUgaXRlcmF0aW5nIChwcm92aWRlZCBieSBuZXh0QmF0Y2hQcmV2SWQgaW4gdGhlIHByZXZpb3VzIGxpc3QpXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RLZXljaGFpbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8TGlzdEtleWNoYWluc1Jlc3VsdD4ge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0OiBhbnkgPSB7fTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5T2JqZWN0LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeU9iamVjdC5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL2tleScpKS5xdWVyeShxdWVyeU9iamVjdCkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBkZWNyeXB0aW9uIHBhc3N3b3JkIGZvciBhbGwgcG9zc2libGUga2V5Y2hhaW5zIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgdGhyb3VnaCBhbGwga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIsIGRlY3J5cHRzXG4gICAqIHRoZW0gd2l0aCB0aGUgb2xkIHBhc3N3b3JkIGFuZCByZS1lbmNyeXB0cyB0aGVtIHdpdGggdGhlIG5ldyBwYXNzd29yZC5cbiAgICpcbiAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSB1c2VyIGNoYW5nZXMgdGhlaXIgbG9naW4gcGFzc3dvcmQsIGFuZCBhcmUgZXhwZWN0aW5nXG4gICAqIHRoYXQgdGhlaXIgd2FsbGV0IHBhc3N3b3JkcyBhcmUgY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IGxvZ2luIHBhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMub2xkUGFzc3dvcmQgLSBUaGUgb2xkIHBhc3N3b3JkIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1Bhc3N3b3JkIC0gVGhlIG5ldyBwYXNzd29yZCB0byBiZSB1c2VkIGZvciBlbmNyeXB0aW5nIHRoZSBrZXlcbiAgICogQHJldHVybnMgY2hhbmdlZEtleXMgT2JqZWN0IC0gZS5nLjpcbiAgICogIHtcbiAgICogICAgeHB1YjE6IGVuY3J5cHRlZFBydixcbiAgICogICAgLi4uXG4gICAqICB9XG4gICAqL1xuICBhc3luYyB1cGRhdGVQYXNzd29yZChwYXJhbXM6IFVwZGF0ZVBhc3N3b3JkT3B0aW9ucyk6IFByb21pc2U8Q2hhbmdlZEtleWNoYWlucz4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnb2xkUGFzc3dvcmQnLCAnbmV3UGFzc3dvcmQnXSwgW10pO1xuICAgIGNvbnN0IGNoYW5nZWRLZXlzOiBDaGFuZ2VkS2V5Y2hhaW5zID0ge307XG4gICAgbGV0IHByZXZJZDtcbiAgICBsZXQga2V5c0xlZnQgPSB0cnVlO1xuICAgIHdoaWxlIChrZXlzTGVmdCkge1xuICAgICAgY29uc3QgcmVzdWx0OiBMaXN0S2V5Y2hhaW5zUmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0KHsgbGltaXQ6IDUwMCwgcHJldklkIH0pO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVzdWx0LmtleXMpIHtcbiAgICAgICAgY29uc3Qgb2xkRW5jcnlwdGVkUHJ2ID0ga2V5LmVuY3J5cHRlZFBydjtcbiAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQob2xkRW5jcnlwdGVkUHJ2KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZEtleWNoYWluID0gdGhpcy51cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHtcbiAgICAgICAgICAgIGtleWNoYWluOiBrZXksXG4gICAgICAgICAgICBvbGRQYXNzd29yZDogcGFyYW1zLm9sZFBhc3N3b3JkLFxuICAgICAgICAgICAgbmV3UGFzc3dvcmQ6IHBhcmFtcy5uZXdQYXNzd29yZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodXBkYXRlZEtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlZEtleUlkZW50aWZpZXIgPVxuICAgICAgICAgICAgICB1cGRhdGVkS2V5Y2hhaW4udHlwZSA9PT0gJ3RzcycgPyB1cGRhdGVkS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4gOiB1cGRhdGVkS2V5Y2hhaW4ucHViO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWRLZXlJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGNoYW5nZWRLZXlzW2NoYW5nZWRLZXlJZGVudGlmaWVyXSA9IHVwZGF0ZWRLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gaWYgdGhlIHBhc3N3b3JkIHdhcyBpbmNvcnJlY3QsIHNpbGVuY2UgdGhlIGVycm9yLCB0aHJvdyBvdGhlcndpc2VcbiAgICAgICAgICBpZiAoIWUubWVzc2FnZS5pbmNsdWRlcygncHJpdmF0ZSBrZXkgaXMgaW5jb3JyZWN0JykpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0Lm5leHRCYXRjaFByZXZJZCkge1xuICAgICAgICBwcmV2SWQgPSByZXN1bHQubmV4dEJhdGNoUHJldklkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5c0xlZnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWRLZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcGFzc3dvcmQgdXNlZCB0byBkZWNyeXB0IGEgc2luZ2xlIGtleWNoYWluXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbiAtIFRoZSBrZXljaGFpbiB3aG9zZSBwYXNzd29yZCBzaG91bGQgYmUgdXBkYXRlZFxuICAgKiBAcGFyYW0gcGFyYW1zLm9sZFBhc3N3b3JkIC0gVGhlIG9sZCBwYXNzd29yZCB1c2VkIGZvciBlbmNyeXB0aW5nIHRoZSBrZXlcbiAgICogQHBhcmFtIHBhcmFtcy5uZXdQYXNzd29yZCAtIFRoZSBuZXcgcGFzc3dvcmQgdG8gYmUgdXNlZCBmb3IgZW5jcnlwdGluZyB0aGUga2V5XG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB1cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHBhcmFtczogVXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZE9wdGlvbnMgPSB7fSk6IEtleWNoYWluIHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLm9sZFBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBvbGQgcGFzc3dvcmQgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLm5ld1Bhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBuZXcgcGFzc3dvcmQgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmtleWNoYWluKSB8fCAhXy5pc1N0cmluZyhwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBrZXljaGFpbiB0byBiZSBhbiBvYmplY3Qgd2l0aCBhbiBlbmNyeXB0ZWRQcnYgcHJvcGVydHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRFbmNyeXB0ZWRQcnYgPSBwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNyeXB0ZWRQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogb2xkRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLm9sZFBhc3N3b3JkIH0pO1xuICAgICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHsgaW5wdXQ6IGRlY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhcmFtcy5uZXdQYXNzd29yZCB9KTtcbiAgICAgIHJldHVybiBfLmFzc2lnbih7fSwgcGFyYW1zLmtleWNoYWluLCB7IGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2IH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNhdGNoaW5nIGFuIGVycm9yIGhlcmUgbWVhbnMgdGhhdCB0aGUgcGFzc3dvcmQgd2FzIGluY29ycmVjdCBvciwgbGVzcyBsaWtlbHksIHRoZSBpbnB1dCB0byBkZWNyeXB0IGlzIGNvcnJ1cHRlZFxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzd29yZCB1c2VkIHRvIGRlY3J5cHQga2V5Y2hhaW4gcHJpdmF0ZSBrZXkgaXMgaW5jb3JyZWN0Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHB1YmxpYy9wcml2YXRlIGtleSBwYWlyXG4gICAqIEBwYXJhbSBwYXJhbXMuc2VlZFxuICAgKi9cbiAgY3JlYXRlKHBhcmFtczogeyBzZWVkPzogQnVmZmVyIH0gPSB7fSk6IEtleVBhaXIge1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmdlbmVyYXRlS2V5UGFpcihwYXJhbXMuc2VlZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEga2V5Y2hhaW4gdG8gQml0R28ncyByZWNvcmRzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGFkZChwYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMoXG4gICAgICBwYXJhbXMsXG4gICAgICBbXSxcbiAgICAgIFtcbiAgICAgICAgJ3B1YicsXG4gICAgICAgICdlbmNyeXB0ZWRQcnYnLFxuICAgICAgICAna2V5VHlwZScsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ3NvdXJjZScsXG4gICAgICAgICdvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUnLFxuICAgICAgICAnZW50ZXJwcmlzZScsXG4gICAgICAgICdkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkJyxcbiAgICAgIF1cbiAgICApO1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5kaXNhYmxlS1JTRW1haWwpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlS1JTRW1haWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkaXNhYmxlS1JTRW1haWwgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcva2V5JykpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIHB1YjogcGFyYW1zLnB1YixcbiAgICAgICAgY29tbW9uUHViOiBwYXJhbXMuY29tbW9uUHViLFxuICAgICAgICBjb21tb25LZXljaGFpbjogcGFyYW1zLmNvbW1vbktleWNoYWluLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IHBhcmFtcy5lbmNyeXB0ZWRQcnYsXG4gICAgICAgIHR5cGU6IHBhcmFtcy50eXBlLFxuICAgICAgICBrZXlUeXBlOiBwYXJhbXMua2V5VHlwZSxcbiAgICAgICAgc291cmNlOiBwYXJhbXMuc291cmNlLFxuICAgICAgICBwcm92aWRlcjogcGFyYW1zLnByb3ZpZGVyLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkOiBwYXJhbXMuZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCxcbiAgICAgICAgZGlzYWJsZUtSU0VtYWlsOiBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsLFxuICAgICAgICBrcnNTcGVjaWZpYzogcGFyYW1zLmtyc1NwZWNpZmljLFxuICAgICAgICBrZXlTaGFyZXM6IHBhcmFtcy5rZXlTaGFyZXMsXG4gICAgICAgIHVzZXJHUEdQdWJsaWNLZXk6IHBhcmFtcy51c2VyR1BHUHVibGljS2V5LFxuICAgICAgICBiYWNrdXBHUEdQdWJsaWNLZXk6IHBhcmFtcy5iYWNrdXBHUEdQdWJsaWNLZXksXG4gICAgICAgIGFsZ29Vc2VkOiBwYXJhbXMuYWxnb1VzZWQsXG4gICAgICAgIGlzRGlzdHJpYnV0ZWRDdXN0b2R5OiBwYXJhbXMuaXNEaXN0cmlidXRlZEN1c3RvZHksXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEJpdEdvIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zIChlbXB0eSlcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJpdEdvKHBhcmFtczogQ3JlYXRlQml0R29PcHRpb25zID0ge30pOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcGFyYW1zLnNvdXJjZSA9ICdiaXRnbyc7XG5cbiAgICB0aGlzLmJhc2VDb2luLnByZUNyZWF0ZUJpdEdvKHBhcmFtcyBhcyBhbnkpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmFkZChwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBrZXlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnByb3ZpZGVyIChvcHRpb25hbClcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJhY2t1cChwYXJhbXM6IENyZWF0ZUJhY2t1cE9wdGlvbnMgPSB7fSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBwYXJhbXMuc291cmNlID0gJ2JhY2t1cCc7XG5cbiAgICBjb25zdCBpc1Rzc0JhY2t1cEtleSA9IHBhcmFtcy5wcnYgJiYgKHBhcmFtcy5jb21tb25LZXljaGFpbiB8fCBwYXJhbXMuY29tbW9uUHViKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcm92aWRlcikgJiYgIWlzVHNzQmFja3VwS2V5KSB7XG4gICAgICAvLyBpZiB0aGUgcHJvdmlkZXIgaXMgdW5kZWZpbmVkLCB3ZSBnZW5lcmF0ZSBhIGxvY2FsIGtleSBhbmQgYWRkIHRoZSBzb3VyY2UgZGV0YWlsc1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgIF8uZXh0ZW5kKHBhcmFtcywga2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZSA9IGF3YWl0IHRoaXMuYWRkKHBhcmFtcyk7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBzZXJ2ZXJSZXNwb25zZSwgXy5waWNrKHBhcmFtcywgWydwcnYnLCAnZW5jcnlwdGVkUHJ2JywgJ3Byb3ZpZGVyJywgJ3NvdXJjZSddKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBrZXlzIGZvciBzaWduaW5nIGZyb20gYSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXljaGFpbltdPn1cbiAgICovXG4gIGFzeW5jIGdldEtleXNGb3JTaWduaW5nKHBhcmFtczogR2V0S2V5c0ZvclNpZ25pbmdPcHRpb25zID0ge30pOiBQcm9taXNlPEtleWNoYWluW10+IHtcbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLndhbGxldCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSB3YWxsZXQnKTtcbiAgICB9XG4gICAgY29uc3Qgd2FsbGV0ID0gcGFyYW1zLndhbGxldDtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGlkcyA9IHdhbGxldC5iYXNlQ29pbi5rZXlJZHNGb3JTaWduaW5nKCk7XG4gICAgY29uc3Qga2V5Y2hhaW5RdWVyaWVzQmx1ZWJpcmRzID0gaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2V0KHsgaWQ6IHdhbGxldC5rZXlJZHMoKVtpZF0sIHJlcUlkIH0pKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoa2V5Y2hhaW5RdWVyaWVzQmx1ZWJpcmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW5kIHN0b3JlIE1QQyBrZXljaGFpbnMgd2l0aCBCaXRHby5cbiAgICogQHBhcmFtIHBhcmFtcyBwYXNzcGhyYXNlIHVzZWQgdG8gZW5jcnlwdCBzZWNyZXQgbWF0ZXJpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8S2V5Y2hhaW5zVHJpcGxldD59IG5ld2x5IGNyZWF0ZWQgVXNlciwgQmFja3VwLCBhbmQgQml0R28ga2V5c1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlTXBjKHBhcmFtczogQ3JlYXRlTXBjT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGxldCBNcGNVdGlscztcbiAgICBzd2l0Y2ggKHBhcmFtcy5tdWx0aXNpZ1R5cGUpIHtcbiAgICAgIGNhc2UgJ3Rzcyc6XG4gICAgICAgIE1wY1V0aWxzID0gdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJyA/IEVDRFNBVXRpbHMuRWNkc2FVdGlscyA6IEVERFNBVXRpbHMuZGVmYXVsdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdibHNka2cnOlxuICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMucGFzc3BocmFzZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gcGFzc3BocmFzZScpO1xuICAgICAgICB9XG4gICAgICAgIE1wY1V0aWxzID0gQmxzVXRpbHM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBtdWx0aS1zaWcgdHlwZScpO1xuICAgIH1cbiAgICBjb25zdCBtcGNVdGlscyA9IG5ldyBNcGNVdGlscyh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luKTtcbiAgICByZXR1cm4gYXdhaXQgbXBjVXRpbHMuY3JlYXRlS2V5Y2hhaW5zKHtcbiAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBiYWNrdXBQcm92aWRlcjogcGFyYW1zLmJhY2t1cFByb3ZpZGVyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHBhcnNlcyB0aGUgSlNPTiBkb3dubG9hZGVkIGZyb20gdGhlIE9WQyBmb3IgcGxhdGZvcm0gKEJpdEdvKSxcbiAgICogYW5kIGNyZWF0ZXMgYSBjb3JyZXNwb25kaW5nIFRTUyBCaXRHbyBrZXkuIEl0IGFsc28gcmV0dXJucyB0aGUgSlNPTiB0aGF0IG5lZWRzXG4gICAqIHRvIGJlIHVwbG9hZGVkIGJhY2sgdG8gdGhlIE9WQ3MgY29udGFpbmluZyB0aGUgQml0R28gLT4gT1ZDIHNoYXJlcy5cbiAgICogQHBhcmFtIG92Y091dHB1dEpzb24gSlNPTiBmb3JtYXQgb2YgdGhlIGZpbGUgZG93bmxvYWRlZCBmcm9tIHRoZSBPVkMgZm9yIHBsYXRmb3JtXG4gICAqIEByZXR1cm5zIHtCaXRHb0tleUZyb21PdmNTaGFyZXN9XG4gICAqL1xuICBhc3luYyBjcmVhdGVUc3NCaXRHb0tleUZyb21PdmNTaGFyZXMob3ZjT3V0cHV0SnNvbjogdW5rbm93bik6IFByb21pc2U8Qml0R29LZXlGcm9tT3ZjU2hhcmVzPiB7XG4gICAgY29uc3QgZGVjb2RlZE92Y091dHB1dCA9IGRlY29kZU9yRWxzZShPdmNUb0JpdEdvSlNPTi5uYW1lLCBPdmNUb0JpdEdvSlNPTiwgb3ZjT3V0cHV0SnNvbiwgKGVycm9ycykgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvcihzKSBwYXJzaW5nIE9WQyBKU09OOiAke2Vycm9yc31gKTtcbiAgICB9KTtcblxuICAgIGlmIChkZWNvZGVkT3ZjT3V0cHV0LnN0YXRlICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YXRlIGV4cGVjdGVkIHRvIGJlIFwiMVwiLiBQbGVhc2UgY29tcGxldGUgdGhlIGZpcnN0IHR3byBPVkMgb3BlcmF0aW9ucycpO1xuICAgIH1cblxuICAgIC8vIE9WQy0xIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgVXNlciBrZXlcbiAgICBjb25zdCBvdmMxID0gZGVjb2RlZE92Y091dHB1dC5vdmNbMV07XG4gICAgLy8gT1ZDLTIgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBCYWNrdXAga2V5XG4gICAgY29uc3Qgb3ZjMiA9IGRlY29kZWRPdmNPdXRwdXQub3ZjWzJdO1xuXG4gICAgY29uc3Qga2V5U2hhcmVzOiBBcGlLZXlTaGFyZVtdID0gW1xuICAgICAge1xuICAgICAgICBmcm9tOiAndXNlcicsXG4gICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICBwdWJsaWNTaGFyZTogb3ZjMS5vdmNUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgIHByaXZhdGVTaGFyZTogb3ZjMS5vdmNUb0JpdGdvU2hhcmUucHJpdmF0ZVNoYXJlLFxuICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogb3ZjMS5vdmNUb0JpdGdvU2hhcmUudVNpZy50b1N0cmluZygpID8/ICcnLFxuICAgICAgICB2c3NQcm9vZjogb3ZjMS5vdmNUb0JpdGdvU2hhcmUudnNzUHJvb2YgPz8gJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmcm9tOiAnYmFja3VwJyxcbiAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgIHB1YmxpY1NoYXJlOiBvdmMyLm92Y1RvQml0Z29TaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgcHJpdmF0ZVNoYXJlOiBvdmMyLm92Y1RvQml0Z29TaGFyZS5wcml2YXRlU2hhcmUsXG4gICAgICAgIHByaXZhdGVTaGFyZVByb29mOiBvdmMyLm92Y1RvQml0Z29TaGFyZS51U2lnLnRvU3RyaW5nKCkgPz8gJycsXG4gICAgICAgIHZzc1Byb29mOiBvdmMyLm92Y1RvQml0Z29TaGFyZS52c3NQcm9vZiA/PyAnJyxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHtcbiAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgIGtleVNoYXJlcyxcbiAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgdXNlckdQR1B1YmxpY0tleTogb3ZjMS5ncGdQdWJLZXksXG4gICAgICBiYWNrdXBHUEdQdWJsaWNLZXk6IG92YzIuZ3BnUHViS2V5LFxuICAgIH0pO1xuICAgIGFzc2VydChrZXkua2V5U2hhcmVzKTtcbiAgICBhc3NlcnQoa2V5LmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQoa2V5LndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MpO1xuXG4gICAgY29uc3QgYml0Z29Ub1VzZXJTaGFyZSA9IGtleS5rZXlTaGFyZXMuZmluZChcbiAgICAgICh2YWx1ZTogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSkgPT4gdmFsdWUuZnJvbSA9PT0gJ2JpdGdvJyAmJiB2YWx1ZS50byA9PT0gJ3VzZXInXG4gICAgKTtcbiAgICBhc3NlcnQoYml0Z29Ub1VzZXJTaGFyZSk7XG4gICAgYXNzZXJ0KGJpdGdvVG9Vc2VyU2hhcmUudnNzUHJvb2YpO1xuICAgIGFzc2VydChiaXRnb1RvVXNlclNoYXJlLnBhaWxsaWVyUHVibGljS2V5KTtcbiAgICBjb25zdCBiaXRnb1RvQmFja3VwU2hhcmUgPSBrZXkua2V5U2hhcmVzLmZpbmQoXG4gICAgICAodmFsdWU6IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0pID0+IHZhbHVlLmZyb20gPT09ICdiaXRnbycgJiYgdmFsdWUudG8gPT09ICdiYWNrdXAnXG4gICAgKTtcbiAgICBhc3NlcnQoYml0Z29Ub0JhY2t1cFNoYXJlKTtcbiAgICBhc3NlcnQoYml0Z29Ub0JhY2t1cFNoYXJlLnZzc1Byb29mKTtcbiAgICBhc3NlcnQoYml0Z29Ub0JhY2t1cFNoYXJlLnBhaWxsaWVyUHVibGljS2V5KTtcblxuICAgIC8vIENyZWF0ZSBKU09OIGRhdGEgd2l0aCBwbGF0Zm9ybSBzaGFyZXMgZm9yIE9WQy0xIGFuZCBPVkMtMlxuICAgIGNvbnN0IGJpdGdvVG9PdmNPdXRwdXQ6IEJpdEdvVG9PdmNKU09OID0ge1xuICAgICAgd2FsbGV0OiB7XG4gICAgICAgIC4uLmRlY29kZWRPdmNPdXRwdXQsXG4gICAgICAgIHBsYXRmb3JtOiB7XG4gICAgICAgICAgY29tbW9uS2V5Y2hhaW46IGtleS5jb21tb25LZXljaGFpbixcbiAgICAgICAgICB3YWxsZXRHcGdQdWJLZXlTaWdzOiBrZXkud2FsbGV0SFNNR1BHUHVibGljS2V5U2lncyxcbiAgICAgICAgICBvdmM6IHtcbiAgICAgICAgICAgIC8vIEJpdEdvIHRvIFVzZXIgKE9WQy0xKVxuICAgICAgICAgICAgMToge1xuICAgICAgICAgICAgICBiaXRnb1RvT3ZjU2hhcmU6IHtcbiAgICAgICAgICAgICAgICBpOiAxLFxuICAgICAgICAgICAgICAgIGo6IDMsXG4gICAgICAgICAgICAgICAgcHVibGljU2hhcmU6IGJpdGdvVG9Vc2VyU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZVNoYXJlOiBiaXRnb1RvVXNlclNoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICAgICAgICBwYWlsbGllclB1YmxpY0tleTogYml0Z29Ub1VzZXJTaGFyZS5wYWlsbGllclB1YmxpY0tleSxcbiAgICAgICAgICAgICAgICB2c3NQcm9vZjogYml0Z29Ub1VzZXJTaGFyZS52c3NQcm9vZixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBCaXRHbyB0byBCYWNrdXAgKE9WQy0yKVxuICAgICAgICAgICAgMjoge1xuICAgICAgICAgICAgICBiaXRnb1RvT3ZjU2hhcmU6IHtcbiAgICAgICAgICAgICAgICBpOiAyLFxuICAgICAgICAgICAgICAgIGo6IDMsXG4gICAgICAgICAgICAgICAgcHVibGljU2hhcmU6IGJpdGdvVG9CYWNrdXBTaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlU2hhcmU6IGJpdGdvVG9CYWNrdXBTaGFyZS5wcml2YXRlU2hhcmUsXG4gICAgICAgICAgICAgICAgcGFpbGxpZXJQdWJsaWNLZXk6IGJpdGdvVG9CYWNrdXBTaGFyZS5wYWlsbGllclB1YmxpY0tleSxcbiAgICAgICAgICAgICAgICB2c3NQcm9vZjogYml0Z29Ub0JhY2t1cFNoYXJlLnZzc1Byb29mLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gTWFyayBpdCByZWFkeSBmb3IgbmV4dCBvcGVyYXRpb24sIHNob3VsZCBiZSAyXG4gICAgYml0Z29Ub092Y091dHB1dC53YWxsZXQuc3RhdGUgKz0gMTtcblxuICAgIGNvbnN0IG91dHB1dDogQml0R29LZXlGcm9tT3ZjU2hhcmVzID0ge1xuICAgICAgYml0R29LZXlJZDoga2V5LmlkLFxuICAgICAgYml0R29PdXRwdXRKc29uRm9yT3ZjOiBiaXRnb1RvT3ZjT3V0cHV0LFxuICAgIH07XG5cbiAgICByZXR1cm4gZGVjb2RlT3JFbHNlKEJpdEdvS2V5RnJvbU92Y1NoYXJlcy5uYW1lLCBCaXRHb0tleUZyb21PdmNTaGFyZXMsIG91dHB1dCwgKGVycm9ycykgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwcm9kdWNpbmcgdGhlIG91dHB1dDogJHtlcnJvcnN9YCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
621
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxvREFBNEI7QUFDNUIsMENBQTRCO0FBQzVCLHFEQUF1QztBQUd2QyxzQ0FBNEQ7QUFDNUQscUVBSXFDO0FBQ3JDLG9DQUF1RztBQW1CdkcsaURBQXVGO0FBR3ZGLE1BQWEsU0FBUztJQUlwQixZQUFZLEtBQWdCLEVBQUUsUUFBbUI7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQTBCO1FBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxD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O1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzNDLElBQUksQ0FBQztZQUNKLFlBQVk7WUFDWixHQUFHO1lBQ0gsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1NBQ3BCLENBQUM7YUFDRCxNQUFNLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQWtCO1FBQ3RDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7Q0FDRjtBQXBvQkQsOEJBb29CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRzc1NldHRpbmdzIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IElCYXNlQ29pbiwgS2V5Y2hhaW5zVHJpcGxldCwgS2V5UGFpciB9IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBTYWZlTXBjQ2VyZW1vbnlVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7XG4gIGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIsXG4gIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZUJhc2UzMixcbiAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG59IGZyb20gJy4uL3NhZmUvZGVyaXZhYmxlRWQyNTUxOVB1Yic7XG5pbXBvcnQgeyBkZWNvZGVPckVsc2UsIEVDRFNBVXRpbHMsIEVERFNBVXRpbHMsIGdlbmVyYXRlUmFuZG9tUGFzc3dvcmQsIFJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBBZGRLZXljaGFpbk9wdGlvbnMsXG4gIEFwaUtleVNoYXJlLFxuICBDaGFuZ2VkS2V5Y2hhaW5zLFxuICBDcmVhdGVCYWNrdXBPcHRpb25zLFxuICBDcmVhdGVCaXRHb09wdGlvbnMsXG4gIENyZWF0ZU1wY09wdGlvbnMsXG4gIEdldEtleWNoYWluT3B0aW9ucyxcbiAgR2V0S2V5c0ZvclNpZ25pbmdPcHRpb25zLFxuICBJS2V5Y2hhaW5zLFxuICBLZXljaGFpbixcbiAgTGlzdEtleWNoYWluT3B0aW9ucyxcbiAgTGlzdEtleWNoYWluc1Jlc3VsdCxcbiAgUmVjcmVhdGVNcGNPcHRpb25zLFxuICBSb3RhdGVLZXljaGFpbk9wdGlvbnMsXG4gIFVwZGF0ZVBhc3N3b3JkT3B0aW9ucyxcbiAgVXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZE9wdGlvbnMsXG59IGZyb20gJy4vaUtleWNoYWlucyc7XG5pbXBvcnQgeyBCaXRHb0tleUZyb21PdmNTaGFyZXMsIEJpdEdvVG9PdmNKU09OLCBPdmNUb0JpdEdvSlNPTiB9IGZyb20gJy4vb3ZjSnNvbkNvZGVjJztcbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uLCBJRW5jcnlwdGlvblNlc3Npb24gfSBmcm9tICcuLi8uLi9hcGknO1xuXG5leHBvcnQgY2xhc3MgS2V5Y2hhaW5zIGltcGxlbWVudHMgSUtleWNoYWlucyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlQ29pbjogSUJhc2VDb2luO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4pIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleWNoYWluIGJ5IElEXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5pZFxuICAgKiBAcGFyYW0gcGFyYW1zLnhwdWIgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0gcGFyYW1zLmV0aEFkZHJlc3MgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0gcGFyYW1zLnJlcUlkIChvcHRpb25hbClcbiAgICovXG4gIGFzeW5jIGdldChwYXJhbXM6IEdldEtleWNoYWluT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd4cHViJywgJ2V0aEFkZHJlc3MnXSk7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lkIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gcGFyYW1zLmlkO1xuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy9rZXkvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBsaXN0IHRoZSB1c2VycyBrZXljaGFpbnNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmxpbWl0IC0gTWF4IG51bWJlciBvZiByZXN1bHRzIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqIEBwYXJhbSBwYXJhbXMucHJldklkIC0gQ29udGludWUgaXRlcmF0aW5nIChwcm92aWRlZCBieSBuZXh0QmF0Y2hQcmV2SWQgaW4gdGhlIHByZXZpb3VzIGxpc3QpXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RLZXljaGFpbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8TGlzdEtleWNoYWluc1Jlc3VsdD4ge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0OiBhbnkgPSB7fTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5T2JqZWN0LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeU9iamVjdC5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL2tleScpKS5xdWVyeShxdWVyeU9iamVjdCkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBkZWNyeXB0aW9uIHBhc3N3b3JkIGZvciBhbGwgcG9zc2libGUga2V5Y2hhaW5zIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgdGhyb3VnaCBhbGwga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIsIGRlY3J5cHRzXG4gICAqIHRoZW0gd2l0aCB0aGUgb2xkIHBhc3N3b3JkIGFuZCByZS1lbmNyeXB0cyB0aGVtIHdpdGggdGhlIG5ldyBwYXNzd29yZC5cbiAgICpcbiAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSB1c2VyIGNoYW5nZXMgdGhlaXIgbG9naW4gcGFzc3dvcmQsIGFuZCBhcmUgZXhwZWN0aW5nXG4gICAqIHRoYXQgdGhlaXIgd2FsbGV0IHBhc3N3b3JkcyBhcmUgY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IGxvZ2luIHBhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMub2xkUGFzc3dvcmQgLSBUaGUgb2xkIHBhc3N3b3JkIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1Bhc3N3b3JkIC0gVGhlIG5ldyBwYXNzd29yZCB0byBiZSB1c2VkIGZvciBlbmNyeXB0aW5nIHRoZSBrZXlcbiAgICogQHJldHVybnMgY2hhbmdlZEtleXMgT2JqZWN0IC0gZS5nLjpcbiAgICogIHtcbiAgICogICAgeHB1YjE6IGVuY3J5cHRlZFBydixcbiAgICogICAgLi4uXG4gICAqICB9XG4gICAqL1xuICBhc3luYyB1cGRhdGVQYXNzd29yZChwYXJhbXM6IFVwZGF0ZVBhc3N3b3JkT3B0aW9ucyk6IFByb21pc2U8Q2hhbmdlZEtleWNoYWlucz4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnb2xkUGFzc3dvcmQnLCAnbmV3UGFzc3dvcmQnXSwgW10pO1xuICAgIGNvbnN0IGNoYW5nZWRLZXlzOiBDaGFuZ2VkS2V5Y2hhaW5zID0ge307XG4gICAgbGV0IHByZXZJZDtcbiAgICBsZXQga2V5c0xlZnQgPSB0cnVlO1xuICAgIHdoaWxlIChrZXlzTGVmdCkge1xuICAgICAgY29uc3QgcmVzdWx0OiBMaXN0S2V5Y2hhaW5zUmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0KHsgbGltaXQ6IDUwMCwgcHJldklkIH0pO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVzdWx0LmtleXMpIHtcbiAgICAgICAgY29uc3Qgb2xkRW5jcnlwdGVkUHJ2ID0ga2V5LmVuY3J5cHRlZFBydjtcbiAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQob2xkRW5jcnlwdGVkUHJ2KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZEtleWNoYWluID0gYXdhaXQgdGhpcy51cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHtcbiAgICAgICAgICAgIGtleWNoYWluOiBrZXksXG4gICAgICAgICAgICBvbGRQYXNzd29yZDogcGFyYW1zLm9sZFBhc3N3b3JkLFxuICAgICAgICAgICAgbmV3UGFzc3dvcmQ6IHBhcmFtcy5uZXdQYXNzd29yZCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHVwZGF0ZWRLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgICAgIC8vIEJvdGggVFNTIGFuZCBtdWx0aS11c2VyLW9mYyBrZXlzIGhhdmUgbXVsdGlwbGUgcHVibGljIGtleXMgaW4gdGhlaXIga2V5IGRvY3VtZW50IGFuZCB0aHVzIG5lZWQgdG8gdXNlIG9iamVjdElEXG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkS2V5SWRlbnRpZmllciA9XG4gICAgICAgICAgICAgIHVwZGF0ZWRLZXljaGFpbi50eXBlID09PSAndHNzJyB8fCBLZXljaGFpbnMuaXNNdWx0aVVzZXJLZXkodXBkYXRlZEtleWNoYWluKVxuICAgICAgICAgICAgICAgID8gdXBkYXRlZEtleWNoYWluLmlkXG4gICAgICAgICAgICAgICAgOiB1cGRhdGVkS2V5Y2hhaW4ucHViO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWRLZXlJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGNoYW5nZWRLZXlzW2NoYW5nZWRLZXlJZGVudGlmaWVyXSA9IHVwZGF0ZWRLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gaWYgdGhlIHBhc3N3b3JkIHdhcyBpbmNvcnJlY3QsIHNpbGVuY2UgdGhlIGVycm9yLCB0aHJvdyBvdGhlcndpc2UuXG4gICAgICAgICAgLy8gdXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZCB3cmFwcyBhIHdyb25nLXBhc3N3b3JkIChvciBjb3JydXB0IGlucHV0KSBmYWlsdXJlIGFzXG4gICAgICAgICAgLy8gJ2ZhaWxlZCB0byB1cGRhdGUga2V5Y2hhaW4gcGFzc3dvcmQ6IC4uLicsIHNvIHRyZWF0IHRoYXQgYXMgYSBza2lwLWFibGUgZXJyb3IuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWUubWVzc2FnZS5pbmNsdWRlcygncHJpdmF0ZSBrZXkgaXMgaW5jb3JyZWN0JykgJiZcbiAgICAgICAgICAgICFlLm1lc3NhZ2UuaW5jbHVkZXMoJ2ZhaWxlZCB0byB1cGRhdGUga2V5Y2hhaW4gcGFzc3dvcmQnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQubmV4dEJhdGNoUHJldklkKSB7XG4gICAgICAgIHByZXZJZCA9IHJlc3VsdC5uZXh0QmF0Y2hQcmV2SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzTGVmdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZEtleXM7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHRoZSBlbmNyeXB0aW9uIHZlcnNpb24gb2YgYSBjaXBoZXJ0ZXh0IGJ5IGluc3BlY3RpbmcgaXRzIFwidlwiIGZpZWxkLlxuICAgKiAgIC0gdjEgKFNKQ0wgLyBQQktERjItU0hBMjU2ICsgQUVTLTI1Ni1DQ00pOiBcInZcIiBhYnNlbnQgb3IgZXhwbGljaXRseSAxXG4gICAqICAgLSB2MiAoQXJnb24yaWQgKyBBRVMtMjU2LUdDTSk6IFwidlwiID09PSAyXG4gICAqIFRocm93cyBvbiB1bnJlY29nbml6ZWQgdmFsdWVzIHNvIGNhbGxlcnMgY2Fubm90IHNpbGVudGx5IG1pcy1oYW5kbGUgdW5rbm93biBlbnZlbG9wZXMuXG4gICAqL1xuICBnZXRFbmNyeXB0aW9uVmVyc2lvbihjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBFbmNyeXB0aW9uVmVyc2lvbiB7XG4gICAgbGV0IGVudmVsb3BlOiB7IHY/OiB1bmtub3duIH07XG4gICAgdHJ5IHtcbiAgICAgIGVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBjaXBoZXJ0ZXh0IGVudmVsb3BlOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoZW52ZWxvcGUudiA9PT0gMikge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICAgIGlmIChlbnZlbG9wZS52ID09PSB1bmRlZmluZWQgfHwgZW52ZWxvcGUudiA9PT0gMSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGVuY3J5cHRpb24gdmVyc2lvbjogJHtTdHJpbmcoZW52ZWxvcGUudil9YCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBwYXNzd29yZCB1c2VkIHRvIGRlY3J5cHQgYSBzaW5nbGUga2V5Y2hhaW4uIERlZmF1bHRzIHRvIHByZXNlcnZpbmcgdGhlXG4gICAqIHNvdXJjZSBlbnZlbG9wZSB2ZXJzaW9uICh2MSBzdGF5cyB2MSwgdjIgc3RheXMgdjIpLCBzbyB0aGlzIGlzIGEgbm8tb3Agd2l0aCByZXNwZWN0IHRvXG4gICAqIGVuY3J5cHRpb24gdmVyc2lvbiB1bmxlc3MgdGhlIGNhbGxlciBvcHRzIGluLiBQYXNzIGBlbmNyeXB0aW9uVmVyc2lvbjogMmAgdG8gZXhwbGljaXRseVxuICAgKiB1cGdyYWRlIGEgdjEgKFNKQ0wpIGtleWNoYWluIHRvIHYyIChBcmdvbjJpZCArIEFFUy0yNTYtR0NNKSBhcyBwYXJ0IG9mIHRoZSBwYXNzd29yZCBjaGFuZ2VcbiAgICogKGUuZy4gb25jZSBhIGNhbGxlciBpcyByZWFkeSwgYWZ0ZXIgdGhlIFNlcHQgMTUgYnJlYWtpbmctY2hhbmdlIHdpbmRvdyBjbG9zZXMpLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMua2V5Y2hhaW4gLSBUaGUga2V5Y2hhaW4gd2hvc2UgcGFzc3dvcmQgc2hvdWxkIGJlIHVwZGF0ZWRcbiAgICogQHBhcmFtIHBhcmFtcy5vbGRQYXNzd29yZCAtIFRoZSBvbGQgcGFzc3dvcmQgdXNlZCBmb3IgZW5jcnlwdGluZyB0aGUga2V5XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3UGFzc3dvcmQgLSBUaGUgbmV3IHBhc3N3b3JkIHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uIC0gT3B0aW9uYWwgZW52ZWxvcGUgdmVyc2lvbiB0byBlbWl0OyBkZWZhdWx0cyB0byB0aGUgc291cmNlIGVudmVsb3BlJ3MgdmVyc2lvblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXljaGFpbj59XG4gICAqL1xuICBhc3luYyB1cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHBhcmFtczogVXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLm9sZFBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBvbGQgcGFzc3dvcmQgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLm5ld1Bhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBuZXcgcGFzc3dvcmQgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmtleWNoYWluKSB8fCAhXy5pc1N0cmluZyhwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBrZXljaGFpbiB0byBiZSBhbiBvYmplY3Qgd2l0aCBhbiBlbmNyeXB0ZWRQcnYgcHJvcGVydHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRFbmNyeXB0ZWRQcnYgPSBwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogb2xkRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLm9sZFBhc3N3b3JkIH0pO1xuICAgICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IGRlY3J5cHRlZFBydixcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5uZXdQYXNzd29yZCxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbiA/PyB0aGlzLmdldEVuY3J5cHRpb25WZXJzaW9uKG9sZEVuY3J5cHRlZFBydiksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfLmFzc2lnbih7fSwgcGFyYW1zLmtleWNoYWluLCB7IGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2IH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNhdGNoaW5nIGFuIGVycm9yIGhlcmUgbWVhbnMgdGhhdCB0aGUgcGFzc3dvcmQgd2FzIGluY29ycmVjdCBvciwgbGVzcyBsaWtlbHksIHRoZSBpbnB1dCB0byBkZWNyeXB0IGlzIGNvcnJ1cHRlZFxuICAgICAgY29uc3QgZXJyb3JEZXRhaWwgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byB1cGRhdGUga2V5Y2hhaW4gcGFzc3dvcmQ6ICR7ZXJyb3JEZXRhaWx9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlY3J5cHQgYW4gZW5jcnlwdGVkIHByaXZhdGUga2V5IHdpdGggYHBhc3NwaHJhc2VgIGFuZCByZS1lbmNyeXB0IGl0IGFzIGEgdjJcbiAgICogKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pIGVudmVsb3BlIHdpdGggdGhlIHNhbWUgcGFzc3BocmFzZS5cbiAgICpcbiAgICogVXNlZCB0byB1cGdyYWRlIGxlZ2FjeSB2MSAoU0pDTCkgZW52ZWxvcGVzIHRvIHYyIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHBhc3NwaHJhc2UuXG4gICAqIENhbGxlcnMgdGhhdCBuZWVkIHRvIHRyeSBhIGZhbGxiYWNrIHBhc3NwaHJhc2UgKGUuZy4gYW4gb3JpZ2luYWwgcGFzc3BocmFzZSBmcm9tXG4gICAqIGJlZm9yZSBhIHBhc3N3b3JkIHJvdGF0aW9uKSBzaG91bGQgaGFuZGxlIHRoYXQgdGhlbXNlbHZlcyDigJQgdGhpcyBwcmltaXRpdmUgZG9lcyBvbmVcbiAgICogdGhpbmcgYW5kIGxldHMgZGVjcnlwdGlvbiBlcnJvcnMgc3VyZmFjZSBkaXJlY3RseS5cbiAgICovXG4gIGFzeW5jIHJlZW5jcnlwdEFzVjIoZW5jcnlwdGVkUHJ2OiBzdHJpbmcsIHBhc3NwaHJhc2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhc3NwaHJhc2UgfSk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZW5jcnlwdCh7IGlucHV0OiBwcnYsIHBhc3N3b3JkOiBwYXNzcGhyYXNlLCBlbmNyeXB0aW9uVmVyc2lvbjogMiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpclxuICAgKiBAcGFyYW0gcGFyYW1zIC0gb3B0aW9uYWwgcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuc2VlZCBvcHRpb25hbCAtIHNlZWQgdG8gdXNlIGZvciBrZXlwYWlyIGdlbmVyYXRpb25cbiAgICogQHBhcmFtIHBhcmFtcy5pc1Jvb3RLZXkgb3B0aW9uYWwgLSB3aGV0aGVyIHRoZSByZXN1bHRpbmcga2V5cGFpciBzaG91bGQgYmUgYSByb290IGtleVxuICAgKiBAcmV0dXJucyB7S2V5UGFpcn0gLSB0aGUgZ2VuZXJhdGVkIGtleXBhaXJcbiAgICovXG4gIGNyZWF0ZShwYXJhbXM6IHsgc2VlZD86IEJ1ZmZlcjsgaXNSb290S2V5PzogYm9vbGVhbiB9ID0ge30pOiBLZXlQYWlyIHtcbiAgICBpZiAocGFyYW1zPy5pc1Jvb3RLZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmdlbmVyYXRlUm9vdEtleVBhaXIocGFyYW1zLnNlZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5nZW5lcmF0ZUtleVBhaXIocGFyYW1zLnNlZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGtleWNoYWluIHRvIEJpdEdvJ3MgcmVjb3Jkc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBhZGQocGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgcGFyYW1zLFxuICAgICAgW10sXG4gICAgICBbXG4gICAgICAgICdwdWInLFxuICAgICAgICAnZW5jcnlwdGVkUHJ2JyxcbiAgICAgICAgJ2tleVR5cGUnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICdzb3VyY2UnLFxuICAgICAgICAnb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlJyxcbiAgICAgICAgJ2VudGVycHJpc2UnLFxuICAgICAgICAnZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCcsXG4gICAgICAgICdkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnLFxuICAgICAgICAncGFyZW50JyxcbiAgICAgICAgJ3NhZmVJZCcsXG4gICAgICBdXG4gICAgKTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZGlzYWJsZUtSU0VtYWlsKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUtSU0VtYWlsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGlzYWJsZUtSU0VtYWlsIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL2tleScpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICBwdWI6IHBhcmFtcy5wdWIsXG4gICAgICAgIGNvbW1vblB1YjogcGFyYW1zLmNvbW1vblB1YixcbiAgICAgICAgY29tbW9uS2V5Y2hhaW46IHBhcmFtcy5jb21tb25LZXljaGFpbixcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBwYXJhbXMuZW5jcnlwdGVkUHJ2LFxuICAgICAgICB0eXBlOiBwYXJhbXMudHlwZSxcbiAgICAgICAga2V5VHlwZTogcGFyYW1zLmtleVR5cGUsXG4gICAgICAgIHNvdXJjZTogcGFyYW1zLnNvdXJjZSxcbiAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlcixcbiAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogcGFyYW1zLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQsXG4gICAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aDogcGFyYW1zLmRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCxcbiAgICAgICAgcGFyZW50OiBwYXJhbXMucGFyZW50LFxuICAgICAgICBkaXNhYmxlS1JTRW1haWw6IHBhcmFtcy5kaXNhYmxlS1JTRW1haWwsXG4gICAgICAgIGtyc1NwZWNpZmljOiBwYXJhbXMua3JzU3BlY2lmaWMsXG4gICAgICAgIGtleVNoYXJlczogcGFyYW1zLmtleVNoYXJlcyxcbiAgICAgICAgdXNlckdQR1B1YmxpY0tleTogcGFyYW1zLnVzZXJHUEdQdWJsaWNLZXksXG4gICAgICAgIGJhY2t1cEdQR1B1YmxpY0tleTogcGFyYW1zLmJhY2t1cEdQR1B1YmxpY0tleSxcbiAgICAgICAgYWxnb1VzZWQ6IHBhcmFtcy5hbGdvVXNlZCxcbiAgICAgICAgaXNEaXN0cmlidXRlZEN1c3RvZHk6IHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSxcbiAgICAgICAgaXNNUEN2MjogcGFyYW1zLmlzTVBDdjIsXG4gICAgICAgIGNvaW5TcGVjaWZpYzogcGFyYW1zLmNvaW5TcGVjaWZpYyxcbiAgICAgICAgd2ViYXV0aG5EZXZpY2VzOiBwYXJhbXMud2ViYXV0aG5EZXZpY2VzLFxuICAgICAgICB3ZWJhdXRobkluZm86IHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICAgIHNhZmVJZDogcGFyYW1zLnNhZmVJZCxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQml0R28ga2V5XG4gICAqIEBwYXJhbSBwYXJhbXMgKGVtcHR5KVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQml0R28ocGFyYW1zOiBDcmVhdGVCaXRHb09wdGlvbnMgPSB7fSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBwYXJhbXMuc291cmNlID0gJ2JpdGdvJztcblxuICAgIHRoaXMuYmFzZUNvaW4ucHJlQ3JlYXRlQml0R28ocGFyYW1zIGFzIGFueSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYWRkKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFja3VwIGtleVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMucHJvdmlkZXIgKG9wdGlvbmFsKVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQmFja3VwKHBhcmFtczogQ3JlYXRlQmFja3VwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHBhcmFtcy5zb3VyY2UgPSAnYmFja3VwJztcblxuICAgIGNvbnN0IGlzVHNzQmFja3VwS2V5ID0gcGFyYW1zLnBydiAmJiAocGFyYW1zLmNvbW1vbktleWNoYWluIHx8IHBhcmFtcy5jb21tb25QdWIpO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnByb3ZpZGVyKSAmJiAhaXNUc3NCYWNrdXBLZXkpIHtcbiAgICAgIC8vIGlmIHRoZSBwcm92aWRlciBpcyB1bmRlZmluZWQsIHdlIGdlbmVyYXRlIGEgbG9jYWwga2V5IGFuZCBhZGQgdGhlIHNvdXJjZSBkZXRhaWxzXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgXy5leHRlbmQocGFyYW1zLCBrZXkpO1xuICAgICAgaWYgKHBhcmFtcy5wYXNzcGhyYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgXy5leHRlbmQocGFyYW1zLCB7XG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IGtleS5wcnYsXG4gICAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXYWxsZXQgU2FmZXMgdjEgc2xvdCDikaMgKGBlZDI1NTE5TXVsdGlzaWdgKTogbWFrZSB0aGUgYmFja3VwIHJvb3Qgc29mdC1kZXJpdmFibGUgYnkgZm9sZGluZyBhXG4gICAgLy8gZnJlc2ggY2hhaW4gY29kZSBpbnRvIGBwdWJgLiBOb3RoaW5nIGVsc2Ugb24gdGhlIHdpcmUgY2hhbmdlcyDigJQgdGhlIGNoYWluIGNvZGUgaGFzIG5vIGZpZWxkIG9mXG4gICAgLy8gaXRzIG93biwgYW5kIGNhbGxlcnMgcmVjb3ZlciBpdCB3aXRoIGBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViYCBvbiB0aGUgcmV0dXJuZWQgcHViLlxuICAgIC8vXG4gICAgLy8gVGhlIHNsb3QgaXMgaWRlbnRpZmllZCBmcm9tIHRoZSBnZW5lcmF0ZWQgcHViIGl0c2VsZjogYHNhZmVJZGAgbWFya3MgaXQgYXMgYSBzYWZlIHJvb3QsIGFuZCBhXG4gICAgLy8gU3RyS2V5IGVkMjU1MTkgcHViIG5hcnJvd3MgaXQgdG8gc2xvdCDikaMuIFRoYXQgaXMgZXhhY3Qg4oCUIHNsb3Qg4pGgIHJvb3RzIGFyZSBzZWNwMjU2azEgKGFuIHhwdWIsXG4gICAgLy8gd2hpY2ggYWxyZWFkeSBjYXJyaWVzIGl0cyBvd24gY2hhaW4gY29kZSkgYW5kIHNsb3RzIOKRoeKRoiBhcmUgTVBDLCB3aGljaCBydW4gdGhyb3VnaCBgY3JlYXRlTXBjYFxuICAgIC8vIGFuZCBuZXZlciByZWFjaCBoZXJlLlxuICAgIGNvbnN0IHdpdGhLZXkgPSBwYXJhbXMgYXMgQ3JlYXRlQmFja3VwT3B0aW9ucyAmIHsgcHViPzogc3RyaW5nIH07XG4gICAgaWYgKHBhcmFtcy5zYWZlSWQgIT09IHVuZGVmaW5lZCAmJiB3aXRoS2V5LnB1YiAhPT0gdW5kZWZpbmVkICYmIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KHdpdGhLZXkucHViKSkge1xuICAgICAgd2l0aEtleS5wdWIgPSBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHdpdGhLZXkucHViLCBnZW5lcmF0ZUVkMjU1MTlDaGFpbkNvZGVCYXNlMzIoKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmVyUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFkZChwYXJhbXMpO1xuICAgIHJldHVybiBfLmV4dGVuZCh7fSwgc2VydmVyUmVzcG9uc2UsIF8ucGljayhwYXJhbXMsIFsncHJ2JywgJ2VuY3J5cHRlZFBydicsICdwcm92aWRlcicsICdzb3VyY2UnXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMga2V5cyBmb3Igc2lnbmluZyBmcm9tIGEgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8S2V5Y2hhaW5bXT59XG4gICAqL1xuICBhc3luYyBnZXRLZXlzRm9yU2lnbmluZyhwYXJhbXM6IEdldEtleXNGb3JTaWduaW5nT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxLZXljaGFpbltdPiB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy53YWxsZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gd2FsbGV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHdhbGxldCA9IHBhcmFtcy53YWxsZXQ7XG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBpZHMgPSB3YWxsZXQuYmFzZUNvaW4ua2V5SWRzRm9yU2lnbmluZygpO1xuICAgIGNvbnN0IGtleWNoYWluUXVlcmllc0JsdWViaXJkcyA9IGlkcy5tYXAoKGlkKSA9PiB0aGlzLmdldCh7IGlkOiB3YWxsZXQua2V5SWRzKClbaWRdLCByZXFJZCB9KSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGtleWNoYWluUXVlcmllc0JsdWViaXJkcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGFuZCBzdG9yZSBNUEMga2V5Y2hhaW5zIHdpdGggQml0R28uXG4gICAqIEBwYXJhbSBwYXJhbXMgcGFzc3BocmFzZSB1c2VkIHRvIGVuY3J5cHQgc2VjcmV0IG1hdGVyaWFsc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+fSBuZXdseSBjcmVhdGVkIFVzZXIsIEJhY2t1cCwgYW5kIEJpdEdvIGtleXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZU1wYyhwYXJhbXM6IENyZWF0ZU1wY09wdGlvbnMpOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBpZiAocGFyYW1zLm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbXVsdGktc2lnIHR5cGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgIC5xdWVyeSh7IGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgY29uc3QgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/Lm11bHRpU2lnVHlwZVZlcnNpb247XG5cbiAgICBjb25zdCBpc01QQ3YyID0gbXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJztcbiAgICBpZiAocGFyYW1zLnNhZmVJZCAmJiAhaXNNUEN2Mikge1xuICAgICAgLy8gVGhlIGxlZ2FjeSBNUEN2MSBjZXJlbW9uaWVzIGFjY2VwdCBhIHNhZmVJZCBmb3Igc2lnbmF0dXJlIGNvbXBhdGliaWxpdHkgYnV0IHNpbGVudGx5XG4gICAgICAvLyBpZ25vcmUgaXQgKHNlZSBFRERTQVV0aWxzLmRlZmF1bHQuY3JlYXRlS2V5Y2hhaW5zIC8gRUNEU0FVdGlscy5FY2RzYVV0aWxzLmNyZWF0ZUtleWNoYWlucyksXG4gICAgICAvLyBzbyB0aGUgcmVzdWx0aW5nIGtleXMgbmV2ZXIgZ2V0IHRhZ2dlZCB3aXRoIHRoZSBzYWZlIGFuZCBXUCdzIGZpbmFsaXplIHN0ZXAgcmVqZWN0cyB0aGVtXG4gICAgICAvLyB3aXRoIGEgZ2VuZXJpYyA0MDAuIEZhaWwgZmFzdCBoZXJlIGluc3RlYWQgb2YgbGV0dGluZyB0aGF0IGNvbmZ1c2luZyBlcnJvciBzdXJmYWNlIGxhdGVyLlxuICAgICAgdGhyb3cgbmV3IFNhZmVNcGNDZXJlbW9ueVVuc3VwcG9ydGVkRXJyb3IodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSk7XG4gICAgfVxuXG4gICAgbGV0IE1wY1V0aWxzO1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWRkc2EnKSB7XG4gICAgICBNcGNVdGlscyA9IGlzTVBDdjIgPyBFRERTQVV0aWxzLkVkZHNhTVBDdjJVdGlscyA6IEVERFNBVXRpbHMuZGVmYXVsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgTXBjVXRpbHMgPSBpc01QQ3YyID8gRUNEU0FVdGlscy5FY2RzYU1QQ3YyVXRpbHMgOiBFQ0RTQVV0aWxzLkVjZHNhVXRpbHM7XG4gICAgfVxuXG4gICAgY29uc3QgbXBjVXRpbHMgPSBuZXcgTXBjVXRpbHModGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbik7XG4gICAgcmV0dXJuIGF3YWl0IG1wY1V0aWxzLmNyZWF0ZUtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgcmV0cm9maXQ6IHBhcmFtcy5yZXRyb2ZpdCxcbiAgICAgIHdlYmF1dGhuSW5mbzogcGFyYW1zLndlYmF1dGhuSW5mbyxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBzYWZlSWQ6IHBhcmFtcy5zYWZlSWQsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWNyZWF0ZU1wYyhwYXJhbXM6IFJlY3JlYXRlTXBjT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGFzc2VydChwYXJhbXMuY29pbiwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGNvaW4nKSk7XG4gICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRJZCwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIHdhbGxldElkJykpO1xuICAgIGFzc2VydChwYXJhbXMub3RwLCBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gb3RwJykpO1xuICAgIGFzc2VydChwYXJhbXMucGFzc3BocmFzZSwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIHBhc3NwaHJhc2UnKSk7XG5cbiAgICBhc3NlcnQoXG4gICAgICBwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBlbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlJylcbiAgICApO1xuICAgIGFzc2VydChwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSwgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGVuY3J5cHRlZFVzZXJLZXknKSk7XG4gICAgYXNzZXJ0KHBhcmFtcy5lbmNyeXB0ZWRNYXRlcmlhbC5lbmNyeXB0ZWRCYWNrdXBLZXksIG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBlbmNyeXB0ZWRCYWNrdXBLZXknKSk7XG5cbiAgICBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YxL3VzZXIvdW5sb2NrJykpLnNlbmQoeyBvdHA6IHBhcmFtcy5vdHAgfSkucmVzdWx0KCk7XG4gICAgY29uc3QgeyByZWNvdmVyeUluZm8gfSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybChgL2FwaS92Mi8ke3BhcmFtcy5jb2lufS93YWxsZXQvJHtwYXJhbXMud2FsbGV0SWR9L3Bhc3Njb2RlcmVjb3ZlcnlgKSlcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGlmICghcmVjb3ZlcnlJbmZvIHx8ICEoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUnIGluIHJlY292ZXJ5SW5mbykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGdldCByZWNvdmVyeSBpbmZvJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBpbnB1dDogcGFyYW1zLmVuY3J5cHRlZE1hdGVyaWFsLmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBwYXNzd29yZDogcmVjb3ZlcnlJbmZvLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRVc2VyS2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSxcbiAgICAgIHBhc3N3b3JkOiBkZWNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQmFja3VwS2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBwYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwuZW5jcnlwdGVkQmFja3VwS2V5LFxuICAgICAgcGFzc3dvcmQ6IGRlY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNcGMoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgIHJldHJvZml0OiB7XG4gICAgICAgIGRlY3J5cHRlZFVzZXJLZXksXG4gICAgICAgIGRlY3J5cHRlZEJhY2t1cEtleSxcbiAgICAgICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXRJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgcGFyc2VzIHRoZSBKU09OIGRvd25sb2FkZWQgZnJvbSB0aGUgT1ZDIGZvciBwbGF0Zm9ybSAoQml0R28pLFxuICAgKiBhbmQgY3JlYXRlcyBhIGNvcnJlc3BvbmRpbmcgVFNTIEJpdEdvIGtleS4gSXQgYWxzbyByZXR1cm5zIHRoZSBKU09OIHRoYXQgbmVlZHNcbiAgICogdG8gYmUgdXBsb2FkZWQgYmFjayB0byB0aGUgT1ZDcyBjb250YWluaW5nIHRoZSBCaXRHbyAtPiBPVkMgc2hhcmVzLlxuICAgKiBAcGFyYW0gb3ZjT3V0cHV0SnNvbiBKU09OIGZvcm1hdCBvZiB0aGUgZmlsZSBkb3dubG9hZGVkIGZyb20gdGhlIE9WQyBmb3IgcGxhdGZvcm1cbiAgICogQHBhcmFtIGVudGVycHJpc2UgT3B0aW9uYWwgZW50ZXJwcmlzZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleVxuICAgKiBAcmV0dXJucyB7Qml0R29LZXlGcm9tT3ZjU2hhcmVzfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVHNzQml0R29LZXlGcm9tT3ZjU2hhcmVzKG92Y091dHB1dEpzb246IHVua25vd24sIGVudGVycHJpc2U/OiBzdHJpbmcpOiBQcm9taXNlPEJpdEdvS2V5RnJvbU92Y1NoYXJlcz4ge1xuICAgIGNvbnN0IGRlY29kZWRPdmNPdXRwdXQgPSBkZWNvZGVPckVsc2UoT3ZjVG9CaXRHb0pTT04ubmFtZSwgT3ZjVG9CaXRHb0pTT04sIG92Y091dHB1dEpzb24sIChlcnJvcnMpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IocykgcGFyc2luZyBPVkMgSlNPTjogJHtlcnJvcnN9YCk7XG4gICAgfSk7XG5cbiAgICBpZiAoZGVjb2RlZE92Y091dHB1dC5zdGF0ZSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGF0ZSBleHBlY3RlZCB0byBiZSBcIjFcIi4gUGxlYXNlIGNvbXBsZXRlIHRoZSBmaXJzdCB0d28gT1ZDIG9wZXJhdGlvbnMnKTtcbiAgICB9XG5cbiAgICAvLyBPVkMtMSBpcyByZXNwb25zaWJsZSBmb3IgdGhlIFVzZXIga2V5XG4gICAgY29uc3Qgb3ZjMSA9IGRlY29kZWRPdmNPdXRwdXQub3ZjWzFdO1xuICAgIC8vIE9WQy0yIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgQmFja3VwIGtleVxuICAgIGNvbnN0IG92YzIgPSBkZWNvZGVkT3ZjT3V0cHV0Lm92Y1syXTtcblxuICAgIGNvbnN0IGtleVNoYXJlczogQXBpS2V5U2hhcmVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgcHVibGljU2hhcmU6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICBwcml2YXRlU2hhcmU6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnVTaWcudG9TdHJpbmcoKSA/PyAnJyxcbiAgICAgICAgdnNzUHJvb2Y6IG92YzEub3ZjVG9CaXRnb1NoYXJlLnZzc1Byb29mID8/ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICBwdWJsaWNTaGFyZTogb3ZjMi5vdmNUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgIHByaXZhdGVTaGFyZTogb3ZjMi5vdmNUb0JpdGdvU2hhcmUucHJpdmF0ZVNoYXJlLFxuICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogb3ZjMi5vdmNUb0JpdGdvU2hhcmUudVNpZy50b1N0cmluZygpID8/ICcnLFxuICAgICAgICB2c3NQcm9vZjogb3ZjMi5vdmNUb0JpdGdvU2hhcmUudnNzUHJvb2YgPz8gJycsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7XG4gICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICBrZXlTaGFyZXMsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIHVzZXJHUEdQdWJsaWNLZXk6IG92YzEuZ3BnUHViS2V5LFxuICAgICAgYmFja3VwR1BHUHVibGljS2V5OiBvdmMyLmdwZ1B1YktleSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgfSk7XG4gICAgYXNzZXJ0KGtleS5rZXlTaGFyZXMpO1xuICAgIGFzc2VydChrZXkuY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydChrZXkud2FsbGV0SFNNR1BHUHVibGljS2V5U2lncyk7XG5cbiAgICBjb25zdCBiaXRnb1RvVXNlclNoYXJlID0ga2V5LmtleVNoYXJlcy5maW5kKFxuICAgICAgKHZhbHVlOiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSA9PiB2YWx1ZS5mcm9tID09PSAnYml0Z28nICYmIHZhbHVlLnRvID09PSAndXNlcidcbiAgICApO1xuICAgIGFzc2VydChiaXRnb1RvVXNlclNoYXJlKTtcbiAgICBhc3NlcnQoYml0Z29Ub1VzZXJTaGFyZS52c3NQcm9vZik7XG4gICAgYXNzZXJ0KGJpdGdvVG9Vc2VyU2hhcmUucGFpbGxpZXJQdWJsaWNLZXkpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBTaGFyZSA9IGtleS5rZXlTaGFyZXMuZmluZChcbiAgICAgICh2YWx1ZTogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSkgPT4gdmFsdWUuZnJvbSA9PT0gJ2JpdGdvJyAmJiB2YWx1ZS50byA9PT0gJ2JhY2t1cCdcbiAgICApO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwU2hhcmUpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwU2hhcmUudnNzUHJvb2YpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwU2hhcmUucGFpbGxpZXJQdWJsaWNLZXkpO1xuXG4gICAgLy8gQ3JlYXRlIEpTT04gZGF0YSB3aXRoIHBsYXRmb3JtIHNoYXJlcyBmb3IgT1ZDLTEgYW5kIE9WQy0yXG4gICAgY29uc3QgYml0Z29Ub092Y091dHB1dDogQml0R29Ub092Y0pTT04gPSB7XG4gICAgICB3YWxsZXQ6IHtcbiAgICAgICAgLi4uZGVjb2RlZE92Y091dHB1dCxcbiAgICAgICAgcGxhdGZvcm06IHtcbiAgICAgICAgICBjb21tb25LZXljaGFpbjoga2V5LmNvbW1vbktleWNoYWluLFxuICAgICAgICAgIHdhbGxldEdwZ1B1YktleVNpZ3M6IGtleS53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzLFxuICAgICAgICAgIG92Yzoge1xuICAgICAgICAgICAgLy8gQml0R28gdG8gVXNlciAoT1ZDLTEpXG4gICAgICAgICAgICAxOiB7XG4gICAgICAgICAgICAgIGJpdGdvVG9PdmNTaGFyZToge1xuICAgICAgICAgICAgICAgIGk6IDEsXG4gICAgICAgICAgICAgICAgajogMyxcbiAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogYml0Z29Ub1VzZXJTaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlU2hhcmU6IGJpdGdvVG9Vc2VyU2hhcmUucHJpdmF0ZVNoYXJlLFxuICAgICAgICAgICAgICAgIHBhaWxsaWVyUHVibGljS2V5OiBiaXRnb1RvVXNlclNoYXJlLnBhaWxsaWVyUHVibGljS2V5LFxuICAgICAgICAgICAgICAgIHZzc1Byb29mOiBiaXRnb1RvVXNlclNoYXJlLnZzc1Byb29mLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIEJpdEdvIHRvIEJhY2t1cCAoT1ZDLTIpXG4gICAgICAgICAgICAyOiB7XG4gICAgICAgICAgICAgIGJpdGdvVG9PdmNTaGFyZToge1xuICAgICAgICAgICAgICAgIGk6IDIsXG4gICAgICAgICAgICAgICAgajogMyxcbiAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogYml0Z29Ub0JhY2t1cFNoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgICAgICAgIHByaXZhdGVTaGFyZTogYml0Z29Ub0JhY2t1cFNoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICAgICAgICBwYWlsbGllclB1YmxpY0tleTogYml0Z29Ub0JhY2t1cFNoYXJlLnBhaWxsaWVyUHVibGljS2V5LFxuICAgICAgICAgICAgICAgIHZzc1Byb29mOiBiaXRnb1RvQmFja3VwU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBNYXJrIGl0IHJlYWR5IGZvciBuZXh0IG9wZXJhdGlvbiwgc2hvdWxkIGJlIDJcbiAgICBiaXRnb1RvT3ZjT3V0cHV0LndhbGxldC5zdGF0ZSArPSAxO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBCaXRHb0tleUZyb21PdmNTaGFyZXMgPSB7XG4gICAgICBiaXRHb0tleUlkOiBrZXkuaWQsXG4gICAgICBiaXRHb091dHB1dEpzb25Gb3JPdmM6IGJpdGdvVG9PdmNPdXRwdXQsXG4gICAgfTtcblxuICAgIHJldHVybiBkZWNvZGVPckVsc2UoQml0R29LZXlGcm9tT3ZjU2hhcmVzLm5hbWUsIEJpdEdvS2V5RnJvbU92Y1NoYXJlcywgb3V0cHV0LCAoZXJyb3JzKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHByb2R1Y2luZyB0aGUgb3V0cHV0OiAke2Vycm9yc31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdXNlciBrZXljaGFpbiwgZW5jcnlwdCB0aGUgcHJpdmF0ZSBrZXkgd2l0aCB0aGUgd2FsbGV0IHBhc3NwaHJhc2UgYW5kIHN0b3JlIGl0IGluIEJpdEdvLlxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZVxuICAgKiBAcmV0dXJucyBLZXljaGFpbiBpbmNsdWRpbmcgdGhlIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVXNlcktleWNoYWluKFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIHNlc3Npb24/OiBJRW5jcnlwdGlvblNlc3Npb25cbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3QgbmV3S2V5Y2hhaW4gPSBrZXljaGFpbnMuY3JlYXRlKCk7XG4gICAgY29uc3Qgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlID0gZ2VuZXJhdGVSYW5kb21QYXNzd29yZCg1KTtcblxuICAgIC8vIFdoZW4gYSBzZXNzaW9uIGlzIHRocmVhZGVkIGluICh0eXBpY2FsbHkgZnJvbSBhIGJ1bGsgb3BlcmF0aW9uIHRoYXQgYWxyZWFkeSByYW4gdGhlIEtERlxuICAgIC8vIG9uY2UpLCByZXVzZSBpdCBzbyB0aGlzIGVudmVsb3BlJ3MgQUVTIGtleSBkZXJpdmVzIHZpYSBIS0RGIGluc3RlYWQgb2YgYW5vdGhlciBBcmdvbjIuXG4gICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gc2Vzc2lvblxuICAgICAgPyBhd2FpdCBzZXNzaW9uLmVuY3J5cHQobmV3S2V5Y2hhaW4ucHJ2KVxuICAgICAgOiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIGlucHV0OiBuZXdLZXljaGFpbi5wcnYsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKHtcbiAgICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHB1YjogbmV3S2V5Y2hhaW4ucHViLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIH0pKSxcbiAgICAgIHBydjogbmV3S2V5Y2hhaW4ucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUm90YXRlIGFuIG9mYyBtdWx0aS11c2VyLWtleWNoYWluIGJ5IHJlY3JlYXRpbmcgYSBuZXcga2V5cGFpciwgZW5jcnlwdCBpdCB1c2luZyB0aGUgdXNlciBwYXNzd29yZCBhbmQgc2VudCBpdCB0byBXUFxuICAgKiBUaGlzIGlzIG9ubHkgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IG9mYyBtdWx0aS11c2VyLXdhbGxldCdzIGtleSwgYW5kIHdpbGwgdGhyb3cgaWYgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBSZXF1aXJlcyAyZmEgYXV0aCBiZWZvcmUgY2FsbGluZy4gQ2FsbCB0aGUgYml0Z28udW5sb2NrKCkgU0RLIG1ldGhvZCB0byB1bmxvY2sgdGhlIHNlc3Npb24gZmlyc3QuXG4gICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVycyBmb3IgdGhlIHJvdGF0ZSBrZXljaGFpbiBtZXRob2RcbiAgICogQHJldHVybiByb3RhdGVkS2V5Y2hhaW5cbiAgICovXG4gIGFzeW5jIHJvdGF0ZUtleWNoYWluKHBhcmFtczogUm90YXRlS2V5Y2hhaW5PcHRpb25zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGtleUNoYWluID0gYXdhaXQgdGhpcy5nZXQoeyBpZDogcGFyYW1zLmlkIH0pO1xuICAgIGlmICghS2V5Y2hhaW5zLmlzTXVsdGlVc2VyS2V5KGtleUNoYWluKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGByb3RhdGVLZXljaGFpbiBpcyBvbmx5IHBlcm1pdHRlZCBmb3Igb2ZjIG11bHRpLXVzZXIta2V5IHdhbGxldGApO1xuICAgIH1cblxuICAgIGxldCBwdWI6IHN0cmluZywgZW5jcnlwdGVkUHJ2OiBzdHJpbmc7XG4gICAgaWYgKCdlbmNyeXB0ZWRQcnYnIGluIHBhcmFtcykge1xuICAgICAgLy8gY2xpZW50IHBhc3NlZCBpbiBwdWIgYW5kIGVuY3J5cHRlZFBydiBkaXJlY3RseVxuICAgICAgcHViID0gcGFyYW1zLnB1YjtcbiAgICAgIGVuY3J5cHRlZFBydiA9IHBhcmFtcy5lbmNyeXB0ZWRQcnY7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGJpdGdvIGdlbmVyYXRlIHB1YiBhbmQgcHJ2IGFuZCBlbmNyeXB0IGl0XG4gICAgICBjb25zdCB7IHB1Yjoga2V5UHViLCBwcnY6IGtleVBydiB9ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgIGlmICgha2V5UHViKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBhIHB1YmxpYyBrZXkgdG8gYmUgZ2VuZXJhdGVkJyk7XG4gICAgICB9XG4gICAgICBwdWIgPSBrZXlQdWI7XG4gICAgICBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDoga2V5UHJ2LFxuICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3N3b3JkLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy5iYXNlQ29pbi51cmwoYC9rZXkvJHtwYXJhbXMuaWR9YCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgICAgcHViLFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgaGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgYSBrZXljaGFpbiBpcyBhIG9mYyBtdWx0aS11c2VyLWtleVxuICAgKiBAcGFyYW0ga2V5Y2hhaW5cbiAgICovXG4gIHN0YXRpYyBpc011bHRpVXNlcktleShrZXljaGFpbjogS2V5Y2hhaW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGtleWNoYWluLmNvaW5TcGVjaWZpYz8ub2ZjPy5bJ2ZlYXR1cmVzJ10gPz8gW10pLmluY2x1ZGVzKCdtdWx0aS11c2VyLWtleScpO1xuICB9XG59XG4iXX0=