@bitgo-beta/sdk-coin-algo 2.8.9-beta.62 → 2.8.9-beta.621
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/src/algo.d.ts +21 -2
- package/dist/src/algo.d.ts.map +1 -1
- package/dist/src/algo.js +96 -23
- package/dist/src/lib/transaction.d.ts +11 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +28 -1
- package/dist/test/unit/algo.js +174 -29
- package/dist/test/unit/algoSafeRecovery.d.ts +2 -0
- package/dist/test/unit/algoSafeRecovery.d.ts.map +1 -0
- package/dist/test/unit/algoSafeRecovery.js +198 -0
- package/dist/test/unit/lib/transaction.js +31 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -8
- package/LICENSE +0 -191
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algoSafeRecovery.d.ts","sourceRoot":"","sources":["../../../test/unit/algoSafeRecovery.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const src_1 = require("../../src");
|
|
9
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
10
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
11
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
12
|
+
const algo_1 = require("../../src/algo");
|
|
13
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
14
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
15
|
+
const algosdk_1 = __importDefault(require("algosdk"));
|
|
16
|
+
/**
|
|
17
|
+
* End-to-end Safe ALGO recovery: keycard decrypt → derive slot-2 children → map to recover()
|
|
18
|
+
* params → `Algo.recover()` builds and signs a 2-of-3 multisig sweep whose rootAddress equals
|
|
19
|
+
* `multisigAddress(1, 2, [user, backup, bitgo])`.
|
|
20
|
+
*
|
|
21
|
+
* This proves the whole WCN-2898 chain with real keys (no mocked derivation or encryption):
|
|
22
|
+
* the lazy backup signer signs the actual transaction bytes with the derived kL/kR, so the final
|
|
23
|
+
* transaction verifies under algosdk.verifyMultisig.
|
|
24
|
+
*/
|
|
25
|
+
describe('Safe ALGO recovery end-to-end', function () {
|
|
26
|
+
let bitgo;
|
|
27
|
+
let basecoin;
|
|
28
|
+
const sandbox = sinon_1.default.createSandbox();
|
|
29
|
+
afterEach(function () {
|
|
30
|
+
sandbox.restore();
|
|
31
|
+
});
|
|
32
|
+
before(function () {
|
|
33
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
|
|
34
|
+
bitgo.safeRegister('talgo', src_1.Talgo.createInstance);
|
|
35
|
+
bitgo.initializeTestVars();
|
|
36
|
+
basecoin = bitgo.coin('talgo');
|
|
37
|
+
});
|
|
38
|
+
// The ed25519Multisig root fixture the sdk-core unit tests pin (with a distinct BitGo root, so the
|
|
39
|
+
// backup child and the BitGo child are different keys and a slot swap changes every assertion).
|
|
40
|
+
function ed25519Roots() {
|
|
41
|
+
const seed = 'SAAACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6NKI';
|
|
42
|
+
const chainCode = Buffer.alloc(32, 0xab);
|
|
43
|
+
const bitgoSeed = Buffer.alloc(32, 0x22);
|
|
44
|
+
const bitgoRootPub = Buffer.from(ed25519_1.ed25519.getPublicKey(bitgoSeed));
|
|
45
|
+
const bitgoChainCode = Buffer.alloc(32, 0xcd);
|
|
46
|
+
return {
|
|
47
|
+
secp256k1Multisig: { user: 'u', backup: 'b', bitgo: 'g' },
|
|
48
|
+
ed25519Multisig: {
|
|
49
|
+
user: seed,
|
|
50
|
+
backup: { prv: seed, chainCode: (0, sdk_core_1.encodeEd25519ChainCode)(chainCode) },
|
|
51
|
+
bitgo: (0, sdk_core_1.encodeDerivableEd25519Pub)(bitgoRootPub, bitgoChainCode),
|
|
52
|
+
},
|
|
53
|
+
ecdsaMpc: {
|
|
54
|
+
user: { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) },
|
|
55
|
+
backup: { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) },
|
|
56
|
+
bitgo: 'g',
|
|
57
|
+
},
|
|
58
|
+
eddsaMpc: {
|
|
59
|
+
user: { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) },
|
|
60
|
+
backup: { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) },
|
|
61
|
+
bitgo: 'g',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const nodeParams = {
|
|
66
|
+
token: '2810c2d168e8417c5f111d38d68327b8cfe2d0ddc02986490c22f8ddf4128bcd',
|
|
67
|
+
baseServer: 'http://localhost/',
|
|
68
|
+
port: 8443,
|
|
69
|
+
};
|
|
70
|
+
const fee = 1000;
|
|
71
|
+
const nativeBalance = 10000000; // 10 ALGO
|
|
72
|
+
const recoveryDestination = 'GB3YETD5TSTBAIYGYHVWU3O3I7XGOB44HOZA5MOEF5M23CLLZKRQLEVAOA';
|
|
73
|
+
it('recovers a Safe ALGO wallet whose rootAddress equals multisigAddress(1,2,[user,backup,bitgo])', async function () {
|
|
74
|
+
sandbox.stub(algo_1.Algo.prototype, 'getAccountBalance').resolves(nativeBalance);
|
|
75
|
+
const roots = ed25519Roots();
|
|
76
|
+
const derived = await (0, sdk_core_1.deriveSafeWalletKeys)({ coin: 'algo', slot: 'ed25519Multisig', account: 0, roots });
|
|
77
|
+
if (derived.slot !== 'ed25519Multisig') {
|
|
78
|
+
throw new Error('expected ed25519Multisig slot');
|
|
79
|
+
}
|
|
80
|
+
const keyParams = await (0, sdk_core_1.buildSafeRecoverKeyParams)({
|
|
81
|
+
bitgo,
|
|
82
|
+
coin: 'algo',
|
|
83
|
+
slot: 'ed25519Multisig',
|
|
84
|
+
keys: derived.keys,
|
|
85
|
+
mode: 'signed',
|
|
86
|
+
});
|
|
87
|
+
if (keyParams.slot !== 'ed25519Multisig' || keyParams.mode !== 'signed') {
|
|
88
|
+
throw new Error('expected signed ed25519Multisig key params');
|
|
89
|
+
}
|
|
90
|
+
// Distinct fixture roots: a slot swap between backup and bitgo must change the signer and root.
|
|
91
|
+
derived.keys.user.pub.should.not.equal(derived.keys.backup.pub);
|
|
92
|
+
derived.keys.backup.pub.should.not.equal(derived.keys.bitgo.pub);
|
|
93
|
+
// The mapper's rootAddress is the wallet's on-chain address, derived from the same children.
|
|
94
|
+
const expectedRoot = algosdk_1.default.multisigAddress({
|
|
95
|
+
version: 1,
|
|
96
|
+
threshold: 2,
|
|
97
|
+
addrs: [
|
|
98
|
+
algosdk_1.default.encodeAddress(Buffer.from(derived.keys.user.pub, 'hex')),
|
|
99
|
+
algosdk_1.default.encodeAddress(Buffer.from(derived.keys.backup.pub, 'hex')),
|
|
100
|
+
algosdk_1.default.encodeAddress(Buffer.from(derived.keys.bitgo.pub, 'hex')),
|
|
101
|
+
],
|
|
102
|
+
});
|
|
103
|
+
(0, assert_1.default)(keyParams.rootAddress);
|
|
104
|
+
assert_1.default.strictEqual(keyParams.rootAddress, expectedRoot);
|
|
105
|
+
const recovery = await basecoin.recover({
|
|
106
|
+
userKey: keyParams.userKey,
|
|
107
|
+
rootAddress: keyParams.rootAddress,
|
|
108
|
+
bitgoKey: keyParams.bitgoKey,
|
|
109
|
+
walletPassphrase: keyParams.walletPassphrase,
|
|
110
|
+
fee,
|
|
111
|
+
recoveryDestination,
|
|
112
|
+
firstRound: 5002596,
|
|
113
|
+
nodeParams,
|
|
114
|
+
externalBackupSigner: keyParams.externalBackupSigner,
|
|
115
|
+
});
|
|
116
|
+
(0, assert_1.default)('tx' in recovery);
|
|
117
|
+
recovery.should.have.property('tx');
|
|
118
|
+
assert_1.default.strictEqual(recovery.userKey, algosdk_1.default.encodeAddress(Buffer.from(derived.keys.user.pub, 'hex')));
|
|
119
|
+
assert_1.default.strictEqual(recovery.backupKey, algosdk_1.default.encodeAddress(Buffer.from(derived.keys.backup.pub, 'hex')));
|
|
120
|
+
assert_1.default.strictEqual(recovery.bitgoKey, algosdk_1.default.encodeAddress(Buffer.from(derived.keys.bitgo.pub, 'hex')));
|
|
121
|
+
assert_1.default.strictEqual(recovery.rootAddress, expectedRoot);
|
|
122
|
+
assert_1.default.notStrictEqual(recovery.userKey, keyParams.userKey);
|
|
123
|
+
recovery.should.not.have.property('walletPassphrase');
|
|
124
|
+
recovery.should.not.have.property('externalBackupSigner');
|
|
125
|
+
const decoded = algosdk_1.default.decodeSignedTransaction(Buffer.from(recovery.tx, 'base64'));
|
|
126
|
+
(0, should_1.default)(decoded.msig).not.be.undefined();
|
|
127
|
+
const msigPk = algosdk_1.default.decodeAddress(expectedRoot).publicKey;
|
|
128
|
+
algosdk_1.default.verifyMultisig(decoded.txn.bytesToSign(), decoded.msig, msigPk).should.equal(true);
|
|
129
|
+
});
|
|
130
|
+
it('returns the derived public keys for an unsigned Safe recovery without encrypting or decrypting', async function () {
|
|
131
|
+
sandbox.stub(algo_1.Algo.prototype, 'getAccountBalance').resolves(nativeBalance);
|
|
132
|
+
const encryptSpy = sandbox.spy(bitgo, 'encrypt');
|
|
133
|
+
const decryptSpy = sandbox.spy(bitgo, 'decrypt');
|
|
134
|
+
const derived = await (0, sdk_core_1.deriveSafeWalletKeys)({
|
|
135
|
+
coin: 'talgo',
|
|
136
|
+
slot: 'ed25519Multisig',
|
|
137
|
+
account: 0,
|
|
138
|
+
roots: ed25519Roots(),
|
|
139
|
+
});
|
|
140
|
+
(0, assert_1.default)(derived.slot === 'ed25519Multisig');
|
|
141
|
+
const keyParams = await (0, sdk_core_1.buildSafeRecoverKeyParams)({
|
|
142
|
+
bitgo,
|
|
143
|
+
coin: 'talgo',
|
|
144
|
+
slot: 'ed25519Multisig',
|
|
145
|
+
keys: derived.keys,
|
|
146
|
+
mode: 'unsigned',
|
|
147
|
+
});
|
|
148
|
+
(0, assert_1.default)(keyParams.mode === 'unsigned');
|
|
149
|
+
(0, assert_1.default)(keyParams.rootAddress);
|
|
150
|
+
const recovery = await basecoin.recover({
|
|
151
|
+
...keyParams,
|
|
152
|
+
rootAddress: keyParams.rootAddress,
|
|
153
|
+
fee,
|
|
154
|
+
recoveryDestination,
|
|
155
|
+
firstRound: 5002596,
|
|
156
|
+
nodeParams,
|
|
157
|
+
});
|
|
158
|
+
(0, assert_1.default)('txHex' in recovery);
|
|
159
|
+
const expectedKeys = [derived.keys.user.pub, derived.keys.backup.pub, derived.keys.bitgo.pub].map((pub) => algosdk_1.default.encodeAddress(Buffer.from(pub, 'hex')));
|
|
160
|
+
assert_1.default.deepStrictEqual([recovery.userKey, recovery.backupKey, recovery.bitgoKey], expectedKeys);
|
|
161
|
+
assert_1.default.deepStrictEqual(recovery.keys, expectedKeys);
|
|
162
|
+
assert_1.default.strictEqual(recovery.address, keyParams.rootAddress);
|
|
163
|
+
sinon_1.default.assert.notCalled(encryptSpy);
|
|
164
|
+
sinon_1.default.assert.notCalled(decryptSpy);
|
|
165
|
+
});
|
|
166
|
+
it('fails closed with RecoveryKeyMismatchError when the user key does not belong to the root', async function () {
|
|
167
|
+
const getBalanceStub = sandbox.stub(algo_1.Algo.prototype, 'getAccountBalance').resolves(nativeBalance);
|
|
168
|
+
const roots = ed25519Roots();
|
|
169
|
+
const derived = await (0, sdk_core_1.deriveSafeWalletKeys)({ coin: 'algo', slot: 'ed25519Multisig', account: 0, roots });
|
|
170
|
+
if (derived.slot !== 'ed25519Multisig') {
|
|
171
|
+
throw new Error('expected ed25519Multisig slot');
|
|
172
|
+
}
|
|
173
|
+
const keyParams = await (0, sdk_core_1.buildSafeRecoverKeyParams)({
|
|
174
|
+
bitgo,
|
|
175
|
+
coin: 'algo',
|
|
176
|
+
slot: 'ed25519Multisig',
|
|
177
|
+
keys: derived.keys,
|
|
178
|
+
mode: 'signed',
|
|
179
|
+
});
|
|
180
|
+
if (keyParams.slot !== 'ed25519Multisig' || keyParams.mode !== 'signed') {
|
|
181
|
+
throw new Error('expected signed ed25519Multisig key params');
|
|
182
|
+
}
|
|
183
|
+
// A rootAddress the derived keys do not control: the fail-closed check fires before any node call.
|
|
184
|
+
await assert_1.default.rejects(() => basecoin.recover({
|
|
185
|
+
userKey: keyParams.userKey,
|
|
186
|
+
rootAddress: algosdk_1.default.encodeAddress(Buffer.alloc(32, 0xee)),
|
|
187
|
+
bitgoKey: keyParams.bitgoKey,
|
|
188
|
+
walletPassphrase: keyParams.walletPassphrase,
|
|
189
|
+
fee,
|
|
190
|
+
recoveryDestination,
|
|
191
|
+
firstRound: 5002596,
|
|
192
|
+
nodeParams,
|
|
193
|
+
externalBackupSigner: keyParams.externalBackupSigner,
|
|
194
|
+
}), sdk_core_1.RecoveryKeyMismatchError);
|
|
195
|
+
sinon_1.default.assert.notCalled(getBalanceStub);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnb1NhZmVSZWNvdmVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9hbGdvU2FmZVJlY292ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixtQ0FBa0M7QUFDbEMsbURBQStEO0FBQy9ELGlEQUErQztBQUMvQyxrREFBMEI7QUFDMUIseUNBQXNDO0FBQ3RDLG1EQUFnRDtBQUNoRCxtREFPOEI7QUFDOUIsc0RBQThCO0FBRTlCOzs7Ozs7OztHQVFHO0FBQ0gsUUFBUSxDQUFDLCtCQUErQixFQUFFO0lBQ3hDLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWMsQ0FBQztJQUNuQixNQUFNLE9BQU8sR0FBRyxlQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFFdEMsU0FBUyxDQUFDO1FBQ1IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFTLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxtR0FBbUc7SUFDbkcsZ0dBQWdHO0lBQ2hHLFNBQVMsWUFBWTtRQUNuQixNQUFNLElBQUksR0FBRywwREFBMEQsQ0FBQztRQUN4RSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENB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LEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELG1HQUFtRztRQUNuRyxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUNsQixHQUFHLEVBQUUsQ0FDSCxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ2YsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO1lBQzFCLFdBQVcsRUFBRSxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRCxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7WUFDNUIsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLGdCQUFnQjtZQUM1QyxHQUFHO1lBQ0gsbUJBQW1CO1lBQ25CLFVBQVUsRUFBRSxPQUFPO1lBQ25CLFVBQVU7WUFDVixvQkFBb0IsRUFBRSxTQUFTLENBQUMsb0JBQW9CO1NBQ3JELENBQUMsRUFDSixtQ0FBd0IsQ0FDekIsQ0FBQztRQUNGLGVBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBUYWxnbyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgU2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgQWxnbyB9IGZyb20gJy4uLy4uL3NyYy9hbGdvJztcbmltcG9ydCB7IGVkMjU1MTkgfSBmcm9tICdAbm9ibGUvY3VydmVzL2VkMjU1MTknO1xuaW1wb3J0IHtcbiAgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyxcbiAgZGVyaXZlU2FmZVdhbGxldEtleXMsXG4gIGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIsXG4gIGVuY29kZUVkMjU1MTlDaGFpbkNvZGUsXG4gIFJlY292ZXJ5S2V5TWlzbWF0Y2hFcnJvcixcbiAgdHlwZSBEZWNyeXB0ZWRTYWZlUm9vdHMsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCBhbGdvc2RrIGZyb20gJ2FsZ29zZGsnO1xuXG4vKipcbiAqIEVuZC10by1lbmQgU2FmZSBBTEdPIHJlY292ZXJ5OiBrZXljYXJkIGRlY3J5cHQg4oaSIGRlcml2ZSBzbG90LTIgY2hpbGRyZW4g4oaSIG1hcCB0byByZWNvdmVyKClcbiAqIHBhcmFtcyDihpIgYEFsZ28ucmVjb3ZlcigpYCBidWlsZHMgYW5kIHNpZ25zIGEgMi1vZi0zIG11bHRpc2lnIHN3ZWVwIHdob3NlIHJvb3RBZGRyZXNzIGVxdWFsc1xuICogYG11bHRpc2lnQWRkcmVzcygxLCAyLCBbdXNlciwgYmFja3VwLCBiaXRnb10pYC5cbiAqXG4gKiBUaGlzIHByb3ZlcyB0aGUgd2hvbGUgV0NOLTI4OTggY2hhaW4gd2l0aCByZWFsIGtleXMgKG5vIG1vY2tlZCBkZXJpdmF0aW9uIG9yIGVuY3J5cHRpb24pOlxuICogdGhlIGxhenkgYmFja3VwIHNpZ25lciBzaWducyB0aGUgYWN0dWFsIHRyYW5zYWN0aW9uIGJ5dGVzIHdpdGggdGhlIGRlcml2ZWQga0wva1IsIHNvIHRoZSBmaW5hbFxuICogdHJhbnNhY3Rpb24gdmVyaWZpZXMgdW5kZXIgYWxnb3Nkay52ZXJpZnlNdWx0aXNpZy5cbiAqL1xuZGVzY3JpYmUoJ1NhZmUgQUxHTyByZWNvdmVyeSBlbmQtdG8tZW5kJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luOiBBbGdvO1xuICBjb25zdCBzYW5kYm94ID0gU2lub24uY3JlYXRlU2FuZGJveCgpO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0YWxnbycsIFRhbGdvLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RhbGdvJykgYXMgQWxnbztcbiAgfSk7XG5cbiAgLy8gVGhlIGVkMjU1MTlNdWx0aXNpZyByb290IGZpeHR1cmUgdGhlIHNkay1jb3JlIHVuaXQgdGVzdHMgcGluICh3aXRoIGEgZGlzdGluY3QgQml0R28gcm9vdCwgc28gdGhlXG4gIC8vIGJhY2t1cCBjaGlsZCBhbmQgdGhlIEJpdEdvIGNoaWxkIGFyZSBkaWZmZXJlbnQga2V5cyBhbmQgYSBzbG90IHN3YXAgY2hhbmdlcyBldmVyeSBhc3NlcnRpb24pLlxuICBmdW5jdGlvbiBlZDI1NTE5Um9vdHMoKTogRGVjcnlwdGVkU2FmZVJvb3RzIHtcbiAgICBjb25zdCBzZWVkID0gJ1NBQUFDQVFEQVFDUU1CWUlCRUZBV0RBTkJZSFJBRUlTQ01LQktGUVhEQU1SVUdZNERVUEI2TktJJztcbiAgICBjb25zdCBjaGFpbkNvZGUgPSBCdWZmZXIuYWxsb2MoMzIsIDB4YWIpO1xuICAgIGNvbnN0IGJpdGdvU2VlZCA9IEJ1ZmZlci5hbGxvYygzMiwgMHgyMik7XG4gICAgY29uc3QgYml0Z29Sb290UHViID0gQnVmZmVyLmZyb20oZWQyNTUxOS5nZXRQdWJsaWNLZXkoYml0Z29TZWVkKSk7XG4gICAgY29uc3QgYml0Z29DaGFpbkNvZGUgPSBCdWZmZXIuYWxsb2MoMzIsIDB4Y2QpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogeyB1c2VyOiAndScsIGJhY2t1cDogJ2InLCBiaXRnbzogJ2cnIH0sXG4gICAgICBlZDI1NTE5TXVsdGlzaWc6IHtcbiAgICAgICAgdXNlcjogc2VlZCxcbiAgICAgICAgYmFja3VwOiB7IHBydjogc2VlZCwgY2hhaW5Db2RlOiBlbmNvZGVFZDI1NTE5Q2hhaW5Db2RlKGNoYWluQ29kZSkgfSxcbiAgICAgICAgYml0Z286IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIoYml0Z29Sb290UHViLCBiaXRnb0NoYWluQ29kZSksXG4gICAgICB9LFxuICAgICAgZWNkc2FNcGM6IHtcbiAgICAgICAgdXNlcjogeyBzaWduaW5nOiBCdWZmZXIuYWxsb2MoMCksIHZyZjogQnVmZmVyLmFsbG9jKDApIH0sXG4gICAgICAgIGJhY2t1cDogeyBzaWduaW5nOiBCdWZmZXIuYWxsb2MoMCksIHZyZjogQnVmZmVyLmFsbG9jKDApIH0sXG4gICAgICAgIGJpdGdvOiAnZycsXG4gICAgICB9LFxuICAgICAgZWRkc2FNcGM6IHtcbiAgICAgICAgdXNlcjogeyBzaWduaW5nOiBCdWZmZXIuYWxsb2MoMCksIHZyZjogQnVmZmVyLmFsbG9jKDApIH0sXG4gICAgICAgIGJhY2t1cDogeyBzaWduaW5nOiBCdWZmZXIuYWxsb2MoMCksIHZyZjogQnVmZmVyLmFsbG9jKDApIH0sXG4gICAgICAgIGJpdGdvOiAnZycsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjb25zdCBub2RlUGFyYW1zID0ge1xuICAgIHRva2VuOiAnMjgxMGMyZDE2OGU4NDE3YzVmMTExZDM4ZDY4MzI3YjhjZmUyZDBkZGMwMjk4NjQ5MGMyMmY4ZGRmNDEyOGJjZCcsXG4gICAgYmFzZVNlcnZlcjogJ2h0dHA6Ly9sb2NhbGhvc3QvJyxcbiAgICBwb3J0OiA4NDQzLFxuICB9O1xuICBjb25zdCBmZWUgPSAxMDAwO1xuICBjb25zdCBuYXRpdmVCYWxhbmNlID0gMTBfMDAwXzAwMDsgLy8gMTAgQUxHT1xuICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJ0dCM1lFVEQ1VFNUQkFJWUdZSFZXVTNPM0k3WEdPQjQ0SE9aQTVNT0VGNU0yM0NMTFpLUlFMRVZBT0EnO1xuXG4gIGl0KCdyZWNvdmVycyBhIFNhZmUgQUxHTyB3YWxsZXQgd2hvc2Ugcm9vdEFkZHJlc3MgZXF1YWxzIG11bHRpc2lnQWRkcmVzcygxLDIsW3VzZXIsYmFja3VwLGJpdGdvXSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5zdHViKEFsZ28ucHJvdG90eXBlLCAnZ2V0QWNjb3VudEJhbGFuY2UnKS5yZXNvbHZlcyhuYXRpdmVCYWxhbmNlKTtcblxuICAgIGNvbnN0IHJvb3RzID0gZWQyNTUxOVJvb3RzKCk7XG4gICAgY29uc3QgZGVyaXZlZCA9IGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHsgY29pbjogJ2FsZ28nLCBzbG90OiAnZWQyNTUxOU11bHRpc2lnJywgYWNjb3VudDogMCwgcm9vdHMgfSk7XG4gICAgaWYgKGRlcml2ZWQuc2xvdCAhPT0gJ2VkMjU1MTlNdWx0aXNpZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgZWQyNTUxOU11bHRpc2lnIHNsb3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlQYXJhbXMgPSBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgIGJpdGdvLFxuICAgICAgY29pbjogJ2FsZ28nLFxuICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgICBrZXlzOiBkZXJpdmVkLmtleXMsXG4gICAgICBtb2RlOiAnc2lnbmVkJyxcbiAgICB9KTtcbiAgICBpZiAoa2V5UGFyYW1zLnNsb3QgIT09ICdlZDI1NTE5TXVsdGlzaWcnIHx8IGtleVBhcmFtcy5tb2RlICE9PSAnc2lnbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzaWduZWQgZWQyNTUxOU11bHRpc2lnIGtleSBwYXJhbXMnKTtcbiAgICB9XG5cbiAgICAvLyBEaXN0aW5jdCBmaXh0dXJlIHJvb3RzOiBhIHNsb3Qgc3dhcCBiZXR3ZWVuIGJhY2t1cCBhbmQgYml0Z28gbXVzdCBjaGFuZ2UgdGhlIHNpZ25lciBhbmQgcm9vdC5cbiAgICBkZXJpdmVkLmtleXMudXNlci5wdWIuc2hvdWxkLm5vdC5lcXVhbChkZXJpdmVkLmtleXMuYmFja3VwLnB1Yik7XG4gICAgZGVyaXZlZC5rZXlzLmJhY2t1cC5wdWIuc2hvdWxkLm5vdC5lcXVhbChkZXJpdmVkLmtleXMuYml0Z28ucHViKTtcblxuICAgIC8vIFRoZSBtYXBwZXIncyByb290QWRkcmVzcyBpcyB0aGUgd2FsbGV0J3Mgb24tY2hhaW4gYWRkcmVzcywgZGVyaXZlZCBmcm9tIHRoZSBzYW1lIGNoaWxkcmVuLlxuICAgIGNvbnN0IGV4cGVjdGVkUm9vdCA9IGFsZ29zZGsubXVsdGlzaWdBZGRyZXNzKHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICBhZGRyczogW1xuICAgICAgICBhbGdvc2RrLmVuY29kZUFkZHJlc3MoQnVmZmVyLmZyb20oZGVyaXZlZC5rZXlzLnVzZXIucHViLCAnaGV4JykpLFxuICAgICAgICBhbGdvc2RrLmVuY29kZUFkZHJlc3MoQnVmZmVyLmZyb20oZGVyaXZlZC5rZXlzLmJhY2t1cC5wdWIsICdoZXgnKSksXG4gICAgICAgIGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhCdWZmZXIuZnJvbShkZXJpdmVkLmtleXMuYml0Z28ucHViLCAnaGV4JykpLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBhc3NlcnQoa2V5UGFyYW1zLnJvb3RBZGRyZXNzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5UGFyYW1zLnJvb3RBZGRyZXNzLCBleHBlY3RlZFJvb3QpO1xuXG4gICAgY29uc3QgcmVjb3ZlcnkgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgIHVzZXJLZXk6IGtleVBhcmFtcy51c2VyS2V5LFxuICAgICAgcm9vdEFkZHJlc3M6IGtleVBhcmFtcy5yb290QWRkcmVzcyxcbiAgICAgIGJpdGdvS2V5OiBrZXlQYXJhbXMuYml0Z29LZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBrZXlQYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGZlZSxcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICBmaXJzdFJvdW5kOiA1MDAyNTk2LFxuICAgICAgbm9kZVBhcmFtcyxcbiAgICAgIGV4dGVybmFsQmFja3VwU2lnbmVyOiBrZXlQYXJhbXMuZXh0ZXJuYWxCYWNrdXBTaWduZXIsXG4gICAgfSk7XG5cbiAgICBhc3NlcnQoJ3R4JyBpbiByZWNvdmVyeSk7XG4gICAgcmVjb3Zlcnkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY292ZXJ5LnVzZXJLZXksIGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhCdWZmZXIuZnJvbShkZXJpdmVkLmtleXMudXNlci5wdWIsICdoZXgnKSkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNvdmVyeS5iYWNrdXBLZXksIGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhCdWZmZXIuZnJvbShkZXJpdmVkLmtleXMuYmFja3VwLnB1YiwgJ2hleCcpKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY292ZXJ5LmJpdGdvS2V5LCBhbGdvc2RrLmVuY29kZUFkZHJlc3MoQnVmZmVyLmZyb20oZGVyaXZlZC5rZXlzLmJpdGdvLnB1YiwgJ2hleCcpKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY292ZXJ5LnJvb3RBZGRyZXNzLCBleHBlY3RlZFJvb3QpO1xuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChyZWNvdmVyeS51c2VyS2V5LCBrZXlQYXJhbXMudXNlcktleSk7XG4gICAgcmVjb3Zlcnkuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJyk7XG4gICAgcmVjb3Zlcnkuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdleHRlcm5hbEJhY2t1cFNpZ25lcicpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBhbGdvc2RrLmRlY29kZVNpZ25lZFRyYW5zYWN0aW9uKEJ1ZmZlci5mcm9tKHJlY292ZXJ5LnR4IGFzIHN0cmluZywgJ2Jhc2U2NCcpKTtcbiAgICBzaG91bGQoZGVjb2RlZC5tc2lnKS5ub3QuYmUudW5kZWZpbmVkKCk7XG5cbiAgICBjb25zdCBtc2lnUGsgPSBhbGdvc2RrLmRlY29kZUFkZHJlc3MoZXhwZWN0ZWRSb290KS5wdWJsaWNLZXk7XG4gICAgYWxnb3Nkay52ZXJpZnlNdWx0aXNpZyhkZWNvZGVkLnR4bi5ieXRlc1RvU2lnbigpLCBkZWNvZGVkLm1zaWchLCBtc2lnUGspLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgdGhlIGRlcml2ZWQgcHVibGljIGtleXMgZm9yIGFuIHVuc2lnbmVkIFNhZmUgcmVjb3Zlcnkgd2l0aG91dCBlbmNyeXB0aW5nIG9yIGRlY3J5cHRpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5zdHViKEFsZ28ucHJvdG90eXBlLCAnZ2V0QWNjb3VudEJhbGFuY2UnKS5yZXNvbHZlcyhuYXRpdmVCYWxhbmNlKTtcbiAgICBjb25zdCBlbmNyeXB0U3B5ID0gc2FuZGJveC5zcHkoYml0Z28sICdlbmNyeXB0Jyk7XG4gICAgY29uc3QgZGVjcnlwdFNweSA9IHNhbmRib3guc3B5KGJpdGdvLCAnZGVjcnlwdCcpO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBhd2FpdCBkZXJpdmVTYWZlV2FsbGV0S2V5cyh7XG4gICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgICBhY2NvdW50OiAwLFxuICAgICAgcm9vdHM6IGVkMjU1MTlSb290cygpLFxuICAgIH0pO1xuICAgIGFzc2VydChkZXJpdmVkLnNsb3QgPT09ICdlZDI1NTE5TXVsdGlzaWcnKTtcbiAgICBjb25zdCBrZXlQYXJhbXMgPSBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgIGJpdGdvLFxuICAgICAgY29pbjogJ3RhbGdvJyxcbiAgICAgIHNsb3Q6ICdlZDI1NTE5TXVsdGlzaWcnLFxuICAgICAga2V5czogZGVyaXZlZC5rZXlzLFxuICAgICAgbW9kZTogJ3Vuc2lnbmVkJyxcbiAgICB9KTtcbiAgICBhc3NlcnQoa2V5UGFyYW1zLm1vZGUgPT09ICd1bnNpZ25lZCcpO1xuICAgIGFzc2VydChrZXlQYXJhbXMucm9vdEFkZHJlc3MpO1xuXG4gICAgY29uc3QgcmVjb3ZlcnkgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgIC4uLmtleVBhcmFtcyxcbiAgICAgIHJvb3RBZGRyZXNzOiBrZXlQYXJhbXMucm9vdEFkZHJlc3MsXG4gICAgICBmZWUsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgZmlyc3RSb3VuZDogNTAwMjU5NixcbiAgICAgIG5vZGVQYXJhbXMsXG4gICAgfSk7XG4gICAgYXNzZXJ0KCd0eEhleCcgaW4gcmVjb3ZlcnkpO1xuICAgIGNvbnN0IGV4cGVjdGVkS2V5cyA9IFtkZXJpdmVkLmtleXMudXNlci5wdWIsIGRlcml2ZWQua2V5cy5iYWNrdXAucHViLCBkZXJpdmVkLmtleXMuYml0Z28ucHViXS5tYXAoKHB1YikgPT5cbiAgICAgIGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhCdWZmZXIuZnJvbShwdWIsICdoZXgnKSlcbiAgICApO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoW3JlY292ZXJ5LnVzZXJLZXksIHJlY292ZXJ5LmJhY2t1cEtleSwgcmVjb3ZlcnkuYml0Z29LZXldLCBleHBlY3RlZEtleXMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVjb3Zlcnkua2V5cywgZXhwZWN0ZWRLZXlzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjb3ZlcnkuYWRkcmVzcywga2V5UGFyYW1zLnJvb3RBZGRyZXNzKTtcbiAgICBTaW5vbi5hc3NlcnQubm90Q2FsbGVkKGVuY3J5cHRTcHkpO1xuICAgIFNpbm9uLmFzc2VydC5ub3RDYWxsZWQoZGVjcnlwdFNweSk7XG4gIH0pO1xuXG4gIGl0KCdmYWlscyBjbG9zZWQgd2l0aCBSZWNvdmVyeUtleU1pc21hdGNoRXJyb3Igd2hlbiB0aGUgdXNlciBrZXkgZG9lcyBub3QgYmVsb25nIHRvIHRoZSByb290JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGdldEJhbGFuY2VTdHViID0gc2FuZGJveC5zdHViKEFsZ28ucHJvdG90eXBlLCAnZ2V0QWNjb3VudEJhbGFuY2UnKS5yZXNvbHZlcyhuYXRpdmVCYWxhbmNlKTtcblxuICAgIGNvbnN0IHJvb3RzID0gZWQyNTUxOVJvb3RzKCk7XG4gICAgY29uc3QgZGVyaXZlZCA9IGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHsgY29pbjogJ2FsZ28nLCBzbG90OiAnZWQyNTUxOU11bHRpc2lnJywgYWNjb3VudDogMCwgcm9vdHMgfSk7XG4gICAgaWYgKGRlcml2ZWQuc2xvdCAhPT0gJ2VkMjU1MTlNdWx0aXNpZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgZWQyNTUxOU11bHRpc2lnIHNsb3QnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5UGFyYW1zID0gYXdhaXQgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyh7XG4gICAgICBiaXRnbyxcbiAgICAgIGNvaW46ICdhbGdvJyxcbiAgICAgIHNsb3Q6ICdlZDI1NTE5TXVsdGlzaWcnLFxuICAgICAga2V5czogZGVyaXZlZC5rZXlzLFxuICAgICAgbW9kZTogJ3NpZ25lZCcsXG4gICAgfSk7XG4gICAgaWYgKGtleVBhcmFtcy5zbG90ICE9PSAnZWQyNTUxOU11bHRpc2lnJyB8fCBrZXlQYXJhbXMubW9kZSAhPT0gJ3NpZ25lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc2lnbmVkIGVkMjU1MTlNdWx0aXNpZyBrZXkgcGFyYW1zJyk7XG4gICAgfVxuXG4gICAgLy8gQSByb290QWRkcmVzcyB0aGUgZGVyaXZlZCBrZXlzIGRvIG5vdCBjb250cm9sOiB0aGUgZmFpbC1jbG9zZWQgY2hlY2sgZmlyZXMgYmVmb3JlIGFueSBub2RlIGNhbGwuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAoKSA9PlxuICAgICAgICBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgICB1c2VyS2V5OiBrZXlQYXJhbXMudXNlcktleSxcbiAgICAgICAgICByb290QWRkcmVzczogYWxnb3Nkay5lbmNvZGVBZGRyZXNzKEJ1ZmZlci5hbGxvYygzMiwgMHhlZSkpLFxuICAgICAgICAgIGJpdGdvS2V5OiBrZXlQYXJhbXMuYml0Z29LZXksXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZToga2V5UGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgZmVlLFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgZmlyc3RSb3VuZDogNTAwMjU5NixcbiAgICAgICAgICBub2RlUGFyYW1zLFxuICAgICAgICAgIGV4dGVybmFsQmFja3VwU2lnbmVyOiBrZXlQYXJhbXMuZXh0ZXJuYWxCYWNrdXBTaWduZXIsXG4gICAgICAgIH0pLFxuICAgICAgUmVjb3ZlcnlLZXlNaXNtYXRjaEVycm9yXG4gICAgKTtcbiAgICBTaW5vbi5hc3NlcnQubm90Q2FsbGVkKGdldEJhbGFuY2VTdHViKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -38,6 +38,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
const assert_1 = __importDefault(require("assert"));
|
|
40
40
|
const should_1 = __importDefault(require("should"));
|
|
41
|
+
const algosdk_1 = __importDefault(require("algosdk"));
|
|
42
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
41
43
|
const statics_1 = require("@bitgo-beta/statics");
|
|
42
44
|
const AlgoResources = __importStar(require("../../fixtures/resources"));
|
|
43
45
|
const transaction_1 = require("../../../src/lib/transaction");
|
|
@@ -153,5 +155,33 @@ describe('Algo Transaction', () => {
|
|
|
153
155
|
txInfo.tokenName.should.equal('USON');
|
|
154
156
|
});
|
|
155
157
|
});
|
|
158
|
+
describe('addRawMultisigSignature', () => {
|
|
159
|
+
it('throws when the transaction is empty', () => {
|
|
160
|
+
assert_1.default.throws(() => tx.addRawMultisigSignature(address, new Uint8Array(64)), /Empty transaction/);
|
|
161
|
+
});
|
|
162
|
+
it('appends a raw external signature and produces a valid multisig transaction', async () => {
|
|
163
|
+
const a1 = AlgoResources.accounts.account1;
|
|
164
|
+
const a2 = AlgoResources.accounts.account2;
|
|
165
|
+
const a3 = AlgoResources.accounts.account3;
|
|
166
|
+
txnBuilder.numberOfRequiredSigners(2).setSigners([a1.address, a2.address, a3.address]);
|
|
167
|
+
txnBuilder.sign({ key: a1.prvKey });
|
|
168
|
+
const built = (await txnBuilder.build());
|
|
169
|
+
const algoTxn = built.getAlgoTransaction();
|
|
170
|
+
const rawSig = tweetnacl_1.default.sign.detached(algoTxn.bytesToSign(), tweetnacl_1.default.sign.keyPair.fromSeed(a2.secretKey).secretKey);
|
|
171
|
+
built.addRawMultisigSignature(a2.address, rawSig);
|
|
172
|
+
const msigAddr = algosdk_1.default.multisigAddress({
|
|
173
|
+
version: 1,
|
|
174
|
+
threshold: 2,
|
|
175
|
+
addrs: [a1.address, a2.address, a3.address],
|
|
176
|
+
});
|
|
177
|
+
const expectedPk = algosdk_1.default.decodeAddress(msigAddr).publicKey;
|
|
178
|
+
const decoded = algosdk_1.default.decodeSignedTransaction(built.toBroadcastFormat());
|
|
179
|
+
const msig = decoded.msig;
|
|
180
|
+
if (!msig) {
|
|
181
|
+
throw new Error('Expected a multisig signature');
|
|
182
|
+
}
|
|
183
|
+
algosdk_1.default.verifyMultisig(algoTxn.bytesToSign(), msig, expectedPk).should.equal(true);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
156
186
|
});
|
|
157
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixpREFBNEM7QUFDNUMsd0VBQTBEO0FBQzFELDhEQUEyRDtBQUMzRCwwQ0FBNEY7QUFFNUYsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxJQUFJLEVBQWUsQ0FBQztJQUNwQixJQUFJLFVBQWdDLENBQUM7SUFDckMsTUFBTSxPQUFPLEdBQUcsNERBQTRELENBQUM7SUFFN0UsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE1BQU0sTUFBTSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNsQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFFbkIsRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixVQUFVLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2xGLFVBQVU7YUFDUCxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7YUFDNUIsU0FBUyxDQUFDLElBQUksQ0FBQzthQUNmLFVBQVUsQ0FBQyxVQUFVLENBQUM7YUFDdEIsU0FBUyxD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QUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgKiBhcyBBbGdvUmVzb3VyY2VzIGZyb20gJy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgS2V5UGFpciwgQXNzZXRUcmFuc2ZlckJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcblxuZGVzY3JpYmUoJ0FsZ28gVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGxldCB0eDogVHJhbnNhY3Rpb247XG4gIGxldCB0eG5CdWlsZGVyOiBBc3NldFRyYW5zZmVyQnVpbGRlcjtcbiAgY29uc3QgYWRkcmVzcyA9ICdSSUpWTERZV0FTWlpOR09TUU5PSzdITjZKTkZMTU1aM0ZGQkJGRzJOTlJPTTVDRTc0NERBSlNQWko0JztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBjb2lucy5nZXQoJ2FsZ28nKTtcbiAgICBjb25zdCB0b2tlbkNvbmZpZyA9IGNvaW5zLmdldCgndGFsZ286VVNPTi0xNjAyNjcyOCcpO1xuICAgIGNvbnN0IGZpcnN0Um91bmQgPSAxNjc7XG4gICAgY29uc3QgbGFzdFJvdW5kID0gMTE2NztcbiAgICBjb25zdCBmZWUgPSAxMDAwO1xuICAgIGNvbnN0IHRva2VuSWQgPSAxO1xuICAgIGNvbnN0IGFtb3VudCA9ICcwJztcblxuICAgIHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvbmZpZyk7XG4gICAgdHhuQnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KHRva2VuQ29uZmlnKS5nZXRBc3NldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIHR4bkJ1aWxkZXJcbiAgICAgIC5mZWUoeyBmZWU6IGZlZS50b1N0cmluZygpIH0pXG4gICAgICAuaXNGbGF0RmVlKHRydWUpXG4gICAgICAuZmlyc3RSb3VuZChmaXJzdFJvdW5kKVxuICAgICAgLmxhc3RSb3VuZChsYXN0Um91bmQpXG4gICAgICAudGVzdG5ldCgpXG4gICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWRkcmVzcyB9KVxuICAgICAgLnRva2VuSWQodG9rZW5JZClcbiAgICAgIC5hbW91bnQoQmlnSW50KGFtb3VudCkpXG4gICAgICAudG8oeyBhZGRyZXNzOiBhZGRyZXNzIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZW1wdHkgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlbXB0eSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHgudG9Kc29uKCksIC9FbXB0eSB0cmFuc2FjdGlvbi8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAvRW1wdHkgdHJhbnNhY3Rpb24vKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHNpZ24nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eC5zaWduKFtuZXcgS2V5UGFpcih7IHBydjogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5kZWZhdWx0LnNlY3JldEtleS50b1N0cmluZygnaGV4JykgfSldKSxcbiAgICAgICAgL0VtcHR5IHRyYW5zYWN0aW9uL1xuICAgICAgKTtcbiAgICAgIHR4LnNldE51bWJlck9mUmVxdWlyZWRTaWduZXJzKDIpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHguc2lnbihbbmV3IEtleVBhaXIoeyBwcnY6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuZGVmYXVsdC5zZWNyZXRLZXkudG9TdHJpbmcoJ2hleCcpIH0pXSksXG4gICAgICAgIC9FbXB0eSB0cmFuc2FjdGlvbi9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjYW5ub3Qgc2lnbiAtIG5vIHNpZ25lciByZXF1aXJlZCcsICgpID0+IHtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FuU2lnbih7IGtleTogJ3NvbWUnIH0pLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2Fubm90IHNpZ24gLSB3cm9uZyBhY2NvdW50IHNlY3JldCcsICgpID0+IHtcbiAgICAgIHR4LnNldE51bWJlck9mUmVxdWlyZWRTaWduZXJzKDEpO1xuICAgICAgdHguc2VuZGVyKEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmNhblNpZ24oeyBrZXk6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDIuc2VjcmV0S2V5LnRvU3RyaW5nKCdoZXgnKSB9KSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbiBzaWduJywgKCkgPT4ge1xuICAgICAgdHguc2V0TnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMoMSk7XG4gICAgICB0eC5zZW5kZXIoQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FuU2lnbih7IGtleTogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50Mi5zZWNyZXRLZXkudG9TdHJpbmcoJ2hleCcpIH0pLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHR5cGUnLCAoKSA9PiB7XG4gICAgaXQoJ2ZpZWxkIHR4VHlwZSBhbmQgdG9rZW5OYW1lIGFyZSBhZGRlZCBvbiBlbmFibGVUb2tlbiB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhuQnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEluZm8gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eEhleCk7XG5cbiAgICAgIHR4SW5mby50by5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uZnJvbS5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uYW1vdW50LnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgdHhJbmZvLmZpcnN0Um91bmQuc2hvdWxkLmVxdWFsKDE2Nyk7XG4gICAgICB0eEluZm8udG9rZW5JZC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eEluZm8uZmVlLnNob3VsZC5lcXVhbCgxMDAwKTtcbiAgICAgIHR4SW5mby5sYXN0Um91bmQuc2hvdWxkLmVxdWFsKDExNjcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNJRC5zaG91bGQuZXF1YWwoJ3Rlc3RuZXQtdjEuMCcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNIYXNoLnNob3VsZC5lcXVhbCgnU0dPMUdLU3p5RTdJRVBJdFR4Q0J5dzl4OEZtbnJDRGV4aTkvY09VSk9pST0nKTtcbiAgICAgIHR4SW5mby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhUeXBlJyk7XG4gICAgICB0eEluZm8udHhUeXBlLnNob3VsZC5lcXVhbCgnZW5hYmxlVG9rZW4nKTtcbiAgICAgIHR4SW5mby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndG9rZW5OYW1lJyk7XG4gICAgICB0eEluZm8udG9rZW5OYW1lLnNob3VsZC5lcXVhbCgnVVNPTicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZpZWxkIHR4VHlwZSBhbmQgdG9rZW5OYW1lIGFyZSBhZGRlZCBvbiBkaXNhYmxlVG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjbG9zZVJlbWFpbmRlclRvID0gJ1NQNzQ1SkpSNEtQUlFFWEpaSFZJRU43MzZMWVRMMlQyREZNRzNPSUlGSkJWNjZLNzNQSE5NRENaVk0nO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4bkJ1aWxkZXIuY2xvc2VSZW1haW5kZXJUbyh7IGFkZHJlc3M6IGNsb3NlUmVtYWluZGVyVG8gfSkuYnVpbGQoKTtcblxuICAgICAgY29uc3QgdHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgdHhJbmZvID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdHModHhIZXgpO1xuXG4gICAgICB0eEluZm8udG8uc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgICAgdHhJbmZvLmZyb20uc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgICAgdHhJbmZvLmFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIHR4SW5mby5maXJzdFJvdW5kLnNob3VsZC5lcXVhbCgxNjcpO1xuICAgICAgdHhJbmZvLnRva2VuSWQuc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHhJbmZvLmZlZS5zaG91bGQuZXF1YWwoMTAwMCk7XG4gICAgICB0eEluZm8uY2xvc2VSZW1haW5kZXJUby5zaG91bGQuZXF1YWwoY2xvc2VSZW1haW5kZXJUbyk7XG4gICAgICB0eEluZm8ubGFzdFJvdW5kLnNob3VsZC5lcXVhbCgxMTY3KTtcbiAgICAgIHR4SW5mby5nZW5lc2lzSUQuc2hvdWxkLmVxdWFsKCd0ZXN0bmV0LXYxLjAnKTtcbiAgICAgIHR4SW5mby5nZW5lc2lzSGFzaC5zaG91bGQuZXF1YWwoJ1NHTzFHS1N6eUU3SUVQSXRUeENCeXc5eDhGbW5yQ0RleGk5L2NPVUpPaUk9Jyk7XG4gICAgICB0eEluZm8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4VHlwZScpO1xuICAgICAgdHhJbmZvLnR4VHlwZS5zaG91bGQuZXF1YWwoJ2Rpc2FibGVUb2tlbicpO1xuICAgICAgdHhJbmZvLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eFR5cGUnKTtcbiAgICAgIHR4SW5mby50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKCdVU09OJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmllbGQgdHhUeXBlIGFuZCB0b2tlbk5hbWUgYXJlIGFkZGVkIG9uIHRyYW5zZmVyVG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4bkJ1aWxkZXIuYW1vdW50KEJpZ0ludCgnMTAwMCcpKS5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEluZm8gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eEhleCk7XG5cbiAgICAgIHR4SW5mby50by5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uZnJvbS5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uYW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHhJbmZvLmZpcnN0Um91bmQuc2hvdWxkLmVxdWFsKDE2Nyk7XG4gICAgICB0eEluZm8udG9rZW5JZC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eEluZm8uZmVlLnNob3VsZC5lcXVhbCgxMDAwKTtcbiAgICAgIHR4SW5mby5sYXN0Um91bmQuc2hvdWxkLmVxdWFsKDExNjcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNJRC5zaG91bGQuZXF1YWwoJ3Rlc3RuZXQtdjEuMCcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNIYXNoLnNob3VsZC5lcXVhbCgnU0dPMUdLU3p5RTdJRVBJdFR4Q0J5dzl4OEZtbnJDRGV4aTkvY09VSk9pST0nKTtcbiAgICAgIHR4SW5mby50eFR5cGUuc2hvdWxkLmVxdWFsKCd0cmFuc2ZlclRva2VuJyk7XG4gICAgICB0eEluZm8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4VHlwZScpO1xuICAgICAgdHhJbmZvLnRva2VuTmFtZS5zaG91bGQuZXF1YWwoJ1VTT04nKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixzREFBOEI7QUFDOUIsMERBQTZCO0FBQzdCLGlEQUE0QztBQUM1Qyx3RUFBMEQ7QUFDMUQsOERBQTJEO0FBQzNELDBDQUE0RjtBQUU1RixRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUksRUFBZSxDQUFDO0lBQ3BCLElBQUksVUFBZ0MsQ0FBQztJQUNyQyxNQUFNLE9BQU8sR0FBRyw0REFBNEQsQ0FBQztJQUU3RSxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsTUFBTSxNQUFNLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxNQUFNLFdBQVcsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDckQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUVuQixFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLFVBQVUsR0FBRyxJQUFJLCtCQUF5QixDQUFDLFdBQVcsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDbEYsVUFBVTthQUNQLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQzthQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDO2FBQ2YsVUFBVSxD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RUFBRSxDQUFDLE9BQU8sQ0FBQzthQUM1QyxDQUFDLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDN0QsTUFBTSxPQUFPLEdBQUcsaUJBQU8sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsaUJBQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCBhbGdvc2RrIGZyb20gJ2FsZ29zZGsnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgKiBhcyBBbGdvUmVzb3VyY2VzIGZyb20gJy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgS2V5UGFpciwgQXNzZXRUcmFuc2ZlckJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcblxuZGVzY3JpYmUoJ0FsZ28gVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGxldCB0eDogVHJhbnNhY3Rpb247XG4gIGxldCB0eG5CdWlsZGVyOiBBc3NldFRyYW5zZmVyQnVpbGRlcjtcbiAgY29uc3QgYWRkcmVzcyA9ICdSSUpWTERZV0FTWlpOR09TUU5PSzdITjZKTkZMTU1aM0ZGQkJGRzJOTlJPTTVDRTc0NERBSlNQWko0JztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBjb2lucy5nZXQoJ2FsZ28nKTtcbiAgICBjb25zdCB0b2tlbkNvbmZpZyA9IGNvaW5zLmdldCgndGFsZ286VVNPTi0xNjAyNjcyOCcpO1xuICAgIGNvbnN0IGZpcnN0Um91bmQgPSAxNjc7XG4gICAgY29uc3QgbGFzdFJvdW5kID0gMTE2NztcbiAgICBjb25zdCBmZWUgPSAxMDAwO1xuICAgIGNvbnN0IHRva2VuSWQgPSAxO1xuICAgIGNvbnN0IGFtb3VudCA9ICcwJztcblxuICAgIHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvbmZpZyk7XG4gICAgdHhuQnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KHRva2VuQ29uZmlnKS5nZXRBc3NldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIHR4bkJ1aWxkZXJcbiAgICAgIC5mZWUoeyBmZWU6IGZlZS50b1N0cmluZygpIH0pXG4gICAgICAuaXNGbGF0RmVlKHRydWUpXG4gICAgICAuZmlyc3RSb3VuZChmaXJzdFJvdW5kKVxuICAgICAgLmxhc3RSb3VuZChsYXN0Um91bmQpXG4gICAgICAudGVzdG5ldCgpXG4gICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWRkcmVzcyB9KVxuICAgICAgLnRva2VuSWQodG9rZW5JZClcbiAgICAgIC5hbW91bnQoQmlnSW50KGFtb3VudCkpXG4gICAgICAudG8oeyBhZGRyZXNzOiBhZGRyZXNzIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZW1wdHkgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlbXB0eSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHgudG9Kc29uKCksIC9FbXB0eSB0cmFuc2FjdGlvbi8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAvRW1wdHkgdHJhbnNhY3Rpb24vKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHNpZ24nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eC5zaWduKFtuZXcgS2V5UGFpcih7IHBydjogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5kZWZhdWx0LnNlY3JldEtleS50b1N0cmluZygnaGV4JykgfSldKSxcbiAgICAgICAgL0VtcHR5IHRyYW5zYWN0aW9uL1xuICAgICAgKTtcbiAgICAgIHR4LnNldE51bWJlck9mUmVxdWlyZWRTaWduZXJzKDIpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHguc2lnbihbbmV3IEtleVBhaXIoeyBwcnY6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuZGVmYXVsdC5zZWNyZXRLZXkudG9TdHJpbmcoJ2hleCcpIH0pXSksXG4gICAgICAgIC9FbXB0eSB0cmFuc2FjdGlvbi9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjYW5ub3Qgc2lnbiAtIG5vIHNpZ25lciByZXF1aXJlZCcsICgpID0+IHtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FuU2lnbih7IGtleTogJ3NvbWUnIH0pLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2Fubm90IHNpZ24gLSB3cm9uZyBhY2NvdW50IHNlY3JldCcsICgpID0+IHtcbiAgICAgIHR4LnNldE51bWJlck9mUmVxdWlyZWRTaWduZXJzKDEpO1xuICAgICAgdHguc2VuZGVyKEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmNhblNpZ24oeyBrZXk6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDIuc2VjcmV0S2V5LnRvU3RyaW5nKCdoZXgnKSB9KSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbiBzaWduJywgKCkgPT4ge1xuICAgICAgdHguc2V0TnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMoMSk7XG4gICAgICB0eC5zZW5kZXIoQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FuU2lnbih7IGtleTogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50Mi5zZWNyZXRLZXkudG9TdHJpbmcoJ2hleCcpIH0pLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHR5cGUnLCAoKSA9PiB7XG4gICAgaXQoJ2ZpZWxkIHR4VHlwZSBhbmQgdG9rZW5OYW1lIGFyZSBhZGRlZCBvbiBlbmFibGVUb2tlbiB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhuQnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEluZm8gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eEhleCk7XG5cbiAgICAgIHR4SW5mby50by5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uZnJvbS5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uYW1vdW50LnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgdHhJbmZvLmZpcnN0Um91bmQuc2hvdWxkLmVxdWFsKDE2Nyk7XG4gICAgICB0eEluZm8udG9rZW5JZC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eEluZm8uZmVlLnNob3VsZC5lcXVhbCgxMDAwKTtcbiAgICAgIHR4SW5mby5sYXN0Um91bmQuc2hvdWxkLmVxdWFsKDExNjcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNJRC5zaG91bGQuZXF1YWwoJ3Rlc3RuZXQtdjEuMCcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNIYXNoLnNob3VsZC5lcXVhbCgnU0dPMUdLU3p5RTdJRVBJdFR4Q0J5dzl4OEZtbnJDRGV4aTkvY09VSk9pST0nKTtcbiAgICAgIHR4SW5mby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhUeXBlJyk7XG4gICAgICB0eEluZm8udHhUeXBlLnNob3VsZC5lcXVhbCgnZW5hYmxlVG9rZW4nKTtcbiAgICAgIHR4SW5mby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndG9rZW5OYW1lJyk7XG4gICAgICB0eEluZm8udG9rZW5OYW1lLnNob3VsZC5lcXVhbCgnVVNPTicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZpZWxkIHR4VHlwZSBhbmQgdG9rZW5OYW1lIGFyZSBhZGRlZCBvbiBkaXNhYmxlVG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjbG9zZVJlbWFpbmRlclRvID0gJ1NQNzQ1SkpSNEtQUlFFWEpaSFZJRU43MzZMWVRMMlQyREZNRzNPSUlGSkJWNjZLNzNQSE5NRENaVk0nO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4bkJ1aWxkZXIuY2xvc2VSZW1haW5kZXJUbyh7IGFkZHJlc3M6IGNsb3NlUmVtYWluZGVyVG8gfSkuYnVpbGQoKTtcblxuICAgICAgY29uc3QgdHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgdHhJbmZvID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdHModHhIZXgpO1xuXG4gICAgICB0eEluZm8udG8uc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgICAgdHhJbmZvLmZyb20uc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgICAgdHhJbmZvLmFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIHR4SW5mby5maXJzdFJvdW5kLnNob3VsZC5lcXVhbCgxNjcpO1xuICAgICAgdHhJbmZvLnRva2VuSWQuc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHhJbmZvLmZlZS5zaG91bGQuZXF1YWwoMTAwMCk7XG4gICAgICB0eEluZm8uY2xvc2VSZW1haW5kZXJUby5zaG91bGQuZXF1YWwoY2xvc2VSZW1haW5kZXJUbyk7XG4gICAgICB0eEluZm8ubGFzdFJvdW5kLnNob3VsZC5lcXVhbCgxMTY3KTtcbiAgICAgIHR4SW5mby5nZW5lc2lzSUQuc2hvdWxkLmVxdWFsKCd0ZXN0bmV0LXYxLjAnKTtcbiAgICAgIHR4SW5mby5nZW5lc2lzSGFzaC5zaG91bGQuZXF1YWwoJ1NHTzFHS1N6eUU3SUVQSXRUeENCeXc5eDhGbW5yQ0RleGk5L2NPVUpPaUk9Jyk7XG4gICAgICB0eEluZm8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4VHlwZScpO1xuICAgICAgdHhJbmZvLnR4VHlwZS5zaG91bGQuZXF1YWwoJ2Rpc2FibGVUb2tlbicpO1xuICAgICAgdHhJbmZvLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eFR5cGUnKTtcbiAgICAgIHR4SW5mby50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKCdVU09OJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmllbGQgdHhUeXBlIGFuZCB0b2tlbk5hbWUgYXJlIGFkZGVkIG9uIHRyYW5zZmVyVG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4bkJ1aWxkZXIuYW1vdW50KEJpZ0ludCgnMTAwMCcpKS5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEluZm8gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eEhleCk7XG5cbiAgICAgIHR4SW5mby50by5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uZnJvbS5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uYW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHhJbmZvLmZpcnN0Um91bmQuc2hvdWxkLmVxdWFsKDE2Nyk7XG4gICAgICB0eEluZm8udG9rZW5JZC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eEluZm8uZmVlLnNob3VsZC5lcXVhbCgxMDAwKTtcbiAgICAgIHR4SW5mby5sYXN0Um91bmQuc2hvdWxkLmVxdWFsKDExNjcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNJRC5zaG91bGQuZXF1YWwoJ3Rlc3RuZXQtdjEuMCcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNIYXNoLnNob3VsZC5lcXVhbCgnU0dPMUdLU3p5RTdJRVBJdFR4Q0J5dzl4OEZtbnJDRGV4aTkvY09VSk9pST0nKTtcbiAgICAgIHR4SW5mby50eFR5cGUuc2hvdWxkLmVxdWFsKCd0cmFuc2ZlclRva2VuJyk7XG4gICAgICB0eEluZm8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4VHlwZScpO1xuICAgICAgdHhJbmZvLnRva2VuTmFtZS5zaG91bGQuZXF1YWwoJ1VTT04nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZFJhd011bHRpc2lnU2lnbmF0dXJlJywgKCkgPT4ge1xuICAgIGl0KCd0aHJvd3Mgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgZW1wdHknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4LmFkZFJhd011bHRpc2lnU2lnbmF0dXJlKGFkZHJlc3MsIG5ldyBVaW50OEFycmF5KDY0KSksIC9FbXB0eSB0cmFuc2FjdGlvbi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FwcGVuZHMgYSByYXcgZXh0ZXJuYWwgc2lnbmF0dXJlIGFuZCBwcm9kdWNlcyBhIHZhbGlkIG11bHRpc2lnIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYTEgPSBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxO1xuICAgICAgY29uc3QgYTIgPSBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQyO1xuICAgICAgY29uc3QgYTMgPSBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQzO1xuXG4gICAgICB0eG5CdWlsZGVyLm51bWJlck9mUmVxdWlyZWRTaWduZXJzKDIpLnNldFNpZ25lcnMoW2ExLmFkZHJlc3MsIGEyLmFkZHJlc3MsIGEzLmFkZHJlc3NdKTtcbiAgICAgIHR4bkJ1aWxkZXIuc2lnbih7IGtleTogYTEucHJ2S2V5IH0pO1xuXG4gICAgICBjb25zdCBidWlsdCA9IChhd2FpdCB0eG5CdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgYWxnb1R4biA9IGJ1aWx0LmdldEFsZ29UcmFuc2FjdGlvbigpITtcbiAgICAgIGNvbnN0IHJhd1NpZyA9IG5hY2wuc2lnbi5kZXRhY2hlZChhbGdvVHhuLmJ5dGVzVG9TaWduKCksIG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKGEyLnNlY3JldEtleSkuc2VjcmV0S2V5KTtcblxuICAgICAgYnVpbHQuYWRkUmF3TXVsdGlzaWdTaWduYXR1cmUoYTIuYWRkcmVzcywgcmF3U2lnKTtcblxuICAgICAgY29uc3QgbXNpZ0FkZHIgPSBhbGdvc2RrLm11bHRpc2lnQWRkcmVzcyh7XG4gICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgYWRkcnM6IFthMS5hZGRyZXNzLCBhMi5hZGRyZXNzLCBhMy5hZGRyZXNzXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZXhwZWN0ZWRQayA9IGFsZ29zZGsuZGVjb2RlQWRkcmVzcyhtc2lnQWRkcikucHVibGljS2V5O1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGFsZ29zZGsuZGVjb2RlU2lnbmVkVHJhbnNhY3Rpb24oYnVpbHQudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBjb25zdCBtc2lnID0gZGVjb2RlZC5tc2lnO1xuICAgICAgaWYgKCFtc2lnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBtdWx0aXNpZyBzaWduYXR1cmUnKTtcbiAgICAgIH1cbiAgICAgIGFsZ29zZGsudmVyaWZ5TXVsdGlzaWcoYWxnb1R4bi5ieXRlc1RvU2lnbigpLCBtc2lnLCBleHBlY3RlZFBrKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|