@bitgo/abstract-utxo 10.24.0 → 11.0.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.
- package/dist/cjs/src/abstractUtxoCoin.d.ts +14 -2
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/cjs/src/abstractUtxoCoin.js +15 -7
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +5 -1
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +33 -4
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +3 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +1 -1
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +4 -3
- package/dist/cjs/test/unit/bip322.js +99 -28
- package/dist/cjs/test/unit/customChangeWallet.js +144 -155
- package/dist/cjs/test/unit/explainTransaction.js +1 -61
- package/dist/cjs/test/unit/parseTransaction.js +31 -1
- package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts +2 -0
- package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.js +99 -0
- package/dist/cjs/test/unit/prebuildAndSign.js +28 -59
- package/dist/cjs/test/unit/signTransaction.js +17 -39
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +4 -4
- package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +21 -77
- package/dist/cjs/test/unit/transaction/recipient.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/recipient.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/recipient.js +52 -0
- package/dist/cjs/test/unit/transaction.js +16 -23
- package/dist/cjs/test/unit/webauthn.d.ts +2 -0
- package/dist/cjs/test/unit/webauthn.d.ts.map +1 -0
- package/dist/cjs/test/unit/webauthn.js +73 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/abstractUtxoCoin.d.ts +14 -2
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/esm/abstractUtxoCoin.js +16 -8
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +5 -1
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +33 -4
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +3 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/explainTransaction.js +1 -1
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/parseTransaction.js +4 -3
- package/package.json +10 -10
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +0 -15
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +0 -1
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +0 -51
|
@@ -46,170 +46,159 @@ const sdk_test_1 = require("@bitgo/sdk-test");
|
|
|
46
46
|
const fixedScript_1 = require("../../src/transaction/fixedScript");
|
|
47
47
|
const verifyKey_1 = require("../../src/verifyKey");
|
|
48
48
|
const util_1 = require("./util");
|
|
49
|
-
function explainPsbt(psbt, walletKeys, customChangeWalletKeys
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
return (0, fixedScript_1.explainPsbt)(psbt, { pubs: walletKeys, customChangePubs: customChangeWalletKeys }, coin);
|
|
60
|
-
}
|
|
49
|
+
function explainPsbt(psbt, walletKeys, customChangeWalletKeys) {
|
|
50
|
+
return (0, fixedScript_1.explainPsbtWasm)(psbt, wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from(walletKeys), {
|
|
51
|
+
replayProtection: { publicKeys: [] },
|
|
52
|
+
customChangeWalletXpubs: customChangeWalletKeys
|
|
53
|
+
? wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from(customChangeWalletKeys)
|
|
54
|
+
: undefined,
|
|
55
|
+
});
|
|
61
56
|
}
|
|
62
|
-
function
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
57
|
+
describe('Custom Change Wallets', function () {
|
|
58
|
+
const coin = (0, util_1.getUtxoCoin)('btc');
|
|
59
|
+
const network = utxolib.networks.bitcoin;
|
|
60
|
+
const bgUrl = sdk_core_1.common.Environments[util_1.defaultBitGo.getEnv()].uri;
|
|
61
|
+
const rootWalletKeys = utxo_lib_1.testutil.getDefaultWalletKeys();
|
|
62
|
+
const customChangeWalletKeys = utxo_lib_1.testutil.getWalletKeysForSeed('custom change');
|
|
63
|
+
const userPrivateKey = wasm_utxo_1.BIP32.fromBase58(rootWalletKeys.triple[0].toBase58()).privateKey;
|
|
64
|
+
const mainKeyIds = rootWalletKeys.triple.map((k) => (0, sdk_test_1.getSeed)(k.neutered().toBase58()).toString('hex'));
|
|
65
|
+
const customChangeKeyIds = customChangeWalletKeys.triple.map((k) => (0, sdk_test_1.getSeed)(k.neutered().toBase58()).toString('hex'));
|
|
66
|
+
const customChangeKeySignatures = Object.fromEntries(['user', 'backup', 'bitgo'].map((name, i) => [
|
|
67
|
+
name,
|
|
68
|
+
Buffer.from(wasm_utxo_1.message.signMessage(customChangeWalletKeys.triple[i].neutered().toBase58(), userPrivateKey)).toString('hex'),
|
|
69
|
+
]));
|
|
70
|
+
const inputs = [{ scriptType: 'p2sh', value: BigInt(10000) }];
|
|
71
|
+
const outputs = [
|
|
72
|
+
// regular change (uses rootWalletKeys via default)
|
|
73
|
+
{ scriptType: 'p2sh', value: BigInt(3000) },
|
|
74
|
+
// custom change (bip32Derivation from customChangeWalletKeys, not added as global xpubs)
|
|
75
|
+
{ scriptType: 'p2sh', value: BigInt(3000), walletKeys: customChangeWalletKeys },
|
|
76
|
+
// external (no derivation info)
|
|
77
|
+
{ scriptType: 'p2sh', value: BigInt(3000), walletKeys: null },
|
|
78
|
+
];
|
|
79
|
+
const utxolibPsbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, network, rootWalletKeys, 'unsigned', {
|
|
80
|
+
addGlobalXPubs: true,
|
|
81
|
+
});
|
|
82
|
+
const psbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.fromBytes(utxolibPsbt.toBuffer(), 'btc');
|
|
83
|
+
const externalAddress = utxolib.address.fromOutputScript(utxolibPsbt.txOutputs[2].script, network);
|
|
84
|
+
const customChangeWalletId = 'custom-change-wallet-id';
|
|
85
|
+
const mainWalletId = 'main-wallet-id';
|
|
86
|
+
function nockKeyFetch(keyIds, keys) {
|
|
87
|
+
return keyIds.map((id, i) => nock(bgUrl).get(`/api/v2/${coin.getChain()}/key/${id}`).reply(200, { pub: keys.triple[i].neutered().toBase58() }));
|
|
88
|
+
}
|
|
89
|
+
function nockCustomChangeWallet() {
|
|
90
|
+
return nock(bgUrl).get(`/api/v2/${coin.getChain()}/wallet/${customChangeWalletId}`).reply(200, {
|
|
91
|
+
id: customChangeWalletId,
|
|
92
|
+
keys: customChangeKeyIds,
|
|
93
|
+
coin: coin.getChain(),
|
|
87
94
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
95
|
+
}
|
|
96
|
+
afterEach(() => nock.cleanAll());
|
|
97
|
+
it('classifies custom change output when customChangePubs is provided', function () {
|
|
98
|
+
const explanation = explainPsbt(psbt, rootWalletKeys, customChangeWalletKeys);
|
|
99
|
+
strict_1.default.strictEqual(explanation.changeOutputs.length, 1);
|
|
100
|
+
strict_1.default.strictEqual(explanation.changeOutputs[0].amount, '3000');
|
|
101
|
+
strict_1.default.ok(explanation.customChangeOutputs);
|
|
102
|
+
strict_1.default.strictEqual(explanation.customChangeOutputs.length, 1);
|
|
103
|
+
strict_1.default.strictEqual(explanation.customChangeOutputs[0].amount, '3000');
|
|
104
|
+
strict_1.default.strictEqual(explanation.customChangeAmount, '3000');
|
|
105
|
+
strict_1.default.strictEqual(explanation.outputs.length, 1);
|
|
106
|
+
strict_1.default.strictEqual(explanation.outputs[0].amount, '3000');
|
|
107
|
+
});
|
|
108
|
+
it('classifies custom change output as external without customChangePubs', function () {
|
|
109
|
+
const explanation = explainPsbt(psbt, rootWalletKeys, undefined);
|
|
110
|
+
strict_1.default.strictEqual(explanation.changeOutputs.length, 1);
|
|
111
|
+
strict_1.default.strictEqual(explanation.changeOutputs[0].amount, '3000');
|
|
112
|
+
strict_1.default.strictEqual(explanation.customChangeOutputs?.length ?? 0, 0);
|
|
113
|
+
// custom change + external both treated as external outputs
|
|
114
|
+
strict_1.default.strictEqual(explanation.outputs.length, 2);
|
|
115
|
+
});
|
|
116
|
+
it('verifies valid custom change key signatures', function () {
|
|
117
|
+
const userPub = rootWalletKeys.triple[0].neutered().toBase58();
|
|
118
|
+
for (const key of customChangeWalletKeys.triple) {
|
|
119
|
+
const pub = key.neutered().toBase58();
|
|
120
|
+
const signature = Buffer.from(wasm_utxo_1.message.signMessage(pub, userPrivateKey)).toString('hex');
|
|
121
|
+
strict_1.default.ok((0, verifyKey_1.verifyKeySignature)({ userKeychain: { pub: userPub }, keychainToVerify: { pub }, keySignature: signature }));
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
it('rejects invalid custom change key signatures', function () {
|
|
125
|
+
const wrongKey = wasm_utxo_1.BIP32.fromBase58(utxo_lib_1.testutil.getWalletKeysForSeed('wrong').triple[0].toBase58());
|
|
126
|
+
const userPub = rootWalletKeys.triple[0].neutered().toBase58();
|
|
127
|
+
for (const key of customChangeWalletKeys.triple) {
|
|
128
|
+
const pub = key.neutered().toBase58();
|
|
129
|
+
const badSignature = Buffer.from(wasm_utxo_1.message.signMessage(pub, wrongKey.privateKey)).toString('hex');
|
|
130
|
+
strict_1.default.strictEqual((0, verifyKey_1.verifyKeySignature)({ userKeychain: { pub: userPub }, keychainToVerify: { pub }, keySignature: badSignature }), false);
|
|
96
131
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
132
|
+
});
|
|
133
|
+
describe('parseTransaction', function () {
|
|
134
|
+
it('fetches custom change wallet keys and verifies signatures', async function () {
|
|
135
|
+
const wallet = new sdk_core_1.Wallet(util_1.defaultBitGo, coin, {
|
|
136
|
+
id: mainWalletId,
|
|
137
|
+
keys: mainKeyIds,
|
|
101
138
|
coin: coin.getChain(),
|
|
139
|
+
coinSpecific: { customChangeWalletId },
|
|
140
|
+
customChangeKeySignatures,
|
|
102
141
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
strict_1.default.strictEqual(explanation.changeOutputs[0].amount, '3000');
|
|
120
|
-
strict_1.default.strictEqual(explanation.customChangeOutputs?.length ?? 0, 0);
|
|
121
|
-
// custom change + external both treated as external outputs
|
|
122
|
-
strict_1.default.strictEqual(explanation.outputs.length, 2);
|
|
123
|
-
});
|
|
124
|
-
it('verifies valid custom change key signatures', function () {
|
|
125
|
-
const userPub = rootWalletKeys.triple[0].neutered().toBase58();
|
|
126
|
-
for (const key of customChangeWalletKeys.triple) {
|
|
127
|
-
const pub = key.neutered().toBase58();
|
|
128
|
-
const signature = Buffer.from(wasm_utxo_1.message.signMessage(pub, userPrivateKey)).toString('hex');
|
|
129
|
-
strict_1.default.ok((0, verifyKey_1.verifyKeySignature)({ userKeychain: { pub: userPub }, keychainToVerify: { pub }, keySignature: signature }));
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
it('rejects invalid custom change key signatures', function () {
|
|
133
|
-
const wrongKey = wasm_utxo_1.BIP32.fromBase58(utxo_lib_1.testutil.getWalletKeysForSeed('wrong').triple[0].toBase58());
|
|
134
|
-
const userPub = rootWalletKeys.triple[0].neutered().toBase58();
|
|
135
|
-
for (const key of customChangeWalletKeys.triple) {
|
|
136
|
-
const pub = key.neutered().toBase58();
|
|
137
|
-
const badSignature = Buffer.from(wasm_utxo_1.message.signMessage(pub, wrongKey.privateKey)).toString('hex');
|
|
138
|
-
strict_1.default.strictEqual((0, verifyKey_1.verifyKeySignature)({ userKeychain: { pub: userPub }, keychainToVerify: { pub }, keySignature: badSignature }), false);
|
|
142
|
+
const nocks = [
|
|
143
|
+
...nockKeyFetch(mainKeyIds, rootWalletKeys),
|
|
144
|
+
nockCustomChangeWallet(),
|
|
145
|
+
...nockKeyFetch(customChangeKeyIds, customChangeWalletKeys),
|
|
146
|
+
];
|
|
147
|
+
const parsed = await coin.parseTransaction({
|
|
148
|
+
txParams: { recipients: [{ address: externalAddress, amount: '3000' }] },
|
|
149
|
+
txPrebuild: { txHex: utxolibPsbt.toHex() },
|
|
150
|
+
wallet: wallet,
|
|
151
|
+
});
|
|
152
|
+
for (const n of nocks)
|
|
153
|
+
strict_1.default.ok(n.isDone());
|
|
154
|
+
strict_1.default.ok(parsed.customChange);
|
|
155
|
+
strict_1.default.strictEqual(parsed.customChange.keys.length, 3);
|
|
156
|
+
for (let i = 0; i < 3; i++) {
|
|
157
|
+
strict_1.default.strictEqual(parsed.customChange.keys[i].pub, customChangeWalletKeys.triple[i].neutered().toBase58());
|
|
139
158
|
}
|
|
159
|
+
strict_1.default.strictEqual(parsed.explicitExternalOutputs.length, 1);
|
|
160
|
+
strict_1.default.strictEqual(parsed.explicitExternalOutputs[0].amount, '3000');
|
|
140
161
|
});
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
coinSpecific: { customChangeWalletId },
|
|
148
|
-
customChangeKeySignatures,
|
|
149
|
-
});
|
|
150
|
-
const nocks = [
|
|
151
|
-
...nockKeyFetch(mainKeyIds, rootWalletKeys),
|
|
152
|
-
nockCustomChangeWallet(),
|
|
153
|
-
...nockKeyFetch(customChangeKeyIds, customChangeWalletKeys),
|
|
154
|
-
];
|
|
155
|
-
const parsed = await coin.parseTransaction({
|
|
156
|
-
txParams: { recipients: [{ address: externalAddress, amount: '3000' }] },
|
|
157
|
-
txPrebuild: { txHex: utxolibPsbt.toHex(), decodeWith: sdkBackend },
|
|
158
|
-
wallet: wallet,
|
|
159
|
-
});
|
|
160
|
-
for (const n of nocks)
|
|
161
|
-
strict_1.default.ok(n.isDone());
|
|
162
|
-
strict_1.default.ok(parsed.customChange);
|
|
163
|
-
strict_1.default.strictEqual(parsed.customChange.keys.length, 3);
|
|
164
|
-
for (let i = 0; i < 3; i++) {
|
|
165
|
-
strict_1.default.strictEqual(parsed.customChange.keys[i].pub, customChangeWalletKeys.triple[i].neutered().toBase58());
|
|
166
|
-
}
|
|
167
|
-
strict_1.default.strictEqual(parsed.explicitExternalOutputs.length, 1);
|
|
168
|
-
strict_1.default.strictEqual(parsed.explicitExternalOutputs[0].amount, '3000');
|
|
162
|
+
it('has no custom change when wallet lacks customChangeWalletId', async function () {
|
|
163
|
+
const wallet = new sdk_core_1.Wallet(util_1.defaultBitGo, coin, {
|
|
164
|
+
id: mainWalletId,
|
|
165
|
+
keys: mainKeyIds,
|
|
166
|
+
coin: coin.getChain(),
|
|
167
|
+
coinSpecific: {},
|
|
169
168
|
});
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
coinSpecific: {},
|
|
176
|
-
});
|
|
177
|
-
const nocks = nockKeyFetch(mainKeyIds, rootWalletKeys);
|
|
178
|
-
const parsed = await coin.parseTransaction({
|
|
179
|
-
txParams: { recipients: [{ address: externalAddress, amount: '3000' }] },
|
|
180
|
-
txPrebuild: { txHex: utxolibPsbt.toHex(), decodeWith: sdkBackend },
|
|
181
|
-
wallet: wallet,
|
|
182
|
-
});
|
|
183
|
-
for (const n of nocks)
|
|
184
|
-
strict_1.default.ok(n.isDone());
|
|
185
|
-
strict_1.default.strictEqual(parsed.customChange, undefined);
|
|
186
|
-
strict_1.default.strictEqual(parsed.needsCustomChangeKeySignatureVerification, false);
|
|
169
|
+
const nocks = nockKeyFetch(mainKeyIds, rootWalletKeys);
|
|
170
|
+
const parsed = await coin.parseTransaction({
|
|
171
|
+
txParams: { recipients: [{ address: externalAddress, amount: '3000' }] },
|
|
172
|
+
txPrebuild: { txHex: utxolibPsbt.toHex() },
|
|
173
|
+
wallet: wallet,
|
|
187
174
|
});
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
txParams: { recipients: [{ address: externalAddress, amount: '3000' }] },
|
|
206
|
-
txPrebuild: { txHex: utxolibPsbt.toHex(), decodeWith: sdkBackend },
|
|
207
|
-
wallet: wallet,
|
|
208
|
-
}), /failed to verify custom change .* key signature/);
|
|
175
|
+
for (const n of nocks)
|
|
176
|
+
strict_1.default.ok(n.isDone());
|
|
177
|
+
strict_1.default.strictEqual(parsed.customChange, undefined);
|
|
178
|
+
strict_1.default.strictEqual(parsed.needsCustomChangeKeySignatureVerification, false);
|
|
179
|
+
});
|
|
180
|
+
it('rejects invalid custom change key signatures', async function () {
|
|
181
|
+
const wrongKey = wasm_utxo_1.BIP32.fromBase58(utxo_lib_1.testutil.getWalletKeysForSeed('wrong').triple[0].toBase58());
|
|
182
|
+
const badSignatures = Object.fromEntries(['user', 'backup', 'bitgo'].map((name, i) => [
|
|
183
|
+
name,
|
|
184
|
+
Buffer.from(wasm_utxo_1.message.signMessage(customChangeWalletKeys.triple[i].neutered().toBase58(), wrongKey.privateKey)).toString('hex'),
|
|
185
|
+
]));
|
|
186
|
+
const wallet = new sdk_core_1.Wallet(util_1.defaultBitGo, coin, {
|
|
187
|
+
id: mainWalletId,
|
|
188
|
+
keys: mainKeyIds,
|
|
189
|
+
coin: coin.getChain(),
|
|
190
|
+
coinSpecific: { customChangeWalletId },
|
|
191
|
+
customChangeKeySignatures: badSignatures,
|
|
209
192
|
});
|
|
193
|
+
nockKeyFetch(mainKeyIds, rootWalletKeys);
|
|
194
|
+
nockCustomChangeWallet();
|
|
195
|
+
nockKeyFetch(customChangeKeyIds, customChangeWalletKeys);
|
|
196
|
+
await strict_1.default.rejects(() => coin.parseTransaction({
|
|
197
|
+
txParams: { recipients: [{ address: externalAddress, amount: '3000' }] },
|
|
198
|
+
txPrebuild: { txHex: utxolibPsbt.toHex() },
|
|
199
|
+
wallet: wallet,
|
|
200
|
+
}), /failed to verify custom change .* key signature/);
|
|
210
201
|
});
|
|
211
202
|
});
|
|
212
|
-
}
|
|
213
|
-
describeWithBackend('utxolib');
|
|
214
|
-
describeWithBackend('wasm-utxo');
|
|
215
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tQ2hhbmdlV2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2N1c3RvbUNoYW5nZVdhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdFQUF3QztBQUV4Qyw2QkFBOEI7QUFDOUIsZ0RBQStFO0FBQy9FLHlEQUEyQztBQUMzQyw4Q0FBMkM7QUFDM0MsOENBQWlEO0FBQ2pELDhDQUEwQztBQUUxQyxtRUFBdUc7QUFDdkcsbURBQXlEO0FBR3pELGlDQUFtRDtBQUVuRCxTQUFTLFdBQVcsQ0FDbEIsSUFBMEQsRUFDMUQsVUFBd0MsRUFDeEMsc0JBQWdFLEVBQ2hFLElBQWM7SUFFZCxJQUFJLElBQUksWUFBWSw2QkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoRCxPQUFPLElBQUEsNkJBQWUsRUFBQyxJQUFJLEVBQUUsNkJBQWlCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM5RSxnQkFBZ0IsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUU7WUFDcEMsdUJBQXVCLEVBQUUsc0JBQXNCO2dCQUM3QyxDQUFDLENBQUMsNkJBQWlCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztnQkFDL0QsQ0FBQyxDQUFDLFNBQVM7U0FDZCxDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sSUFBQSx5QkFBa0IsRUFBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEcsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLFVBQXNCO0lBQ2pELFFBQVEsQ0FBQyxxQ0FBcUMsVUFBVSxHQUFHLEVBQUU7UUFDM0QsTUFBTSxJQUFJLEdB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QUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0IsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5cbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgQ29pbk5hbWUsIGZpeGVkU2NyaXB0V2FsbGV0LCBCSVAzMiwgbWVzc2FnZSB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgdGVzdHV0aWwgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgY29tbW9uLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZ2V0U2VlZCB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5cbmltcG9ydCB7IGV4cGxhaW5Qc2J0IGFzIGV4cGxhaW5Qc2J0VXR4b2xpYiwgZXhwbGFpblBzYnRXYXNtIH0gZnJvbSAnLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0JztcbmltcG9ydCB7IHZlcmlmeUtleVNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3NyYy92ZXJpZnlLZXknO1xuaW1wb3J0IHsgU2RrQmFja2VuZCB9IGZyb20gJy4uLy4uL3NyYy90cmFuc2FjdGlvbic7XG5cbmltcG9ydCB7IGRlZmF1bHRCaXRHbywgZ2V0VXR4b0NvaW4gfSBmcm9tICcuL3V0aWwnO1xuXG5mdW5jdGlvbiBleHBsYWluUHNidChcbiAgcHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB8IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCxcbiAgd2FsbGV0S2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyxcbiAgY3VzdG9tQ2hhbmdlV2FsbGV0S2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyB8IHVuZGVmaW5lZCxcbiAgY29pbjogQ29pbk5hbWVcbikge1xuICBpZiAocHNidCBpbnN0YW5jZW9mIGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCkge1xuICAgIHJldHVybiBleHBsYWluUHNidFdhc20ocHNidCwgZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbSh3YWxsZXRLZXlzKSwge1xuICAgICAgcmVwbGF5UHJvdGVjdGlvbjogeyBwdWJsaWNLZXlzOiBbXSB9LFxuICAgICAgY3VzdG9tQ2hhbmdlV2FsbGV0WHB1YnM6IGN1c3RvbUNoYW5nZVdhbGxldEtleXNcbiAgICAgICAgPyBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cy5mcm9tKGN1c3RvbUNoYW5nZVdhbGxldEtleXMpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBleHBsYWluUHNidFV0eG9saWIocHNidCwgeyBwdWJzOiB3YWxsZXRLZXlzLCBjdXN0b21DaGFuZ2VQdWJzOiBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzIH0sIGNvaW4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlV2l0aEJhY2tlbmQoc2RrQmFja2VuZDogU2RrQmFja2VuZCkge1xuICBkZXNjcmliZShgQ3VzdG9tIENoYW5nZSBXYWxsZXRzIChzZGtCYWNrZW5kPSR7c2RrQmFja2VuZH0pYCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvaW4gPSBnZXRVdHhvQ29pbignYnRjJyk7XG4gICAgY29uc3QgbmV0d29yayA9IHV0eG9saWIubmV0d29ya3MuYml0Y29pbjtcbiAgICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZGVmYXVsdEJpdEdvLmdldEVudigpXS51cmk7XG4gICAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSB0ZXN0dXRpbC5nZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICAgIGNvbnN0IGN1c3RvbUNoYW5nZVdhbGxldEtleXMgPSB0ZXN0dXRpbC5nZXRXYWxsZXRLZXlzRm9yU2VlZCgnY3VzdG9tIGNoYW5nZScpO1xuICAgIGNvbnN0IHVzZXJQcml2YXRlS2V5ID0gQklQMzIuZnJvbUJhc2U1OChyb290V2FsbGV0S2V5cy50cmlwbGVbMF0udG9CYXNlNTgoKSkucHJpdmF0ZUtleSE7XG5cbiAgICBjb25zdCBtYWluS2V5SWRzID0gcm9vdFdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gZ2V0U2VlZChrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlJZHMgPSBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzLnRyaXBsZS5tYXAoKGspID0+XG4gICAgICBnZXRTZWVkKGsubmV1dGVyZWQoKS50b0Jhc2U1OCgpKS50b1N0cmluZygnaGV4JylcbiAgICApO1xuICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAoWyd1c2VyJywgJ2JhY2t1cCcsICdiaXRnbyddIGFzIGNvbnN0KS5tYXAoKG5hbWUsIGkpID0+IFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgQnVmZmVyLmZyb20oXG4gICAgICAgICAgbWVzc2FnZS5zaWduTWVzc2FnZShjdXN0b21DaGFuZ2VXYWxsZXRLZXlzLnRyaXBsZVtpXS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksIHVzZXJQcml2YXRlS2V5KVxuICAgICAgICApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIF0pXG4gICAgKSBhcyBSZWNvcmQ8J3VzZXInIHwgJ2JhY2t1cCcgfCAnYml0Z28nLCBzdHJpbmc+O1xuXG4gICAgY29uc3QgaW5wdXRzOiB0ZXN0dXRpbC5JbnB1dFtdID0gW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogQmlnSW50KDEwMDAwKSB9XTtcbiAgICBjb25zdCBvdXRwdXRzOiB0ZXN0dXRpbC5PdXRwdXRbXSA9IFtcbiAgICAgIC8vIHJlZ3VsYXIgY2hhbmdlICh1c2VzIHJvb3RXYWxsZXRLZXlzIHZpYSBkZWZhdWx0KVxuICAgICAgeyBzY3JpcHRUeXBlOiAncDJzaCcsIHZhbHVlOiBCaWdJbnQoMzAwMCkgfSxcbiAgICAgIC8vIGN1c3RvbSBjaGFuZ2UgKGJpcDMyRGVyaXZhdGlvbiBmcm9tIGN1c3RvbUNoYW5nZVdhbGxldEtleXMsIG5vdCBhZGRlZCBhcyBnbG9iYWwgeHB1YnMpXG4gICAgICB7IHNjcmlwdFR5cGU6ICdwMnNoJywgdmFsdWU6IEJpZ0ludCgzMDAwKSwgd2FsbGV0S2V5czogY3VzdG9tQ2hhbmdlV2FsbGV0S2V5cyB9LFxuICAgICAgLy8gZXh0ZXJuYWwgKG5vIGRlcml2YXRpb24gaW5mbylcbiAgICAgIHsgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogQmlnSW50KDMwMDApLCB3YWxsZXRLZXlzOiBudWxsIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IHV0eG9saWJQc2J0ID0gdGVzdHV0aWwuY29uc3RydWN0UHNidChpbnB1dHMsIG91dHB1dHMsIG5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCAndW5zaWduZWQnLCB7XG4gICAgICBhZGRHbG9iYWxYUHViczogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHwgZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0ID1cbiAgICAgIHNka0JhY2tlbmQgPT09ICd3YXNtLXV0eG8nID8gZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0LmZyb21CeXRlcyh1dHhvbGliUHNidC50b0J1ZmZlcigpLCAnYnRjJykgOiB1dHhvbGliUHNidDtcblxuICAgIGNvbnN0IGV4dGVybmFsQWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHV0eG9saWJQc2J0LnR4T3V0cHV0c1syXS5zY3JpcHQsIG5ldHdvcmspO1xuICAgIGNvbnN0IGN1c3RvbUNoYW5nZVdhbGxldElkID0gJ2N1c3RvbS1jaGFuZ2Utd2FsbGV0LWlkJztcbiAgICBjb25zdCBtYWluV2FsbGV0SWQgPSAnbWFpbi13YWxsZXQtaWQnO1xuXG4gICAgZnVuY3Rpb24gbm9ja0tleUZldGNoKGtleUlkczogc3RyaW5nW10sIGtleXM6IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMpOiBub2NrLlNjb3BlW10ge1xuICAgICAgcmV0dXJuIGtleUlkcy5tYXAoKGlkLCBpKSA9PlxuICAgICAgICBub2NrKGJnVXJsKVxuICAgICAgICAgIC5nZXQoYC9hcGkvdjIvJHtjb2luLmdldENoYWluKCl9L2tleS8ke2lkfWApXG4gICAgICAgICAgLnJlcGx5KDIwMCwgeyBwdWI6IGtleXMudHJpcGxlW2ldLm5ldXRlcmVkKCkudG9CYXNlNTgoKSB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub2NrQ3VzdG9tQ2hhbmdlV2FsbGV0KCk6IG5vY2suU2NvcGUge1xuICAgICAgcmV0dXJuIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke2NvaW4uZ2V0Q2hhaW4oKX0vd2FsbGV0LyR7Y3VzdG9tQ2hhbmdlV2FsbGV0SWR9YCkucmVwbHkoMjAwLCB7XG4gICAgICAgIGlkOiBjdXN0b21DaGFuZ2VXYWxsZXRJZCxcbiAgICAgICAga2V5czogY3VzdG9tQ2hhbmdlS2V5SWRzLFxuICAgICAgICBjb2luOiBjb2luLmdldENoYWluKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhZnRlckVhY2goKCkgPT4gbm9jay5jbGVhbkFsbCgpKTtcblxuICAgIGl0KCdjbGFzc2lmaWVzIGN1c3RvbSBjaGFuZ2Ugb3V0cHV0IHdoZW4gY3VzdG9tQ2hhbmdlUHVicyBpcyBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gZXhwbGFpblBzYnQocHNidCwgcm9vdFdhbGxldEtleXMsIGN1c3RvbUNoYW5nZVdhbGxldEtleXMsICdidGMnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzWzBdLmFtb3VudCwgJzMwMDAnKTtcblxuICAgICAgYXNzZXJ0Lm9rKGV4cGxhbmF0aW9uLmN1c3RvbUNoYW5nZU91dHB1dHMpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmN1c3RvbUNoYW5nZU91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jdXN0b21DaGFuZ2VPdXRwdXRzWzBdLmFtb3VudCwgJzMwMDAnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jdXN0b21DaGFuZ2VBbW91bnQsICczMDAwJyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hbW91bnQsICczMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2xhc3NpZmllcyBjdXN0b20gY2hhbmdlIG91dHB1dCBhcyBleHRlcm5hbCB3aXRob3V0IGN1c3RvbUNoYW5nZVB1YnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IGV4cGxhaW5Qc2J0KHBzYnQsIHJvb3RXYWxsZXRLZXlzLCB1bmRlZmluZWQsICdidGMnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzWzBdLmFtb3VudCwgJzMwMDAnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmN1c3RvbUNoYW5nZU91dHB1dHM/Lmxlbmd0aCA/PyAwLCAwKTtcblxuICAgICAgLy8gY3VzdG9tIGNoYW5nZSArIGV4dGVybmFsIGJvdGggdHJlYXRlZCBhcyBleHRlcm5hbCBvdXRwdXRzXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZlcmlmaWVzIHZhbGlkIGN1c3RvbSBjaGFuZ2Uga2V5IHNpZ25hdHVyZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1c2VyUHViID0gcm9vdFdhbGxldEtleXMudHJpcGxlWzBdLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgY3VzdG9tQ2hhbmdlV2FsbGV0S2V5cy50cmlwbGUpIHtcbiAgICAgICAgY29uc3QgcHViID0ga2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gQnVmZmVyLmZyb20obWVzc2FnZS5zaWduTWVzc2FnZShwdWIsIHVzZXJQcml2YXRlS2V5KSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICBhc3NlcnQub2soXG4gICAgICAgICAgdmVyaWZ5S2V5U2lnbmF0dXJlKHsgdXNlcktleWNoYWluOiB7IHB1YjogdXNlclB1YiB9LCBrZXljaGFpblRvVmVyaWZ5OiB7IHB1YiB9LCBrZXlTaWduYXR1cmU6IHNpZ25hdHVyZSB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgaW52YWxpZCBjdXN0b20gY2hhbmdlIGtleSBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd3JvbmdLZXkgPSBCSVAzMi5mcm9tQmFzZTU4KHRlc3R1dGlsLmdldFdhbGxldEtleXNGb3JTZWVkKCd3cm9uZycpLnRyaXBsZVswXS50b0Jhc2U1OCgpKTtcbiAgICAgIGNvbnN0IHVzZXJQdWIgPSByb290V2FsbGV0S2V5cy50cmlwbGVbMF0ubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzLnRyaXBsZSkge1xuICAgICAgICBjb25zdCBwdWIgPSBrZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuICAgICAgICBjb25zdCBiYWRTaWduYXR1cmUgPSBCdWZmZXIuZnJvbShtZXNzYWdlLnNpZ25NZXNzYWdlKHB1Yiwgd3JvbmdLZXkucHJpdmF0ZUtleSEpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgICB2ZXJpZnlLZXlTaWduYXR1cmUoeyB1c2VyS2V5Y2hhaW46IHsgcHViOiB1c2VyUHViIH0sIGtleWNoYWluVG9WZXJpZnk6IHsgcHViIH0sIGtleVNpZ25hdHVyZTogYmFkU2lnbmF0dXJlIH0pLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncGFyc2VUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdmZXRjaGVzIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGtleXMgYW5kIHZlcmlmaWVzIHNpZ25hdHVyZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoZGVmYXVsdEJpdEdvLCBjb2luLCB7XG4gICAgICAgICAgaWQ6IG1haW5XYWxsZXRJZCxcbiAgICAgICAgICBrZXlzOiBtYWluS2V5SWRzLFxuICAgICAgICAgIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgICAgICBjb2luU3BlY2lmaWM6IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgfSxcbiAgICAgICAgICBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBub2NrcyA9IFtcbiAgICAgICAgICAuLi5ub2NrS2V5RmV0Y2gobWFpbktleUlkcywgcm9vdFdhbGxldEtleXMpLFxuICAgICAgICAgIG5vY2tDdXN0b21DaGFuZ2VXYWxsZXQoKSxcbiAgICAgICAgICAuLi5ub2NrS2V5RmV0Y2goY3VzdG9tQ2hhbmdlS2V5SWRzLCBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzKSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCBjb2luLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IGV4dGVybmFsQWRkcmVzcywgYW1vdW50OiAnMzAwMCcgfV0gfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1dHhvbGliUHNidC50b0hleCgpLCBkZWNvZGVXaXRoOiBzZGtCYWNrZW5kIH0sXG4gICAgICAgICAgd2FsbGV0OiB3YWxsZXQgYXMgdW5rbm93biBhcyBpbXBvcnQoJy4uLy4uL3NyYycpLlV0eG9XYWxsZXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBub2NrcykgYXNzZXJ0Lm9rKG4uaXNEb25lKCkpO1xuXG4gICAgICAgIGFzc2VydC5vayhwYXJzZWQuY3VzdG9tQ2hhbmdlKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlZC5jdXN0b21DaGFuZ2Uua2V5cy5sZW5ndGgsIDMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZWQuY3VzdG9tQ2hhbmdlLmtleXNbaV0ucHViLCBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzLnRyaXBsZVtpXS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlZC5leHBsaWNpdEV4dGVybmFsT3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLmV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzWzBdLmFtb3VudCwgJzMwMDAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaGFzIG5vIGN1c3RvbSBjaGFuZ2Ugd2hlbiB3YWxsZXQgbGFja3MgY3VzdG9tQ2hhbmdlV2FsbGV0SWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoZGVmYXVsdEJpdEdvLCBjb2luLCB7XG4gICAgICAgICAgaWQ6IG1haW5XYWxsZXRJZCxcbiAgICAgICAgICBrZXlzOiBtYWluS2V5SWRzLFxuICAgICAgICAgIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBub2NrcyA9IG5vY2tLZXlGZXRjaChtYWluS2V5SWRzLCByb290V2FsbGV0S2V5cyk7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gYXdhaXQgY29pbi5wYXJzZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBleHRlcm5hbEFkZHJlc3MsIGFtb3VudDogJzMwMDAnIH1dIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogdXR4b2xpYlBzYnQudG9IZXgoKSwgZGVjb2RlV2l0aDogc2RrQmFja2VuZCB9LFxuICAgICAgICAgIHdhbGxldDogd2FsbGV0IGFzIHVua25vd24gYXMgaW1wb3J0KCcuLi8uLi9zcmMnKS5VdHhvV2FsbGV0LFxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9ja3MpIGFzc2VydC5vayhuLmlzRG9uZSgpKTtcblxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLmN1c3RvbUNoYW5nZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlZC5uZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbiwgZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZWplY3RzIGludmFsaWQgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgd3JvbmdLZXkgPSBCSVAzMi5mcm9tQmFzZTU4KHRlc3R1dGlsLmdldFdhbGxldEtleXNGb3JTZWVkKCd3cm9uZycpLnRyaXBsZVswXS50b0Jhc2U1OCgpKTtcbiAgICAgICAgY29uc3QgYmFkU2lnbmF0dXJlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAoWyd1c2VyJywgJ2JhY2t1cCcsICdiaXRnbyddIGFzIGNvbnN0KS5tYXAoKG5hbWUsIGkpID0+IFtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgbWVzc2FnZS5zaWduTWVzc2FnZShjdXN0b21DaGFuZ2VXYWxsZXRLZXlzLnRyaXBsZVtpXS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksIHdyb25nS2V5LnByaXZhdGVLZXkhKVxuICAgICAgICAgICAgKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgXSlcbiAgICAgICAgKSBhcyBSZWNvcmQ8J3VzZXInIHwgJ2JhY2t1cCcgfCAnYml0Z28nLCBzdHJpbmc+O1xuXG4gICAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoZGVmYXVsdEJpdEdvLCBjb2luLCB7XG4gICAgICAgICAgaWQ6IG1haW5XYWxsZXRJZCxcbiAgICAgICAgICBrZXlzOiBtYWluS2V5SWRzLFxuICAgICAgICAgIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgICAgICBjb2luU3BlY2lmaWM6IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgfSxcbiAgICAgICAgICBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzOiBiYWRTaWduYXR1cmVzLFxuICAgICAgICB9KTtcblxuICAgICAgICBub2NrS2V5RmV0Y2gobWFpbktleUlkcywgcm9vdFdhbGxldEtleXMpO1xuICAgICAgICBub2NrQ3VzdG9tQ2hhbmdlV2FsbGV0KCk7XG4gICAgICAgIG5vY2tLZXlGZXRjaChjdXN0b21DaGFuZ2VLZXlJZHMsIGN1c3RvbUNoYW5nZVdhbGxldEtleXMpO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICBjb2luLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBleHRlcm5hbEFkZHJlc3MsIGFtb3VudDogJzMwMDAnIH1dIH0sXG4gICAgICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IHV0eG9saWJQc2J0LnRvSGV4KCksIGRlY29kZVdpdGg6IHNka0JhY2tlbmQgfSxcbiAgICAgICAgICAgICAgd2FsbGV0OiB3YWxsZXQgYXMgdW5rbm93biBhcyBpbXBvcnQoJy4uLy4uL3NyYycpLlV0eG9XYWxsZXQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvZmFpbGVkIHRvIHZlcmlmeSBjdXN0b20gY2hhbmdlIC4qIGtleSBzaWduYXR1cmUvXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmRlc2NyaWJlV2l0aEJhY2tlbmQoJ3V0eG9saWInKTtcbmRlc2NyaWJlV2l0aEJhY2tlbmQoJ3dhc20tdXR4bycpO1xuIl19
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tQ2hhbmdlV2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2N1c3RvbUNoYW5nZVdhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdFQUF3QztBQUV4Qyw2QkFBOEI7QUFDOUIsZ0RBQXFFO0FBQ3JFLHlEQUEyQztBQUMzQyw4Q0FBMkM7QUFDM0MsOENBQWlEO0FBQ2pELDhDQUEwQztBQUUxQyxtRUFBb0U7QUFDcEUsbURBQXlEO0FBRXpELGlDQUFtRDtBQUVuRCxTQUFTLFdBQVcsQ0FDbEIsSUFBaUMsRUFDakMsVUFBd0MsRUFDeEMsc0JBQWdFO0lBRWhFLE9BQU8sSUFBQSw2QkFBZSxFQUFDLElBQUksRUFBRSw2QkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQzlFLGdCQUFnQixFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRTtRQUNwQyx1QkFBdUIsRUFBRSxzQkFBc0I7WUFDN0MsQ0FBQyxDQUFDLDZCQUFpQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDL0QsQ0FBQyxDQUFDLFNBQVM7S0FDZCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUEsa0JBQVcsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUN6QyxNQUFNLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzdELE1BQU0sY0FBYyxHQUFHLG1CQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUN2RCxNQUFNLHNCQUFzQixH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Q2hCLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNyQixZQUFZLEVBQUUsRUFBRSxvQkFBb0IsRUFBRTtnQkFDdEMseUJBQXlCLEVBQUUsYUFBYTthQUN6QyxDQUFDLENBQUM7WUFFSCxZQUFZLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3pDLHNCQUFzQixFQUFFLENBQUM7WUFDekIsWUFBWSxDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFFekQsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsR0FBRyxFQUFFLENBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2dCQUNwQixRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7Z0JBQ3hFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzFDLE1BQU0sRUFBRSxNQUFtRDthQUM1RCxDQUFDLEVBQ0osaURBQWlELENBQ2xELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5cbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgZml4ZWRTY3JpcHRXYWxsZXQsIEJJUDMyLCBtZXNzYWdlIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyB0ZXN0dXRpbCB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBjb21tb24sIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBnZXRTZWVkIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcblxuaW1wb3J0IHsgZXhwbGFpblBzYnRXYXNtIH0gZnJvbSAnLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0JztcbmltcG9ydCB7IHZlcmlmeUtleVNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3NyYy92ZXJpZnlLZXknO1xuXG5pbXBvcnQgeyBkZWZhdWx0Qml0R28sIGdldFV0eG9Db2luIH0gZnJvbSAnLi91dGlsJztcblxuZnVuY3Rpb24gZXhwbGFpblBzYnQoXG4gIHBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCxcbiAgd2FsbGV0S2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyxcbiAgY3VzdG9tQ2hhbmdlV2FsbGV0S2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyB8IHVuZGVmaW5lZFxuKSB7XG4gIHJldHVybiBleHBsYWluUHNidFdhc20ocHNidCwgZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbSh3YWxsZXRLZXlzKSwge1xuICAgIHJlcGxheVByb3RlY3Rpb246IHsgcHVibGljS2V5czogW10gfSxcbiAgICBjdXN0b21DaGFuZ2VXYWxsZXRYcHViczogY3VzdG9tQ2hhbmdlV2FsbGV0S2V5c1xuICAgICAgPyBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cy5mcm9tKGN1c3RvbUNoYW5nZVdhbGxldEtleXMpXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgfSk7XG59XG5cbmRlc2NyaWJlKCdDdXN0b20gQ2hhbmdlIFdhbGxldHMnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW4gPSBnZXRVdHhvQ29pbignYnRjJyk7XG4gIGNvbnN0IG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW47XG4gIGNvbnN0IGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tkZWZhdWx0Qml0R28uZ2V0RW52KCldLnVyaTtcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSB0ZXN0dXRpbC5nZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICBjb25zdCBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzID0gdGVzdHV0aWwuZ2V0V2FsbGV0S2V5c0ZvclNlZWQoJ2N1c3RvbSBjaGFuZ2UnKTtcbiAgY29uc3QgdXNlclByaXZhdGVLZXkgPSBCSVAzMi5mcm9tQmFzZTU4KHJvb3RXYWxsZXRLZXlzLnRyaXBsZVswXS50b0Jhc2U1OCgpKS5wcml2YXRlS2V5ITtcblxuICBjb25zdCBtYWluS2V5SWRzID0gcm9vdFdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gZ2V0U2VlZChrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSkudG9TdHJpbmcoJ2hleCcpKTtcbiAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5SWRzID0gY3VzdG9tQ2hhbmdlV2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBnZXRTZWVkKGsubmV1dGVyZWQoKS50b0Jhc2U1OCgpKS50b1N0cmluZygnaGV4JykpO1xuICBjb25zdCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIChbJ3VzZXInLCAnYmFja3VwJywgJ2JpdGdvJ10gYXMgY29uc3QpLm1hcCgobmFtZSwgaSkgPT4gW1xuICAgICAgbmFtZSxcbiAgICAgIEJ1ZmZlci5mcm9tKG1lc3NhZ2Uuc2lnbk1lc3NhZ2UoY3VzdG9tQ2hhbmdlV2FsbGV0S2V5cy50cmlwbGVbaV0ubmV1dGVyZWQoKS50b0Jhc2U1OCgpLCB1c2VyUHJpdmF0ZUtleSkpLnRvU3RyaW5nKFxuICAgICAgICAnaGV4J1xuICAgICAgKSxcbiAgICBdKVxuICApIGFzIFJlY29yZDwndXNlcicgfCAnYmFja3VwJyB8ICdiaXRnbycsIHN0cmluZz47XG5cbiAgY29uc3QgaW5wdXRzOiB0ZXN0dXRpbC5JbnB1dFtdID0gW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogQmlnSW50KDEwMDAwKSB9XTtcbiAgY29uc3Qgb3V0cHV0czogdGVzdHV0aWwuT3V0cHV0W10gPSBbXG4gICAgLy8gcmVndWxhciBjaGFuZ2UgKHVzZXMgcm9vdFdhbGxldEtleXMgdmlhIGRlZmF1bHQpXG4gICAgeyBzY3JpcHRUeXBlOiAncDJzaCcsIHZhbHVlOiBCaWdJbnQoMzAwMCkgfSxcbiAgICAvLyBjdXN0b20gY2hhbmdlIChiaXAzMkRlcml2YXRpb24gZnJvbSBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzLCBub3QgYWRkZWQgYXMgZ2xvYmFsIHhwdWJzKVxuICAgIHsgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogQmlnSW50KDMwMDApLCB3YWxsZXRLZXlzOiBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzIH0sXG4gICAgLy8gZXh0ZXJuYWwgKG5vIGRlcml2YXRpb24gaW5mbylcbiAgICB7IHNjcmlwdFR5cGU6ICdwMnNoJywgdmFsdWU6IEJpZ0ludCgzMDAwKSwgd2FsbGV0S2V5czogbnVsbCB9LFxuICBdO1xuXG4gIGNvbnN0IHV0eG9saWJQc2J0ID0gdGVzdHV0aWwuY29uc3RydWN0UHNidChpbnB1dHMsIG91dHB1dHMsIG5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCAndW5zaWduZWQnLCB7XG4gICAgYWRkR2xvYmFsWFB1YnM6IHRydWUsXG4gIH0pO1xuICBjb25zdCBwc2J0ID0gZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0LmZyb21CeXRlcyh1dHhvbGliUHNidC50b0J1ZmZlcigpLCAnYnRjJyk7XG5cbiAgY29uc3QgZXh0ZXJuYWxBZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQodXR4b2xpYlBzYnQudHhPdXRwdXRzWzJdLnNjcmlwdCwgbmV0d29yayk7XG4gIGNvbnN0IGN1c3RvbUNoYW5nZVdhbGxldElkID0gJ2N1c3RvbS1jaGFuZ2Utd2FsbGV0LWlkJztcbiAgY29uc3QgbWFpbldhbGxldElkID0gJ21haW4td2FsbGV0LWlkJztcblxuICBmdW5jdGlvbiBub2NrS2V5RmV0Y2goa2V5SWRzOiBzdHJpbmdbXSwga2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyk6IG5vY2suU2NvcGVbXSB7XG4gICAgcmV0dXJuIGtleUlkcy5tYXAoKGlkLCBpKSA9PlxuICAgICAgbm9jayhiZ1VybCkuZ2V0KGAvYXBpL3YyLyR7Y29pbi5nZXRDaGFpbigpfS9rZXkvJHtpZH1gKS5yZXBseSgyMDAsIHsgcHViOiBrZXlzLnRyaXBsZVtpXS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSlcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gbm9ja0N1c3RvbUNoYW5nZVdhbGxldCgpOiBub2NrLlNjb3BlIHtcbiAgICByZXR1cm4gbm9jayhiZ1VybCkuZ2V0KGAvYXBpL3YyLyR7Y29pbi5nZXRDaGFpbigpfS93YWxsZXQvJHtjdXN0b21DaGFuZ2VXYWxsZXRJZH1gKS5yZXBseSgyMDAsIHtcbiAgICAgIGlkOiBjdXN0b21DaGFuZ2VXYWxsZXRJZCxcbiAgICAgIGtleXM6IGN1c3RvbUNoYW5nZUtleUlkcyxcbiAgICAgIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFmdGVyRWFjaCgoKSA9PiBub2NrLmNsZWFuQWxsKCkpO1xuXG4gIGl0KCdjbGFzc2lmaWVzIGN1c3RvbSBjaGFuZ2Ugb3V0cHV0IHdoZW4gY3VzdG9tQ2hhbmdlUHVicyBpcyBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IGV4cGxhaW5Qc2J0KHBzYnQsIHJvb3RXYWxsZXRLZXlzLCBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzKTtcblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHNbMF0uYW1vdW50LCAnMzAwMCcpO1xuXG4gICAgYXNzZXJ0Lm9rKGV4cGxhbmF0aW9uLmN1c3RvbUNoYW5nZU91dHB1dHMpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jdXN0b21DaGFuZ2VPdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmN1c3RvbUNoYW5nZU91dHB1dHNbMF0uYW1vdW50LCAnMzAwMCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jdXN0b21DaGFuZ2VBbW91bnQsICczMDAwJyk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFtb3VudCwgJzMwMDAnKTtcbiAgfSk7XG5cbiAgaXQoJ2NsYXNzaWZpZXMgY3VzdG9tIGNoYW5nZSBvdXRwdXQgYXMgZXh0ZXJuYWwgd2l0aG91dCBjdXN0b21DaGFuZ2VQdWJzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gZXhwbGFpblBzYnQocHNidCwgcm9vdFdhbGxldEtleXMsIHVuZGVmaW5lZCk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzWzBdLmFtb3VudCwgJzMwMDAnKTtcblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jdXN0b21DaGFuZ2VPdXRwdXRzPy5sZW5ndGggPz8gMCwgMCk7XG5cbiAgICAvLyBjdXN0b20gY2hhbmdlICsgZXh0ZXJuYWwgYm90aCB0cmVhdGVkIGFzIGV4dGVybmFsIG91dHB1dHNcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDIpO1xuICB9KTtcblxuICBpdCgndmVyaWZpZXMgdmFsaWQgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB1c2VyUHViID0gcm9vdFdhbGxldEtleXMudHJpcGxlWzBdLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGN1c3RvbUNoYW5nZVdhbGxldEtleXMudHJpcGxlKSB7XG4gICAgICBjb25zdCBwdWIgPSBrZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gQnVmZmVyLmZyb20obWVzc2FnZS5zaWduTWVzc2FnZShwdWIsIHVzZXJQcml2YXRlS2V5KSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgYXNzZXJ0Lm9rKFxuICAgICAgICB2ZXJpZnlLZXlTaWduYXR1cmUoeyB1c2VyS2V5Y2hhaW46IHsgcHViOiB1c2VyUHViIH0sIGtleWNoYWluVG9WZXJpZnk6IHsgcHViIH0sIGtleVNpZ25hdHVyZTogc2lnbmF0dXJlIH0pXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgaW52YWxpZCBjdXN0b20gY2hhbmdlIGtleSBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHdyb25nS2V5ID0gQklQMzIuZnJvbUJhc2U1OCh0ZXN0dXRpbC5nZXRXYWxsZXRLZXlzRm9yU2VlZCgnd3JvbmcnKS50cmlwbGVbMF0udG9CYXNlNTgoKSk7XG4gICAgY29uc3QgdXNlclB1YiA9IHJvb3RXYWxsZXRLZXlzLnRyaXBsZVswXS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzLnRyaXBsZSkge1xuICAgICAgY29uc3QgcHViID0ga2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgICAgIGNvbnN0IGJhZFNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKG1lc3NhZ2Uuc2lnbk1lc3NhZ2UocHViLCB3cm9uZ0tleS5wcml2YXRlS2V5ISkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgdmVyaWZ5S2V5U2lnbmF0dXJlKHsgdXNlcktleWNoYWluOiB7IHB1YjogdXNlclB1YiB9LCBrZXljaGFpblRvVmVyaWZ5OiB7IHB1YiB9LCBrZXlTaWduYXR1cmU6IGJhZFNpZ25hdHVyZSB9KSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZmV0Y2hlcyBjdXN0b20gY2hhbmdlIHdhbGxldCBrZXlzIGFuZCB2ZXJpZmllcyBzaWduYXR1cmVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChkZWZhdWx0Qml0R28sIGNvaW4sIHtcbiAgICAgICAgaWQ6IG1haW5XYWxsZXRJZCxcbiAgICAgICAga2V5czogbWFpbktleUlkcyxcbiAgICAgICAgY29pbjogY29pbi5nZXRDaGFpbigpLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgfSxcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBub2NrcyA9IFtcbiAgICAgICAgLi4ubm9ja0tleUZldGNoKG1haW5LZXlJZHMsIHJvb3RXYWxsZXRLZXlzKSxcbiAgICAgICAgbm9ja0N1c3RvbUNoYW5nZVdhbGxldCgpLFxuICAgICAgICAuLi5ub2NrS2V5RmV0Y2goY3VzdG9tQ2hhbmdlS2V5SWRzLCBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzKSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IGNvaW4ucGFyc2VUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IGV4dGVybmFsQWRkcmVzcywgYW1vdW50OiAnMzAwMCcgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogdXR4b2xpYlBzYnQudG9IZXgoKSB9LFxuICAgICAgICB3YWxsZXQ6IHdhbGxldCBhcyB1bmtub3duIGFzIGltcG9ydCgnLi4vLi4vc3JjJykuVXR4b1dhbGxldCxcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9ja3MpIGFzc2VydC5vayhuLmlzRG9uZSgpKTtcblxuICAgICAgYXNzZXJ0Lm9rKHBhcnNlZC5jdXN0b21DaGFuZ2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlZC5jdXN0b21DaGFuZ2Uua2V5cy5sZW5ndGgsIDMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlZC5jdXN0b21DaGFuZ2Uua2V5c1tpXS5wdWIsIGN1c3RvbUNoYW5nZVdhbGxldEtleXMudHJpcGxlW2ldLm5ldXRlcmVkKCkudG9CYXNlNTgoKSk7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZWQuZXhwbGljaXRFeHRlcm5hbE91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZWQuZXhwbGljaXRFeHRlcm5hbE91dHB1dHNbMF0uYW1vdW50LCAnMzAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBubyBjdXN0b20gY2hhbmdlIHdoZW4gd2FsbGV0IGxhY2tzIGN1c3RvbUNoYW5nZVdhbGxldElkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChkZWZhdWx0Qml0R28sIGNvaW4sIHtcbiAgICAgICAgaWQ6IG1haW5XYWxsZXRJZCxcbiAgICAgICAga2V5czogbWFpbktleUlkcyxcbiAgICAgICAgY29pbjogY29pbi5nZXRDaGFpbigpLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5vY2tzID0gbm9ja0tleUZldGNoKG1haW5LZXlJZHMsIHJvb3RXYWxsZXRLZXlzKTtcblxuICAgICAgY29uc3QgcGFyc2VkID0gYXdhaXQgY29pbi5wYXJzZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogZXh0ZXJuYWxBZGRyZXNzLCBhbW91bnQ6ICczMDAwJyB9XSB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1dHhvbGliUHNidC50b0hleCgpIH0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0IGFzIHVua25vd24gYXMgaW1wb3J0KCcuLi8uLi9zcmMnKS5VdHhvV2FsbGV0LFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3QgbiBvZiBub2NrcykgYXNzZXJ0Lm9rKG4uaXNEb25lKCkpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLmN1c3RvbUNoYW5nZSwgdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZWQubmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24sIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGludmFsaWQgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdyb25nS2V5ID0gQklQMzIuZnJvbUJhc2U1OCh0ZXN0dXRpbC5nZXRXYWxsZXRLZXlzRm9yU2VlZCgnd3JvbmcnKS50cmlwbGVbMF0udG9CYXNlNTgoKSk7XG4gICAgICBjb25zdCBiYWRTaWduYXR1cmVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAoWyd1c2VyJywgJ2JhY2t1cCcsICdiaXRnbyddIGFzIGNvbnN0KS5tYXAoKG5hbWUsIGkpID0+IFtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgbWVzc2FnZS5zaWduTWVzc2FnZShjdXN0b21DaGFuZ2VXYWxsZXRLZXlzLnRyaXBsZVtpXS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksIHdyb25nS2V5LnByaXZhdGVLZXkhKVxuICAgICAgICAgICkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBdKVxuICAgICAgKSBhcyBSZWNvcmQ8J3VzZXInIHwgJ2JhY2t1cCcgfCAnYml0Z28nLCBzdHJpbmc+O1xuXG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGRlZmF1bHRCaXRHbywgY29pbiwge1xuICAgICAgICBpZDogbWFpbldhbGxldElkLFxuICAgICAgICBrZXlzOiBtYWluS2V5SWRzLFxuICAgICAgICBjb2luOiBjb2luLmdldENoYWluKCksXG4gICAgICAgIGNvaW5TcGVjaWZpYzogeyBjdXN0b21DaGFuZ2VXYWxsZXRJZCB9LFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzOiBiYWRTaWduYXR1cmVzLFxuICAgICAgfSk7XG5cbiAgICAgIG5vY2tLZXlGZXRjaChtYWluS2V5SWRzLCByb290V2FsbGV0S2V5cyk7XG4gICAgICBub2NrQ3VzdG9tQ2hhbmdlV2FsbGV0KCk7XG4gICAgICBub2NrS2V5RmV0Y2goY3VzdG9tQ2hhbmdlS2V5SWRzLCBjdXN0b21DaGFuZ2VXYWxsZXRLZXlzKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgY29pbi5wYXJzZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IGV4dGVybmFsQWRkcmVzcywgYW1vdW50OiAnMzAwMCcgfV0gfSxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IHV0eG9saWJQc2J0LnRvSGV4KCkgfSxcbiAgICAgICAgICAgIHdhbGxldDogd2FsbGV0IGFzIHVua25vd24gYXMgaW1wb3J0KCcuLi8uLi9zcmMnKS5VdHhvV2FsbGV0LFxuICAgICAgICAgIH0pLFxuICAgICAgICAvZmFpbGVkIHRvIHZlcmlmeSBjdXN0b20gY2hhbmdlIC4qIGtleSBzaWduYXR1cmUvXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const assert_1 = __importDefault(require("assert"));
|
|
7
3
|
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
8
4
|
const nock = require("nock");
|
|
9
|
-
const fixtures_1 = require("./fixtures/bip322/fixtures");
|
|
10
5
|
const psbtHexProof_1 = require("./fixtures/psbtHexProof");
|
|
11
6
|
const util_1 = require("./util");
|
|
12
7
|
nock.disableNetConnect();
|
|
@@ -38,60 +33,5 @@ describe('Explain Transaction', function () {
|
|
|
38
33
|
await coin.explainTransaction(psbtHexProof_1.psbtTxHex, wallet);
|
|
39
34
|
});
|
|
40
35
|
});
|
|
41
|
-
describe('BIP322 Proof', function () {
|
|
42
|
-
const coin = (0, util_1.getUtxoCoin)('btc');
|
|
43
|
-
const pubs = fixtures_1.bip322Fixtures.valid.rootWalletKeys.triple.map((b) => b.neutered().toBase58());
|
|
44
|
-
it('should successfully run with a user nonce', async function () {
|
|
45
|
-
const psbtHex = fixtures_1.bip322Fixtures.valid.userNonce;
|
|
46
|
-
const result = await coin.explainTransaction({ txHex: psbtHex, pubs });
|
|
47
|
-
assert_1.default.strictEqual(result.outputAmount, '0');
|
|
48
|
-
assert_1.default.strictEqual(result.changeAmount, '0');
|
|
49
|
-
assert_1.default.strictEqual(result.outputs.length, 1);
|
|
50
|
-
assert_1.default.strictEqual(result.outputs[0].address, 'scriptPubKey:6a');
|
|
51
|
-
assert_1.default.strictEqual(result.fee, '0');
|
|
52
|
-
assert_1.default.ok('signatures' in result);
|
|
53
|
-
assert_1.default.strictEqual(result.signatures, 0);
|
|
54
|
-
assert_1.default.ok(result.messages);
|
|
55
|
-
result.messages?.forEach((obj) => {
|
|
56
|
-
assert_1.default.ok(obj.address);
|
|
57
|
-
assert_1.default.ok(obj.message);
|
|
58
|
-
assert_1.default.strictEqual(obj.message, fixtures_1.bip322Fixtures.valid.message);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
it('should successfully run with a user signature', async function () {
|
|
62
|
-
const psbtHex = fixtures_1.bip322Fixtures.valid.userSignature;
|
|
63
|
-
const result = await coin.explainTransaction({ txHex: psbtHex, pubs });
|
|
64
|
-
assert_1.default.strictEqual(result.outputAmount, '0');
|
|
65
|
-
assert_1.default.strictEqual(result.changeAmount, '0');
|
|
66
|
-
assert_1.default.strictEqual(result.outputs.length, 1);
|
|
67
|
-
assert_1.default.strictEqual(result.outputs[0].address, 'scriptPubKey:6a');
|
|
68
|
-
assert_1.default.strictEqual(result.fee, '0');
|
|
69
|
-
assert_1.default.ok('signatures' in result);
|
|
70
|
-
assert_1.default.strictEqual(result.signatures, 1);
|
|
71
|
-
assert_1.default.ok(result.messages);
|
|
72
|
-
result.messages?.forEach((obj) => {
|
|
73
|
-
assert_1.default.ok(obj.address);
|
|
74
|
-
assert_1.default.ok(obj.message);
|
|
75
|
-
assert_1.default.strictEqual(obj.message, fixtures_1.bip322Fixtures.valid.message);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
it('should successfully run with a hsm signature', async function () {
|
|
79
|
-
const psbtHex = fixtures_1.bip322Fixtures.valid.hsmSignature;
|
|
80
|
-
const result = await coin.explainTransaction({ txHex: psbtHex, pubs });
|
|
81
|
-
assert_1.default.strictEqual(result.outputAmount, '0');
|
|
82
|
-
assert_1.default.strictEqual(result.changeAmount, '0');
|
|
83
|
-
assert_1.default.strictEqual(result.outputs.length, 1);
|
|
84
|
-
assert_1.default.strictEqual(result.outputs[0].address, 'scriptPubKey:6a');
|
|
85
|
-
assert_1.default.strictEqual(result.fee, '0');
|
|
86
|
-
assert_1.default.ok('signatures' in result);
|
|
87
|
-
assert_1.default.strictEqual(result.signatures, 2);
|
|
88
|
-
assert_1.default.ok(result.messages);
|
|
89
|
-
result.messages?.forEach((obj) => {
|
|
90
|
-
assert_1.default.ok(obj.address);
|
|
91
|
-
assert_1.default.ok(obj.message);
|
|
92
|
-
assert_1.default.strictEqual(obj.message, fixtures_1.bip322Fixtures.valid.message);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
36
|
});
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2V4cGxhaW5UcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUU1Qiw4Q0FBeUQ7QUFDekQsNkJBQThCO0FBRTlCLHlEQUE0RDtBQUM1RCwwREFBb0Q7QUFDcEQsaUNBQW1EO0FBRW5ELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBRXpCLE1BQU0sS0FBSyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLG1CQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFFN0QsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLFNBQVMsQ0FBQztRQUNSLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxzREFBc0QsRUFBRTtRQUMvRCxNQUFNLElBQUksR0FBRyxJQUFBLGtCQUFXLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEMsTUFBTSxJQUFJLEdBQW1CO1lBQzNCLGlIQUFpSDtZQUNqSCxpSEFBaUg7WUFDakgsaUhBQWlIO1NBQ2xILENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFdkQsU0FBUyxZQUFZO1lBQ25CLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkYsQ0FBQyxDQUFDLENBQUM7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LENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0MsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0MsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNqRSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLGdCQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsQ0FBQztZQUNsQyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMvQixnQkFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZCLGdCQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkIsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSx5QkFBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgY29tbW9uLCBUcmlwbGUsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcblxuaW1wb3J0IHsgYmlwMzIyRml4dHVyZXMgfSBmcm9tICcuL2ZpeHR1cmVzL2JpcDMyMi9maXh0dXJlcyc7XG5pbXBvcnQgeyBwc2J0VHhIZXggfSBmcm9tICcuL2ZpeHR1cmVzL3BzYnRIZXhQcm9vZic7XG5pbXBvcnQgeyBkZWZhdWx0Qml0R28sIGdldFV0eG9Db2luIH0gZnJvbSAnLi91dGlsJztcblxubm9jay5kaXNhYmxlTmV0Q29ubmVjdCgpO1xuXG5jb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZGVmYXVsdEJpdEdvLmdldEVudigpXS51cmk7XG5cbmRlc2NyaWJlKCdFeHBsYWluIFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ZlcmlmeSBwYXlnbyBvdXRwdXQgd2hlbiBleHBsYWluaW5nIHBzYnQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29pbiA9IGdldFV0eG9Db2luKCd0YnRjNCcpO1xuXG4gICAgY29uc3QgcHViczogVHJpcGxlPHN0cmluZz4gPSBbXG4gICAgICAneHB1YjY2MU15TXdBcVJiY0ZhS3ZOQkZkVjZIWTdpYlh4RlNiTDdyRGpZMWNWTThzM3BHUFROS2ZqVHU4U21hdE5aN0FjWlFlaFNxY0VuQzd2ZXpNb3ByUXZocVFVc3pMaHVZNEc4cnV2NlBHRXI3JyxcbiAgICAgICd4cHViNjYxTXlNd0FxUmJjR2tBVlZRVkhyRVlRQTRoZmJEVzlScG4zNWI2c1hBOVRTQmQ1UXpqd3o3RjZXZWplNTdrQlZlVmZpbWZKalh1dHdVREJTTXo1eVJ3c1dpazlnTnl4cmR2U2FKYmpnaTYnLFxuICAgICAgJ3hwdWI2NjFNeU13QXFSYmNHQ0NMM0dZTmJ2S3MxdDVrNXllS1pjVjVzbXRvOVQ1WjE3emtjZ1JGNFg5dXpEZlB4TUhIZWR3RjRKY0o2a3BnOE0yTldIRUZDNUxNU3YxdDNuTU1tMUdDOVBjVm1xNScsXG4gICAgXTtcblxuICAgIGNvbnN0IGtleUlkcyA9IFsna2V5LXVzZXInLCAna2V5LWJhY2t1cCcsICdrZXktYml0Z28nXTtcblxuICAgIGZ1bmN0aW9uIG5vY2tLZXlGZXRjaCgpOiB2b2lkIHtcbiAgICAgIGtleUlkcy5mb3JFYWNoKChpZCwgaSkgPT4ge1xuICAgICAgICBub2NrKGJnVXJsKS5nZXQoYC9hcGkvdjIvJHtjb2luLmdldENoYWluKCl9L2tleS8ke2lkfWApLnJlcGx5KDIwMCwgeyBwdWI6IHB1YnNbaV0gfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgnc2hvdWxkIGRldGVjdCBhbmQgdmVyaWZ5IHBheWdvIGFkZHJlc3MgcHJvb2YgaW4gUFNCVCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2tLZXlGZXRjaCgpO1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChkZWZhdWx0Qml0R28sIGNvaW4sIHtcbiAgICAgICAgaWQ6ICdtb2NrLXdhbGxldC1pZCcsXG4gICAgICAgIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgICAga2V5czoga2V5SWRzLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbihwc2J0VHhIZXgsIHdhbGxldCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCSVAzMjIgUHJvb2YnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29pbiA9IGdldFV0eG9Db2luKCdidGMnKTtcbiAgICBjb25zdCBwdWJzID0gYmlwMzIyRml4dHVyZXMudmFsaWQucm9vdFdhbGxldEtleXMudHJpcGxlLm1hcCgoYikgPT4gYi5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIGFzIFRyaXBsZTxzdHJpbmc+O1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcnVuIHdpdGggYSB1c2VyIG5vbmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHNidEhleCA9IGJpcDMyMkZpeHR1cmVzLnZhbGlkLnVzZXJOb25jZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHBzYnRIZXgsIHB1YnMgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0Lm91dHB1dEFtb3VudCwgJzAnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQuY2hhbmdlQW1vdW50LCAnMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0Lm91dHB1dHNbMF0uYWRkcmVzcywgJ3NjcmlwdFB1YktleTo2YScpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5mZWUsICcwJyk7XG4gICAgICBhc3NlcnQub2soJ3NpZ25hdHVyZXMnIGluIHJlc3VsdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LnNpZ25hdHVyZXMsIDApO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5tZXNzYWdlcyk7XG4gICAgICByZXN1bHQubWVzc2FnZXM/LmZvckVhY2goKG9iaikgPT4ge1xuICAgICAgICBhc3NlcnQub2sob2JqLmFkZHJlc3MpO1xuICAgICAgICBhc3NlcnQub2sob2JqLm1lc3NhZ2UpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob2JqLm1lc3NhZ2UsIGJpcDMyMkZpeHR1cmVzLnZhbGlkLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBydW4gd2l0aCBhIHVzZXIgc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHNidEhleCA9IGJpcDMyMkZpeHR1cmVzLnZhbGlkLnVzZXJTaWduYXR1cmU7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiBwc2J0SGV4LCBwdWJzIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5vdXRwdXRBbW91bnQsICcwJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LmNoYW5nZUFtb3VudCwgJzAnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5vdXRwdXRzWzBdLmFkZHJlc3MsICdzY3JpcHRQdWJLZXk6NmEnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQuZmVlLCAnMCcpO1xuICAgICAgYXNzZXJ0Lm9rKCdzaWduYXR1cmVzJyBpbiByZXN1bHQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5zaWduYXR1cmVzLCAxKTtcbiAgICAgIGFzc2VydC5vayhyZXN1bHQubWVzc2FnZXMpO1xuICAgICAgcmVzdWx0Lm1lc3NhZ2VzPy5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgICAgYXNzZXJ0Lm9rKG9iai5hZGRyZXNzKTtcbiAgICAgICAgYXNzZXJ0Lm9rKG9iai5tZXNzYWdlKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9iai5tZXNzYWdlLCBiaXAzMjJGaXh0dXJlcy52YWxpZC5tZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcnVuIHdpdGggYSBoc20gc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHNidEhleCA9IGJpcDMyMkZpeHR1cmVzLnZhbGlkLmhzbVNpZ25hdHVyZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHBzYnRIZXgsIHB1YnMgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0Lm91dHB1dEFtb3VudCwgJzAnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQuY2hhbmdlQW1vdW50LCAnMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0Lm91dHB1dHNbMF0uYWRkcmVzcywgJ3NjcmlwdFB1YktleTo2YScpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5mZWUsICcwJyk7XG4gICAgICBhc3NlcnQub2soJ3NpZ25hdHVyZXMnIGluIHJlc3VsdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LnNpZ25hdHVyZXMsIDIpO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5tZXNzYWdlcyk7XG4gICAgICByZXN1bHQubWVzc2FnZXM/LmZvckVhY2goKG9iaikgPT4ge1xuICAgICAgICBhc3NlcnQub2sob2JqLmFkZHJlc3MpO1xuICAgICAgICBhc3NlcnQub2sob2JqLm1lc3NhZ2UpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob2JqLm1lc3NhZ2UsIGJpcDMyMkZpeHR1cmVzLnZhbGlkLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2V4cGxhaW5UcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDhDQUF5RDtBQUN6RCw2QkFBOEI7QUFFOUIsMERBQW9EO0FBQ3BELGlDQUFtRDtBQUVuRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUV6QixNQUFNLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO0FBRTdELFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtJQUM5QixTQUFTLENBQUM7UUFDUixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0RBQXNELEVBQUU7UUFDL0QsTUFBTSxJQUFJLEdBQUcsSUFBQSxrQkFBVyxFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxDLE1BQU0sSUFBSSxHQUFtQjtZQUMzQixpSEFBaUg7WUFDakgsaUhBQWlIO1lBQ2pILGlIQUFpSDtTQUNsSCxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXZELFNBQVMsWUFBWTtZQUNuQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLO1lBQzlELFlBQVksRUFBRSxDQUFDO1lBQ2YsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBTSxDQUFDLG1CQUFZLEVBQUUsSUFBSSxFQUFFO2dCQUM1QyxFQUFFLEVBQUUsZ0JBQWdCO2dCQUNwQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDckIsSUFBSSxFQUFFLE1BQU07YUFDYixDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbW1vbiwgVHJpcGxlLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5cbmltcG9ydCB7IHBzYnRUeEhleCB9IGZyb20gJy4vZml4dHVyZXMvcHNidEhleFByb29mJztcbmltcG9ydCB7IGRlZmF1bHRCaXRHbywgZ2V0VXR4b0NvaW4gfSBmcm9tICcuL3V0aWwnO1xuXG5ub2NrLmRpc2FibGVOZXRDb25uZWN0KCk7XG5cbmNvbnN0IGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tkZWZhdWx0Qml0R28uZ2V0RW52KCldLnVyaTtcblxuZGVzY3JpYmUoJ0V4cGxhaW4gVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IHBheWdvIG91dHB1dCB3aGVuIGV4cGxhaW5pbmcgcHNidCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2luID0gZ2V0VXR4b0NvaW4oJ3RidGM0Jyk7XG5cbiAgICBjb25zdCBwdWJzOiBUcmlwbGU8c3RyaW5nPiA9IFtcbiAgICAgICd4cHViNjYxTXlNd0FxUmJjRmFLdk5CRmRWNkhZN2liWHhGU2JMN3JEalkxY1ZNOHMzcEdQVE5LZmpUdThTbWF0Tlo3QWNaUWVoU3FjRW5DN3Zlek1vcHJRdmhxUVVzekxodVk0RzhydXY2UEdFcjcnLFxuICAgICAgJ3hwdWI2NjFNeU13QXFSYmNHa0FWVlFWSHJFWVFBNGhmYkRXOVJwbjM1YjZzWEE5VFNCZDVRemp3ejdGNldlamU1N2tCVmVWZmltZkpqWHV0d1VEQlNNejV5UndzV2lrOWdOeXhyZHZTYUpiamdpNicsXG4gICAgICAneHB1YjY2MU15TXdBcVJiY0dDQ0wzR1lOYnZLczF0NWs1eWVLWmNWNXNtdG85VDVaMTd6a2NnUkY0WDl1ekRmUHhNSEhlZHdGNEpjSjZrcGc4TTJOV0hFRkM1TE1TdjF0M25NTW0xR0M5UGNWbXE1JyxcbiAgICBdO1xuXG4gICAgY29uc3Qga2V5SWRzID0gWydrZXktdXNlcicsICdrZXktYmFja3VwJywgJ2tleS1iaXRnbyddO1xuXG4gICAgZnVuY3Rpb24gbm9ja0tleUZldGNoKCk6IHZvaWQge1xuICAgICAga2V5SWRzLmZvckVhY2goKGlkLCBpKSA9PiB7XG4gICAgICAgIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke2NvaW4uZ2V0Q2hhaW4oKX0va2V5LyR7aWR9YCkucmVwbHkoMjAwLCB7IHB1YjogcHVic1tpXSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdzaG91bGQgZGV0ZWN0IGFuZCB2ZXJpZnkgcGF5Z28gYWRkcmVzcyBwcm9vZiBpbiBQU0JUJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9ja0tleUZldGNoKCk7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGRlZmF1bHRCaXRHbywgY29pbiwge1xuICAgICAgICBpZDogJ21vY2std2FsbGV0LWlkJyxcbiAgICAgICAgY29pbjogY29pbi5nZXRDaGFpbigpLFxuICAgICAgICBrZXlzOiBrZXlJZHMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHBzYnRUeEhleCwgd2FsbGV0KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|