@bitgo-beta/abstract-utxo 1.6.1-alpha.2 → 1.6.1-alpha.200
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.
- package/CHANGELOG.md +871 -0
- package/dist/src/abstractUtxoCoin.d.ts +160 -33
- package/dist/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/src/abstractUtxoCoin.js +378 -199
- package/dist/src/index.js +6 -2
- package/dist/src/parseOutput.d.ts.map +1 -1
- package/dist/src/parseOutput.js +38 -1
- package/dist/src/recovery/RecoveryProvider.d.ts +6 -5
- package/dist/src/recovery/RecoveryProvider.d.ts.map +1 -1
- package/dist/src/recovery/RecoveryProvider.js +1 -2
- package/dist/src/recovery/backupKeyRecovery.d.ts +44 -12
- package/dist/src/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/src/recovery/backupKeyRecovery.js +126 -83
- package/dist/src/recovery/baseApi.d.ts +2 -2
- package/dist/src/recovery/baseApi.d.ts.map +1 -1
- package/dist/src/recovery/crossChainRecovery.d.ts +15 -26
- package/dist/src/recovery/crossChainRecovery.d.ts.map +1 -1
- package/dist/src/recovery/crossChainRecovery.js +61 -69
- package/dist/src/recovery/index.d.ts +0 -1
- package/dist/src/recovery/index.d.ts.map +1 -1
- package/dist/src/recovery/index.js +6 -3
- package/dist/src/recovery/mempoolApi.d.ts.map +1 -1
- package/dist/src/recovery/mempoolApi.js +6 -3
- package/dist/src/sign.d.ts +29 -5
- package/dist/src/sign.d.ts.map +1 -1
- package/dist/src/sign.js +73 -7
- package/dist/src/transaction.d.ts +36 -0
- package/dist/src/transaction.d.ts.map +1 -0
- package/dist/src/transaction.js +278 -0
- package/dist/tsconfig.tsbuildinfo +1 -7714
- package/package.json +11 -10
- package/dist/src/recovery/smartbitApi.d.ts +0 -11
- package/dist/src/recovery/smartbitApi.d.ts.map +0 -1
- package/dist/src/recovery/smartbitApi.js +0 -36
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
* @prettier
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.backupKeyRecovery = void 0;
|
|
6
|
+
exports.v1Sweep = exports.v1BackupKeyRecovery = exports.backupKeyRecovery = void 0;
|
|
7
|
+
const assert = require("assert");
|
|
7
8
|
const _ = require("lodash");
|
|
8
9
|
const utxolib = require("@bitgo-beta/utxo-lib");
|
|
9
|
-
const { getInternalChainCode,
|
|
10
|
+
const { getInternalChainCode, scriptTypeForChain, outputScripts, getExternalChainCode } = utxolib.bitgo;
|
|
10
11
|
const unspents_1 = require("@bitgo-beta/unspents");
|
|
11
12
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
12
13
|
const RecoveryProvider_1 = require("./RecoveryProvider");
|
|
13
|
-
const baseApi_1 = require("./baseApi");
|
|
14
|
-
const smartbitApi_1 = require("./smartbitApi");
|
|
15
14
|
const mempoolApi_1 = require("./mempoolApi");
|
|
16
15
|
const coingeckoApi_1 = require("./coingeckoApi");
|
|
17
16
|
const sign_1 = require("../sign");
|
|
17
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
18
18
|
/**
|
|
19
19
|
* This transforms the txInfo from recover into the format that offline-signing-tool expects
|
|
20
20
|
* @param coinName
|
|
@@ -26,7 +26,10 @@ function formatForOfflineVault(coinName, txInfo, txHex) {
|
|
|
26
26
|
return {
|
|
27
27
|
txHex,
|
|
28
28
|
txInfo: {
|
|
29
|
-
unspents: txInfo.inputs
|
|
29
|
+
unspents: txInfo.inputs.map((input) => {
|
|
30
|
+
assert(input.valueString);
|
|
31
|
+
return { ...input, valueString: input.valueString };
|
|
32
|
+
}),
|
|
30
33
|
},
|
|
31
34
|
feeInfo: {},
|
|
32
35
|
coin: coinName,
|
|
@@ -68,15 +71,34 @@ async function calculateFeeAmount(coin, params) {
|
|
|
68
71
|
throw new Error('Fee structure not implemented');
|
|
69
72
|
}
|
|
70
73
|
}
|
|
74
|
+
function getFormattedAddress(coin, address) {
|
|
75
|
+
// Blockchair uses cashaddr format when querying the API for address information. Convert legacy addresses to cashaddr
|
|
76
|
+
// before querying the API.
|
|
77
|
+
return coin.getChain() === 'bch' || coin.getChain() === 'bcha'
|
|
78
|
+
? coin.canonicalAddress(address.address, 'cashaddr').split(':')[1]
|
|
79
|
+
: address.address;
|
|
80
|
+
}
|
|
71
81
|
async function queryBlockchainUnspentsPath(coin, params, walletKeys, chain) {
|
|
72
82
|
var _a;
|
|
73
|
-
const
|
|
83
|
+
const scriptType = scriptTypeForChain(chain);
|
|
84
|
+
const fetchPrevTx = !utxolib.bitgo.outputScripts.hasWitnessData(scriptType) && (0, utxo_lib_1.getMainnet)(coin.network) !== utxo_lib_1.networks.zcash;
|
|
85
|
+
const recoveryProvider = (_a = params.recoveryProvider) !== null && _a !== void 0 ? _a : (0, RecoveryProvider_1.forCoin)(coin.getChain(), params.apiKey);
|
|
74
86
|
const MAX_SEQUENTIAL_ADDRESSES_WITHOUT_TXS = params.scan || 20;
|
|
75
87
|
let numSequentialAddressesWithoutTxs = 0;
|
|
88
|
+
const prevTxCache = new Map();
|
|
89
|
+
async function getPrevTx(txid) {
|
|
90
|
+
let prevTxHex = prevTxCache.get(txid);
|
|
91
|
+
if (!prevTxHex) {
|
|
92
|
+
prevTxHex = await recoveryProvider.getTransactionHex(txid);
|
|
93
|
+
prevTxCache.set(txid, prevTxHex);
|
|
94
|
+
}
|
|
95
|
+
return prevTxHex;
|
|
96
|
+
}
|
|
76
97
|
async function gatherUnspents(addrIndex) {
|
|
77
98
|
const walletKeysForUnspent = walletKeys.deriveForChainAndIndex(chain, addrIndex);
|
|
78
|
-
const address = coin.createMultiSigAddress(
|
|
79
|
-
const
|
|
99
|
+
const address = coin.createMultiSigAddress(scriptType, 2, walletKeysForUnspent.publicKeys);
|
|
100
|
+
const formattedAddress = getFormattedAddress(coin, address);
|
|
101
|
+
const addrInfo = await recoveryProvider.getAddressInfo(formattedAddress);
|
|
80
102
|
// we use txCount here because it implies usage - having tx'es means the addr was generated and used
|
|
81
103
|
if (addrInfo.txCount === 0) {
|
|
82
104
|
numSequentialAddressesWithoutTxs++;
|
|
@@ -85,32 +107,29 @@ async function queryBlockchainUnspentsPath(coin, params, walletKeys, chain) {
|
|
|
85
107
|
numSequentialAddressesWithoutTxs = 0;
|
|
86
108
|
if (addrInfo.balance > 0) {
|
|
87
109
|
console.log(`Found an address with balance: ${address.address} with balance ${addrInfo.balance}`);
|
|
88
|
-
const addressUnspents = await recoveryProvider.getUnspentsForAddresses([
|
|
110
|
+
const addressUnspents = await recoveryProvider.getUnspentsForAddresses([formattedAddress]);
|
|
89
111
|
const processedUnspents = await Promise.all(addressUnspents.map(async (u) => {
|
|
112
|
+
const { txid, vout } = utxolib.bitgo.parseOutputId(u.id);
|
|
113
|
+
let val = BigInt(u.value);
|
|
90
114
|
if (coin.amountType === 'bigint') {
|
|
91
115
|
// blockchair returns the number with the correct precision, but in number format
|
|
92
116
|
// json parse won't parse it correctly, so we requery the txid for the tx hex to decode here
|
|
93
|
-
let val = BigInt(u.value);
|
|
94
117
|
if (!Number.isSafeInteger(u.value)) {
|
|
95
|
-
const
|
|
96
|
-
const txHex = await recoveryProvider.getTransactionHex(txid);
|
|
118
|
+
const txHex = await getPrevTx(txid);
|
|
97
119
|
const tx = coin.createTransactionFromHex(txHex);
|
|
98
120
|
val = tx.outs[vout].value;
|
|
99
121
|
}
|
|
100
|
-
return {
|
|
101
|
-
...u,
|
|
102
|
-
value: val,
|
|
103
|
-
chain: chain,
|
|
104
|
-
index: addrIndex,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
return {
|
|
109
|
-
...u,
|
|
110
|
-
chain: chain,
|
|
111
|
-
index: addrIndex,
|
|
112
|
-
};
|
|
113
122
|
}
|
|
123
|
+
// the api may return cashaddr's instead of legacy for BCH and BCHA
|
|
124
|
+
// downstream processes's only expect legacy addresses
|
|
125
|
+
u = { ...u, address: coin.canonicalAddress(u.address) };
|
|
126
|
+
return {
|
|
127
|
+
...u,
|
|
128
|
+
value: val,
|
|
129
|
+
chain: chain,
|
|
130
|
+
index: addrIndex,
|
|
131
|
+
prevTx: fetchPrevTx ? Buffer.from(await getPrevTx(txid), 'hex') : undefined,
|
|
132
|
+
};
|
|
114
133
|
}));
|
|
115
134
|
walletUnspents.push(...processedUnspents);
|
|
116
135
|
}
|
|
@@ -142,7 +161,14 @@ async function getRecoveryFeePerBytes(coin, { defaultValue }) {
|
|
|
142
161
|
}
|
|
143
162
|
}
|
|
144
163
|
/**
|
|
145
|
-
* Builds a funds recovery transaction without BitGo
|
|
164
|
+
* Builds a funds recovery transaction without BitGo.
|
|
165
|
+
*
|
|
166
|
+
* Returns transaction hex in legacy format for unsigned sweep transaction, half signed backup recovery transaction with KRS provider (only keyternal),
|
|
167
|
+
* fully signed backup recovery transaction without a KRS provider.
|
|
168
|
+
*
|
|
169
|
+
* Returns PSBT hex for half signed backup recovery transaction with KRS provider (excluding keyternal)
|
|
170
|
+
* For PSBT hex cases, Unspents are not required in response.
|
|
171
|
+
*
|
|
146
172
|
* @param coin
|
|
147
173
|
* @param bitgo
|
|
148
174
|
* @param params
|
|
@@ -170,12 +196,13 @@ async function backupKeyRecovery(coin, bitgo, params) {
|
|
|
170
196
|
if (!_.isUndefined(params.scan) && (!_.isInteger(params.scan) || params.scan < 0)) {
|
|
171
197
|
throw new Error('scan must be a positive integer');
|
|
172
198
|
}
|
|
173
|
-
const isKrsRecovery = sdk_core_1.getIsKrsRecovery(params);
|
|
174
|
-
const isUnsignedSweep = sdk_core_1.getIsUnsignedSweep(params);
|
|
175
|
-
const
|
|
199
|
+
const isKrsRecovery = (0, sdk_core_1.getIsKrsRecovery)(params);
|
|
200
|
+
const isUnsignedSweep = (0, sdk_core_1.getIsUnsignedSweep)(params);
|
|
201
|
+
const responseTxFormat = isUnsignedSweep || !isKrsRecovery || params.krsProvider === 'keyternal' ? 'legacy' : 'psbt';
|
|
202
|
+
const krsProvider = isKrsRecovery ? (0, sdk_core_1.getKrsProvider)(coin, params.krsProvider) : undefined;
|
|
176
203
|
// check whether key material and password authenticate the users and return parent keys of all three keys of the wallet
|
|
177
|
-
const keys = sdk_core_1.getBip32Keys(bitgo, params, { requireBitGoXpub: true });
|
|
178
|
-
if (!sdk_core_1.isTriple(keys)) {
|
|
204
|
+
const keys = (0, sdk_core_1.getBip32Keys)(bitgo, params, { requireBitGoXpub: true });
|
|
205
|
+
if (!(0, sdk_core_1.isTriple)(keys)) {
|
|
179
206
|
throw new Error(`expected key triple`);
|
|
180
207
|
}
|
|
181
208
|
const walletKeys = new utxolib.bitgo.RootWalletKeys(keys, [
|
|
@@ -191,12 +218,14 @@ async function backupKeyRecovery(coin, bitgo, params) {
|
|
|
191
218
|
queryBlockchainUnspentsPath(coin, params, walletKeys, getInternalChainCode(addressType)),
|
|
192
219
|
], []))).flat();
|
|
193
220
|
// Execute the queries and gather the unspents
|
|
194
|
-
const totalInputAmount = utxolib.bitgo.unspentSum(unspents,
|
|
195
|
-
if (totalInputAmount <= 0) {
|
|
221
|
+
const totalInputAmount = utxolib.bitgo.unspentSum(unspents, 'bigint');
|
|
222
|
+
if (totalInputAmount <= BigInt(0)) {
|
|
196
223
|
throw new sdk_core_1.ErrorNoInputToRecover();
|
|
197
224
|
}
|
|
198
|
-
// Build the
|
|
199
|
-
const
|
|
225
|
+
// Build the psbt
|
|
226
|
+
const psbt = utxolib.bitgo.createPsbtForNetwork({ network: coin.network });
|
|
227
|
+
// xpubs can become handy for many things.
|
|
228
|
+
utxolib.bitgo.addXpubsToPsbt(psbt, walletKeys);
|
|
200
229
|
const txInfo = {};
|
|
201
230
|
const feePerByte = await getRecoveryFeePerBytes(coin, { defaultValue: 100 });
|
|
202
231
|
// KRS recovery transactions have a 2nd output to pay the recovery fee, like paygo fees. Use p2wsh outputs because
|
|
@@ -204,32 +233,34 @@ async function backupKeyRecovery(coin, bitgo, params) {
|
|
|
204
233
|
// segwit overhead size and p2sh inputs for the same reason.
|
|
205
234
|
const outputSize = (isKrsRecovery ? 2 : 1) * unspents_1.VirtualSizes.txP2wshOutputSize;
|
|
206
235
|
const approximateSize = unspents_1.VirtualSizes.txSegOverheadVSize + outputSize + unspents_1.VirtualSizes.txP2shInputSize * unspents.length;
|
|
207
|
-
const approximateFee =
|
|
208
|
-
|
|
209
|
-
|
|
236
|
+
const approximateFee = BigInt(approximateSize * feePerByte);
|
|
237
|
+
txInfo.inputs =
|
|
238
|
+
responseTxFormat === 'legacy'
|
|
239
|
+
? unspents.map((u) => ({ ...u, value: Number(u.value), valueString: u.value.toString(), prevTx: undefined }))
|
|
240
|
+
: undefined;
|
|
210
241
|
unspents.forEach((unspent) => {
|
|
211
|
-
|
|
212
|
-
transactionBuilder.addInput(txid, vout, 0xffffffff, utxolib.address.toOutputScript(unspent.address, coin.network), unspent.value);
|
|
242
|
+
utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, walletKeys, 'user', 'backup');
|
|
213
243
|
});
|
|
214
|
-
let krsFee =
|
|
244
|
+
let krsFee = BigInt(0);
|
|
215
245
|
if (isKrsRecovery && params.krsProvider) {
|
|
216
246
|
try {
|
|
217
|
-
krsFee =
|
|
247
|
+
krsFee = BigInt(await calculateFeeAmount(coin, { provider: params.krsProvider }));
|
|
218
248
|
}
|
|
219
249
|
catch (err) {
|
|
220
250
|
// Don't let this error block the recovery -
|
|
221
251
|
console.dir(err);
|
|
222
252
|
}
|
|
223
253
|
}
|
|
224
|
-
const recoveryAmount =
|
|
225
|
-
if (recoveryAmount < 0) {
|
|
254
|
+
const recoveryAmount = totalInputAmount - approximateFee - krsFee;
|
|
255
|
+
if (recoveryAmount < BigInt(0)) {
|
|
226
256
|
throw new Error(`this wallet\'s balance is too low to pay the fees specified by the KRS provider.
|
|
227
257
|
Existing balance on wallet: ${totalInputAmount.toString()}. Estimated network fee for the recovery transaction
|
|
228
258
|
: ${approximateFee.toString()}, KRS fee to pay: ${krsFee.toString()}. After deducting fees, your total
|
|
229
259
|
recoverable balance is ${recoveryAmount.toString()}`);
|
|
230
260
|
}
|
|
231
|
-
|
|
232
|
-
|
|
261
|
+
const recoveryOutputScript = utxolib.address.toOutputScript(params.recoveryDestination, coin.network);
|
|
262
|
+
psbt.addOutput({ script: recoveryOutputScript, value: recoveryAmount });
|
|
263
|
+
if (krsProvider && krsFee > BigInt(0)) {
|
|
233
264
|
if (!krsProvider.feeAddresses) {
|
|
234
265
|
throw new Error(`keyProvider must define feeAddresses`);
|
|
235
266
|
}
|
|
@@ -237,55 +268,67 @@ async function backupKeyRecovery(coin, bitgo, params) {
|
|
|
237
268
|
if (!krsFeeAddress) {
|
|
238
269
|
throw new Error('this KRS provider has not configured their fee structure yet - recovery cannot be completed');
|
|
239
270
|
}
|
|
240
|
-
|
|
271
|
+
const krsFeeOutputScript = utxolib.address.toOutputScript(krsFeeAddress, coin.network);
|
|
272
|
+
psbt.addOutput({ script: krsFeeOutputScript, value: krsFee });
|
|
241
273
|
}
|
|
242
274
|
if (isUnsignedSweep) {
|
|
243
|
-
|
|
275
|
+
// TODO BTC-317 - When ready to PSBTify OVC, send psbt hex and skip unspents in response.
|
|
276
|
+
const txHex = psbt.getUnsignedTx().toBuffer().toString('hex');
|
|
244
277
|
return formatForOfflineVault(coin.getChain(), txInfo, txHex);
|
|
245
278
|
}
|
|
246
279
|
else {
|
|
247
|
-
|
|
248
|
-
if (
|
|
249
|
-
|
|
280
|
+
(0, sign_1.signAndVerifyPsbt)(psbt, walletKeys.user, { isLastSignature: false });
|
|
281
|
+
if (isKrsRecovery) {
|
|
282
|
+
// The KRS provider keyternal solely supports P2SH, P2WSH, and P2SH-P2WSH input script types.
|
|
283
|
+
// It currently uses an outdated BitGoJS SDK, which relies on a legacy transaction builder for cosigning.
|
|
284
|
+
// Unfortunately, upgrading the keyternal code presents challenges,
|
|
285
|
+
// which hinders the integration of the latest BitGoJS SDK with PSBT signing support.
|
|
286
|
+
txInfo.transactionHex =
|
|
287
|
+
params.krsProvider === 'keyternal'
|
|
288
|
+
? utxolib.bitgo.extractP2msOnlyHalfSignedTx(psbt).toBuffer().toString('hex')
|
|
289
|
+
: psbt.toHex();
|
|
250
290
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
transactionDetails = await smartbitApi_1.SmartbitApi.forCoin(coin.getChain()).getTransactionDetails(transaction);
|
|
255
|
-
}
|
|
256
|
-
catch (e) {
|
|
257
|
-
// some coins don't have a reliable third party verification endpoint, or sometimes the third party endpoint
|
|
258
|
-
// could be unavailable due to service outage, so we continue without verification for those coins, but we will
|
|
259
|
-
// let users know that they should verify their own
|
|
260
|
-
// this message should be piped to WRW and displayed on the UI
|
|
261
|
-
if (e instanceof baseApi_1.ApiNotImplementedError || e instanceof baseApi_1.ApiRequestError) {
|
|
262
|
-
console.log('Please verify your transaction by decoding the tx hex using a third-party api of your choice');
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
throw e;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
if (transactionDetails) {
|
|
269
|
-
/**
|
|
270
|
-
* Verify that the txhex user signs correspond to the correct tx they intended
|
|
271
|
-
* by 1) getting back the decoded transaction based on the txhex
|
|
272
|
-
* and then 2) compute the txid (hash), h1 of the decoded transaction 3) compare h1
|
|
273
|
-
* to the txid (hash) of the transaction (including unspent info) we constructed
|
|
274
|
-
*/
|
|
275
|
-
if (transactionDetails.TxId !== transaction.getId()) {
|
|
276
|
-
console.log('txhash/txid returned by blockexplorer: ', transactionDetails.TxId);
|
|
277
|
-
console.log('txhash/txid of the transaction bitgo constructed', transaction.getId());
|
|
278
|
-
throw new Error('inconsistent recovery transaction id');
|
|
279
|
-
}
|
|
280
|
-
txInfo.tx = transactionDetails;
|
|
291
|
+
else {
|
|
292
|
+
const tx = (0, sign_1.signAndVerifyPsbt)(psbt, walletKeys.backup, { isLastSignature: true });
|
|
293
|
+
txInfo.transactionHex = tx.toBuffer().toString('hex');
|
|
281
294
|
}
|
|
282
295
|
}
|
|
283
296
|
if (isKrsRecovery) {
|
|
284
297
|
txInfo.coin = coin.getChain();
|
|
285
298
|
txInfo.backupKey = params.backupKey;
|
|
286
|
-
txInfo.recoveryAmount = recoveryAmount;
|
|
299
|
+
txInfo.recoveryAmount = Number(recoveryAmount);
|
|
300
|
+
txInfo.recoveryAmountString = recoveryAmount.toString();
|
|
287
301
|
}
|
|
288
302
|
return txInfo;
|
|
289
303
|
}
|
|
290
304
|
exports.backupKeyRecovery = backupKeyRecovery;
|
|
291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCw0QkFBNEI7QUFDNUIsZ0RBQWdEO0FBQ2hELE1BQU0sRUFDSixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLG9CQUFvQixHQUNyQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFPbEIsbURBQW9EO0FBRXBELG1EQVM4QjtBQUc5Qix5REFBK0Q7QUFDL0QsdUNBQW9FO0FBQ3BFLCtDQUE0QztBQUM1Qyw2Q0FBMEM7QUFDMUMsaURBQThDO0FBQzlDLGtDQUF5RDtBQWV6RDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixRQUFnQixFQUNoQixNQUFtQyxFQUNuQyxLQUFhO0lBRWIsT0FBTztRQUNMLEtBQUs7UUFDTCxNQUFNLEVBQUU7WUFDTixRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU07U0FDeEI7UUFDRCxPQUFPLEVBQUUsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsS0FBSyxVQUFVLHNCQUFzQixDQUFDLElBQXNCO0lBQzFELE9BQU8sTUFBTSxJQUFJLDJCQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxJQUFzQixFQUFFLE1BQTRCO0lBQ3BGLE1BQU0sV0FBVyxHQUFHLHVCQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtRQUM3QixNQUFNLElBQUksS0FB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QztLQUN4QztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUE5TEQsOENBOExDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmNvbnN0IHtcbiAgZ2V0SW50ZXJuYWxDaGFpbkNvZGUsXG4gIHBhcnNlT3V0cHV0SWQsXG4gIHNjcmlwdFR5cGVGb3JDaGFpbixcbiAgV2FsbGV0VW5zcGVudFNpZ25lcixcbiAgb3V0cHV0U2NyaXB0cyxcbiAgZ2V0RXh0ZXJuYWxDaGFpbkNvZGUsXG59ID0gdXR4b2xpYi5iaXRnbztcblxudHlwZSBDaGFpbkNvZGUgPSB1dHhvbGliLmJpdGdvLkNoYWluQ29kZTtcbnR5cGUgUm9vdFdhbGxldEtleXMgPSB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzO1xudHlwZSBXYWxsZXRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gdXR4b2xpYi5iaXRnby5XYWxsZXRVbnNwZW50PFROdW1iZXI+O1xudHlwZSBTY3JpcHRUeXBlMk9mMyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcblxuaW1wb3J0IHsgVmlydHVhbFNpemVzIH0gZnJvbSAnQGJpdGdvLWJldGEvdW5zcGVudHMnO1xuXG5pbXBvcnQge1xuICBCaXRHb0Jhc2UsXG4gIEVycm9yTm9JbnB1dFRvUmVjb3ZlcixcbiAgZ2V0S3JzUHJvdmlkZXIsXG4gIGdldEJpcDMyS2V5cyxcbiAgZ2V0SXNLcnNSZWNvdmVyeSxcbiAgZ2V0SXNVbnNpZ25lZFN3ZWVwLFxuICBpc1RyaXBsZSxcbiAga3JzUHJvdmlkZXJzLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luIH0gZnJvbSAnLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5cbmltcG9ydCB7IGZvckNvaW4sIFJlY292ZXJ5UHJvdmlkZXIgfSBmcm9tICcuL1JlY292ZXJ5UHJvdmlkZXInO1xuaW1wb3J0IHsgQXBpTm90SW1wbGVtZW50ZWRFcnJvciwgQXBpUmVxdWVzdEVycm9yIH0gZnJvbSAnLi9iYXNlQXBpJztcbmltcG9ydCB7IFNtYXJ0Yml0QXBpIH0gZnJvbSAnLi9zbWFydGJpdEFwaSc7XG5pbXBvcnQgeyBNZW1wb29sQXBpIH0gZnJvbSAnLi9tZW1wb29sQXBpJztcbmltcG9ydCB7IENvaW5nZWNrb0FwaSB9IGZyb20gJy4vY29pbmdlY2tvQXBpJztcbmltcG9ydCB7IHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3NpZ24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9mZmxpbmVWYXVsdFR4SW5mbzxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIGlucHV0czogV2FsbGV0VW5zcGVudDxUTnVtYmVyPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbzxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIHR4SW5mbzoge1xuICAgIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W107XG4gIH07XG4gIHR4SGV4OiBzdHJpbmc7XG4gIGZlZUluZm86IFJlY29yZDxzdHJpbmcsIG5ldmVyPjtcbiAgY29pbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgdHJhbnNmb3JtcyB0aGUgdHhJbmZvIGZyb20gcmVjb3ZlciBpbnRvIHRoZSBmb3JtYXQgdGhhdCBvZmZsaW5lLXNpZ25pbmctdG9vbCBleHBlY3RzXG4gKiBAcGFyYW0gY29pbk5hbWVcbiAqIEBwYXJhbSB0eEluZm9cbiAqIEBwYXJhbSB0eEhleFxuICogQHJldHVybnMge3t0eEhleDogKiwgdHhJbmZvOiB7dW5zcGVudHM6ICp9LCBmZWVJbmZvOiB7fSwgY29pbjogdm9pZH19XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEZvck9mZmxpbmVWYXVsdDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgY29pbk5hbWU6IHN0cmluZyxcbiAgdHhJbmZvOiBPZmZsaW5lVmF1bHRUeEluZm88VE51bWJlcj4sXG4gIHR4SGV4OiBzdHJpbmdcbik6IEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbzxUTnVtYmVyPiB7XG4gIHJldHVybiB7XG4gICAgdHhIZXgsXG4gICAgdHhJbmZvOiB7XG4gICAgICB1bnNwZW50czogdHhJbmZvLmlucHV0cyxcbiAgICB9LFxuICAgIGZlZUluZm86IHt9LFxuICAgIGNvaW46IGNvaW5OYW1lLFxuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBtYXJrZXQgcHJpY2UgZnJvbSBhIHRoaXJkIHBhcnR5IHRvIGJlIHVzZWQgZm9yIHJlY292ZXJ5XG4gKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgaW50ZW5kZWQgZm9yIG5vbi1iaXRnbyByZWNvdmVyeSB0cmFuc2FjdGlvbnMsIHdoZW4gaXQgaXMgbmVjZXNzYXJ5XG4gKiB0byBjYWxjdWxhdGUgdGhlIHJvdWdoIGZlZSBuZWVkZWQgdG8gcGF5IHRvIEtleXRlcm5hbC4gV2UgYXJlIG9rYXkgd2l0aCBhcHByb3hpbWF0aW5nLFxuICogYmVjYXVzZSB0aGUgcmVzdWx0aW5nIHByaWNlIG9mIHRoaXMgZnVuY3Rpb24gb25seSBoYXMgbGVzcyB0aGFuIDEgZG9sbGFyIGluZmx1ZW5jZSBvbiB0aGVcbiAqIGZlZSB0aGF0IG5lZWRzIHRvIGJlIHBhaWQgdG8gS2V5dGVybmFsLlxuICpcbiAqIFNlZSBjYWxjdWxhdGVGZWVBbW91bnQgZnVuY3Rpb246ICByZXR1cm4gTWF0aC5yb3VuZChmZWVBbW91bnRVc2QgLyBjdXJyZW50UHJpY2UgKiBzZWxmLmdldEJhc2VGYWN0b3IoKSk7XG4gKlxuICogVGhpcyBlbmQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGFuIGFjY3VyYXRlIGVuZHBvaW50LCBzaW5jZSBzb21lIGNvaW5zJyBwcmljZXMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgcHJvdmlkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlNYXJrZXRQcmljZShjb2luOiBBYnN0cmFjdFV0eG9Db2luKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBDb2luZ2Vja29BcGkoKS5nZXRVU0RQcmljZShjb2luLmdldEZhbWlseSgpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhbW91bnQgKGluIGJhc2UgdW5pdHMpIHRvIHBheSBhIEtSUyBwcm92aWRlciB3aGVuIGJ1aWxkaW5nIGEgcmVjb3ZlcnkgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBjb2luXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcGFyYW0gcGFyYW1zLnByb3ZpZGVyIHtTdHJpbmd9IHRoZSBLUlMgcHJvdmlkZXIgdGhhdCBob2xkcyB0aGUgYmFja3VwIGtleVxuICogQHJldHVybnMgeyp9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUZlZUFtb3VudChjb2luOiBBYnN0cmFjdFV0eG9Db2luLCBwYXJhbXM6IHsgcHJvdmlkZXI6IHN0cmluZyB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qga3JzUHJvdmlkZXIgPSBrcnNQcm92aWRlcnNbcGFyYW1zLnByb3ZpZGVyXTtcblxuICBpZiAoa3JzUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gZmVlIHN0cnVjdHVyZSBzcGVjaWZpZWQgZm9yIHByb3ZpZGVyICR7cGFyYW1zLnByb3ZpZGVyfWApO1xuICB9XG5cbiAgaWYgKGtyc1Byb3ZpZGVyLmZlZVR5cGUgPT09ICdmbGF0VXNkJykge1xuICAgIGNvbnN0IGZlZUFtb3VudFVzZCA9IGtyc1Byb3ZpZGVyLmZlZUFtb3VudDtcbiAgICBjb25zdCBjdXJyZW50UHJpY2U6IG51bWJlciA9IGF3YWl0IGdldFJlY292ZXJ5TWFya2V0UHJpY2UoY29pbik7XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoZmVlQW1vdW50VXNkIC8gY3VycmVudFByaWNlKSAqIGNvaW4uZ2V0QmFzZUZhY3RvcigpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3ZSBjYW4gYWRkIG1vcmUgZmVlIHN0cnVjdHVyZXMgaGVyZSBhcyBuZWVkZWQgZm9yIGRpZmZlcmVudCBwcm92aWRlcnMsIHN1Y2ggYXMgcGVyY2VudGFnZSBvZiByZWNvdmVyeSBhbW91bnRcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZlZSBzdHJ1Y3R1cmUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyUGFyYW1zIHtcbiAgc2Nhbj86IG51bWJlcjtcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICBrcnNQcm92aWRlcj86IHN0cmluZztcbiAgaWdub3JlQWRkcmVzc1R5cGVzOiBTY3JpcHRUeXBlMk9mM1tdO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIHVzZXJLZXlQYXRoPzogc3RyaW5nO1xuICByZWNvdmVyeVByb3ZpZGVyPzogUmVjb3ZlcnlQcm92aWRlcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBwYXJhbXM6IFJlY292ZXJQYXJhbXMsXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICBjaGFpbjogQ2hhaW5Db2RlXG4pOiBQcm9taXNlPFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXT4ge1xuICBjb25zdCByZWNvdmVyeVByb3ZpZGVyID0gcGFyYW1zLnJlY292ZXJ5UHJvdmlkZXIgPz8gZm9yQ29pbihjb2luLmdldENoYWluKCksIHBhcmFtcy5hcGlLZXkpO1xuICBjb25zdCBNQVhfU0VRVUVOVElBTF9BRERSRVNTRVNfV0lUSE9VVF9UWFMgPSBwYXJhbXMuc2NhbiB8fCAyMDtcbiAgbGV0IG51bVNlcXVlbnRpYWxBZGRyZXNzZXNXaXRob3V0VHhzID0gMDtcblxuICBhc3luYyBmdW5jdGlvbiBnYXRoZXJVbnNwZW50cyhhZGRySW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHdhbGxldEtleXNGb3JVbnNwZW50ID0gd2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KGNoYWluLCBhZGRySW5kZXgpO1xuICAgIGNvbnN0IGFkZHJlc3MgPSBjb2luLmNyZWF0ZU11bHRpU2lnQWRkcmVzcyhzY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pLCAyLCB3YWxsZXRLZXlzRm9yVW5zcGVudC5wdWJsaWNLZXlzKTtcblxuICAgIGNvbnN0IGFkZHJJbmZvID0gYXdhaXQgcmVjb3ZlcnlQcm92aWRlci5nZXRBZGRyZXNzSW5mbyhhZGRyZXNzLmFkZHJlc3MpO1xuICAgIC8vIHdlIHVzZSB0eENvdW50IGhlcmUgYmVjYXVzZSBpdCBpbXBsaWVzIHVzYWdlIC0gaGF2aW5nIHR4J2VzIG1lYW5zIHRoZSBhZGRyIHdhcyBnZW5lcmF0ZWQgYW5kIHVzZWRcbiAgICBpZiAoYWRkckluZm8udHhDb3VudCA9PT0gMCkge1xuICAgICAgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPSAwO1xuXG4gICAgICBpZiAoYWRkckluZm8uYmFsYW5jZSA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYEZvdW5kIGFuIGFkZHJlc3Mgd2l0aCBiYWxhbmNlOiAke2FkZHJlc3MuYWRkcmVzc30gd2l0aCBiYWxhbmNlICR7YWRkckluZm8uYmFsYW5jZX1gKTtcbiAgICAgICAgY29uc3QgYWRkcmVzc1Vuc3BlbnRzID0gYXdhaXQgcmVjb3ZlcnlQcm92aWRlci5nZXRVbnNwZW50c0ZvckFkZHJlc3NlcyhbYWRkcmVzcy5hZGRyZXNzXSk7XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkVW5zcGVudHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBhZGRyZXNzVW5zcGVudHMubWFwKGFzeW5jICh1KTogUHJvbWlzZTxXYWxsZXRVbnNwZW50PFROdW1iZXI+PiA9PiB7XG4gICAgICAgICAgICBpZiAoY29pbi5hbW91bnRUeXBlID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICAvLyBibG9ja2NoYWlyIHJldHVybnMgdGhlIG51bWJlciB3aXRoIHRoZSBjb3JyZWN0IHByZWNpc2lvbiwgYnV0IGluIG51bWJlciBmb3JtYXRcbiAgICAgICAgICAgICAgLy8ganNvbiBwYXJzZSB3b24ndCBwYXJzZSBpdCBjb3JyZWN0bHksIHNvIHdlIHJlcXVlcnkgdGhlIHR4aWQgZm9yIHRoZSB0eCBoZXggdG8gZGVjb2RlIGhlcmVcbiAgICAgICAgICAgICAgbGV0IHZhbCA9IEJpZ0ludCh1LnZhbHVlKSBhcyBUTnVtYmVyO1xuICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB0eGlkLCB2b3V0IH0gPSB1dHhvbGliLmJpdGdvLnBhcnNlT3V0cHV0SWQodS5pZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCByZWNvdmVyeVByb3ZpZGVyLmdldFRyYW5zYWN0aW9uSGV4KHR4aWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR4ID0gY29pbi5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4odHhIZXgpO1xuICAgICAgICAgICAgICAgIHZhbCA9IHR4Lm91dHNbdm91dF0udmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi51LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuICAgICAgICAgICAgICAgIGluZGV4OiBhZGRySW5kZXgsXG4gICAgICAgICAgICAgIH0gYXMgV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4udSxcbiAgICAgICAgICAgICAgICBjaGFpbjogY2hhaW4sXG4gICAgICAgICAgICAgICAgaW5kZXg6IGFkZHJJbmRleCxcbiAgICAgICAgICAgICAgfSBhcyBXYWxsZXRVbnNwZW50PFROdW1iZXI+O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgd2FsbGV0VW5zcGVudHMucHVzaCguLi5wcm9jZXNzZWRVbnNwZW50cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG51bVNlcXVlbnRpYWxBZGRyZXNzZXNXaXRob3V0VHhzID49IE1BWF9TRVFVRU5USUFMX0FERFJFU1NFU19XSVRIT1VUX1RYUykge1xuICAgICAgLy8gc3RvcCBzZWFyY2hpbmcgZm9yIGFkZHJlc3NlcyB3aXRoIHVuc3BlbnRzIGluIHRoZW0sIHdlJ3ZlIGZvdW5kICR7TUFYX1NFUVVFTlRJQUxfQUREUkVTU0VTX1dJVEhPVVRfVFhTfSBpbiBhIHJvdyB3aXRoIG5vbmVcbiAgICAgIC8vIHdlIGFyZSBkb25lXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGhlclVuc3BlbnRzKGFkZHJJbmRleCArIDEpO1xuICB9XG5cbiAgLy8gZ2V0IHVuc3BlbnRzIGZvciB0aGVzZSBhZGRyZXNzZXNcblxuICBjb25zdCB3YWxsZXRVbnNwZW50czogV2FsbGV0VW5zcGVudDxUTnVtYmVyPltdID0gW107XG4gIC8vIFRoaXMgd2lsbCBwb3B1bGF0ZSB3YWxsZXRBZGRyZXNzZXNcbiAgYXdhaXQgZ2F0aGVyVW5zcGVudHMoMCk7XG5cbiAgaWYgKHdhbGxldFVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIENvdWxkbid0IGZpbmQgYW55IGFkZHJlc3NlcyB3aXRoIGZ1bmRzXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIHdhbGxldFVuc3BlbnRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRSZWNvdmVyeUZlZVBlckJ5dGVzKFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB7IGRlZmF1bHRWYWx1ZSB9OiB7IGRlZmF1bHRWYWx1ZTogbnVtYmVyIH1cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IE1lbXBvb2xBcGkuZm9yQ29pbihjb2luLmdldENoYWluKCkpLmdldFJlY292ZXJ5RmVlUGVyQnl0ZXMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZGlyKGUpO1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IHtcbiAgaW5wdXRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W107XG4gIHRyYW5zYWN0aW9uSGV4OiBzdHJpbmc7XG4gIGNvaW46IHN0cmluZztcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIHJlY292ZXJ5QW1vdW50OiBUTnVtYmVyO1xuICAvLyBzbWFydGJpdCBhcGkgcmVzcG9uc2VcbiAgdHg/OiB1bmtub3duO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gKiBAcGFyYW0gY29pblxuICogQHBhcmFtIGJpdGdvXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAtIHVzZXJLZXk6IFtlbmNyeXB0ZWRdIHhwcnYsIG9yIHhwdWJcbiAqIC0gYmFja3VwS2V5OiBbZW5jcnlwdGVkXSB4cHJ2LCBvciB4cHViIGlmIHRoZSB4cHJ2IGlzIGhlbGQgYnkgYSBLUlMgcHJvdmlkZXJcbiAqIC0gd2FsbGV0UGFzc3BocmFzZTogbmVjZXNzYXJ5IGlmIG9uZSBvZiB0aGUgeHBydnMgaXMgZW5jcnlwdGVkXG4gKiAtIGJpdGdvS2V5OiB4cHViXG4gKiAtIGtyc1Byb3ZpZGVyOiBuZWNlc3NhcnkgaWYgYmFja3VwIGtleSBpcyBoZWxkIGJ5IEtSU1xuICogLSByZWNvdmVyeURlc3RpbmF0aW9uOiB0YXJnZXQgYWRkcmVzcyB0byBzZW5kIHJlY292ZXJlZCBmdW5kcyB0b1xuICogLSBzY2FuOiB0aGUgYW1vdW50IG9mIGNvbnNlY3V0aXZlIGFkZHJlc3NlcyB3aXRob3V0IHVuc3BlbnRzIHRvIHNjYW4gdGhyb3VnaCBiZWZvcmUgc3RvcHBpbmdcbiAqIC0gaWdub3JlQWRkcmVzc1R5cGVzOiAob3B0aW9uYWwpIHNjcmlwdHMgdG8gaWdub3JlXG4gKiAgICAgICAgZm9yIGV4YW1wbGU6IFsncDJzaFAyd3NoJywgJ3Ayd3NoJ10gd2lsbCBwcmV2ZW50IGNvZGUgZnJvbSBjaGVja2luZyBmb3Igd3JhcHBlZC1zZWd3aXQgYW5kIG5hdGl2ZS1zZWd3aXQgY2hhaW5zIG9uIHRoZSBwdWJsaWMgYmxvY2sgZXhwbG9yZXJzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYWNrdXBLZXlSZWNvdmVyeTxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgcGFyYW1zOiBSZWNvdmVyUGFyYW1zXG4pOiBQcm9taXNlPEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb248VE51bWJlcj4gfCBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm88VE51bWJlcj4+IHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVzZXJLZXknKTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5iYWNrdXBLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGJhY2t1cEtleScpO1xuICB9XG5cbiAgaWYgKFxuICAgIF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pIHx8XG4gICAgIWNvaW4uaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIHsgYW55Rm9ybWF0OiB0cnVlIH0pXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNjYW4pICYmICghXy5pc0ludGVnZXIocGFyYW1zLnNjYW4pIHx8IHBhcmFtcy5zY2FuIDwgMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjYW4gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuXG4gIGNvbnN0IGlzS3JzUmVjb3ZlcnkgPSBnZXRJc0tyc1JlY292ZXJ5KHBhcmFtcyk7XG4gIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9IGdldElzVW5zaWduZWRTd2VlcChwYXJhbXMpO1xuXG4gIGNvbnN0IGtyc1Byb3ZpZGVyID0gaXNLcnNSZWNvdmVyeSA/IGdldEtyc1Byb3ZpZGVyKGNvaW4sIHBhcmFtcy5rcnNQcm92aWRlcikgOiB1bmRlZmluZWQ7XG5cbiAgLy8gY2hlY2sgd2hldGhlciBrZXkgbWF0ZXJpYWwgYW5kIHBhc3N3b3JkIGF1dGhlbnRpY2F0ZSB0aGUgdXNlcnMgYW5kIHJldHVybiBwYXJlbnQga2V5cyBvZiBhbGwgdGhyZWUga2V5cyBvZiB0aGUgd2FsbGV0XG4gIGNvbnN0IGtleXMgPSBnZXRCaXAzMktleXMoYml0Z28sIHBhcmFtcywgeyByZXF1aXJlQml0R29YcHViOiB0cnVlIH0pO1xuICBpZiAoIWlzVHJpcGxlKGtleXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCBrZXkgdHJpcGxlYCk7XG4gIH1cbiAgY29uc3Qgd2FsbGV0S2V5cyA9IG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKGtleXMsIFtcbiAgICBwYXJhbXMudXNlcktleVBhdGggfHwgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuICAgIHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgICB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLmRlZmF1bHRQcmVmaXgsXG4gIF0pO1xuXG4gIGNvbnN0IHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10gPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBvdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mM1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChhZGRyZXNzVHlwZSkgPT4gY29pbi5zdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlKSAmJiAhcGFyYW1zLmlnbm9yZUFkZHJlc3NUeXBlcz8uaW5jbHVkZXMoYWRkcmVzc1R5cGUpXG4gICAgICAgIClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocXVlcmllcywgYWRkcmVzc1R5cGUpID0+IFtcbiAgICAgICAgICAgIC4uLnF1ZXJpZXMsXG4gICAgICAgICAgICBxdWVyeUJsb2NrY2hhaW5VbnNwZW50c1BhdGg8VE51bWJlcj4oY29pbiwgcGFyYW1zLCB3YWxsZXRLZXlzLCBnZXRFeHRlcm5hbENoYWluQ29kZShhZGRyZXNzVHlwZSkpLFxuICAgICAgICAgICAgcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoPFROdW1iZXI+KGNvaW4sIHBhcmFtcywgd2FsbGV0S2V5cywgZ2V0SW50ZXJuYWxDaGFpbkNvZGUoYWRkcmVzc1R5cGUpKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIFtdIGFzIFByb21pc2U8V2FsbGV0VW5zcGVudDxUTnVtYmVyPltdPltdXG4gICAgICAgIClcbiAgICApXG4gICkuZmxhdCgpO1xuXG4gIC8vIEV4ZWN1dGUgdGhlIHF1ZXJpZXMgYW5kIGdhdGhlciB0aGUgdW5zcGVudHNcbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHV0eG9saWIuYml0Z28udW5zcGVudFN1bTxUTnVtYmVyPih1bnNwZW50cywgY29pbi5hbW91bnRUeXBlKTtcbiAgaWYgKHRvdGFsSW5wdXRBbW91bnQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvck5vSW5wdXRUb1JlY292ZXIoKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSB0cmFuc2FjdGlvblxuICBjb25zdCB0cmFuc2FjdGlvbkJ1aWxkZXIgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZvck5ldHdvcms8VE51bWJlcj4oY29pbi5uZXR3b3JrKTtcbiAgY29uc3QgdHhJbmZvID0ge30gYXMgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbjxUTnVtYmVyPjtcblxuICBjb25zdCBmZWVQZXJCeXRlOiBudW1iZXIgPSBhd2FpdCBnZXRSZWNvdmVyeUZlZVBlckJ5dGVzKGNvaW4sIHsgZGVmYXVsdFZhbHVlOiAxMDAgfSk7XG5cbiAgLy8gS1JTIHJlY292ZXJ5IHRyYW5zYWN0aW9ucyBoYXZlIGEgMm5kIG91dHB1dCB0byBwYXkgdGhlIHJlY292ZXJ5IGZlZSwgbGlrZSBwYXlnbyBmZWVzLiBVc2UgcDJ3c2ggb3V0cHV0cyBiZWNhdXNlXG4gIC8vIHRoZXkgYXJlIHRoZSBsYXJnZXN0IG91dHB1dHMgYW5kIHRodXMgdGhlIG1vc3QgY29uc2VydmF0aXZlIGVzdGltYXRlIHRvIHVzZSBpbiBjYWxjdWxhdGluZyBmZWVzLiBBbHNvIHVzZVxuICAvLyBzZWd3aXQgb3ZlcmhlYWQgc2l6ZSBhbmQgcDJzaCBpbnB1dHMgZm9yIHRoZSBzYW1lIHJlYXNvbi5cbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IChpc0tyc1JlY292ZXJ5ID8gMiA6IDEpICogVmlydHVhbFNpemVzLnR4UDJ3c2hPdXRwdXRTaXplO1xuICBjb25zdCBhcHByb3hpbWF0ZVNpemUgPSBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplICsgb3V0cHV0U2l6ZSArIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiB1bnNwZW50cy5sZW5ndGg7XG4gIGNvbnN0IGFwcHJveGltYXRlRmVlOiBUTnVtYmVyID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oYXBwcm94aW1hdGVTaXplICogZmVlUGVyQnl0ZSwgY29pbi5hbW91bnRUeXBlKTtcblxuICAvLyBDb25zdHJ1Y3QgYSB0cmFuc2FjdGlvblxuICB0eEluZm8uaW5wdXRzID0gdW5zcGVudHM7XG5cbiAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCkgPT4ge1xuICAgIGNvbnN0IHsgdHhpZCwgdm91dCB9ID0gcGFyc2VPdXRwdXRJZCh1bnNwZW50LmlkKTtcbiAgICB0cmFuc2FjdGlvbkJ1aWxkZXIuYWRkSW5wdXQoXG4gICAgICB0eGlkLFxuICAgICAgdm91dCxcbiAgICAgIDB4ZmZmZmZmZmYsXG4gICAgICB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQodW5zcGVudC5hZGRyZXNzLCBjb2luLm5ldHdvcmspLFxuICAgICAgdW5zcGVudC52YWx1ZVxuICAgICk7XG4gIH0pO1xuXG4gIGxldCBrcnNGZWU6IFROdW1iZXIgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPigwLCBjb2luLmFtb3VudFR5cGUpO1xuICBpZiAoaXNLcnNSZWNvdmVyeSAmJiBwYXJhbXMua3JzUHJvdmlkZXIpIHtcbiAgICB0cnkge1xuICAgICAga3JzRmVlID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgICAgIGF3YWl0IGNhbGN1bGF0ZUZlZUFtb3VudChjb2luLCB7IHByb3ZpZGVyOiBwYXJhbXMua3JzUHJvdmlkZXIgfSksXG4gICAgICAgIGNvaW4uYW1vdW50VHlwZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIERvbid0IGxldCB0aGlzIGVycm9yIGJsb2NrIHRoZSByZWNvdmVyeSAtXG4gICAgICBjb25zb2xlLmRpcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgQmlnSW50KHRvdGFsSW5wdXRBbW91bnQpIC0gQmlnSW50KGFwcHJveGltYXRlRmVlKSAtIEJpZ0ludChrcnNGZWUpLFxuICAgIGNvaW4uYW1vdW50VHlwZVxuICApO1xuXG4gIGlmIChyZWNvdmVyeUFtb3VudCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRoaXMgd2FsbGV0XFwncyBiYWxhbmNlIGlzIHRvbyBsb3cgdG8gcGF5IHRoZSBmZWVzIHNwZWNpZmllZCBieSB0aGUgS1JTIHByb3ZpZGVyLiBcbiAgICAgICAgICBFeGlzdGluZyBiYWxhbmNlIG9uIHdhbGxldDogJHt0b3RhbElucHV0QW1vdW50LnRvU3RyaW5nKCl9LiBFc3RpbWF0ZWQgbmV0d29yayBmZWUgZm9yIHRoZSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICAgICAgICAgIDogJHthcHByb3hpbWF0ZUZlZS50b1N0cmluZygpfSwgS1JTIGZlZSB0byBwYXk6ICR7a3JzRmVlLnRvU3RyaW5nKCl9LiBBZnRlciBkZWR1Y3RpbmcgZmVlcywgeW91ciB0b3RhbCBcbiAgICAgICAgICByZWNvdmVyYWJsZSBiYWxhbmNlIGlzICR7cmVjb3ZlcnlBbW91bnQudG9TdHJpbmcoKX1gKTtcbiAgfVxuXG4gIHRyYW5zYWN0aW9uQnVpbGRlci5hZGRPdXRwdXQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIHJlY292ZXJ5QW1vdW50KTtcblxuICBpZiAoa3JzUHJvdmlkZXIgJiYga3JzRmVlID4gMCkge1xuICAgIGlmICgha3JzUHJvdmlkZXIuZmVlQWRkcmVzc2VzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGtleVByb3ZpZGVyIG11c3QgZGVmaW5lIGZlZUFkZHJlc3Nlc2ApO1xuICAgIH1cblxuICAgIGNvbnN0IGtyc0ZlZUFkZHJlc3MgPSBrcnNQcm92aWRlci5mZWVBZGRyZXNzZXNbY29pbi5nZXRDaGFpbigpXTtcblxuICAgIGlmICgha3JzRmVlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIEtSUyBwcm92aWRlciBoYXMgbm90IGNvbmZpZ3VyZWQgdGhlaXIgZmVlIHN0cnVjdHVyZSB5ZXQgLSByZWNvdmVyeSBjYW5ub3QgYmUgY29tcGxldGVkJyk7XG4gICAgfVxuXG4gICAgdHJhbnNhY3Rpb25CdWlsZGVyLmFkZE91dHB1dChrcnNGZWVBZGRyZXNzLCBrcnNGZWUpO1xuICB9XG5cbiAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgIGNvbnN0IHR4SGV4ID0gdHJhbnNhY3Rpb25CdWlsZGVyLmJ1aWxkSW5jb21wbGV0ZSgpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIHJldHVybiBmb3JtYXRGb3JPZmZsaW5lVmF1bHQoY29pbi5nZXRDaGFpbigpLCB0eEluZm8gYXMgT2ZmbGluZVZhdWx0VHhJbmZvPFROdW1iZXI+LCB0eEhleCk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHRyYW5zYWN0aW9uID0gc2lnbkFuZFZlcmlmeVdhbGxldFRyYW5zYWN0aW9uKFxuICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyLFxuICAgICAgdW5zcGVudHMsXG4gICAgICBuZXcgV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz4od2FsbGV0S2V5cywgd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJhY2t1cCksXG4gICAgICB7IGlzTGFzdFNpZ25hdHVyZTogZmFsc2UgfVxuICAgICk7XG4gICAgaWYgKCFpc0tyc1JlY292ZXJ5KSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbihcbiAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICAgIHVuc3BlbnRzLFxuICAgICAgICBuZXcgV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz4od2FsbGV0S2V5cywgd2FsbGV0S2V5cy5iYWNrdXAsIHdhbGxldEtleXMudXNlciksXG4gICAgICAgIHsgaXNMYXN0U2lnbmF0dXJlOiB0cnVlIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHhJbmZvLnRyYW5zYWN0aW9uSGV4ID0gdHJhbnNhY3Rpb24udG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBsZXQgdHJhbnNhY3Rpb25EZXRhaWxzO1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvbkRldGFpbHMgPSBhd2FpdCBTbWFydGJpdEFwaS5mb3JDb2luKGNvaW4uZ2V0Q2hhaW4oKSkuZ2V0VHJhbnNhY3Rpb25EZXRhaWxzKHRyYW5zYWN0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzb21lIGNvaW5zIGRvbid0IGhhdmUgYSByZWxpYWJsZSB0aGlyZCBwYXJ0eSB2ZXJpZmljYXRpb24gZW5kcG9pbnQsIG9yIHNvbWV0aW1lcyB0aGUgdGhpcmQgcGFydHkgZW5kcG9pbnRcbiAgICAgIC8vIGNvdWxkIGJlIHVuYXZhaWxhYmxlIGR1ZSB0byBzZXJ2aWNlIG91dGFnZSwgc28gd2UgY29udGludWUgd2l0aG91dCB2ZXJpZmljYXRpb24gZm9yIHRob3NlIGNvaW5zLCBidXQgd2Ugd2lsbFxuICAgICAgLy8gbGV0IHVzZXJzIGtub3cgdGhhdCB0aGV5IHNob3VsZCB2ZXJpZnkgdGhlaXIgb3duXG4gICAgICAvLyB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHBpcGVkIHRvIFdSVyBhbmQgZGlzcGxheWVkIG9uIHRoZSBVSVxuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBcGlOb3RJbXBsZW1lbnRlZEVycm9yIHx8IGUgaW5zdGFuY2VvZiBBcGlSZXF1ZXN0RXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1BsZWFzZSB2ZXJpZnkgeW91ciB0cmFuc2FjdGlvbiBieSBkZWNvZGluZyB0aGUgdHggaGV4IHVzaW5nIGEgdGhpcmQtcGFydHkgYXBpIG9mIHlvdXIgY2hvaWNlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0cmFuc2FjdGlvbkRldGFpbHMpIHtcbiAgICAgIC8qKlxuICAgICAgICogVmVyaWZ5IHRoYXQgdGhlIHR4aGV4IHVzZXIgc2lnbnMgY29ycmVzcG9uZCB0byB0aGUgY29ycmVjdCB0eCB0aGV5IGludGVuZGVkXG4gICAgICAgKiBieSAxKSBnZXR0aW5nIGJhY2sgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gYmFzZWQgb24gdGhlIHR4aGV4XG4gICAgICAgKiBhbmQgdGhlbiAyKSBjb21wdXRlIHRoZSB0eGlkIChoYXNoKSwgaDEgb2YgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gMykgY29tcGFyZSBoMVxuICAgICAgICogdG8gdGhlIHR4aWQgKGhhc2gpIG9mIHRoZSB0cmFuc2FjdGlvbiAoaW5jbHVkaW5nIHVuc3BlbnQgaW5mbykgd2UgY29uc3RydWN0ZWRcbiAgICAgICAqL1xuICAgICAgaWYgKHRyYW5zYWN0aW9uRGV0YWlscy5UeElkICE9PSB0cmFuc2FjdGlvbi5nZXRJZCgpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0eGhhc2gvdHhpZCByZXR1cm5lZCBieSBibG9ja2V4cGxvcmVyOiAnLCB0cmFuc2FjdGlvbkRldGFpbHMuVHhJZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0eGhhc2gvdHhpZCBvZiB0aGUgdHJhbnNhY3Rpb24gYml0Z28gY29uc3RydWN0ZWQnLCB0cmFuc2FjdGlvbi5nZXRJZCgpKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmNvbnNpc3RlbnQgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gaWQnKTtcbiAgICAgIH1cbiAgICAgIHR4SW5mby50eCA9IHRyYW5zYWN0aW9uRGV0YWlscztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgIHR4SW5mby5jb2luID0gY29pbi5nZXRDaGFpbigpO1xuICAgIHR4SW5mby5iYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5O1xuICAgIHR4SW5mby5yZWNvdmVyeUFtb3VudCA9IHJlY292ZXJ5QW1vdW50O1xuICB9XG5cbiAgcmV0dXJuIHR4SW5mbztcbn1cbiJdfQ==
|
|
305
|
+
async function v1BackupKeyRecovery(coin, bitgo, params) {
|
|
306
|
+
if (_.isUndefined(params.recoveryDestination) ||
|
|
307
|
+
!coin.isValidAddress(params.recoveryDestination, { anyFormat: true })) {
|
|
308
|
+
throw new Error('invalid recoveryDestination');
|
|
309
|
+
}
|
|
310
|
+
const recoveryFeePerByte = await getRecoveryFeePerBytes(coin, { defaultValue: 100 });
|
|
311
|
+
const v1wallet = await bitgo.wallets().get({ id: params.walletId });
|
|
312
|
+
return await v1wallet.recover({
|
|
313
|
+
...params,
|
|
314
|
+
feeRate: recoveryFeePerByte,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
exports.v1BackupKeyRecovery = v1BackupKeyRecovery;
|
|
318
|
+
async function v1Sweep(coin, bitgo, params) {
|
|
319
|
+
if (_.isUndefined(params.recoveryDestination) ||
|
|
320
|
+
!coin.isValidAddress(params.recoveryDestination, { anyFormat: true })) {
|
|
321
|
+
throw new Error('invalid recoveryDestination');
|
|
322
|
+
}
|
|
323
|
+
let recoveryFeePerByte = 100;
|
|
324
|
+
if (bitgo.env === 'prod') {
|
|
325
|
+
recoveryFeePerByte = await getRecoveryFeePerBytes(coin, { defaultValue: 100 });
|
|
326
|
+
}
|
|
327
|
+
const v1wallet = await bitgo.wallets().get({ id: params.walletId });
|
|
328
|
+
return await v1wallet.sweep({
|
|
329
|
+
...params,
|
|
330
|
+
feeRate: recoveryFeePerByte,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
exports.v1Sweep = v1Sweep;
|
|
334
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCxpQ0FBaUM7QUFDakMsNEJBQTRCO0FBQzVCLGdEQUFnRDtBQUNoRCxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQVV4RyxtREFBb0Q7QUFFcEQsbURBUzhCO0FBRzlCLHlEQUErRDtBQUMvRCw2Q0FBMEM7QUFDMUMsaURBQThDO0FBQzlDLGtDQUE0QztBQUM1QyxtREFBNEQ7QUFlNUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FDNUIsUUFBZ0IsRUFDaEIsTUFBMEIsRUFDMUIsS0FBYTtJQUViLE9BQU87UUFDTCxLQUFLO1FBQ0wsTUFBTSxFQUFFO1lBQ04sUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3BDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFCLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RELENBQUMsQ0FBQztTQUNIO1FBQ0QsT0FBTyxFQUFFLEVBQUU7UUFDWCxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxJQUFzQjtJQUMxRCxPQUFPLE1BQU0sSUFBSSwyQkFBWSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUsa0JB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LElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7S0FDaEQ7SUFFRCxJQUFJLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztJQUM3QixJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxFQUFFO1FBQ3hCLGtCQUFrQixHQUFHLE1BQU0sc0JBQXNCLENBQUMsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDaEY7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEUsT0FBTyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDMUIsR0FBRyxNQUFNO1FBQ1QsT0FBTyxFQUFFLGtCQUFrQjtLQUM1QixDQUFDLENBQUM7QUFDTCxDQUFDO0FBMUJELDBCQTBCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cblxuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmNvbnN0IHsgZ2V0SW50ZXJuYWxDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiwgb3V0cHV0U2NyaXB0cywgZ2V0RXh0ZXJuYWxDaGFpbkNvZGUgfSA9IHV0eG9saWIuYml0Z287XG5cbnR5cGUgQ2hhaW5Db2RlID0gdXR4b2xpYi5iaXRnby5DaGFpbkNvZGU7XG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcbnR5cGUgV2FsbGV0VW5zcGVudEpTT04gPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQgJiB7XG4gIHZhbHVlU3RyaW5nOiBzdHJpbmc7XG59O1xudHlwZSBTY3JpcHRUeXBlMk9mMyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcblxuaW1wb3J0IHsgVmlydHVhbFNpemVzIH0gZnJvbSAnQGJpdGdvLWJldGEvdW5zcGVudHMnO1xuXG5pbXBvcnQge1xuICBCaXRHb0Jhc2UsXG4gIEVycm9yTm9JbnB1dFRvUmVjb3ZlcixcbiAgZ2V0S3JzUHJvdmlkZXIsXG4gIGdldEJpcDMyS2V5cyxcbiAgZ2V0SXNLcnNSZWNvdmVyeSxcbiAgZ2V0SXNVbnNpZ25lZFN3ZWVwLFxuICBpc1RyaXBsZSxcbiAga3JzUHJvdmlkZXJzLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBNdWx0aVNpZ0FkZHJlc3MgfSBmcm9tICcuLi9hYnN0cmFjdFV0eG9Db2luJztcblxuaW1wb3J0IHsgZm9yQ29pbiwgUmVjb3ZlcnlQcm92aWRlciB9IGZyb20gJy4vUmVjb3ZlcnlQcm92aWRlcic7XG5pbXBvcnQgeyBNZW1wb29sQXBpIH0gZnJvbSAnLi9tZW1wb29sQXBpJztcbmltcG9ydCB7IENvaW5nZWNrb0FwaSB9IGZyb20gJy4vY29pbmdlY2tvQXBpJztcbmltcG9ydCB7IHNpZ25BbmRWZXJpZnlQc2J0IH0gZnJvbSAnLi4vc2lnbic7XG5pbXBvcnQgeyBnZXRNYWlubmV0LCBuZXR3b3JrcyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuZXhwb3J0IGludGVyZmFjZSBPZmZsaW5lVmF1bHRUeEluZm8ge1xuICBpbnB1dHM6IFdhbGxldFVuc3BlbnQ8bnVtYmVyPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbyB7XG4gIHR4SW5mbzoge1xuICAgIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50SlNPTltdO1xuICB9O1xuICB0eEhleDogc3RyaW5nO1xuICBmZWVJbmZvOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj47XG4gIGNvaW46IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGlzIHRyYW5zZm9ybXMgdGhlIHR4SW5mbyBmcm9tIHJlY292ZXIgaW50byB0aGUgZm9ybWF0IHRoYXQgb2ZmbGluZS1zaWduaW5nLXRvb2wgZXhwZWN0c1xuICogQHBhcmFtIGNvaW5OYW1lXG4gKiBAcGFyYW0gdHhJbmZvXG4gKiBAcGFyYW0gdHhIZXhcbiAqIEByZXR1cm5zIHt7dHhIZXg6ICosIHR4SW5mbzoge3Vuc3BlbnRzOiAqfSwgZmVlSW5mbzoge30sIGNvaW46IHZvaWR9fVxuICovXG5mdW5jdGlvbiBmb3JtYXRGb3JPZmZsaW5lVmF1bHQoXG4gIGNvaW5OYW1lOiBzdHJpbmcsXG4gIHR4SW5mbzogT2ZmbGluZVZhdWx0VHhJbmZvLFxuICB0eEhleDogc3RyaW5nXG4pOiBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8ge1xuICByZXR1cm4ge1xuICAgIHR4SGV4LFxuICAgIHR4SW5mbzoge1xuICAgICAgdW5zcGVudHM6IHR4SW5mby5pbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgICBhc3NlcnQoaW5wdXQudmFsdWVTdHJpbmcpO1xuICAgICAgICByZXR1cm4geyAuLi5pbnB1dCwgdmFsdWVTdHJpbmc6IGlucHV0LnZhbHVlU3RyaW5nIH07XG4gICAgICB9KSxcbiAgICB9LFxuICAgIGZlZUluZm86IHt9LFxuICAgIGNvaW46IGNvaW5OYW1lLFxuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBtYXJrZXQgcHJpY2UgZnJvbSBhIHRoaXJkIHBhcnR5IHRvIGJlIHVzZWQgZm9yIHJlY292ZXJ5XG4gKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgaW50ZW5kZWQgZm9yIG5vbi1iaXRnbyByZWNvdmVyeSB0cmFuc2FjdGlvbnMsIHdoZW4gaXQgaXMgbmVjZXNzYXJ5XG4gKiB0byBjYWxjdWxhdGUgdGhlIHJvdWdoIGZlZSBuZWVkZWQgdG8gcGF5IHRvIEtleXRlcm5hbC4gV2UgYXJlIG9rYXkgd2l0aCBhcHByb3hpbWF0aW5nLFxuICogYmVjYXVzZSB0aGUgcmVzdWx0aW5nIHByaWNlIG9mIHRoaXMgZnVuY3Rpb24gb25seSBoYXMgbGVzcyB0aGFuIDEgZG9sbGFyIGluZmx1ZW5jZSBvbiB0aGVcbiAqIGZlZSB0aGF0IG5lZWRzIHRvIGJlIHBhaWQgdG8gS2V5dGVybmFsLlxuICpcbiAqIFNlZSBjYWxjdWxhdGVGZWVBbW91bnQgZnVuY3Rpb246ICByZXR1cm4gTWF0aC5yb3VuZChmZWVBbW91bnRVc2QgLyBjdXJyZW50UHJpY2UgKiBzZWxmLmdldEJhc2VGYWN0b3IoKSk7XG4gKlxuICogVGhpcyBlbmQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGFuIGFjY3VyYXRlIGVuZHBvaW50LCBzaW5jZSBzb21lIGNvaW5zJyBwcmljZXMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgcHJvdmlkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlNYXJrZXRQcmljZShjb2luOiBBYnN0cmFjdFV0eG9Db2luKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBDb2luZ2Vja29BcGkoKS5nZXRVU0RQcmljZShjb2luLmdldEZhbWlseSgpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhbW91bnQgKGluIGJhc2UgdW5pdHMpIHRvIHBheSBhIEtSUyBwcm92aWRlciB3aGVuIGJ1aWxkaW5nIGEgcmVjb3ZlcnkgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBjb2luXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcGFyYW0gcGFyYW1zLnByb3ZpZGVyIHtTdHJpbmd9IHRoZSBLUlMgcHJvdmlkZXIgdGhhdCBob2xkcyB0aGUgYmFja3VwIGtleVxuICogQHJldHVybnMgeyp9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUZlZUFtb3VudChjb2luOiBBYnN0cmFjdFV0eG9Db2luLCBwYXJhbXM6IHsgcHJvdmlkZXI6IHN0cmluZyB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qga3JzUHJvdmlkZXIgPSBrcnNQcm92aWRlcnNbcGFyYW1zLnByb3ZpZGVyXTtcblxuICBpZiAoa3JzUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gZmVlIHN0cnVjdHVyZSBzcGVjaWZpZWQgZm9yIHByb3ZpZGVyICR7cGFyYW1zLnByb3ZpZGVyfWApO1xuICB9XG5cbiAgaWYgKGtyc1Byb3ZpZGVyLmZlZVR5cGUgPT09ICdmbGF0VXNkJykge1xuICAgIGNvbnN0IGZlZUFtb3VudFVzZCA9IGtyc1Byb3ZpZGVyLmZlZUFtb3VudDtcbiAgICBjb25zdCBjdXJyZW50UHJpY2U6IG51bWJlciA9IGF3YWl0IGdldFJlY292ZXJ5TWFya2V0UHJpY2UoY29pbik7XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoZmVlQW1vdW50VXNkIC8gY3VycmVudFByaWNlKSAqIGNvaW4uZ2V0QmFzZUZhY3RvcigpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3ZSBjYW4gYWRkIG1vcmUgZmVlIHN0cnVjdHVyZXMgaGVyZSBhcyBuZWVkZWQgZm9yIGRpZmZlcmVudCBwcm92aWRlcnMsIHN1Y2ggYXMgcGVyY2VudGFnZSBvZiByZWNvdmVyeSBhbW91bnRcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZlZSBzdHJ1Y3R1cmUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyUGFyYW1zIHtcbiAgc2Nhbj86IG51bWJlcjtcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICBrcnNQcm92aWRlcj86IHN0cmluZztcbiAgaWdub3JlQWRkcmVzc1R5cGVzOiBTY3JpcHRUeXBlMk9mM1tdO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIHVzZXJLZXlQYXRoPzogc3RyaW5nO1xuICByZWNvdmVyeVByb3ZpZGVyPzogUmVjb3ZlcnlQcm92aWRlcjtcbn1cblxuZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkQWRkcmVzcyhjb2luOiBBYnN0cmFjdFV0eG9Db2luLCBhZGRyZXNzOiBNdWx0aVNpZ0FkZHJlc3MpIHtcbiAgLy8gQmxvY2tjaGFpciB1c2VzIGNhc2hhZGRyIGZvcm1hdCB3aGVuIHF1ZXJ5aW5nIHRoZSBBUEkgZm9yIGFkZHJlc3MgaW5mb3JtYXRpb24uIENvbnZlcnQgbGVnYWN5IGFkZHJlc3NlcyB0byBjYXNoYWRkclxuICAvLyBiZWZvcmUgcXVlcnlpbmcgdGhlIEFQSS5cbiAgcmV0dXJuIGNvaW4uZ2V0Q2hhaW4oKSA9PT0gJ2JjaCcgfHwgY29pbi5nZXRDaGFpbigpID09PSAnYmNoYSdcbiAgICA/IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MsICdjYXNoYWRkcicpLnNwbGl0KCc6JylbMV1cbiAgICA6IGFkZHJlc3MuYWRkcmVzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoKFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBwYXJhbXM6IFJlY292ZXJQYXJhbXMsXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICBjaGFpbjogQ2hhaW5Db2RlXG4pOiBQcm9taXNlPFdhbGxldFVuc3BlbnQ8YmlnaW50PltdPiB7XG4gIGNvbnN0IHNjcmlwdFR5cGUgPSBzY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pO1xuICBjb25zdCBmZXRjaFByZXZUeCA9XG4gICAgIXV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5oYXNXaXRuZXNzRGF0YShzY3JpcHRUeXBlKSAmJiBnZXRNYWlubmV0KGNvaW4ubmV0d29yaykgIT09IG5ldHdvcmtzLnpjYXNoO1xuICBjb25zdCByZWNvdmVyeVByb3ZpZGVyID0gcGFyYW1zLnJlY292ZXJ5UHJvdmlkZXIgPz8gZm9yQ29pbihjb2luLmdldENoYWluKCksIHBhcmFtcy5hcGlLZXkpO1xuICBjb25zdCBNQVhfU0VRVUVOVElBTF9BRERSRVNTRVNfV0lUSE9VVF9UWFMgPSBwYXJhbXMuc2NhbiB8fCAyMDtcbiAgbGV0IG51bVNlcXVlbnRpYWxBZGRyZXNzZXNXaXRob3V0VHhzID0gMDtcbiAgY29uc3QgcHJldlR4Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFByZXZUeCh0eGlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBwcmV2VHhIZXggPSBwcmV2VHhDYWNoZS5nZXQodHhpZCk7XG4gICAgaWYgKCFwcmV2VHhIZXgpIHtcbiAgICAgIHByZXZUeEhleCA9IGF3YWl0IHJlY292ZXJ5UHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb25IZXgodHhpZCk7XG4gICAgICBwcmV2VHhDYWNoZS5zZXQodHhpZCwgcHJldlR4SGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHByZXZUeEhleDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGdhdGhlclVuc3BlbnRzKGFkZHJJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgd2FsbGV0S2V5c0ZvclVuc3BlbnQgPSB3YWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoY2hhaW4sIGFkZHJJbmRleCk7XG4gICAgY29uc3QgYWRkcmVzcyA9IGNvaW4uY3JlYXRlTXVsdGlTaWdBZGRyZXNzKHNjcmlwdFR5cGUsIDIsIHdhbGxldEtleXNGb3JVbnNwZW50LnB1YmxpY0tleXMpO1xuXG4gICAgY29uc3QgZm9ybWF0dGVkQWRkcmVzcyA9IGdldEZvcm1hdHRlZEFkZHJlc3MoY29pbiwgYWRkcmVzcyk7XG4gICAgY29uc3QgYWRkckluZm8gPSBhd2FpdCByZWNvdmVyeVByb3ZpZGVyLmdldEFkZHJlc3NJbmZvKGZvcm1hdHRlZEFkZHJlc3MpO1xuICAgIC8vIHdlIHVzZSB0eENvdW50IGhlcmUgYmVjYXVzZSBpdCBpbXBsaWVzIHVzYWdlIC0gaGF2aW5nIHR4J2VzIG1lYW5zIHRoZSBhZGRyIHdhcyBnZW5lcmF0ZWQgYW5kIHVzZWRcbiAgICBpZiAoYWRkckluZm8udHhDb3VudCA9PT0gMCkge1xuICAgICAgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPSAwO1xuXG4gICAgICBpZiAoYWRkckluZm8uYmFsYW5jZSA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYEZvdW5kIGFuIGFkZHJlc3Mgd2l0aCBiYWxhbmNlOiAke2FkZHJlc3MuYWRkcmVzc30gd2l0aCBiYWxhbmNlICR7YWRkckluZm8uYmFsYW5jZX1gKTtcbiAgICAgICAgY29uc3QgYWRkcmVzc1Vuc3BlbnRzID0gYXdhaXQgcmVjb3ZlcnlQcm92aWRlci5nZXRVbnNwZW50c0ZvckFkZHJlc3NlcyhbZm9ybWF0dGVkQWRkcmVzc10pO1xuICAgICAgICBjb25zdCBwcm9jZXNzZWRVbnNwZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGFkZHJlc3NVbnNwZW50cy5tYXAoYXN5bmMgKHUpOiBQcm9taXNlPFdhbGxldFVuc3BlbnQ8YmlnaW50Pj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0eGlkLCB2b3V0IH0gPSB1dHhvbGliLmJpdGdvLnBhcnNlT3V0cHV0SWQodS5pZCk7XG4gICAgICAgICAgICBsZXQgdmFsID0gQmlnSW50KHUudmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNvaW4uYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgICAgLy8gYmxvY2tjaGFpciByZXR1cm5zIHRoZSBudW1iZXIgd2l0aCB0aGUgY29ycmVjdCBwcmVjaXNpb24sIGJ1dCBpbiBudW1iZXIgZm9ybWF0XG4gICAgICAgICAgICAgIC8vIGpzb24gcGFyc2Ugd29uJ3QgcGFyc2UgaXQgY29ycmVjdGx5LCBzbyB3ZSByZXF1ZXJ5IHRoZSB0eGlkIGZvciB0aGUgdHggaGV4IHRvIGRlY29kZSBoZXJlXG4gICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGdldFByZXZUeCh0eGlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0eCA9IGNvaW4uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PGJpZ2ludD4odHhIZXgpO1xuICAgICAgICAgICAgICAgIHZhbCA9IHR4Lm91dHNbdm91dF0udmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoZSBhcGkgbWF5IHJldHVybiBjYXNoYWRkcidzIGluc3RlYWQgb2YgbGVnYWN5IGZvciBCQ0ggYW5kIEJDSEFcbiAgICAgICAgICAgIC8vIGRvd25zdHJlYW0gcHJvY2Vzc2VzJ3Mgb25seSBleHBlY3QgbGVnYWN5IGFkZHJlc3Nlc1xuICAgICAgICAgICAgdSA9IHsgLi4udSwgYWRkcmVzczogY29pbi5jYW5vbmljYWxBZGRyZXNzKHUuYWRkcmVzcykgfTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnUsXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgICAgICAgIGNoYWluOiBjaGFpbixcbiAgICAgICAgICAgICAgaW5kZXg6IGFkZHJJbmRleCxcbiAgICAgICAgICAgICAgcHJldlR4OiBmZXRjaFByZXZUeCA/IEJ1ZmZlci5mcm9tKGF3YWl0IGdldFByZXZUeCh0eGlkKSwgJ2hleCcpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSBhcyBXYWxsZXRVbnNwZW50PGJpZ2ludD47XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB3YWxsZXRVbnNwZW50cy5wdXNoKC4uLnByb2Nlc3NlZFVuc3BlbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPj0gTUFYX1NFUVVFTlRJQUxfQUREUkVTU0VTX1dJVEhPVVRfVFhTKSB7XG4gICAgICAvLyBzdG9wIHNlYXJjaGluZyBmb3IgYWRkcmVzc2VzIHdpdGggdW5zcGVudHMgaW4gdGhlbSwgd2UndmUgZm91bmQgJHtNQVhfU0VRVUVOVElBTF9BRERSRVNTRVNfV0lUSE9VVF9UWFN9IGluIGEgcm93IHdpdGggbm9uZVxuICAgICAgLy8gd2UgYXJlIGRvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0aGVyVW5zcGVudHMoYWRkckluZGV4ICsgMSk7XG4gIH1cblxuICAvLyBnZXQgdW5zcGVudHMgZm9yIHRoZXNlIGFkZHJlc3Nlc1xuXG4gIGNvbnN0IHdhbGxldFVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PGJpZ2ludD5bXSA9IFtdO1xuICAvLyBUaGlzIHdpbGwgcG9wdWxhdGUgd2FsbGV0QWRkcmVzc2VzXG4gIGF3YWl0IGdhdGhlclVuc3BlbnRzKDApO1xuXG4gIGlmICh3YWxsZXRVbnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBDb3VsZG4ndCBmaW5kIGFueSBhZGRyZXNzZXMgd2l0aCBmdW5kc1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiB3YWxsZXRVbnNwZW50cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcyhcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgeyBkZWZhdWx0VmFsdWUgfTogeyBkZWZhdWx0VmFsdWU6IG51bWJlciB9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBNZW1wb29sQXBpLmZvckNvaW4oY29pbi5nZXRDaGFpbigpKS5nZXRSZWNvdmVyeUZlZVBlckJ5dGVzKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmRpcihlKTtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24gPSB7XG4gIGlucHV0cz86IFdhbGxldFVuc3BlbnQ8bnVtYmVyPltdO1xuICB0cmFuc2FjdGlvbkhleDogc3RyaW5nO1xuICBjb2luOiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICByZWNvdmVyeUFtb3VudDogbnVtYmVyO1xuICByZWNvdmVyeUFtb3VudFN0cmluZzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvLlxuICpcbiAqIFJldHVybnMgdHJhbnNhY3Rpb24gaGV4IGluIGxlZ2FjeSBmb3JtYXQgZm9yIHVuc2lnbmVkIHN3ZWVwIHRyYW5zYWN0aW9uLCBoYWxmIHNpZ25lZCBiYWNrdXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aCBLUlMgcHJvdmlkZXIgKG9ubHkga2V5dGVybmFsKSxcbiAqIGZ1bGx5IHNpZ25lZCBiYWNrdXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBhIEtSUyBwcm92aWRlci5cbiAqXG4gKiBSZXR1cm5zIFBTQlQgaGV4IGZvciBoYWxmIHNpZ25lZCBiYWNrdXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aCBLUlMgcHJvdmlkZXIgKGV4Y2x1ZGluZyBrZXl0ZXJuYWwpXG4gKiBGb3IgUFNCVCBoZXggY2FzZXMsIFVuc3BlbnRzIGFyZSBub3QgcmVxdWlyZWQgaW4gcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIGNvaW5cbiAqIEBwYXJhbSBiaXRnb1xuICogQHBhcmFtIHBhcmFtc1xuICogLSB1c2VyS2V5OiBbZW5jcnlwdGVkXSB4cHJ2LCBvciB4cHViXG4gKiAtIGJhY2t1cEtleTogW2VuY3J5cHRlZF0geHBydiwgb3IgeHB1YiBpZiB0aGUgeHBydiBpcyBoZWxkIGJ5IGEgS1JTIHByb3ZpZGVyXG4gKiAtIHdhbGxldFBhc3NwaHJhc2U6IG5lY2Vzc2FyeSBpZiBvbmUgb2YgdGhlIHhwcnZzIGlzIGVuY3J5cHRlZFxuICogLSBiaXRnb0tleTogeHB1YlxuICogLSBrcnNQcm92aWRlcjogbmVjZXNzYXJ5IGlmIGJhY2t1cCBrZXkgaXMgaGVsZCBieSBLUlNcbiAqIC0gcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGFyZ2V0IGFkZHJlc3MgdG8gc2VuZCByZWNvdmVyZWQgZnVuZHMgdG9cbiAqIC0gc2NhbjogdGhlIGFtb3VudCBvZiBjb25zZWN1dGl2ZSBhZGRyZXNzZXMgd2l0aG91dCB1bnNwZW50cyB0byBzY2FuIHRocm91Z2ggYmVmb3JlIHN0b3BwaW5nXG4gKiAtIGlnbm9yZUFkZHJlc3NUeXBlczogKG9wdGlvbmFsKSBzY3JpcHRzIHRvIGlnbm9yZVxuICogICAgICAgIGZvciBleGFtcGxlOiBbJ3Ayc2hQMndzaCcsICdwMndzaCddIHdpbGwgcHJldmVudCBjb2RlIGZyb20gY2hlY2tpbmcgZm9yIHdyYXBwZWQtc2Vnd2l0IGFuZCBuYXRpdmUtc2Vnd2l0IGNoYWlucyBvbiB0aGUgcHVibGljIGJsb2NrIGV4cGxvcmVyc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmFja3VwS2V5UmVjb3ZlcnkoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogUmVjb3ZlclBhcmFtc1xuKTogUHJvbWlzZTxCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uIHwgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvPiB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyS2V5Jyk7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYmFja3VwS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgfVxuXG4gIGlmIChcbiAgICBfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSB8fFxuICAgICFjb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCB7IGFueUZvcm1hdDogdHJ1ZSB9KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zY2FuKSAmJiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5zY2FuKSB8fCBwYXJhbXMuc2NhbiA8IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY2FuIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICBjb25zdCBpc0tyc1JlY292ZXJ5ID0gZ2V0SXNLcnNSZWNvdmVyeShwYXJhbXMpO1xuICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSBnZXRJc1Vuc2lnbmVkU3dlZXAocGFyYW1zKTtcbiAgY29uc3QgcmVzcG9uc2VUeEZvcm1hdCA9IGlzVW5zaWduZWRTd2VlcCB8fCAhaXNLcnNSZWNvdmVyeSB8fCBwYXJhbXMua3JzUHJvdmlkZXIgPT09ICdrZXl0ZXJuYWwnID8gJ2xlZ2FjeScgOiAncHNidCc7XG5cbiAgY29uc3Qga3JzUHJvdmlkZXIgPSBpc0tyc1JlY292ZXJ5ID8gZ2V0S3JzUHJvdmlkZXIoY29pbiwgcGFyYW1zLmtyc1Byb3ZpZGVyKSA6IHVuZGVmaW5lZDtcblxuICAvLyBjaGVjayB3aGV0aGVyIGtleSBtYXRlcmlhbCBhbmQgcGFzc3dvcmQgYXV0aGVudGljYXRlIHRoZSB1c2VycyBhbmQgcmV0dXJuIHBhcmVudCBrZXlzIG9mIGFsbCB0aHJlZSBrZXlzIG9mIHRoZSB3YWxsZXRcbiAgY29uc3Qga2V5cyA9IGdldEJpcDMyS2V5cyhiaXRnbywgcGFyYW1zLCB7IHJlcXVpcmVCaXRHb1hwdWI6IHRydWUgfSk7XG4gIGlmICghaXNUcmlwbGUoa2V5cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGtleSB0cmlwbGVgKTtcbiAgfVxuICBjb25zdCB3YWxsZXRLZXlzID0gbmV3IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMoa2V5cywgW1xuICAgIHBhcmFtcy51c2VyS2V5UGF0aCB8fCB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLmRlZmF1bHRQcmVmaXgsXG4gICAgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuICAgIHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgXSk7XG5cbiAgY29uc3QgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgb3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoYWRkcmVzc1R5cGUpID0+IGNvaW4uc3VwcG9ydHNBZGRyZXNzVHlwZShhZGRyZXNzVHlwZSkgJiYgIXBhcmFtcy5pZ25vcmVBZGRyZXNzVHlwZXM/LmluY2x1ZGVzKGFkZHJlc3NUeXBlKVxuICAgICAgICApXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKHF1ZXJpZXMsIGFkZHJlc3NUeXBlKSA9PiBbXG4gICAgICAgICAgICAuLi5xdWVyaWVzLFxuICAgICAgICAgICAgcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoKGNvaW4sIHBhcmFtcywgd2FsbGV0S2V5cywgZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoYWRkcmVzc1R5cGUpKSxcbiAgICAgICAgICAgIHF1ZXJ5QmxvY2tjaGFpblVuc3BlbnRzUGF0aChjb2luLCBwYXJhbXMsIHdhbGxldEtleXMsIGdldEludGVybmFsQ2hhaW5Db2RlKGFkZHJlc3NUeXBlKSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSBhcyBQcm9taXNlPFdhbGxldFVuc3BlbnQ8YmlnaW50PltdPltdXG4gICAgICAgIClcbiAgICApXG4gICkuZmxhdCgpO1xuXG4gIC8vIEV4ZWN1dGUgdGhlIHF1ZXJpZXMgYW5kIGdhdGhlciB0aGUgdW5zcGVudHNcbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHV0eG9saWIuYml0Z28udW5zcGVudFN1bSh1bnNwZW50cywgJ2JpZ2ludCcpO1xuICBpZiAodG90YWxJbnB1dEFtb3VudCA8PSBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKCk7XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgcHNidFxuICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcms6IGNvaW4ubmV0d29yayB9KTtcbiAgLy8geHB1YnMgY2FuIGJlY29tZSBoYW5keSBmb3IgbWFueSB0aGluZ3MuXG4gIHV0eG9saWIuYml0Z28uYWRkWHB1YnNUb1BzYnQocHNidCwgd2FsbGV0S2V5cyk7XG4gIGNvbnN0IHR4SW5mbyA9IHt9IGFzIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb247XG4gIGNvbnN0IGZlZVBlckJ5dGU6IG51bWJlciA9IGF3YWl0IGdldFJlY292ZXJ5RmVlUGVyQnl0ZXMoY29pbiwgeyBkZWZhdWx0VmFsdWU6IDEwMCB9KTtcblxuICAvLyBLUlMgcmVjb3ZlcnkgdHJhbnNhY3Rpb25zIGhhdmUgYSAybmQgb3V0cHV0IHRvIHBheSB0aGUgcmVjb3ZlcnkgZmVlLCBsaWtlIHBheWdvIGZlZXMuIFVzZSBwMndzaCBvdXRwdXRzIGJlY2F1c2VcbiAgLy8gdGhleSBhcmUgdGhlIGxhcmdlc3Qgb3V0cHV0cyBhbmQgdGh1cyB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgZXN0aW1hdGUgdG8gdXNlIGluIGNhbGN1bGF0aW5nIGZlZXMuIEFsc28gdXNlXG4gIC8vIHNlZ3dpdCBvdmVyaGVhZCBzaXplIGFuZCBwMnNoIGlucHV0cyBmb3IgdGhlIHNhbWUgcmVhc29uLlxuICBjb25zdCBvdXRwdXRTaXplID0gKGlzS3JzUmVjb3ZlcnkgPyAyIDogMSkgKiBWaXJ0dWFsU2l6ZXMudHhQMndzaE91dHB1dFNpemU7XG4gIGNvbnN0IGFwcHJveGltYXRlU2l6ZSA9IFZpcnR1YWxTaXplcy50eFNlZ092ZXJoZWFkVlNpemUgKyBvdXRwdXRTaXplICsgVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHVuc3BlbnRzLmxlbmd0aDtcbiAgY29uc3QgYXBwcm94aW1hdGVGZWUgPSBCaWdJbnQoYXBwcm94aW1hdGVTaXplICogZmVlUGVyQnl0ZSk7XG5cbiAgdHhJbmZvLmlucHV0cyA9XG4gICAgcmVzcG9uc2VUeEZvcm1hdCA9PT0gJ2xlZ2FjeSdcbiAgICAgID8gdW5zcGVudHMubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogTnVtYmVyKHUudmFsdWUpLCB2YWx1ZVN0cmluZzogdS52YWx1ZS50b1N0cmluZygpLCBwcmV2VHg6IHVuZGVmaW5lZCB9KSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHVuc3BlbnRzLmZvckVhY2goKHVuc3BlbnQpID0+IHtcbiAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgd2FsbGV0S2V5cywgJ3VzZXInLCAnYmFja3VwJyk7XG4gIH0pO1xuXG4gIGxldCBrcnNGZWUgPSBCaWdJbnQoMCk7XG4gIGlmIChpc0tyc1JlY292ZXJ5ICYmIHBhcmFtcy5rcnNQcm92aWRlcikge1xuICAgIHRyeSB7XG4gICAgICBrcnNGZWUgPSBCaWdJbnQoYXdhaXQgY2FsY3VsYXRlRmVlQW1vdW50KGNvaW4sIHsgcHJvdmlkZXI6IHBhcmFtcy5rcnNQcm92aWRlciB9KSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBEb24ndCBsZXQgdGhpcyBlcnJvciBibG9jayB0aGUgcmVjb3ZlcnkgLVxuICAgICAgY29uc29sZS5kaXIoZXJyKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZUZlZSAtIGtyc0ZlZTtcblxuICBpZiAocmVjb3ZlcnlBbW91bnQgPCBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRoaXMgd2FsbGV0XFwncyBiYWxhbmNlIGlzIHRvbyBsb3cgdG8gcGF5IHRoZSBmZWVzIHNwZWNpZmllZCBieSB0aGUgS1JTIHByb3ZpZGVyLiBcbiAgICAgICAgICBFeGlzdGluZyBiYWxhbmNlIG9uIHdhbGxldDogJHt0b3RhbElucHV0QW1vdW50LnRvU3RyaW5nKCl9LiBFc3RpbWF0ZWQgbmV0d29yayBmZWUgZm9yIHRoZSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICAgICAgICAgIDogJHthcHByb3hpbWF0ZUZlZS50b1N0cmluZygpfSwgS1JTIGZlZSB0byBwYXk6ICR7a3JzRmVlLnRvU3RyaW5nKCl9LiBBZnRlciBkZWR1Y3RpbmcgZmVlcywgeW91ciB0b3RhbCBcbiAgICAgICAgICByZWNvdmVyYWJsZSBiYWxhbmNlIGlzICR7cmVjb3ZlcnlBbW91bnQudG9TdHJpbmcoKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJlY292ZXJ5T3V0cHV0U2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBjb2luLm5ldHdvcmspO1xuICBwc2J0LmFkZE91dHB1dCh7IHNjcmlwdDogcmVjb3ZlcnlPdXRwdXRTY3JpcHQsIHZhbHVlOiByZWNvdmVyeUFtb3VudCB9KTtcblxuICBpZiAoa3JzUHJvdmlkZXIgJiYga3JzRmVlID4gQmlnSW50KDApKSB7XG4gICAgaWYgKCFrcnNQcm92aWRlci5mZWVBZGRyZXNzZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihga2V5UHJvdmlkZXIgbXVzdCBkZWZpbmUgZmVlQWRkcmVzc2VzYCk7XG4gICAgfVxuXG4gICAgY29uc3Qga3JzRmVlQWRkcmVzcyA9IGtyc1Byb3ZpZGVyLmZlZUFkZHJlc3Nlc1tjb2luLmdldENoYWluKCldO1xuXG4gICAgaWYgKCFrcnNGZWVBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgS1JTIHByb3ZpZGVyIGhhcyBub3QgY29uZmlndXJlZCB0aGVpciBmZWUgc3RydWN0dXJlIHlldCAtIHJlY292ZXJ5IGNhbm5vdCBiZSBjb21wbGV0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrcnNGZWVPdXRwdXRTY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoa3JzRmVlQWRkcmVzcywgY29pbi5uZXR3b3JrKTtcbiAgICBwc2J0LmFkZE91dHB1dCh7IHNjcmlwdDoga3JzRmVlT3V0cHV0U2NyaXB0LCB2YWx1ZToga3JzRmVlIH0pO1xuICB9XG5cbiAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgIC8vIFRPRE8gQlRDLTMxNyAtIFdoZW4gcmVhZHkgdG8gUFNCVGlmeSBPVkMsIHNlbmQgcHNidCBoZXggYW5kIHNraXAgdW5zcGVudHMgaW4gcmVzcG9uc2UuXG4gICAgY29uc3QgdHhIZXggPSBwc2J0LmdldFVuc2lnbmVkVHgoKS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICByZXR1cm4gZm9ybWF0Rm9yT2ZmbGluZVZhdWx0KGNvaW4uZ2V0Q2hhaW4oKSwgdHhJbmZvIGFzIE9mZmxpbmVWYXVsdFR4SW5mbywgdHhIZXgpO1xuICB9IGVsc2Uge1xuICAgIHNpZ25BbmRWZXJpZnlQc2J0KHBzYnQsIHdhbGxldEtleXMudXNlciwgeyBpc0xhc3RTaWduYXR1cmU6IGZhbHNlIH0pO1xuICAgIGlmIChpc0tyc1JlY292ZXJ5KSB7XG4gICAgICAvLyBUaGUgS1JTIHByb3ZpZGVyIGtleXRlcm5hbCBzb2xlbHkgc3VwcG9ydHMgUDJTSCwgUDJXU0gsIGFuZCBQMlNILVAyV1NIIGlucHV0IHNjcmlwdCB0eXBlcy5cbiAgICAgIC8vIEl0IGN1cnJlbnRseSB1c2VzIGFuIG91dGRhdGVkIEJpdEdvSlMgU0RLLCB3aGljaCByZWxpZXMgb24gYSBsZWdhY3kgdHJhbnNhY3Rpb24gYnVpbGRlciBmb3IgY29zaWduaW5nLlxuICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdXBncmFkaW5nIHRoZSBrZXl0ZXJuYWwgY29kZSBwcmVzZW50cyBjaGFsbGVuZ2VzLFxuICAgICAgLy8gd2hpY2ggaGluZGVycyB0aGUgaW50ZWdyYXRpb24gb2YgdGhlIGxhdGVzdCBCaXRHb0pTIFNESyB3aXRoIFBTQlQgc2lnbmluZyBzdXBwb3J0LlxuICAgICAgdHhJbmZvLnRyYW5zYWN0aW9uSGV4ID1cbiAgICAgICAgcGFyYW1zLmtyc1Byb3ZpZGVyID09PSAna2V5dGVybmFsJ1xuICAgICAgICAgID8gdXR4b2xpYi5iaXRnby5leHRyYWN0UDJtc09ubHlIYWxmU2lnbmVkVHgocHNidCkudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICA6IHBzYnQudG9IZXgoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHggPSBzaWduQW5kVmVyaWZ5UHNidChwc2J0LCB3YWxsZXRLZXlzLmJhY2t1cCwgeyBpc0xhc3RTaWduYXR1cmU6IHRydWUgfSk7XG4gICAgICB0eEluZm8udHJhbnNhY3Rpb25IZXggPSB0eC50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgIHR4SW5mby5jb2luID0gY29pbi5nZXRDaGFpbigpO1xuICAgIHR4SW5mby5iYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5O1xuICAgIHR4SW5mby5yZWNvdmVyeUFtb3VudCA9IE51bWJlcihyZWNvdmVyeUFtb3VudCk7XG4gICAgdHhJbmZvLnJlY292ZXJ5QW1vdW50U3RyaW5nID0gcmVjb3ZlcnlBbW91bnQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiB0eEluZm87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQml0R29WMVVuc3BlbnQge1xuICB0eF9oYXNoOiBzdHJpbmc7XG4gIHR4X291dHB1dF9uOiBudW1iZXI7XG4gIHZhbHVlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjFTd2VlcFBhcmFtcyB7XG4gIHdhbGxldElkOiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgdW5zcGVudHM6IEJpdEdvVjFVbnNwZW50W107XG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbiAgdXNlcktleTogc3RyaW5nO1xuICBvdHA6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWMVJlY292ZXJQYXJhbXMgZXh0ZW5kcyBPbWl0PFYxU3dlZXBQYXJhbXMsICdvdHAnPiB7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdjFCYWNrdXBLZXlSZWNvdmVyeShcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgcGFyYW1zOiBWMVJlY292ZXJQYXJhbXNcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChcbiAgICBfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSB8fFxuICAgICFjb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCB7IGFueUZvcm1hdDogdHJ1ZSB9KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG5cbiAgY29uc3QgcmVjb3ZlcnlGZWVQZXJCeXRlID0gYXdhaXQgZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcyhjb2luLCB7IGRlZmF1bHRWYWx1ZTogMTAwIH0pO1xuICBjb25zdCB2MXdhbGxldCA9IGF3YWl0IGJpdGdvLndhbGxldHMoKS5nZXQoeyBpZDogcGFyYW1zLndhbGxldElkIH0pO1xuICByZXR1cm4gYXdhaXQgdjF3YWxsZXQucmVjb3Zlcih7XG4gICAgLi4ucGFyYW1zLFxuICAgIGZlZVJhdGU6IHJlY292ZXJ5RmVlUGVyQnl0ZSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2MVN3ZWVwKFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBiaXRnbzogQml0R29CYXNlLFxuICBwYXJhbXM6IFYxU3dlZXBQYXJhbXNcbik6IFByb21pc2U8e1xuICB0eDogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xufT4ge1xuICBpZiAoXG4gICAgXy5pc1VuZGVmaW5lZChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikgfHxcbiAgICAhY29pbi5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgeyBhbnlGb3JtYXQ6IHRydWUgfSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuXG4gIGxldCByZWNvdmVyeUZlZVBlckJ5dGUgPSAxMDA7XG4gIGlmIChiaXRnby5lbnYgPT09ICdwcm9kJykge1xuICAgIHJlY292ZXJ5RmVlUGVyQnl0ZSA9IGF3YWl0IGdldFJlY292ZXJ5RmVlUGVyQnl0ZXMoY29pbiwgeyBkZWZhdWx0VmFsdWU6IDEwMCB9KTtcbiAgfVxuXG4gIGNvbnN0IHYxd2FsbGV0ID0gYXdhaXQgYml0Z28ud2FsbGV0cygpLmdldCh7IGlkOiBwYXJhbXMud2FsbGV0SWQgfSk7XG4gIHJldHVybiBhd2FpdCB2MXdhbGxldC5zd2VlcCh7XG4gICAgLi4ucGFyYW1zLFxuICAgIGZlZVJhdGU6IHJlY292ZXJ5RmVlUGVyQnl0ZSxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -11,10 +11,10 @@ export declare class ApiRequestError extends BitGoJsError {
|
|
|
11
11
|
static forRequest(req: superagent.Request, reason: Error | string): ApiRequestError;
|
|
12
12
|
static forResponse(res: superagent.Response, reason: Error | string): ApiRequestError;
|
|
13
13
|
}
|
|
14
|
-
export
|
|
14
|
+
export type RequestOptions = {
|
|
15
15
|
retry?: number;
|
|
16
16
|
};
|
|
17
|
-
export
|
|
17
|
+
export type Response<T> = {
|
|
18
18
|
map<V>(f: (body: T) => V): V;
|
|
19
19
|
};
|
|
20
20
|
export declare class BaseApi {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseApi.d.ts","sourceRoot":"","sources":["../../../src/recovery/baseApi.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,qBAAa,sBAAuB,SAAQ,YAAY;gBAC1C,QAAQ,EAAE,MAAM;CAG7B;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM;IAI/C,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe;IAInF,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe;CAGtF;AAED,
|
|
1
|
+
{"version":3,"file":"baseApi.d.ts","sourceRoot":"","sources":["../../../src/recovery/baseApi.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,qBAAa,sBAAuB,SAAQ,YAAY;gBAC1C,QAAQ,EAAE,MAAM;CAG7B;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM;IAI/C,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe;IAInF,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe;CAGtF;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;CAC9B,CAAC;AAEF,qBAAa,OAAO;IACC,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;IAS5B,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,GAAG,SAAS,EAChC,MAAM,GAAE,cAAmB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IA4BvB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAInE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;CAGpF"}
|
|
@@ -1,33 +1,13 @@
|
|
|
1
1
|
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
-
|
|
2
|
+
export type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
|
|
3
3
|
import { BitGoBase, IWallet } from '@bitgo-beta/sdk-core';
|
|
4
4
|
import { AbstractUtxoCoin, TransactionInfo } from '../abstractUtxoCoin';
|
|
5
|
-
export interface ExplorerTxInfo {
|
|
6
|
-
input: {
|
|
7
|
-
address: string;
|
|
8
|
-
}[];
|
|
9
|
-
outputs: {
|
|
10
|
-
address: string;
|
|
11
|
-
}[];
|
|
12
|
-
}
|
|
13
|
-
export declare class BitgoPublicApi {
|
|
14
|
-
coin: AbstractUtxoCoin;
|
|
15
|
-
constructor(coin: AbstractUtxoCoin);
|
|
16
|
-
getTransactionInfo(txid: string): Promise<ExplorerTxInfo>;
|
|
17
|
-
/**
|
|
18
|
-
* Fetch unspent transaction outputs using IMS unspents API
|
|
19
|
-
* @param addresses
|
|
20
|
-
* @param amountType
|
|
21
|
-
* @returns {*}
|
|
22
|
-
*/
|
|
23
|
-
getUnspentInfo<TNumber extends number | bigint = number>(addresses: string[], amountType?: 'number' | 'bigint'): Promise<Unspent<TNumber>[]>;
|
|
24
|
-
}
|
|
25
5
|
export interface BuildRecoveryTransactionOptions {
|
|
26
6
|
wallet: string;
|
|
27
7
|
faultyTxId: string;
|
|
28
8
|
recoveryAddress: string;
|
|
29
9
|
}
|
|
30
|
-
|
|
10
|
+
type FeeInfo = {
|
|
31
11
|
size: number;
|
|
32
12
|
feeRate: number;
|
|
33
13
|
fee: number;
|
|
@@ -51,12 +31,12 @@ export interface CrossChainRecoverySigned<TNumber extends number | bigint = numb
|
|
|
51
31
|
recoveryAddress?: string;
|
|
52
32
|
recoveryAmount?: TNumber;
|
|
53
33
|
}
|
|
54
|
-
|
|
34
|
+
type WalletV1 = {
|
|
55
35
|
keychains: {
|
|
56
36
|
xpub: string;
|
|
57
37
|
}[];
|
|
58
|
-
address({ address
|
|
59
|
-
address:
|
|
38
|
+
address({ address }: {
|
|
39
|
+
address: string;
|
|
60
40
|
}): Promise<{
|
|
61
41
|
chain: number;
|
|
62
42
|
index: number;
|
|
@@ -66,7 +46,14 @@ declare type WalletV1 = {
|
|
|
66
46
|
}>;
|
|
67
47
|
};
|
|
68
48
|
export declare function getWallet(bitgo: BitGoBase, coin: AbstractUtxoCoin, walletId: string): Promise<IWallet | WalletV1>;
|
|
69
|
-
|
|
49
|
+
/**
|
|
50
|
+
* @param recoveryCoin
|
|
51
|
+
* @param wallet
|
|
52
|
+
* @return wallet pubkeys
|
|
53
|
+
*/
|
|
54
|
+
export declare function getWalletKeys(recoveryCoin: AbstractUtxoCoin, wallet: IWallet | WalletV1): Promise<RootWalletKeys>;
|
|
55
|
+
export declare function isWalletAddress(wallet: IWallet | WalletV1, address: string): Promise<boolean>;
|
|
56
|
+
type RecoverParams = {
|
|
70
57
|
/** Wallet ID (can be v1 wallet or v2 wallet) */
|
|
71
58
|
walletId: string;
|
|
72
59
|
/** Coin to create the transaction for */
|
|
@@ -81,6 +68,8 @@ declare type RecoverParams = {
|
|
|
81
68
|
walletPassphrase?: string;
|
|
82
69
|
/** If set, signs transaction */
|
|
83
70
|
xprv?: string;
|
|
71
|
+
/** for utxo coins other than [BTC,TBTC] this is a Block Chair api key **/
|
|
72
|
+
apiKey?: string;
|
|
84
73
|
};
|
|
85
74
|
/**
|
|
86
75
|
* Recover wallet deposits that were received on the wrong blockchain
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crossChainRecovery.d.ts","sourceRoot":"","sources":["../../../src/recovery/crossChainRecovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crossChainRecovery.d.ts","sourceRoot":"","sources":["../../../src/recovery/crossChainRecovery.ts"],"names":[],"mappings":"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"}
|