@bitgo/sdk-core 38.15.0 → 38.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +3 -1
  2. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  3. package/dist/src/account-lib/util/ed25519KeyDeriver.js +4 -2
  4. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +7 -1
  5. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  6. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  7. package/dist/src/bitgo/defi/defiVault.d.ts +7 -7
  8. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
  9. package/dist/src/bitgo/defi/defiVault.js +10 -10
  10. package/dist/src/bitgo/defi/iDefiVault.d.ts +7 -2
  11. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -1
  12. package/dist/src/bitgo/defi/iDefiVault.js +1 -1
  13. package/dist/src/bitgo/environments.js +3 -3
  14. package/dist/src/bitgo/keychain/iKeychains.d.ts +4 -0
  15. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  16. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  17. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  18. package/dist/src/bitgo/keychain/keychains.js +15 -15
  19. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +24 -81
  20. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
  21. package/dist/src/bitgo/safe/derivableEd25519Pub.js +117 -147
  22. package/dist/src/bitgo/safe/iSafe.d.ts +5 -2
  23. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
  24. package/dist/src/bitgo/safe/iSafe.js +1 -1
  25. package/dist/src/bitgo/safe/safe.d.ts +14 -7
  26. package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
  27. package/dist/src/bitgo/safe/safe.js +108 -30
  28. package/dist/src/bitgo/safe/safeDerivation.d.ts +13 -0
  29. package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -1
  30. package/dist/src/bitgo/safe/safeDerivation.js +30 -1
  31. package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
  32. package/dist/src/bitgo/safe/safes.js +10 -8
  33. package/dist/src/bitgo/staking/iStakingWallet.d.ts +13 -5
  34. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  35. package/dist/src/bitgo/staking/iStakingWallet.js +1 -1
  36. package/dist/src/bitgo/staking/stakingWallet.d.ts +2 -2
  37. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  38. package/dist/src/bitgo/staking/stakingWallet.js +14 -1
  39. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +4 -1
  40. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  41. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +18 -6
  42. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +9 -1
  43. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -1
  44. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +24 -3
  45. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +50 -1
  46. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -1
  47. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +154 -4
  48. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +3 -0
  49. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -1
  50. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +1 -1
  51. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
  52. package/dist/src/bitgo/utils/tss/recipientUtils.js +9 -1
  53. package/dist/src/bitgo/wallet/BuildParams.d.ts +8 -0
  54. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  55. package/dist/src/bitgo/wallet/BuildParams.js +6 -1
  56. package/dist/src/bitgo/wallet/iWallet.d.ts +5 -1
  57. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  58. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  59. package/dist/test/unit/bitgo/defi/defiVault.js +102 -1
  60. package/dist/test/unit/bitgo/keychain/keychains.js +40 -29
  61. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +72 -76
  62. package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +50 -175
  63. package/dist/test/unit/bitgo/safe/safe.js +122 -23
  64. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts +2 -0
  65. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts.map +1 -0
  66. package/dist/test/unit/bitgo/safe/safeDerivation.js +71 -0
  67. package/dist/test/unit/bitgo/safe/safes.js +23 -11
  68. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +29 -1
  69. package/dist/tsconfig.tsbuildinfo +1 -1
  70. package/package.json +5 -5
@@ -45,6 +45,7 @@ const public_types_1 = require("@bitgo/public-types");
45
45
  const statics_1 = require("@bitgo/statics");
46
46
  const errors_1 = require("../errors");
47
47
  const keychain_1 = require("../keychain");
48
+ const utils_1 = require("../utils");
48
49
  const codecs_1 = require("../utils/codecs");
49
50
  const postWithCodec_1 = require("../utils/postWithCodec");
50
51
  const wallet_1 = require("../wallet");
@@ -60,33 +61,56 @@ const GetDerivationIndexResponse = t.type({
60
61
  slot: SafeRootKeySlot,
61
62
  index: (0, codecs_1.boundedInt)(0, 0x7fffffff, 'derivationIndex'),
62
63
  });
63
- const CreateWalletInSafeBody = t.strict({
64
- coin: t.string,
65
- label: t.string,
66
- type: t.literal('hot'),
67
- multisigType: t.literal('onchain'),
68
- keys: t.tuple([t.string]),
69
- });
64
+ const CreateWalletInSafeBody = t.union([
65
+ t.strict({
66
+ coin: t.string,
67
+ label: t.string,
68
+ type: t.literal('hot'),
69
+ multisigType: t.literal('onchain'),
70
+ keys: t.tuple([t.string]),
71
+ }),
72
+ // TSS mint uses ordered user and backup child documents.
73
+ t.strict({
74
+ coin: t.string,
75
+ label: t.string,
76
+ type: t.literal('hot'),
77
+ multisigType: t.literal('tss'),
78
+ keys: t.tuple([t.string, t.string]),
79
+ }),
80
+ ]);
70
81
  function onchainSlotForCoin(coin) {
71
82
  if (coin.getDefaultMultisigType() === 'tss') {
72
- throw new Error('MPC safe wallet minting is not yet implemented; use a slot-1 onchain coin');
83
+ throw new Error('MPC safe wallet minting requires multisigType "tss"; use "onchain" for non-MPC minting');
73
84
  }
74
85
  const curve = statics_1.coins.get(coin.getChain()).primaryKeyCurve;
75
86
  if (curve === statics_1.KeyCurve.Secp256k1) {
76
87
  return 'secp256k1Multisig';
77
88
  }
78
89
  if (curve === statics_1.KeyCurve.Ed25519) {
79
- throw new Error('ed25519 coin safe wallet minting is not yet supported');
90
+ return 'ed25519Multisig';
80
91
  }
81
92
  throw new Error(`Coin '${coin.getChain()}' is not supported for safe wallet minting`);
82
93
  }
