utxo-lib 1.1.3 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. package/dist/src/address.d.ts.map +1 -1
  2. package/dist/src/address.js +1 -11
  3. package/dist/src/addressFormat.d.ts +1 -1
  4. package/dist/src/addressFormat.d.ts.map +1 -1
  5. package/dist/src/addressFormat.js +1 -1
  6. package/dist/src/bitgo/Musig2.d.ts +17 -115
  7. package/dist/src/bitgo/Musig2.d.ts.map +1 -1
  8. package/dist/src/bitgo/Musig2.js +101 -283
  9. package/dist/src/bitgo/UtxoPsbt.d.ts +49 -173
  10. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
  11. package/dist/src/bitgo/UtxoPsbt.js +112 -634
  12. package/dist/src/bitgo/bbc/DashPsbt.d.ts +12 -0
  13. package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +1 -0
  14. package/dist/src/bitgo/bbc/DashPsbt.js +27 -0
  15. package/dist/src/bitgo/bbc/DashTransaction.d.ts +39 -0
  16. package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +1 -0
  17. package/dist/src/bitgo/bbc/DashTransaction.js +109 -0
  18. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +14 -0
  19. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +1 -0
  20. package/dist/src/bitgo/bbc/DashTransactionBuilder.js +28 -0
  21. package/dist/src/bitgo/bbc/index.d.ts +4 -0
  22. package/dist/src/bitgo/bbc/index.d.ts.map +1 -0
  23. package/dist/src/bitgo/{litecoin → bbc}/index.js +4 -4
  24. package/dist/src/bitgo/bitcoincash/address.js +2 -2
  25. package/dist/src/bitgo/index.d.ts +0 -10
  26. package/dist/src/bitgo/index.d.ts.map +1 -1
  27. package/dist/src/bitgo/index.js +2 -5
  28. package/dist/src/bitgo/outputScripts.d.ts +1 -3
  29. package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
  30. package/dist/src/bitgo/outputScripts.js +10 -18
  31. package/dist/src/bitgo/parseInput.d.ts +20 -49
  32. package/dist/src/bitgo/parseInput.d.ts.map +1 -1
  33. package/dist/src/bitgo/parseInput.js +24 -108
  34. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -1
  35. package/dist/src/bitgo/psbt/fromHalfSigned.js +6 -9
  36. package/dist/src/bitgo/signature.d.ts +3 -3
  37. package/dist/src/bitgo/signature.d.ts.map +1 -1
  38. package/dist/src/bitgo/signature.js +16 -48
  39. package/dist/src/bitgo/transaction.d.ts +3 -18
  40. package/dist/src/bitgo/transaction.d.ts.map +1 -1
  41. package/dist/src/bitgo/transaction.js +15 -28
  42. package/dist/src/bitgo/types.d.ts +0 -2
  43. package/dist/src/bitgo/types.d.ts.map +1 -1
  44. package/dist/src/bitgo/types.js +1 -1
  45. package/dist/src/bitgo/wallet/Psbt.d.ts +12 -90
  46. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
  47. package/dist/src/bitgo/wallet/Psbt.js +71 -221
  48. package/dist/src/bitgo/wallet/Unspent.d.ts +0 -28
  49. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
  50. package/dist/src/bitgo/wallet/Unspent.js +68 -173
  51. package/dist/src/bitgo/wallet/chains.d.ts +2 -2
  52. package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
  53. package/dist/src/bitgo/wallet/chains.js +1 -1
  54. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
  55. package/dist/src/bitgo/zcash/ZcashPsbt.js +3 -4
  56. package/dist/src/networks.d.ts +2 -1
  57. package/dist/src/networks.d.ts.map +1 -1
  58. package/dist/src/networks.js +29 -22
  59. package/dist/src/noble_ecc.d.ts.map +1 -1
  60. package/dist/src/noble_ecc.js +2 -6
  61. package/dist/src/payments/p2tr.d.ts.map +1 -1
  62. package/dist/src/payments/p2tr.js +9 -15
  63. package/dist/src/taproot.d.ts +0 -16
  64. package/dist/src/taproot.d.ts.map +1 -1
  65. package/dist/src/taproot.js +2 -44
  66. package/dist/src/testutil/index.d.ts +0 -2
  67. package/dist/src/testutil/index.d.ts.map +1 -1
  68. package/dist/src/testutil/index.js +1 -3
  69. package/dist/src/testutil/mock.d.ts +1 -1
  70. package/dist/src/testutil/mock.d.ts.map +1 -1
  71. package/dist/src/testutil/mock.js +4 -12
  72. package/package.json +3 -5
  73. package/dist/src/bitgo/PsbtUtil.d.ts +0 -54
  74. package/dist/src/bitgo/PsbtUtil.d.ts.map +0 -1
  75. package/dist/src/bitgo/PsbtUtil.js +0 -79
  76. package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts +0 -10
  77. package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts.map +0 -1
  78. package/dist/src/bitgo/litecoin/LitecoinPsbt.js +0 -17
  79. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +0 -16
  80. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +0 -1
  81. package/dist/src/bitgo/litecoin/LitecoinTransaction.js +0 -46
  82. package/dist/src/bitgo/litecoin/LitecoinTransactionBuilder.d.ts +0 -10
  83. package/dist/src/bitgo/litecoin/LitecoinTransactionBuilder.d.ts.map +0 -1
  84. package/dist/src/bitgo/litecoin/LitecoinTransactionBuilder.js +0 -15
  85. package/dist/src/bitgo/litecoin/index.d.ts +0 -4
  86. package/dist/src/bitgo/litecoin/index.d.ts.map +0 -1
  87. package/dist/src/testutil/psbt.d.ts +0 -71
  88. package/dist/src/testutil/psbt.d.ts.map +0 -1
  89. package/dist/src/testutil/psbt.js +0 -147
  90. package/dist/src/testutil/transaction.d.ts +0 -61
  91. package/dist/src/testutil/transaction.d.ts.map +0 -1
  92. package/dist/src/testutil/transaction.js +0 -107
@@ -1,112 +1,55 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.musig2DeterministicSign = exports.createMusig2DeterministicNonce = exports.getSigHashTypeFromSigs = exports.assertPsbtMusig2Nonces = exports.assertPsbtMusig2Participants = exports.parsePsbtMusig2PartialSigs = exports.parsePsbtMusig2Nonces = exports.parsePsbtMusig2Participants = exports.createMusig2SigningSession = exports.musig2AggregateSigs = exports.musig2PartialSigVerify = exports.musig2PartialSign = exports.createTapTweak = exports.createAggregateNonce = exports.createTapOutputKey = exports.createTapInternalKey = exports.decodePsbtMusig2PartialSig = exports.decodePsbtMusig2Nonce = exports.decodePsbtMusig2Participants = exports.encodePsbtMusig2PartialSig = exports.encodePsbtMusig2PubNonce = exports.encodePsbtMusig2Participants = exports.Musig2NonceStore = void 0;
3
+ exports.setMusig2Nonces = exports.createTapOutputKey = exports.createTapInternalKey = exports.decodePsbtMusig2ParticipantsKeyValData = exports.encodePsbtMusig2PubNonceKeyValData = exports.encodePsbtMusig2ParticipantsKeyValData = void 0;
4
+ const UtxoPsbt_1 = require("./UtxoPsbt");
4
5
  const outputScripts_1 = require("./outputScripts");
5
6
  const noble_ecc_1 = require("../noble_ecc");
6
7
  const taproot_1 = require("../taproot");
7
- const index_1 = require("../index");
8
- const PsbtUtil_1 = require("./PsbtUtil");
9
- /**
10
- * Because musig uses reference-equal buffers to cache nonces, we wrap it here to allow using
11
- * nonces that are byte-equal but not reference-equal.
12
- */
13
- class Musig2NonceStore {
14
- constructor() {
15
- this.nonces = [];
16
- }
17
- /**
18
- * Get original Buffer instance for nonce (which may be a copy).
19
- * @return byte-equal buffer that is reference-equal to what was stored earlier in createMusig2Nonce
20
- */
21
- getRef(nonce) {
22
- for (const b of this.nonces) {
23
- if (Buffer.from(b).equals(nonce)) {
24
- return b;
25
- }
26
- }
27
- throw new Error(`unknown nonce`);
28
- }
29
- /**
30
- * Creates musig2 nonce and stores buffer reference.
31
- * tapInternalkey, tapMerkleRoot, tapBip32Derivation for rootWalletKey are required per p2trMusig2 key path input.
32
- * Also participant keys are required from psbt proprietary key values.
33
- * Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
34
- * @param privateKey - signer private key
35
- * @param publicKey - signer xy public key
36
- * @param xOnlyPublicKey - tweaked aggregated key (tapOutputKey)
37
- * @param sessionId Additional entropy. If provided it must either be a counter unique to this secret key,
38
- * (converted to an array of 32 bytes), or 32 uniformly random bytes.
39
- */
40
- createMusig2Nonce(privateKey, publicKey, xOnlyPublicKey, txHash, sessionId) {
41
- if (txHash.length != 32) {
42
- throw new Error(`Invalid txHash size ${txHash}`);
43
- }
44
- const buf = noble_ecc_1.musig.nonceGen({ secretKey: privateKey, publicKey, xOnlyPublicKey, msg: txHash, sessionId });
45
- this.nonces.push(buf);
46
- return buf;
47
- }
48
- }
49
- exports.Musig2NonceStore = Musig2NonceStore;
8
+ const utils_1 = require("bip174/src/lib/utils");
50
9
  /**
51
10
  * Psbt proprietary key val util function for participants pub keys. SubType is 0x01
52
11
  * Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
53
12
  * @return x-only tapOutputKey||tapInternalKey as sub keydata, plain sigining participant keys as valuedata
54
13
  */
