@bitgo/sdk-coin-etc 2.8.6 → 2.8.8
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.
|
@@ -12,6 +12,6 @@ export declare class TransactionBuilder extends EthTransactionBuilder {
|
|
|
12
12
|
*/
|
|
13
13
|
protected getContractData(addresses: string[]): string;
|
|
14
14
|
/** @inheritdoc */
|
|
15
|
-
transfer(data?: string): TransferBuilder;
|
|
15
|
+
transfer(data?: string, isFirstSigner?: boolean): TransferBuilder;
|
|
16
16
|
}
|
|
17
17
|
//# sourceMappingURL=transactionBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,kBAAkB,IAAI,qBAAqB,EAA2B,MAAM,qBAAqB,CAAC;AAG3G,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,qBAAa,kBAAmB,SAAQ,qBAAqB;IAC3D,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC;gBAEzB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM7C;;;;;OAKG;IACH,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM;IAQtD,kBAAkB;IAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe;
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,kBAAkB,IAAI,qBAAqB,EAA2B,MAAM,qBAAqB,CAAC;AAG3G,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,qBAAa,kBAAmB,SAAQ,qBAAqB;IAC3D,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC;gBAEzB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM7C;;;;;OAKG;IACH,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM;IAQtD,kBAAkB;IAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,eAAe;CASlE"}
|
|
@@ -30,15 +30,15 @@ class TransactionBuilder extends sdk_coin_eth_1.TransactionBuilder {
|
|
|
30
30
|
return utils_1.walletSimpleByteCode + resultEncodedParameters;
|
|
31
31
|
}
|
|
32
32
|
/** @inheritdoc */
|
|
33
|
-
transfer(data) {
|
|
33
|
+
transfer(data, isFirstSigner) {
|
|
34
34
|
if (this._type !== sdk_core_1.TransactionType.Send) {
|
|
35
35
|
throw new sdk_core_1.BuildTransactionError('Transfers can only be set for send transactions');
|
|
36
36
|
}
|
|
37
37
|
if (!this._transfer) {
|
|
38
|
-
this._transfer = new transferBuilder_1.TransferBuilder(data);
|
|
38
|
+
this._transfer = new transferBuilder_1.TransferBuilder(data, isFirstSigner);
|
|
39
39
|
}
|
|
40
40
|
return this._transfer;
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
exports.TransactionBuilder = TransactionBuilder;
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esb0VBQXlDO0FBQ3pDLHNEQUEyRztBQUMzRyw4Q0FBeUU7QUFDekUsbUNBQTBEO0FBQzFELHVEQUFvRDtBQUNwRCx5QkFBaUM7QUFFakMsTUFBYSxrQkFBbUIsU0FBUSxpQ0FBcUI7SUFHM0QsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFBLGlCQUFTLEVBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGNBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxlQUFlLENBQUMsU0FBbUI7UUFDM0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQixNQUFNLHVCQUF1QixHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUFDLHNDQUF1QixFQUFFLE1BQU0sQ0FBQzthQUNuRixRQUFRLENBQUMsS0FBSyxDQUFDO2FBQ2YsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyQixPQUFPLDRCQUFvQixHQUFHLHVCQUF1QixDQUFDO0lBQ3hELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsUUFBUSxDQUFDLElBQWEsRUFBRSxhQUF1QjtRQUM3QyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssMEJBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksZ0NBQXFCLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksaUNBQWUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0NBQ0Y7QUFqQ0QsZ0RBaUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgYXMgRXRoVHJhbnNhY3Rpb25CdWlsZGVyLCB3YWxsZXRTaW1wbGVDb25zdHJ1Y3RvciB9IGZyb20gJ0BiaXRnby9zZGstY29pbi1ldGgnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZ2V0Q29tbW9uLCB3YWxsZXRTaW1wbGVCeXRlQ29kZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi90cmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBFdGhUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX3RyYW5zZmVyOiBUcmFuc2ZlckJ1aWxkZXI7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX2NvbW1vbiA9IGdldENvbW1vbih0aGlzLl9jb2luQ29uZmlnLm5ldHdvcmsudHlwZSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnLCB0aGlzLl9jb21tb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNtYXJ0IGNvbnRyYWN0IGVuY29kZWQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhZGRyZXNzZXMgLSB0aGUgY29udHJhY3Qgc2lnbmVyc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBzbWFydCBjb250cmFjdCBlbmNvZGVkIGRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBnZXRDb250cmFjdERhdGEoYWRkcmVzc2VzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyYW1zID0gW2FkZHJlc3Nlc107XG4gICAgY29uc3QgcmVzdWx0RW5jb2RlZFBhcmFtZXRlcnMgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUod2FsbGV0U2ltcGxlQ29uc3RydWN0b3IsIHBhcmFtcylcbiAgICAgIC50b1N0cmluZygnaGV4JylcbiAgICAgIC5yZXBsYWNlKCcweCcsICcnKTtcbiAgICByZXR1cm4gd2FsbGV0U2ltcGxlQnl0ZUNvZGUgKyByZXN1bHRFbmNvZGVkUGFyYW1ldGVycztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0cmFuc2ZlcihkYXRhPzogc3RyaW5nLCBpc0ZpcnN0U2lnbmVyPzogYm9vbGVhbik6IFRyYW5zZmVyQnVpbGRlciB7XG4gICAgaWYgKHRoaXMuX3R5cGUgIT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2ZlcnMgY2FuIG9ubHkgYmUgc2V0IGZvciBzZW5kIHRyYW5zYWN0aW9ucycpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3RyYW5zZmVyKSB7XG4gICAgICB0aGlzLl90cmFuc2ZlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoZGF0YSwgaXNGaXJzdFNpZ25lcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90cmFuc2ZlcjtcbiAgfVxufVxuIl19
|
|
@@ -114,4 +114,72 @@ describe('should sign and build from serialized', () => {
|
|
|
114
114
|
should_1.default.equal(signedTx.toBroadcastFormat(), testData.SEND_TX_AMOUNT_ZERO_BROADCAST);
|
|
115
115
|
});
|
|
116
116
|
});
|
|
117
|
-
|
|
117
|
+
/**
|
|
118
|
+
* Regression tests for WCN-560: ETC TransactionBuilder.transfer() must pass isFirstSigner to the
|
|
119
|
+
* TransferBuilder so that from(txHex, true) correctly decodes first-signer calldata, and
|
|
120
|
+
* getHalfSignedTxByFirstSigner produces a valid second-signer half-signed tx (instead of treating
|
|
121
|
+
* the ABI string-offset 0xC0 as the recipient address).
|
|
122
|
+
*/
|
|
123
|
+
describe('ETC first-signer round-trip (WCN-560 regression)', () => {
|
|
124
|
+
const contractAddress = '0x7073b82be1d932c70afe505e1fe211916e978c34';
|
|
125
|
+
const recipient = testData.ACCOUNT_2; // '0x33ffaefff29455fbcb1f7ddabb6ef48f4dd87536'
|
|
126
|
+
const amount = '1000000000';
|
|
127
|
+
const expireTime = 1590066728;
|
|
128
|
+
const sequenceId = 5;
|
|
129
|
+
const key = testData.KEYPAIR_PRV.getKeys().prv;
|
|
130
|
+
/** Build an unsigned first-signer tx with known parameters and return its hex. */
|
|
131
|
+
async function buildFirstSignerTxHex() {
|
|
132
|
+
const txBuilder = (0, builder_1.getBuilder)('tetc');
|
|
133
|
+
txBuilder.fee({ fee: '1000000000', gasLimit: '12100000' });
|
|
134
|
+
txBuilder.counter(2);
|
|
135
|
+
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
136
|
+
txBuilder.contract(contractAddress);
|
|
137
|
+
const transfer = txBuilder.transfer();
|
|
138
|
+
transfer.amount(amount).to(recipient).expirationTime(expireTime).contractSequenceId(sequenceId).key(key);
|
|
139
|
+
transfer.isFirstSigner(true);
|
|
140
|
+
const tx = await txBuilder.build();
|
|
141
|
+
return tx.toBroadcastFormat();
|
|
142
|
+
}
|
|
143
|
+
it('from(firstSignerTxHex, true) decodes recipient and amount correctly (not 0xC0)', async () => {
|
|
144
|
+
const firstSignerTxHex = await buildFirstSignerTxHex();
|
|
145
|
+
// This was broken before the fix: ETC's transfer() dropped isFirstSigner, so the
|
|
146
|
+
// TransferBuilder decoded the first-signer ABI with second-signer offsets, producing
|
|
147
|
+
// address=0x...00c0 (the ABI dynamic-string offset) instead of the real recipient.
|
|
148
|
+
const txBuilder = (0, builder_1.getBuilder)('tetc');
|
|
149
|
+
txBuilder.from(firstSignerTxHex, true);
|
|
150
|
+
const tx = await txBuilder.build();
|
|
151
|
+
should_1.default.equal(tx.outputs.length, 1);
|
|
152
|
+
should_1.default.equal(tx.outputs[0].address.toLowerCase(), recipient.toLowerCase());
|
|
153
|
+
should_1.default.equal(tx.outputs[0].value, amount);
|
|
154
|
+
// Explicitly assert the old-bug value is absent
|
|
155
|
+
should_1.default.notEqual(tx.outputs[0].address.toLowerCase(), '0x00000000000000000000000000000000000000c0');
|
|
156
|
+
});
|
|
157
|
+
it('full round-trip: first-signer → add inner sig → second-signer half-signed → verify recipient', async () => {
|
|
158
|
+
const firstSignerTxHex = await buildFirstSignerTxHex();
|
|
159
|
+
// Simulate getHalfSignedTxByFirstSigner:
|
|
160
|
+
// 1. Parse the first-signer tx (Trust HSM input)
|
|
161
|
+
// 2. Inject the operationHashSig returned by Trust
|
|
162
|
+
// 3. Switch to second-signer encoding (removes the method-id prefix string)
|
|
163
|
+
const txBuilder = (0, builder_1.getBuilder)('tetc');
|
|
164
|
+
txBuilder.from(firstSignerTxHex, true);
|
|
165
|
+
const transfer = txBuilder.transfer();
|
|
166
|
+
const mockOperationHashSig = '0x' + '1b'.repeat(65); // 65-byte sig from Trust HSM
|
|
167
|
+
transfer.setSignature(mockOperationHashSig);
|
|
168
|
+
transfer.isFirstSigner(false);
|
|
169
|
+
const halfSignedTx = await txBuilder.build();
|
|
170
|
+
const halfSignedTxHex = halfSignedTx.toBroadcastFormat();
|
|
171
|
+
// Direct calldata decode must give the correct recipient and amount
|
|
172
|
+
const { to, amount: decodedAmount } = (0, sdk_coin_eth_1.decodeTransferData)(halfSignedTx.toJson().data);
|
|
173
|
+
should_1.default.equal(to.toLowerCase(), recipient.toLowerCase());
|
|
174
|
+
should_1.default.equal(decodedAmount, amount);
|
|
175
|
+
// Guard against the old bug: 0xC0 is the ABI string offset, NOT a valid recipient
|
|
176
|
+
should_1.default.notEqual(to.toLowerCase(), '0x00000000000000000000000000000000000000c0');
|
|
177
|
+
// Re-parsing the half-signed tx as second-signer must also yield correct outputs
|
|
178
|
+
const verifyBuilder = (0, builder_1.getBuilder)('tetc');
|
|
179
|
+
verifyBuilder.from(halfSignedTxHex);
|
|
180
|
+
const verifiedTx = await verifyBuilder.build();
|
|
181
|
+
should_1.default.equal(verifiedTx.outputs[0].address.toLowerCase(), recipient.toLowerCase());
|
|
182
|
+
should_1.default.equal(verifiedTx.outputs[0].value, amount);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvc2VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw4Q0FBa0Q7QUFFbEQsc0RBQXNEO0FBQ3RELDBEQUE0QztBQUM1QyxzREFBeUQ7QUFFekQsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLElBQUksU0FBNkIsQ0FBQztJQUNsQyxNQUFNLGVBQWUsR0FBRyw0Q0FBNEMsQ0FBQztJQUNyRSxNQUFNLGFBQWEsR0FBRyxHQUFTLEVBQUU7UUFDL0IsU0FBUyxHQUFHLElBQUEsb0JBQVUsRUFBQyxNQUFNLENBQXVCLENBQUM7UUFDckQsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUNaLEdBQUcsRUFBRSxZQUFZO1lBQ2pCLFFBQVEsRUFBRSxVQUFVO1NBQ3JCLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFhLENBQUM7SUFFekQsRUFBRSxDQUFDLDBCQUEwQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3hDLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM5QixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDckIsU0FB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QUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSw0Q0FBNEMsQ0FBQyxDQUFDO1FBRWhGLGlGQUFpRjtRQUNqRixNQUFNLGFBQWEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsTUFBTSxDQUF1QixDQUFDO1FBQy9ELGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlcic7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgZGVjb2RlVHJhbnNmZXJEYXRhIH0gZnJvbSAnQGJpdGdvL3Nkay1jb2luLWV0aCc7XG5cbmRlc2NyaWJlKCdFdGMgc2VuZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyO1xuICBjb25zdCBjb250cmFjdEFkZHJlc3MgPSAnMHg3MDczYjgyYmUxZDkzMmM3MGFmZTUwNWUxZmUyMTE5MTZlOTc4YzM0JztcbiAgY29uc3QgaW5pdFR4QnVpbGRlciA9ICgpOiB2b2lkID0+IHtcbiAgICB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0ZXRjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgZmVlOiAnMTAwMDAwMDAwMCcsXG4gICAgICBnYXNMaW1pdDogJzEyMTAwMDAwJyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuY291bnRlcigyKTtcbiAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gIH07XG4gIGNvbnN0IGtleSA9IHRlc3REYXRhLktFWVBBSVJfUFJWLmdldEtleXMoKS5wcnYgYXMgc3RyaW5nO1xuXG4gIGl0KCdhIHNlbmQgZnVuZHMgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgaW5pdFR4QnVpbGRlcigpO1xuICAgIGNvbnN0IHJlY2lwaWVudCA9IHRlc3REYXRhLkFDQ09VTlRfMjtcbiAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMCc7XG4gICAgY29uc3QgZXhwaXJlVGltZSA9IDE1OTAwNjY3Mjg7XG4gICAgY29uc3Qgc2VxdWVuY2VJZCA9IDU7XG4gICAgdHhCdWlsZGVyXG4gICAgICAudHJhbnNmZXIoKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAudG8ocmVjaXBpZW50KVxuICAgICAgLmV4cGlyYXRpb25UaW1lKDE1OTAwNjY3MjgpXG4gICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKHNlcXVlbmNlSWQpXG4gICAgICAua2V5KGtleSk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlBSSVZBVEVfS0VZXzEgfSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwodHgudG9Kc29uKCkuY2hhaW5JZCwgNjMpO1xuXG4gICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNFTkRfVFhfQlJPQURDQVNUKTtcbiAgICBzaG91bGQuZXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMik7XG4gICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHNbMF0uYWRkcmVzcywgY29udHJhY3RBZGRyZXNzKTtcbiAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzWzBdLnZhbHVlLCBhbW91bnQpO1xuICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMF0uYWRkcmVzcywgcmVjaXBpZW50KTtcbiAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0c1swXS52YWx1ZSwgYW1vdW50KTtcblxuICAgIGNvbnN0IGRhdGEgPSB0eC50b0pzb24oKS5kYXRhO1xuICAgIGNvbnN0IHtcbiAgICAgIHRvLFxuICAgICAgYW1vdW50OiBwYXJzZWRBbW91bnQsXG4gICAgICBleHBpcmVUaW1lOiBwYXJzZWRFeHBpcmVUaW1lLFxuICAgICAgc2VxdWVuY2VJZDogcGFyc2VkU2VxdWVuY2VJZCxcbiAgICB9ID0gZGVjb2RlVHJhbnNmZXJEYXRhKGRhdGEpO1xuICAgIHNob3VsZC5lcXVhbCh0bywgcmVjaXBpZW50KTtcbiAgICBzaG91bGQuZXF1YWwocGFyc2VkQW1vdW50LCBhbW91bnQpO1xuICAgIHNob3VsZC5lcXVhbChwYXJzZWRFeHBpcmVUaW1lLCBleHBpcmVUaW1lKTtcbiAgICBzaG91bGQuZXF1YWwocGFyc2VkU2VxdWVuY2VJZCwgc2VxdWVuY2VJZCk7XG4gIH0pO1xuXG4gIGl0KCdhIHNlbmQgZnVuZHMgd2l0aCBhbW91bnQgMCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBpbml0VHhCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnRyYW5zZmVyKCkuYW1vdW50KCcwJykudG8odGVzdERhdGEuQUNDT1VOVF8yKS5leHBpcmF0aW9uVGltZSgxNTkwMDY2NzI4KS5jb250cmFjdFNlcXVlbmNlSWQoNSkua2V5KGtleSk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlBSSVZBVEVfS0VZXzEgfSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0VORF9UWF9BTU9VTlRfWkVST19CUk9BRENBU1QpO1xuICB9KTtcbiAgaXQoJ3Vuc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggZmluYWwgdiBjaGVjaycsIGFzeW5jICgpID0+IHtcbiAgICBpbml0VHhCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnRyYW5zZmVyKCkuYW1vdW50KCcwJykudG8odGVzdERhdGEuQUNDT1VOVF8yKS5leHBpcmF0aW9uVGltZSgxNTkwMDY2NzI4KS5jb250cmFjdFNlcXVlbmNlSWQoNSkua2V5KGtleSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwodHgudG9Kc29uKCkudiwgJzB4YTEnKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3Nob3VsZCBzaWduIGFuZCBidWlsZCBmcm9tIHNlcmlhbGl6ZWQnLCAoKSA9PiB7XG4gIGl0KCdhIHNlbmQgZnVuZHMgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RldGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyLmZyb20odGVzdERhdGEuU0VORF9UWF9CUk9BRENBU1QpO1xuICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNFTkRfVFhfQlJPQURDQVNUKTtcbiAgfSk7XG5cbiAgaXQoJ2Egc2VuZCBmdW5kcyB0cmFuc2FjdGlvbiB3aXRoIGFtb3VudCAwIGZyb20gc2VyaWFsaXplZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0ZXRjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIHR4QnVpbGRlci5mcm9tKHRlc3REYXRhLlNFTkRfVFhfQU1PVU5UX1pFUk9fQlJPQURDQVNUKTtcbiAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TRU5EX1RYX0FNT1VOVF9aRVJPX0JST0FEQ0FTVCk7XG4gIH0pO1xufSk7XG5cbi8qKlxuICogUmVncmVzc2lvbiB0ZXN0cyBmb3IgV0NOLTU2MDogRVRDIFRyYW5zYWN0aW9uQnVpbGRlci50cmFuc2ZlcigpIG11c3QgcGFzcyBpc0ZpcnN0U2lnbmVyIHRvIHRoZVxuICogVHJhbnNmZXJCdWlsZGVyIHNvIHRoYXQgZnJvbSh0eEhleCwgdHJ1ZSkgY29ycmVjdGx5IGRlY29kZXMgZmlyc3Qtc2lnbmVyIGNhbGxkYXRhLCBhbmRcbiAqIGdldEhhbGZTaWduZWRUeEJ5Rmlyc3RTaWduZXIgcHJvZHVjZXMgYSB2YWxpZCBzZWNvbmQtc2lnbmVyIGhhbGYtc2lnbmVkIHR4IChpbnN0ZWFkIG9mIHRyZWF0aW5nXG4gKiB0aGUgQUJJIHN0cmluZy1vZmZzZXQgMHhDMCBhcyB0aGUgcmVjaXBpZW50IGFkZHJlc3MpLlxuICovXG5kZXNjcmliZSgnRVRDIGZpcnN0LXNpZ25lciByb3VuZC10cmlwIChXQ04tNTYwIHJlZ3Jlc3Npb24pJywgKCkgPT4ge1xuICBjb25zdCBjb250cmFjdEFkZHJlc3MgPSAnMHg3MDczYjgyYmUxZDkzMmM3MGFmZTUwNWUxZmUyMTE5MTZlOTc4YzM0JztcbiAgY29uc3QgcmVjaXBpZW50ID0gdGVzdERhdGEuQUNDT1VOVF8yOyAvLyAnMHgzM2ZmYWVmZmYyOTQ1NWZiY2IxZjdkZGFiYjZlZjQ4ZjRkZDg3NTM2J1xuICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMCc7XG4gIGNvbnN0IGV4cGlyZVRpbWUgPSAxNTkwMDY2NzI4O1xuICBjb25zdCBzZXF1ZW5jZUlkID0gNTtcbiAgY29uc3Qga2V5ID0gdGVzdERhdGEuS0VZUEFJUl9QUlYuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmc7XG5cbiAgLyoqIEJ1aWxkIGFuIHVuc2lnbmVkIGZpcnN0LXNpZ25lciB0eCB3aXRoIGtub3duIHBhcmFtZXRlcnMgYW5kIHJldHVybiBpdHMgaGV4LiAqL1xuICBhc3luYyBmdW5jdGlvbiBidWlsZEZpcnN0U2lnbmVyVHhIZXgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0ZXRjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMDAwMDAwMDAwJywgZ2FzTGltaXQ6ICcxMjEwMDAwMCcgfSk7XG4gICAgdHhCdWlsZGVyLmNvdW50ZXIoMik7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIHR4QnVpbGRlci5jb250cmFjdChjb250cmFjdEFkZHJlc3MpO1xuICAgIGNvbnN0IHRyYW5zZmVyID0gdHhCdWlsZGVyLnRyYW5zZmVyKCkgYXMgYW55O1xuICAgIHRyYW5zZmVyLmFtb3VudChhbW91bnQpLnRvKHJlY2lwaWVudCkuZXhwaXJhdGlvblRpbWUoZXhwaXJlVGltZSkuY29udHJhY3RTZXF1ZW5jZUlkKHNlcXVlbmNlSWQpLmtleShrZXkpO1xuICAgIHRyYW5zZmVyLmlzRmlyc3RTaWduZXIodHJ1ZSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICByZXR1cm4gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgfVxuXG4gIGl0KCdmcm9tKGZpcnN0U2lnbmVyVHhIZXgsIHRydWUpIGRlY29kZXMgcmVjaXBpZW50IGFuZCBhbW91bnQgY29ycmVjdGx5IChub3QgMHhDMCknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlyc3RTaWduZXJUeEhleCA9IGF3YWl0IGJ1aWxkRmlyc3RTaWduZXJUeEhleCgpO1xuXG4gICAgLy8gVGhpcyB3YXMgYnJva2VuIGJlZm9yZSB0aGUgZml4OiBFVEMncyB0cmFuc2ZlcigpIGRyb3BwZWQgaXNGaXJzdFNpZ25lciwgc28gdGhlXG4gICAgLy8gVHJhbnNmZXJCdWlsZGVyIGRlY29kZWQgdGhlIGZpcnN0LXNpZ25lciBBQkkgd2l0aCBzZWNvbmQtc2lnbmVyIG9mZnNldHMsIHByb2R1Y2luZ1xuICAgIC8vIGFkZHJlc3M9MHguLi4wMGMwICh0aGUgQUJJIGR5bmFtaWMtc3RyaW5nIG9mZnNldCkgaW5zdGVhZCBvZiB0aGUgcmVhbCByZWNpcGllbnQuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcigndGV0YycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICB0eEJ1aWxkZXIuZnJvbShmaXJzdFNpZ25lclR4SGV4LCB0cnVlKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0c1swXS5hZGRyZXNzLnRvTG93ZXJDYXNlKCksIHJlY2lwaWVudC50b0xvd2VyQ2FzZSgpKTtcbiAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0c1swXS52YWx1ZSwgYW1vdW50KTtcblxuICAgIC8vIEV4cGxpY2l0bHkgYXNzZXJ0IHRoZSBvbGQtYnVnIHZhbHVlIGlzIGFic2VudFxuICAgIHNob3VsZC5ub3RFcXVhbCh0eC5vdXRwdXRzWzBdLmFkZHJlc3MudG9Mb3dlckNhc2UoKSwgJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjMCcpO1xuICB9KTtcblxuICBpdCgnZnVsbCByb3VuZC10cmlwOiBmaXJzdC1zaWduZXIg4oaSIGFkZCBpbm5lciBzaWcg4oaSIHNlY29uZC1zaWduZXIgaGFsZi1zaWduZWQg4oaSIHZlcmlmeSByZWNpcGllbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlyc3RTaWduZXJUeEhleCA9IGF3YWl0IGJ1aWxkRmlyc3RTaWduZXJUeEhleCgpO1xuXG4gICAgLy8gU2ltdWxhdGUgZ2V0SGFsZlNpZ25lZFR4QnlGaXJzdFNpZ25lcjpcbiAgICAvLyAgIDEuIFBhcnNlIHRoZSBmaXJzdC1zaWduZXIgdHggKFRydXN0IEhTTSBpbnB1dClcbiAgICAvLyAgIDIuIEluamVjdCB0aGUgb3BlcmF0aW9uSGFzaFNpZyByZXR1cm5lZCBieSBUcnVzdFxuICAgIC8vICAgMy4gU3dpdGNoIHRvIHNlY29uZC1zaWduZXIgZW5jb2RpbmcgKHJlbW92ZXMgdGhlIG1ldGhvZC1pZCBwcmVmaXggc3RyaW5nKVxuICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RldGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyLmZyb20oZmlyc3RTaWduZXJUeEhleCwgdHJ1ZSk7XG4gICAgY29uc3QgdHJhbnNmZXIgPSB0eEJ1aWxkZXIudHJhbnNmZXIoKSBhcyBhbnk7XG4gICAgY29uc3QgbW9ja09wZXJhdGlvbkhhc2hTaWcgPSAnMHgnICsgJzFiJy5yZXBlYXQoNjUpOyAvLyA2NS1ieXRlIHNpZyBmcm9tIFRydXN0IEhTTVxuICAgIHRyYW5zZmVyLnNldFNpZ25hdHVyZShtb2NrT3BlcmF0aW9uSGFzaFNpZyk7XG4gICAgdHJhbnNmZXIuaXNGaXJzdFNpZ25lcihmYWxzZSk7XG4gICAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgaGFsZlNpZ25lZFR4SGV4ID0gaGFsZlNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAvLyBEaXJlY3QgY2FsbGRhdGEgZGVjb2RlIG11c3QgZ2l2ZSB0aGUgY29ycmVjdCByZWNpcGllbnQgYW5kIGFtb3VudFxuICAgIGNvbnN0IHsgdG8sIGFtb3VudDogZGVjb2RlZEFtb3VudCB9ID0gZGVjb2RlVHJhbnNmZXJEYXRhKGhhbGZTaWduZWRUeC50b0pzb24oKS5kYXRhKTtcbiAgICBzaG91bGQuZXF1YWwodG8udG9Mb3dlckNhc2UoKSwgcmVjaXBpZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgIHNob3VsZC5lcXVhbChkZWNvZGVkQW1vdW50LCBhbW91bnQpO1xuICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIG9sZCBidWc6IDB4QzAgaXMgdGhlIEFCSSBzdHJpbmcgb2Zmc2V0LCBOT1QgYSB2YWxpZCByZWNpcGllbnRcbiAgICBzaG91bGQubm90RXF1YWwodG8udG9Mb3dlckNhc2UoKSwgJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjMCcpO1xuXG4gICAgLy8gUmUtcGFyc2luZyB0aGUgaGFsZi1zaWduZWQgdHggYXMgc2Vjb25kLXNpZ25lciBtdXN0IGFsc28geWllbGQgY29ycmVjdCBvdXRwdXRzXG4gICAgY29uc3QgdmVyaWZ5QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RldGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdmVyaWZ5QnVpbGRlci5mcm9tKGhhbGZTaWduZWRUeEhleCk7XG4gICAgY29uc3QgdmVyaWZpZWRUeCA9IGF3YWl0IHZlcmlmeUJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwodmVyaWZpZWRUeC5vdXRwdXRzWzBdLmFkZHJlc3MudG9Mb3dlckNhc2UoKSwgcmVjaXBpZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgIHNob3VsZC5lcXVhbCh2ZXJpZmllZFR4Lm91dHB1dHNbMF0udmFsdWUsIGFtb3VudCk7XG4gIH0pO1xufSk7XG4iXX0=
|