@bitgo-beta/sdk-core 8.2.1-beta.180 → 8.2.1-beta.1801

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 (600) 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 +50 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +90 -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 +30 -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 +61 -0
  87. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
  88. package/dist/src/bitgo/address-book/address-book.js +139 -0
  89. package/dist/src/bitgo/address-book/index.d.ts +3 -0
  90. package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
  91. package/dist/src/bitgo/address-book/index.js +19 -0
  92. package/dist/src/bitgo/address-book/types.d.ts +170 -0
  93. package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
  94. package/dist/src/bitgo/address-book/types.js +3 -0
  95. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +99 -11
  96. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  97. package/dist/src/bitgo/baseCoin/baseCoin.js +168 -16
  98. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +192 -28
  99. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  100. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  101. package/dist/src/bitgo/baseCoin/index.js +6 -2
  102. package/dist/src/bitgo/bip32util.d.ts +3 -16
  103. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  104. package/dist/src/bitgo/bip32util.js +4 -56
  105. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  106. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  107. package/dist/src/bitgo/bitcoin.js +26 -13
  108. package/dist/src/bitgo/bitgoBase.d.ts +8 -1
  109. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  110. package/dist/src/bitgo/bitgoBase.js +1 -1
  111. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  112. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  113. package/dist/src/bitgo/coinFactory.js +26 -3
  114. package/dist/src/bitgo/config.d.ts +3 -95
  115. package/dist/src/bitgo/config.d.ts.map +1 -1
  116. package/dist/src/bitgo/config.js +26 -15
  117. package/dist/src/bitgo/ecdh.d.ts +0 -1
  118. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  119. package/dist/src/bitgo/ecdh.js +26 -13
  120. package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -4
  121. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  122. package/dist/src/bitgo/enterprise/enterprise.js +39 -21
  123. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  124. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +2 -3
  125. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  126. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  127. package/dist/src/bitgo/enterprise/index.js +6 -2
  128. package/dist/src/bitgo/environments.d.ts +69 -5
  129. package/dist/src/bitgo/environments.d.ts.map +1 -1
  130. package/dist/src/bitgo/environments.js +403 -40
  131. package/dist/src/bitgo/errors.d.ts +175 -0
  132. package/dist/src/bitgo/errors.d.ts.map +1 -1
  133. package/dist/src/bitgo/errors.js +166 -2
  134. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  135. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  136. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  137. package/dist/src/bitgo/index.d.ts +3 -1
  138. package/dist/src/bitgo/index.d.ts.map +1 -1
  139. package/dist/src/bitgo/index.js +29 -11
  140. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  141. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  142. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  143. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  144. package/dist/src/bitgo/internal/index.js +6 -2
  145. package/dist/src/bitgo/internal/internal.js +5 -6
  146. package/dist/src/bitgo/internal/keycard.d.ts +18 -6
  147. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  148. package/dist/src/bitgo/internal/keycard.js +102 -44
  149. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +24 -0
  150. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  151. package/dist/src/bitgo/keychain/decryptKeychain.js +67 -0
  152. package/dist/src/bitgo/keychain/iKeychains.d.ts +93 -8
  153. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  154. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  155. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  156. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  157. package/dist/src/bitgo/keychain/index.js +7 -2
  158. package/dist/src/bitgo/keychain/keychains.d.ts +48 -6
  159. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  160. package/dist/src/bitgo/keychain/keychains.js +244 -46
  161. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  162. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  163. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  164. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  165. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  166. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  167. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  168. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  169. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  170. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  171. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  172. package/dist/src/bitgo/market/index.js +6 -2
  173. package/dist/src/bitgo/market/markets.js +23 -9
  174. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
  175. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  176. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  177. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  178. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  179. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  180. package/dist/src/bitgo/pendingApproval/pendingApproval.js +228 -110
  181. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  182. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  183. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  184. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  185. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  186. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  187. package/dist/src/bitgo/proofs/index.js +6 -0
  188. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  189. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  190. package/dist/src/bitgo/proofs/types.js +80 -0
  191. package/dist/src/bitgo/recovery/index.js +6 -2
  192. package/dist/src/bitgo/recovery/initiate.d.ts +24 -1
  193. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  194. package/dist/src/bitgo/recovery/initiate.js +88 -40
  195. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +132 -0
  196. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  197. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  198. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  199. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  200. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  201. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  202. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  203. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  204. package/dist/src/bitgo/staking/iStakingWallet.d.ts +173 -7
  205. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  206. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  207. package/dist/src/bitgo/staking/index.d.ts +3 -0
  208. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  209. package/dist/src/bitgo/staking/index.js +9 -2
  210. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  211. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  212. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  213. package/dist/src/bitgo/trading/iTradingAccount.d.ts +15 -1
  214. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  215. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  216. package/dist/src/bitgo/trading/index.d.ts +1 -0
  217. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  218. package/dist/src/bitgo/trading/index.js +7 -2
  219. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  220. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  221. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  222. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  223. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  224. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  225. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  226. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  227. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  228. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  229. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  230. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  231. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  232. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  233. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  234. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  235. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  236. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  237. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  238. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  239. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  240. package/dist/src/bitgo/trading/network/index.d.ts +5 -0
  241. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
  242. package/dist/src/bitgo/trading/network/index.js +21 -0
  243. package/dist/src/bitgo/trading/network/network.d.ts +36 -0
  244. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
  245. package/dist/src/bitgo/trading/network/network.js +99 -0
  246. package/dist/src/bitgo/trading/network/types.d.ts +277 -0
  247. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
  248. package/dist/src/bitgo/trading/network/types.js +3 -0
  249. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  250. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  251. package/dist/src/bitgo/trading/network/utils.js +54 -0
  252. package/dist/src/bitgo/trading/tradingAccount.d.ts +22 -1
  253. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  254. package/dist/src/bitgo/trading/tradingAccount.js +64 -7
  255. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
  256. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  257. package/dist/src/bitgo/tss/bitgoPubKeys.js +72 -0
  258. package/dist/src/bitgo/tss/common.d.ts +39 -6
  259. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  260. package/dist/src/bitgo/tss/common.js +112 -17
  261. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  262. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  263. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  264. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  265. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  266. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  267. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  268. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  269. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  270. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  271. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  272. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  273. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  274. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  275. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  276. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
  277. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  278. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
  279. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  280. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  281. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  282. package/dist/src/bitgo/tss/index.d.ts +3 -2
  283. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  284. package/dist/src/bitgo/tss/index.js +26 -10
  285. package/dist/src/bitgo/tss/types.d.ts +3 -3
  286. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  287. package/dist/src/bitgo/tss/types.js +2 -2
  288. package/dist/src/bitgo/types.d.ts +3 -3
  289. package/dist/src/bitgo/types.d.ts.map +1 -1
  290. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +8 -0
  291. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  292. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +55 -13
  293. package/dist/src/bitgo/utils/codecProps.js +24 -11
  294. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  295. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  296. package/dist/src/bitgo/utils/codecs.js +59 -0
  297. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  298. package/dist/src/bitgo/utils/decode.js +30 -16
  299. package/dist/src/bitgo/utils/index.d.ts +4 -2
  300. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  301. package/dist/src/bitgo/utils/index.js +27 -11
  302. package/dist/src/bitgo/utils/messageTypes.d.ts +38 -0
  303. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  304. package/dist/src/bitgo/utils/messageTypes.js +15 -0
  305. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  306. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  307. package/dist/src/bitgo/utils/mpcUtils.js +109 -14
  308. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  309. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  310. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  311. package/dist/src/bitgo/utils/opengpgUtils.d.ts +12 -9
  312. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  313. package/dist/src/bitgo/utils/opengpgUtils.js +77 -64
  314. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  315. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  316. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  317. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  318. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  319. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  320. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  321. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  322. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  323. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  324. package/dist/src/bitgo/utils/triple.js +2 -3
  325. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +37 -0
  326. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  327. package/dist/src/bitgo/utils/tss/addressVerification.js +82 -0
  328. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +90 -17
  329. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  330. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +278 -45
  331. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +367 -44
  332. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  333. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  334. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  335. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  336. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  337. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  338. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  339. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  340. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +21 -51
  341. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  342. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +162 -246
  343. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +203 -0
  344. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  345. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1075 -0
  346. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  347. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  348. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +13 -0
  349. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  350. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  351. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  352. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  353. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  354. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  355. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  356. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  357. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  358. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  359. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  360. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
  361. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  362. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  363. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  364. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +28 -11
  365. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  366. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +208 -103
  367. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +88 -0
  368. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  369. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +565 -0
  370. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  371. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  372. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +13 -0
  373. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
  374. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  375. package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
  376. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +7 -7
  377. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  378. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  379. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  380. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  381. package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
  382. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  383. package/dist/src/bitgo/utils/tss/index.js +24 -9
  384. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  385. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  386. package/dist/src/bitgo/utils/txRequest.js +49 -0
  387. package/dist/src/bitgo/utils/util.js +24 -10
  388. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  389. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  390. package/dist/src/bitgo/utils/wallet.js +48 -0
  391. package/dist/src/bitgo/wallet/BuildParams.d.ts +50 -1
  392. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  393. package/dist/src/bitgo/wallet/BuildParams.js +58 -11
  394. package/dist/src/bitgo/wallet/iWallet.d.ts +474 -21
  395. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  396. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  397. package/dist/src/bitgo/wallet/iWallets.d.ts +145 -19
  398. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  399. package/dist/src/bitgo/wallet/iWallets.js +63 -3
  400. package/dist/src/bitgo/wallet/index.js +6 -2
  401. package/dist/src/bitgo/wallet/wallet.d.ts +363 -24
  402. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  403. package/dist/src/bitgo/wallet/wallet.js +1957 -415
  404. package/dist/src/bitgo/wallet/wallets.d.ts +100 -9
  405. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  406. package/dist/src/bitgo/wallet/wallets.js +1043 -206
  407. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  408. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  409. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  410. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  411. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  412. package/dist/src/bitgo/walletUtil/index.js +19 -0
  413. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  414. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  415. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  416. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  417. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  418. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  419. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  420. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  421. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  422. package/dist/src/bitgo/webhook/index.js +6 -2
  423. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  424. package/dist/src/coins/fiat.d.ts +45 -0
  425. package/dist/src/coins/fiat.d.ts.map +1 -0
  426. package/dist/src/coins/fiat.js +94 -0
  427. package/dist/src/coins/index.d.ts +1 -6
  428. package/dist/src/coins/index.d.ts.map +1 -1
  429. package/dist/src/coins/index.js +7 -8
  430. package/dist/src/coins/ofc.d.ts +17 -2
  431. package/dist/src/coins/ofc.d.ts.map +1 -1
  432. package/dist/src/coins/ofc.js +13 -2
  433. package/dist/src/coins/ofcToken.d.ts +15 -4
  434. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  435. package/dist/src/coins/ofcToken.js +43 -5
  436. package/dist/src/coins/susd.d.ts +3 -2
  437. package/dist/src/coins/susd.d.ts.map +1 -1
  438. package/dist/src/coins/susd.js +5 -1
  439. package/dist/src/common.js +27 -13
  440. package/dist/src/index.d.ts +6 -1
  441. package/dist/src/index.d.ts.map +1 -1
  442. package/dist/src/index.js +32 -11
  443. package/dist/src/lightning.d.ts +20 -0
  444. package/dist/src/lightning.d.ts.map +1 -0
  445. package/dist/src/lightning.js +13 -0
  446. package/dist/src/units.js +5 -6
  447. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  448. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  449. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  450. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  451. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  452. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  453. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  454. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  455. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  456. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  457. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  458. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  459. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  460. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  461. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  462. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  463. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  464. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  465. package/dist/test/unit/bitgo/environment.js +38 -0
  466. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  467. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  468. package/dist/test/unit/bitgo/errors.js +262 -0
  469. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  470. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  471. package/dist/test/unit/bitgo/recovery/initiate.js +230 -0
  472. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  473. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  474. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  475. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  476. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  477. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  478. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +24 -4
  479. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  480. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  481. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  482. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  483. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  484. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  485. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  486. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  487. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  488. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +203 -0
  489. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  490. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  491. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +316 -0
  492. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  493. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  494. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +826 -0
  495. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  496. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  497. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  498. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  499. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  500. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1185 -0
  501. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  502. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  503. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
  504. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  505. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  506. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  507. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  508. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  509. package/dist/test/unit/bitgo/wallet/BuildParams.js +97 -0
  510. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +23 -9
  511. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  512. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  513. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  514. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  515. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  516. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  517. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  518. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  519. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  520. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  521. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  522. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  523. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  524. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  525. package/dist/test/unit/bitgo/wallet/tokenApproval.js +135 -0
  526. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  527. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  528. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  529. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  530. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  531. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
  532. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  533. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  534. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  535. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  536. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  537. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  538. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  539. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  540. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +200 -0
  541. package/dist/test/unit/coins/ofc.d.ts +2 -0
  542. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  543. package/dist/test/unit/coins/ofc.js +124 -0
  544. package/dist/test/unit/lightning.d.ts +2 -0
  545. package/dist/test/unit/lightning.d.ts.map +1 -0
  546. package/dist/test/unit/lightning.js +23 -0
  547. package/dist/test/unit/units.d.ts.map +1 -1
  548. package/dist/test/unit/units.js +64 -64
  549. package/dist/tsconfig.tsbuildinfo +1 -1
  550. package/package.json +24 -21
  551. package/.eslintignore +0 -5
  552. package/CHANGELOG.md +0 -1433
  553. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  554. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  555. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  556. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  557. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  558. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  559. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  560. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  561. package/dist/src/bitgo/lightning/index.js +0 -17
  562. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  563. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  564. package/dist/src/bitgo/lightning/lightning.js +0 -111
  565. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  566. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  567. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  568. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  569. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  570. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  571. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  572. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  573. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  574. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  575. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  576. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  577. package/dist/src/coins/fiateur.d.ts +0 -31
  578. package/dist/src/coins/fiateur.d.ts.map +0 -1
  579. package/dist/src/coins/fiateur.js +0 -57
  580. package/dist/src/coins/fiatgbp.d.ts +0 -31
  581. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  582. package/dist/src/coins/fiatgbp.js +0 -57
  583. package/dist/src/coins/fiatusd.d.ts +0 -31
  584. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  585. package/dist/src/coins/fiatusd.js +0 -57
  586. package/dist/src/coins/tfiateur.d.ts +0 -11
  587. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  588. package/dist/src/coins/tfiateur.js +0 -17
  589. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  590. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  591. package/dist/src/coins/tfiatgbp.js +0 -17
  592. package/dist/src/coins/tfiatusd.d.ts +0 -11
  593. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  594. package/dist/src/coins/tfiatusd.js +0 -17
  595. package/dist/src/openssl/index.d.ts +0 -5
  596. package/dist/src/openssl/index.d.ts.map +0 -1
  597. package/dist/src/openssl/index.js +0 -9
  598. package/dist/test/unit/openssl.d.ts +0 -2
  599. package/dist/test/unit/openssl.d.ts.map +0 -1
  600. package/dist/test/unit/openssl.js +0 -39