55
- function encodePsbtMusig2Participants(participants) {
56
- const keydata = [participants.tapOutputKey, participants.tapInternalKey].map((pubkey) => outputScripts_1.checkXOnlyPublicKey(pubkey));
57
- const value = participants.participantPubKeys.map((pubkey) => outputScripts_1.checkPlainPublicKey(pubkey));
14
+ function encodePsbtMusig2ParticipantsKeyValData(participantsKeyValData) {
15
+ const keydata = [participantsKeyValData.tapOutputKey, participantsKeyValData.tapInternalKey].map((pubkey) => outputScripts_1.checkXOnlyPublicKey(pubkey));
16
+ const value = participantsKeyValData.participantPubKeys.map((pubkey) => outputScripts_1.checkPlainPublicKey(pubkey));
58
17
  const key = {
59
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
60
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
18
+ identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
19
+ subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
61
20
  keydata: Buffer.concat(keydata),
62
21
  };
63
22
  return { key, value: Buffer.concat(value) };
64
23
  }
65
- exports.encodePsbtMusig2Participants = encodePsbtMusig2Participants;
24
+ exports.encodePsbtMusig2ParticipantsKeyValData = encodePsbtMusig2ParticipantsKeyValData;
66
25
  /**
67
26
  * Psbt proprietary key val util function for pub nonce. SubType is 0x02
68
27
  * Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
69
28
  * @return plain-participantPubKey||x-only-tapOutputKey as sub keydata, 66 bytes of 2 pub nonces as valuedata
70
29
  */
71
- function encodePsbtMusig2PubNonce(nonce) {
72
- if (nonce.pubNonce.length !== 66) {
73
- throw new Error(`Invalid pubNonces length ${nonce.pubNonce.length}`);
74
- }
75
- const keydata = Buffer.concat([
76
- outputScripts_1.checkPlainPublicKey(nonce.participantPubKey),
77
- outputScripts_1.checkXOnlyPublicKey(nonce.tapOutputKey),
78
- ]);
79
- const key = {
80
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
81
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
82
- keydata,
83
- };
84
- return { key, value: nonce.pubNonce };
85
- }
86
- exports.encodePsbtMusig2PubNonce = encodePsbtMusig2PubNonce;
87
- function encodePsbtMusig2PartialSig(partialSig) {
88
- if (partialSig.partialSig.length !== 32 && partialSig.partialSig.length !== 33) {
89
- throw new Error(`Invalid partialSig length ${partialSig.partialSig.length}`);
30
+ function encodePsbtMusig2PubNonceKeyValData(noncesKeyValueData) {
31
+ if (noncesKeyValueData.pubNonces.length !== 66) {
32
+ throw new Error(`Invalid pubNonces length ${noncesKeyValueData.pubNonces.length}`);
90
33
  }
91
34
  const keydata = Buffer.concat([
92
- outputScripts_1.checkPlainPublicKey(partialSig.participantPubKey),
93
- outputScripts_1.checkXOnlyPublicKey(partialSig.tapOutputKey),
35
+ outputScripts_1.checkPlainPublicKey(noncesKeyValueData.participantPubKey),
36
+ outputScripts_1.checkXOnlyPublicKey(noncesKeyValueData.tapOutputKey),
94
37
  ]);
95
38
  const key = {
96
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
97
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
39
+ identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
40
+ subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
98
41
  keydata,
99
42
  };
100
- return { key, value: partialSig.partialSig };
43
+ return { key, value: noncesKeyValueData.pubNonces };
101
44
  }
102
- exports.encodePsbtMusig2PartialSig = encodePsbtMusig2PartialSig;
45
+ exports.encodePsbtMusig2PubNonceKeyValData = encodePsbtMusig2PubNonceKeyValData;
103
46
  /**
104
47
  * Decodes proprietary key value data for participant pub keys
105
48
  * @param kv
106
49
  */
107
- function decodePsbtMusig2Participants(kv) {
108
- if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER ||
109
- kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS) {
50
+ function decodePsbtMusig2ParticipantsKeyValData(kv) {
51
+ if (kv.key.identifier !== UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER ||
52
+ kv.key.subtype !== UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS) {
110
53
  throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for participants pub keys`);
111
54
  }
112
55
  const key = kv.key.keydata;
@@ -123,235 +66,110 @@ function decodePsbtMusig2Participants(kv) {
123
66
  }
124
67
  return { tapOutputKey: key.subarray(0, 32), tapInternalKey: key.subarray(32), participantPubKeys };
125
68
  }
126
- exports.decodePsbtMusig2Participants = decodePsbtMusig2Participants;
127
- /**
128
- * Decodes proprietary key value data for musig2 nonce
129
- * @param kv
130
- */
131
- function decodePsbtMusig2Nonce(kv) {
132
- if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER || kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE) {
133
- throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for nonce`);
134
- }
135
- const key = kv.key.keydata;
136
- if (key.length !== 65) {
137
- throw new Error(`Invalid keydata size ${key.length} for nonce`);
138
- }
139
- const value = kv.value;
140
- if (value.length !== 66) {
141
- throw new Error(`Invalid valuedata size ${value.length} for nonce`);
142
- }
143
- return { participantPubKey: key.subarray(0, 33), tapOutputKey: key.subarray(33), pubNonce: value };
144
- }
145
- exports.decodePsbtMusig2Nonce = decodePsbtMusig2Nonce;
146
- /**
147
- * Decodes proprietary key value data for musig2 partial sig
148
- * @param kv
149
- */
150
- function decodePsbtMusig2PartialSig(kv) {
151
- if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER ||
152
- kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG) {
153
- throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for partial sig`);
154
- }
155
- const key = kv.key.keydata;
156
- if (key.length !== 65) {
157
- throw new Error(`Invalid keydata size ${key.length} for partial sig`);
158
- }
159
- const value = kv.value;
160
- if (value.length !== 32 && value.length !== 33) {
161
- throw new Error(`Invalid valuedata size ${value.length} for partial sig`);
162
- }
163
- return { participantPubKey: key.subarray(0, 33), tapOutputKey: key.subarray(33), partialSig: value };
164
- }
165
- exports.decodePsbtMusig2PartialSig = decodePsbtMusig2PartialSig;
69
+ exports.decodePsbtMusig2ParticipantsKeyValData = decodePsbtMusig2ParticipantsKeyValData;
166
70
  function createTapInternalKey(plainPubKeys) {
167
- return Buffer.from(noble_ecc_1.musig.getXOnlyPubkey(noble_ecc_1.musig.keyAgg(plainPubKeys)));
71
+ plainPubKeys.forEach((pubKey) => outputScripts_1.checkPlainPublicKey(pubKey));
72
+ return Buffer.from(noble_ecc_1.musig.getXOnlyPubkey(noble_ecc_1.musig.keyAgg(noble_ecc_1.musig.keySort(plainPubKeys))));
168
73
  }
169
74
  exports.createTapInternalKey = createTapInternalKey;
170
75
  function createTapOutputKey(internalPubKey, tapTreeRoot) {
171
- return Buffer.from(taproot_1.tapTweakPubkey(noble_ecc_1.ecc, outputScripts_1.toXOnlyPublicKey(internalPubKey), outputScripts_1.checkTapMerkleRoot(tapTreeRoot)).xOnlyPubkey);
76
+ if (tapTreeRoot.length !== 32) {
77
+ throw new Error(`Invalid tapTreeRoot size ${tapTreeRoot.length}`);
78
+ }
79
+ return Buffer.from(taproot_1.tapTweakPubkey(noble_ecc_1.ecc, outputScripts_1.toXOnlyPublicKey(internalPubKey), tapTreeRoot).xOnlyPubkey);
172
80
  }
173
81
  exports.createTapOutputKey = createTapOutputKey;
174
- function createAggregateNonce(pubNonces) {
175
- return Buffer.from(noble_ecc_1.musig.nonceAgg(pubNonces));
176
- }
177
- exports.createAggregateNonce = createAggregateNonce;
178
- function createTapTweak(tapInternalKey, tapMerkleRoot) {
179
- return Buffer.from(taproot_1.calculateTapTweak(outputScripts_1.checkXOnlyPublicKey(tapInternalKey), outputScripts_1.checkTapMerkleRoot(tapMerkleRoot)));
180
- }
181
- exports.createTapTweak = createTapTweak;
182
- function startMusig2SigningSession(aggNonce, hash, publicKeys, tweak) {
183
- return noble_ecc_1.musig.startSigningSession(aggNonce, hash, publicKeys, { tweak, xOnly: true });
184
- }
185
- function musig2PartialSign(privateKey, publicNonce, sessionKey, nonceStore) {
186
- outputScripts_1.checkTxHash(Buffer.from(sessionKey.msg));
187
- return Buffer.from(noble_ecc_1.musig.partialSign({
188
- secretKey: privateKey,
189
- publicNonce: nonceStore.getRef(publicNonce),
190
- sessionKey,
191
- }));
192
- }
193
- exports.musig2PartialSign = musig2PartialSign;
194
- function musig2PartialSigVerify(sig, publicKey, publicNonce, sessionKey) {
195
- outputScripts_1.checkTxHash(Buffer.from(sessionKey.msg));
196
- return noble_ecc_1.musig.partialVerify({ sig, publicKey, publicNonce, sessionKey });
197
- }
198
- exports.musig2PartialSigVerify = musig2PartialSigVerify;
199
- function musig2AggregateSigs(sigs, sessionKey) {
200
- return Buffer.from(noble_ecc_1.musig.signAgg(sigs, sessionKey));
201
- }
202
- exports.musig2AggregateSigs = musig2AggregateSigs;
203
- /** @return session key that can be used to reference the session later */
204
- function createMusig2SigningSession(sessionArgs) {
205
- outputScripts_1.checkTxHash(sessionArgs.txHash);
206
- const aggNonce = createAggregateNonce(sessionArgs.pubNonces);
207
- const tweak = createTapTweak(sessionArgs.internalPubKey, sessionArgs.tapTreeRoot);
208
- return startMusig2SigningSession(aggNonce, sessionArgs.txHash, sessionArgs.pubKeys, tweak);
209
- }
210
- exports.createMusig2SigningSession = createMusig2SigningSession;
211
- /**
212
- * @returns psbt proprietary key for musig2 participant key value data
213
- * If no key value exists, undefined is returned.
214
- */
215
- function parsePsbtMusig2Participants(input) {
216
- const participantsKeyVals = PsbtUtil_1.getPsbtInputProprietaryKeyVals(input, {
217
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
218
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
82
+ function deriveWalletPubKey(tapBip32Derivations, rootWalletKey) {
83
+ const myDerivations = tapBip32Derivations.filter((bipDv) => {
84
+ return bipDv.masterFingerprint.equals(rootWalletKey.fingerprint);
219
85
  });
220
- if (!participantsKeyVals.length) {
221
- return undefined;
86
+ if (!myDerivations.length) {
87
+ throw new Error('Need one tapBip32Derivation masterFingerprint to match the rootWalletKey fingerprint');
222
88
  }
223
- if (participantsKeyVals.length > 1) {
224
- throw new Error(`Found ${participantsKeyVals.length} matching participant key value instead of 1`);
89
+ const myDerivation = myDerivations.filter((bipDv) => {
90
+ const publicKey = rootWalletKey.derivePath(bipDv.path).publicKey;
91
+ return bipDv.pubkey.equals(outputScripts_1.toXOnlyPublicKey(publicKey));
92
+ });
93
+ if (myDerivation.length !== 1) {
94
+ throw new Error('root wallet key should derive one tapBip32Derivation');
225
95
  }
226
- return decodePsbtMusig2Participants(participantsKeyVals[0]);
96
+ return rootWalletKey.derivePath(myDerivation[0].path).publicKey;
227
97
  }
228
- exports.parsePsbtMusig2Participants = parsePsbtMusig2Participants;
229
- /**
230
- * @returns psbt proprietary key for musig2 public nonce key value data
231
- * If no key value exists, undefined is returned.
232
- */
233
- function parsePsbtMusig2Nonces(input) {
234
- const nonceKeyVals = PsbtUtil_1.getPsbtInputProprietaryKeyVals(input, {
235
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
236
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
237
- });
238
- if (!nonceKeyVals.length) {
239
- return undefined;
98
+ function getMusig2NonceKeyValueData(psbt, inputIndex, rootWalletKey, sessionId) {
99
+ var _a;
100
+ const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
101
+ if (!input.tapInternalKey) {
102
+ return;
240
103
  }
241
- if (nonceKeyVals.length > 2) {
242
- throw new Error(`Found ${nonceKeyVals.length} matching nonce key value instead of 1 or 2`);
104
+ if (!input.tapMerkleRoot) {
105
+ throw new Error('tapMerkleRoot is required to generate nonce');
243
106
  }
244
- return nonceKeyVals.map((kv) => decodePsbtMusig2Nonce(kv));
245
- }
246
- exports.parsePsbtMusig2Nonces = parsePsbtMusig2Nonces;
247
- /**
248
- * @returns psbt proprietary key for musig2 partial sig key value data
249
- * If no key value exists, undefined is returned.
250
- */
251
- function parsePsbtMusig2PartialSigs(input) {
252
- const sigKeyVals = PsbtUtil_1.getPsbtInputProprietaryKeyVals(input, {
253
- identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
254
- subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
255
- });
256
- if (!sigKeyVals.length) {
257
- return undefined;
107
+ if (!((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)) {
108
+ throw new Error('tapBip32Derivation is required to generate nonce');
258
109
  }
259
- if (sigKeyVals.length > 2) {
260
- throw new Error(`Found ${sigKeyVals.length} matching partial signature key value instead of 1 or 2`);
110
+ const participantsKeyVals = psbt.getProprietaryKeyVals(inputIndex, {
111
+ identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
112
+ subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
113
+ });
114
+ if (participantsKeyVals.length !== 1) {
115
+ throw new Error(`Found ${participantsKeyVals.length} matching participant key value instead of 1`);
261
116
  }
262
- return sigKeyVals.map((kv) => decodePsbtMusig2PartialSig(kv));
263
- }
264
- exports.parsePsbtMusig2PartialSigs = parsePsbtMusig2PartialSigs;
265
- /**
266
- * Assert musig2 participant key value data with tapInternalKey and tapMerkleRoot.
267
- * <tapOutputKey><tapInputKey> => <participantKey1><participantKey2>
268
- * Using tapMerkleRoot and 2 participant keys, the tapInputKey is validated and using tapMerkleRoot and tapInputKey,
269
- * the tapOutputKey is validated.
270
- */
271
- function assertPsbtMusig2Participants(participantKeyValData, tapInternalKey, tapMerkleRoot) {
272
- outputScripts_1.checkXOnlyPublicKey(tapInternalKey);
273
- outputScripts_1.checkTapMerkleRoot(tapMerkleRoot);
117
+ const participantKeyValData = decodePsbtMusig2ParticipantsKeyValData(participantsKeyVals[0]);
274
118
  const participantPubKeys = participantKeyValData.participantPubKeys;
275
- const internalKey = createTapInternalKey(participantPubKeys);
276
- if (!internalKey.equals(participantKeyValData.tapInternalKey)) {
277
- throw new Error('Invalid participants keydata tapInternalKey');
119
+ const tapInternalKey = createTapInternalKey(participantPubKeys);
120
+ if (!tapInternalKey.equals(participantKeyValData.tapInternalKey)) {
121
+ throw new Error('Invalid participants keyata tapInternalKey');
278
122
  }
279
- const outputKey = createTapOutputKey(internalKey, tapMerkleRoot);
280
- if (!outputKey.equals(participantKeyValData.tapOutputKey)) {
281
- throw new Error('Invalid participants keydata tapOutputKey');
123
+ const tapOutputKey = createTapOutputKey(tapInternalKey, input.tapMerkleRoot);
124
+ if (!tapOutputKey.equals(participantKeyValData.tapOutputKey)) {
125
+ throw new Error('Invalid participants keyata tapOutputKey');
282
126
  }
283
- if (!internalKey.equals(tapInternalKey)) {
127
+ if (!tapInternalKey.equals(input.tapInternalKey)) {
284
128
  throw new Error('tapInternalKey and aggregated participant pub keys does not match');
285
129
  }
286
- }
287
- exports.assertPsbtMusig2Participants = assertPsbtMusig2Participants;
288
- /**
289
- * Assert musig2 public nonce key value data with participant key value data
290
- * (refer assertPsbtMusig2ParticipantsKeyValData).
291
- * <participantKey1><tapOutputKey> => <pubNonce1>
292
- * <participantKey2><tapOutputKey> => <pubNonce2>
293
- * Checks against participant keys and tapOutputKey
294
- */
295
- function assertPsbtMusig2Nonces(noncesKeyValData, participantKeyValData) {
296
- outputScripts_1.checkXOnlyPublicKey(participantKeyValData.tapOutputKey);
297
- participantKeyValData.participantPubKeys.forEach((kv) => outputScripts_1.checkPlainPublicKey(kv));
298
- if (participantKeyValData.participantPubKeys[0].equals(participantKeyValData.participantPubKeys[1])) {
299
- throw new Error(`Duplicate participant pub keys found`);
300
- }
301
- if (noncesKeyValData.length > 2) {
302
- throw new Error(`Invalid nonce key value count ${noncesKeyValData.length}`);
303
- }
304
- noncesKeyValData.forEach((nonceKv) => {
305
- const index = participantKeyValData.participantPubKeys.findIndex((pubKey) => nonceKv.participantPubKey.equals(pubKey));
306
- if (index < 0) {
307
- throw new Error('Invalid nonce keydata participant pub key');
308
- }
309
- if (!nonceKv.tapOutputKey.equals(participantKeyValData.tapOutputKey)) {
310
- throw new Error('Invalid nonce keydata tapOutputKey');
311
- }
130
+ const derivedPubKey = deriveWalletPubKey(input.tapBip32Derivation, rootWalletKey);
131
+ const participantPubKey = participantPubKeys.find((pubKey) => pubKey.equals(derivedPubKey));
132
+ if (!Buffer.isBuffer(participantPubKey)) {
133
+ throw new Error('participant plain pub key should match one tapBip32Derivation plain pub key');
134
+ }
135
+ const { hash } = psbt.getTaprootHashForSigChecked(inputIndex);
136
+ const nonceGenArgs = {
137
+ sessionId,
138
+ publicKey: participantPubKey,
139
+ xOnlyPublicKey: tapOutputKey,
140
+ msg: hash,
141
+ secretKey: rootWalletKey.privateKey,
142
+ };
143
+ const pubNonces = Buffer.from(noble_ecc_1.musig.nonceGen(nonceGenArgs));
144
+ return encodePsbtMusig2PubNonceKeyValData({
145
+ participantPubKey,
146
+ tapOutputKey,
147
+ pubNonces,
312
148
  });
313
149
  }
314
- exports.assertPsbtMusig2Nonces = assertPsbtMusig2Nonces;
315
150
  /**
316
- * @returns Input object but sig hash type data is taken out from partialSig field.
317
- * If sig hash type is not common for all sigs, error out, otherwise returns the modified object and single hash type.
151
+ * Generates and sets Musig2 nonces to p2trMusig2 key path spending inputs.
152
+ * tapInternalkey, tapMerkleRoot, tapBip32Derivation for rootWalletKey are required per p2trMusig2 key path input.
153
+ * Also participant keys are required from psbt proprietary key values.
154
+ * Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
155
+ * @param psbt
156
+ * @param rootWalletKey
157
+ * @param sessionId If provided it must either be a counter unique to this secret key,
158
+ * (converted to an array of 32 bytes), or 32 uniformly random bytes.
318
159
  */
319
- function getSigHashTypeFromSigs(partialSigs) {
320
- if (!partialSigs.length) {
321
- throw new Error('partialSigs array can not be empty');
160
+ function setMusig2Nonces(psbt, rootWalletKey, sessionId) {
161
+ if (rootWalletKey.isNeutered()) {
162
+ throw new Error('private key is required to generate nonce');
322
163
  }
323
- const pSigsWithHashType = partialSigs.map((kv) => {
324
- const { partialSig, participantPubKey, tapOutputKey } = kv;
325
- return partialSig.length === 33
326
- ? { pSig: { partialSig: partialSig.slice(0, 32), participantPubKey, tapOutputKey }, sigHashType: partialSig[32] }
327
- : { pSig: { partialSig, participantPubKey, tapOutputKey }, sigHashType: index_1.Transaction.SIGHASH_DEFAULT };
328
- });
329
- const sigHashType = pSigsWithHashType[0].sigHashType;
330
- if (!pSigsWithHashType.every((pSig) => pSig.sigHashType === sigHashType)) {
331
- throw new Error('signatures must use same sig hash type');
164
+ if (Buffer.isBuffer(sessionId) && sessionId.length !== 32) {
165
+ throw new Error(`Invalid sessionId size ${sessionId.length}`);
332
166
  }
333
- return { partialSigs: pSigsWithHashType.map(({ pSig }) => pSig), sigHashType };
334
- }
335
- exports.getSigHashTypeFromSigs = getSigHashTypeFromSigs;
336
- function createMusig2DeterministicNonce(params) {
337
- return Buffer.from(noble_ecc_1.musig.deterministicNonceGen({
338
- secretKey: params.privateKey,
339
- aggOtherNonce: noble_ecc_1.musig.nonceAgg([params.otherNonce]),
340
- publicKeys: params.publicKeys,
341
- tweaks: [{ tweak: createTapTweak(params.internalPubKey, params.tapTreeRoot), xOnly: true }],
342
- msg: params.hash,
343
- }).publicNonce);
344
- }
345
- exports.createMusig2DeterministicNonce = createMusig2DeterministicNonce;
346
- function musig2DeterministicSign(params) {
347
- const { sig, sessionKey, publicNonce } = noble_ecc_1.musig.deterministicSign({
348
- secretKey: params.privateKey,
349
- aggOtherNonce: noble_ecc_1.musig.nonceAgg([params.otherNonce]),
350
- publicKeys: params.publicKeys,
351
- tweaks: [{ tweak: createTapTweak(params.internalPubKey, params.tapTreeRoot), xOnly: true }],
352
- msg: params.hash,
167
+ psbt.data.inputs.forEach((input, inputIndex) => {
168
+ const noncesKeyValueData = getMusig2NonceKeyValueData(psbt, inputIndex, rootWalletKey, sessionId);
169
+ if (noncesKeyValueData) {
170
+ psbt.addProprietaryKeyValToInput(inputIndex, noncesKeyValueData);
171
+ }
353
172
  });
354
- return { sig: Buffer.from(sig), sessionKey, publicNonce: Buffer.from(publicNonce) };
355
173
  }
356
- exports.musig2DeterministicSign = musig2DeterministicSign;
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxtREFNeUI7QUFDekIsNENBQTBDO0FBRTFDLHdDQUErRDtBQUMvRCxvQ0FBdUM7QUFFdkMseUNBS29CO0FBc0NwQjs7O0dBR0c7QUFDSCxNQUFhLGdCQUFnQjtJQUE3QjtRQUNVLFdBQU0sR0FBaUIsRUFBRSxDQUFDO0lBd0NwQyxDQUFDO0lBdENDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFpQjtRQUN0QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDM0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLENBQUM7YUFDVjtTQUNGO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILGlCQUFpQixDQUNmLFVBQXNCLEVBQ3RCLFNBQXFCLEVBQ3JCLGNBQTBCLEVBQzFCLE1BQWtCLEVBQ2xCLFNBQWtCO1FBRWxCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELE1BQU0sR0FBRyxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRjtBQXpDRCw0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Q0FBQyxJQUFJO0tBQ2pCLENBQUMsQ0FBQyxXQUFXLENBQ2YsQ0FBQztBQUNKLENBQUM7QUFWRCx3RUFVQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE1BQXFDO0lBSzNFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLGlCQUFLLENBQUMsaUJBQWlCLENBQUM7UUFDL0QsU0FBUyxFQUFFLE1BQU0sQ0FBQyxVQUFVO1FBQzVCLGFBQWEsRUFBRSxpQkFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRCxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDN0IsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzRixHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUk7S0FDakIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0FBQ3RGLENBQUM7QUFiRCwwREFhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlc3Npb25LZXkgfSBmcm9tICdAYnJhbmRvbmJsYWNrL211c2lnJztcblxuaW1wb3J0IHtcbiAgY2hlY2tQbGFpblB1YmxpY0tleSxcbiAgY2hlY2tUYXBNZXJrbGVSb290LFxuICBjaGVja1R4SGFzaCxcbiAgY2hlY2tYT25seVB1YmxpY0tleSxcbiAgdG9YT25seVB1YmxpY0tleSxcbn0gZnJvbSAnLi9vdXRwdXRTY3JpcHRzJztcbmltcG9ydCB7IGVjYywgbXVzaWcgfSBmcm9tICcuLi9ub2JsZV9lY2MnO1xuaW1wb3J0IHsgVHVwbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNhbGN1bGF0ZVRhcFR3ZWFrLCB0YXBUd2Vha1B1YmtleSB9IGZyb20gJy4uL3RhcHJvb3QnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBQc2J0SW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyxcbiAgUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLFxuICBQcm9wcmlldGFyeUtleVZhbHVlLFxuICBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG59IGZyb20gJy4vUHNidFV0aWwnO1xuXG4vKipcbiAqICBQYXJ0aWNpcGFudCBrZXkgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlcjtcbiAgcGFydGljaXBhbnRQdWJLZXlzOiBUdXBsZTxCdWZmZXI+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJEZXRlcm1pbmlzdGljUGFyYW1zIHtcbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xuICBvdGhlck5vbmNlOiBCdWZmZXI7XG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj47XG4gIGludGVybmFsUHViS2V5OiBCdWZmZXI7XG4gIHRhcFRyZWVSb290OiBCdWZmZXI7XG4gIGhhc2g6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgTm9uY2Uga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBwYXJ0aWNpcGFudFB1YktleTogQnVmZmVyO1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgcHViTm9uY2U6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgUGFydGlhbCBzaWduYXR1cmUga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUGFydGlhbFNpZyB7XG4gIHBhcnRpY2lwYW50UHViS2V5OiBCdWZmZXI7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICBwYXJ0aWFsU2lnOiBCdWZmZXI7XG59XG5cbi8qKlxuICogQmVjYXVzZSBtdXNpZyB1c2VzIHJlZmVyZW5jZS1lcXVhbCBidWZmZXJzIHRvIGNhY2hlIG5vbmNlcywgd2Ugd3JhcCBpdCBoZXJlIHRvIGFsbG93IHVzaW5nXG4gKiBub25jZXMgdGhhdCBhcmUgYnl0ZS1lcXVhbCBidXQgbm90IHJlZmVyZW5jZS1lcXVhbC5cbiAqL1xuZXhwb3J0IGNsYXNzIE11c2lnMk5vbmNlU3RvcmUge1xuICBwcml2YXRlIG5vbmNlczogVWludDhBcnJheVtdID0gW107XG5cbiAgLyoqXG4gICAqIEdldCBvcmlnaW5hbCBCdWZmZXIgaW5zdGFuY2UgZm9yIG5vbmNlICh3aGljaCBtYXkgYmUgYSBjb3B5KS5cbiAgICogQHJldHVybiBieXRlLWVxdWFsIGJ1ZmZlciB0aGF0IGlzIHJlZmVyZW5jZS1lcXVhbCB0byB3aGF0IHdhcyBzdG9yZWQgZWFybGllciBpbiBjcmVhdGVNdXNpZzJOb25jZVxuICAgKi9cbiAgZ2V0UmVmKG5vbmNlOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgZm9yIChjb25zdCBiIG9mIHRoaXMubm9uY2VzKSB7XG4gICAgICBpZiAoQnVmZmVyLmZyb20oYikuZXF1YWxzKG5vbmNlKSkge1xuICAgICAgICByZXR1cm4gYjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG5vbmNlYCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBtdXNpZzIgbm9uY2UgYW5kIHN0b3JlcyBidWZmZXIgcmVmZXJlbmNlLlxuICAgKiB0YXBJbnRlcm5hbGtleSwgdGFwTWVya2xlUm9vdCwgdGFwQmlwMzJEZXJpdmF0aW9uIGZvciByb290V2FsbGV0S2V5IGFyZSByZXF1aXJlZCBwZXIgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbnB1dC5cbiAgICogQWxzbyBwYXJ0aWNpcGFudCBrZXlzIGFyZSByZXF1aXJlZCBmcm9tIHBzYnQgcHJvcHJpZXRhcnkga2V5IHZhbHVlcy5cbiAgICogUmVmOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zYW5rZXQxNzI5LzRiNTI1YzYwNDlmNGQ5ZTAzNGQyNzM2OGM0OWYyOGE2XG4gICAqIEBwYXJhbSBwcml2YXRlS2V5IC0gc2lnbmVyIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgLSBzaWduZXIgeHkgcHVibGljIGtleVxuICAgKiBAcGFyYW0geE9ubHlQdWJsaWNLZXkgLSB0d2Vha2VkIGFnZ3JlZ2F0ZWQga2V5ICh0YXBPdXRwdXRLZXkpXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQWRkaXRpb25hbCBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBjcmVhdGVNdXNpZzJOb25jZShcbiAgICBwcml2YXRlS2V5OiBVaW50OEFycmF5LFxuICAgIHB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB4T25seVB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB0eEhhc2g6IFVpbnQ4QXJyYXksXG4gICAgc2Vzc2lvbklkPzogQnVmZmVyXG4gICk6IFVpbnQ4QXJyYXkge1xuICAgIGlmICh0eEhhc2gubGVuZ3RoICE9IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHhIYXNoIHNpemUgJHt0eEhhc2h9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZiA9IG11c2lnLm5vbmNlR2VuKHsgc2VjcmV0S2V5OiBwcml2YXRlS2V5LCBwdWJsaWNLZXksIHhPbmx5UHVibGljS2V5LCBtc2c6IHR4SGFzaCwgc2Vzc2lvbklkIH0pO1xuICAgIHRoaXMubm9uY2VzLnB1c2goYnVmKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5cy4gU3ViVHlwZSBpcyAweDAxXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4geC1vbmx5IHRhcE91dHB1dEtleXx8dGFwSW50ZXJuYWxLZXkgYXMgc3ViIGtleWRhdGEsIHBsYWluIHNpZ2luaW5nIHBhcnRpY2lwYW50IGtleXMgYXMgdmFsdWVkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50czogUHNidE11c2lnMlBhcnRpY2lwYW50cyk6IFByb3ByaWV0YXJ5S2V5VmFsdWUge1xuICBjb25zdCBrZXlkYXRhID0gW3BhcnRpY2lwYW50cy50YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50cy50YXBJbnRlcm5hbEtleV0ubWFwKChwdWJrZXkpID0+IGNoZWNrWE9ubHlQdWJsaWNLZXkocHVia2V5KSk7XG4gIGNvbnN0IHZhbHVlID0gcGFydGljaXBhbnRzLnBhcnRpY2lwYW50UHViS2V5cy5tYXAoKHB1YmtleSkgPT4gY2hlY2tQbGFpblB1YmxpY0tleShwdWJrZXkpKTtcbiAgY29uc3Qga2V5ID0ge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgIGtleWRhdGE6IEJ1ZmZlci5jb25jYXQoa2V5ZGF0YSksXG4gIH07XG4gIHJldHVybiB7IGtleSwgdmFsdWU6IEJ1ZmZlci5jb25jYXQodmFsdWUpIH07XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHB1YiBub25jZS4gU3ViVHlwZSBpcyAweDAyXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4gcGxhaW4tcGFydGljaXBhbnRQdWJLZXl8fHgtb25seS10YXBPdXRwdXRLZXkgYXMgc3ViIGtleWRhdGEsIDY2IGJ5dGVzIG9mIDIgcHViIG5vbmNlcyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZShub25jZTogUHNidE11c2lnMlB1Yk5vbmNlKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChub25jZS5wdWJOb25jZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1Yk5vbmNlcyBsZW5ndGggJHtub25jZS5wdWJOb25jZS5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkobm9uY2UucGFydGljaXBhbnRQdWJLZXkpLFxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkobm9uY2UudGFwT3V0cHV0S2V5KSxcbiAgXSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9uY2UucHViTm9uY2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKHBhcnRpYWxTaWc6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMiAmJiBwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJ0aWFsU2lnIGxlbmd0aCAke3BhcnRpYWxTaWcucGFydGlhbFNpZy5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkocGFydGlhbFNpZy5wYXJ0aWNpcGFudFB1YktleSksXG4gICAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWFsU2lnLnRhcE91dHB1dEtleSksXG4gIF0pO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogcGFydGlhbFNpZy5wYXJ0aWFsU2lnIH07XG59XG5cbi8qKlxuICogRGVjb2RlcyBwcm9wcmlldGFyeSBrZXkgdmFsdWUgZGF0YSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNcbiAqIEBwYXJhbSBrdlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICBpZiAoXG4gICAga3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fFxuICAgIGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5c2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj4gPSBbdmFsdWUuc3ViYXJyYXkoMCwgMzMpLCB2YWx1ZS5zdWJhcnJheSgzMyldO1xuICBpZiAocGFydGljaXBhbnRQdWJLZXlzWzBdLmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgcGFydGljaXBhbnQgcHViIGtleXMgZm91bmRgKTtcbiAgfVxuXG4gIHJldHVybiB7IHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDAsIDMyKSwgdGFwSW50ZXJuYWxLZXk6IGtleS5zdWJhcnJheSgzMiksIHBhcnRpY2lwYW50UHViS2V5cyB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBub25jZVxuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyTm9uY2Uoa3Y6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBpZiAoa3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fCBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBub25jZWApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIHJldHVybiB7IHBhcnRpY2lwYW50UHViS2V5OiBrZXkuc3ViYXJyYXkoMCwgMzMpLCB0YXBPdXRwdXRLZXk6IGtleS5zdWJhcnJheSgzMyksIHB1Yk5vbmNlOiB2YWx1ZSB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBwYXJ0aWFsIHNpZ1xuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyUGFydGlhbFNpZyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnIHtcbiAgaWYgKFxuICAgIGt2LmtleS5pZGVudGlmaWVyICE9PSBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfHxcbiAgICBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJR1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGlhbCBzaWdgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDMyICYmIHZhbHVlLmxlbmd0aCAhPT0gMzMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWVkYXRhIHNpemUgJHt2YWx1ZS5sZW5ndGh9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGljaXBhbnRQdWJLZXk6IGtleS5zdWJhcnJheSgwLCAzMyksIHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDMzKSwgcGFydGlhbFNpZzogdmFsdWUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcEludGVybmFsS2V5KHBsYWluUHViS2V5czogQnVmZmVyW10pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuZ2V0WE9ubHlQdWJrZXkobXVzaWcua2V5QWdnKHBsYWluUHViS2V5cykpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcE91dHB1dEtleShpbnRlcm5hbFB1YktleTogQnVmZmVyLCB0YXBUcmVlUm9vdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIHRhcFR3ZWFrUHVia2V5KGVjYywgdG9YT25seVB1YmxpY0tleShpbnRlcm5hbFB1YktleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBUcmVlUm9vdCkpLnhPbmx5UHVia2V5XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdGVOb25jZShwdWJOb25jZXM6IFR1cGxlPEJ1ZmZlcj4pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcubm9uY2VBZ2cocHViTm9uY2VzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXBUd2Vhayh0YXBJbnRlcm5hbEtleTogQnVmZmVyLCB0YXBNZXJrbGVSb290OiBCdWZmZXIpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2FsY3VsYXRlVGFwVHdlYWsoY2hlY2tYT25seVB1YmxpY0tleSh0YXBJbnRlcm5hbEtleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBNZXJrbGVSb290KSkpO1xufVxuXG5mdW5jdGlvbiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKFxuICBhZ2dOb25jZTogQnVmZmVyLFxuICBoYXNoOiBCdWZmZXIsXG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj4sXG4gIHR3ZWFrOiBCdWZmZXJcbik6IFNlc3Npb25LZXkge1xuICByZXR1cm4gbXVzaWcuc3RhcnRTaWduaW5nU2Vzc2lvbihhZ2dOb25jZSwgaGFzaCwgcHVibGljS2V5cywgeyB0d2VhaywgeE9ubHk6IHRydWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnbihcbiAgcHJpdmF0ZUtleTogQnVmZmVyLFxuICBwdWJsaWNOb25jZTogVWludDhBcnJheSxcbiAgc2Vzc2lvbktleTogU2Vzc2lvbktleSxcbiAgbm9uY2VTdG9yZTogTXVzaWcyTm9uY2VTdG9yZVxuKTogQnVmZmVyIHtcbiAgY2hlY2tUeEhhc2goQnVmZmVyLmZyb20oc2Vzc2lvbktleS5tc2cpKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIG11c2lnLnBhcnRpYWxTaWduKHtcbiAgICAgIHNlY3JldEtleTogcHJpdmF0ZUtleSxcbiAgICAgIHB1YmxpY05vbmNlOiBub25jZVN0b3JlLmdldFJlZihwdWJsaWNOb25jZSksXG4gICAgICBzZXNzaW9uS2V5LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnVmVyaWZ5KFxuICBzaWc6IEJ1ZmZlcixcbiAgcHVibGljS2V5OiBCdWZmZXIsXG4gIHB1YmxpY05vbmNlOiBCdWZmZXIsXG4gIHNlc3Npb25LZXk6IFNlc3Npb25LZXlcbik6IGJvb2xlYW4ge1xuICBjaGVja1R4SGFzaChCdWZmZXIuZnJvbShzZXNzaW9uS2V5Lm1zZykpO1xuICByZXR1cm4gbXVzaWcucGFydGlhbFZlcmlmeSh7IHNpZywgcHVibGljS2V5LCBwdWJsaWNOb25jZSwgc2Vzc2lvbktleSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkFnZ3JlZ2F0ZVNpZ3Moc2lnczogQnVmZmVyW10sIHNlc3Npb25LZXk6IFNlc3Npb25LZXkpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuc2lnbkFnZyhzaWdzLCBzZXNzaW9uS2V5KSk7XG59XG5cbi8qKiBAcmV0dXJuIHNlc3Npb24ga2V5IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBzZXNzaW9uIGxhdGVyICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oc2Vzc2lvbkFyZ3M6IHtcbiAgcHViTm9uY2VzOiBUdXBsZTxCdWZmZXI+O1xuICB0eEhhc2g6IEJ1ZmZlcjtcbiAgcHViS2V5czogVHVwbGU8QnVmZmVyPjtcbiAgaW50ZXJuYWxQdWJLZXk6IEJ1ZmZlcjtcbiAgdGFwVHJlZVJvb3Q6IEJ1ZmZlcjtcbn0pOiBTZXNzaW9uS2V5IHtcbiAgY2hlY2tUeEhhc2goc2Vzc2lvbkFyZ3MudHhIYXNoKTtcbiAgY29uc3QgYWdnTm9uY2UgPSBjcmVhdGVBZ2dyZWdhdGVOb25jZShzZXNzaW9uQXJncy5wdWJOb25jZXMpO1xuICBjb25zdCB0d2VhayA9IGNyZWF0ZVRhcFR3ZWFrKHNlc3Npb25BcmdzLmludGVybmFsUHViS2V5LCBzZXNzaW9uQXJncy50YXBUcmVlUm9vdCk7XG4gIHJldHVybiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKGFnZ05vbmNlLCBzZXNzaW9uQXJncy50eEhhc2gsIHNlc3Npb25BcmdzLnB1YktleXMsIHR3ZWFrKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBwc2J0IHByb3ByaWV0YXJ5IGtleSBmb3IgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXQ6IFBzYnRJbnB1dCk6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxzID0gZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0LCB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gIH0pO1xuXG4gIGlmICghcGFydGljaXBhbnRzS2V5VmFscy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHBhcnRpY2lwYW50c0tleVZhbHMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aH0gbWF0Y2hpbmcgcGFydGljaXBhbnQga2V5IHZhbHVlIGluc3RlYWQgb2YgMWApO1xuICB9XG5cbiAgcmV0dXJuIGRlY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocGFydGljaXBhbnRzS2V5VmFsc1swXSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgcHNidCBwcm9wcmlldGFyeSBrZXkgZm9yIG11c2lnMiBwdWJsaWMgbm9uY2Uga2V5IHZhbHVlIGRhdGFcbiAqIElmIG5vIGtleSB2YWx1ZSBleGlzdHMsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHNidE11c2lnMk5vbmNlcyhpbnB1dDogUHNidElucHV0KTogUHNidE11c2lnMlB1Yk5vbmNlW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBub25jZUtleVZhbHMgPSBnZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXQsIHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gIH0pO1xuXG4gIGlmICghbm9uY2VLZXlWYWxzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAobm9uY2VLZXlWYWxzLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7bm9uY2VLZXlWYWxzLmxlbmd0aH0gbWF0Y2hpbmcgbm9uY2Uga2V5IHZhbHVlIGluc3RlYWQgb2YgMSBvciAyYCk7XG4gIH1cblxuICByZXR1cm4gbm9uY2VLZXlWYWxzLm1hcCgoa3YpID0+IGRlY29kZVBzYnRNdXNpZzJOb25jZShrdikpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHBzYnQgcHJvcHJpZXRhcnkga2V5IGZvciBtdXNpZzIgcGFydGlhbCBzaWcga2V5IHZhbHVlIGRhdGFcbiAqIElmIG5vIGtleSB2YWx1ZSBleGlzdHMsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKGlucHV0OiBQc2J0SW5wdXQpOiBQc2J0TXVzaWcyUGFydGlhbFNpZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2lnS2V5VmFscyA9IGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHLFxuICB9KTtcblxuICBpZiAoIXNpZ0tleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChzaWdLZXlWYWxzLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7c2lnS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpYWwgc2lnbmF0dXJlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDEgb3IgMmApO1xuICB9XG5cbiAgcmV0dXJuIHNpZ0tleVZhbHMubWFwKChrdikgPT4gZGVjb2RlUHNidE11c2lnMlBhcnRpYWxTaWcoa3YpKTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhIHdpdGggdGFwSW50ZXJuYWxLZXkgYW5kIHRhcE1lcmtsZVJvb3QuXG4gKiA8dGFwT3V0cHV0S2V5Pjx0YXBJbnB1dEtleT4gPT4gPHBhcnRpY2lwYW50S2V5MT48cGFydGljaXBhbnRLZXkyPlxuICogVXNpbmcgdGFwTWVya2xlUm9vdCBhbmQgMiBwYXJ0aWNpcGFudCBrZXlzLCB0aGUgdGFwSW5wdXRLZXkgaXMgdmFsaWRhdGVkIGFuZCB1c2luZyB0YXBNZXJrbGVSb290IGFuZCB0YXBJbnB1dEtleSxcbiAqIHRoZSB0YXBPdXRwdXRLZXkgaXMgdmFsaWRhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyhcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICB0YXBJbnRlcm5hbEtleTogQnVmZmVyLFxuICB0YXBNZXJrbGVSb290OiBCdWZmZXJcbik6IHZvaWQge1xuICBjaGVja1hPbmx5UHVibGljS2V5KHRhcEludGVybmFsS2V5KTtcbiAgY2hlY2tUYXBNZXJrbGVSb290KHRhcE1lcmtsZVJvb3QpO1xuXG4gIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5cyA9IHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXM7XG5cbiAgY29uc3QgaW50ZXJuYWxLZXkgPSBjcmVhdGVUYXBJbnRlcm5hbEtleShwYXJ0aWNpcGFudFB1YktleXMpO1xuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50cyBrZXlkYXRhIHRhcEludGVybmFsS2V5Jyk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRLZXkgPSBjcmVhdGVUYXBPdXRwdXRLZXkoaW50ZXJuYWxLZXksIHRhcE1lcmtsZVJvb3QpO1xuICBpZiAoIW91dHB1dEtleS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcE91dHB1dEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnRzIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gIH1cblxuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyh0YXBJbnRlcm5hbEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEludGVybmFsS2V5IGFuZCBhZ2dyZWdhdGVkIHBhcnRpY2lwYW50IHB1YiBrZXlzIGRvZXMgbm90IG1hdGNoJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHB1YmxpYyBub25jZSBrZXkgdmFsdWUgZGF0YSB3aXRoIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiAocmVmZXIgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbERhdGEpLlxuICogPHBhcnRpY2lwYW50S2V5MT48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UxPlxuICogPHBhcnRpY2lwYW50S2V5Mj48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UyPlxuICogQ2hlY2tzIGFnYWluc3QgcGFydGljaXBhbnQga2V5cyBhbmQgdGFwT3V0cHV0S2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzKFxuICBub25jZXNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUHViTm9uY2VbXSxcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzXG4pOiB2b2lkIHtcbiAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KTtcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5mb3JFYWNoKChrdikgPT4gY2hlY2tQbGFpblB1YmxpY0tleShrdikpO1xuICBpZiAocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1swXS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBwYXJ0aWNpcGFudCBwdWIga2V5cyBmb3VuZGApO1xuICB9XG5cbiAgaWYgKG5vbmNlc0tleVZhbERhdGEubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBub25jZSBrZXkgdmFsdWUgY291bnQgJHtub25jZXNLZXlWYWxEYXRhLmxlbmd0aH1gKTtcbiAgfVxuXG4gIG5vbmNlc0tleVZhbERhdGEuZm9yRWFjaCgobm9uY2VLdikgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5maW5kSW5kZXgoKHB1YktleSkgPT5cbiAgICAgIG5vbmNlS3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHB1YktleSlcbiAgICApO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBub25jZSBrZXlkYXRhIHBhcnRpY2lwYW50IHB1YiBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vbmNlS3YudGFwT3V0cHV0S2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5vbmNlIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBJbnB1dCBvYmplY3QgYnV0IHNpZyBoYXNoIHR5cGUgZGF0YSBpcyB0YWtlbiBvdXQgZnJvbSBwYXJ0aWFsU2lnIGZpZWxkLlxuICogSWYgc2lnIGhhc2ggdHlwZSBpcyBub3QgY29tbW9uIGZvciBhbGwgc2lncywgZXJyb3Igb3V0LCBvdGhlcndpc2UgcmV0dXJucyB0aGUgbW9kaWZpZWQgb2JqZWN0IGFuZCBzaW5nbGUgaGFzaCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhwYXJ0aWFsU2lnczogUHNidE11c2lnMlBhcnRpYWxTaWdbXSk6IHtcbiAgcGFydGlhbFNpZ3M6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW107XG4gIHNpZ0hhc2hUeXBlOiBudW1iZXI7XG59IHtcbiAgaWYgKCFwYXJ0aWFsU2lncy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRpYWxTaWdzIGFycmF5IGNhbiBub3QgYmUgZW1wdHknKTtcbiAgfVxuICBjb25zdCBwU2lnc1dpdGhIYXNoVHlwZSA9IHBhcnRpYWxTaWdzLm1hcCgoa3YpID0+IHtcbiAgICBjb25zdCB7IHBhcnRpYWxTaWcsIHBhcnRpY2lwYW50UHViS2V5LCB0YXBPdXRwdXRLZXkgfSA9IGt2O1xuICAgIHJldHVybiBwYXJ0aWFsU2lnLmxlbmd0aCA9PT0gMzNcbiAgICAgID8geyBwU2lnOiB7IHBhcnRpYWxTaWc6IHBhcnRpYWxTaWcuc2xpY2UoMCwgMzIpLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBwYXJ0aWFsU2lnWzMyXSB9XG4gICAgICA6IHsgcFNpZzogeyBwYXJ0aWFsU2lnLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgfTtcbiAgfSk7XG5cbiAgY29uc3Qgc2lnSGFzaFR5cGUgPSBwU2lnc1dpdGhIYXNoVHlwZVswXS5zaWdIYXNoVHlwZTtcbiAgaWYgKCFwU2lnc1dpdGhIYXNoVHlwZS5ldmVyeSgocFNpZykgPT4gcFNpZy5zaWdIYXNoVHlwZSA9PT0gc2lnSGFzaFR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzaWduYXR1cmVzIG11c3QgdXNlIHNhbWUgc2lnIGhhc2ggdHlwZScpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGlhbFNpZ3M6IHBTaWdzV2l0aEhhc2hUeXBlLm1hcCgoeyBwU2lnIH0pID0+IHBTaWcpLCBzaWdIYXNoVHlwZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyRGV0ZXJtaW5pc3RpY05vbmNlKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgbXVzaWcuZGV0ZXJtaW5pc3RpY05vbmNlR2VuKHtcbiAgICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgICBhZ2dPdGhlck5vbmNlOiBtdXNpZy5ub25jZUFnZyhbcGFyYW1zLm90aGVyTm9uY2VdKSxcbiAgICAgIHB1YmxpY0tleXM6IHBhcmFtcy5wdWJsaWNLZXlzLFxuICAgICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICAgIG1zZzogcGFyYW1zLmhhc2gsXG4gICAgfSkucHVibGljTm9uY2VcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkRldGVybWluaXN0aWNTaWduKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiB7XG4gIHNpZzogQnVmZmVyO1xuICBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5O1xuICBwdWJsaWNOb25jZTogQnVmZmVyO1xufSB7XG4gIGNvbnN0IHsgc2lnLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZSB9ID0gbXVzaWcuZGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgYWdnT3RoZXJOb25jZTogbXVzaWcubm9uY2VBZ2coW3BhcmFtcy5vdGhlck5vbmNlXSksXG4gICAgcHVibGljS2V5czogcGFyYW1zLnB1YmxpY0tleXMsXG4gICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICBtc2c6IHBhcmFtcy5oYXNoLFxuICB9KTtcbiAgcmV0dXJuIHsgc2lnOiBCdWZmZXIuZnJvbShzaWcpLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZTogQnVmZmVyLmZyb20ocHVibGljTm9uY2UpIH07XG59XG4iXX0=
174
+ exports.setMusig2Nonces = setMusig2Nonces;
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUg7QUFDbkgsbURBQTZGO0FBRTdGLDRDQUEwQztBQUUxQyx3Q0FBNEM7QUFFNUMsZ0RBQXFEO0FBb0JyRDs7OztHQUlHO0FBQ0gsU0FBZ0Isc0NBQXNDLENBQ3BELHNCQUEwRDtJQUUxRCxNQUFNLE9BQU8sR0FBRyxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUMxRyxtQ0FBbUIsQ0FBQyxNQUFNLENBQUMsQ0FDNUIsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsbUNBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNyRyxNQUFNLEdBQUcsR0FBRztRQUNWLFVBQVUsRUFBRSxzQ0FBMkI7UUFDdkMsT0FBTyxFQUFFLGdDQUFxQixDQUFDLDJCQUEyQjtRQUMxRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDaEMsQ0FBQztJQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBYkQsd0ZBYUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isa0NBQWtDLENBQ2hELGtCQUFnRDtJQUVoRCxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQ3BGO0lBQ0QsTUFB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OUQ7SUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDL0Q7SUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7UUFDN0MsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRyxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUNsRTtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWJELDBDQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLCBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSwgVXR4b1BzYnQsIFByb3ByaWV0YXJ5S2V5U3VidHlwZSB9IGZyb20gJy4vVXR4b1BzYnQnO1xuaW1wb3J0IHsgY2hlY2tQbGFpblB1YmxpY0tleSwgY2hlY2tYT25seVB1YmxpY0tleSwgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcbmltcG9ydCB7IGVjYywgbXVzaWcgfSBmcm9tICcuLi9ub2JsZV9lY2MnO1xuaW1wb3J0IHsgVHVwbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHRhcFR3ZWFrUHVia2V5IH0gZnJvbSAnLi4vdGFwcm9vdCc7XG5pbXBvcnQgeyBUYXBCaXAzMkRlcml2YXRpb24gfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNoZWNrRm9ySW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi91dGlscyc7XG5cbi8qKlxuICogIFBhcnRpY2lwYW50IGtleSB2YWx1ZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbHVlRGF0YSB7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICB0YXBJbnRlcm5hbEtleTogQnVmZmVyO1xuICBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj47XG59XG5cbi8qKlxuICogIE5vbmNlIGtleSB2YWx1ZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMk5vbmNlc0tleVZhbHVlRGF0YSB7XG4gIHBhcnRpY2lwYW50UHViS2V5OiBCdWZmZXI7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICBwdWJOb25jZXM6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiBQc2J0IHByb3ByaWV0YXJ5IGtleSB2YWwgdXRpbCBmdW5jdGlvbiBmb3IgcGFydGljaXBhbnRzIHB1YiBrZXlzLiBTdWJUeXBlIGlzIDB4MDFcbiAqIFJlZjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2Fua2V0MTcyOS80YjUyNWM2MDQ5ZjRkOWUwMzRkMjczNjhjNDlmMjhhNlxuICogQHJldHVybiB4LW9ubHkgdGFwT3V0cHV0S2V5fHx0YXBJbnRlcm5hbEtleSBhcyBzdWIga2V5ZGF0YSwgcGxhaW4gc2lnaW5pbmcgcGFydGljaXBhbnQga2V5cyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWxEYXRhKFxuICBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzS2V5VmFsdWVEYXRhXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSB7XG4gIGNvbnN0IGtleWRhdGEgPSBbcGFydGljaXBhbnRzS2V5VmFsRGF0YS50YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50c0tleVZhbERhdGEudGFwSW50ZXJuYWxLZXldLm1hcCgocHVia2V5KSA9PlxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkocHVia2V5KVxuICApO1xuICBjb25zdCB2YWx1ZSA9IHBhcnRpY2lwYW50c0tleVZhbERhdGEucGFydGljaXBhbnRQdWJLZXlzLm1hcCgocHVia2V5KSA9PiBjaGVja1BsYWluUHVibGljS2V5KHB1YmtleSkpO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gICAga2V5ZGF0YTogQnVmZmVyLmNvbmNhdChrZXlkYXRhKSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogQnVmZmVyLmNvbmNhdCh2YWx1ZSkgfTtcbn1cblxuLyoqXG4gKiBQc2J0IHByb3ByaWV0YXJ5IGtleSB2YWwgdXRpbCBmdW5jdGlvbiBmb3IgcHViIG5vbmNlLiBTdWJUeXBlIGlzIDB4MDJcbiAqIFJlZjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2Fua2V0MTcyOS80YjUyNWM2MDQ5ZjRkOWUwMzRkMjczNjhjNDlmMjhhNlxuICogQHJldHVybiBwbGFpbi1wYXJ0aWNpcGFudFB1YktleXx8eC1vbmx5LXRhcE91dHB1dEtleSBhcyBzdWIga2V5ZGF0YSwgNjYgYnl0ZXMgb2YgMiBwdWIgbm9uY2VzIGFzIHZhbHVlZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlS2V5VmFsRGF0YShcbiAgbm9uY2VzS2V5VmFsdWVEYXRhOiBQc2J0TXVzaWcyTm9uY2VzS2V5VmFsdWVEYXRhXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSB7XG4gIGlmIChub25jZXNLZXlWYWx1ZURhdGEucHViTm9uY2VzLmxlbmd0aCAhPT0gNjYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHViTm9uY2VzIGxlbmd0aCAke25vbmNlc0tleVZhbHVlRGF0YS5wdWJOb25jZXMubGVuZ3RofWApO1xuICB9XG4gIGNvbnN0IGtleWRhdGEgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBjaGVja1BsYWluUHVibGljS2V5KG5vbmNlc0tleVZhbHVlRGF0YS5wYXJ0aWNpcGFudFB1YktleSksXG4gICAgY2hlY2tYT25seVB1YmxpY0tleShub25jZXNLZXlWYWx1ZURhdGEudGFwT3V0cHV0S2V5KSxcbiAgXSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9uY2VzS2V5VmFsdWVEYXRhLnB1Yk5vbmNlcyB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIHBhcnRpY2lwYW50IHB1YiBrZXlzXG4gKiBAcGFyYW0ga3ZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWxEYXRhKFxuICBrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZURhdGFcbik6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWx1ZURhdGEge1xuICBpZiAoXG4gICAga3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fFxuICAgIGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5c2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj4gPSBbdmFsdWUuc3ViYXJyYXkoMCwgMzMpLCB2YWx1ZS5zdWJhcnJheSgzMyldO1xuICBpZiAocGFydGljaXBhbnRQdWJLZXlzWzBdLmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgcGFydGljaXBhbnQgcHViIGtleXMgZm91bmRgKTtcbiAgfVxuXG4gIHJldHVybiB7IHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDAsIDMyKSwgdGFwSW50ZXJuYWxLZXk6IGtleS5zdWJhcnJheSgzMiksIHBhcnRpY2lwYW50UHViS2V5cyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFwSW50ZXJuYWxLZXkocGxhaW5QdWJLZXlzOiBCdWZmZXJbXSk6IEJ1ZmZlciB7XG4gIHBsYWluUHViS2V5cy5mb3JFYWNoKChwdWJLZXkpID0+IGNoZWNrUGxhaW5QdWJsaWNLZXkocHViS2V5KSk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShtdXNpZy5nZXRYT25seVB1YmtleShtdXNpZy5rZXlBZ2cobXVzaWcua2V5U29ydChwbGFpblB1YktleXMpKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFwT3V0cHV0S2V5KGludGVybmFsUHViS2V5OiBCdWZmZXIsIHRhcFRyZWVSb290OiBCdWZmZXIpOiBCdWZmZXIge1xuICBpZiAodGFwVHJlZVJvb3QubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YXBUcmVlUm9vdCBzaXplICR7dGFwVHJlZVJvb3QubGVuZ3RofWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbSh0YXBUd2Vha1B1YmtleShlY2MsIHRvWE9ubHlQdWJsaWNLZXkoaW50ZXJuYWxQdWJLZXkpLCB0YXBUcmVlUm9vdCkueE9ubHlQdWJrZXkpO1xufVxuXG5mdW5jdGlvbiBkZXJpdmVXYWxsZXRQdWJLZXkodGFwQmlwMzJEZXJpdmF0aW9uczogVGFwQmlwMzJEZXJpdmF0aW9uW10sIHJvb3RXYWxsZXRLZXk6IEJJUDMySW50ZXJmYWNlKTogQnVmZmVyIHtcbiAgY29uc3QgbXlEZXJpdmF0aW9ucyA9IHRhcEJpcDMyRGVyaXZhdGlvbnMuZmlsdGVyKChiaXBEdikgPT4ge1xuICAgIHJldHVybiBiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMocm9vdFdhbGxldEtleS5maW5nZXJwcmludCk7XG4gIH0pO1xuXG4gIGlmICghbXlEZXJpdmF0aW9ucy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCB0byBtYXRjaCB0aGUgcm9vdFdhbGxldEtleSBmaW5nZXJwcmludCcpO1xuICB9XG5cbiAgY29uc3QgbXlEZXJpdmF0aW9uID0gbXlEZXJpdmF0aW9ucy5maWx0ZXIoKGJpcER2KSA9PiB7XG4gICAgY29uc3QgcHVibGljS2V5ID0gcm9vdFdhbGxldEtleS5kZXJpdmVQYXRoKGJpcER2LnBhdGgpLnB1YmxpY0tleTtcbiAgICByZXR1cm4gYmlwRHYucHVia2V5LmVxdWFscyh0b1hPbmx5UHVibGljS2V5KHB1YmxpY0tleSkpO1xuICB9KTtcblxuICBpZiAobXlEZXJpdmF0aW9uLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncm9vdCB3YWxsZXQga2V5IHNob3VsZCBkZXJpdmUgb25lIHRhcEJpcDMyRGVyaXZhdGlvbicpO1xuICB9XG4gIHJldHVybiByb290V2FsbGV0S2V5LmRlcml2ZVBhdGgobXlEZXJpdmF0aW9uWzBdLnBhdGgpLnB1YmxpY0tleTtcbn1cblxuZnVuY3Rpb24gZ2V0TXVzaWcyTm9uY2VLZXlWYWx1ZURhdGEoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHJvb3RXYWxsZXRLZXk6IEJJUDMySW50ZXJmYWNlLFxuICBzZXNzaW9uSWQ/OiBCdWZmZXJcbik6IFByb3ByaWV0YXJ5S2V5VmFsdWVEYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBNZXJrbGVSb290IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gIH1cblxuICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBCaXAzMkRlcml2YXRpb24gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgbm9uY2UnKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRpY2lwYW50c0tleVZhbHMgPSBwc2J0LmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gIH0pO1xuXG4gIGlmIChwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aH0gbWF0Y2hpbmcgcGFydGljaXBhbnQga2V5IHZhbHVlIGluc3RlYWQgb2YgMWApO1xuICB9XG5cbiAgY29uc3QgcGFydGljaXBhbnRLZXlWYWxEYXRhID0gZGVjb2RlUHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbERhdGEocGFydGljaXBhbnRzS2V5VmFsc1swXSk7XG4gIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5cyA9IHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXM7XG5cbiAgY29uc3QgdGFwSW50ZXJuYWxLZXkgPSBjcmVhdGVUYXBJbnRlcm5hbEtleShwYXJ0aWNpcGFudFB1YktleXMpO1xuICBpZiAoIXRhcEludGVybmFsS2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50cyBrZXlhdGEgdGFwSW50ZXJuYWxLZXknKTtcbiAgfVxuXG4gIGNvbnN0IHRhcE91dHB1dEtleSA9IGNyZWF0ZVRhcE91dHB1dEtleSh0YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gIGlmICghdGFwT3V0cHV0S2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudHMga2V5YXRhIHRhcE91dHB1dEtleScpO1xuICB9XG5cbiAgaWYgKCF0YXBJbnRlcm5hbEtleS5lcXVhbHMoaW5wdXQudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBJbnRlcm5hbEtleSBhbmQgYWdncmVnYXRlZCBwYXJ0aWNpcGFudCBwdWIga2V5cyBkb2VzIG5vdCBtYXRjaCcpO1xuICB9XG5cbiAgY29uc3QgZGVyaXZlZFB1YktleSA9IGRlcml2ZVdhbGxldFB1YktleShpbnB1dC50YXBCaXAzMkRlcml2YXRpb24sIHJvb3RXYWxsZXRLZXkpO1xuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleSA9IHBhcnRpY2lwYW50UHViS2V5cy5maW5kKChwdWJLZXkpID0+IHB1YktleS5lcXVhbHMoZGVyaXZlZFB1YktleSkpO1xuXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHBhcnRpY2lwYW50UHViS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFydGljaXBhbnQgcGxhaW4gcHViIGtleSBzaG91bGQgbWF0Y2ggb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBwbGFpbiBwdWIga2V5Jyk7XG4gIH1cblxuICBjb25zdCB7IGhhc2ggfSA9IHBzYnQuZ2V0VGFwcm9vdEhhc2hGb3JTaWdDaGVja2VkKGlucHV0SW5kZXgpO1xuXG4gIGNvbnN0IG5vbmNlR2VuQXJncyA9IHtcbiAgICBzZXNzaW9uSWQsXG4gICAgcHVibGljS2V5OiBwYXJ0aWNpcGFudFB1YktleSxcbiAgICB4T25seVB1YmxpY0tleTogdGFwT3V0cHV0S2V5LFxuICAgIG1zZzogaGFzaCxcbiAgICBzZWNyZXRLZXk6IHJvb3RXYWxsZXRLZXkucHJpdmF0ZUtleSxcbiAgfTtcblxuICBjb25zdCBwdWJOb25jZXMgPSBCdWZmZXIuZnJvbShtdXNpZy5ub25jZUdlbihub25jZUdlbkFyZ3MpKTtcblxuICByZXR1cm4gZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlS2V5VmFsRGF0YSh7XG4gICAgcGFydGljaXBhbnRQdWJLZXksXG4gICAgdGFwT3V0cHV0S2V5LFxuICAgIHB1Yk5vbmNlcyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuZCBzZXRzIE11c2lnMiBub25jZXMgdG8gcDJ0ck11c2lnMiBrZXkgcGF0aCBzcGVuZGluZyBpbnB1dHMuXG4gKiB0YXBJbnRlcm5hbGtleSwgdGFwTWVya2xlUm9vdCwgdGFwQmlwMzJEZXJpdmF0aW9uIGZvciByb290V2FsbGV0S2V5IGFyZSByZXF1aXJlZCBwZXIgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbnB1dC5cbiAqIEFsc28gcGFydGljaXBhbnQga2V5cyBhcmUgcmVxdWlyZWQgZnJvbSBwc2J0IHByb3ByaWV0YXJ5IGtleSB2YWx1ZXMuXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEBwYXJhbSBwc2J0XG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleVxuICogQHBhcmFtIHNlc3Npb25JZCBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TXVzaWcyTm9uY2VzKHBzYnQ6IFV0eG9Qc2J0LCByb290V2FsbGV0S2V5OiBCSVAzMkludGVyZmFjZSwgc2Vzc2lvbklkPzogQnVmZmVyKTogdm9pZCB7XG4gIGlmIChyb290V2FsbGV0S2V5LmlzTmV1dGVyZWQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJpdmF0ZSBrZXkgaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgbm9uY2UnKTtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNlc3Npb25JZCkgJiYgc2Vzc2lvbklkLmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Vzc2lvbklkIHNpemUgJHtzZXNzaW9uSWQubGVuZ3RofWApO1xuICB9XG4gIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGlucHV0SW5kZXgpID0+IHtcbiAgICBjb25zdCBub25jZXNLZXlWYWx1ZURhdGEgPSBnZXRNdXNpZzJOb25jZUtleVZhbHVlRGF0YShwc2J0LCBpbnB1dEluZGV4LCByb290V2FsbGV0S2V5LCBzZXNzaW9uSWQpO1xuICAgIGlmIChub25jZXNLZXlWYWx1ZURhdGEpIHtcbiAgICAgIHBzYnQuYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIG5vbmNlc0tleVZhbHVlRGF0YSk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==