83
- function userRootIdFromSafe(safe, slot) {
94
+ function tssSlotForCoin(coin) {
95
+ if (coin.getDefaultMultisigType() !== 'tss') {
96
+ throw new Error(`Coin '${coin.getChain()}' is not a TSS coin; cannot mint a tss safe wallet for it`);
97
+ }
98
+ const curve = statics_1.coins.get(coin.getChain()).primaryKeyCurve;
99
+ if (curve === statics_1.KeyCurve.Secp256k1) {
100
+ return 'ecdsaMpc';
101
+ }
102
+ if (curve === statics_1.KeyCurve.Ed25519) {
103
+ throw new Error('ed25519 MPC safe wallet minting is not yet supported');
104
+ }
105
+ throw new Error(`Coin '${coin.getChain()}' is not supported for safe wallet minting`);
106
+ }
107
+ function rootIdFromSafe(safe, slot, position) {
84
108
  const triplet = safe.rootKeys?.hot?.[slot];
85
109
  if (!triplet || triplet.length !== 3) {
86
110
  return undefined;
87
111
  }
88
- const userRootId = triplet[0];
89
- return userRootId.length > 0 ? userRootId : undefined;
112
+ const rootId = triplet[position];
113
+ return rootId.length > 0 ? rootId : undefined;
90
114
  }
91
115
  /**
92
116
  * @experimental
@@ -116,8 +140,14 @@ class Safe {
116
140
  return this.bitgo.url(`/enterprise/${this.enterpriseId()}/safes/${this.id()}${extra}`, 2);
117
141
  }
118
142
  /**
119
- * Mint a child wallet: peek the sequential index, hardened-derive the user child,
120
- * register it public-only, then mint. Backup and BitGo children are soft-derived on the server.
143
+ * Mint a child wallet: peek the sequential index, derive the child keys, register
144
+ * them, then mint.
145
+ *
146
+ * `onchain`: hardened-derive the user child (`m/<index>'`), register it
147
+ * public-only; backup and BitGo children are soft-derived on the server.
148
+ *
149
+ * `tss`: decrypt the user root blob, run the user/BitGo hard-derive ceremony,
150
+ * register the ordered child documents, then mint.
121
151
  */
122
152
  async createWallet(params) {
123
153
  if (params.passphrase.length === 0) {
@@ -126,21 +156,31 @@ class Safe {
126
156
  if (params.type !== undefined && params.type !== 'hot') {
127
157
  throw new Error('Safe wallets are hot-only in v1');
128
158
  }
129
- if (params.multisigType === 'tss') {
130
- throw new Error('MPC safe wallet minting is not yet implemented; use multisigType "onchain"');
131
- }
159
+ const isTss = params.multisigType === 'tss';
132
160
  const coin = this.bitgo.coin(params.coin);
133
- const slot = onchainSlotForCoin(coin);
161
+ const slot = isTss ? tssSlotForCoin(coin) : onchainSlotForCoin(coin);
134
162
  const indexResponse = await this.bitgo.get(this.url('/derivation-index')).query({ slot }).result();
135
163
  const peeked = (0, codecs_1.decodeWithCodec)(GetDerivationIndexResponse, indexResponse, 'GetDerivationIndexResponse');
136
164
  if (peeked.slot !== slot) {
137
165
  throw new Error(`derivation-index returned slot '${peeked.slot}', expected '${slot}'`);
138
166
  }
139
167
  const { index } = peeked;
140
- const userRootId = userRootIdFromSafe(this._safe, slot) ?? userRootIdFromSafe(await this.fetchSafeData(), slot);
168
+ const safeData = rootIdFromSafe(this._safe, slot, 0) !== undefined ? this._safe : await this.fetchSafeData();
169
+ const userRootId = rootIdFromSafe(safeData, slot, 0);
141
170
  if (userRootId === undefined) {
142
171
  throw new Error(`Safe ${this.id()} is missing rootKeys.hot.${slot}`);
143
172
  }
173
+ if (isTss) {
174
+ const backupRootId = rootIdFromSafe(safeData, slot, 1);
175
+ const bitgoRootId = rootIdFromSafe(safeData, slot, 2);
176
+ if (backupRootId === undefined) {
177
+ throw new Error(`Safe ${this.id()} is missing rootKeys.hot.${slot} backup key`);
178
+ }
179
+ if (bitgoRootId === undefined) {
180
+ throw new Error(`Safe ${this.id()} is missing rootKeys.hot.${slot} bitgo key`);
181
+ }
182
+ return this.createTssWalletInSafe(coin, userRootId, backupRootId, bitgoRootId, index, params);
183
+ }
144
184
  const keychains = coin.keychains();
145
185
  const rootKeychain = await keychains.get({ id: userRootId });
146
186
  if (rootKeychain.source !== 'user') {
@@ -150,7 +190,9 @@ class Safe {
150
190
  if (!rootPrv) {
151
191
  throw new errors_1.IncorrectPasswordError();
152
192
  }
153
- const derived = (0, safeDerivation_1.deriveAndSelfCheckSafeChildHardened)(rootPrv, index);
193
+ const derived = slot === 'ed25519Multisig'
194
+ ? (0, safeDerivation_1.deriveSafeChildEd25519Hardened)(rootPrv, index)
195
+ : (0, safeDerivation_1.deriveAndSelfCheckSafeChildHardened)(rootPrv, index);
154
196
  const derivedFromParentWithHardenedPath = (0, codecs_1.decodeWithCodec)(safeDerivation_1.DerivedFromParentWithHardenedPath, derived.derivationPath, 'derivedFromParentWithHardenedPath');
155
197
  const child = await keychains.add({
156
198
  pub: derived.pub,
@@ -174,37 +216,73 @@ class Safe {
174
216
  }).result();
175
217
  return new wallet_1.Wallet(this.bitgo, coin, response);
176
218
  }
219
+ /**
220
+ * TSS wallet mint: decrypt the user root blob, run the user/BitGo hard-derive
221
+ * ceremony, register the ordered child documents, then mint.
222
+ */
223
+ async createTssWalletInSafe(coin, userRootId, backupRootId, bitgoRootId, index, params) {
224
+ const keychains = coin.keychains();
225
+ const userRootKeychain = await keychains.get({ id: userRootId });
226
+ if (userRootKeychain.source !== 'user') {
227
+ throw new safeKeychain_1.InvalidRootKeychainSourceError(userRootKeychain.id, userRootKeychain.source);
228
+ }
229
+ const userRootPrv = await (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, userRootKeychain, params.passphrase);
230
+ if (!userRootPrv) {
231
+ throw new errors_1.IncorrectPasswordError();
232
+ }
233
+ const userRootMaterial = utils_1.ECDSAUtils.parseVrfKeyEnvelopes(userRootPrv);
234
+ const tssUtils = new utils_1.ECDSAUtils.EcdsaVrfMPCv2Utils(this.bitgo, coin);
235
+ const { userKeychain, backupKeychain } = await tssUtils.createSafeChildKeychains({
236
+ passphrase: params.passphrase,
237
+ enterprise: this.enterpriseId(),
238
+ safeId: this.id(),
239
+ parentKeyId: bitgoRootId,
240
+ derivationIndex: index,
241
+ userRootKeyId: userRootId,
242
+ backupRootKeyId: backupRootId,
243
+ userRootKeyShare: userRootMaterial.signing,
244
+ userRootVrfKeyShare: userRootMaterial.vrf,
245
+ });
246
+ if (userKeychain.id.length === 0 || backupKeychain.id.length === 0) {
247
+ throw new Error('safe child key registration returned an empty id');
248
+ }
249
+ const keys = [userKeychain.id, backupKeychain.id];
250
+ const response = await (0, postWithCodec_1.postWithCodec)(this.bitgo, this.url('/wallets'), CreateWalletInSafeBody, {
251
+ coin: params.coin,
252
+ label: params.label,
253
+ type: 'hot',
254
+ multisigType: 'tss',
255
+ keys,
256
+ }).result();
257
+ return new wallet_1.Wallet(this.bitgo, coin, response);
258
+ }
177
259
  async fetchSafeData() {
178
260
  const response = await this.bitgo.get(this.url()).result();
179
261
  return (0, codecs_1.decodeWithCodec)(public_types_1.SafeData, response, 'SafeData');
180
262
  }
181
263
  /**
182
264
  * Add a member to the whole safe (view/admin/spend). Spend opens a key share.
183
- * Body lands in WCN-1204.
184
265
  */
185
266
  async addMember(params) {
186
- throw new Error('Safe.addMember is not yet implemented (WCN-1204)');
267
+ throw new Error('Safe.addMember is not yet implemented');
187
268
  }
188
269
  /**
189
- * Share ONE safe wallet with a non-member via the existing wallet-share handshake (FR-13).
190
- * Body lands in WCN-1204.
270
+ * Share ONE safe wallet with a non-member via the existing wallet-share handshake.
191
271
  */
192
272
  async addMemberToWallet(params) {
193
- throw new Error('Safe.addMemberToWallet is not yet implemented (WCN-1204)');
273
+ throw new Error('Safe.addMemberToWallet is not yet implemented');
194
274
  }
195
275
  /**
196
276
  * List the safe key shares visible to the caller.
197
- * Body lands in WCN-1204.
198
277
  */
199
278
  async listShares(params = {}) {
200
- throw new Error('Safe.listShares is not yet implemented (WCN-1204)');
279
+ throw new Error('Safe.listShares is not yet implemented');
201
280
  }
202
281
  /**
203
282
  * Accept a safe key share addressed to the caller.
204
- * Body lands in WCN-1204.
205
283
  */
206
284
  async acceptShare(params) {
207
- throw new Error('Safe.acceptShare is not yet implemented (WCN-1204)');
285
+ throw new Error('Safe.acceptShare is not yet implemented');
208
286
  }
209
287
  /**
210
288
  * Freeze the safe — blocks withdrawals on all safe wallets. Safe stays 'active'.
@@ -227,4 +305,4 @@ class Safe {
227
305
  }
228
306
  }
229
307
  exports.Safe = Safe;
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7O0dBS0c7QUFDSCx5Q0FBMkI7QUFDM0Isc0RBQWdIO0FBQ2hILDRDQUFpRDtBQUdqRCxzQ0FBbUQ7QUFDbkQsMENBQXdEO0FBQ3hELDRDQUE4RDtBQUM5RCwwREFBdUQ7QUFDdkQsc0NBQW1DO0FBQ25DLHlEQUF3RTtBQVN4RSxxREFBMEc7QUFFMUcsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QixpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBUSxFQUFFLElBQUk7SUFDZCxlQUFlLEVBQUUsSUFBSTtDQUN0QixDQUFDLENBQUM7QUFFSCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEMsSUFBSSxFQUFFLGVBQWU7SUFDckIsS0FBSyxFQUFFLElBQUEsbUJBQVUsRUFBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDO0NBQ3BELENBQUMsQ0FBQztBQUVILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDZixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ2xDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0NBQzFCLENBQUMsQ0FBQztBQUVILFNBQVMsa0JBQWtCLENBQUMsSUFBZTtJQUN6QyxJQUFJLElBQUks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RyxDQUFDLFNBQVMsQ0FBQyxFQUFFLDZCQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkcsT0FBTyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0UsT0FBTyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBbEtELG9CQWtLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgc2FmZSBjbGllbnQgc3VyZmFjZSBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgKGluY2x1ZGluZyBicmVha2luZ1xuICogY2hhbmdlcykgYmVmb3JlIHRoZSBwdWJsaWMgcmVsZWFzZS5cbiAqL1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgeyBGcmVlemVTYWZlQm9keSwgU2FmZURhdGEsIFNhZmVTaGFyZURhdGEsIFNhZmVTaGFyZVN0YXRlLCB0eXBlIFJvb3RLZXlUeXBlIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBjb2lucywgS2V5Q3VydmUgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBJQmFzZUNvaW4gfSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5IH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgYm91bmRlZEludCwgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IHBvc3RXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9wb3N0V2l0aENvZGVjJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uL3dhbGxldCc7XG5pbXBvcnQgeyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IgfSBmcm9tICcuLi93YWxsZXQvc2FmZUtleWNoYWluJztcbmltcG9ydCB7XG4gIEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMsXG4gIEFkZFNhZmVNZW1iZXJPcHRpb25zLFxuICBBZGRTYWZlV2FsbGV0TWVtYmVyT3B0aW9ucyxcbiAgQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMsXG4gIElTYWZlLFxuICBXYWxsZXRTaGFyZURhdGEsXG59IGZyb20gJy4vaVNhZmUnO1xuaW1wb3J0IHsgZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQsIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCB9IGZyb20gJy4vc2FmZURlcml2YXRpb24nO1xuXG5jb25zdCBTYWZlUm9vdEtleVNsb3QgPSB0LmtleW9mKHtcbiAgc2VjcDI1NmsxTXVsdGlzaWc6IG51bGwsXG4gIGVjZHNhTXBjOiBudWxsLFxuICBlZGRzYU1wYzogbnVsbCxcbiAgZWQyNTUxOU11bHRpc2lnOiBudWxsLFxufSk7XG5cbmNvbnN0IEdldERlcml2YXRpb25JbmRleFJlc3BvbnNlID0gdC50eXBlKHtcbiAgc2xvdDogU2FmZVJvb3RLZXlTbG90LFxuICBpbmRleDogYm91bmRlZEludCgwLCAweDdmZmZmZmZmLCAnZGVyaXZhdGlvbkluZGV4JyksXG59KTtcblxuY29uc3QgQ3JlYXRlV2FsbGV0SW5TYWZlQm9keSA9IHQuc3RyaWN0KHtcbiAgY29pbjogdC5zdHJpbmcsXG4gIGxhYmVsOiB0LnN0cmluZyxcbiAgdHlwZTogdC5saXRlcmFsKCdob3QnKSxcbiAgbXVsdGlzaWdUeXBlOiB0LmxpdGVyYWwoJ29uY2hhaW4nKSxcbiAga2V5czogdC50dXBsZShbdC5zdHJpbmddKSxcbn0pO1xuXG5mdW5jdGlvbiBvbmNoYWluU2xvdEZvckNvaW4oY29pbjogSUJhc2VDb2luKTogRXh0cmFjdDxSb290S2V5VHlwZSwgJ3NlY3AyNTZrMU11bHRpc2lnJz4ge1xuICBpZiAoY29pbi5nZXREZWZhdWx0TXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNUEMgc2FmZSB3YWxsZXQgbWludGluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkOyB1c2UgYSBzbG90LTEgb25jaGFpbiBjb2luJyk7XG4gIH1cbiAgY29uc3QgY3VydmUgPSBjb2lucy5nZXQoY29pbi5nZXRDaGFpbigpKS5wcmltYXJ5S2V5Q3VydmU7XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuU2VjcDI1NmsxKSB7XG4gICAgcmV0dXJuICdzZWNwMjU2azFNdWx0aXNpZyc7XG4gIH1cbiAgaWYgKGN1cnZlID09PSBLZXlDdXJ2ZS5FZDI1NTE5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdlZDI1NTE5IGNvaW4gc2FmZSB3YWxsZXQgbWludGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZCcpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ29pbiAnJHtjb2luLmdldENoYWluKCl9JyBpcyBub3Qgc3VwcG9ydGVkIGZvciBzYWZlIHdhbGxldCBtaW50aW5nYCk7XG59XG5cbmZ1bmN0aW9uIHVzZXJSb290SWRGcm9tU2FmZShzYWZlOiBTYWZlRGF0YSwgc2xvdDogUm9vdEtleVR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmlwbGV0ID0gc2FmZS5yb290S2V5cz8uaG90Py5bc2xvdF07XG4gIGlmICghdHJpcGxldCB8fCB0cmlwbGV0Lmxlbmd0aCAhPT0gMykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdXNlclJvb3RJZCA9IHRyaXBsZXRbMF07XG4gIHJldHVybiB1c2VyUm9vdElkLmxlbmd0aCA+IDAgPyB1c2VyUm9vdElkIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNhZmUgaW1wbGVtZW50cyBJU2FmZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IF9zYWZlOiBTYWZlRGF0YTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzYWZlRGF0YTogU2FmZURhdGEpIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5fc2FmZSA9IHNhZmVEYXRhO1xuICB9XG5cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5pZDtcbiAgfVxuXG4gIGVudGVycHJpc2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmVudGVycHJpc2VJZDtcbiAgfVxuXG4gIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUubGFiZWw7XG4gIH1cblxuICBzdGF0dXMoKTogU2FmZURhdGFbJ3N0YXR1cyddIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXJwcmlzZS1zY29wZWQgdjIgVVJMIGZvciB0aGlzIHNhZmUsIGUuZy4gL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMvOnNhZmVJZFxuICAgKiBAcGFyYW0gZXh0cmFcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7dGhpcy5lbnRlcnByaXNlSWQoKX0vc2FmZXMvJHt0aGlzLmlkKCl9JHtleHRyYX1gLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGEgY2hpbGQgd2FsbGV0OiBwZWVrIHRoZSBzZXF1ZW50aWFsIGluZGV4LCBoYXJkZW5lZC1kZXJpdmUgdGhlIHVzZXIgY2hpbGQsXG4gICAqIHJlZ2lzdGVyIGl0IHB1YmxpYy1vbmx5LCB0aGVuIG1pbnQuIEJhY2t1cCBhbmQgQml0R28gY2hpbGRyZW4gYXJlIHNvZnQtZGVyaXZlZCBvbiB0aGUgc2VydmVyLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2FsbGV0KHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGlmIChwYXJhbXMucGFzc3BocmFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3BocmFzZSBpcyByZXF1aXJlZCB0byBtaW50IGEgc2FmZSB3YWxsZXQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnR5cGUgIT09ICdob3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUgd2FsbGV0cyBhcmUgaG90LW9ubHkgaW4gdjEnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01QQyBzYWZlIHdhbGxldCBtaW50aW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQ7IHVzZSBtdWx0aXNpZ1R5cGUgXCJvbmNoYWluXCInKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2luID0gdGhpcy5iaXRnby5jb2luKHBhcmFtcy5jb2luKTtcbiAgICBjb25zdCBzbG90ID0gb25jaGFpblNsb3RGb3JDb2luKGNvaW4pO1xuXG4gICAgY29uc3QgaW5kZXhSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvZGVyaXZhdGlvbi1pbmRleCcpKS5xdWVyeSh7IHNsb3QgfSkucmVzdWx0KCk7XG4gICAgY29uc3QgcGVla2VkID0gZGVjb2RlV2l0aENvZGVjKEdldERlcml2YXRpb25JbmRleFJlc3BvbnNlLCBpbmRleFJlc3BvbnNlLCAnR2V0RGVyaXZhdGlvbkluZGV4UmVzcG9uc2UnKTtcbiAgICBpZiAocGVla2VkLnNsb3QgIT09IHNsb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGVyaXZhdGlvbi1pbmRleCByZXR1cm5lZCBzbG90ICcke3BlZWtlZC5zbG90fScsIGV4cGVjdGVkICcke3Nsb3R9J2ApO1xuICAgIH1cbiAgICBjb25zdCB7IGluZGV4IH0gPSBwZWVrZWQ7XG5cbiAgICBjb25zdCB1c2VyUm9vdElkID0gdXNlclJvb3RJZEZyb21TYWZlKHRoaXMuX3NhZmUsIHNsb3QpID8/IHVzZXJSb290SWRGcm9tU2FmZShhd2FpdCB0aGlzLmZldGNoU2FmZURhdGEoKSwgc2xvdCk7XG4gICAgaWYgKHVzZXJSb290SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTYWZlICR7dGhpcy5pZCgpfSBpcyBtaXNzaW5nIHJvb3RLZXlzLmhvdC4ke3Nsb3R9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gY29pbi5rZXljaGFpbnMoKTtcbiAgICBjb25zdCByb290S2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgaWYgKHJvb3RLZXljaGFpbi5zb3VyY2UgIT09ICd1c2VyJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSb290S2V5Y2hhaW5Tb3VyY2VFcnJvcihyb290S2V5Y2hhaW4uaWQsIHJvb3RLZXljaGFpbi5zb3VyY2UpO1xuICAgIH1cbiAgICBjb25zdCByb290UHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCByb290S2V5Y2hhaW4sIHBhcmFtcy5wYXNzcGhyYXNlKTtcbiAgICBpZiAoIXJvb3RQcnYpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZUFuZFNlbGZDaGVja1NhZmVDaGlsZEhhcmRlbmVkKHJvb3RQcnYsIGluZGV4KTtcbiAgICBjb25zdCBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gICAgICBkZXJpdmVkLmRlcml2YXRpb25QYXRoLFxuICAgICAgJ2Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCdcbiAgICApO1xuXG4gICAgY29uc3QgY2hpbGQgPSBhd2FpdCBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHB1YjogZGVyaXZlZC5wdWIsXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICBwYXJlbnQ6IHVzZXJSb290SWQsXG4gICAgICBzYWZlSWQ6IHRoaXMuaWQoKSxcbiAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGg6IGRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCxcbiAgICB9KTtcbiAgICBjb25zdCBjaGlsZElkID0gY2hpbGQuaWQ7XG4gICAgaWYgKGNoaWxkSWQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NhZmUgY2hpbGQga2V5IHJlZ2lzdHJhdGlvbiByZXR1cm5lZCBhbiBlbXB0eSBpZCcpO1xuICAgIH1cbiAgICBjb25zdCBrZXlzOiBbc3RyaW5nXSA9IFtjaGlsZElkXTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyh0aGlzLmJpdGdvLCB0aGlzLnVybCgnL3dhbGxldHMnKSwgQ3JlYXRlV2FsbGV0SW5TYWZlQm9keSwge1xuICAgICAgY29pbjogcGFyYW1zLmNvaW4sXG4gICAgICBsYWJlbDogcGFyYW1zLmxhYmVsLFxuICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyxcbiAgICAgIGtleXMsXG4gICAgfSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcy5iaXRnbywgY29pbiwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNhZmVEYXRhKCk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBtZW1iZXIgdG8gdGhlIHdob2xlIHNhZmUgKHZpZXcvYWRtaW4vc3BlbmQpLiBTcGVuZCBvcGVucyBhIGtleSBzaGFyZS5cbiAgICogQm9keSBsYW5kcyBpbiBXQ04tMTIwNC5cbiAgICovXG4gIGFzeW5jIGFkZE1lbWJlcihwYXJhbXM6IEFkZFNhZmVNZW1iZXJPcHRpb25zKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hZGRNZW1iZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAoV0NOLTEyMDQpJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgT05FIHNhZmUgd2FsbGV0IHdpdGggYSBub24tbWVtYmVyIHZpYSB0aGUgZXhpc3Rpbmcgd2FsbGV0LXNoYXJlIGhhbmRzaGFrZSAoRlItMTMpLlxuICAgKiBCb2R5IGxhbmRzIGluIFdDTi0xMjA0LlxuICAgKi9cbiAgYXN5bmMgYWRkTWVtYmVyVG9XYWxsZXQocGFyYW1zOiBBZGRTYWZlV2FsbGV0TWVtYmVyT3B0aW9ucyk6IFByb21pc2U8V2FsbGV0U2hhcmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFkZE1lbWJlclRvV2FsbGV0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKFdDTi0xMjA0KScpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHNhZmUga2V5IHNoYXJlcyB2aXNpYmxlIHRvIHRoZSBjYWxsZXIuXG4gICAqIEJvZHkgbGFuZHMgaW4gV0NOLTEyMDQuXG4gICAqL1xuICBhc3luYyBsaXN0U2hhcmVzKHBhcmFtczogeyBzdGF0ZT86IFNhZmVTaGFyZVN0YXRlIH0gPSB7fSk6IFByb21pc2U8U2FmZVNoYXJlRGF0YVtdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmxpc3RTaGFyZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAoV0NOLTEyMDQpJyk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IGEgc2FmZSBrZXkgc2hhcmUgYWRkcmVzc2VkIHRvIHRoZSBjYWxsZXIuXG4gICAqIEJvZHkgbGFuZHMgaW4gV0NOLTEyMDQuXG4gICAqL1xuICBhc3luYyBhY2NlcHRTaGFyZShwYXJhbXM6IEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMpOiBQcm9taXNlPFNhZmVTaGFyZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWNjZXB0U2hhcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAoV0NOLTEyMDQpJyk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIHRoZSBzYWZlIOKAlCBibG9ja3Mgd2l0aGRyYXdhbHMgb24gYWxsIHNhZmUgd2FsbGV0cy4gU2FmZSBzdGF5cyAnYWN0aXZlJy5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZnJlZXplKHBhcmFtczogRnJlZXplU2FmZUJvZHkgPSB7fSk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoJy9mcmVlemUnKSwgRnJlZXplU2FmZUJvZHksIHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFyY2hpdmUgdGhlIHNhZmUuIFJlcXVpcmVzIGV2ZXJ5IHNhZmUgd2FsbGV0IHRvIGFscmVhZHkgYmUgYXJjaGl2ZWQ7IGFsc28gdGhlIGFiYW5kb25tZW50XG4gICAqIHBhdGggZm9yIGEgc3R1Y2sgJ2luaXRpYWxpemluZycgc2FmZS5cbiAgICovXG4gIGFzeW5jIGFyY2hpdmUoKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvYXJjaGl2ZScpKS5zZW5kKCkucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgdG9KU09OKCk6IFNhZmVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZTtcbiAgfVxufVxuIl19
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7O0dBS0c7QUFDSCx5Q0FBMkI7QUFDM0Isc0RBQWdIO0FBQ2hILDRDQUFpRDtBQUdqRCxzQ0FBbUQ7QUFDbkQsMENBQXdEO0FBQ3hELG9DQUFzQztBQUN0Qyw0Q0FBOEQ7QUFDOUQsMERBQXVEO0FBQ3ZELHNDQUFtQztBQUNuQyx5REFBd0U7QUFTeEUscURBSTBCO0FBRTFCLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixRQUFRLEVBQUUsSUFBSTtJQUNkLFFBQVEsRUFBRSxJQUFJO0lBQ2QsZUFBZSxFQUFFLElBQUk7Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hDLElBQUksRUFBRSxlQUFlO0lBQ3JCLEtBQUssRUFBRSxJQUFBLG1CQUFVLEVBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQztDQUNwRCxDQUFDLENBQUM7QUFFSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTTtRQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTTtRQUNmLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUN0QixZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDMUIsQ0FBQztJQUNGLHlEQUF5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IFRoZSBzYWZlIGNsaWVudCBzdXJmYWNlIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSAoaW5jbHVkaW5nIGJyZWFraW5nXG4gKiBjaGFuZ2VzKSBiZWZvcmUgdGhlIHB1YmxpYyByZWxlYXNlLlxuICovXG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCB7IEZyZWV6ZVNhZmVCb2R5LCBTYWZlRGF0YSwgU2FmZVNoYXJlRGF0YSwgU2FmZVNoYXJlU3RhdGUsIHR5cGUgUm9vdEtleVR5cGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IGNvaW5zLCBLZXlDdXJ2ZSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IElCYXNlQ29pbiB9IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBJbmNvcnJlY3RQYXNzd29yZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkgfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBFQ0RTQVV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgYm91bmRlZEludCwgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IHBvc3RXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9wb3N0V2l0aENvZGVjJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uL3dhbGxldCc7XG5pbXBvcnQgeyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IgfSBmcm9tICcuLi93YWxsZXQvc2FmZUtleWNoYWluJztcbmltcG9ydCB7XG4gIEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMsXG4gIEFkZFNhZmVNZW1iZXJPcHRpb25zLFxuICBBZGRTYWZlV2FsbGV0TWVtYmVyT3B0aW9ucyxcbiAgQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMsXG4gIElTYWZlLFxuICBXYWxsZXRTaGFyZURhdGEsXG59IGZyb20gJy4vaVNhZmUnO1xuaW1wb3J0IHtcbiAgZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQsXG4gIGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZCxcbiAgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLFxufSBmcm9tICcuL3NhZmVEZXJpdmF0aW9uJztcblxuY29uc3QgU2FmZVJvb3RLZXlTbG90ID0gdC5rZXlvZih7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiBudWxsLFxuICBlY2RzYU1wYzogbnVsbCxcbiAgZWRkc2FNcGM6IG51bGwsXG4gIGVkMjU1MTlNdWx0aXNpZzogbnVsbCxcbn0pO1xuXG5jb25zdCBHZXREZXJpdmF0aW9uSW5kZXhSZXNwb25zZSA9IHQudHlwZSh7XG4gIHNsb3Q6IFNhZmVSb290S2V5U2xvdCxcbiAgaW5kZXg6IGJvdW5kZWRJbnQoMCwgMHg3ZmZmZmZmZiwgJ2Rlcml2YXRpb25JbmRleCcpLFxufSk7XG5cbmNvbnN0IENyZWF0ZVdhbGxldEluU2FmZUJvZHkgPSB0LnVuaW9uKFtcbiAgdC5zdHJpY3Qoe1xuICAgIGNvaW46IHQuc3RyaW5nLFxuICAgIGxhYmVsOiB0LnN0cmluZyxcbiAgICB0eXBlOiB0LmxpdGVyYWwoJ2hvdCcpLFxuICAgIG11bHRpc2lnVHlwZTogdC5saXRlcmFsKCdvbmNoYWluJyksXG4gICAga2V5czogdC50dXBsZShbdC5zdHJpbmddKSxcbiAgfSksXG4gIC8vIFRTUyBtaW50IHVzZXMgb3JkZXJlZCB1c2VyIGFuZCBiYWNrdXAgY2hpbGQgZG9jdW1lbnRzLlxuICB0LnN0cmljdCh7XG4gICAgY29pbjogdC5zdHJpbmcsXG4gICAgbGFiZWw6IHQuc3RyaW5nLFxuICAgIHR5cGU6IHQubGl0ZXJhbCgnaG90JyksXG4gICAgbXVsdGlzaWdUeXBlOiB0LmxpdGVyYWwoJ3RzcycpLFxuICAgIGtleXM6IHQudHVwbGUoW3Quc3RyaW5nLCB0LnN0cmluZ10pLFxuICB9KSxcbl0pO1xuXG5mdW5jdGlvbiBvbmNoYWluU2xvdEZvckNvaW4oY29pbjogSUJhc2VDb2luKTogRXh0cmFjdDxSb290S2V5VHlwZSwgJ3NlY3AyNTZrMU11bHRpc2lnJyB8ICdlZDI1NTE5TXVsdGlzaWcnPiB7XG4gIGlmIChjb2luLmdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01QQyBzYWZlIHdhbGxldCBtaW50aW5nIHJlcXVpcmVzIG11bHRpc2lnVHlwZSBcInRzc1wiOyB1c2UgXCJvbmNoYWluXCIgZm9yIG5vbi1NUEMgbWludGluZycpO1xuICB9XG4gIGNvbnN0IGN1cnZlID0gY29pbnMuZ2V0KGNvaW4uZ2V0Q2hhaW4oKSkucHJpbWFyeUtleUN1cnZlO1xuICBpZiAoY3VydmUgPT09IEtleUN1cnZlLlNlY3AyNTZrMSkge1xuICAgIHJldHVybiAnc2VjcDI1NmsxTXVsdGlzaWcnO1xuICB9XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuRWQyNTUxOSkge1xuICAgIHJldHVybiAnZWQyNTUxOU11bHRpc2lnJztcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYENvaW4gJyR7Y29pbi5nZXRDaGFpbigpfScgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2FmZSB3YWxsZXQgbWludGluZ2ApO1xufVxuXG5mdW5jdGlvbiB0c3NTbG90Rm9yQ29pbihjb2luOiBJQmFzZUNvaW4pOiBFeHRyYWN0PFJvb3RLZXlUeXBlLCAnZWNkc2FNcGMnPiB7XG4gIGlmIChjb2luLmdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKSAhPT0gJ3RzcycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvaW4gJyR7Y29pbi5nZXRDaGFpbigpfScgaXMgbm90IGEgVFNTIGNvaW47IGNhbm5vdCBtaW50IGEgdHNzIHNhZmUgd2FsbGV0IGZvciBpdGApO1xuICB9XG4gIGNvbnN0IGN1cnZlID0gY29pbnMuZ2V0KGNvaW4uZ2V0Q2hhaW4oKSkucHJpbWFyeUtleUN1cnZlO1xuICBpZiAoY3VydmUgPT09IEtleUN1cnZlLlNlY3AyNTZrMSkge1xuICAgIHJldHVybiAnZWNkc2FNcGMnO1xuICB9XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuRWQyNTUxOSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZWQyNTUxOSBNUEMgc2FmZSB3YWxsZXQgbWludGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZCcpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ29pbiAnJHtjb2luLmdldENoYWluKCl9JyBpcyBub3Qgc3VwcG9ydGVkIGZvciBzYWZlIHdhbGxldCBtaW50aW5nYCk7XG59XG5cbmZ1bmN0aW9uIHJvb3RJZEZyb21TYWZlKHNhZmU6IFNhZmVEYXRhLCBzbG90OiBSb290S2V5VHlwZSwgcG9zaXRpb246IDAgfCAxIHwgMik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaXBsZXQgPSBzYWZlLnJvb3RLZXlzPy5ob3Q/LltzbG90XTtcbiAgaWYgKCF0cmlwbGV0IHx8IHRyaXBsZXQubGVuZ3RoICE9PSAzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByb290SWQgPSB0cmlwbGV0W3Bvc2l0aW9uXTtcbiAgcmV0dXJuIHJvb3RJZC5sZW5ndGggPiAwID8gcm9vdElkIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNhZmUgaW1wbGVtZW50cyBJU2FmZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IF9zYWZlOiBTYWZlRGF0YTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzYWZlRGF0YTogU2FmZURhdGEpIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5fc2FmZSA9IHNhZmVEYXRhO1xuICB9XG5cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5pZDtcbiAgfVxuXG4gIGVudGVycHJpc2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmVudGVycHJpc2VJZDtcbiAgfVxuXG4gIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUubGFiZWw7XG4gIH1cblxuICBzdGF0dXMoKTogU2FmZURhdGFbJ3N0YXR1cyddIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXJwcmlzZS1zY29wZWQgdjIgVVJMIGZvciB0aGlzIHNhZmUsIGUuZy4gL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMvOnNhZmVJZFxuICAgKiBAcGFyYW0gZXh0cmFcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7dGhpcy5lbnRlcnByaXNlSWQoKX0vc2FmZXMvJHt0aGlzLmlkKCl9JHtleHRyYX1gLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGEgY2hpbGQgd2FsbGV0OiBwZWVrIHRoZSBzZXF1ZW50aWFsIGluZGV4LCBkZXJpdmUgdGhlIGNoaWxkIGtleXMsIHJlZ2lzdGVyXG4gICAqIHRoZW0sIHRoZW4gbWludC5cbiAgICpcbiAgICogYG9uY2hhaW5gOiBoYXJkZW5lZC1kZXJpdmUgdGhlIHVzZXIgY2hpbGQgKGBtLzxpbmRleD4nYCksIHJlZ2lzdGVyIGl0XG4gICAqIHB1YmxpYy1vbmx5OyBiYWNrdXAgYW5kIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgb24gdGhlIHNlcnZlci5cbiAgICpcbiAgICogYHRzc2A6IGRlY3J5cHQgdGhlIHVzZXIgcm9vdCBibG9iLCBydW4gdGhlIHVzZXIvQml0R28gaGFyZC1kZXJpdmUgY2VyZW1vbnksXG4gICAqIHJlZ2lzdGVyIHRoZSBvcmRlcmVkIGNoaWxkIGRvY3VtZW50cywgdGhlbiBtaW50LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2FsbGV0KHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGlmIChwYXJhbXMucGFzc3BocmFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3BocmFzZSBpcyByZXF1aXJlZCB0byBtaW50IGEgc2FmZSB3YWxsZXQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnR5cGUgIT09ICdob3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUgd2FsbGV0cyBhcmUgaG90LW9ubHkgaW4gdjEnKTtcbiAgICB9XG4gICAgY29uc3QgaXNUc3MgPSBwYXJhbXMubXVsdGlzaWdUeXBlID09PSAndHNzJztcblxuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJpdGdvLmNvaW4ocGFyYW1zLmNvaW4pO1xuICAgIGNvbnN0IHNsb3QgPSBpc1RzcyA/IHRzc1Nsb3RGb3JDb2luKGNvaW4pIDogb25jaGFpblNsb3RGb3JDb2luKGNvaW4pO1xuXG4gICAgY29uc3QgaW5kZXhSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvZGVyaXZhdGlvbi1pbmRleCcpKS5xdWVyeSh7IHNsb3QgfSkucmVzdWx0KCk7XG4gICAgY29uc3QgcGVla2VkID0gZGVjb2RlV2l0aENvZGVjKEdldERlcml2YXRpb25JbmRleFJlc3BvbnNlLCBpbmRleFJlc3BvbnNlLCAnR2V0RGVyaXZhdGlvbkluZGV4UmVzcG9uc2UnKTtcbiAgICBpZiAocGVla2VkLnNsb3QgIT09IHNsb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGVyaXZhdGlvbi1pbmRleCByZXR1cm5lZCBzbG90ICcke3BlZWtlZC5zbG90fScsIGV4cGVjdGVkICcke3Nsb3R9J2ApO1xuICAgIH1cbiAgICBjb25zdCB7IGluZGV4IH0gPSBwZWVrZWQ7XG5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHJvb3RJZEZyb21TYWZlKHRoaXMuX3NhZmUsIHNsb3QsIDApICE9PSB1bmRlZmluZWQgPyB0aGlzLl9zYWZlIDogYXdhaXQgdGhpcy5mZXRjaFNhZmVEYXRhKCk7XG4gICAgY29uc3QgdXNlclJvb3RJZCA9IHJvb3RJZEZyb21TYWZlKHNhZmVEYXRhLCBzbG90LCAwKTtcbiAgICBpZiAodXNlclJvb3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgJHt0aGlzLmlkKCl9IGlzIG1pc3Npbmcgcm9vdEtleXMuaG90LiR7c2xvdH1gKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUc3MpIHtcbiAgICAgIGNvbnN0IGJhY2t1cFJvb3RJZCA9IHJvb3RJZEZyb21TYWZlKHNhZmVEYXRhLCBzbG90LCAxKTtcbiAgICAgIGNvbnN0IGJpdGdvUm9vdElkID0gcm9vdElkRnJvbVNhZmUoc2FmZURhdGEsIHNsb3QsIDIpO1xuICAgICAgaWYgKGJhY2t1cFJvb3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSAke3RoaXMuaWQoKX0gaXMgbWlzc2luZyByb290S2V5cy5ob3QuJHtzbG90fSBiYWNrdXAga2V5YCk7XG4gICAgICB9XG4gICAgICBpZiAoYml0Z29Sb290SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgJHt0aGlzLmlkKCl9IGlzIG1pc3Npbmcgcm9vdEtleXMuaG90LiR7c2xvdH0gYml0Z28ga2V5YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVUc3NXYWxsZXRJblNhZmUoY29pbiwgdXNlclJvb3RJZCwgYmFja3VwUm9vdElkLCBiaXRnb1Jvb3RJZCwgaW5kZXgsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gY29pbi5rZXljaGFpbnMoKTtcbiAgICBjb25zdCByb290S2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgaWYgKHJvb3RLZXljaGFpbi5zb3VyY2UgIT09ICd1c2VyJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSb290S2V5Y2hhaW5Tb3VyY2VFcnJvcihyb290S2V5Y2hhaW4uaWQsIHJvb3RLZXljaGFpbi5zb3VyY2UpO1xuICAgIH1cbiAgICBjb25zdCByb290UHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCByb290S2V5Y2hhaW4sIHBhcmFtcy5wYXNzcGhyYXNlKTtcbiAgICBpZiAoIXJvb3RQcnYpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVyaXZlZCA9XG4gICAgICBzbG90ID09PSAnZWQyNTUxOU11bHRpc2lnJ1xuICAgICAgICA/IGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZChyb290UHJ2LCBpbmRleClcbiAgICAgICAgOiBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChyb290UHJ2LCBpbmRleCk7XG4gICAgY29uc3QgZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLFxuICAgICAgZGVyaXZlZC5kZXJpdmF0aW9uUGF0aCxcbiAgICAgICdkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnXG4gICAgKTtcblxuICAgIGNvbnN0IGNoaWxkID0gYXdhaXQga2V5Y2hhaW5zLmFkZCh7XG4gICAgICBwdWI6IGRlcml2ZWQucHViLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBrZXlUeXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgcGFyZW50OiB1c2VyUm9vdElkLFxuICAgICAgc2FmZUlkOiB0aGlzLmlkKCksXG4gICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoOiBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gICAgfSk7XG4gICAgY29uc3QgY2hpbGRJZCA9IGNoaWxkLmlkO1xuICAgIGlmIChjaGlsZElkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzYWZlIGNoaWxkIGtleSByZWdpc3RyYXRpb24gcmV0dXJuZWQgYW4gZW1wdHkgaWQnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5czogW3N0cmluZ10gPSBbY2hpbGRJZF07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoJy93YWxsZXRzJyksIENyZWF0ZVdhbGxldEluU2FmZUJvZHksIHtcbiAgICAgIGNvaW46IHBhcmFtcy5jb2luLFxuICAgICAgbGFiZWw6IHBhcmFtcy5sYWJlbCxcbiAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICBrZXlzLFxuICAgIH0pLnJlc3VsdCgpO1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIGNvaW4sIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUU1Mgd2FsbGV0IG1pbnQ6IGRlY3J5cHQgdGhlIHVzZXIgcm9vdCBibG9iLCBydW4gdGhlIHVzZXIvQml0R28gaGFyZC1kZXJpdmVcbiAgICogY2VyZW1vbnksIHJlZ2lzdGVyIHRoZSBvcmRlcmVkIGNoaWxkIGRvY3VtZW50cywgdGhlbiBtaW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUc3NXYWxsZXRJblNhZmUoXG4gICAgY29pbjogSUJhc2VDb2luLFxuICAgIHVzZXJSb290SWQ6IHN0cmluZyxcbiAgICBiYWNrdXBSb290SWQ6IHN0cmluZyxcbiAgICBiaXRnb1Jvb3RJZDogc3RyaW5nLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFyYW1zOiBDcmVhdGVTYWZlV2FsbGV0T3B0aW9uc1xuICApOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3QgdXNlclJvb3RLZXljaGFpbiA9IGF3YWl0IGtleWNoYWlucy5nZXQoeyBpZDogdXNlclJvb3RJZCB9KTtcbiAgICBpZiAodXNlclJvb3RLZXljaGFpbi5zb3VyY2UgIT09ICd1c2VyJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSb290S2V5Y2hhaW5Tb3VyY2VFcnJvcih1c2VyUm9vdEtleWNoYWluLmlkLCB1c2VyUm9vdEtleWNoYWluLnNvdXJjZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclJvb3RQcnYgPSBhd2FpdCBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KHRoaXMuYml0Z28sIHVzZXJSb290S2V5Y2hhaW4sIHBhcmFtcy5wYXNzcGhyYXNlKTtcbiAgICBpZiAoIXVzZXJSb290UHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcigpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyUm9vdE1hdGVyaWFsID0gRUNEU0FVdGlscy5wYXJzZVZyZktleUVudmVsb3Blcyh1c2VyUm9vdFBydik7XG5cbiAgICBjb25zdCB0c3NVdGlscyA9IG5ldyBFQ0RTQVV0aWxzLkVjZHNhVnJmTVBDdjJVdGlscyh0aGlzLmJpdGdvLCBjb2luKTtcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4gfSA9IGF3YWl0IHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2U6IHRoaXMuZW50ZXJwcmlzZUlkKCksXG4gICAgICBzYWZlSWQ6IHRoaXMuaWQoKSxcbiAgICAgIHBhcmVudEtleUlkOiBiaXRnb1Jvb3RJZCxcbiAgICAgIGRlcml2YXRpb25JbmRleDogaW5kZXgsXG4gICAgICB1c2VyUm9vdEtleUlkOiB1c2VyUm9vdElkLFxuICAgICAgYmFja3VwUm9vdEtleUlkOiBiYWNrdXBSb290SWQsXG4gICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdE1hdGVyaWFsLnNpZ25pbmcsXG4gICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB1c2VyUm9vdE1hdGVyaWFsLnZyZixcbiAgICB9KTtcbiAgICBpZiAodXNlcktleWNoYWluLmlkLmxlbmd0aCA9PT0gMCB8fCBiYWNrdXBLZXljaGFpbi5pZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2FmZSBjaGlsZCBrZXkgcmVnaXN0cmF0aW9uIHJldHVybmVkIGFuIGVtcHR5IGlkJyk7XG4gICAgfVxuICAgIGNvbnN0IGtleXM6IFtzdHJpbmcsIHN0cmluZ10gPSBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZF07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoJy93YWxsZXRzJyksIENyZWF0ZVdhbGxldEluU2FmZUJvZHksIHtcbiAgICAgIGNvaW46IHBhcmFtcy5jb2luLFxuICAgICAgbGFiZWw6IHBhcmFtcy5sYWJlbCxcbiAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgIGtleXMsXG4gICAgfSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcy5iaXRnbywgY29pbiwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNhZmVEYXRhKCk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBtZW1iZXIgdG8gdGhlIHdob2xlIHNhZmUgKHZpZXcvYWRtaW4vc3BlbmQpLiBTcGVuZCBvcGVucyBhIGtleSBzaGFyZS5cbiAgICovXG4gIGFzeW5jIGFkZE1lbWJlcihwYXJhbXM6IEFkZFNhZmVNZW1iZXJPcHRpb25zKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hZGRNZW1iZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIE9ORSBzYWZlIHdhbGxldCB3aXRoIGEgbm9uLW1lbWJlciB2aWEgdGhlIGV4aXN0aW5nIHdhbGxldC1zaGFyZSBoYW5kc2hha2UuXG4gICAqL1xuICBhc3luYyBhZGRNZW1iZXJUb1dhbGxldChwYXJhbXM6IEFkZFNhZmVXYWxsZXRNZW1iZXJPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRTaGFyZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWRkTWVtYmVyVG9XYWxsZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHNhZmUga2V5IHNoYXJlcyB2aXNpYmxlIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBhc3luYyBsaXN0U2hhcmVzKHBhcmFtczogeyBzdGF0ZT86IFNhZmVTaGFyZVN0YXRlIH0gPSB7fSk6IFByb21pc2U8U2FmZVNoYXJlRGF0YVtdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmxpc3RTaGFyZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBhIHNhZmUga2V5IHNoYXJlIGFkZHJlc3NlZCB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgYXN5bmMgYWNjZXB0U2hhcmUocGFyYW1zOiBBY2NlcHRTYWZlU2hhcmVPcHRpb25zKTogUHJvbWlzZTxTYWZlU2hhcmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFjY2VwdFNoYXJlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmVlemUgdGhlIHNhZmUg4oCUIGJsb2NrcyB3aXRoZHJhd2FscyBvbiBhbGwgc2FmZSB3YWxsZXRzLiBTYWZlIHN0YXlzICdhY3RpdmUnLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBmcmVlemUocGFyYW1zOiBGcmVlemVTYWZlQm9keSA9IHt9KTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyh0aGlzLmJpdGdvLCB0aGlzLnVybCgnL2ZyZWV6ZScpLCBGcmVlemVTYWZlQm9keSwgcGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogQXJjaGl2ZSB0aGUgc2FmZS4gUmVxdWlyZXMgZXZlcnkgc2FmZSB3YWxsZXQgdG8gYWxyZWFkeSBiZSBhcmNoaXZlZDsgYWxzbyB0aGUgYWJhbmRvbm1lbnRcbiAgICogcGF0aCBmb3IgYSBzdHVjayAnaW5pdGlhbGl6aW5nJyBzYWZlLlxuICAgKi9cbiAgYXN5bmMgYXJjaGl2ZSgpOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9hcmNoaXZlJykpLnNlbmQoKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gIH1cblxuICB0b0pTT04oKTogU2FmZURhdGEge1xuICAgIHJldHVybiB0aGlzLl9zYWZlO1xuICB9XG59XG4iXX0=
@@ -27,4 +27,17 @@ export interface SafeHardenedChildKey {
27
27
  export declare function deriveSafeChildHardenedFromXprv(rootXprv: string, index: string | number): SafeHardenedChildKey;
28
28
  /** Re-derive and assert both results match before the child is registered. */
29
29
  export declare function deriveAndSelfCheckSafeChildHardened(rootXprv: string, index: string | number): SafeHardenedChildKey;
30
+ /**
31
+ * SLIP-0010 hardened derivation of a safe user child from an ed25519 root secret seed.
32
+ *
33
+ * `rootPrv` is a Stellar StrKey `S…` secret seed (what slot-④ `ed25519Multisig` user roots store).
34
+ * The derivation reuses the existing SLIP-0010 implementation {@link Ed25519KeyDeriver.derivePath}
35
+ * (hardened-only CKDPriv over the `ed25519 seed` HMAC master), then expands the resulting 32-byte
36
+ * child seed into a keypair with `nacl`. The child `pub` is a bare StrKey `G…`; the `prv` is the
37
+ * raw 32-byte child seed as hex (the seed input a signer needs).
38
+ *
39
+ * Unlike the secp256k1 path, ed25519 hardened derivation needs no chain code — the composite
40
+ * `pub‖chainCode` form is only for SOFT co-signer derivation and is not used here.
41
+ */
42
+ export declare function deriveSafeChildEd25519Hardened(rootPrv: string, index: string | number): SafeHardenedChildKey;
30
43
  //# sourceMappingURL=safeDerivation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safeDerivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAK3B,eAAO,MAAM,sCAAsC,QAAgB,CAAC;AAEpE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAavE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,iCAAiC,EAAE,OAAO,MAAM,CAAC;CAC3D;AAED,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAE1G,eAAO,MAAM,iCAAiC,6DAI7C,CAAC;AAcF,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAI9G;AAED,8EAA8E;AAC9E,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAOlH"}
1
+ {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safeDerivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAQ3B,eAAO,MAAM,sCAAsC,QAAgB,CAAC;AAEpE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAavE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,iCAAiC,EAAE,OAAO,MAAM,CAAC;CAC3D;AAED,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAE1G,eAAO,MAAM,iCAAiC,6DAI7C,CAAC;AAcF,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAI9G;AAED,8EAA8E;AAC9E,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAOlH;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAY5G"}
@@ -39,6 +39,7 @@ exports.getSafeHardenedDerivationPath = getSafeHardenedDerivationPath;
39
39
  exports.parseDerivedFromParentWithHardenedPath = parseDerivedFromParentWithHardenedPath;
40
40
  exports.deriveSafeChildHardenedFromXprv = deriveSafeChildHardenedFromXprv;
41
41
  exports.deriveAndSelfCheckSafeChildHardened = deriveAndSelfCheckSafeChildHardened;
42
+ exports.deriveSafeChildEd25519Hardened = deriveSafeChildEd25519Hardened;
42
43
  /**
43
44
  * @prettier
44
45
  *
@@ -51,8 +52,11 @@ exports.deriveAndSelfCheckSafeChildHardened = deriveAndSelfCheckSafeChildHardene
51
52
  * that is the custody hashed path and cannot reproduce a safe child.
52
53
  */
53
54
  const t = __importStar(require("io-ts"));
55
+ const nacl = __importStar(require("tweetnacl"));
54
56
  const utxo_lib_1 = require("@bitgo/utxo-lib");
57
+ const ed25519KeyDeriver_1 = require("../../account-lib/util/ed25519KeyDeriver");
55
58
  const codecs_1 = require("../utils/codecs");
59
+ const derivableEd25519Pub_1 = require("./derivableEd25519Pub");
56
60
  const MAX_BIP32_INDEX = 0x7fffffff;
57
61
  exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH = /^m\/(\d+)'$/;
58
62
  function parseSafeDerivationIndex(index) {
@@ -119,4 +123,29 @@ function deriveAndSelfCheckSafeChildHardened(rootXprv, index) {
119
123
  }
120
124
  return first;
121
125
  }
122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9zYWZlRGVyaXZhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsNERBYUM7QUFFRCxzRUFFQztBQTBCRCx3RkFPQztBQW1CRCwwRUFJQztBQUdELGtGQU9DO0FBckdEOzs7Ozs7Ozs7O0dBVUc7QUFDSCx5Q0FBMkI7QUFDM0IsOENBQXdEO0FBQ3hELDRDQUFrRDtBQUVsRCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDdEIsUUFBQSxzQ0FBc0MsR0FBRyxhQUFhLENBQUM7QUFFcEUsU0FBZ0Isd0JBQXdCLENBQUMsS0FBc0I7SUFDN0QsSUFBSSxHQUFXLENBQUM7SUFDaEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ2QsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxLQUFLLG9DQUFvQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEtBQUssb0NBQW9DLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBZ0IsNkJBQTZCLENBQUMsS0FBc0I7SUFDbEUsT0FBTyxLQUFLLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDakQsQ0FBQztBQVFZLFFBQUEsaUNBQWlDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FDdEQsQ0FBQyxDQUFDLE1BQU0sRUFDUixDQUFDLENBQUMsRUFBMEMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFDM0csbUNBQW1DLENBQ3BDLENBQUM7QUFFRixTQUFTLDJDQUEyQyxDQUFDLElBQVk7SUFDL0QsTUFBTSxLQUFLLEdBQUcsOENBQXNDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxPQUFPLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLHNDQUFzQyxDQUFDLElBQVk7SUFDakUsTUFBTSxTQUFTLEdBQUcsSUFBQSx3QkFBZSxFQUFDLHlDQUFpQyxFQUFFLElBQUksRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ2hILE1BQU0sS0FBSyxHQUFHLDJDQUEyQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLElBQUksb0JBQW9CLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBUUQsU0FBUyxhQUFhLENBQUMsS0FBcUIsRUFBRSxjQUFzQjtJQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU87UUFDTCxHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtRQUNyQixHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUNoQyxjQUFjO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQiwrQkFBK0IsQ0FBQyxRQUFnQixFQUFFLEtBQXNCO0lBQ3RGLE1BQU0sR0FBRyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFELE9BQU8sYUFBYSxDQUFDLGdCQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLFNBQWdCLG1DQUFtQyxDQUFDLFFBQWdCLEVBQUUsS0FBc0I7SUFDMUYsTUFBTSxLQUFLLEdBQUcsK0JBQStCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLCtCQUErQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxLQUFLLENBQUMsY0FBYyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgU2hhcmVkIHNhZmUgY2hpbGQgZGVyaXZhdGlvbiBmb3IgbWludCBhbmQgc2lnbi5cbiAqXG4gKiBVc2VyIGNoaWxkOiBoYXJkZW5lZCBgbS88aW5kZXg+J2AgZnJvbSB0aGUgc2VxdWVudGlhbCBgc2FmZS5kZXJpdmF0aW9uSW5kZXhbc2xvdF1gLlxuICogQmFja3VwIC8gQml0R28gY2hpbGRyZW4gYXJlIHNvZnQtZGVyaXZlZCBzZXJ2ZXItc2lkZSBhdCBgbS88aW5kZXg+YCAobm90IGhlcmUpLlxuICpcbiAqIERvIG5vdCB1c2UgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIC8gYGRlcml2ZUtleVdpdGhTZWVkYCAoYG0vOTk5OTk5L2EvYmApIOKAlFxuICogdGhhdCBpcyB0aGUgY3VzdG9keSBoYXNoZWQgcGF0aCBhbmQgY2Fubm90IHJlcHJvZHVjZSBhIHNhZmUgY2hpbGQuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHsgYmlwMzIsIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL2NvZGVjcyc7XG5cbmNvbnN0IE1BWF9CSVAzMl9JTkRFWCA9IDB4N2ZmZmZmZmY7XG5leHBvcnQgY29uc3QgREVSSVZFRF9GUk9NX1BBUkVOVF9XSVRIX0hBUkRFTkVEX1BBVEggPSAvXm1cXC8oXFxkKyknJC87XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpZHg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicpIHtcbiAgICBpZHggPSBpbmRleDtcbiAgfSBlbHNlIGlmICgvXlxcZCskLy50ZXN0KGluZGV4KSkge1xuICAgIGlkeCA9IE51bWJlcihpbmRleCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNhZmUgZGVyaXZhdGlvbiBpbmRleCAnJHtpbmRleH0nOiBleHBlY3RlZCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCk7XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkeCkgfHwgaWR4IDwgMCB8fCBpZHggPiBNQVhfQklQMzJfSU5ERVgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2FmZSBkZXJpdmF0aW9uIGluZGV4ICcke2luZGV4fSc6IGV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICByZXR1cm4gaWR4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbS8ke3BhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleCl9J2A7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoQnJhbmQge1xuICByZWFkb25seSBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGg6IHVuaXF1ZSBzeW1ib2w7XG59XG5cbmV4cG9ydCB0eXBlIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9IHQuQnJhbmRlZDxzdHJpbmcsIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEJyYW5kPjtcblxuZXhwb3J0IGNvbnN0IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9IHQuYnJhbmQoXG4gIHQuc3RyaW5nLFxuICAocyk6IHMgaXMgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0+IHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoSW5kZXgocykgIT09IHVuZGVmaW5lZCxcbiAgJ0Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCdcbik7XG5cbmZ1bmN0aW9uIHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoSW5kZXgocGF0aDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSBERVJJVkVEX0ZST01fUEFSRU5UX1dJVEhfSEFSREVORURfUEFUSC5leGVjKHBhdGgpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgobWF0Y2hbMV0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aChwYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCB2YWxpZGF0ZWQgPSBkZWNvZGVXaXRoQ29kZWMoRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLCBwYXRoLCAnZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoJyk7XG4gIGNvbnN0IGluZGV4ID0gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhJbmRleCh2YWxpZGF0ZWQpO1xuICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggJyR7cGF0aH0nOiBleHBlY3RlZCBtLzxuPidgKTtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBwcnY6IHN0cmluZztcbiAgcHViOiBzdHJpbmc7XG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGNoaWxkRnJvbU5vZGUoY2hpbGQ6IEJJUDMySW50ZXJmYWNlLCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBpZiAoIWNoaWxkLnByaXZhdGVLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXJpdmUgaGFyZGVuZWQgc2FmZSBjaGlsZCBhdCAke2Rlcml2YXRpb25QYXRofWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJ2OiBjaGlsZC50b0Jhc2U1OCgpLFxuICAgIHB1YjogY2hpbGQubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgIGRlcml2YXRpb25QYXRoLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihyb290WHBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBpZHggPSBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXgpO1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKGlkeCk7XG4gIHJldHVybiBjaGlsZEZyb21Ob2RlKGJpcDMyLmZyb21CYXNlNTgocm9vdFhwcnYpLmRlcml2ZUhhcmRlbmVkKGlkeCksIGRlcml2YXRpb25QYXRoKTtcbn1cblxuLyoqIFJlLWRlcml2ZSBhbmQgYXNzZXJ0IGJvdGggcmVzdWx0cyBtYXRjaCBiZWZvcmUgdGhlIGNoaWxkIGlzIHJlZ2lzdGVyZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQocm9vdFhwcnY6IHN0cmluZywgaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgY29uc3QgZmlyc3QgPSBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KHJvb3RYcHJ2LCBpbmRleCk7XG4gIGNvbnN0IHNlY29uZCA9IGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYocm9vdFhwcnYsIGluZGV4KTtcbiAgaWYgKGZpcnN0LnB1YiAhPT0gc2Vjb25kLnB1YiB8fCBmaXJzdC5wcnYgIT09IHNlY29uZC5wcnYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgY2hpbGQgc2VsZi1jaGVjayBmYWlsZWQgYXQgJHtmaXJzdC5kZXJpdmF0aW9uUGF0aH06IGRlcml2YXRpb24gd2FzIG5vdCBkZXRlcm1pbmlzdGljYCk7XG4gIH1cbiAgcmV0dXJuIGZpcnN0O1xufVxuIl19
126
+ /**
127
+ * SLIP-0010 hardened derivation of a safe user child from an ed25519 root secret seed.
128
+ *
129
+ * `rootPrv` is a Stellar StrKey `S…` secret seed (what slot-④ `ed25519Multisig` user roots store).
130
+ * The derivation reuses the existing SLIP-0010 implementation {@link Ed25519KeyDeriver.derivePath}
131
+ * (hardened-only CKDPriv over the `ed25519 seed` HMAC master), then expands the resulting 32-byte
132
+ * child seed into a keypair with `nacl`. The child `pub` is a bare StrKey `G…`; the `prv` is the
133
+ * raw 32-byte child seed as hex (the seed input a signer needs).
134
+ *
135
+ * Unlike the secp256k1 path, ed25519 hardened derivation needs no chain code — the composite
136
+ * `pub‖chainCode` form is only for SOFT co-signer derivation and is not used here.
137
+ */
138
+ function deriveSafeChildEd25519Hardened(rootPrv, index) {
139
+ const idx = parseSafeDerivationIndex(index);
140
+ const derivationPath = getSafeHardenedDerivationPath(idx);
141
+ const rawSeedHex = (0, derivableEd25519Pub_1.decodeEd25519StrKeySecretSeed)(rootPrv).toString('hex');
142
+ const childSeed = ed25519KeyDeriver_1.Ed25519KeyDeriver.derivePath(derivationPath, rawSeedHex).key;
143
+ const keyPair = nacl.sign.keyPair.fromSeed(Uint8Array.from(childSeed));
144
+ const pub = (0, derivableEd25519Pub_1.encodeEd25519StrKeyPublicKey)(Buffer.from(keyPair.publicKey));
145
+ return {
146
+ prv: Buffer.from(childSeed).toString('hex'),
147
+ pub,
148
+ derivationPath,
149
+ };
150
+ }
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9zYWZlRGVyaXZhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkEsNERBYUM7QUFFRCxzRUFFQztBQTBCRCx3RkFPQztBQW1CRCwwRUFJQztBQUdELGtGQU9DO0FBY0Qsd0VBWUM7QUFsSUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILHlDQUEyQjtBQUMzQixnREFBa0M7QUFDbEMsOENBQXdEO0FBQ3hELGdGQUE2RTtBQUM3RSw0Q0FBa0Q7QUFDbEQsK0RBQW9HO0FBRXBHLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQztBQUN0QixRQUFBLHNDQUFzQyxHQUFHLGFBQWEsQ0FBQztBQUVwRSxTQUFnQix3QkFBd0IsQ0FBQyxLQUFzQjtJQUM3RCxJQUFJLEdBQVcsQ0FBQztJQUNoQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDZCxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEtBQUssb0NBQW9DLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsS0FBSyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7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Y0FBYyxHQUFHLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFELE1BQU0sVUFBVSxHQUFHLElBQUEsbURBQTZCLEVBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFFLE1BQU0sU0FBUyxHQUFHLHFDQUFpQixDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQy9FLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxHQUFHLEdBQUcsSUFBQSxrREFBNEIsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLE9BQU87UUFDTCxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzNDLEdBQUc7UUFDSCxjQUFjO0tBQ2YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgU2hhcmVkIHNhZmUgY2hpbGQgZGVyaXZhdGlvbiBmb3IgbWludCBhbmQgc2lnbi5cbiAqXG4gKiBVc2VyIGNoaWxkOiBoYXJkZW5lZCBgbS88aW5kZXg+J2AgZnJvbSB0aGUgc2VxdWVudGlhbCBgc2FmZS5kZXJpdmF0aW9uSW5kZXhbc2xvdF1gLlxuICogQmFja3VwIC8gQml0R28gY2hpbGRyZW4gYXJlIHNvZnQtZGVyaXZlZCBzZXJ2ZXItc2lkZSBhdCBgbS88aW5kZXg+YCAobm90IGhlcmUpLlxuICpcbiAqIERvIG5vdCB1c2UgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIC8gYGRlcml2ZUtleVdpdGhTZWVkYCAoYG0vOTk5OTk5L2EvYmApIOKAlFxuICogdGhhdCBpcyB0aGUgY3VzdG9keSBoYXNoZWQgcGF0aCBhbmQgY2Fubm90IHJlcHJvZHVjZSBhIHNhZmUgY2hpbGQuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0ICogYXMgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgYmlwMzIsIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IEVkMjU1MTlLZXlEZXJpdmVyIH0gZnJvbSAnLi4vLi4vYWNjb3VudC1saWIvdXRpbC9lZDI1NTE5S2V5RGVyaXZlcic7XG5pbXBvcnQgeyBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9jb2RlY3MnO1xuaW1wb3J0IHsgZGVjb2RlRWQyNTUxOVN0cktleVNlY3JldFNlZWQsIGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkgfSBmcm9tICcuL2Rlcml2YWJsZUVkMjU1MTlQdWInO1xuXG5jb25zdCBNQVhfQklQMzJfSU5ERVggPSAweDdmZmZmZmZmO1xuZXhwb3J0IGNvbnN0IERFUklWRURfRlJPTV9QQVJFTlRfV0lUSF9IQVJERU5FRF9QQVRIID0gL15tXFwvKFxcZCspJyQvO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KGluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaWR4OiBudW1iZXI7XG4gIGlmICh0eXBlb2YgaW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgaWR4ID0gaW5kZXg7XG4gIH0gZWxzZSBpZiAoL15cXGQrJC8udGVzdChpbmRleCkpIHtcbiAgICBpZHggPSBOdW1iZXIoaW5kZXgpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXggJyR7aW5kZXh9JzogZXhwZWN0ZWQgYSBub24tbmVnYXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihpZHgpIHx8IGlkeCA8IDAgfHwgaWR4ID4gTUFYX0JJUDMyX0lOREVYKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNhZmUgZGVyaXZhdGlvbiBpbmRleCAnJHtpbmRleH0nOiBleHBlY3RlZCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCk7XG4gIH1cbiAgcmV0dXJuIGlkeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKGluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYG0vJHtwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXgpfSdgO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEJyYW5kIHtcbiAgcmVhZG9ubHkgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoOiB1bmlxdWUgc3ltYm9sO1xufVxuXG5leHBvcnQgdHlwZSBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggPSB0LkJyYW5kZWQ8c3RyaW5nLCBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhCcmFuZD47XG5cbmV4cG9ydCBjb25zdCBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggPSB0LmJyYW5kKFxuICB0LnN0cmluZyxcbiAgKHMpOiBzIGlzIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9PiBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEluZGV4KHMpICE9PSB1bmRlZmluZWQsXG4gICdEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnXG4pO1xuXG5mdW5jdGlvbiBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEluZGV4KHBhdGg6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gREVSSVZFRF9GUk9NX1BBUkVOVF9XSVRIX0hBUkRFTkVEX1BBVEguZXhlYyhwYXRoKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KG1hdGNoWzFdKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgocGF0aDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgdmFsaWRhdGVkID0gZGVjb2RlV2l0aENvZGVjKERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCwgcGF0aCwgJ2Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCcpO1xuICBjb25zdCBpbmRleCA9IHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoSW5kZXgodmFsaWRhdGVkKTtcbiAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoICcke3BhdGh9JzogZXhwZWN0ZWQgbS88bj4nYCk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgcHJ2OiBzdHJpbmc7XG4gIHB1Yjogc3RyaW5nO1xuICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBjaGlsZEZyb21Ob2RlKGNoaWxkOiBCSVAzMkludGVyZmFjZSwgZGVyaXZhdGlvblBhdGg6IHN0cmluZyk6IFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgaWYgKCFjaGlsZC5wcml2YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVyaXZlIGhhcmRlbmVkIHNhZmUgY2hpbGQgYXQgJHtkZXJpdmF0aW9uUGF0aH1gKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHBydjogY2hpbGQudG9CYXNlNTgoKSxcbiAgICBwdWI6IGNoaWxkLm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICBkZXJpdmF0aW9uUGF0aCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYocm9vdFhwcnY6IHN0cmluZywgaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgY29uc3QgaWR4ID0gcGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KGluZGV4KTtcbiAgY29uc3QgZGVyaXZhdGlvblBhdGggPSBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aChpZHgpO1xuICByZXR1cm4gY2hpbGRGcm9tTm9kZShiaXAzMi5mcm9tQmFzZTU4KHJvb3RYcHJ2KS5kZXJpdmVIYXJkZW5lZChpZHgpLCBkZXJpdmF0aW9uUGF0aCk7XG59XG5cbi8qKiBSZS1kZXJpdmUgYW5kIGFzc2VydCBib3RoIHJlc3VsdHMgbWF0Y2ggYmVmb3JlIHRoZSBjaGlsZCBpcyByZWdpc3RlcmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZUFuZFNlbGZDaGVja1NhZmVDaGlsZEhhcmRlbmVkKHJvb3RYcHJ2OiBzdHJpbmcsIGluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGNvbnN0IGZpcnN0ID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihyb290WHBydiwgaW5kZXgpO1xuICBjb25zdCBzZWNvbmQgPSBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KHJvb3RYcHJ2LCBpbmRleCk7XG4gIGlmIChmaXJzdC5wdWIgIT09IHNlY29uZC5wdWIgfHwgZmlyc3QucHJ2ICE9PSBzZWNvbmQucHJ2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTYWZlIGNoaWxkIHNlbGYtY2hlY2sgZmFpbGVkIGF0ICR7Zmlyc3QuZGVyaXZhdGlvblBhdGh9OiBkZXJpdmF0aW9uIHdhcyBub3QgZGV0ZXJtaW5pc3RpY2ApO1xuICB9XG4gIHJldHVybiBmaXJzdDtcbn1cblxuLyoqXG4gKiBTTElQLTAwMTAgaGFyZGVuZWQgZGVyaXZhdGlvbiBvZiBhIHNhZmUgdXNlciBjaGlsZCBmcm9tIGFuIGVkMjU1MTkgcm9vdCBzZWNyZXQgc2VlZC5cbiAqXG4gKiBgcm9vdFBydmAgaXMgYSBTdGVsbGFyIFN0cktleSBgU+KApmAgc2VjcmV0IHNlZWQgKHdoYXQgc2xvdC3ikaMgYGVkMjU1MTlNdWx0aXNpZ2AgdXNlciByb290cyBzdG9yZSkuXG4gKiBUaGUgZGVyaXZhdGlvbiByZXVzZXMgdGhlIGV4aXN0aW5nIFNMSVAtMDAxMCBpbXBsZW1lbnRhdGlvbiB7QGxpbmsgRWQyNTUxOUtleURlcml2ZXIuZGVyaXZlUGF0aH1cbiAqIChoYXJkZW5lZC1vbmx5IENLRFByaXYgb3ZlciB0aGUgYGVkMjU1MTkgc2VlZGAgSE1BQyBtYXN0ZXIpLCB0aGVuIGV4cGFuZHMgdGhlIHJlc3VsdGluZyAzMi1ieXRlXG4gKiBjaGlsZCBzZWVkIGludG8gYSBrZXlwYWlyIHdpdGggYG5hY2xgLiBUaGUgY2hpbGQgYHB1YmAgaXMgYSBiYXJlIFN0cktleSBgR+KApmA7IHRoZSBgcHJ2YCBpcyB0aGVcbiAqIHJhdyAzMi1ieXRlIGNoaWxkIHNlZWQgYXMgaGV4ICh0aGUgc2VlZCBpbnB1dCBhIHNpZ25lciBuZWVkcykuXG4gKlxuICogVW5saWtlIHRoZSBzZWNwMjU2azEgcGF0aCwgZWQyNTUxOSBoYXJkZW5lZCBkZXJpdmF0aW9uIG5lZWRzIG5vIGNoYWluIGNvZGUg4oCUIHRoZSBjb21wb3NpdGVcbiAqIGBwdWLigJZjaGFpbkNvZGVgIGZvcm0gaXMgb25seSBmb3IgU09GVCBjby1zaWduZXIgZGVyaXZhdGlvbiBhbmQgaXMgbm90IHVzZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZChyb290UHJ2OiBzdHJpbmcsIGluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGNvbnN0IGlkeCA9IHBhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleCk7XG4gIGNvbnN0IGRlcml2YXRpb25QYXRoID0gZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaWR4KTtcbiAgY29uc3QgcmF3U2VlZEhleCA9IGRlY29kZUVkMjU1MTlTdHJLZXlTZWNyZXRTZWVkKHJvb3RQcnYpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgY2hpbGRTZWVkID0gRWQyNTUxOUtleURlcml2ZXIuZGVyaXZlUGF0aChkZXJpdmF0aW9uUGF0aCwgcmF3U2VlZEhleCkua2V5O1xuICBjb25zdCBrZXlQYWlyID0gbmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQoVWludDhBcnJheS5mcm9tKGNoaWxkU2VlZCkpO1xuICBjb25zdCBwdWIgPSBlbmNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KEJ1ZmZlci5mcm9tKGtleVBhaXIucHVibGljS2V5KSk7XG4gIHJldHVybiB7XG4gICAgcHJ2OiBCdWZmZXIuZnJvbShjaGlsZFNlZWQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICBwdWIsXG4gICAgZGVyaXZhdGlvblBhdGgsXG4gIH07XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"safes.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safes.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,sBAAsB,EAKvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAuC9B;;;;;;GAMG;AACH,qBAAa,KAAM,YAAW,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;IAKlD;;;OAGG;IACH,OAAO,CAAC,GAAG;IAIX;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKpF;;;;;;;;;;;;;OAaG;IACG,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwDvF;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E;;;OAGG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;OAMG;YACW,kBAAkB;IAsChC;;;;;OAKG;YACW,aAAa;IAY3B;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1F;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjD"}
1
+ {"version":3,"file":"safes.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safes.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,sBAAsB,EAKvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAuC9B;;;;;;GAMG;AACH,qBAAa,KAAM,YAAW,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;IAKlD;;;OAGG;IACH,OAAO,CAAC,GAAG;IAIX;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKpF;;;;;;;;;;;;;OAaG;IACG,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwDvF;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E;;;OAGG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;OAMG;YACW,kBAAkB;IAwChC;;;;;OAKG;YACW,aAAa;IAY3B;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1F;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjD"}