@bitgo/sdk-coin-apt 2.6.2 → 2.6.4
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/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/resources/apt.d.ts +46 -0
- package/dist/test/resources/apt.d.ts.map +1 -0
- package/dist/test/resources/apt.js +105 -0
- package/dist/test/unit/apt.d.ts +2 -0
- package/dist/test/unit/apt.d.ts.map +1 -0
- package/dist/test/unit/apt.js +342 -0
- package/dist/test/unit/aptToken.d.ts +2 -0
- package/dist/test/unit/aptToken.d.ts.map +1 -0
- package/dist/test/unit/aptToken.js +92 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +71 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +743 -0
- package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.js +276 -0
- package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.js +449 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +529 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +108 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +12 -9
- package/.eslintignore +0 -4
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -352
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const getBuilderFactory_1 = require("../getBuilderFactory");
|
|
40
|
+
const statics_1 = require("@bitgo/statics");
|
|
41
|
+
const src_1 = require("../../../src");
|
|
42
|
+
const testData = __importStar(require("../../resources/apt"));
|
|
43
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
44
|
+
const should_1 = __importDefault(require("should"));
|
|
45
|
+
const fungibleAssetTransfer_1 = require("../../../src/lib/transaction/fungibleAssetTransfer");
|
|
46
|
+
describe('Apt Token Transfer Builder', () => {
|
|
47
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tapt:usdt');
|
|
48
|
+
describe('Succeed', () => {
|
|
49
|
+
it('should build a token transfer', async function () {
|
|
50
|
+
const fungibleTokenTransfer = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt:usdt'));
|
|
51
|
+
const txBuilder = factory.getFungibleAssetTransactionBuilder(fungibleTokenTransfer);
|
|
52
|
+
txBuilder.sender(testData.sender2.address);
|
|
53
|
+
txBuilder.recipients([testData.fungibleTokenRecipients[0]]);
|
|
54
|
+
txBuilder.gasData({
|
|
55
|
+
maxGasAmount: 200000,
|
|
56
|
+
gasUnitPrice: 100,
|
|
57
|
+
});
|
|
58
|
+
txBuilder.assetId(testData.fungibleTokenAddress.usdt);
|
|
59
|
+
txBuilder.sequenceNumber(14);
|
|
60
|
+
txBuilder.expirationTime(1736246155);
|
|
61
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
62
|
+
const tx = (await txBuilder.build());
|
|
63
|
+
should_1.default.equal(tx.sender, testData.sender2.address);
|
|
64
|
+
should_1.default.equal(tx.recipients[0].address, testData.fungibleTokenRecipients[0].address);
|
|
65
|
+
should_1.default.equal(tx.recipient.address, testData.fungibleTokenRecipients[0].address);
|
|
66
|
+
should_1.default.equal(tx.recipients[0].amount, testData.fungibleTokenRecipients[0].amount);
|
|
67
|
+
should_1.default.equal(tx.recipient.amount, testData.fungibleTokenRecipients[0].amount);
|
|
68
|
+
should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
|
|
69
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
70
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
71
|
+
should_1.default.equal(tx.sequenceNumber, 14);
|
|
72
|
+
should_1.default.equal(tx.expirationTime, 1736246155);
|
|
73
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
|
|
74
|
+
tx.inputs.length.should.equal(1);
|
|
75
|
+
tx.inputs[0].should.deepEqual({
|
|
76
|
+
address: testData.sender2.address,
|
|
77
|
+
value: testData.fungibleTokenRecipients[0].amount,
|
|
78
|
+
coin: 'tapt:usdt',
|
|
79
|
+
});
|
|
80
|
+
tx.outputs.length.should.equal(1);
|
|
81
|
+
tx.outputs[0].should.deepEqual({
|
|
82
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
83
|
+
value: testData.fungibleTokenRecipients[0].amount,
|
|
84
|
+
coin: 'tapt:usdt',
|
|
85
|
+
});
|
|
86
|
+
const rawTx = tx.toBroadcastFormat();
|
|
87
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
88
|
+
rawTx.should.equal('0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d03000000000064000000000000008b037d670000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
|
|
89
|
+
});
|
|
90
|
+
it('should build and send a signed tx', async function () {
|
|
91
|
+
const txBuilder = factory.from(testData.FUNGIBLE_TOKEN_TRANSFER);
|
|
92
|
+
const tx = (await txBuilder.build());
|
|
93
|
+
tx.inputs.length.should.equal(1);
|
|
94
|
+
tx.inputs[0].should.deepEqual({
|
|
95
|
+
address: testData.sender2.address,
|
|
96
|
+
value: testData.fungibleTokenRecipients[0].amount,
|
|
97
|
+
coin: 'tapt:usdt',
|
|
98
|
+
});
|
|
99
|
+
tx.outputs.length.should.equal(1);
|
|
100
|
+
tx.outputs[0].should.deepEqual({
|
|
101
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
102
|
+
value: testData.fungibleTokenRecipients[0].amount,
|
|
103
|
+
coin: 'tapt:usdt',
|
|
104
|
+
});
|
|
105
|
+
should_1.default.equal(tx.id, '0x271da92f3dcd673a0bd28d26f8b49c1f0c6ead0f5be0fbab3e9412972e96d80b');
|
|
106
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
107
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
108
|
+
should_1.default.equal(tx.sequenceNumber, 167);
|
|
109
|
+
should_1.default.equal(tx.expirationTime, 1737893604);
|
|
110
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
|
|
111
|
+
const rawTx = tx.toBroadcastFormat();
|
|
112
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
113
|
+
should_1.default.equal(rawTx, testData.FUNGIBLE_TOKEN_TRANSFER);
|
|
114
|
+
});
|
|
115
|
+
it('should succeed to validate a valid signablePayload', async function () {
|
|
116
|
+
const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
|
|
117
|
+
const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
|
|
118
|
+
txBuilder.sender(testData.sender2.address);
|
|
119
|
+
txBuilder.recipients([testData.fungibleTokenRecipients[0]]);
|
|
120
|
+
txBuilder.gasData({
|
|
121
|
+
maxGasAmount: 200000,
|
|
122
|
+
gasUnitPrice: 100,
|
|
123
|
+
});
|
|
124
|
+
txBuilder.sequenceNumber(14);
|
|
125
|
+
txBuilder.expirationTime(1736246155);
|
|
126
|
+
txBuilder.assetId(testData.fungibleTokenAddress.usdt);
|
|
127
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
128
|
+
const tx = (await txBuilder.build());
|
|
129
|
+
const signablePayload = tx.signablePayload;
|
|
130
|
+
should_1.default.equal(signablePayload.toString('hex'), '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
|
|
131
|
+
});
|
|
132
|
+
it('should build a unsigned tx and validate its toJson', async function () {
|
|
133
|
+
const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
|
|
134
|
+
const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
|
|
135
|
+
txBuilder.sender(testData.sender2.address);
|
|
136
|
+
txBuilder.recipients([testData.fungibleTokenRecipients[0]]);
|
|
137
|
+
txBuilder.gasData({
|
|
138
|
+
maxGasAmount: 200000,
|
|
139
|
+
gasUnitPrice: 100,
|
|
140
|
+
});
|
|
141
|
+
txBuilder.sequenceNumber(14);
|
|
142
|
+
txBuilder.expirationTime(1736246155);
|
|
143
|
+
txBuilder.assetId(testData.fungibleTokenAddress.usdt);
|
|
144
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
145
|
+
const tx = (await txBuilder.build());
|
|
146
|
+
const toJson = tx.toJson();
|
|
147
|
+
should_1.default.equal(toJson.sender, testData.sender2.address);
|
|
148
|
+
should_1.default.deepEqual(toJson.recipients, [
|
|
149
|
+
{
|
|
150
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
151
|
+
amount: testData.fungibleTokenRecipients[0].amount,
|
|
152
|
+
},
|
|
153
|
+
]);
|
|
154
|
+
should_1.default.deepEqual(toJson.recipient, {
|
|
155
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
156
|
+
amount: testData.fungibleTokenRecipients[0].amount,
|
|
157
|
+
});
|
|
158
|
+
should_1.default.equal(toJson.sequenceNumber, 14);
|
|
159
|
+
should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
|
|
160
|
+
should_1.default.equal(toJson.maxGasAmount, 200000);
|
|
161
|
+
should_1.default.equal(toJson.gasUnitPrice, 100);
|
|
162
|
+
should_1.default.equal(toJson.expirationTime, 1736246155);
|
|
163
|
+
should_1.default.equal(toJson.feePayer, testData.feePayer.address);
|
|
164
|
+
});
|
|
165
|
+
it('should build a signed tx and validate its toJson', async function () {
|
|
166
|
+
const txBuilder = factory.from(testData.FUNGIBLE_TOKEN_TRANSFER);
|
|
167
|
+
const tx = (await txBuilder.build());
|
|
168
|
+
const toJson = tx.toJson();
|
|
169
|
+
should_1.default.equal(toJson.id, '0x271da92f3dcd673a0bd28d26f8b49c1f0c6ead0f5be0fbab3e9412972e96d80b');
|
|
170
|
+
should_1.default.equal(toJson.sender, testData.sender2.address);
|
|
171
|
+
should_1.default.deepEqual(toJson.recipients, [
|
|
172
|
+
{
|
|
173
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
174
|
+
amount: testData.fungibleTokenRecipients[0].amount.toString(),
|
|
175
|
+
},
|
|
176
|
+
]);
|
|
177
|
+
should_1.default.deepEqual(toJson.recipient, {
|
|
178
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
179
|
+
amount: testData.fungibleTokenRecipients[0].amount.toString(),
|
|
180
|
+
});
|
|
181
|
+
should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
|
|
182
|
+
should_1.default.equal(toJson.sequenceNumber, 167);
|
|
183
|
+
should_1.default.equal(toJson.maxGasAmount, 200000);
|
|
184
|
+
should_1.default.equal(toJson.gasUnitPrice, 100);
|
|
185
|
+
should_1.default.equal(toJson.expirationTime, 1737893604);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('Fail', () => {
|
|
189
|
+
it('should fail for invalid sender', async function () {
|
|
190
|
+
const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
|
|
191
|
+
const builder = factory.getTransferBuilder(transaction);
|
|
192
|
+
(0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid address randomString');
|
|
193
|
+
});
|
|
194
|
+
it('should fail for invalid recipient', async function () {
|
|
195
|
+
const builder = factory.getTransferBuilder();
|
|
196
|
+
(0, should_1.default)(() => builder.recipients([testData.invalidRecipients[0]])).throwError('Invalid address randomString');
|
|
197
|
+
(0, should_1.default)(() => builder.recipients([testData.invalidRecipients[1]])).throwError('Value cannot be less than zero');
|
|
198
|
+
(0, should_1.default)(() => builder.recipients([testData.invalidRecipients[2]])).throwError('Invalid amount format');
|
|
199
|
+
});
|
|
200
|
+
it('should fail for invalid gas amount', async function () {
|
|
201
|
+
const builder = factory.getTransferBuilder();
|
|
202
|
+
(0, should_1.default)(() => builder.gasData({ maxGasAmount: -1, gasUnitPrice: 100 })).throwError('Value cannot be less than zero');
|
|
203
|
+
(0, should_1.default)(() => builder.gasData({ maxGasAmount: 200000, gasUnitPrice: -1 })).throwError('Value cannot be less than zero');
|
|
204
|
+
});
|
|
205
|
+
it('should fail for invalid fungible token address', async function () {
|
|
206
|
+
const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
|
|
207
|
+
const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
|
|
208
|
+
(0, should_1.default)(() => txBuilder.assetId('randomString')).throwError('Invalid address randomString');
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
describe('should test for deprecated field recipient in building transaction, without usage of recipients', () => {
|
|
212
|
+
it('should build a token transfer', async function () {
|
|
213
|
+
const fungibleTokenTransfer = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt:usdt'));
|
|
214
|
+
const txBuilder = factory.getFungibleAssetTransactionBuilder(fungibleTokenTransfer);
|
|
215
|
+
txBuilder.sender(testData.sender2.address);
|
|
216
|
+
txBuilder.recipient(testData.fungibleTokenRecipients[0]);
|
|
217
|
+
txBuilder.gasData({
|
|
218
|
+
maxGasAmount: 200000,
|
|
219
|
+
gasUnitPrice: 100,
|
|
220
|
+
});
|
|
221
|
+
txBuilder.assetId(testData.fungibleTokenAddress.usdt);
|
|
222
|
+
txBuilder.sequenceNumber(14);
|
|
223
|
+
txBuilder.expirationTime(1736246155);
|
|
224
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
225
|
+
const tx = (await txBuilder.build());
|
|
226
|
+
should_1.default.equal(tx.sender, testData.sender2.address);
|
|
227
|
+
should_1.default.equal(tx.recipient.address, testData.fungibleTokenRecipients[0].address);
|
|
228
|
+
should_1.default.equal(tx.recipient.amount, testData.fungibleTokenRecipients[0].amount);
|
|
229
|
+
should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
|
|
230
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
231
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
232
|
+
should_1.default.equal(tx.sequenceNumber, 14);
|
|
233
|
+
should_1.default.equal(tx.expirationTime, 1736246155);
|
|
234
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
|
|
235
|
+
tx.inputs.length.should.equal(1);
|
|
236
|
+
tx.inputs[0].should.deepEqual({
|
|
237
|
+
address: testData.sender2.address,
|
|
238
|
+
value: testData.fungibleTokenRecipients[0].amount,
|
|
239
|
+
coin: 'tapt:usdt',
|
|
240
|
+
});
|
|
241
|
+
tx.outputs.length.should.equal(1);
|
|
242
|
+
tx.outputs[0].should.deepEqual({
|
|
243
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
244
|
+
value: testData.fungibleTokenRecipients[0].amount,
|
|
245
|
+
coin: 'tapt:usdt',
|
|
246
|
+
});
|
|
247
|
+
const rawTx = tx.toBroadcastFormat();
|
|
248
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
249
|
+
rawTx.should.equal('0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d03000000000064000000000000008b037d670000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
|
|
250
|
+
const toJson = tx.toJson();
|
|
251
|
+
should_1.default.equal(toJson.sender, testData.sender2.address);
|
|
252
|
+
should_1.default.deepEqual(toJson.recipient, {
|
|
253
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
254
|
+
amount: testData.fungibleTokenRecipients[0].amount,
|
|
255
|
+
});
|
|
256
|
+
should_1.default.equal(toJson.sequenceNumber, 14);
|
|
257
|
+
should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
|
|
258
|
+
should_1.default.equal(toJson.maxGasAmount, 200000);
|
|
259
|
+
should_1.default.equal(toJson.gasUnitPrice, 100);
|
|
260
|
+
should_1.default.equal(toJson.expirationTime, 1736246155);
|
|
261
|
+
should_1.default.equal(toJson.feePayer, testData.feePayer.address);
|
|
262
|
+
});
|
|
263
|
+
it('should build and send a signed tx', async function () {
|
|
264
|
+
const txBuilder = factory.from(testData.FUNGIBLE_TOKEN_TRANSFER);
|
|
265
|
+
const tx = (await txBuilder.build());
|
|
266
|
+
tx.inputs.length.should.equal(1);
|
|
267
|
+
tx.inputs[0].should.deepEqual({
|
|
268
|
+
address: testData.sender2.address,
|
|
269
|
+
value: testData.fungibleTokenRecipients[0].amount,
|
|
270
|
+
coin: 'tapt:usdt',
|
|
271
|
+
});
|
|
272
|
+
tx.outputs.length.should.equal(1);
|
|
273
|
+
tx.outputs[0].should.deepEqual({
|
|
274
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
275
|
+
value: testData.fungibleTokenRecipients[0].amount,
|
|
276
|
+
coin: 'tapt:usdt',
|
|
277
|
+
});
|
|
278
|
+
should_1.default.equal(tx.id, '0x271da92f3dcd673a0bd28d26f8b49c1f0c6ead0f5be0fbab3e9412972e96d80b');
|
|
279
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
280
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
281
|
+
should_1.default.equal(tx.sequenceNumber, 167);
|
|
282
|
+
should_1.default.equal(tx.expirationTime, 1737893604);
|
|
283
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
|
|
284
|
+
const rawTx = tx.toBroadcastFormat();
|
|
285
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
286
|
+
should_1.default.equal(rawTx, testData.FUNGIBLE_TOKEN_TRANSFER);
|
|
287
|
+
const toJson = tx.toJson();
|
|
288
|
+
should_1.default.equal(toJson.id, '0x271da92f3dcd673a0bd28d26f8b49c1f0c6ead0f5be0fbab3e9412972e96d80b');
|
|
289
|
+
should_1.default.equal(toJson.sender, testData.sender2.address);
|
|
290
|
+
should_1.default.deepEqual(toJson.recipient, {
|
|
291
|
+
address: testData.fungibleTokenRecipients[0].address,
|
|
292
|
+
amount: testData.fungibleTokenRecipients[0].amount.toString(),
|
|
293
|
+
});
|
|
294
|
+
should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
|
|
295
|
+
should_1.default.equal(toJson.sequenceNumber, 167);
|
|
296
|
+
should_1.default.equal(toJson.maxGasAmount, 200000);
|
|
297
|
+
should_1.default.equal(toJson.gasUnitPrice, 100);
|
|
298
|
+
should_1.default.equal(toJson.expirationTime, 1737893604);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
describe('Batch Transfer', () => {
|
|
302
|
+
it('should build a token transfer', async function () {
|
|
303
|
+
const fungibleTokenTransfer = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt:usdt'));
|
|
304
|
+
const txBuilder = factory.getFungibleAssetTransactionBuilder(fungibleTokenTransfer);
|
|
305
|
+
txBuilder.sender(testData.sender2.address);
|
|
306
|
+
txBuilder.recipients(testData.batchFungibleRecipients);
|
|
307
|
+
txBuilder.gasData({
|
|
308
|
+
maxGasAmount: 200000,
|
|
309
|
+
gasUnitPrice: 100,
|
|
310
|
+
});
|
|
311
|
+
txBuilder.assetId(testData.fungibleTokenAddress.usdt);
|
|
312
|
+
txBuilder.sequenceNumber(14);
|
|
313
|
+
txBuilder.expirationTime(1736246155);
|
|
314
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
315
|
+
const tx = (await txBuilder.build());
|
|
316
|
+
should_1.default.equal(tx.sender, testData.sender2.address);
|
|
317
|
+
should_1.default.equal(tx.recipients[0].address, testData.batchFungibleRecipients[0].address);
|
|
318
|
+
should_1.default.equal(tx.recipients[1].address, testData.batchFungibleRecipients[1].address);
|
|
319
|
+
should_1.default.equal(tx.recipients[0].amount, testData.batchFungibleRecipients[0].amount);
|
|
320
|
+
should_1.default.equal(tx.recipients[1].amount, testData.batchFungibleRecipients[1].amount);
|
|
321
|
+
should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
|
|
322
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
323
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
324
|
+
should_1.default.equal(tx.sequenceNumber, 14);
|
|
325
|
+
should_1.default.equal(tx.expirationTime, 1736246155);
|
|
326
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
|
|
327
|
+
tx.inputs.length.should.equal(1);
|
|
328
|
+
tx.inputs[0].should.deepEqual({
|
|
329
|
+
address: testData.sender2.address,
|
|
330
|
+
value: (Number(testData.batchFungibleRecipients[0].amount) + Number(testData.batchFungibleRecipients[1].amount)).toString(),
|
|
331
|
+
coin: 'tapt:usdt',
|
|
332
|
+
});
|
|
333
|
+
tx.outputs.length.should.equal(2);
|
|
334
|
+
tx.outputs[0].should.deepEqual({
|
|
335
|
+
address: testData.batchFungibleRecipients[0].address,
|
|
336
|
+
value: testData.batchFungibleRecipients[0].amount,
|
|
337
|
+
coin: 'tapt:usdt',
|
|
338
|
+
});
|
|
339
|
+
tx.outputs[1].should.deepEqual({
|
|
340
|
+
address: testData.batchFungibleRecipients[1].address,
|
|
341
|
+
value: testData.batchFungibleRecipients[1].amount,
|
|
342
|
+
coin: 'tapt:usdt',
|
|
343
|
+
});
|
|
344
|
+
const rawTx = tx.toBroadcastFormat();
|
|
345
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
346
|
+
rawTx.should.equal(testData.FUNGIBLE_BATCH_RAW_TX_HEX);
|
|
347
|
+
});
|
|
348
|
+
it('should succeed to validate a valid signablePayload', async function () {
|
|
349
|
+
const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
|
|
350
|
+
const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
|
|
351
|
+
txBuilder.sender(testData.sender2.address);
|
|
352
|
+
txBuilder.recipients(testData.batchFungibleRecipients);
|
|
353
|
+
txBuilder.gasData({
|
|
354
|
+
maxGasAmount: 200000,
|
|
355
|
+
gasUnitPrice: 100,
|
|
356
|
+
});
|
|
357
|
+
txBuilder.sequenceNumber(14);
|
|
358
|
+
txBuilder.expirationTime(1736246155);
|
|
359
|
+
txBuilder.assetId(testData.fungibleTokenAddress.usdt);
|
|
360
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
361
|
+
const tx = (await txBuilder.build());
|
|
362
|
+
const signablePayload = tx.signablePayload;
|
|
363
|
+
should_1.default.equal(signablePayload.toString('hex'), testData.FUNGIBLE_BATCH_SIGNABLE_PAYLOAD);
|
|
364
|
+
});
|
|
365
|
+
it('should build a unsigned tx and validate its toJson', async function () {
|
|
366
|
+
const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
|
|
367
|
+
const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
|
|
368
|
+
txBuilder.sender(testData.sender2.address);
|
|
369
|
+
txBuilder.recipients(testData.batchFungibleRecipients);
|
|
370
|
+
txBuilder.gasData({
|
|
371
|
+
maxGasAmount: 200000,
|
|
372
|
+
gasUnitPrice: 100,
|
|
373
|
+
});
|
|
374
|
+
txBuilder.sequenceNumber(14);
|
|
375
|
+
txBuilder.expirationTime(1736246155);
|
|
376
|
+
txBuilder.assetId(testData.fungibleTokenAddress.usdt);
|
|
377
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
378
|
+
const tx = (await txBuilder.build());
|
|
379
|
+
const toJson = tx.toJson();
|
|
380
|
+
should_1.default.equal(toJson.sender, testData.sender2.address);
|
|
381
|
+
should_1.default.deepEqual(toJson.recipients, [
|
|
382
|
+
{
|
|
383
|
+
address: testData.batchFungibleRecipients[0].address,
|
|
384
|
+
amount: testData.batchFungibleRecipients[0].amount,
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
address: testData.batchFungibleRecipients[1].address,
|
|
388
|
+
amount: testData.batchFungibleRecipients[1].amount,
|
|
389
|
+
},
|
|
390
|
+
]);
|
|
391
|
+
should_1.default.deepEqual(toJson.recipient, {
|
|
392
|
+
address: testData.batchFungibleRecipients[0].address,
|
|
393
|
+
amount: testData.batchFungibleRecipients[0].amount,
|
|
394
|
+
});
|
|
395
|
+
should_1.default.equal(toJson.sequenceNumber, 14);
|
|
396
|
+
should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
|
|
397
|
+
should_1.default.equal(toJson.maxGasAmount, 200000);
|
|
398
|
+
should_1.default.equal(toJson.gasUnitPrice, 100);
|
|
399
|
+
should_1.default.equal(toJson.expirationTime, 1736246155);
|
|
400
|
+
should_1.default.equal(toJson.feePayer, testData.feePayer.address);
|
|
401
|
+
});
|
|
402
|
+
it('should build a signed tx and validate its toJson', async function () {
|
|
403
|
+
const txBuilder = factory.from(testData.FUNGIBLE_BATCH_TRANSFER);
|
|
404
|
+
const tx = (await txBuilder.build());
|
|
405
|
+
should_1.default.equal(tx.inputs[0].address, '0xc8f02d25aa698b3e9fbd8a08e8da4c8ee261832a25a4cde8731b5ec356537d09');
|
|
406
|
+
should_1.default.equal(tx.inputs[0].value, '2');
|
|
407
|
+
should_1.default.equal(tx.outputs[0].address, '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849');
|
|
408
|
+
should_1.default.equal(tx.outputs[0].value, '1');
|
|
409
|
+
should_1.default.equal(tx.outputs[1].address, '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932');
|
|
410
|
+
should_1.default.equal(tx.outputs[1].value, '1');
|
|
411
|
+
should_1.default.equal(tx.maxGasAmount, 200000);
|
|
412
|
+
should_1.default.equal(tx.gasUnitPrice, 100);
|
|
413
|
+
should_1.default.equal(tx.gasUsed, 0);
|
|
414
|
+
should_1.default.equal(tx.expirationTime, 1869289760000);
|
|
415
|
+
should_1.default.equal(tx.sequenceNumber, 81);
|
|
416
|
+
should_1.default.equal(tx.sender, '0xc8f02d25aa698b3e9fbd8a08e8da4c8ee261832a25a4cde8731b5ec356537d09');
|
|
417
|
+
should_1.default.equal(tx.recipients[0].address, '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849');
|
|
418
|
+
should_1.default.equal(tx.recipients[0].amount, '1');
|
|
419
|
+
should_1.default.equal(tx.recipients[1].address, '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932');
|
|
420
|
+
should_1.default.equal(tx.recipients[1].amount, '1');
|
|
421
|
+
should_1.default.equal(tx.feePayerAddress, '0xdbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
|
|
422
|
+
const toJson = tx.toJson();
|
|
423
|
+
should_1.default.equal(toJson.id, '0xf781e531a20d9b1b80eab6402a44dfca81c7a196accf350c974d627ac2e52f9a');
|
|
424
|
+
should_1.default.equal(toJson.sender, '0xc8f02d25aa698b3e9fbd8a08e8da4c8ee261832a25a4cde8731b5ec356537d09');
|
|
425
|
+
should_1.default.deepEqual(toJson.recipients, [
|
|
426
|
+
{
|
|
427
|
+
address: '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849',
|
|
428
|
+
amount: '1',
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
address: '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932',
|
|
432
|
+
amount: '1',
|
|
433
|
+
},
|
|
434
|
+
]);
|
|
435
|
+
should_1.default.deepEqual(toJson.recipient, {
|
|
436
|
+
address: '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849',
|
|
437
|
+
amount: '1',
|
|
438
|
+
});
|
|
439
|
+
should_1.default.equal(toJson.sequenceNumber, 81);
|
|
440
|
+
should_1.default.equal(toJson.maxGasAmount, 200000);
|
|
441
|
+
should_1.default.equal(toJson.gasUnitPrice, 100);
|
|
442
|
+
should_1.default.equal(toJson.gasUsed, 0);
|
|
443
|
+
should_1.default.equal(toJson.expirationTime, 1869289760000);
|
|
444
|
+
should_1.default.equal(toJson.feePayer, '0xdbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
|
|
445
|
+
should_1.default.equal(toJson.assetId, '0xd5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e38192050');
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuZ2libGVBc3NldFRyYW5zZmVyQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvZnVuZ2libGVBc3NldFRyYW5zZmVyQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDREQUF5RDtBQUN6RCw0Q0FBdUM7QUFDdkMsc0NBQW1EO0FBQ25ELDhEQUFnRDtBQUNoRCw4Q0FBa0Q7QUFDbEQsb0RBQTRCO0FBQzVCLDhGQUEyRjtBQUUzRixRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsV0FBVyxDQUFDLENBQUM7SUFFL0MsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLCtCQUErQixFQUFFLEtBQUs7WUFDdkMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLDZDQUFxQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNoRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsa0NBQWtDLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNwRixTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDaEIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLFlBQVksRUFBRSxHQUFHO2FBQ2xCLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RE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Z0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNuRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLG9FQUFvRSxDQUFDLENBQUM7WUFDcEcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO1FBQ3JHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9hcHQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEZ1bmdpYmxlQXNzZXRUcmFuc2ZlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24vZnVuZ2libGVBc3NldFRyYW5zZmVyJztcblxuZGVzY3JpYmUoJ0FwdCBUb2tlbiBUcmFuc2ZlciBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3RhcHQ6dXNkdCcpO1xuXG4gIGRlc2NyaWJlKCdTdWNjZWVkJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0b2tlbiB0cmFuc2ZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZ1bmdpYmxlVG9rZW5UcmFuc2ZlciA9IG5ldyBGdW5naWJsZUFzc2V0VHJhbnNmZXIoY29pbnMuZ2V0KCd0YXB0OnVzZHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEZ1bmdpYmxlQXNzZXRUcmFuc2FjdGlvbkJ1aWxkZXIoZnVuZ2libGVUb2tlblRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKFt0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5hc3NldElkKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgRnVuZ2libGVBc3NldFRyYW5zZmVyO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudC5hZGRyZXNzLCB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzBdLmFtb3VudCwgdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYW1vdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnQuYW1vdW50LCB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmFzc2V0SWQsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VxdWVuY2VOdW1iZXIsIDE0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmRUb2tlbik7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndGFwdDp1c2R0JyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQ6dXNkdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICcweDFhZWQ4MDg5MTZhYjliMWIzMGIwN2FiYjUzNTYxYWZkNDY4NDcyODVjZTI4NjUxMjIxZDQwNjE3M2EzNzI0NDkwZTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTY3MDcyNjk2ZDYxNzI3OTVmNjY3NTZlNjc2OTYyNmM2NTVmNzM3NDZmNzI2NTA4NzQ3MjYxNmU3MzY2NjU3MjAxMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMGU2Njc1NmU2NzY5NjI2YzY1NWY2MTczNzM2NTc0MDg0ZDY1NzQ2MTY0NjE3NDYxMDAwMzIwZDVkMGQ1NjE0OTNlYTJiOTQxMGY2N2RhODA0NjUzYWU0NGU3OTNjMjQyMzcwN2Q0ZjExZWRiMmUzODE5MjA1MDIwZjc0MDVjMjhhMDJjZjViYWI0ZWE0NDk4MjQwYmIzNTc5ZGI0NTk1MTc5NGViMWM4NDNiZWYwNTM0YzA5M2FkOTA4MDEwMDAwMDAwMDAwMDAwMDQwMGQwMzAwMDAwMDAwMDA2NDAwMDAwMDAwMDAwMDAwOGIwMzdkNjcwMDAwMDAwMDAyMDMwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZGJjODdhMWM4MTZkOWJjZDA2YjY4M2MzN2U4MGM3MTYyZTRkNDhkYTc4MTIxOThiODMwZTRkNWQ4ZTA2MjlmMjAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzZW5kIGEgc2lnbmVkIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLkZVTkdJQkxFX1RPS0VOX1RSQU5TRkVSKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBGdW5naWJsZUFzc2V0VHJhbnNmZXI7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndGFwdDp1c2R0JyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQ6dXNkdCcsXG4gICAgICB9KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pZCwgJzB4MjcxZGE5MmYzZGNkNjczYTBiZDI4ZDI2ZjhiNDljMWYwYzZlYWQwZjViZTBmYmFiM2U5NDEyOTcyZTk2ZDgwYicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VxdWVuY2VOdW1iZXIsIDE2Nyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3Mzc4OTM2MDQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW4pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuRlVOR0lCTEVfVE9LRU5fVFJBTlNGRVIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIGEgdmFsaWQgc2lnbmFibGVQYXlsb2FkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgRnVuZ2libGVBc3NldFRyYW5zZmVyKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0RnVuZ2libGVBc3NldFRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyhbdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF1dKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgdHhCdWlsZGVyLmFzc2V0SWQodGVzdERhdGEuZnVuZ2libGVUb2tlbkFkZHJlc3MudXNkdCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEZ1bmdpYmxlQXNzZXRUcmFuc2ZlcjtcbiAgICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgJzVlZmEzYzRmMDJmODNhMGY0YjJkNjlmYzk1YzYwN2NjMDI4MjVjYzRlN2JlNTM2ZWYwOTkyZGYwNTBkOWU2N2MwMTFhZWQ4MDg5MTZhYjliMWIzMGIwN2FiYjUzNTYxYWZkNDY4NDcyODVjZTI4NjUxMjIxZDQwNjE3M2EzNzI0NDkwZTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTY3MDcyNjk2ZDYxNzI3OTVmNjY3NTZlNjc2OTYyNmM2NTVmNzM3NDZmNzI2NTA4NzQ3MjYxNmU3MzY2NjU3MjAxMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMGU2Njc1NmU2NzY5NjI2YzY1NWY2MTczNzM2NTc0MDg0ZDY1NzQ2MTY0NjE3NDYxMDAwMzIwZDVkMGQ1NjE0OTNlYTJiOTQxMGY2N2RhODA0NjUzYWU0NGU3OTNjMjQyMzcwN2Q0ZjExZWRiMmUzODE5MjA1MDIwZjc0MDVjMjhhMDJjZjViYWI0ZWE0NDk4MjQwYmIzNTc5ZGI0NTk1MTc5NGViMWM4NDNiZWYwNTM0YzA5M2FkOTA4MDEwMDAwMDAwMDAwMDAwMDQwMGQwMzAwMDAwMDAwMDA2NDAwMDAwMDAwMDAwMDAwOGIwMzdkNjcwMDAwMDAwMDAyMDBkYmM4N2ExYzgxNmQ5YmNkMDZiNjgzYzM3ZTgwYzcxNjJlNGQ0OGRhNzgxMjE5OGI4MzBlNGQ1ZDhlMDYyOWYyJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB1bnNpZ25lZCB0eCBhbmQgdmFsaWRhdGUgaXRzIHRvSnNvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEZ1bmdpYmxlQXNzZXRUcmFuc2Zlcihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEZ1bmdpYmxlQXNzZXRUcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHMoW3Rlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdXSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgIHR4QnVpbGRlci5hc3NldElkKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBGdW5naWJsZUFzc2V0VHJhbnNmZXI7XG4gICAgICBjb25zdCB0b0pzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0b0pzb24ucmVjaXBpZW50cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0b0pzb24ucmVjaXBpZW50LCB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguYXNzZXRJZCwgdGVzdERhdGEuZnVuZ2libGVUb2tlbkFkZHJlc3MudXNkdCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmZlZVBheWVyLCB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgdHggYW5kIHZhbGlkYXRlIGl0cyB0b0pzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuRlVOR0lCTEVfVE9LRU5fVFJBTlNGRVIpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEZ1bmdpYmxlQXNzZXRUcmFuc2ZlcjtcbiAgICAgIGNvbnN0IHRvSnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5pZCwgJzB4MjcxZGE5MmYzZGNkNjczYTBiZDI4ZDI2ZjhiNDljMWYwYzZlYWQwZjViZTBmYmFiM2U5NDEyOTcyZTk2ZDgwYicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudCwge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguYXNzZXRJZCwgdGVzdERhdGEuZnVuZ2libGVUb2tlbkFkZHJlc3MudXNkdCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCAxNjcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZXhwaXJhdGlvblRpbWUsIDE3Mzc4OTM2MDQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRmFpbCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgc2VuZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuc2VuZGVyKCdyYW5kb21TdHJpbmcnKSkudGhyb3dFcnJvcignSW52YWxpZCBhZGRyZXNzIHJhbmRvbVN0cmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHJlY2lwaWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIucmVjaXBpZW50cyhbdGVzdERhdGEuaW52YWxpZFJlY2lwaWVudHNbMF1dKSkudGhyb3dFcnJvcignSW52YWxpZCBhZGRyZXNzIHJhbmRvbVN0cmluZycpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIucmVjaXBpZW50cyhbdGVzdERhdGEuaW52YWxpZFJlY2lwaWVudHNbMV1dKSkudGhyb3dFcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5yZWNpcGllbnRzKFt0ZXN0RGF0YS5pbnZhbGlkUmVjaXBpZW50c1syXV0pKS50aHJvd0Vycm9yKCdJbnZhbGlkIGFtb3VudCBmb3JtYXQnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgZ2FzIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuZ2FzRGF0YSh7IG1heEdhc0Ftb3VudDogLTEsIGdhc1VuaXRQcmljZTogMTAwIH0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJ1xuICAgICAgKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmdhc0RhdGEoeyBtYXhHYXNBbW91bnQ6IDIwMDAwMCwgZ2FzVW5pdFByaWNlOiAtMSB9KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybydcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGZ1bmdpYmxlIHRva2VuIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBGdW5naWJsZUFzc2V0VHJhbnNmZXIoY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRGdW5naWJsZUFzc2V0VHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYXNzZXRJZCgncmFuZG9tU3RyaW5nJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCB0ZXN0IGZvciBkZXByZWNhdGVkIGZpZWxkIHJlY2lwaWVudCBpbiBidWlsZGluZyB0cmFuc2FjdGlvbiwgd2l0aG91dCB1c2FnZSBvZiByZWNpcGllbnRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0b2tlbiB0cmFuc2ZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZ1bmdpYmxlVG9rZW5UcmFuc2ZlciA9IG5ldyBGdW5naWJsZUFzc2V0VHJhbnNmZXIoY29pbnMuZ2V0KCd0YXB0OnVzZHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEZ1bmdpYmxlQXNzZXRUcmFuc2FjdGlvbkJ1aWxkZXIoZnVuZ2libGVUb2tlblRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnQodGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5hc3NldElkKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgRnVuZ2libGVBc3NldFRyYW5zZmVyO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnQuYWRkcmVzcywgdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50LmFtb3VudCwgdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYW1vdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5hc3NldElkLCB0ZXN0RGF0YS5mdW5naWJsZVRva2VuQWRkcmVzcy51c2R0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW4pO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQ6dXNkdCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXB0OnVzZHQnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMHgxYWVkODA4OTE2YWI5YjFiMzBiMDdhYmI1MzU2MWFmZDQ2ODQ3Mjg1Y2UyODY1MTIyMWQ0MDYxNzNhMzcyNDQ5MGUwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTE2NzA3MjY5NmQ2MTcyNzk1ZjY2NzU2ZTY3Njk2MjZjNjU1ZjczNzQ2ZjcyNjUwODc0NzI2MTZlNzM2NjY1NzIwMTA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBlNjY3NTZlNjc2OTYyNmM2NTVmNjE3MzczNjU3NDA4NGQ2NTc0NjE2NDYxNzQ2MTAwMDMyMGQ1ZDBkNTYxNDkzZWEyYjk0MTBmNjdkYTgwNDY1M2FlNDRlNzkzYzI0MjM3MDdkNGYxMWVkYjJlMzgxOTIwNTAyMGY3NDA1YzI4YTAyY2Y1YmFiNGVhNDQ5ODI0MGJiMzU3OWRiNDU5NTE3OTRlYjFjODQzYmVmMDUzNGMwOTNhZDkwODAxMDAwMDAwMDAwMDAwMDA0MDBkMDMwMDAwMDAwMDAwNjQwMDAwMDAwMDAwMDAwMDhiMDM3ZDY3MDAwMDAwMDAwMjAzMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGRiYzg3YTFjODE2ZDliY2QwNmI2ODNjMzdlODBjNzE2MmU0ZDQ4ZGE3ODEyMTk4YjgzMGU0ZDVkOGUwNjI5ZjIwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gICAgICApO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudCwge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgIH0pO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZXF1ZW5jZU51bWJlciwgMTQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmFzc2V0SWQsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5mZWVQYXllciwgdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzZW5kIGEgc2lnbmVkIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLkZVTkdJQkxFX1RPS0VOX1RSQU5TRkVSKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBGdW5naWJsZUFzc2V0VHJhbnNmZXI7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndGFwdDp1c2R0JyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQ6dXNkdCcsXG4gICAgICB9KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pZCwgJzB4MjcxZGE5MmYzZGNkNjczYTBiZDI4ZDI2ZjhiNDljMWYwYzZlYWQwZjViZTBmYmFiM2U5NDEyOTcyZTk2ZDgwYicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VxdWVuY2VOdW1iZXIsIDE2Nyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3Mzc4OTM2MDQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW4pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuRlVOR0lCTEVfVE9LRU5fVFJBTlNGRVIpO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmlkLCAnMHgyNzFkYTkyZjNkY2Q2NzNhMGJkMjhkMjZmOGI0OWMxZjBjNmVhZDBmNWJlMGZiYWIzZTk0MTI5NzJlOTZkODBiJyk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudCwge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguYXNzZXRJZCwgdGVzdERhdGEuZnVuZ2libGVUb2tlbkFkZHJlc3MudXNkdCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCAxNjcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZXhwaXJhdGlvblRpbWUsIDE3Mzc4OTM2MDQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQmF0Y2ggVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRva2VuIHRyYW5zZmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZnVuZ2libGVUb2tlblRyYW5zZmVyID0gbmV3IEZ1bmdpYmxlQXNzZXRUcmFuc2Zlcihjb2lucy5nZXQoJ3RhcHQ6dXNkdCcpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0RnVuZ2libGVBc3NldFRyYW5zYWN0aW9uQnVpbGRlcihmdW5naWJsZVRva2VuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5hc3NldElkKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgRnVuZ2libGVBc3NldFRyYW5zZmVyO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMV0uYWRkcmVzcywgdGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMV0uYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hbW91bnQsIHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzBdLmFtb3VudCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1sxXS5hbW91bnQsIHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzFdLmFtb3VudCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguYXNzZXRJZCwgdGVzdERhdGEuZnVuZ2libGVUb2tlbkFkZHJlc3MudXNkdCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZXF1ZW5jZU51bWJlciwgMTQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxNzM2MjQ2MTU1KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZFRva2VuKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiAoXG4gICAgICAgICAgTnVtYmVyKHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzBdLmFtb3VudCkgKyBOdW1iZXIodGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMV0uYW1vdW50KVxuICAgICAgICApLnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46ICd0YXB0OnVzZHQnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndGFwdDp1c2R0JyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMV0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzFdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQ6dXNkdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuRlVOR0lCTEVfQkFUQ0hfUkFXX1RYX0hFWCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmFsaWRhdGUgYSB2YWxpZCBzaWduYWJsZVBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBGdW5naWJsZUFzc2V0VHJhbnNmZXIoY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRGdW5naWJsZUFzc2V0VHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgdHhCdWlsZGVyLmFzc2V0SWQodGVzdERhdGEuZnVuZ2libGVUb2tlbkFkZHJlc3MudXNkdCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEZ1bmdpYmxlQXNzZXRUcmFuc2ZlcjtcbiAgICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLCB0ZXN0RGF0YS5GVU5HSUJMRV9CQVRDSF9TSUdOQUJMRV9QQVlMT0FEKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB1bnNpZ25lZCB0eCBhbmQgdmFsaWRhdGUgaXRzIHRvSnNvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEZ1bmdpYmxlQXNzZXRUcmFuc2Zlcihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEZ1bmdpYmxlQXNzZXRUcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICB0eEJ1aWxkZXIuYXNzZXRJZCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuQWRkcmVzcy51c2R0KTtcbiAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgRnVuZ2libGVBc3NldFRyYW5zZmVyO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1sxXS5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMV0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnQsIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICB9KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uc2VxdWVuY2VOdW1iZXIsIDE0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5hc3NldElkLCB0ZXN0RGF0YS5mdW5naWJsZVRva2VuQWRkcmVzcy51c2R0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24ubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmV4cGlyYXRpb25UaW1lLCAxNzM2MjQ2MTU1KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZmVlUGF5ZXIsIHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNpZ25lZCB0eCBhbmQgdmFsaWRhdGUgaXRzIHRvSnNvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5GVU5HSUJMRV9CQVRDSF9UUkFOU0ZFUik7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgRnVuZ2libGVBc3NldFRyYW5zZmVyO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS5hZGRyZXNzLCAnMHhjOGYwMmQyNWFhNjk4YjNlOWZiZDhhMDhlOGRhNGM4ZWUyNjE4MzJhMjVhNGNkZTg3MzFiNWVjMzU2NTM3ZDA5Jyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzWzBdLnZhbHVlLCAnMicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMF0uYWRkcmVzcywgJzB4ZGQ1MmMwYjcyYTczNjk2Yjg2N2Q2NTcxYTMwOGM0MTNlNDNiZmY4ZjQ0OTU2YTU5OTFhYmM0ZDUwZGIwYjg0OScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMF0udmFsdWUsICcxJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0c1sxXS5hZGRyZXNzLCAnMHgyYTgxNzYwZDUyZGI5YTk2ZGYyNjA5ODYwMjE4MjE0YjZkMTAxMmU3N2U4NGEzZmVkNTE0NWE5YTY1YmY2OTMyJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0c1sxXS52YWx1ZSwgJzEnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1VzZWQsIDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxODY5Mjg5NzYwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZXF1ZW5jZU51bWJlciwgODEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgJzB4YzhmMDJkMjVhYTY5OGIzZTlmYmQ4YTA4ZThkYTRjOGVlMjYxODMyYTI1YTRjZGU4NzMxYjVlYzM1NjUzN2QwOScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMF0uYWRkcmVzcywgJzB4ZGQ1MmMwYjcyYTczNjk2Yjg2N2Q2NTcxYTMwOGM0MTNlNDNiZmY4ZjQ0OTU2YTU5OTFhYmM0ZDUwZGIwYjg0OScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMF0uYW1vdW50LCAnMScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMV0uYWRkcmVzcywgJzB4MmE4MTc2MGQ1MmRiOWE5NmRmMjYwOTg2MDIxODIxNGI2ZDEwMTJlNzdlODRhM2ZlZDUxNDVhOWE2NWJmNjkzMicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMV0uYW1vdW50LCAnMScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmZlZVBheWVyQWRkcmVzcywgJzB4ZGJjODdhMWM4MTZkOWJjZDA2YjY4M2MzN2U4MGM3MTYyZTRkNDhkYTc4MTIxOThiODMwZTRkNWQ4ZTA2MjlmMicpO1xuXG4gICAgICBjb25zdCB0b0pzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uaWQsICcweGY3ODFlNTMxYTIwZDliMWI4MGVhYjY0MDJhNDRkZmNhODFjN2ExOTZhY2NmMzUwYzk3NGQ2MjdhYzJlNTJmOWEnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uc2VuZGVyLCAnMHhjOGYwMmQyNWFhNjk4YjNlOWZiZDhhMDhlOGRhNGM4ZWUyNjE4MzJhMjVhNGNkZTg3MzFiNWVjMzU2NTM3ZDA5Jyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiAnMHhkZDUyYzBiNzJhNzM2OTZiODY3ZDY1NzFhMzA4YzQxM2U0M2JmZjhmNDQ5NTZhNTk5MWFiYzRkNTBkYjBiODQ5JyxcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6ICcweDJhODE3NjBkNTJkYjlhOTZkZjI2MDk4NjAyMTgyMTRiNmQxMDEyZTc3ZTg0YTNmZWQ1MTQ1YTlhNjViZjY5MzInLFxuICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnQsIHtcbiAgICAgICAgYWRkcmVzczogJzB4ZGQ1MmMwYjcyYTczNjk2Yjg2N2Q2NTcxYTMwOGM0MTNlNDNiZmY4ZjQ0OTU2YTU5OTFhYmM0ZDUwZGIwYjg0OScsXG4gICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCA4MSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5nYXNVc2VkLCAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZXhwaXJhdGlvblRpbWUsIDE4NjkyODk3NjAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5mZWVQYXllciwgJzB4ZGJjODdhMWM4MTZkOWJjZDA2YjY4M2MzN2U4MGM3MTYyZTRkNDhkYTc4MTIxOThiODMwZTRkNWQ4ZTA2MjlmMicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5hc3NldElkLCAnMHhkNWQwZDU2MTQ5M2VhMmI5NDEwZjY3ZGE4MDQ2NTNhZTQ0ZTc5M2MyNDIzNzA3ZDRmMTFlZGIyZTM4MTkyMDUwJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/transferBuilder.ts"],"names":[],"mappings":""}
|