@@ -0,0 +1,1075 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.EcdsaMPCv2Utils = void 0;
40
+ exports.isGG18SigningMaterial = isGG18SigningMaterial;
41
+ exports.isGG18SigningMaterialAsync = isGG18SigningMaterialAsync;
42
+ exports.getMpcV2RecoveryKeyShares = getMpcV2RecoveryKeyShares;
43
+ exports.signRecoveryMpcV2 = signRecoveryMpcV2;
44
+ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
45
+ const sjcl = __importStar(require("@bitgo-beta/sjcl"));
46
+ const assert_1 = __importDefault(require("assert"));
47
+ const buffer_1 = require("buffer");
48
+ const io_ts_types_1 = require("io-ts-types");
49
+ const keccak_1 = __importDefault(require("keccak"));
50
+ const public_types_1 = require("@bitgo/public-types");
51
+ const account_lib_1 = require("../../../../account-lib");
52
+ const tss_1 = require("../../../tss");
53
+ const common_1 = require("../../../tss/common");
54
+ const typesMPCv2_1 = require("./typesMPCv2");
55
+ const ecdsaMPCv2_1 = require("../../../tss/ecdsa/ecdsaMPCv2");
56
+ const opengpgUtils_1 = require("../../opengpgUtils");
57
+ const baseTypes_1 = require("../baseTypes");
58
+ const base_1 = require("./base");
59
+ const ecdsaMPCv2KeyGenSender_1 = require("./ecdsaMPCv2KeyGenSender");
60
+ const bitgoPubKeys_1 = require("../../../tss/bitgoPubKeys");
61
+ const errors_1 = require("../../../errors");
62
+ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
63
+ /** @inheritdoc */
64
+ async createKeychains(params) {
65
+ const { userSession, backupSession } = this.getUserAndBackupSession(2, 3, params.retrofit);
66
+ const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
67
+ const backupGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
68
+ // Get the BitGo public key based on user/enterprise feature flags
69
+ // If it doesn't work, use the default public key from the constants
70
+ const { mpcv2PublicKey } = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(params.enterprise, true);
71
+ const mpcv2Key = mpcv2PublicKey ?? this.bitgoMPCv2PublicGpgKey;
72
+ (0, assert_1.default)(mpcv2Key, 'Failed to get BitGo MPCv2 GPG public key');
73
+ const bitgoPublicGpgKey = mpcv2Key.armor();
74
+ if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
75
+ // Ensure the public key is one of the expected BitGo public keys when in test or prod.
76
+ (0, assert_1.default)((0, bitgoPubKeys_1.isBitgoMpcPubKey)(bitgoPublicGpgKey, 'mpcv2'), 'Invalid BitGo GPG public key');
77
+ }
78
+ const userGpgPrvKey = {
79
+ partyId: typesMPCv2_1.MPCv2PartiesEnum.USER,
80
+ gpgKey: userGpgKey.privateKey,
81
+ };
82
+ const backupGpgPrvKey = {
83
+ partyId: typesMPCv2_1.MPCv2PartiesEnum.BACKUP,
84
+ gpgKey: backupGpgKey.privateKey,
85
+ };
86
+ const bitgoGpgPubKey = {
87
+ partyId: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
88
+ gpgKey: bitgoPublicGpgKey,
89
+ };
90
+ // #region round 1
91
+ const userRound1BroadcastMsg = await userSession.initDkg();
92
+ const backupRound1BroadcastMsg = await backupSession.initDkg();
93
+ const round1SerializedMessages = sdk_lib_mpc_1.DklsTypes.serializeMessages({
94
+ broadcastMessages: [userRound1BroadcastMsg, backupRound1BroadcastMsg],
95
+ p2pMessages: [],
96
+ });
97
+ const round1Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages(round1SerializedMessages, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
98
+ const { sessionId, bitgoMsg1, bitgoToBackupMsg2, bitgoToUserMsg2 } = await this.sendKeyGenerationRound1(params.enterprise, userGpgKey.publicKey, backupGpgKey.publicKey, params.retrofit?.walletId
99
+ ? {
100
+ ...round1Messages,
101
+ walletId: params.retrofit.walletId,
102
+ }
103
+ : round1Messages);
104
+ // #endregion
105
+ // #region round 2
106
+ const bitgoRound1BroadcastMessages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [], broadcastMessages: [this.formatBitgoBroadcastMessage(bitgoMsg1)] }, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
107
+ const bitgoRound1BroadcastMsg = bitgoRound1BroadcastMessages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
108
+ (0, assert_1.default)(bitgoRound1BroadcastMsg, 'BitGo message 1 not found in broadcast messages');
109
+ const userRound2P2PMessages = userSession.handleIncomingMessages({
110
+ p2pMessages: [],
111
+ broadcastMessages: [sdk_lib_mpc_1.DklsTypes.deserializeBroadcastMessage(bitgoRound1BroadcastMsg), backupRound1BroadcastMsg],
112
+ });
113
+ const userToBitgoMsg2 = userRound2P2PMessages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
114
+ (0, assert_1.default)(userToBitgoMsg2, 'User message 2 not found in P2P messages');
115
+ const serializedUserToBitgoMsg2 = sdk_lib_mpc_1.DklsTypes.serializeP2PMessage(userToBitgoMsg2);
116
+ const backupRound2P2PMessages = backupSession.handleIncomingMessages({
117
+ p2pMessages: [],
118
+ broadcastMessages: [userRound1BroadcastMsg, sdk_lib_mpc_1.DklsTypes.deserializeBroadcastMessage(bitgoRound1BroadcastMsg)],
119
+ });
120
+ const serializedBackupToBitgoMsg2 = sdk_lib_mpc_1.DklsTypes.serializeMessages(backupRound2P2PMessages).p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
121
+ (0, assert_1.default)(serializedBackupToBitgoMsg2, 'Backup message 2 not found in P2P messages');
122
+ const round2Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({ p2pMessages: [serializedUserToBitgoMsg2, serializedBackupToBitgoMsg2], broadcastMessages: [] }, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
123
+ const { sessionId: sessionIdRound2, bitgoCommitment2, bitgoToUserMsg3, bitgoToBackupMsg3, } = await this.sendKeyGenerationRound2(params.enterprise, sessionId, round2Messages);
124
+ // #endregion
125
+ // #region round 3
126
+ assert_1.default.equal(sessionId, sessionIdRound2, 'Round 1 and 2 Session IDs do not match');
127
+ const decryptedBitgoToUserRound2Msgs = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [this.formatP2PMessage(bitgoToUserMsg2)], broadcastMessages: [] }, [bitgoGpgPubKey], [userGpgPrvKey]);
128
+ const serializedBitgoToUserRound2Msg = decryptedBitgoToUserRound2Msgs.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
129
+ (0, assert_1.default)(serializedBitgoToUserRound2Msg, 'BitGo to User message 2 not found in P2P messages');
130
+ const bitgoToUserRound2Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToUserRound2Msg);
131
+ const decryptedBitgoToBackupRound2Msg = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [this.formatP2PMessage(bitgoToBackupMsg2)], broadcastMessages: [] }, [bitgoGpgPubKey], [backupGpgPrvKey]);
132
+ const serializedBitgoToBackupRound2Msg = decryptedBitgoToBackupRound2Msg.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
133
+ (0, assert_1.default)(serializedBitgoToBackupRound2Msg, 'BitGo to Backup message 2 not found in P2P messages');
134
+ const bitgoToBackupRound2Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToBackupRound2Msg);
135
+ const userToBackupMsg2 = userRound2P2PMessages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
136
+ (0, assert_1.default)(userToBackupMsg2, 'User to Backup message 2 not found in P2P messages');
137
+ const backupToUserMsg2 = backupRound2P2PMessages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
138
+ (0, assert_1.default)(backupToUserMsg2, 'Backup to User message 2 not found in P2P messages');
139
+ const userRound3Messages = userSession.handleIncomingMessages({
140
+ broadcastMessages: [],
141
+ p2pMessages: [bitgoToUserRound2Msg, backupToUserMsg2],
142
+ });
143
+ const userToBackupMsg3 = userRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
144
+ (0, assert_1.default)(userToBackupMsg3, 'User to Backup message 3 not found in P2P messages');
145
+ const userToBitgoMsg3 = userRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
146
+ (0, assert_1.default)(userToBitgoMsg3, 'User to Bitgo message 3 not found in P2P messages');
147
+ const serializedUserToBitgoMsg3 = sdk_lib_mpc_1.DklsTypes.serializeP2PMessage(userToBitgoMsg3);
148
+ const backupRound3Messages = backupSession.handleIncomingMessages({
149
+ broadcastMessages: [],
150
+ p2pMessages: [bitgoToBackupRound2Msg, userToBackupMsg2],
151
+ });
152
+ const backupToUserMsg3 = backupRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
153
+ (0, assert_1.default)(backupToUserMsg3, 'Backup to User message 3 not found in P2P messages');
154
+ const backupToBitgoMsg3 = backupRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
155
+ (0, assert_1.default)(backupToBitgoMsg3, 'Backup to Bitgo message 3 not found in P2P messages');
156
+ const serializedBackupToBitgoMsg3 = sdk_lib_mpc_1.DklsTypes.serializeP2PMessage(backupToBitgoMsg3);
157
+ const decryptedBitgoToUserRound3Messages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ broadcastMessages: [], p2pMessages: [this.formatP2PMessage(bitgoToUserMsg3, bitgoCommitment2)] }, [bitgoGpgPubKey], [userGpgPrvKey]);
158
+ const serializedBitgoToUserRound3Msg = decryptedBitgoToUserRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
159
+ (0, assert_1.default)(serializedBitgoToUserRound3Msg, 'BitGo to User message 3 not found in P2P messages');
160
+ const bitgoToUserRound3Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToUserRound3Msg);
161
+ const decryptedBitgoToBackupRound3Messages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ broadcastMessages: [], p2pMessages: [this.formatP2PMessage(bitgoToBackupMsg3, bitgoCommitment2)] }, [bitgoGpgPubKey], [backupGpgPrvKey]);
162
+ const serializedBitgoToBackupRound3Msg = decryptedBitgoToBackupRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
163
+ (0, assert_1.default)(serializedBitgoToBackupRound3Msg, 'BitGo to Backup message 3 not found in P2P messages');
164
+ const bitgoToBackupRound3Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToBackupRound3Msg);
165
+ const userRound4Messages = userSession.handleIncomingMessages({
166
+ p2pMessages: [backupToUserMsg3, bitgoToUserRound3Msg],
167
+ broadcastMessages: [],
168
+ });
169
+ const userRound4BroadcastMsg = userRound4Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER);
170
+ (0, assert_1.default)(userRound4BroadcastMsg, 'User message 4 not found in broadcast messages');
171
+ const serializedUserRound4BroadcastMsg = sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(userRound4BroadcastMsg);
172
+ const backupRound4Messages = backupSession.handleIncomingMessages({
173
+ p2pMessages: [userToBackupMsg3, bitgoToBackupRound3Msg],
174
+ broadcastMessages: [],
175
+ });
176
+ const backupRound4BroadcastMsg = backupRound4Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
177
+ (0, assert_1.default)(backupRound4BroadcastMsg, 'Backup message 4 not found in broadcast messages');
178
+ const serializedBackupRound4BroadcastMsg = sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(backupRound4BroadcastMsg);
179
+ const round3Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({
180
+ p2pMessages: [serializedUserToBitgoMsg3, serializedBackupToBitgoMsg3],
181
+ broadcastMessages: [serializedUserRound4BroadcastMsg, serializedBackupRound4BroadcastMsg],
182
+ }, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
183
+ const { sessionId: sessionIdRound3, bitgoMsg4, commonKeychain: bitgoCommonKeychain, } = await this.sendKeyGenerationRound3(params.enterprise, sessionId, round3Messages);
184
+ // #endregion
185
+ // #region keychain creation
186
+ assert_1.default.equal(sessionId, sessionIdRound3, 'Round 1 and 3 Session IDs do not match');
187
+ const bitgoRound4BroadcastMessages = sdk_lib_mpc_1.DklsTypes.deserializeMessages(await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [], broadcastMessages: [this.formatBitgoBroadcastMessage(bitgoMsg4)] }, [bitgoGpgPubKey], [])).broadcastMessages;
188
+ const bitgoRound4BroadcastMsg = bitgoRound4BroadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
189
+ (0, assert_1.default)(bitgoRound4BroadcastMsg, 'BitGo message 4 not found in broadcast messages');
190
+ userSession.handleIncomingMessages({
191
+ p2pMessages: [],
192
+ broadcastMessages: [bitgoRound4BroadcastMsg, backupRound4BroadcastMsg],
193
+ });
194
+ backupSession.handleIncomingMessages({
195
+ p2pMessages: [],
196
+ broadcastMessages: [bitgoRound4BroadcastMsg, userRound4BroadcastMsg],
197
+ });
198
+ const userPrivateMaterial = userSession.getKeyShare();
199
+ const backupPrivateMaterial = backupSession.getKeyShare();
200
+ const userReducedPrivateMaterial = userSession.getReducedKeyShare();
201
+ const backupReducedPrivateMaterial = backupSession.getReducedKeyShare();
202
+ const userCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(userPrivateMaterial);
203
+ const backupCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(backupPrivateMaterial);
204
+ assert_1.default.equal(bitgoCommonKeychain, userCommonKeychain, 'User and Bitgo Common keychains do not match');
205
+ assert_1.default.equal(bitgoCommonKeychain, backupCommonKeychain, 'Backup and Bitgo Common keychains do not match');
206
+ const encryptionSession = params.encryptionVersion === 2 ? await this.bitgo.createEncryptionSession(params.passphrase) : undefined;
207
+ try {
208
+ const userKeychainPromise = this.addUserKeychain(bitgoCommonKeychain, userPrivateMaterial, userReducedPrivateMaterial, params.passphrase, params.originalPasscodeEncryptionCode, params.webauthnInfo, encryptionSession);
209
+ const backupKeychainPromise = this.addBackupKeychain(bitgoCommonKeychain, backupPrivateMaterial, backupReducedPrivateMaterial, params.passphrase, params.originalPasscodeEncryptionCode, encryptionSession);
210
+ const bitgoKeychainPromise = this.addBitgoKeychain(bitgoCommonKeychain);
211
+ const [userKeychain, backupKeychain, bitgoKeychain] = await Promise.all([
212
+ userKeychainPromise,
213
+ backupKeychainPromise,
214
+ bitgoKeychainPromise,
215
+ ]);
216
+ // #endregion
217
+ return {
218
+ userKeychain,
219
+ backupKeychain,
220
+ bitgoKeychain,
221
+ };
222
+ }
223
+ finally {
224
+ encryptionSession?.destroy();
225
+ }
226
+ }
227
+ // #region keychain utils
228
+ async createParticipantKeychain(participantIndex, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionSession) {
229
+ let source;
230
+ let encryptedPrv = undefined;
231
+ let reducedEncryptedPrv = undefined;
232
+ let privateMaterialBase64 = undefined;
233
+ switch (participantIndex) {
234
+ case typesMPCv2_1.MPCv2PartiesEnum.USER:
235
+ case typesMPCv2_1.MPCv2PartiesEnum.BACKUP:
236
+ source = participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER ? 'user' : 'backup';
237
+ (0, assert_1.default)(privateMaterial, `Private material is required for ${source} keychain`);
238
+ (0, assert_1.default)(reducedPrivateMaterial, `Reduced private material is required for ${source} keychain`);
239
+ (0, assert_1.default)(passphrase, `Passphrase is required for ${source} keychain`);
240
+ privateMaterialBase64 = privateMaterial.toString('base64');
241
+ if (encryptionSession) {
242
+ encryptedPrv = await encryptionSession.encrypt(privateMaterialBase64);
243
+ reducedEncryptedPrv = await encryptionSession.encrypt(btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(reducedPrivateMaterial)))));
244
+ }
245
+ else {
246
+ encryptedPrv = await this.bitgo.encryptAsync({
247
+ input: privateMaterialBase64,
248
+ password: passphrase,
249
+ });
250
+ // Encrypts the CBOR-encoded ReducedKeyShare (which contains the party's private
251
+ // scalar s_i) with the wallet passphrase. The result is stored as reducedEncryptedPrv
252
+ // on the key card QR code and represents a second copy of private key material
253
+ // beyond the server-stored encryptedPrv.
254
+ reducedEncryptedPrv = await this.bitgo.encryptAsync({
255
+ // Buffer.toString('base64') can not be used here as it does not work on the browser.
256
+ // The browser deals with a Buffer as Uint8Array, therefore in the browser .toString('base64') just creates a comma seperated string of the array values.
257
+ input: btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(reducedPrivateMaterial)))),
258
+ password: passphrase,
259
+ });
260
+ }
261
+ break;
262
+ case typesMPCv2_1.MPCv2PartiesEnum.BITGO:
263
+ source = 'bitgo';
264
+ break;
265
+ default:
266
+ throw new Error('Invalid participant index');
267
+ }
268
+ const recipientKeychainParams = {
269
+ source,
270
+ keyType: 'tss',
271
+ commonKeychain,
272
+ encryptedPrv,
273
+ originalPasscodeEncryptionCode,
274
+ isMPCv2: true,
275
+ };
276
+ if (webauthnInfo && participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER && privateMaterialBase64) {
277
+ recipientKeychainParams.webauthnDevices = [
278
+ {
279
+ otpDeviceId: webauthnInfo.otpDeviceId,
280
+ prfSalt: webauthnInfo.prfSalt,
281
+ encryptedPrv: await this.bitgo.encryptAsync({
282
+ input: privateMaterialBase64,
283
+ password: webauthnInfo.passphrase,
284
+ }),
285
+ },
286
+ ];
287
+ }
288
+ const keychains = this.baseCoin.keychains();
289
+ return { ...(await keychains.add(recipientKeychainParams)), reducedEncryptedPrv: reducedEncryptedPrv };
290
+ }
291
+ /**
292
+ * Converts a User or Backup MPCv1 SigningMaterial to RetrofitData needed by MPCv2 DKG.
293
+ *
294
+ * @param decryptedKeyshare - MPCv1 decrypted signing material for user or backup as a json.stringify string and bitgo's Big Si.
295
+ * @param partyId - The party ID of the MPCv1 keyshare.
296
+ * @returns The retrofit data needed to start an MPCv2 DKG session.
297
+ * @deprecated
298
+ */
299
+ static getKeyDataForRetrofit(decryptedKeyshare, partyId) {
300
+ const mpc = new account_lib_1.Ecdsa();
301
+ const xiList = [
302
+ Array.from((0, sdk_lib_mpc_1.bigIntToBufferBE)(BigInt(1), 32)),
303
+ Array.from((0, sdk_lib_mpc_1.bigIntToBufferBE)(BigInt(2), 32)),
304
+ Array.from((0, sdk_lib_mpc_1.bigIntToBufferBE)(BigInt(3), 32)),
305
+ ];
306
+ return EcdsaMPCv2Utils.getMpcV2RetrofitDataFromMpcV1Key({
307
+ mpcv1PartyKeyShare: decryptedKeyshare,
308
+ mpcv1PartyIndex: partyId === typesMPCv2_1.MPCv2PartiesEnum.USER ? 1 : 2,
309
+ xiList,
310
+ mpc,
311
+ });
312
+ }
313
+ /**
314
+ * Converts user and backup MPCv1 SigningMaterial to RetrofitData needed by MPCv2 DKG.
315
+ *
316
+ * @param {Object} params - MPCv1 decrypted signing material for user and backup as a json.stringify string and bitgo's Big Si.
317
+ * @returns {{ mpcv2UserKeyShare: DklsTypes.RetrofitData; mpcv2BakcupKeyShare: DklsTypes.RetrofitData }} - the retrofit data needed to start an MPCv2 DKG session.
318
+ */
319
+ getMpcV2RetrofitDataFromMpcV1Keys(params) {
320
+ const mpc = new account_lib_1.Ecdsa();
321
+ const xiList = [
322
+ Array.from((0, sdk_lib_mpc_1.bigIntToBufferBE)(BigInt(1), 32)),
323
+ Array.from((0, sdk_lib_mpc_1.bigIntToBufferBE)(BigInt(2), 32)),
324
+ Array.from((0, sdk_lib_mpc_1.bigIntToBufferBE)(BigInt(3), 32)),
325
+ ];
326
+ return {
327
+ mpcv2UserKeyShare: EcdsaMPCv2Utils.getMpcV2RetrofitDataFromMpcV1Key({
328
+ mpcv1PartyKeyShare: params.mpcv1UserKeyShare,
329
+ mpcv1PartyIndex: 1,
330
+ xiList,
331
+ mpc,
332
+ }),
333
+ mpcv2BackupKeyShare: EcdsaMPCv2Utils.getMpcV2RetrofitDataFromMpcV1Key({
334
+ mpcv1PartyKeyShare: params.mpcv1BackupKeyShare,
335
+ mpcv1PartyIndex: 2,
336
+ xiList,
337
+ mpc,
338
+ }),
339
+ };
340
+ }
341
+ /**
342
+ * Get retrofit data from MPCv1 key share.
343
+ * @param mpcv1PartyKeyShare
344
+ * @param mpcv1PartyIndex
345
+ * @param xiList
346
+ * @param mpc
347
+ * @deprecated
348
+ */
349
+ static getMpcV2RetrofitDataFromMpcV1Key({ mpcv1PartyKeyShare, mpcv1PartyIndex, xiList, mpc, }) {
350
+ const signingMaterial = JSON.parse(mpcv1PartyKeyShare);
351
+ let keyCombined = undefined;
352
+ switch (mpcv1PartyIndex) {
353
+ case 1:
354
+ (0, assert_1.default)(signingMaterial.backupNShare, 'User MPCv1 key material should have backup NShare.');
355
+ (0, assert_1.default)(signingMaterial.bitgoNShare, 'BitGo MPCv1 key material should have user NShare.');
356
+ keyCombined = mpc.keyCombine(signingMaterial.pShare, [
357
+ signingMaterial.backupNShare,
358
+ signingMaterial.bitgoNShare,
359
+ ]);
360
+ break;
361
+ case 2:
362
+ (0, assert_1.default)(signingMaterial.userNShare, 'User MPCv1 key material should have backup NShare.');
363
+ (0, assert_1.default)(signingMaterial.bitgoNShare, 'BitGo MPCv1 key material should have user NShare.');
364
+ keyCombined = mpc.keyCombine(signingMaterial.pShare, [signingMaterial.userNShare, signingMaterial.bitgoNShare]);
365
+ break;
366
+ case 3:
367
+ (0, assert_1.default)(signingMaterial.userNShare, 'User MPCv1 key material should have backup NShare.');
368
+ (0, assert_1.default)(signingMaterial.backupNShare, 'Backup MPCv1 key material should have user NShare.');
369
+ keyCombined = mpc.keyCombine(signingMaterial.pShare, [
370
+ signingMaterial.userNShare,
371
+ signingMaterial.backupNShare,
372
+ ]);
373
+ break;
374
+ default:
375
+ throw new Error('Invalid participant index');
376
+ }
377
+ return {
378
+ xShare: keyCombined.xShare,
379
+ xiList: xiList,
380
+ };
381
+ }
382
+ async addUserKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionSession) {
383
+ return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionSession);
384
+ }
385
+ async addBackupKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, encryptionSession) {
386
+ return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, undefined, encryptionSession);
387
+ }
388
+ getUserAndBackupSession(m, n, retrofit) {
389
+ if (retrofit) {
390
+ const retrofitData = this.getMpcV2RetrofitDataFromMpcV1Keys({
391
+ mpcv1UserKeyShare: retrofit.decryptedUserKey,
392
+ mpcv1BackupKeyShare: retrofit.decryptedBackupKey,
393
+ });
394
+ const userSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.USER, undefined, retrofitData.mpcv2UserKeyShare);
395
+ const backupSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.BACKUP, undefined, retrofitData.mpcv2BackupKeyShare);
396
+ return { userSession, backupSession };
397
+ }
398
+ const userSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.USER);
399
+ const backupSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
400
+ return { userSession, backupSession };
401
+ }
402
+ async addBitgoKeychain(commonKeychain) {
403
+ return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, commonKeychain);
404
+ }
405
+ // #endregion
406
+ async sendKeyGenerationRound1(enterprise, userGpgPublicKey, backupGpgPublicKey, payload) {
407
+ return this.sendKeyGenerationRound1BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), userGpgPublicKey, backupGpgPublicKey, payload);
408
+ }
409
+ async sendKeyGenerationRound2(enterprise, sessionId, payload) {
410
+ return this.sendKeyGenerationRound2BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), sessionId, payload);
411
+ }
412
+ async sendKeyGenerationRound3(enterprise, sessionId, payload) {
413
+ return this.sendKeyGenerationRound3BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), sessionId, payload);
414
+ }
415
+ async sendKeyGenerationRound1BySender(senderFn, userGpgPublicKey, backupGpgPublicKey, payload) {
416
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userGpgPublicKey), 'User GPG public key is required');
417
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupGpgPublicKey), 'Backup GPG public key is required');
418
+ const userMsg1 = payload.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER)?.payload;
419
+ (0, assert_1.default)(userMsg1, 'User message 1 not found in broadcast messages');
420
+ const backupMsg1 = payload.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP)?.payload;
421
+ (0, assert_1.default)(backupMsg1, 'Backup message 1 not found in broadcast messages');
422
+ return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'], {
423
+ userGpgPublicKey,
424
+ backupGpgPublicKey,
425
+ userMsg1: { from: 0, ...userMsg1 },
426
+ backupMsg1: { from: 1, ...backupMsg1 },
427
+ walletId: payload.walletId,
428
+ });
429
+ }
430
+ async sendKeyGenerationRound2BySender(senderFn, sessionId, payload) {
431
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(sessionId), 'Session ID is required');
432
+ const userMsg2 = payload.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
433
+ (0, assert_1.default)(userMsg2, 'User to Bitgo message 2 not found in P2P messages');
434
+ (0, assert_1.default)(userMsg2.commitment, 'User to Bitgo commitment not found in P2P messages');
435
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userMsg2.commitment), 'User to Bitgo commitment is required');
436
+ const backupMsg2 = payload.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
437
+ (0, assert_1.default)(backupMsg2, 'Backup to Bitgo message 2 not found in P2P messages');
438
+ (0, assert_1.default)(backupMsg2.commitment, 'Backup to Bitgo commitment not found in P2P messages');
439
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupMsg2.commitment), 'Backup to Bitgo commitment is required');
440
+ return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2'], {
441
+ sessionId,
442
+ userMsg2: {
443
+ from: typesMPCv2_1.MPCv2PartiesEnum.USER,
444
+ to: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
445
+ signature: userMsg2.payload.signature,
446
+ encryptedMessage: userMsg2.payload.encryptedMessage,
447
+ },
448
+ userCommitment2: userMsg2.commitment,
449
+ backupMsg2: {
450
+ from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP,
451
+ to: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
452
+ signature: backupMsg2.payload.signature,
453
+ encryptedMessage: backupMsg2.payload.encryptedMessage,
454
+ },
455
+ backupCommitment2: backupMsg2.commitment,
456
+ });
457
+ }
458
+ async sendKeyGenerationRound3BySender(senderFn, sessionId, payload) {
459
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(sessionId), 'Session ID is required');
460
+ const userMsg3 = payload.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO)?.payload;
461
+ (0, assert_1.default)(userMsg3, 'User to Bitgo message 3 not found in P2P messages');
462
+ const backupMsg3 = payload.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO)?.payload;
463
+ (0, assert_1.default)(backupMsg3, 'Backup to Bitgo message 3 not found in P2P messages');
464
+ const userMsg4 = payload.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER)?.payload;
465
+ (0, assert_1.default)(userMsg4, 'User message 1 not found in broadcast messages');
466
+ const backupMsg4 = payload.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP)?.payload;
467
+ (0, assert_1.default)(backupMsg4, 'Backup message 1 not found in broadcast messages');
468
+ return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R3'], {
469
+ sessionId,
470
+ userMsg3: { from: 0, to: 2, ...userMsg3 },
471
+ backupMsg3: { from: 1, to: 2, ...backupMsg3 },
472
+ userMsg4: { from: 0, ...userMsg4 },
473
+ backupMsg4: { from: 1, ...backupMsg4 },
474
+ });
475
+ }
476
+ // #endregion
477
+ // #region sign tx request
478
+ /**
479
+ * Signs the transaction associated to the transaction request.
480
+ * @param {string | TxRequest} params.txRequest - transaction request object or id
481
+ * @param {string} params.prv - decrypted private key
482
+ * @param {string} params.reqId - request id
483
+ * @param {string} params.mpcv2PartyId - party id for the signer involved in this mpcv2 request (either 0 for user or 1 for backup)
484
+ * @param params.recipientSource - optional; use TssTxRecipientSource.Explicit with a non-empty txParams.recipients
485
+ * list when you want TypeScript to enforce passing recipient details at compile time.
486
+ * @returns {Promise<TxRequest>} fully signed TxRequest object
487
+ */
488
+ async signTxRequest(params) {
489
+ this.bitgo.setRequestTracer(params.reqId);
490
+ return this.signRequestBase(params, baseTypes_1.RequestType.tx);
491
+ }
492
+ /**
493
+ * Signs the message associated to the transaction request.
494
+ * @param {string | TxRequest} params.txRequest - transaction request object or id
495
+ * @param {string} params.prv - decrypted private key
496
+ * @param {string} params.reqId - request id
497
+ * @returns {Promise<TxRequest>} fully signed TxRequest object
498
+ */
499
+ async signTxRequestForMessage(params) {
500
+ this.bitgo.setRequestTracer(params.reqId);
501
+ return this.signRequestBase(params, baseTypes_1.RequestType.message);
502
+ }
503
+ async signRequestBase(params, requestType) {
504
+ const userKeyShare = buffer_1.Buffer.from(params.prv, 'base64');
505
+ const txRequest = typeof params.txRequest === 'string'
506
+ ? await (0, tss_1.getTxRequest)(this.bitgo, this.wallet.id(), params.txRequest, params.reqId)
507
+ : params.txRequest;
508
+ let txOrMessageToSign;
509
+ let derivationPath;
510
+ let bufferContent;
511
+ let serializedTxHex;
512
+ const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
513
+ const bitgoGpgPubKey = await this.pickBitgoPubGpgKeyForSigning(true, params.reqId, txRequest.enterpriseId);
514
+ if (!bitgoGpgPubKey) {
515
+ throw new Error('Missing BitGo GPG key for MPCv2');
516
+ }
517
+ if (requestType === baseTypes_1.RequestType.tx) {
518
+ (0, assert_1.default)(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
519
+ const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
520
+ if ('recipientSource' in params &&
521
+ params.recipientSource === baseTypes_1.TssTxRecipientSource.Explicit &&
522
+ !params.txParams?.recipients?.length) {
523
+ throw new errors_1.InvalidTransactionError('recipientSource "explicit" requires txParams.recipients with at least one recipient.');
524
+ }
525
+ // For ICP and Avalanche atomic transactions, signableHex is a digest (not
526
+ // a parseable transaction). Pass serializedTxHex so verifyTransaction can
527
+ // parse the full transaction bytes.
528
+ // - ICP: signableHex is a hash; serializedTxHex is the CBOR-encoded tx.
529
+ // - Avalanche atomic (FLRP/FLR cross-chain): signableHex is SHA-256(txBody);
530
+ // serializedTxHex is the PVM/EVM atomic tx (codec prefix 0x0000).
531
+ // For all other coins, signableHex IS the unsigned transaction (e.g. RLP bytes).
532
+ const isIcp = this.baseCoin.getConfig().family === 'icp';
533
+ const isAvalancheAtomic = unsignedTx.serializedTxHex && unsignedTx.serializedTxHex.startsWith('0000');
534
+ if (isIcp || isAvalancheAtomic) {
535
+ await this.baseCoin.verifyTransaction({
536
+ txPrebuild: { txHex: unsignedTx.serializedTxHex, txInfo: unsignedTx.signableHex },
537
+ txParams: params.txParams || { recipients: [] },
538
+ wallet: this.wallet,
539
+ walletType: this.wallet.multisigType(),
540
+ });
541
+ }
542
+ else {
543
+ await this.baseCoin.verifyTransaction({
544
+ txPrebuild: { txHex: unsignedTx.signableHex },
545
+ txParams: params.txParams || { recipients: [] },
546
+ wallet: this.wallet,
547
+ walletType: this.wallet.multisigType(),
548
+ });
549
+ }
550
+ txOrMessageToSign = unsignedTx.signableHex;
551
+ derivationPath = unsignedTx.derivationPath;
552
+ serializedTxHex = unsignedTx.serializedTxHex;
553
+ bufferContent = buffer_1.Buffer.from(txOrMessageToSign, 'hex');
554
+ }
555
+ else if (requestType === baseTypes_1.RequestType.message) {
556
+ txOrMessageToSign = txRequest.messages[0].messageEncoded;
557
+ derivationPath = txRequest.messages[0].derivationPath || 'm/0';
558
+ bufferContent = buffer_1.Buffer.from(txOrMessageToSign, 'hex');
559
+ }
560
+ else {
561
+ throw new Error('Invalid request type');
562
+ }
563
+ // For Avalanche atomic transactions (cross-chain export/import between
564
+ // C-chain and P-chain), signableHex is already SHA-256(txBody) — a 32-byte
565
+ // pre-hashed digest. Use it directly as the DKLS message hash instead of
566
+ // applying the coin's hash function (keccak256 for EVM coins).
567
+ // Same logic as getHashStringAndDerivationPath (external signer path).
568
+ let hashBuffer;
569
+ if (serializedTxHex && serializedTxHex.startsWith('0000')) {
570
+ hashBuffer = bufferContent;
571
+ (0, assert_1.default)(hashBuffer.length === 32, `Avalanche pre-hashed signableHex must be 32 bytes, got ${hashBuffer.length}`);
572
+ }
573
+ else {
574
+ let hash;
575
+ try {
576
+ hash = this.baseCoin.getHashFunction();
577
+ }
578
+ catch (err) {
579
+ hash = (0, keccak_1.default)('keccak256');
580
+ }
581
+ hashBuffer = hash.update(bufferContent).digest();
582
+ }
583
+ const otherSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, params.mpcv2PartyId !== undefined ? params.mpcv2PartyId : 0, derivationPath, hashBuffer);
584
+ const userSignerBroadcastMsg1 = await otherSigner.init();
585
+ const signatureShareRound1 = await (0, ecdsaMPCv2_1.getSignatureShareRoundOne)(userSignerBroadcastMsg1, userGpgKey, params.mpcv2PartyId);
586
+ let latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
587
+ (0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest Object');
588
+ let bitgoToUserMessages1And2;
589
+ if (requestType === baseTypes_1.RequestType.tx) {
590
+ bitgoToUserMessages1And2 = latestTxRequest.transactions[0].signatureShares;
591
+ }
592
+ else {
593
+ bitgoToUserMessages1And2 = latestTxRequest.messages[0].signatureShares;
594
+ }
595
+ // TODO: Use codec for parsing
596
+ const parsedBitGoToUserSigShareRoundOne = JSON.parse(bitgoToUserMessages1And2[bitgoToUserMessages1And2.length - 1].share);
597
+ if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
598
+ throw new Error('Unexpected signature share response. Unable to parse data.');
599
+ }
600
+ const serializedBitGoToUserMessagesRound1And2 = await (0, ecdsaMPCv2_1.verifyBitGoMessagesAndSignaturesRoundOne)(parsedBitGoToUserSigShareRoundOne, userGpgKey, bitgoGpgPubKey, params.mpcv2PartyId);
601
+ /** Round 2 **/
602
+ const deserializedMessages = sdk_lib_mpc_1.DklsTypes.deserializeMessages(serializedBitGoToUserMessagesRound1And2);
603
+ const userToBitGoMessagesRound2 = otherSigner.handleIncomingMessages({
604
+ p2pMessages: [],
605
+ broadcastMessages: deserializedMessages.broadcastMessages,
606
+ });
607
+ const userToBitGoMessagesRound3 = otherSigner.handleIncomingMessages({
608
+ p2pMessages: deserializedMessages.p2pMessages,
609
+ broadcastMessages: [],
610
+ });
611
+ const signatureShareRoundTwo = await (0, ecdsaMPCv2_1.getSignatureShareRoundTwo)(userToBitGoMessagesRound2, userToBitGoMessagesRound3, userGpgKey, bitgoGpgPubKey, params.mpcv2PartyId);
612
+ latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRoundTwo], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
613
+ (0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest Object');
614
+ const txRequestSignatureShares = requestType === baseTypes_1.RequestType.tx
615
+ ? latestTxRequest.transactions[0].signatureShares
616
+ : latestTxRequest.messages[0].signatureShares;
617
+ // TODO: Use codec for parsing
618
+ const parsedBitGoToUserSigShareRoundTwo = JSON.parse(txRequestSignatureShares[txRequestSignatureShares.length - 1].share);
619
+ if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
620
+ throw new Error('Unexpected signature share response. Unable to parse data.');
621
+ }
622
+ const serializedBitGoToUserMessagesRound3 = await (0, ecdsaMPCv2_1.verifyBitGoMessagesAndSignaturesRoundTwo)(parsedBitGoToUserSigShareRoundTwo, userGpgKey, bitgoGpgPubKey, params.mpcv2PartyId);
623
+ /** Round 3 **/
624
+ const deserializedBitGoToUserMessagesRound3 = sdk_lib_mpc_1.DklsTypes.deserializeMessages({
625
+ p2pMessages: serializedBitGoToUserMessagesRound3.p2pMessages,
626
+ broadcastMessages: [],
627
+ });
628
+ const userToBitGoMessagesRound4 = otherSigner.handleIncomingMessages({
629
+ p2pMessages: deserializedBitGoToUserMessagesRound3.p2pMessages,
630
+ broadcastMessages: [],
631
+ });
632
+ const signatureShareRoundThree = await (0, ecdsaMPCv2_1.getSignatureShareRoundThree)(userToBitGoMessagesRound4, userGpgKey, bitgoGpgPubKey, params.mpcv2PartyId);
633
+ // Submit for final signature share combine
634
+ await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRoundThree], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
635
+ return (0, common_1.sendTxRequest)(this.bitgo, txRequest.walletId, txRequest.txRequestId, requestType, params.reqId);
636
+ }
637
+ // #endregion
638
+ // #region formatting utils
639
+ formatBitgoBroadcastMessage(broadcastMessage) {
640
+ return {
641
+ from: broadcastMessage.from,
642
+ payload: { message: broadcastMessage.message, signature: broadcastMessage.signature },
643
+ };
644
+ }
645
+ formatP2PMessage(p2pMessage, commitment) {
646
+ return {
647
+ payload: { encryptedMessage: p2pMessage.encryptedMessage, signature: p2pMessage.signature },
648
+ from: p2pMessage.from,
649
+ to: p2pMessage.to,
650
+ commitment,
651
+ };
652
+ }
653
+ // #endregion
654
+ // #region private utils
655
+ /**
656
+ * Get the hash string and derivation path from the transaction request.
657
+ * @param {TxRequest} txRequest - the transaction request object
658
+ * @param {RequestType} requestType - the request type
659
+ * @returns {{ hashBuffer: Buffer; derivationPath: string }} - the hash string and derivation path
660
+ */
661
+ getHashStringAndDerivationPath(txRequest, requestType = baseTypes_1.RequestType.tx) {
662
+ let txToSign;
663
+ let derivationPath;
664
+ let serializedTxHex;
665
+ if (requestType === baseTypes_1.RequestType.tx) {
666
+ const signableTx = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
667
+ txToSign = signableTx.signableHex;
668
+ derivationPath = signableTx.derivationPath;
669
+ serializedTxHex = signableTx.serializedTxHex;
670
+ }
671
+ else if (requestType === baseTypes_1.RequestType.message) {
672
+ // TODO(WP-2176): Add support for message signing
673
+ throw new Error('MPCv2 message signing not supported yet.');
674
+ }
675
+ else {
676
+ throw new Error('Invalid request type, got: ' + requestType);
677
+ }
678
+ // For Avalanche atomic transactions (cross-chain export/import between
679
+ // C-chain and P-chain), signableHex is already SHA-256(txBody) — a 32-byte
680
+ // pre-hashed digest. Use it directly as the DKLS message hash instead of
681
+ // applying the coin's hash function (keccak256 for EVM coins).
682
+ // This matches the WP/HSM BitGo-party behaviour (MPCv2Signer.isPreHashed)
683
+ // so both DKLS parties agree on the same message hash.
684
+ // Detection: Avalanche codec type ID prefix is 0x0000; standard EVM RLP
685
+ // starts with 0xf8xx, so there is no collision.
686
+ if (serializedTxHex && serializedTxHex.startsWith('0000')) {
687
+ const hashBuffer = buffer_1.Buffer.from(txToSign, 'hex');
688
+ (0, assert_1.default)(hashBuffer.length === 32, `Avalanche pre-hashed signableHex must be 32 bytes, got ${hashBuffer.length}`);
689
+ return { hashBuffer, derivationPath };
690
+ }
691
+ let hash;
692
+ try {
693
+ hash = this.baseCoin.getHashFunction();
694
+ }
695
+ catch (err) {
696
+ hash = (0, keccak_1.default)('keccak256');
697
+ }
698
+ const hashBuffer = hash.update(buffer_1.Buffer.from(txToSign, 'hex')).digest();
699
+ return { hashBuffer, derivationPath };
700
+ }
701
+ // #endregion
702
+ // #region external signer
703
+ /** @inheritdoc */
704
+ async signEcdsaMPCv2TssUsingExternalSigner(params, externalSignerMPCv2SigningRound1Generator, externalSignerMPCv2SigningRound2Generator, externalSignerMPCv2SigningRound3Generator, requestType = baseTypes_1.RequestType.tx) {
705
+ const { txRequest, reqId } = params;
706
+ let txRequestResolved;
707
+ // TODO(WP-2176): Add support for message signing
708
+ (0, assert_1.default)(requestType === baseTypes_1.RequestType.tx, 'Only transaction signing is supported for external signer, got: ' + requestType);
709
+ if (typeof txRequest === 'string') {
710
+ txRequestResolved = await (0, tss_1.getTxRequest)(this.bitgo, this.wallet.id(), txRequest, reqId);
711
+ }
712
+ else {
713
+ txRequestResolved = txRequest;
714
+ }
715
+ const bitgoPublicGpgKey = await this.pickBitgoPubGpgKeyForSigning(true, params.reqId, txRequestResolved.enterpriseId);
716
+ if (!bitgoPublicGpgKey) {
717
+ throw new Error('Missing BitGo GPG key for MPCv2');
718
+ }
719
+ // round 1
720
+ const { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey } = await externalSignerMPCv2SigningRound1Generator({ txRequest: txRequestResolved });
721
+ const round1TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
722
+ // round 2
723
+ const { signatureShareRound2, encryptedRound2Session } = await externalSignerMPCv2SigningRound2Generator({
724
+ txRequest: round1TxRequest,
725
+ encryptedRound1Session,
726
+ encryptedUserGpgPrvKey,
727
+ bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
728
+ });
729
+ const round2TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound2], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
730
+ (0, assert_1.default)(round2TxRequest.transactions && round2TxRequest.transactions[0].signatureShares, 'Missing signature shares in round 2 txRequest');
731
+ // round 3
732
+ const { signatureShareRound3 } = await externalSignerMPCv2SigningRound3Generator({
733
+ txRequest: round2TxRequest,
734
+ encryptedRound2Session,
735
+ encryptedUserGpgPrvKey,
736
+ bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
737
+ });
738
+ await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound3], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
739
+ return (0, common_1.sendTxRequest)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, requestType, reqId);
740
+ }
741
+ async createOfflineRound1Share(params) {
742
+ const { prv, walletPassphrase, txRequest, encryptedPrv } = params;
743
+ const { hashBuffer, derivationPath } = this.getHashStringAndDerivationPath(txRequest);
744
+ const adata = `${hashBuffer.toString('hex')}:${derivationPath}`;
745
+ const userKeyShare = buffer_1.Buffer.from(prv, 'base64');
746
+ const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
747
+ const userSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, derivationPath, hashBuffer);
748
+ const userSignerBroadcastMsg1 = await userSigner.init();
749
+ const signatureShareRound1 = await (0, ecdsaMPCv2_1.getSignatureShareRoundOne)(userSignerBroadcastMsg1, userGpgKey);
750
+ const sessionData = userSigner.getSession();
751
+ const userGpgPubKey = userGpgKey.publicKey;
752
+ const useV2 = encryptedPrv !== undefined && (0, baseTypes_1.isV2Envelope)(encryptedPrv);
753
+ if (useV2) {
754
+ const session = await this.bitgo.createEncryptionSession(walletPassphrase);
755
+ try {
756
+ const encryptedRound1Session = await session.encrypt(sessionData, `${EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND1_STATE}:${adata}`);
757
+ const encryptedUserGpgPrvKey = await session.encrypt(userGpgKey.privateKey, `${EcdsaMPCv2Utils.DKLS23_SIGNING_USER_GPG_KEY}:${adata}`);
758
+ return { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey };
759
+ }
760
+ finally {
761
+ session.destroy();
762
+ }
763
+ }
764
+ const encryptedRound1Session = await this.bitgo.encryptAsync({
765
+ input: sessionData,
766
+ password: walletPassphrase,
767
+ adata: `${EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND1_STATE}:${adata}`,
768
+ });
769
+ const encryptedUserGpgPrvKey = await this.bitgo.encryptAsync({
770
+ input: userGpgKey.privateKey,
771
+ password: walletPassphrase,
772
+ adata: `${EcdsaMPCv2Utils.DKLS23_SIGNING_USER_GPG_KEY}:${adata}`,
773
+ });
774
+ return { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey };
775
+ }
776
+ async createOfflineRound2Share(params) {
777
+ const { prv, walletPassphrase, encryptedUserGpgPrvKey, encryptedRound1Session, bitgoPublicGpgKey, txRequest } = params;
778
+ const { hashBuffer, derivationPath } = this.getHashStringAndDerivationPath(txRequest);
779
+ const adata = `${hashBuffer.toString('hex')}:${derivationPath}`;
780
+ const useV2 = (0, baseTypes_1.isV2Envelope)(encryptedRound1Session);
781
+ const { bitgoGpgKey, userGpgPrvKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, EcdsaMPCv2Utils.DKLS23_SIGNING_USER_GPG_KEY);
782
+ const userGpgKey = {
783
+ privateKey: userGpgPrvKey.armor(),
784
+ publicKey: userGpgPrvKey.toPublic().armor(),
785
+ };
786
+ const signatureShares = txRequest.transactions?.[0].signatureShares;
787
+ (0, assert_1.default)(signatureShares, 'Missing signature shares in round 1 txRequest');
788
+ const parsedBitGoToUserSigShareRoundOne = JSON.parse(signatureShares[signatureShares.length - 1].share);
789
+ if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
790
+ throw new Error('Unexpected signature share response. Unable to parse data.');
791
+ }
792
+ const serializedBitGoToUserMessagesRound1 = await (0, ecdsaMPCv2_1.verifyBitGoMessagesAndSignaturesRoundOne)(parsedBitGoToUserSigShareRoundOne, userGpgKey, bitgoGpgKey);
793
+ let round1Session;
794
+ if (useV2) {
795
+ round1Session = await this.bitgo.decryptAsync({ input: encryptedRound1Session, password: walletPassphrase });
796
+ }
797
+ else {
798
+ round1Session = this.bitgo.decrypt({ input: encryptedRound1Session, password: walletPassphrase });
799
+ }
800
+ this.validateAdata(adata, encryptedRound1Session, EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND1_STATE);
801
+ const userKeyShare = buffer_1.Buffer.from(prv, 'base64');
802
+ const userSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, derivationPath, hashBuffer);
803
+ await userSigner.setSession(round1Session);
804
+ const deserializedMessages = sdk_lib_mpc_1.DklsTypes.deserializeMessages(serializedBitGoToUserMessagesRound1);
805
+ const userToBitGoMessagesRound2 = userSigner.handleIncomingMessages({
806
+ p2pMessages: [],
807
+ broadcastMessages: deserializedMessages.broadcastMessages,
808
+ });
809
+ const userToBitGoMessagesRound3 = userSigner.handleIncomingMessages({
810
+ p2pMessages: deserializedMessages.p2pMessages,
811
+ broadcastMessages: [],
812
+ });
813
+ const signatureShareRound2 = await (0, ecdsaMPCv2_1.getSignatureShareRoundTwo)(userToBitGoMessagesRound2, userToBitGoMessagesRound3, userGpgKey, bitgoGpgKey);
814
+ const sessionData = userSigner.getSession();
815
+ if (useV2) {
816
+ const encSession = await this.bitgo.createEncryptionSession(walletPassphrase);
817
+ try {
818
+ const encryptedRound2Session = await encSession.encrypt(sessionData, `${EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND2_STATE}:${adata}`);
819
+ return { signatureShareRound2, encryptedRound2Session };
820
+ }
821
+ finally {
822
+ encSession.destroy();
823
+ }
824
+ }
825
+ const encryptedRound2Session = await this.bitgo.encryptAsync({
826
+ input: sessionData,
827
+ password: walletPassphrase,
828
+ adata: `${EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND2_STATE}:${adata}`,
829
+ });
830
+ return {
831
+ signatureShareRound2,
832
+ encryptedRound2Session,
833
+ };
834
+ }
835
+ async createOfflineRound3Share(params) {
836
+ const { prv, walletPassphrase, encryptedUserGpgPrvKey, encryptedRound2Session, bitgoPublicGpgKey, txRequest } = params;
837
+ (0, assert_1.default)(txRequest.transactions && txRequest.transactions.length === 1, 'Unable to find transactions in txRequest');
838
+ const { hashBuffer, derivationPath } = this.getHashStringAndDerivationPath(txRequest);
839
+ const adata = `${hashBuffer.toString('hex')}:${derivationPath}`;
840
+ const useV2 = (0, baseTypes_1.isV2Envelope)(encryptedRound2Session);
841
+ const { bitgoGpgKey, userGpgPrvKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, EcdsaMPCv2Utils.DKLS23_SIGNING_USER_GPG_KEY);
842
+ const userGpgKey = {
843
+ privateKey: userGpgPrvKey.armor(),
844
+ publicKey: userGpgPrvKey.toPublic().armor(),
845
+ };
846
+ const signatureShares = txRequest.transactions?.[0].signatureShares;
847
+ (0, assert_1.default)(signatureShares, 'Missing signature shares in round 2 txRequest');
848
+ const parsedBitGoToUserSigShareRoundTwo = JSON.parse(signatureShares[signatureShares.length - 1].share);
849
+ if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
850
+ throw new Error('Unexpected signature share response. Unable to parse data.');
851
+ }
852
+ const serializedBitGoToUserMessagesRound3 = await (0, ecdsaMPCv2_1.verifyBitGoMessagesAndSignaturesRoundTwo)(parsedBitGoToUserSigShareRoundTwo, userGpgKey, bitgoGpgKey);
853
+ const deserializedBitGoToUserMessagesRound3 = sdk_lib_mpc_1.DklsTypes.deserializeMessages({
854
+ p2pMessages: serializedBitGoToUserMessagesRound3.p2pMessages,
855
+ broadcastMessages: [],
856
+ });
857
+ let round2Session;
858
+ if (useV2) {
859
+ round2Session = await this.bitgo.decryptAsync({ input: encryptedRound2Session, password: walletPassphrase });
860
+ }
861
+ else {
862
+ round2Session = this.bitgo.decrypt({ input: encryptedRound2Session, password: walletPassphrase });
863
+ }
864
+ this.validateAdata(adata, encryptedRound2Session, EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND2_STATE);
865
+ const userKeyShare = buffer_1.Buffer.from(prv, 'base64');
866
+ const userSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, derivationPath, hashBuffer);
867
+ await userSigner.setSession(round2Session);
868
+ const userToBitGoMessagesRound4 = userSigner.handleIncomingMessages({
869
+ p2pMessages: deserializedBitGoToUserMessagesRound3.p2pMessages,
870
+ broadcastMessages: [],
871
+ });
872
+ const signatureShareRound3 = await (0, ecdsaMPCv2_1.getSignatureShareRoundThree)(userToBitGoMessagesRound4, userGpgKey, bitgoGpgKey);
873
+ return { signatureShareRound3 };
874
+ }
875
+ }
876
+ exports.EcdsaMPCv2Utils = EcdsaMPCv2Utils;
877
+ EcdsaMPCv2Utils.DKLS23_SIGNING_USER_GPG_KEY = 'DKLS23_SIGNING_USER_GPG_KEY';
878
+ EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND1_STATE = 'DKLS23_SIGNING_ROUND1_STATE';
879
+ EcdsaMPCv2Utils.DKLS23_SIGNING_ROUND2_STATE = 'DKLS23_SIGNING_ROUND2_STATE';
880
+ /**
881
+ * TODO: deprecate this function in favor of isGG18SigningMaterialAsync once v2 encryption is default
882
+ * Checks if the given key share, when decrypted, contains valid GG18 signing material.
883
+ *
884
+ * @param {string} keyShare - The encrypted key share string.
885
+ * @param {string|undefined} walletPassphrase - The passphrase used to decrypt the key share
886
+ * @returns {boolean} - Returns `true` if the decrypted data contains valid signing material, otherwise `false`.
887
+ */
888
+ function isGG18SigningMaterial(keyShare, walletPassphrase) {
889
+ const prv = sjcl.decrypt(walletPassphrase, keyShare);
890
+ try {
891
+ const signingMaterial = JSON.parse(prv);
892
+ return (signingMaterial.pShare &&
893
+ signingMaterial.bitgoNShare &&
894
+ (signingMaterial.userNShare || signingMaterial.backupNShare));
895
+ }
896
+ catch (error) {
897
+ return false;
898
+ }
899
+ }
900
+ /**
901
+ * Async version of {@link isGG18SigningMaterial} with v1/v2 auto-detect decrypt via `bitgo.decryptAsync`.
902
+ */
903
+ async function isGG18SigningMaterialAsync(keyShare, walletPassphrase, bitgo) {
904
+ try {
905
+ const prv = await bitgo.decryptAsync({ password: walletPassphrase, input: keyShare });
906
+ const signingMaterial = JSON.parse(prv);
907
+ return (signingMaterial.pShare &&
908
+ signingMaterial.bitgoNShare &&
909
+ (signingMaterial.userNShare || signingMaterial.backupNShare));
910
+ }
911
+ catch (error) {
912
+ return false;
913
+ }
914
+ }
915
+ /**
916
+ * Get the MPC v2 recovery key shares from the provided user and backup key shares.
917
+ * @param encryptedUserKey encrypted gg18 or MPCv2 user key
918
+ * @param encryptedBackupKey encrypted gg18 or MPCv2 backup key
919
+ * @param walletPassphrase password for user and backup key
920
+ * @param bitgo BitGo instance for v1/v2 auto-detect decrypt
921
+ * @returns MPC v2 recovery key shares
922
+ */
923
+ async function getMpcV2RecoveryKeyShares(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo) {
924
+ if (bitgo) {
925
+ if (await isGG18SigningMaterialAsync(encryptedUserKey, walletPassphrase, bitgo)) {
926
+ return getMpcV2RecoveryKeySharesFromGG18(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo);
927
+ }
928
+ return getMpcV2RecoveryKeySharesFromReducedKey(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo);
929
+ }
930
+ if (isGG18SigningMaterial(encryptedUserKey, walletPassphrase)) {
931
+ return getMpcV2RecoveryKeySharesFromGG18(encryptedUserKey, encryptedBackupKey, walletPassphrase);
932
+ }
933
+ return getMpcV2RecoveryKeySharesFromReducedKey(encryptedUserKey, encryptedBackupKey, walletPassphrase);
934
+ }
935
+ /**
936
+ * Signs a message hash using MPC v2 recovery key shares.
937
+ *
938
+ * @param {Buffer} messageHash
939
+ * @param {Buffer} userKeyShare
940
+ * @param {Buffer} backupKeyShare
941
+ * @param {string} commonKeyChain
942
+ * @returns {Promise<{ recid: number, r: string, s: string, y: string }>}
943
+ *
944
+ * @async
945
+ */
946
+ async function signRecoveryMpcV2(messageHash, userKeyShare, backupKeyShare, commonKeyChain) {
947
+ const userDsg = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, 'm/0', messageHash);
948
+ const backupDsg = new sdk_lib_mpc_1.DklsDsg.Dsg(backupKeyShare, 1, 'm/0', messageHash);
949
+ const signatureString = sdk_lib_mpc_1.DklsUtils.verifyAndConvertDklsSignature(messageHash, (await sdk_lib_mpc_1.DklsUtils.executeTillRound(5, userDsg, backupDsg)), commonKeyChain, 'm/0', undefined, false);
950
+ const sigParts = signatureString.split(':');
951
+ return {
952
+ recid: parseInt(sigParts[0], 10),
953
+ r: sigParts[1],
954
+ s: sigParts[2],
955
+ y: sigParts[3],
956
+ };
957
+ }
958
+ // #region private utils
959
+ /**
960
+ * Get the MPC v2 recovery key shares from the provided user and backup key shares.
961
+ * @param encryptedGG18UserKey encrypted gg18 user key
962
+ * @param encryptedGG18BackupKey encrypted gg18 backup key
963
+ * @param walletPassphrase password for user and backup key
964
+ * @returns MPC v2 recovery key shares
965
+ */
966
+ async function getMpcV2RecoveryKeySharesFromGG18(encryptedGG18UserKey, encryptedGG18BackupKey, walletPassphrase, bitgo) {
967
+ const [userKeyCombined, backupKeyCombined] = await getKeyCombinedFromTssKeyShares(encryptedGG18UserKey, encryptedGG18BackupKey, walletPassphrase, bitgo);
968
+ const retrofitDataA = {
969
+ xShare: userKeyCombined.xShare,
970
+ };
971
+ const retrofitDataB = {
972
+ xShare: backupKeyCombined.xShare,
973
+ };
974
+ const [user, backup] = await sdk_lib_mpc_1.DklsUtils.generate2of2KeyShares(retrofitDataA, retrofitDataB);
975
+ const userKeyShare = user.getKeyShare();
976
+ const backupKeyShare = backup.getKeyShare();
977
+ return {
978
+ userKeyShare,
979
+ backupKeyShare,
980
+ commonKeyChain: sdk_lib_mpc_1.DklsTypes.getCommonKeychain(backupKeyShare),
981
+ };
982
+ }
983
+ /**
984
+ * Retrieves the MPC v2 recovery key shares from the provided user and backup key shares.
985
+ *
986
+ * @param {string} encryptedMPCv2UserKey
987
+ * @param {string} encryptedMPCv2BackupKey
988
+ * @param {string} [walletPassphrase] - The passphrase used to decrypt the key shares
989
+ * @returns {Promise<{ userKeyShare: KeyShare, backupKeyShare: KeyShare, commonKeyChain: string }>}
990
+ *
991
+ * @async
992
+ */
993
+ async function getMpcV2RecoveryKeySharesFromReducedKey(encryptedMPCv2UserKey, encryptedMPCv2BackupKey, walletPassphrase, bitgo) {
994
+ let userCompressedPrv;
995
+ let bakcupCompressedPrv;
996
+ if (bitgo) {
997
+ userCompressedPrv = buffer_1.Buffer.from(await bitgo.decryptAsync({ password: walletPassphrase, input: encryptedMPCv2UserKey }), 'base64');
998
+ bakcupCompressedPrv = buffer_1.Buffer.from(await bitgo.decryptAsync({ password: walletPassphrase, input: encryptedMPCv2BackupKey }), 'base64');
999
+ }
1000
+ else {
1001
+ userCompressedPrv = buffer_1.Buffer.from(sjcl.decrypt(walletPassphrase, encryptedMPCv2UserKey), 'base64');
1002
+ bakcupCompressedPrv = buffer_1.Buffer.from(sjcl.decrypt(walletPassphrase, encryptedMPCv2BackupKey), 'base64');
1003
+ }
1004
+ const userPrvJSON = sdk_lib_mpc_1.DklsTypes.getDecodedReducedKeyShare(userCompressedPrv);
1005
+ const backupPrvJSON = sdk_lib_mpc_1.DklsTypes.getDecodedReducedKeyShare(bakcupCompressedPrv);
1006
+ const userKeyRetrofit = {
1007
+ xShare: {
1008
+ x: buffer_1.Buffer.from(userPrvJSON.prv).toString('hex'),
1009
+ y: buffer_1.Buffer.from(userPrvJSON.pub).toString('hex'),
1010
+ chaincode: buffer_1.Buffer.from(userPrvJSON.rootChainCode).toString('hex'),
1011
+ },
1012
+ xiList: userPrvJSON.xList.slice(0, 2),
1013
+ };
1014
+ const backupKeyRetrofit = {
1015
+ xShare: {
1016
+ x: buffer_1.Buffer.from(backupPrvJSON.prv).toString('hex'),
1017
+ y: buffer_1.Buffer.from(backupPrvJSON.pub).toString('hex'),
1018
+ chaincode: buffer_1.Buffer.from(backupPrvJSON.rootChainCode).toString('hex'),
1019
+ },
1020
+ xiList: backupPrvJSON.xList.slice(0, 2),
1021
+ };
1022
+ const [user, backup] = await sdk_lib_mpc_1.DklsUtils.generate2of2KeyShares(userKeyRetrofit, backupKeyRetrofit);
1023
+ const userKeyShare = user.getKeyShare();
1024
+ const backupKeyShare = backup.getKeyShare();
1025
+ const commonKeyChain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(userKeyShare);
1026
+ return { userKeyShare, backupKeyShare, commonKeyChain };
1027
+ }
1028
+ /**
1029
+ * Gets the combined key for GG18
1030
+ * @param encryptedGG18UserKey encrypted GG18 user key
1031
+ * @param encryptedGG18BackupKey encrypted GG18 backup key
1032
+ * @param walletPassphrase wallet passphrase
1033
+ * @returns key shares
1034
+ */
1035
+ async function getKeyCombinedFromTssKeyShares(encryptedGG18UserKey, encryptedGG18BackupKey, walletPassphrase, bitgo) {
1036
+ let backupPrv;
1037
+ let userPrv;
1038
+ try {
1039
+ if (bitgo) {
1040
+ backupPrv = await bitgo.decryptAsync({ password: walletPassphrase, input: encryptedGG18BackupKey });
1041
+ userPrv = await bitgo.decryptAsync({ password: walletPassphrase, input: encryptedGG18UserKey });
1042
+ }
1043
+ else {
1044
+ backupPrv = sjcl.decrypt(walletPassphrase, encryptedGG18BackupKey);
1045
+ userPrv = sjcl.decrypt(walletPassphrase, encryptedGG18UserKey);
1046
+ }
1047
+ }
1048
+ catch (e) {
1049
+ throw new Error(`Error decrypting backup keychain: ${e.message}`);
1050
+ }
1051
+ const userSigningMaterial = JSON.parse(userPrv);
1052
+ const backupSigningMaterial = JSON.parse(backupPrv);
1053
+ if (!userSigningMaterial.backupNShare) {
1054
+ throw new Error('Invalid user key - missing backupNShare');
1055
+ }
1056
+ if (!backupSigningMaterial.userNShare) {
1057
+ throw new Error('Invalid backup key - missing userNShare');
1058
+ }
1059
+ const MPC = new account_lib_1.Ecdsa();
1060
+ const userKeyCombined = MPC.keyCombine(userSigningMaterial.pShare, [
1061
+ userSigningMaterial.bitgoNShare,
1062
+ userSigningMaterial.backupNShare,
1063
+ ]);
1064
+ const backupKeyCombined = MPC.keyCombine(backupSigningMaterial.pShare, [
1065
+ backupSigningMaterial.userNShare,
1066
+ backupSigningMaterial.bitgoNShare,
1067
+ ]);
1068
+ if (userKeyCombined.xShare.y !== backupKeyCombined.xShare.y ||
1069
+ userKeyCombined.xShare.chaincode !== backupKeyCombined.xShare.chaincode) {
1070
+ throw new Error('Common keychains do not match');
1071
+ }
1072
+ return [userKeyCombined, backupKeyCombined];
1073
+ }
1074
+ // #endregion
1075
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErM0NBLHNEQVlDO0FBS0QsZ0VBZ0JDO0FBVUQsOERBb0JDO0FBYUQsOENBOEJDO0FBeCtDRCx5REFBOEc7QUFDOUcsdURBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBZ0M7QUFFaEMsNkNBQTZDO0FBQzdDLG9EQUFzQztBQUd0QyxzREFVNkI7QUFFN0IseURBQWdEO0FBR2hELHNDQUE4RDtBQUM5RCxnREFBMEU7QUFDMUUsNkNBQWdEO0FBQ2hELDhEQU11QztBQUV2QyxxREFBd0Q7QUFDeEQsNENBY3NCO0FBQ3RCLGlDQUF3QztBQUN4QyxxRUFBNkY7QUFDN0YsNERBQThGO0FBQzlGLDRDQUEwRDtBQUcxRCxNQUFhLGVBQWdCLFNBQVEscUJBQWM7SUFLakQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFPckI7UUFDQyxNQUFNLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTNELGtFQUFrRTtRQUNsRSxvRUFBb0U7UUFDcEUsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEcsTUFBTSxRQUFR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QUN2RSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxPQUFPLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbmNyeXB0aW9uVmVyc2lvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBiaWdJbnRUb0J1ZmZlckJFLCBEa2xzQ29tbXMsIERrbHNEa2csIERrbHNEc2csIERrbHNUeXBlcywgRGtsc1V0aWxzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28tYmV0YS9zamNsJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IE5vbkVtcHR5U3RyaW5nIH0gZnJvbSAnaW8tdHMtdHlwZXMnO1xuaW1wb3J0IGNyZWF0ZUtlY2Nha0hhc2ggZnJvbSAna2VjY2FrJztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IEtleWNoYWluc1RyaXBsZXQgfSBmcm9tICcuLi8uLi8uLi9iYXNlQ29pbic7XG5pbXBvcnQge1xuICBNUEN2MkJyb2FkY2FzdE1lc3NhZ2UsXG4gIE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2UsXG4gIE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2UsXG4gIE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2UsXG4gIE1QQ3YyS2V5R2VuU3RhdGVFbnVtLFxuICBNUEN2MlAyUE1lc3NhZ2UsXG4gIE1QQ3YyUGFydHlGcm9tU3RyaW5nT3JOdW1iZXIsXG4gIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuXG5pbXBvcnQgeyBFY2RzYSB9IGZyb20gJy4uLy4uLy4uLy4uL2FjY291bnQtbGliJztcbmltcG9ydCB7IEFkZEtleWNoYWluT3B0aW9ucywgS2V5Y2hhaW4sIEtleVR5cGUsIFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8gfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgeyBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQgfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbi9pS2V5Y2hhaW5zJztcbmltcG9ydCB7IEVDRFNBTWV0aG9kVHlwZXMsIGdldFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcyc7XG5pbXBvcnQgeyBzZW5kU2lnbmF0dXJlU2hhcmVWMiwgc2VuZFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcy9jb21tb24nO1xuaW1wb3J0IHsgTVBDdjJQYXJ0aWVzRW51bSB9IGZyb20gJy4vdHlwZXNNUEN2Mic7XG5pbXBvcnQge1xuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lLFxuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUsXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28sXG4gIHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRPbmUsXG4gIHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28sXG59IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS9lY2RzYU1QQ3YyJztcbmltcG9ydCB7IEtleUNvbWJpbmVkIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlR1BHS2V5UGFpciB9IGZyb20gJy4uLy4uL29wZW5ncGdVdGlscyc7XG5pbXBvcnQge1xuICBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBSZXF1ZXN0VHlwZSxcbiAgU2lnbmF0dXJlU2hhcmVSZWNvcmQsXG4gIFRTU1BhcmFtcyxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gIFRTU1BhcmFtc1dpdGhQcnYsXG4gIFRzc1NpZ25UeFJlcXVlc3RQYXJhbXNXaXRoUHJ2LFxuICBUc3NUeFJlY2lwaWVudFNvdXJjZSxcbiAgVHhSZXF1ZXN0LFxuICBpc1YyRW52ZWxvcGUsXG59IGZyb20gJy4uL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBCYXNlRWNkc2FVdGlscyB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBFY2RzYU1QQ3YyS2V5R2VuU2VuZEZuLCBLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlIH0gZnJvbSAnLi9lY2RzYU1QQ3YyS2V5R2VuU2VuZGVyJztcbmltcG9ydCB7IGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcsIGlzQml0Z29NcGNQdWJLZXkgfSBmcm9tICcuLi8uLi8uLi90c3MvYml0Z29QdWJLZXlzJztcbmltcG9ydCB7IEludmFsaWRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uL2JpdGdvQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFY2RzYU1QQ3YyVXRpbHMgZXh0ZW5kcyBCYXNlRWNkc2FVdGlscyB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERLTFMyM19TSUdOSU5HX1VTRVJfR1BHX0tFWSA9ICdES0xTMjNfU0lHTklOR19VU0VSX0dQR19LRVknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBES0xTMjNfU0lHTklOR19ST1VORDFfU1RBVEUgPSAnREtMUzIzX1NJR05JTkdfUk9VTkQxX1NUQVRFJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFID0gJ0RLTFMyM19TSUdOSU5HX1JPVU5EMl9TVEFURSc7XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWlucyhwYXJhbXM6IHtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZTogc3RyaW5nO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZztcbiAgICByZXRyb2ZpdD86IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZDtcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvO1xuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb247XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCB7IHVzZXJTZXNzaW9uLCBiYWNrdXBTZXNzaW9uIH0gPSB0aGlzLmdldFVzZXJBbmRCYWNrdXBTZXNzaW9uKDIsIDMsIHBhcmFtcy5yZXRyb2ZpdCk7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgYmFja3VwR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcblxuICAgIC8vIEdldCB0aGUgQml0R28gcHVibGljIGtleSBiYXNlZCBvbiB1c2VyL2VudGVycHJpc2UgZmVhdHVyZSBmbGFnc1xuICAgIC8vIElmIGl0IGRvZXNuJ3Qgd29yaywgdXNlIHRoZSBkZWZhdWx0IHB1YmxpYyBrZXkgZnJvbSB0aGUgY29uc3RhbnRzXG4gICAgY29uc3QgeyBtcGN2MlB1YmxpY0tleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MocGFyYW1zLmVudGVycHJpc2UsIHRydWUpO1xuICAgIGNvbnN0IG1wY3YyS2V5ID0gbXBjdjJQdWJsaWNLZXkgPz8gdGhpcy5iaXRnb01QQ3YyUHVibGljR3BnS2V5O1xuICAgIGFzc2VydChtcGN2MktleSwgJ0ZhaWxlZCB0byBnZXQgQml0R28gTVBDdjIgR1BHIHB1YmxpYyBrZXknKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IG1wY3YyS2V5LmFybW9yKCk7XG5cbiAgICBpZiAoZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZyh0aGlzLmJpdGdvLmdldEVudigpKSkge1xuICAgICAgLy8gRW5zdXJlIHRoZSBwdWJsaWMga2V5IGlzIG9uZSBvZiB0aGUgZXhwZWN0ZWQgQml0R28gcHVibGljIGtleXMgd2hlbiBpbiB0ZXN0IG9yIHByb2QuXG4gICAgICBhc3NlcnQoaXNCaXRnb01wY1B1YktleShiaXRnb1B1YmxpY0dwZ0tleSwgJ21wY3YyJyksICdJbnZhbGlkIEJpdEdvIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlckdwZ1BydktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgZ3BnS2V5OiB1c2VyR3BnS2V5LnByaXZhdGVLZXksXG4gICAgfTtcbiAgICBjb25zdCBiYWNrdXBHcGdQcnZLZXk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSA9IHtcbiAgICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgZ3BnS2V5OiBiYWNrdXBHcGdLZXkucHJpdmF0ZUtleSxcbiAgICB9O1xuICAgIGNvbnN0IGJpdGdvR3BnUHViS2V5OiBEa2xzVHlwZXMuUGFydHlHcGdLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgZ3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICB9O1xuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAxXG4gICAgY29uc3QgdXNlclJvdW5kMUJyb2FkY2FzdE1zZyA9IGF3YWl0IHVzZXJTZXNzaW9uLmluaXREa2coKTtcbiAgICBjb25zdCBiYWNrdXBSb3VuZDFCcm9hZGNhc3RNc2cgPSBhd2FpdCBiYWNrdXBTZXNzaW9uLmluaXREa2coKTtcblxuICAgIGNvbnN0IHJvdW5kMVNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5zZXJpYWxpemVNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW3VzZXJSb3VuZDFCcm9hZGNhc3RNc2csIGJhY2t1cFJvdW5kMUJyb2FkY2FzdE1zZ10sXG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3Qgcm91bmQxTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgcm91bmQxU2VyaWFsaXplZE1lc3NhZ2VzLFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5LCBiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBiaXRnb01zZzEsIGJpdGdvVG9CYWNrdXBNc2cyLCBiaXRnb1RvVXNlck1zZzIgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDEoXG4gICAgICBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHBhcmFtcy5yZXRyb2ZpdD8ud2FsbGV0SWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5yb3VuZDFNZXNzYWdlcyxcbiAgICAgICAgICAgIHdhbGxldElkOiBwYXJhbXMucmV0cm9maXQud2FsbGV0SWQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHJvdW5kMU1lc3NhZ2VzXG4gICAgKTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDJcbiAgICBjb25zdCBiaXRnb1JvdW5kMUJyb2FkY2FzdE1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW10sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2cxKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3QgYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cgPSBiaXRnb1JvdW5kMUJyb2FkY2FzdE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2csICdCaXRHbyBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kMlAyUE1lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW0RrbHNUeXBlcy5kZXNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cpLCBiYWNrdXBSb3VuZDFCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlclRvQml0Z29Nc2cyID0gdXNlclJvdW5kMlAyUE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JpdGdvTXNnMiwgJ1VzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclRvQml0Z29Nc2cyID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UodXNlclRvQml0Z29Nc2cyKTtcblxuICAgIGNvbnN0IGJhY2t1cFJvdW5kMlAyUE1lc3NhZ2VzID0gYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdXNlclJvdW5kMUJyb2FkY2FzdE1zZywgRGtsc1R5cGVzLmRlc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb1JvdW5kMUJyb2FkY2FzdE1zZyldLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMiA9IERrbHNUeXBlcy5zZXJpYWxpemVNZXNzYWdlcyhiYWNrdXBSb3VuZDJQMlBNZXNzYWdlcykucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzIsICdCYWNrdXAgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHJvdW5kMk1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFtzZXJpYWxpemVkVXNlclRvQml0Z29Nc2cyLCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzJdLCBicm9hZGNhc3RNZXNzYWdlczogW10gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMixcbiAgICAgIGJpdGdvQ29tbWl0bWVudDIsXG4gICAgICBiaXRnb1RvVXNlck1zZzMsXG4gICAgICBiaXRnb1RvQmFja3VwTXNnMyxcbiAgICB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMihwYXJhbXMuZW50ZXJwcmlzZSwgc2Vzc2lvbklkLCByb3VuZDJNZXNzYWdlcyk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAzXG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQyLCAnUm91bmQgMSBhbmQgMiBTZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcbiAgICBjb25zdCBkZWNyeXB0ZWRCaXRnb1RvVXNlclJvdW5kMk1zZ3MgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9Vc2VyTXNnMildLCBicm9hZGNhc3RNZXNzYWdlczogW10gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kMk1zZyA9IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQyTXNncy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDJNc2csICdCaXRHbyB0byBVc2VyIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub1VzZXJSb3VuZDJNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kMk1zZyk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvQmFja3VwTXNnMildLCBicm9hZGNhc3RNZXNzYWdlczogW10gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2csICdCaXRHbyB0byBCYWNrdXAgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiaXRnb1RvQmFja3VwUm91bmQyTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZyk7XG5cbiAgICBjb25zdCB1c2VyVG9CYWNrdXBNc2cyID0gdXNlclJvdW5kMlAyUE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CYWNrdXBNc2cyLCAnVXNlciB0byBCYWNrdXAgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlck1zZzIgPSBiYWNrdXBSb3VuZDJQMlBNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwVG9Vc2VyTXNnMiwgJ0JhY2t1cCB0byBVc2VyIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCB1c2VyUm91bmQzTWVzc2FnZXMgPSB1c2VyU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICAgIHAycE1lc3NhZ2VzOiBbYml0Z29Ub1VzZXJSb3VuZDJNc2csIGJhY2t1cFRvVXNlck1zZzJdLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJUb0JhY2t1cE1zZzMgPSB1c2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JhY2t1cE1zZzMsICdVc2VyIHRvIEJhY2t1cCBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHVzZXJUb0JpdGdvTXNnMyA9IHVzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CaXRnb01zZzMsICdVc2VyIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMyA9IERrbHNUeXBlcy5zZXJpYWxpemVQMlBNZXNzYWdlKHVzZXJUb0JpdGdvTXNnMyk7XG5cbiAgICBjb25zdCBiYWNrdXBSb3VuZDNNZXNzYWdlcyA9IGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICBwMnBNZXNzYWdlczogW2JpdGdvVG9CYWNrdXBSb3VuZDJNc2csIHVzZXJUb0JhY2t1cE1zZzJdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYmFja3VwVG9Vc2VyTXNnMyA9IGJhY2t1cFJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBUb1VzZXJNc2czLCAnQmFja3VwIHRvIFVzZXIgbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiYWNrdXBUb0JpdGdvTXNnMyA9IGJhY2t1cFJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwVG9CaXRnb01zZzMsICdCYWNrdXAgdG8gQml0Z28gbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzMgPSBEa2xzVHlwZXMuc2VyaWFsaXplUDJQTWVzc2FnZShiYWNrdXBUb0JpdGdvTXNnMyk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRCaXRnb1RvVXNlclJvdW5kM01lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9Vc2VyTXNnMywgYml0Z29Db21taXRtZW50MildIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDNNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvVXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kM01zZywgJ0JpdEdvIHRvIFVzZXIgbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiaXRnb1RvVXNlclJvdW5kM01zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQzTXNnKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDNNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvQmFja3VwTXNnMywgYml0Z29Db21taXRtZW50MildIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW2JhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQzTXNnID0gZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDNNc2csICdCaXRHbyB0byBCYWNrdXAgbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiaXRnb1RvQmFja3VwUm91bmQzTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kM01zZyk7XG5cbiAgICBjb25zdCB1c2VyUm91bmQ0TWVzc2FnZXMgPSB1c2VyU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbYmFja3VwVG9Vc2VyTXNnMywgYml0Z29Ub1VzZXJSb3VuZDNNc2ddLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlclJvdW5kNEJyb2FkY2FzdE1zZyA9IHVzZXJSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXNzZXJ0KHVzZXJSb3VuZDRCcm9hZGNhc3RNc2csICdVc2VyIG1lc3NhZ2UgNCBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFVzZXJSb3VuZDRCcm9hZGNhc3RNc2cgPSBEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZSh1c2VyUm91bmQ0QnJvYWRjYXN0TXNnKTtcblxuICAgIGNvbnN0IGJhY2t1cFJvdW5kNE1lc3NhZ2VzID0gYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbdXNlclRvQmFja3VwTXNnMywgYml0Z29Ub0JhY2t1cFJvdW5kM01zZ10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3QgYmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnID0gYmFja3VwUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnLCAnQmFja3VwIG1lc3NhZ2UgNCBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZyA9IERrbHNUeXBlcy5zZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZyk7XG5cbiAgICBjb25zdCByb3VuZDNNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICB7XG4gICAgICAgIHAycE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMywgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2czXSxcbiAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtzZXJpYWxpemVkVXNlclJvdW5kNEJyb2FkY2FzdE1zZywgc2VyaWFsaXplZEJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZ10sXG4gICAgICB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5LCBiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQzLFxuICAgICAgYml0Z29Nc2c0LFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDMocGFyYW1zLmVudGVycHJpc2UsIHNlc3Npb25JZCwgcm91bmQzTWVzc2FnZXMpO1xuXG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBrZXljaGFpbiBjcmVhdGlvblxuICAgIGFzc2VydC5lcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMywgJ1JvdW5kIDEgYW5kIDMgU2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG4gICAgY29uc3QgYml0Z29Sb3VuZDRCcm9hZGNhc3RNZXNzYWdlcyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKFxuICAgICAgYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgICB7IHAycE1lc3NhZ2VzOiBbXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFt0aGlzLmZvcm1hdEJpdGdvQnJvYWRjYXN0TWVzc2FnZShiaXRnb01zZzQpXSB9LFxuICAgICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgICBbXVxuICAgICAgKVxuICAgICkuYnJvYWRjYXN0TWVzc2FnZXM7XG4gICAgY29uc3QgYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2cgPSBiaXRnb1JvdW5kNEJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyk7XG5cbiAgICBhc3NlcnQoYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2csICdCaXRHbyBtZXNzYWdlIDQgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZywgYmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnXSxcbiAgICB9KTtcblxuICAgIGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW2JpdGdvUm91bmQ0QnJvYWRjYXN0TXNnLCB1c2VyUm91bmQ0QnJvYWRjYXN0TXNnXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJQcml2YXRlTWF0ZXJpYWwgPSB1c2VyU2Vzc2lvbi5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IGJhY2t1cFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cFNlc3Npb24uZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IHVzZXJTZXNzaW9uLmdldFJlZHVjZWRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IGJhY2t1cFJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSBiYWNrdXBTZXNzaW9uLmdldFJlZHVjZWRLZXlTaGFyZSgpO1xuXG4gICAgY29uc3QgdXNlckNvbW1vbktleWNoYWluID0gRGtsc1R5cGVzLmdldENvbW1vbktleWNoYWluKHVzZXJQcml2YXRlTWF0ZXJpYWwpO1xuICAgIGNvbnN0IGJhY2t1cENvbW1vbktleWNoYWluID0gRGtsc1R5cGVzLmdldENvbW1vbktleWNoYWluKGJhY2t1cFByaXZhdGVNYXRlcmlhbCk7XG5cbiAgICBhc3NlcnQuZXF1YWwoYml0Z29Db21tb25LZXljaGFpbiwgdXNlckNvbW1vbktleWNoYWluLCAnVXNlciBhbmQgQml0Z28gQ29tbW9uIGtleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcbiAgICBhc3NlcnQuZXF1YWwoYml0Z29Db21tb25LZXljaGFpbiwgYmFja3VwQ29tbW9uS2V5Y2hhaW4sICdCYWNrdXAgYW5kIEJpdGdvIENvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG5cbiAgICBjb25zdCBlbmNyeXB0aW9uU2Vzc2lvbiA9XG4gICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24gPT09IDIgPyBhd2FpdCB0aGlzLmJpdGdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhcmFtcy5wYXNzcGhyYXNlKSA6IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkVXNlcktleWNoYWluKFxuICAgICAgICBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgICAgICB1c2VyUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgICB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICAgIGVuY3J5cHRpb25TZXNzaW9uXG4gICAgICApO1xuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCYWNrdXBLZXljaGFpbihcbiAgICAgICAgYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgICAgYmFja3VwUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgICBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgZW5jcnlwdGlvblNlc3Npb25cbiAgICAgICk7XG4gICAgICBjb25zdCBiaXRnb0tleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQml0Z29LZXljaGFpbihiaXRnb0NvbW1vbktleWNoYWluKTtcblxuICAgICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB1c2VyS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgICBiYWNrdXBLZXljaGFpblByb21pc2UsXG4gICAgICAgIGJpdGdvS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgXSk7XG4gICAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbmNyeXB0aW9uU2Vzc2lvbj8uZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vICNyZWdpb24ga2V5Y2hhaW4gdXRpbHNcbiAgYXN5bmMgY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICBwYXJ0aWNpcGFudEluZGV4OiBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw/OiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZT86IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyxcbiAgICBlbmNyeXB0aW9uU2Vzc2lvbj86IHtcbiAgICAgIGVuY3J5cHQocGxhaW50ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgICBkZWNyeXB0KGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICAgIGRlc3Ryb3koKTogdm9pZDtcbiAgICB9XG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBsZXQgc291cmNlOiBzdHJpbmc7XG4gICAgbGV0IGVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCByZWR1Y2VkRW5jcnlwdGVkUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHByaXZhdGVNYXRlcmlhbEJhc2U2NDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAocGFydGljaXBhbnRJbmRleCkge1xuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLlVTRVI6XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQOlxuICAgICAgICBzb3VyY2UgPSBwYXJ0aWNpcGFudEluZGV4ID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyAndXNlcicgOiAnYmFja3VwJztcbiAgICAgICAgYXNzZXJ0KHByaXZhdGVNYXRlcmlhbCwgYFByaXZhdGUgbWF0ZXJpYWwgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBhc3NlcnQocmVkdWNlZFByaXZhdGVNYXRlcmlhbCwgYFJlZHVjZWQgcHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChwYXNzcGhyYXNlLCBgUGFzc3BocmFzZSBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIHByaXZhdGVNYXRlcmlhbEJhc2U2NCA9IHByaXZhdGVNYXRlcmlhbC50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIGlmIChlbmNyeXB0aW9uU2Vzc2lvbikge1xuICAgICAgICAgIGVuY3J5cHRlZFBydiA9IGF3YWl0IGVuY3J5cHRpb25TZXNzaW9uLmVuY3J5cHQocHJpdmF0ZU1hdGVyaWFsQmFzZTY0KTtcbiAgICAgICAgICByZWR1Y2VkRW5jcnlwdGVkUHJ2ID0gYXdhaXQgZW5jcnlwdGlvblNlc3Npb24uZW5jcnlwdChcbiAgICAgICAgICAgIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwpKSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsQmFzZTY0LFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRW5jcnlwdHMgdGhlIENCT1ItZW5jb2RlZCBSZWR1Y2VkS2V5U2hhcmUgKHdoaWNoIGNvbnRhaW5zIHRoZSBwYXJ0eSdzIHByaXZhdGVcbiAgICAgICAgICAvLyBzY2FsYXIgc19pKSB3aXRoIHRoZSB3YWxsZXQgcGFzc3BocmFzZS4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgYXMgcmVkdWNlZEVuY3J5cHRlZFBydlxuICAgICAgICAgIC8vIG9uIHRoZSBrZXkgY2FyZCBRUiBjb2RlIGFuZCByZXByZXNlbnRzIGEgc2Vjb25kIGNvcHkgb2YgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICAgICAgICAvLyBiZXlvbmQgdGhlIHNlcnZlci1zdG9yZWQgZW5jcnlwdGVkUHJ2LlxuICAgICAgICAgIHJlZHVjZWRFbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICAgICAgICAvLyBCdWZmZXIudG9TdHJpbmcoJ2Jhc2U2NCcpIGNhbiBub3QgYmUgdXNlZCBoZXJlIGFzIGl0IGRvZXMgbm90IHdvcmsgb24gdGhlIGJyb3dzZXIuXG4gICAgICAgICAgICAvLyBUaGUgYnJvd3NlciBkZWFscyB3aXRoIGEgQnVmZmVyIGFzIFVpbnQ4QXJyYXksIHRoZXJlZm9yZSBpbiB0aGUgYnJvd3NlciAudG9TdHJpbmcoJ2Jhc2U2NCcpIGp1c3QgY3JlYXRlcyBhIGNvbW1hIHNlcGVyYXRlZCBzdHJpbmcgb2YgdGhlIGFycmF5IHZhbHVlcy5cbiAgICAgICAgICAgIGlucHV0OiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsKSkpKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPOlxuICAgICAgICBzb3VyY2UgPSAnYml0Z28nO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudCBpbmRleCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudEtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2UsXG4gICAgICBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBlbmNyeXB0ZWRQcnYsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBpc01QQ3YyOiB0cnVlLFxuICAgIH07XG5cbiAgICBpZiAod2ViYXV0aG5JbmZvICYmIHBhcnRpY2lwYW50SW5kZXggPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBwcml2YXRlTWF0ZXJpYWxCYXNlNjQpIHtcbiAgICAgIHJlY2lwaWVudEtleWNoYWluUGFyYW1zLndlYmF1dGhuRGV2aWNlcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG90cERldmljZUlkOiB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQsXG4gICAgICAgICAgcHJmU2FsdDogd2ViYXV0aG5JbmZvLnByZlNhbHQsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsQmFzZTY0LFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHdlYmF1dGhuSW5mby5wYXNzcGhyYXNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiB7IC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKSksIHJlZHVjZWRFbmNyeXB0ZWRQcnY6IHJlZHVjZWRFbmNyeXB0ZWRQcnYgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVzZXIgb3IgQmFja3VwIE1QQ3YxIFNpZ25pbmdNYXRlcmlhbCB0byBSZXRyb2ZpdERhdGEgbmVlZGVkIGJ5IE1QQ3YyIERLRy5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRlZEtleXNoYXJlIC0gTVBDdjEgZGVjcnlwdGVkIHNpZ25pbmcgbWF0ZXJpYWwgZm9yIHVzZXIgb3IgYmFja3VwIGFzIGEganNvbi5zdHJpbmdpZnkgc3RyaW5nIGFuZCBiaXRnbydzIEJpZyBTaS5cbiAgICogQHBhcmFtIHBhcnR5SWQgLSBUaGUgcGFydHkgSUQgb2YgdGhlIE1QQ3YxIGtleXNoYXJlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0cm9maXQgZGF0YSBuZWVkZWQgdG8gc3RhcnQgYW4gTVBDdjIgREtHIHNlc3Npb24uXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzdGF0aWMgZ2V0S2V5RGF0YUZvclJldHJvZml0KFxuICAgIGRlY3J5cHRlZEtleXNoYXJlOiBzdHJpbmcsXG4gICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgfCBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgKTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSB7XG4gICAgY29uc3QgbXBjID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgeGlMaXN0ID0gW1xuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgxKSwgMzIpKSxcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMiksIDMyKSksXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDMpLCAzMikpLFxuICAgIF07XG4gICAgcmV0dXJuIEVjZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleSh7XG4gICAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IGRlY3J5cHRlZEtleXNoYXJlLFxuICAgICAgbXBjdjFQYXJ0eUluZGV4OiBwYXJ0eUlkID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyAxIDogMixcbiAgICAgIHhpTGlzdCxcbiAgICAgIG1wYyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB1c2VyIGFuZCBiYWNrdXAgTVBDdjEgU2lnbmluZ01hdGVyaWFsIHRvIFJldHJvZml0RGF0YSBuZWVkZWQgYnkgTVBDdjIgREtHLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gTVBDdjEgZGVjcnlwdGVkIHNpZ25pbmcgbWF0ZXJpYWwgZm9yIHVzZXIgYW5kIGJhY2t1cCBhcyBhIGpzb24uc3RyaW5naWZ5IHN0cmluZyBhbmQgYml0Z28ncyBCaWcgU2kuXG4gICAqIEByZXR1cm5zIHt7IG1wY3YyVXNlcktleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhOyBtcGN2MkJha2N1cEtleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhIH19IC0gdGhlIHJldHJvZml0IGRhdGEgbmVlZGVkIHRvIHN0YXJ0IGFuIE1QQ3YyIERLRyBzZXNzaW9uLlxuICAgKi9cbiAgZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXlzKHBhcmFtczogeyBtcGN2MVVzZXJLZXlTaGFyZTogc3RyaW5nOyBtcGN2MUJhY2t1cEtleVNoYXJlOiBzdHJpbmcgfSk6IHtcbiAgICBtcGN2MlVzZXJLZXlTaGFyZTogRGtsc1R5cGVzLlJldHJvZml0RGF0YTtcbiAgICBtcGN2MkJhY2t1cEtleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhO1xuICB9IHtcbiAgICBjb25zdCBtcGMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCB4aUxpc3QgPSBbXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDEpLCAzMikpLFxuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgyKSwgMzIpKSxcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMyksIDMyKSksXG4gICAgXTtcbiAgICByZXR1cm4ge1xuICAgICAgbXBjdjJVc2VyS2V5U2hhcmU6IEVjZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleSh7XG4gICAgICAgIG1wY3YxUGFydHlLZXlTaGFyZTogcGFyYW1zLm1wY3YxVXNlcktleVNoYXJlLFxuICAgICAgICBtcGN2MVBhcnR5SW5kZXg6IDEsXG4gICAgICAgIHhpTGlzdCxcbiAgICAgICAgbXBjLFxuICAgICAgfSksXG4gICAgICBtcGN2MkJhY2t1cEtleVNoYXJlOiBFY2RzYU1QQ3YyVXRpbHMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoe1xuICAgICAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHBhcmFtcy5tcGN2MUJhY2t1cEtleVNoYXJlLFxuICAgICAgICBtcGN2MVBhcnR5SW5kZXg6IDIsXG4gICAgICAgIHhpTGlzdCxcbiAgICAgICAgbXBjLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV0cm9maXQgZGF0YSBmcm9tIE1QQ3YxIGtleSBzaGFyZS5cbiAgICogQHBhcmFtIG1wY3YxUGFydHlLZXlTaGFyZVxuICAgKiBAcGFyYW0gbXBjdjFQYXJ0eUluZGV4XG4gICAqIEBwYXJhbSB4aUxpc3RcbiAgICogQHBhcmFtIG1wY1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc3RhdGljIGdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KHtcbiAgICBtcGN2MVBhcnR5S2V5U2hhcmUsXG4gICAgbXBjdjFQYXJ0eUluZGV4LFxuICAgIHhpTGlzdCxcbiAgICBtcGMsXG4gIH06IHtcbiAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHN0cmluZztcbiAgICBtcGN2MVBhcnR5SW5kZXg6IG51bWJlcjtcbiAgICB4aUxpc3Q6IG51bWJlcltdW107XG4gICAgbXBjOiBFY2RzYTtcbiAgfSk6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEge1xuICAgIGNvbnN0IHNpZ25pbmdNYXRlcmlhbDogRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKG1wY3YxUGFydHlLZXlTaGFyZSk7XG4gICAgbGV0IGtleUNvbWJpbmVkOiBLZXlDb21iaW5lZCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKG1wY3YxUGFydHlJbmRleCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIGJhY2t1cCBOU2hhcmUuJyk7XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsICdCaXRHbyBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgdXNlciBOU2hhcmUuJyk7XG4gICAgICAgIGtleUNvbWJpbmVkID0gbXBjLmtleUNvbWJpbmUoc2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW1xuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICAgICAgICBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIGJhY2t1cCBOU2hhcmUuJyk7XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsICdCaXRHbyBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgdXNlciBOU2hhcmUuJyk7XG4gICAgICAgIGtleUNvbWJpbmVkID0gbXBjLmtleUNvbWJpbmUoc2lnbmluZ01hdGVyaWFsLnBTaGFyZSwgW3NpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLCBzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmVdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIGJhY2t1cCBOU2hhcmUuJyk7XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLCAnQmFja3VwIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSB1c2VyIE5TaGFyZS4nKTtcbiAgICAgICAga2V5Q29tYmluZWQgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSxcbiAgICAgICAgXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB4U2hhcmU6IGtleUNvbWJpbmVkLnhTaGFyZSxcbiAgICAgIHhpTGlzdDogeGlMaXN0LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZFVzZXJLZXljaGFpbihcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nLFxuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8sXG4gICAgZW5jcnlwdGlvblNlc3Npb24/OiB7XG4gICAgICBlbmNyeXB0KHBsYWludGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgICAgZGVjcnlwdChjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgICBkZXN0cm95KCk6IHZvaWQ7XG4gICAgfVxuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3ZWJhdXRobkluZm8sXG4gICAgICBlbmNyeXB0aW9uU2Vzc2lvblxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEJhY2t1cEtleWNoYWluKFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgZW5jcnlwdGlvblNlc3Npb24/OiB7XG4gICAgICBlbmNyeXB0KHBsYWludGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgICAgZGVjcnlwdChjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgICBkZXN0cm95KCk6IHZvaWQ7XG4gICAgfVxuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGVuY3J5cHRpb25TZXNzaW9uXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckFuZEJhY2t1cFNlc3Npb24obTogbnVtYmVyLCBuOiBudW1iZXIsIHJldHJvZml0PzogRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkKSB7XG4gICAgaWYgKHJldHJvZml0KSB7XG4gICAgICBjb25zdCByZXRyb2ZpdERhdGEgPSB0aGlzLmdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5cyh7XG4gICAgICAgIG1wY3YxVXNlcktleVNoYXJlOiByZXRyb2ZpdC5kZWNyeXB0ZWRVc2VyS2V5LFxuICAgICAgICBtcGN2MUJhY2t1cEtleVNoYXJlOiByZXRyb2ZpdC5kZWNyeXB0ZWRCYWNrdXBLZXksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdXNlclNlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2cobiwgbSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCB1bmRlZmluZWQsIHJldHJvZml0RGF0YS5tcGN2MlVzZXJLZXlTaGFyZSk7XG4gICAgICBjb25zdCBiYWNrdXBTZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKG4sIG0sIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCB1bmRlZmluZWQsIHJldHJvZml0RGF0YS5tcGN2MkJhY2t1cEtleVNoYXJlKTtcblxuICAgICAgcmV0dXJuIHsgdXNlclNlc3Npb24sIGJhY2t1cFNlc3Npb24gfTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyU2Vzc2lvbiA9IG5ldyBEa2xzRGtnLkRrZyhuLCBtLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGNvbnN0IGJhY2t1cFNlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2cobiwgbSwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApO1xuXG4gICAgcmV0dXJuIHsgdXNlclNlc3Npb24sIGJhY2t1cFNlc3Npb24gfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkQml0Z29LZXljaGFpbihjb21tb25LZXljaGFpbjogc3RyaW5nKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oTVBDdjJQYXJ0aWVzRW51bS5CSVRHTywgY29tbW9uS2V5Y2hhaW4pO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgdXNlckdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IERrbHNUeXBlcy5BdXRoRW5jTWVzc2FnZXMgJiB7IHdhbGxldElkPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDFCeVNlbmRlcihcbiAgICAgIEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksXG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgcGF5bG9hZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMihcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMkJ5U2VuZGVyKEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksIHNlc3Npb25JZCwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMyhcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kM0J5U2VuZGVyKEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksIHNlc3Npb25JZCwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgIHNlbmRlckZuOiBFY2RzYU1QQ3YyS2V5R2VuU2VuZEZuPE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+LFxuICAgIHVzZXJHcGdQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzICYgeyB3YWxsZXRJZD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyR3BnUHVibGljS2V5KSwgJ1VzZXIgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwR3BnUHVibGljS2V5KSwgJ0JhY2t1cCBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gcGF5bG9hZC5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUik/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KHVzZXJNc2cxLCAnVXNlciBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJhY2t1cE1zZzEgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApPy5wYXlsb2FkO1xuICAgIGFzc2VydChiYWNrdXBNc2cxLCAnQmFja3VwIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG5cbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10sIHtcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICB1c2VyTXNnMTogeyBmcm9tOiAwLCAuLi51c2VyTXNnMSB9LFxuICAgICAgYmFja3VwTXNnMTogeyBmcm9tOiAxLCAuLi5iYWNrdXBNc2cxIH0sXG4gICAgICB3YWxsZXRJZDogcGF5bG9hZC53YWxsZXRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4sXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2Vzc2lvbklkKSwgJ1Nlc3Npb24gSUQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMiA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlck1zZzIsICdVc2VyIHRvIEJpdGdvIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KHVzZXJNc2cyLmNvbW1pdG1lbnQsICdVc2VyIHRvIEJpdGdvIGNvbW1pdG1lbnQgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyTXNnMi5jb21taXRtZW50KSwgJ1VzZXIgdG8gQml0Z28gY29tbWl0bWVudCBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IGJhY2t1cE1zZzIgPSBwYXlsb2FkLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwTXNnMiwgJ0JhY2t1cCB0byBCaXRnbyBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChiYWNrdXBNc2cyLmNvbW1pdG1lbnQsICdCYWNrdXAgdG8gQml0Z28gY29tbWl0bWVudCBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cE1zZzIuY29tbWl0bWVudCksICdCYWNrdXAgdG8gQml0Z28gY29tbWl0bWVudCBpcyByZXF1aXJlZCcpO1xuXG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMiddLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMjoge1xuICAgICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAgIHRvOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgICBzaWduYXR1cmU6IHVzZXJNc2cyLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiB1c2VyTXNnMi5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgdXNlckNvbW1pdG1lbnQyOiB1c2VyTXNnMi5jb21taXRtZW50LFxuICAgICAgYmFja3VwTXNnMjoge1xuICAgICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgICAgdG86IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIHNpZ25hdHVyZTogYmFja3VwTXNnMi5wYXlsb2FkLnNpZ25hdHVyZSxcbiAgICAgICAgZW5jcnlwdGVkTWVzc2FnZTogYmFja3VwTXNnMi5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgYmFja3VwQ29tbWl0bWVudDI6IGJhY2t1cE1zZzIuY29tbWl0bWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQzQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZT4sXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2Vzc2lvbklkKSwgJ1Nlc3Npb24gSUQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzMsICdVc2VyIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApPy5wYXlsb2FkO1xuICAgIGFzc2VydChiYWNrdXBNc2czLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgdXNlck1zZzQgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzQsICdVc2VyIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnNCA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzQsICdCYWNrdXAgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjMnXSwge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdXNlck1zZzM6IHsgZnJvbTogMCwgdG86IDIsIC4uLnVzZXJNc2czIH0sXG4gICAgICBiYWNrdXBNc2czOiB7IGZyb206IDEsIHRvOiAyLCAuLi5iYWNrdXBNc2czIH0sXG4gICAgICB1c2VyTXNnNDogeyBmcm9tOiAwLCAuLi51c2VyTXNnNCB9LFxuICAgICAgYmFja3VwTXNnNDogeyBmcm9tOiAxLCAuLi5iYWNrdXBNc2c0IH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBzaWduIHR4IHJlcXVlc3RcblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5tcGN2MlBhcnR5SWQgLSBwYXJ0eSBpZCBmb3IgdGhlIHNpZ25lciBpbnZvbHZlZCBpbiB0aGlzIG1wY3YyIHJlcXVlc3QgKGVpdGhlciAwIGZvciB1c2VyIG9yIDEgZm9yIGJhY2t1cClcbiAgICogQHBhcmFtIHBhcmFtcy5yZWNpcGllbnRTb3VyY2UgLSBvcHRpb25hbDsgdXNlIFRzc1R4UmVjaXBpZW50U291cmNlLkV4cGxpY2l0IHdpdGggYSBub24tZW1wdHkgdHhQYXJhbXMucmVjaXBpZW50c1xuICAgKiAgIGxpc3Qgd2hlbiB5b3Ugd2FudCBUeXBlU2NyaXB0IHRvIGVuZm9yY2UgcGFzc2luZyByZWNpcGllbnQgZGV0YWlscyBhdCBjb21waWxlIHRpbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3QocGFyYW1zOiBUc3NTaWduVHhSZXF1ZXN0UGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdCBvYmplY3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHBhcmFtczogVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLm1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2IHwgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocGFyYW1zLnBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiBwYXJhbXMudHhSZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCBwYXJhbXMudHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpXG4gICAgICAgIDogcGFyYW1zLnR4UmVxdWVzdDtcbiAgICBsZXQgdHhPck1lc3NhZ2VUb1NpZ247XG4gICAgbGV0IGRlcml2YXRpb25QYXRoO1xuICAgIGxldCBidWZmZXJDb250ZW50O1xuICAgIGxldCBzZXJpYWxpemVkVHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyh0cnVlLCBwYXJhbXMucmVxSWQsIHR4UmVxdWVzdC5lbnRlcnByaXNlSWQpO1xuXG4gICAgaWYgKCFiaXRnb0dwZ1B1YktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuXG4gICAgICBpZiAoXG4gICAgICAgICdyZWNpcGllbnRTb3VyY2UnIGluIHBhcmFtcyAmJlxuICAgICAgICBwYXJhbXMucmVjaXBpZW50U291cmNlID09PSBUc3NUeFJlY2lwaWVudFNvdXJjZS5FeHBsaWNpdCAmJlxuICAgICAgICAhcGFyYW1zLnR4UGFyYW1zPy5yZWNpcGllbnRzPy5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ3JlY2lwaWVudFNvdXJjZSBcImV4cGxpY2l0XCIgcmVxdWlyZXMgdHhQYXJhbXMucmVjaXBpZW50cyB3aXRoIGF0IGxlYXN0IG9uZSByZWNpcGllbnQuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgSUNQIGFuZCBBdmFsYW5jaGUgYXRvbWljIHRyYW5zYWN0aW9ucywgc2lnbmFibGVIZXggaXMgYSBkaWdlc3QgKG5vdFxuICAgICAgLy8gYSBwYXJzZWFibGUgdHJhbnNhY3Rpb24pLiAgUGFzcyBzZXJpYWxpemVkVHhIZXggc28gdmVyaWZ5VHJhbnNhY3Rpb24gY2FuXG4gICAgICAvLyBwYXJzZSB0aGUgZnVsbCB0cmFuc2FjdGlvbiBieXRlcy5cbiAgICAgIC8vIC0gSUNQOiBzaWduYWJsZUhleCBpcyBhIGhhc2g7IHNlcmlhbGl6ZWRUeEhleCBpcyB0aGUgQ0JPUi1lbmNvZGVkIHR4LlxuICAgICAgLy8gLSBBdmFsYW5jaGUgYXRvbWljIChGTFJQL0ZMUiBjcm9zcy1jaGFpbik6IHNpZ25hYmxlSGV4IGlzIFNIQS0yNTYodHhCb2R5KTtcbiAgICAgIC8vICAgc2VyaWFsaXplZFR4SGV4IGlzIHRoZSBQVk0vRVZNIGF0b21pYyB0eCAoY29kZWMgcHJlZml4IDB4MDAwMCkuXG4gICAgICAvLyBGb3IgYWxsIG90aGVyIGNvaW5zLCBzaWduYWJsZUhleCBJUyB0aGUgdW5zaWduZWQgdHJhbnNhY3Rpb24gKGUuZy4gUkxQIGJ5dGVzKS5cbiAgICAgIGNvbnN0IGlzSWNwID0gdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mYW1pbHkgPT09ICdpY3AnO1xuICAgICAgY29uc3QgaXNBdmFsYW5jaGVBdG9taWMgPSB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCAmJiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleC5zdGFydHNXaXRoKCcwMDAwJyk7XG4gICAgICBpZiAoaXNJY3AgfHwgaXNBdmFsYW5jaGVBdG9taWMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXgsIHR4SW5mbzogdW5zaWduZWRUeC5zaWduYWJsZUhleCB9LFxuICAgICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudHhQYXJhbXMgfHwgeyByZWNpcGllbnRzOiBbXSB9LFxuICAgICAgICAgIHdhbGxldDogdGhpcy53YWxsZXQsXG4gICAgICAgICAgd2FsbGV0VHlwZTogdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlKCksXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogdW5zaWduZWRUeC5zaWduYWJsZUhleCB9LFxuICAgICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudHhQYXJhbXMgfHwgeyByZWNpcGllbnRzOiBbXSB9LFxuICAgICAgICAgIHdhbGxldDogdGhpcy53YWxsZXQsXG4gICAgICAgICAgd2FsbGV0VHlwZTogdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdHhPck1lc3NhZ2VUb1NpZ24gPSB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4O1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB1bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgICAgc2VyaWFsaXplZFR4SGV4ID0gdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXg7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHR4UmVxdWVzdC5tZXNzYWdlcyFbMF0ubWVzc2FnZUVuY29kZWQ7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHR4UmVxdWVzdC5tZXNzYWdlcyFbMF0uZGVyaXZhdGlvblBhdGggfHwgJ20vMCc7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlcXVlc3QgdHlwZScpO1xuICAgIH1cblxuICAgIC8vIEZvciBBdmFsYW5jaGUgYXRvbWljIHRyYW5zYWN0aW9ucyAoY3Jvc3MtY2hhaW4gZXhwb3J0L2ltcG9ydCBiZXR3ZWVuXG4gICAgLy8gQy1jaGFpbiBhbmQgUC1jaGFpbiksIHNpZ25hYmxlSGV4IGlzIGFscmVhZHkgU0hBLTI1Nih0eEJvZHkpIOKAlCBhIDMyLWJ5dGVcbiAgICAvLyBwcmUtaGFzaGVkIGRpZ2VzdC4gIFVzZSBpdCBkaXJlY3RseSBhcyB0aGUgREtMUyBtZXNzYWdlIGhhc2ggaW5zdGVhZCBvZlxuICAgIC8vIGFwcGx5aW5nIHRoZSBjb2luJ3MgaGFzaCBmdW5jdGlvbiAoa2VjY2FrMjU2IGZvciBFVk0gY29pbnMpLlxuICAgIC8vIFNhbWUgbG9naWMgYXMgZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoIChleHRlcm5hbCBzaWduZXIgcGF0aCkuXG4gICAgbGV0IGhhc2hCdWZmZXI6IEJ1ZmZlcjtcbiAgICBpZiAoc2VyaWFsaXplZFR4SGV4ICYmIHNlcmlhbGl6ZWRUeEhleC5zdGFydHNXaXRoKCcwMDAwJykpIHtcbiAgICAgIGhhc2hCdWZmZXIgPSBidWZmZXJDb250ZW50O1xuICAgICAgYXNzZXJ0KGhhc2hCdWZmZXIubGVuZ3RoID09PSAzMiwgYEF2YWxhbmNoZSBwcmUtaGFzaGVkIHNpZ25hYmxlSGV4IG11c3QgYmUgMzIgYnl0ZXMsIGdvdCAke2hhc2hCdWZmZXIubGVuZ3RofWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaGFzaDogSGFzaDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhc2ggPSB0aGlzLmJhc2VDb2luLmdldEhhc2hGdW5jdGlvbigpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGhhc2ggPSBjcmVhdGVLZWNjYWtIYXNoKCdrZWNjYWsyNTYnKSBhcyBIYXNoO1xuICAgICAgfVxuICAgICAgaGFzaEJ1ZmZlciA9IGhhc2gudXBkYXRlKGJ1ZmZlckNvbnRlbnQpLmRpZ2VzdCgpO1xuICAgIH1cbiAgICBjb25zdCBvdGhlclNpZ25lciA9IG5ldyBEa2xzRHNnLkRzZyhcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIHBhcmFtcy5tcGN2MlBhcnR5SWQgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy5tcGN2MlBhcnR5SWQgOiAwLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICBoYXNoQnVmZmVyXG4gICAgKTtcbiAgICBjb25zdCB1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSA9IGF3YWl0IG90aGVyU2lnbmVyLmluaXQoKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUoXG4gICAgICB1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcblxuICAgIGxldCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3QgT2JqZWN0Jyk7XG5cbiAgICBsZXQgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyOiBhbnk7XG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyID0gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDIgPSBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMhWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICB9XG4gICAgLy8gVE9ETzogVXNlIGNvZGVjIGZvciBwYXJzaW5nXG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lID0gSlNPTi5wYXJzZShcbiAgICAgIGJpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMltiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDIubGVuZ3RoIC0gMV0uc2hhcmVcbiAgICApIGFzIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQ7XG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZS50eXBlICE9PSAncm91bmQxT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxQW5kMiA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRPbmUoXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcblxuICAgIC8qKiBSb3VuZCAyICoqL1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZE1lc3NhZ2VzID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMoc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDFBbmQyKTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQyID0gb3RoZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMyA9IG90aGVyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IGRlc2VyaWFsaXplZE1lc3NhZ2VzLnAycE1lc3NhZ2VzLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmRUd28gPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvKFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMixcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcbiAgICBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZFR3b10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3QgT2JqZWN0Jyk7XG5cbiAgICBjb25zdCB0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXMgPVxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4XG4gICAgICAgID8gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzXG4gICAgICAgIDogbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgLy8gVE9ETzogVXNlIGNvZGVjIGZvciBwYXJzaW5nXG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvID0gSlNPTi5wYXJzZShcbiAgICAgIHR4UmVxdWVzdFNpZ25hdHVyZVNoYXJlc1t0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXMubGVuZ3RoIC0gMV0uc2hhcmVcbiAgICApIGFzIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQ7XG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzID0gYXdhaXQgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZFR3byhcbiAgICAgIHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ1B1YktleSxcbiAgICAgIHBhcmFtcy5tcGN2MlBhcnR5SWRcbiAgICApO1xuXG4gICAgLyoqIFJvdW5kIDMgKiovXG4gICAgY29uc3QgZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQ0ID0gb3RoZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZShcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDQsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXksXG4gICAgICBwYXJhbXMubXBjdjJQYXJ0eUlkXG4gICAgKTtcbiAgICAvLyBTdWJtaXQgZm9yIGZpbmFsIHNpZ25hdHVyZSBzaGFyZSBjb21iaW5lXG4gICAgYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUaHJlZV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICByZXR1cm4gc2VuZFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0eFJlcXVlc3Qud2FsbGV0SWQsIHR4UmVxdWVzdC50eFJlcXVlc3RJZCwgcmVxdWVzdFR5cGUsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBmb3JtYXR0aW5nIHV0aWxzXG4gIGZvcm1hdEJpdGdvQnJvYWRjYXN0TWVzc2FnZShicm9hZGNhc3RNZXNzYWdlOiBNUEN2MkJyb2FkY2FzdE1lc3NhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbTogYnJvYWRjYXN0TWVzc2FnZS5mcm9tLFxuICAgICAgcGF5bG9hZDogeyBtZXNzYWdlOiBicm9hZGNhc3RNZXNzYWdlLm1lc3NhZ2UsIHNpZ25hdHVyZTogYnJvYWRjYXN0TWVzc2FnZS5zaWduYXR1cmUgfSxcbiAgICB9O1xuICB9XG5cbiAgZm9ybWF0UDJQTWVzc2FnZShwMnBNZXNzYWdlOiBNUEN2MlAyUE1lc3NhZ2UsIGNvbW1pdG1lbnQ/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF5bG9hZDogeyBlbmNyeXB0ZWRNZXNzYWdlOiBwMnBNZXNzYWdlLmVuY3J5cHRlZE1lc3NhZ2UsIHNpZ25hdHVyZTogcDJwTWVzc2FnZS5zaWduYXR1cmUgfSxcbiAgICAgIGZyb206IHAycE1lc3NhZ2UuZnJvbSxcbiAgICAgIHRvOiBwMnBNZXNzYWdlLnRvLFxuICAgICAgY29tbWl0bWVudCxcbiAgICB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHByaXZhdGUgdXRpbHNcbiAgLyoqXG4gICAqIEdldCB0aGUgaGFzaCBzdHJpbmcgYW5kIGRlcml2YXRpb24gcGF0aCBmcm9tIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge1R4UmVxdWVzdH0gdHhSZXF1ZXN0IC0gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSB7UmVxdWVzdFR5cGV9IHJlcXVlc3RUeXBlIC0gdGhlIHJlcXVlc3QgdHlwZVxuICAgKiBAcmV0dXJucyB7eyBoYXNoQnVmZmVyOiBCdWZmZXI7IGRlcml2YXRpb25QYXRoOiBzdHJpbmcgfX0gLSB0aGUgaGFzaCBzdHJpbmcgYW5kIGRlcml2YXRpb24gcGF0aFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGgoXG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3QsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlID0gUmVxdWVzdFR5cGUudHhcbiAgKTogeyBoYXNoQnVmZmVyOiBCdWZmZXI7IGRlcml2YXRpb25QYXRoOiBzdHJpbmcgfSB7XG4gICAgbGV0IHR4VG9TaWduOiBzdHJpbmc7XG4gICAgbGV0IGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG4gICAgbGV0IHNlcmlhbGl6ZWRUeEhleDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGNvbnN0IHNpZ25hYmxlVHggPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgodHhSZXF1ZXN0LCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgdHhUb1NpZ24gPSBzaWduYWJsZVR4LnNpZ25hYmxlSGV4O1xuICAgICAgZGVyaXZhdGlvblBhdGggPSBzaWduYWJsZVR4LmRlcml2YXRpb25QYXRoO1xuICAgICAgc2VyaWFsaXplZFR4SGV4ID0gc2lnbmFibGVUeC5zZXJpYWxpemVkVHhIZXg7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgLy8gVE9ETyhXUC0yMTc2KTogQWRkIHN1cHBvcnQgZm9yIG1lc3NhZ2Ugc2lnbmluZ1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNUEN2MiBtZXNzYWdlIHNpZ25pbmcgbm90IHN1cHBvcnRlZCB5ZXQuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXF1ZXN0IHR5cGUsIGdvdDogJyArIHJlcXVlc3RUeXBlKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgQXZhbGFuY2hlIGF0b21pYyB0cmFuc2FjdGlvbnMgKGNyb3NzLWNoYWluIGV4cG9ydC9pbXBvcnQgYmV0d2VlblxuICAgIC8vIEMtY2hhaW4gYW5kIFAtY2hhaW4pLCBzaWduYWJsZUhleCBpcyBhbHJlYWR5IFNIQS0yNTYodHhCb2R5KSDigJQgYSAzMi1ieXRlXG4gICAgLy8gcHJlLWhhc2hlZCBkaWdlc3QuICBVc2UgaXQgZGlyZWN0bHkgYXMgdGhlIERLTFMgbWVzc2FnZSBoYXNoIGluc3RlYWQgb2ZcbiAgICAvLyBhcHBseWluZyB0aGUgY29pbidzIGhhc2ggZnVuY3Rpb24gKGtlY2NhazI1NiBmb3IgRVZNIGNvaW5zKS5cbiAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIFdQL0hTTSBCaXRHby1wYXJ0eSBiZWhhdmlvdXIgKE1QQ3YyU2lnbmVyLmlzUHJlSGFzaGVkKVxuICAgIC8vIHNvIGJvdGggREtMUyBwYXJ0aWVzIGFncmVlIG9uIHRoZSBzYW1lIG1lc3NhZ2UgaGFzaC5cbiAgICAvLyBEZXRlY3Rpb246IEF2YWxhbmNoZSBjb2RlYyB0eXBlIElEIHByZWZpeCBpcyAweDAwMDA7IHN0YW5kYXJkIEVWTSBSTFBcbiAgICAvLyBzdGFydHMgd2l0aCAweGY4eHgsIHNvIHRoZXJlIGlzIG5vIGNvbGxpc2lvbi5cbiAgICBpZiAoc2VyaWFsaXplZFR4SGV4ICYmIHNlcmlhbGl6ZWRUeEhleC5zdGFydHNXaXRoKCcwMDAwJykpIHtcbiAgICAgIGNvbnN0IGhhc2hCdWZmZXIgPSBCdWZmZXIuZnJvbSh0eFRvU2lnbiwgJ2hleCcpO1xuICAgICAgYXNzZXJ0KGhhc2hCdWZmZXIubGVuZ3RoID09PSAzMiwgYEF2YWxhbmNoZSBwcmUtaGFzaGVkIHNpZ25hYmxlSGV4IG11c3QgYmUgMzIgYnl0ZXMsIGdvdCAke2hhc2hCdWZmZXIubGVuZ3RofWApO1xuICAgICAgcmV0dXJuIHsgaGFzaEJ1ZmZlciwgZGVyaXZhdGlvblBhdGggfTtcbiAgICB9XG5cbiAgICBsZXQgaGFzaDogSGFzaDtcbiAgICB0cnkge1xuICAgICAgaGFzaCA9IHRoaXMuYmFzZUNvaW4uZ2V0SGFzaEZ1bmN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYXNoID0gY3JlYXRlS2VjY2FrSGFzaCgna2VjY2FrMjU2JykgYXMgSGFzaDtcbiAgICB9XG4gICAgY29uc3QgaGFzaEJ1ZmZlciA9IGhhc2gudXBkYXRlKEJ1ZmZlci5mcm9tKHR4VG9TaWduLCAnaGV4JykpLmRpZ2VzdCgpO1xuXG4gICAgcmV0dXJuIHsgaGFzaEJ1ZmZlciwgZGVyaXZhdGlvblBhdGggfTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIGV4dGVybmFsIHNpZ25lclxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgc2lnbkVjZHNhTVBDdjJUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgIHBhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgICBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcjogQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdG9yOiBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0b3I6IEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUgPSBSZXF1ZXN0VHlwZS50eFxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhSZXF1ZXN0LCByZXFJZCB9ID0gcGFyYW1zO1xuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuXG4gICAgLy8gVE9ETyhXUC0yMTc2KTogQWRkIHN1cHBvcnQgZm9yIG1lc3NhZ2Ugc2lnbmluZ1xuICAgIGFzc2VydChcbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCxcbiAgICAgICdPbmx5IHRyYW5zYWN0aW9uIHNpZ25pbmcgaXMgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIsIGdvdDogJyArIHJlcXVlc3RUeXBlXG4gICAgKTtcblxuICAgIGlmICh0eXBlb2YgdHhSZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0LCByZXFJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gdHhSZXF1ZXN0O1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKFxuICAgICAgdHJ1ZSxcbiAgICAgIHBhcmFtcy5yZXFJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLmVudGVycHJpc2VJZFxuICAgICk7XG5cbiAgICBpZiAoIWJpdGdvUHVibGljR3BnS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gR1BHIGtleSBmb3IgTVBDdjInKTtcbiAgICB9XG5cbiAgICAvLyByb3VuZCAxXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9ID1cbiAgICAgIGF3YWl0IGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdG9yKHsgdHhSZXF1ZXN0OiB0eFJlcXVlc3RSZXNvbHZlZCB9KTtcbiAgICBjb25zdCByb3VuZDFUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQxXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICAvLyByb3VuZCAyXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9ID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiByb3VuZDFUeFJlcXVlc3QsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvdW5kMlR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDJdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zICYmIHJvdW5kMlR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0uc2lnbmF0dXJlU2hhcmVzLFxuICAgICAgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCdcbiAgICApO1xuXG4gICAgLy8gcm91bmQgM1xuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDMgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogcm91bmQyVHhSZXF1ZXN0LFxuICAgICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICB9KTtcbiAgICBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQzXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICByZXR1cm4gc2VuZFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCwgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCByZXFJZCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQxU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFBydj86IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQxOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICB1c2VyR3BnUHViS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHsgcHJ2LCB3YWxsZXRQYXNzcGhyYXNlLCB0eFJlcXVlc3QsIGVuY3J5cHRlZFBydiB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHsgaGFzaEJ1ZmZlciwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoKHR4UmVxdWVzdCk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtoYXNoQnVmZmVyLnRvU3RyaW5nKCdoZXgnKX06JHtkZXJpdmF0aW9uUGF0aH1gO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocHJ2LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG5cbiAgICBjb25zdCB1c2VyU2lnbmVyID0gbmV3IERrbHNEc2cuRHNnKHVzZXJLZXlTaGFyZSwgMCwgZGVyaXZhdGlvblBhdGgsIGhhc2hCdWZmZXIpO1xuICAgIGNvbnN0IHVzZXJTaWduZXJCcm9hZGNhc3RNc2cxID0gYXdhaXQgdXNlclNpZ25lci5pbml0KCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDEgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lKHVzZXJTaWduZXJCcm9hZGNhc3RNc2cxLCB1c2VyR3BnS2V5KTtcbiAgICBjb25zdCBzZXNzaW9uRGF0YSA9IHVzZXJTaWduZXIuZ2V0U2Vzc2lvbigpO1xuICAgIGNvbnN0IHVzZXJHcGdQdWJLZXkgPSB1c2VyR3BnS2V5LnB1YmxpY0tleTtcblxuICAgIGNvbnN0IHVzZVYyID0gZW5jcnlwdGVkUHJ2ICE9PSB1bmRlZmluZWQgJiYgaXNWMkVudmVsb3BlKGVuY3J5cHRlZFBydik7XG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbih3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgc2Vzc2lvbkRhdGEsXG4gICAgICAgICAgYCR7RWNkc2FNUEN2MlV0aWxzLkRLTFMyM19TSUdOSU5HX1JPVU5EMV9TVEFURX06JHthZGF0YX1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICAgIGAke0VjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgIGlucHV0OiBzZXNzaW9uRGF0YSxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YCxcbiAgICB9KTtcbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgaW5wdXQ6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YCxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQyU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQyOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgYml0Z29QdWJsaWNHcGdLZXksIHR4UmVxdWVzdCB9ID1cbiAgICAgIHBhcmFtcztcblxuICAgIGNvbnN0IHsgaGFzaEJ1ZmZlciwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoKHR4UmVxdWVzdCk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtoYXNoQnVmZmVyLnRvU3RyaW5nKCdoZXgnKX06JHtkZXJpdmF0aW9uUGF0aH1gO1xuXG4gICAgY29uc3QgdXNlVjIgPSBpc1YyRW52ZWxvcGUoZW5jcnlwdGVkUm91bmQxU2Vzc2lvbik7XG5cbiAgICBjb25zdCB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnUHJ2S2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGEsXG4gICAgICBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfVVNFUl9HUEdfS0VZXG4gICAgKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5OiBwZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPiA9IHtcbiAgICAgIHByaXZhdGVLZXk6IHVzZXJHcGdQcnZLZXkuYXJtb3IoKSxcbiAgICAgIHB1YmxpY0tleTogdXNlckdwZ1BydktleS50b1B1YmxpYygpLmFybW9yKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnM/LlswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZVNoYXJlcywgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAxIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IEpTT04ucGFyc2UoXG4gICAgICBzaWduYXR1cmVTaGFyZXNbc2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUudHlwZSAhPT0gJ3JvdW5kMU91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMSA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRPbmUoXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuXG4gICAgbGV0IHJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBpZiAodXNlVjIpIHtcbiAgICAgIHJvdW5kMVNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHRBc3luYyh7IGlucHV0OiBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm91bmQxU2Vzc2lvbiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQxX1NUQVRFKTtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCBkZXJpdmF0aW9uUGF0aCwgaGFzaEJ1ZmZlcik7XG4gICAgYXdhaXQgdXNlclNpZ25lci5zZXRTZXNzaW9uKHJvdW5kMVNlc3Npb24pO1xuXG4gICAgY29uc3QgZGVzZXJpYWxpemVkTWVzc2FnZXMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMiA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMyA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDIgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvKFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMixcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuICAgIGNvbnN0IHNlc3Npb25EYXRhID0gdXNlclNpZ25lci5nZXRTZXNzaW9uKCk7XG5cbiAgICBpZiAodXNlVjIpIHtcbiAgICAgIGNvbnN0IGVuY1Nlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IGVuY1Nlc3Npb24uZW5jcnlwdChcbiAgICAgICAgICBzZXNzaW9uRGF0YSxcbiAgICAgICAgICBgJHtFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFfToke2FkYXRhfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGVuY1Nlc3Npb24uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICBpbnB1dDogc2Vzc2lvbkRhdGEsXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFfToke2FkYXRhfWAsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmF0dXJlU2hhcmVSb3VuZDIsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQzU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQzOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgfT4ge1xuICAgIGNvbnN0IHsgcHJ2LCB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBiaXRnb1B1YmxpY0dwZ0tleSwgdHhSZXF1ZXN0IH0gPVxuICAgICAgcGFyYW1zO1xuXG4gICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgJiYgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgY29uc3QgeyBoYXNoQnVmZmVyLCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGgodHhSZXF1ZXN0KTtcbiAgICBjb25zdCBhZGF0YSA9IGAke2hhc2hCdWZmZXIudG9TdHJpbmcoJ2hleCcpfToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB1c2VWMiA9IGlzVjJFbnZlbG9wZShlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uKTtcblxuICAgIGNvbnN0IHsgYml0Z29HcGdLZXksIHVzZXJHcGdQcnZLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5cyhcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YSxcbiAgICAgIEVjZHNhTVBDdjJVdGlscy5ES0xTMjNfU0lHTklOR19VU0VSX0dQR19LRVlcbiAgICApO1xuICAgIGNvbnN0IHVzZXJHcGdLZXk6IHBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+ID0ge1xuICAgICAgcHJpdmF0ZUtleTogdXNlckdwZ1BydktleS5hcm1vcigpLFxuICAgICAgcHVibGljS2V5OiB1c2VyR3BnUHJ2S2V5LnRvUHVibGljKCkuYXJtb3IoKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucz8uWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDIgdHhSZXF1ZXN0Jyk7XG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvID0gSlNPTi5wYXJzZShcbiAgICAgIHNpZ25hdHVyZVNoYXJlc1tzaWduYXR1cmVTaGFyZXMubGVuZ3RoIC0gMV0uc2hhcmVcbiAgICApIGFzIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQ7XG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzID0gYXdhaXQgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZFR3byhcbiAgICAgIHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ0tleVxuICAgICk7XG5cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzLnAycE1lc3NhZ2VzLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgbGV0IHJvdW5kMlNlc3Npb246IHN0cmluZztcbiAgICBpZiAodXNlVjIpIHtcbiAgICAgIHJvdW5kMlNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHRBc3luYyh7IGlucHV0OiBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm91bmQyU2Vzc2lvbiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBFY2RzYU1QQ3YyVXRpbHMuREtMUzIzX1NJR05JTkdfUk9VTkQyX1NUQVRFKTtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCBkZXJpdmF0aW9uUGF0aCwgaGFzaEJ1ZmZlcik7XG4gICAgYXdhaXQgdXNlclNpZ25lci5zZXRTZXNzaW9uKHJvdW5kMlNlc3Npb24pO1xuXG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kNCA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQzID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDQsIHVzZXJHcGdLZXksIGJpdGdvR3BnS2V5KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxufVxuXG4vKipcbiAqIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uIGluIGZhdm9yIG9mIGlzR0cxOFNpZ25pbmdNYXRlcmlhbEFzeW5jIG9uY2UgdjIgZW5jcnlwdGlvbiBpcyBkZWZhdWx0XG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGtleSBzaGFyZSwgd2hlbiBkZWNyeXB0ZWQsIGNvbnRhaW5zIHZhbGlkIEdHMTggc2lnbmluZyBtYXRlcmlhbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5U2hhcmUgLSBUaGUgZW5jcnlwdGVkIGtleSBzaGFyZSBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGtleSBzaGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGRlY3J5cHRlZCBkYXRhIGNvbnRhaW5zIHZhbGlkIHNpZ25pbmcgbWF0ZXJpYWwsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHRzE4U2lnbmluZ01hdGVyaWFsKGtleVNoYXJlOiBzdHJpbmcsIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBjb25zdCBwcnYgPSBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwga2V5U2hhcmUpO1xuICB0cnkge1xuICAgIGNvbnN0IHNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICByZXR1cm4gKFxuICAgICAgc2lnbmluZ01hdGVyaWFsLnBTaGFyZSAmJlxuICAgICAgc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlICYmXG4gICAgICAoc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUgfHwgc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSlcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEFzeW5jIHZlcnNpb24gb2Yge0BsaW5rIGlzR0cxOFNpZ25pbmdNYXRlcmlhbH0gd2l0aCB2MS92MiBhdXRvLWRldGVjdCBkZWNyeXB0IHZpYSBgYml0Z28uZGVjcnlwdEFzeW5jYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzR0cxOFNpZ25pbmdNYXRlcmlhbEFzeW5jKFxuICBrZXlTaGFyZTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGJpdGdvOiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBydiA9IGF3YWl0IGJpdGdvLmRlY3J5cHRBc3luYyh7IHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDoga2V5U2hhcmUgfSk7XG4gICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwcnYpO1xuICAgIHJldHVybiAoXG4gICAgICBzaWduaW5nTWF0ZXJpYWwucFNoYXJlICYmXG4gICAgICBzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUgJiZcbiAgICAgIChzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSB8fCBzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlKVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBNUEMgdjIgcmVjb3Zlcnkga2V5IHNoYXJlcyBmcm9tIHRoZSBwcm92aWRlZCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqIEBwYXJhbSBlbmNyeXB0ZWRVc2VyS2V5IGVuY3J5cHRlZCBnZzE4IG9yIE1QQ3YyIHVzZXIga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkQmFja3VwS2V5IGVuY3J5cHRlZCBnZzE4IG9yIE1QQ3YyIGJhY2t1cCBrZXlcbiAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIHBhc3N3b3JkIGZvciB1c2VyIGFuZCBiYWNrdXAga2V5XG4gKiBAcGFyYW0gYml0Z28gQml0R28gaW5zdGFuY2UgZm9yIHYxL3YyIGF1dG8tZGV0ZWN0IGRlY3J5cHRcbiAqIEByZXR1cm5zIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNcGNWMlJlY292ZXJ5S2V5U2hhcmVzKFxuICBlbmNyeXB0ZWRVc2VyS2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZEJhY2t1cEtleTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nLFxuICBiaXRnbz86IEJpdEdvQmFzZVxuKTogUHJvbWlzZTx7XG4gIHVzZXJLZXlTaGFyZTogQnVmZmVyO1xuICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyO1xuICBjb21tb25LZXlDaGFpbjogc3RyaW5nO1xufT4ge1xuICBpZiAoYml0Z28pIHtcbiAgICBpZiAoYXdhaXQgaXNHRzE4U2lnbmluZ01hdGVyaWFsQXN5bmMoZW5jcnlwdGVkVXNlcktleSwgd2FsbGV0UGFzc3BocmFzZSwgYml0Z28pKSB7XG4gICAgICByZXR1cm4gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21HRzE4KGVuY3J5cHRlZFVzZXJLZXksIGVuY3J5cHRlZEJhY2t1cEtleSwgd2FsbGV0UGFzc3BocmFzZSwgYml0Z28pO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21SZWR1Y2VkS2V5KGVuY3J5cHRlZFVzZXJLZXksIGVuY3J5cHRlZEJhY2t1cEtleSwgd2FsbGV0UGFzc3BocmFzZSwgYml0Z28pO1xuICB9XG4gIGlmIChpc0dHMThTaWduaW5nTWF0ZXJpYWwoZW5jcnlwdGVkVXNlcktleSwgd2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICByZXR1cm4gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21HRzE4KGVuY3J5cHRlZFVzZXJLZXksIGVuY3J5cHRlZEJhY2t1cEtleSwgd2FsbGV0UGFzc3BocmFzZSk7XG4gIH1cbiAgcmV0dXJuIGdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tUmVkdWNlZEtleShlbmNyeXB0ZWRVc2VyS2V5LCBlbmNyeXB0ZWRCYWNrdXBLZXksIHdhbGxldFBhc3NwaHJhc2UpO1xufVxuXG4vKipcbiAqIFNpZ25zIGEgbWVzc2FnZSBoYXNoIHVzaW5nIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBtZXNzYWdlSGFzaFxuICogQHBhcmFtIHtCdWZmZXJ9IHVzZXJLZXlTaGFyZVxuICogQHBhcmFtIHtCdWZmZXJ9IGJhY2t1cEtleVNoYXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbW9uS2V5Q2hhaW5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHsgcmVjaWQ6IG51bWJlciwgcjogc3RyaW5nLCBzOiBzdHJpbmcsIHk6IHN0cmluZyB9Pn1cbiAqXG4gKiBAYXN5bmNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25SZWNvdmVyeU1wY1YyKFxuICBtZXNzYWdlSGFzaDogQnVmZmVyLFxuICB1c2VyS2V5U2hhcmU6IEJ1ZmZlcixcbiAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlcixcbiAgY29tbW9uS2V5Q2hhaW46IHN0cmluZ1xuKTogUHJvbWlzZTx7XG4gIHJlY2lkOiBudW1iZXI7XG4gIHI6IHN0cmluZztcbiAgczogc3RyaW5nO1xuICB5OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IHVzZXJEc2cgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCAnbS8wJywgbWVzc2FnZUhhc2gpO1xuICBjb25zdCBiYWNrdXBEc2cgPSBuZXcgRGtsc0RzZy5Ec2coYmFja3VwS2V5U2hhcmUsIDEsICdtLzAnLCBtZXNzYWdlSGFzaCk7XG5cbiAgY29uc3Qgc2lnbmF0dXJlU3RyaW5nID0gRGtsc1V0aWxzLnZlcmlmeUFuZENvbnZlcnREa2xzU2lnbmF0dXJlKFxuICAgIG1lc3NhZ2VIYXNoLFxuICAgIChhd2FpdCBEa2xzVXRpbHMuZXhlY3V0ZVRpbGxSb3VuZCg1LCB1c2VyRHNnLCBiYWNrdXBEc2cpKSBhcyBEa2xzVHlwZXMuRGVzZXJpYWxpemVkRGtsc1NpZ25hdHVyZSxcbiAgICBjb21tb25LZXlDaGFpbixcbiAgICAnbS8wJyxcbiAgICB1bmRlZmluZWQsXG4gICAgZmFsc2VcbiAgKTtcbiAgY29uc3Qgc2lnUGFydHMgPSBzaWduYXR1cmVTdHJpbmcuc3BsaXQoJzonKTtcblxuICByZXR1cm4ge1xuICAgIHJlY2lkOiBwYXJzZUludChzaWdQYXJ0c1swXSwgMTApLFxuICAgIHI6IHNpZ1BhcnRzWzFdLFxuICAgIHM6IHNpZ1BhcnRzWzJdLFxuICAgIHk6IHNpZ1BhcnRzWzNdLFxuICB9O1xufVxuXG4vLyAjcmVnaW9uIHByaXZhdGUgdXRpbHNcblxuLyoqXG4gKiBHZXQgdGhlIE1QQyB2MiByZWNvdmVyeSBrZXkgc2hhcmVzIGZyb20gdGhlIHByb3ZpZGVkIHVzZXIgYW5kIGJhY2t1cCBrZXkgc2hhcmVzLlxuICogQHBhcmFtIGVuY3J5cHRlZEdHMThVc2VyS2V5IGVuY3J5cHRlZCBnZzE4IHVzZXIga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkR0cxOEJhY2t1cEtleSBlbmNyeXB0ZWQgZ2cxOCBiYWNrdXAga2V5XG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBwYXNzd29yZCBmb3IgdXNlciBhbmQgYmFja3VwIGtleVxuICogQHJldHVybnMgTVBDIHYyIHJlY292ZXJ5IGtleSBzaGFyZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21HRzE4KFxuICBlbmNyeXB0ZWRHRzE4VXNlcktleTogc3RyaW5nLFxuICBlbmNyeXB0ZWRHRzE4QmFja3VwS2V5OiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gIGJpdGdvPzogQml0R29CYXNlXG4pOiBQcm9taXNlPHtcbiAgdXNlcktleVNoYXJlOiBCdWZmZXI7XG4gIGJhY2t1cEtleVNoYXJlOiBCdWZmZXI7XG4gIGNvbW1vbktleUNoYWluOiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IFt1c2VyS2V5Q29tYmluZWQsIGJhY2t1cEtleUNvbWJpbmVkXSA9IGF3YWl0IGdldEtleUNvbWJpbmVkRnJvbVRzc0tleVNoYXJlcyhcbiAgICBlbmNyeXB0ZWRHRzE4VXNlcktleSxcbiAgICBlbmNyeXB0ZWRHRzE4QmFja3VwS2V5LFxuICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgYml0Z29cbiAgKTtcbiAgY29uc3QgcmV0cm9maXREYXRhQTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSA9IHtcbiAgICB4U2hhcmU6IHVzZXJLZXlDb21iaW5lZC54U2hhcmUsXG4gIH07XG4gIGNvbnN0IHJldHJvZml0RGF0YUI6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgPSB7XG4gICAgeFNoYXJlOiBiYWNrdXBLZXlDb21iaW5lZC54U2hhcmUsXG4gIH07XG4gIGNvbnN0IFt1c2VyLCBiYWNrdXBdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlMm9mMktleVNoYXJlcyhyZXRyb2ZpdERhdGFBLCByZXRyb2ZpdERhdGFCKTtcblxuICBjb25zdCB1c2VyS2V5U2hhcmUgPSB1c2VyLmdldEtleVNoYXJlKCk7XG4gIGNvbnN0IGJhY2t1cEtleVNoYXJlID0gYmFja3VwLmdldEtleVNoYXJlKCk7XG4gIHJldHVybiB7XG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGNvbW1vbktleUNoYWluOiBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYmFja3VwS2V5U2hhcmUpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgTVBDIHYyIHJlY292ZXJ5IGtleSBzaGFyZXMgZnJvbSB0aGUgcHJvdmlkZWQgdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY3J5cHRlZE1QQ3YyVXNlcktleVxuICogQHBhcmFtIHtzdHJpbmd9IGVuY3J5cHRlZE1QQ3YyQmFja3VwS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gW3dhbGxldFBhc3NwaHJhc2VdIC0gVGhlIHBhc3NwaHJhc2UgdXNlZCB0byBkZWNyeXB0IHRoZSBrZXkgc2hhcmVzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlOiBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW46IHN0cmluZyB9Pn1cbiAqXG4gKiBAYXN5bmNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21SZWR1Y2VkS2V5KFxuICBlbmNyeXB0ZWRNUEN2MlVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkTVBDdjJCYWNrdXBLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZyxcbiAgYml0Z28/OiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8e1xuICB1c2VyS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlcjtcbiAgY29tbW9uS2V5Q2hhaW46IHN0cmluZztcbn0+IHtcbiAgbGV0IHVzZXJDb21wcmVzc2VkUHJ2OiBCdWZmZXI7XG4gIGxldCBiYWtjdXBDb21wcmVzc2VkUHJ2OiBCdWZmZXI7XG4gIGlmIChiaXRnbykge1xuICAgIHVzZXJDb21wcmVzc2VkUHJ2ID0gQnVmZmVyLmZyb20oXG4gICAgICBhd2FpdCBiaXRnby5kZWNyeXB0QXN5bmMoeyBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGVuY3J5cHRlZE1QQ3YyVXNlcktleSB9KSxcbiAgICAgICdiYXNlNjQnXG4gICAgKTtcbiAgICBiYWtjdXBDb21wcmVzc2VkUHJ2ID0gQnVmZmVyLmZyb20oXG4gICAgICBhd2FpdCBiaXRnby5kZWNyeXB0QXN5bmMoeyBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGVuY3J5cHRlZE1QQ3YyQmFja3VwS2V5IH0pLFxuICAgICAgJ2Jhc2U2NCdcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHVzZXJDb21wcmVzc2VkUHJ2ID0gQnVmZmVyLmZyb20oc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZE1QQ3YyVXNlcktleSksICdiYXNlNjQnKTtcbiAgICBiYWtjdXBDb21wcmVzc2VkUHJ2ID0gQnVmZmVyLmZyb20oc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZE1QQ3YyQmFja3VwS2V5KSwgJ2Jhc2U2NCcpO1xuICB9XG5cbiAgY29uc3QgdXNlclBydkpTT046IERrbHNUeXBlcy5SZWR1Y2VkS2V5U2hhcmUgPSBEa2xzVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZSh1c2VyQ29tcHJlc3NlZFBydik7XG4gIGNvbnN0IGJhY2t1cFBydkpTT046IERrbHNUeXBlcy5SZWR1Y2VkS2V5U2hhcmUgPSBEa2xzVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZShiYWtjdXBDb21wcmVzc2VkUHJ2KTtcbiAgY29uc3QgdXNlcktleVJldHJvZml0OiBEa2xzVHlwZXMuUmV0cm9maXREYXRhID0ge1xuICAgIHhTaGFyZToge1xuICAgICAgeDogQnVmZmVyLmZyb20odXNlclBydkpTT04ucHJ2KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBCdWZmZXIuZnJvbSh1c2VyUHJ2SlNPTi5wdWIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNoYWluY29kZTogQnVmZmVyLmZyb20odXNlclBydkpTT04ucm9vdENoYWluQ29kZSkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH0sXG4gICAgeGlMaXN0OiB1c2VyUHJ2SlNPTi54TGlzdC5zbGljZSgwLCAyKSxcbiAgfTtcbiAgY29uc3QgYmFja3VwS2V5UmV0cm9maXQ6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgPSB7XG4gICAgeFNoYXJlOiB7XG4gICAgICB4OiBCdWZmZXIuZnJvbShiYWNrdXBQcnZKU09OLnBydikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeTogQnVmZmVyLmZyb20oYmFja3VwUHJ2SlNPTi5wdWIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNoYWluY29kZTogQnVmZmVyLmZyb20oYmFja3VwUHJ2SlNPTi5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4JyksXG4gICAgfSxcbiAgICB4aUxpc3Q6IGJhY2t1cFBydkpTT04ueExpc3Quc2xpY2UoMCwgMiksXG4gIH07XG4gIGNvbnN0IFt1c2VyLCBiYWNrdXBdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlMm9mMktleVNoYXJlcyh1c2VyS2V5UmV0cm9maXQsIGJhY2t1cEtleVJldHJvZml0KTtcbiAgY29uc3QgdXNlcktleVNoYXJlID0gdXNlci5nZXRLZXlTaGFyZSgpO1xuICBjb25zdCBiYWNrdXBLZXlTaGFyZSA9IGJhY2t1cC5nZXRLZXlTaGFyZSgpO1xuICBjb25zdCBjb21tb25LZXlDaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyS2V5U2hhcmUpO1xuICByZXR1cm4geyB1c2VyS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlLCBjb21tb25LZXlDaGFpbiB9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbWJpbmVkIGtleSBmb3IgR0cxOFxuICogQHBhcmFtIGVuY3J5cHRlZEdHMThVc2VyS2V5IGVuY3J5cHRlZCBHRzE4IHVzZXIga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkR0cxOEJhY2t1cEtleSBlbmNyeXB0ZWQgR0cxOCBiYWNrdXAga2V5XG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSB3YWxsZXQgcGFzc3BocmFzZVxuICogQHJldHVybnMga2V5IHNoYXJlc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRLZXlDb21iaW5lZEZyb21Uc3NLZXlTaGFyZXMoXG4gIGVuY3J5cHRlZEdHMThVc2VyS2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZEdHMThCYWNrdXBLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZyxcbiAgYml0Z28/OiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8W0VDRFNBTWV0aG9kVHlwZXMuS2V5Q29tYmluZWQsIEVDRFNBTWV0aG9kVHlwZXMuS2V5Q29tYmluZWRdPiB7XG4gIGxldCBiYWNrdXBQcnY7XG4gIGxldCB1c2VyUHJ2O1xuICB0cnkge1xuICAgIGlmIChiaXRnbykge1xuICAgICAgYmFja3VwUHJ2ID0gYXdhaXQgYml0Z28uZGVjcnlwdEFzeW5jKHsgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBlbmNyeXB0ZWRHRzE4QmFja3VwS2V5IH0pO1xuICAgICAgdXNlclBydiA9IGF3YWl0IGJpdGdvLmRlY3J5cHRBc3luYyh7IHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogZW5jcnlwdGVkR0cxOFVzZXJLZXkgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhY2t1cFBydiA9IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRHRzE4QmFja3VwS2V5KTtcbiAgICAgIHVzZXJQcnYgPSBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkR0cxOFVzZXJLZXkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7ZS5tZXNzYWdlfWApO1xuICB9XG5cbiAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UodXNlclBydikgYXMgRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWw7XG4gIGNvbnN0IGJhY2t1cFNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UoYmFja3VwUHJ2KSBhcyBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbDtcblxuICBpZiAoIXVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5IC0gbWlzc2luZyBiYWNrdXBOU2hhcmUnKTtcbiAgfVxuXG4gIGlmICghYmFja3VwU2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFja3VwIGtleSAtIG1pc3NpbmcgdXNlck5TaGFyZScpO1xuICB9XG5cbiAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG5cbiAgY29uc3QgdXNlcktleUNvbWJpbmVkID0gTVBDLmtleUNvbWJpbmUodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsIFtcbiAgICB1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLFxuICBdKTtcbiAgY29uc3QgYmFja3VwS2V5Q29tYmluZWQgPSBNUEMua2V5Q29tYmluZShiYWNrdXBTaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUsXG4gICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICBdKTtcbiAgaWYgKFxuICAgIHVzZXJLZXlDb21iaW5lZC54U2hhcmUueSAhPT0gYmFja3VwS2V5Q29tYmluZWQueFNoYXJlLnkgfHxcbiAgICB1c2VyS2V5Q29tYmluZWQueFNoYXJlLmNoYWluY29kZSAhPT0gYmFja3VwS2V5Q29tYmluZWQueFNoYXJlLmNoYWluY29kZVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gIH1cbiAgcmV0dXJuIFt1c2VyS2V5Q29tYmluZWQsIGJhY2t1cEtleUNvbWJpbmVkXTtcbn1cblxuLy8gI2VuZHJlZ2lvblxuIl19