@bitgo/sdk-coin-tempo 1.5.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/lib/transaction.d.ts +7 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +18 -9
- package/dist/src/lib/transactionBuilder.d.ts +9 -1
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +26 -3
- package/dist/test/integration/tip20.d.ts +5 -0
- package/dist/test/integration/tip20.d.ts.map +1 -1
- package/dist/test/integration/tip20.js +151 -88
- package/dist/test/resources/tempo.d.ts +53 -0
- package/dist/test/resources/tempo.d.ts.map +1 -0
- package/dist/test/resources/tempo.js +71 -0
- package/dist/test/unit/transactionBuilder.js +190 -144
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -7,9 +7,11 @@ const assert_1 = __importDefault(require("assert"));
|
|
|
7
7
|
const mocha_1 = require("mocha");
|
|
8
8
|
const ethers_1 = require("ethers");
|
|
9
9
|
const transactionBuilder_1 = require("../../src/lib/transactionBuilder");
|
|
10
|
+
const transaction_1 = require("../../src/lib/transaction");
|
|
10
11
|
const utils_1 = require("../../src/lib/utils");
|
|
11
12
|
const constants_1 = require("../../src/lib/constants");
|
|
12
13
|
const statics_1 = require("@bitgo/statics");
|
|
14
|
+
const tempo_1 = require("../resources/tempo");
|
|
13
15
|
const mockCoinConfig = statics_1.coins.get('ttempo');
|
|
14
16
|
(0, mocha_1.describe)('TIP-20 Utilities', () => {
|
|
15
17
|
(0, mocha_1.describe)('amountToTip20Units', () => {
|
|
@@ -32,42 +34,25 @@ const mockCoinConfig = statics_1.coins.get('ttempo');
|
|
|
32
34
|
(0, mocha_1.describe)('stringToBytes32', () => {
|
|
33
35
|
(0, mocha_1.it)('should convert string to bytes32', () => {
|
|
34
36
|
const result = (0, utils_1.stringToBytes32)('12345');
|
|
35
|
-
assert_1.default.strictEqual(typeof result, 'string');
|
|
36
37
|
assert_1.default.strictEqual(result.length, 66);
|
|
37
38
|
assert_1.default.ok(result.startsWith('0x'));
|
|
38
39
|
});
|
|
39
40
|
(0, mocha_1.it)('should throw error for string longer than 32 bytes', () => {
|
|
40
|
-
|
|
41
|
-
assert_1.default.throws(() => (0, utils_1.stringToBytes32)(longString), /Memo too long/);
|
|
41
|
+
assert_1.default.throws(() => (0, utils_1.stringToBytes32)('a'.repeat(33)), /Memo too long/);
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
44
|
(0, mocha_1.describe)('encodeTip20TransferWithMemo', () => {
|
|
45
45
|
(0, mocha_1.it)('should encode transferWithMemo call', () => {
|
|
46
46
|
const to = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
|
|
47
|
-
const
|
|
48
|
-
const memo = '12345';
|
|
49
|
-
const encoded = (0, utils_1.encodeTip20TransferWithMemo)(to, amount, memo);
|
|
50
|
-
assert_1.default.strictEqual(typeof encoded, 'string');
|
|
47
|
+
const encoded = (0, utils_1.encodeTip20TransferWithMemo)(to, 1500000n, '12345');
|
|
51
48
|
assert_1.default.ok(encoded.startsWith('0x'));
|
|
52
49
|
assert_1.default.ok(encoded.length > 10);
|
|
53
50
|
});
|
|
54
|
-
(0, mocha_1.it)('should encode transferWithMemo without memo', () => {
|
|
55
|
-
const to = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
|
|
56
|
-
const amount = 1500000n;
|
|
57
|
-
const encoded = (0, utils_1.encodeTip20TransferWithMemo)(to, amount);
|
|
58
|
-
assert_1.default.strictEqual(typeof encoded, 'string');
|
|
59
|
-
assert_1.default.ok(encoded.startsWith('0x'));
|
|
60
|
-
});
|
|
61
51
|
});
|
|
62
52
|
(0, mocha_1.describe)('isValidTip20Amount', () => {
|
|
63
|
-
(0, mocha_1.it)('should validate
|
|
53
|
+
(0, mocha_1.it)('should validate amounts correctly', () => {
|
|
64
54
|
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('1.5'), true);
|
|
65
|
-
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('100'), true);
|
|
66
|
-
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('0.000001'), true);
|
|
67
|
-
});
|
|
68
|
-
(0, mocha_1.it)('should invalidate incorrect amounts', () => {
|
|
69
55
|
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('invalid'), false);
|
|
70
|
-
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)(''), false);
|
|
71
56
|
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('-5'), false);
|
|
72
57
|
});
|
|
73
58
|
});
|
|
@@ -77,164 +62,60 @@ const mockCoinConfig = statics_1.coins.get('ttempo');
|
|
|
77
62
|
const mockRecipient = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
|
|
78
63
|
const mockFeeToken = ethers_1.ethers.utils.getAddress('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd');
|
|
79
64
|
(0, mocha_1.describe)('addOperation', () => {
|
|
80
|
-
(0, mocha_1.it)('should add
|
|
65
|
+
(0, mocha_1.it)('should add operation with and without memo', () => {
|
|
81
66
|
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
82
|
-
builder.addOperation({
|
|
83
|
-
|
|
84
|
-
to: mockRecipient,
|
|
85
|
-
amount: '100.5',
|
|
86
|
-
});
|
|
67
|
+
builder.addOperation({ token: mockToken, to: mockRecipient, amount: '100' });
|
|
68
|
+
builder.addOperation({ token: mockToken, to: mockRecipient, amount: '50', memo: '1' });
|
|
87
69
|
const operations = builder.getOperations();
|
|
88
|
-
assert_1.default.strictEqual(operations.length,
|
|
89
|
-
assert_1.default.strictEqual(operations[0].token, mockToken);
|
|
90
|
-
assert_1.default.strictEqual(operations[0].to, mockRecipient);
|
|
91
|
-
assert_1.default.strictEqual(operations[0].amount, '100.5');
|
|
70
|
+
assert_1.default.strictEqual(operations.length, 2);
|
|
92
71
|
assert_1.default.strictEqual(operations[0].memo, undefined);
|
|
72
|
+
assert_1.default.strictEqual(operations[1].memo, '1');
|
|
93
73
|
});
|
|
94
|
-
(0, mocha_1.it)('should
|
|
95
|
-
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
96
|
-
builder.addOperation({
|
|
97
|
-
token: mockToken,
|
|
98
|
-
to: mockRecipient,
|
|
99
|
-
amount: '100.5',
|
|
100
|
-
memo: '202501',
|
|
101
|
-
});
|
|
102
|
-
const operations = builder.getOperations();
|
|
103
|
-
assert_1.default.strictEqual(operations.length, 1);
|
|
104
|
-
assert_1.default.strictEqual(operations[0].memo, '202501');
|
|
105
|
-
});
|
|
106
|
-
(0, mocha_1.it)('should add multiple operations (batch)', () => {
|
|
74
|
+
(0, mocha_1.it)('should throw error for invalid addresses', () => {
|
|
107
75
|
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
108
|
-
builder
|
|
109
|
-
|
|
110
|
-
token: mockToken,
|
|
111
|
-
to: mockRecipient,
|
|
112
|
-
amount: '50.0',
|
|
113
|
-
memo: '1001',
|
|
114
|
-
})
|
|
115
|
-
.addOperation({
|
|
116
|
-
token: mockToken,
|
|
117
|
-
to: mockRecipient,
|
|
118
|
-
amount: '30.0',
|
|
119
|
-
memo: '1002',
|
|
120
|
-
})
|
|
121
|
-
.addOperation({
|
|
122
|
-
token: mockToken,
|
|
123
|
-
to: mockRecipient,
|
|
124
|
-
amount: '20.0',
|
|
125
|
-
memo: '1003',
|
|
126
|
-
});
|
|
127
|
-
const operations = builder.getOperations();
|
|
128
|
-
assert_1.default.strictEqual(operations.length, 3);
|
|
129
|
-
assert_1.default.strictEqual(operations[0].memo, '1001');
|
|
130
|
-
assert_1.default.strictEqual(operations[1].memo, '1002');
|
|
131
|
-
assert_1.default.strictEqual(operations[2].memo, '1003');
|
|
132
|
-
});
|
|
133
|
-
(0, mocha_1.it)('should throw error for invalid token address', () => {
|
|
134
|
-
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
135
|
-
assert_1.default.throws(() => {
|
|
136
|
-
builder.addOperation({
|
|
137
|
-
token: '0xinvalid',
|
|
138
|
-
to: mockRecipient,
|
|
139
|
-
amount: '100',
|
|
140
|
-
});
|
|
141
|
-
}, /Invalid token address/);
|
|
142
|
-
});
|
|
143
|
-
(0, mocha_1.it)('should throw error for invalid recipient address', () => {
|
|
144
|
-
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
145
|
-
assert_1.default.throws(() => {
|
|
146
|
-
builder.addOperation({
|
|
147
|
-
token: mockToken,
|
|
148
|
-
to: '0xinvalid',
|
|
149
|
-
amount: '100',
|
|
150
|
-
});
|
|
151
|
-
}, /Invalid recipient address/);
|
|
76
|
+
assert_1.default.throws(() => builder.addOperation({ token: '0xinvalid', to: mockRecipient, amount: '100' }), /Invalid token address/);
|
|
77
|
+
assert_1.default.throws(() => builder.addOperation({ token: mockToken, to: '0xinvalid', amount: '100' }), /Invalid recipient address/);
|
|
152
78
|
});
|
|
153
79
|
(0, mocha_1.it)('should throw error for invalid amount', () => {
|
|
154
80
|
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
155
|
-
assert_1.default.throws(() => {
|
|
156
|
-
builder.addOperation({
|
|
157
|
-
token: mockToken,
|
|
158
|
-
to: mockRecipient,
|
|
159
|
-
amount: 'invalid-amount',
|
|
160
|
-
});
|
|
161
|
-
}, /Invalid amount/);
|
|
81
|
+
assert_1.default.throws(() => builder.addOperation({ token: mockToken, to: mockRecipient, amount: 'invalid-amount' }), /Invalid amount/);
|
|
162
82
|
});
|
|
163
83
|
(0, mocha_1.it)('should throw error for memo longer than 32 bytes', () => {
|
|
164
84
|
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
165
|
-
|
|
166
|
-
assert_1.default.throws(() => {
|
|
167
|
-
builder.addOperation({
|
|
168
|
-
token: mockToken,
|
|
169
|
-
to: mockRecipient,
|
|
170
|
-
amount: '100',
|
|
171
|
-
memo: longMemo,
|
|
172
|
-
});
|
|
173
|
-
}, /Memo too long/);
|
|
85
|
+
assert_1.default.throws(() => builder.addOperation({ token: mockToken, to: mockRecipient, amount: '100', memo: 'a'.repeat(33) }), /Memo too long/);
|
|
174
86
|
});
|
|
175
87
|
});
|
|
176
88
|
(0, mocha_1.describe)('feeToken', () => {
|
|
177
|
-
(0, mocha_1.it)('should set fee token', () => {
|
|
89
|
+
(0, mocha_1.it)('should set and get fee token', () => {
|
|
178
90
|
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
179
91
|
builder.feeToken(mockFeeToken);
|
|
180
92
|
assert_1.default.strictEqual(builder.getFeeToken(), mockFeeToken);
|
|
181
93
|
});
|
|
182
94
|
(0, mocha_1.it)('should throw error for invalid fee token address', () => {
|
|
183
95
|
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
184
|
-
assert_1.default.throws(() =>
|
|
185
|
-
builder.feeToken('invalid-address');
|
|
186
|
-
}, /Invalid fee token address/);
|
|
96
|
+
assert_1.default.throws(() => builder.feeToken('invalid-address'), /Invalid fee token address/);
|
|
187
97
|
});
|
|
188
98
|
});
|
|
189
99
|
(0, mocha_1.describe)('Transaction parameters', () => {
|
|
190
|
-
(0, mocha_1.it)('should set nonce', () => {
|
|
100
|
+
(0, mocha_1.it)('should set nonce, gas, maxFeePerGas, and maxPriorityFeePerGas', () => {
|
|
191
101
|
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
192
|
-
builder.nonce(42);
|
|
102
|
+
builder.nonce(42).gas(500000n).maxFeePerGas(1000000000n).maxPriorityFeePerGas(500000000n);
|
|
193
103
|
assert_1.default.strictEqual(builder._nonce, 42);
|
|
194
|
-
});
|
|
195
|
-
(0, mocha_1.it)('should throw error for negative nonce', () => {
|
|
196
|
-
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
197
|
-
assert_1.default.throws(() => {
|
|
198
|
-
builder.nonce(-1);
|
|
199
|
-
}, /Invalid nonce/);
|
|
200
|
-
});
|
|
201
|
-
(0, mocha_1.it)('should set gas limit', () => {
|
|
202
|
-
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
203
|
-
builder.gas(500000n);
|
|
204
104
|
assert_1.default.strictEqual(builder._gas, 500000n);
|
|
205
|
-
});
|
|
206
|
-
(0, mocha_1.it)('should set gas limit from string', () => {
|
|
207
|
-
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
208
|
-
builder.gas('500000');
|
|
209
|
-
assert_1.default.strictEqual(builder._gas, 500000n);
|
|
210
|
-
});
|
|
211
|
-
(0, mocha_1.it)('should throw error for invalid gas limit', () => {
|
|
212
|
-
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
213
|
-
assert_1.default.throws(() => {
|
|
214
|
-
builder.gas(0n);
|
|
215
|
-
}, /Invalid gas limit/);
|
|
216
|
-
});
|
|
217
|
-
(0, mocha_1.it)('should set maxFeePerGas', () => {
|
|
218
|
-
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
219
|
-
builder.maxFeePerGas(1000000000n);
|
|
220
105
|
assert_1.default.strictEqual(builder._maxFeePerGas, 1000000000n);
|
|
106
|
+
assert_1.default.strictEqual(builder._maxPriorityFeePerGas, 500000000n);
|
|
221
107
|
});
|
|
222
|
-
(0, mocha_1.it)('should
|
|
108
|
+
(0, mocha_1.it)('should throw error for invalid nonce and gas', () => {
|
|
223
109
|
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
224
|
-
builder.
|
|
225
|
-
assert_1.default.
|
|
110
|
+
assert_1.default.throws(() => builder.nonce(-1), /Invalid nonce/);
|
|
111
|
+
assert_1.default.throws(() => builder.gas(0n), /Invalid gas limit/);
|
|
226
112
|
});
|
|
227
113
|
});
|
|
228
114
|
(0, mocha_1.describe)('Method chaining', () => {
|
|
229
115
|
(0, mocha_1.it)('should support fluent interface', () => {
|
|
230
116
|
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
231
117
|
const result = builder
|
|
232
|
-
.addOperation({
|
|
233
|
-
token: mockToken,
|
|
234
|
-
to: mockRecipient,
|
|
235
|
-
amount: '100',
|
|
236
|
-
memo: '9999',
|
|
237
|
-
})
|
|
118
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '100', memo: '5' })
|
|
238
119
|
.feeToken(mockFeeToken)
|
|
239
120
|
.nonce(10)
|
|
240
121
|
.gas(400000n)
|
|
@@ -249,4 +130,169 @@ const mockCoinConfig = statics_1.coins.get('ttempo');
|
|
|
249
130
|
assert_1.default.strictEqual(constants_1.TIP20_DECIMALS, 6);
|
|
250
131
|
});
|
|
251
132
|
});
|
|
252
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixpQ0FBcUM7QUFDckMsbUNBQWdDO0FBQ2hDLHlFQUEyRTtBQUMzRSwrQ0FNNkI7QUFDN0IsdURBQXlEO0FBQ3pELDRDQUF1QztBQUV2QyxNQUFNLGNBQWMsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRTNDLElBQUEsZ0JBQVEsRUFBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7SUFDaEMsSUFBQSxnQkFBUSxFQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtRQUNsQyxJQUFBLFVBQUUsRUFBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDMUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN4RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzFELGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsMEJBQWtCLEVBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxTQUFTLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGdCQUFRLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLElBQUEsVUFBRSxFQUFD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QUFNLE1BQU0sR0FBRyxPQUFPO2lCQUNuQixZQUFZLENBQUM7Z0JBQ1osS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLEVBQUUsRUFBRSxhQUFhO2dCQUNqQixNQUFNLEVBQUUsS0FBSztnQkFDYixJQUFJLEVBQUUsTUFBTTthQUNiLENBQUM7aUJBQ0QsUUFBUSxDQUFDLFlBQVksQ0FBQztpQkFDdEIsS0FBSyxDQUFDLEVBQUUsQ0FBQztpQkFDVCxHQUFHLENBQUMsT0FBTyxDQUFDO2lCQUNaLFlBQVksQ0FBQyxXQUFXLENBQUM7aUJBQ3pCLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXJDLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLGdCQUFRLEVBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUEsVUFBRSxFQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtRQUM1QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQywwQkFBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQge1xuICBhbW91bnRUb1RpcDIwVW5pdHMsXG4gIHRpcDIwVW5pdHNUb0Ftb3VudCxcbiAgc3RyaW5nVG9CeXRlczMyLFxuICBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8sXG4gIGlzVmFsaWRUaXAyMEFtb3VudCxcbn0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUSVAyMF9ERUNJTUFMUyB9IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5jb25zdCBtb2NrQ29pbkNvbmZpZyA9IGNvaW5zLmdldCgndHRlbXBvJyk7XG5cbmRlc2NyaWJlKCdUSVAtMjAgVXRpbGl0aWVzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnYW1vdW50VG9UaXAyMFVuaXRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29udmVydCBkZWNpbWFsIGFtb3VudCB0byA2LWRlY2ltYWwgdW5pdHMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYW1vdW50VG9UaXAyMFVuaXRzKCcxLjUnKSwgMTUwMDAwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFtb3VudFRvVGlwMjBVbml0cygnMTAwJyksIDEwMDAwMDAwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFtb3VudFRvVGlwMjBVbml0cygnMC4wMDAwMDEnKSwgMW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGFtb3VudFRvVGlwMjBVbml0cygnaW52YWxpZCcpLCAvSW52YWxpZCBhbW91bnQgZm9ybWF0Lyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0aXAyMFVuaXRzVG9BbW91bnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IDYtZGVjaW1hbCB1bml0cyB0byBodW1hbi1yZWFkYWJsZSBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGlwMjBVbml0c1RvQW1vdW50KDE1MDAwMDBuKSwgJzEuNScpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRpcDIwVW5pdHNUb0Ftb3VudCgxMDAwMDAwMDBuKSwgJzEwMC4wJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGlwMjBVbml0c1RvQW1vdW50KDFuKSwgJzAuMDAwMDAxJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJpbmdUb0J5dGVzMzInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IHN0cmluZyB0byBieXRlczMyJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaW5nVG9CeXRlczMyKCcxMjM0NScpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQubGVuZ3RoLCA2Nik7XG4gICAgICBhc3NlcnQub2socmVzdWx0LnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3Igc3RyaW5nIGxvbmdlciB0aGFuIDMyIGJ5dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbG9uZ1N0cmluZyA9ICdhJy5yZXBlYXQoMzMpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBzdHJpbmdUb0J5dGVzMzIobG9uZ1N0cmluZyksIC9NZW1vIHRvbyBsb25nLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgdHJhbnNmZXJXaXRoTWVtbyBjYWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgdG8gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHg3NDJkMzVjYzY2MzRjMDUzMjkyNWEzYjg0NGJjOWU3NTk1ZjBiZWIxJyk7XG4gICAgICBjb25zdCBhbW91bnQgPSAxNTAwMDAwbjtcbiAgICAgIGNvbnN0IG1lbW8gPSAnMTIzNDUnO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVGlwMjBUcmFuc2ZlcldpdGhNZW1vKHRvLCBhbW91bnQsIG1lbW8pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBlbmNvZGVkLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQub2soZW5jb2RlZC5zdGFydHNXaXRoKCcweCcpKTtcbiAgICAgIGFzc2VydC5vayhlbmNvZGVkLmxlbmd0aCA+IDEwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZW5jb2RlIHRyYW5zZmVyV2l0aE1lbW8gd2l0aG91dCBtZW1vJywgKCkgPT4ge1xuICAgICAgY29uc3QgdG8gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHg3NDJkMzVjYzY2MzRjMDUzMjkyNWEzYjg0NGJjOWU3NTk1ZjBiZWIxJyk7XG4gICAgICBjb25zdCBhbW91bnQgPSAxNTAwMDAwbjtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRpcDIwVHJhbnNmZXJXaXRoTWVtbyh0bywgYW1vdW50KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgZW5jb2RlZCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0Lm9rKGVuY29kZWQuc3RhcnRzV2l0aCgnMHgnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkVGlwMjBBbW91bnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IGFtb3VudHMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCcxLjUnKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCcxMDAnKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCcwLjAwMDAwMScpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW52YWxpZGF0ZSBpbmNvcnJlY3QgYW1vdW50cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkVGlwMjBBbW91bnQoJ2ludmFsaWQnKSwgZmFsc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRUaXAyMEFtb3VudCgnJyksIGZhbHNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkVGlwMjBBbW91bnQoJy01JyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RJUC0yMCBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBtb2NrVG9rZW4gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHgxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwJyk7XG4gIGNvbnN0IG1vY2tSZWNpcGllbnQgPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHg3NDJkMzVjYzY2MzRjMDUzMjkyNWEzYjg0NGJjOWU3NTk1ZjBiZWIxJyk7XG4gIGNvbnN0IG1vY2tGZWVUb2tlbiA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweGFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2QnKTtcblxuICBkZXNjcmliZSgnYWRkT3BlcmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGEgc2luZ2xlIG9wZXJhdGlvbiB3aXRob3V0IG1lbW8nLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYnVpbGRlci5hZGRPcGVyYXRpb24oe1xuICAgICAgICB0b2tlbjogbW9ja1Rva2VuLFxuICAgICAgICB0bzogbW9ja1JlY2lwaWVudCxcbiAgICAgICAgYW1vdW50OiAnMTAwLjUnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBidWlsZGVyLmdldE9wZXJhdGlvbnMoKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1swXS50b2tlbiwgbW9ja1Rva2VuKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLnRvLCBtb2NrUmVjaXBpZW50KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLmFtb3VudCwgJzEwMC41Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1swXS5tZW1vLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgYSBzaW5nbGUgb3BlcmF0aW9uIHdpdGggbWVtbycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7XG4gICAgICAgIHRva2VuOiBtb2NrVG9rZW4sXG4gICAgICAgIHRvOiBtb2NrUmVjaXBpZW50LFxuICAgICAgICBhbW91bnQ6ICcxMDAuNScsXG4gICAgICAgIG1lbW86ICcyMDI1MDEnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBidWlsZGVyLmdldE9wZXJhdGlvbnMoKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1swXS5tZW1vLCAnMjAyNTAxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBtdWx0aXBsZSBvcGVyYXRpb25zIChiYXRjaCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgICB0b2tlbjogbW9ja1Rva2VuLFxuICAgICAgICAgIHRvOiBtb2NrUmVjaXBpZW50LFxuICAgICAgICAgIGFtb3VudDogJzUwLjAnLFxuICAgICAgICAgIG1lbW86ICcxMDAxJyxcbiAgICAgICAgfSlcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7XG4gICAgICAgICAgdG9rZW46IG1vY2tUb2tlbixcbiAgICAgICAgICB0bzogbW9ja1JlY2lwaWVudCxcbiAgICAgICAgICBhbW91bnQ6ICczMC4wJyxcbiAgICAgICAgICBtZW1vOiAnMTAwMicsXG4gICAgICAgIH0pXG4gICAgICAgIC5hZGRPcGVyYXRpb24oe1xuICAgICAgICAgIHRva2VuOiBtb2NrVG9rZW4sXG4gICAgICAgICAgdG86IG1vY2tSZWNpcGllbnQsXG4gICAgICAgICAgYW1vdW50OiAnMjAuMCcsXG4gICAgICAgICAgbWVtbzogJzEwMDMnLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IGJ1aWxkZXIuZ2V0T3BlcmF0aW9ucygpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnMubGVuZ3RoLCAzKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLm1lbW8sICcxMDAxJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1sxXS5tZW1vLCAnMTAwMicpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnNbMl0ubWVtbywgJzEwMDMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgdG9rZW4gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hZGRPcGVyYXRpb24oe1xuICAgICAgICAgIHRva2VuOiAnMHhpbnZhbGlkJyBhcyBhbnksXG4gICAgICAgICAgdG86IG1vY2tSZWNpcGllbnQsXG4gICAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgfSk7XG4gICAgICB9LCAvSW52YWxpZCB0b2tlbiBhZGRyZXNzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7XG4gICAgICAgICAgdG9rZW46IG1vY2tUb2tlbixcbiAgICAgICAgICB0bzogJzB4aW52YWxpZCcgYXMgYW55LFxuICAgICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgIH0pO1xuICAgICAgfSwgL0ludmFsaWQgcmVjaXBpZW50IGFkZHJlc3MvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgYW1vdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7XG4gICAgICAgICAgdG9rZW46IG1vY2tUb2tlbixcbiAgICAgICAgICB0bzogbW9ja1JlY2lwaWVudCxcbiAgICAgICAgICBhbW91bnQ6ICdpbnZhbGlkLWFtb3VudCcsXG4gICAgICAgIH0pO1xuICAgICAgfSwgL0ludmFsaWQgYW1vdW50Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBtZW1vIGxvbmdlciB0aGFuIDMyIGJ5dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBjb25zdCBsb25nTWVtbyA9ICdhJy5yZXBlYXQoMzMpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hZGRPcGVyYXRpb24oe1xuICAgICAgICAgIHRva2VuOiBtb2NrVG9rZW4sXG4gICAgICAgICAgdG86IG1vY2tSZWNpcGllbnQsXG4gICAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgICBtZW1vOiBsb25nTWVtbyxcbiAgICAgICAgfSk7XG4gICAgICB9LCAvTWVtbyB0b28gbG9uZy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmVlVG9rZW4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgZmVlIHRva2VuJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGJ1aWxkZXIuZmVlVG9rZW4obW9ja0ZlZVRva2VuKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXIuZ2V0RmVlVG9rZW4oKSwgbW9ja0ZlZVRva2VuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgZmVlIHRva2VuIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZmVlVG9rZW4oJ2ludmFsaWQtYWRkcmVzcycpO1xuICAgICAgfSwgL0ludmFsaWQgZmVlIHRva2VuIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgbm9uY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXIubm9uY2UoNDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkuX25vbmNlLCA0Mik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBuZWdhdGl2ZSBub25jZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIubm9uY2UoLTEpO1xuICAgICAgfSwgL0ludmFsaWQgbm9uY2UvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGdhcyBsaW1pdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlci5nYXMoNTAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fZ2FzLCA1MDAwMDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGdhcyBsaW1pdCBmcm9tIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlci5nYXMoJzUwMDAwMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkuX2dhcywgNTAwMDAwbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGdhcyBsaW1pdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZ2FzKDBuKTtcbiAgICAgIH0sIC9JbnZhbGlkIGdhcyBsaW1pdC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgbWF4RmVlUGVyR2FzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyLm1heEZlZVBlckdhcygxMDAwMDAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWF4RmVlUGVyR2FzLCAxMDAwMDAwMDAwbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBtYXhQcmlvcml0eUZlZVBlckdhcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlci5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tYXhQcmlvcml0eUZlZVBlckdhcywgNTAwMDAwMDAwbik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdNZXRob2QgY2hhaW5pbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzdXBwb3J0IGZsdWVudCBpbnRlcmZhY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgICB0b2tlbjogbW9ja1Rva2VuLFxuICAgICAgICAgIHRvOiBtb2NrUmVjaXBpZW50LFxuICAgICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgICAgbWVtbzogJzk5OTknLFxuICAgICAgICB9KVxuICAgICAgICAuZmVlVG9rZW4obW9ja0ZlZVRva2VuKVxuICAgICAgICAubm9uY2UoMTApXG4gICAgICAgIC5nYXMoNDAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcygyMDAwMDAwMDAwbilcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKDEwMDAwMDAwMDBuKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdUSVAtMjAgQ29uc3RhbnRzJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBkZWNpbWFsIHBsYWNlcycsICgpID0+IHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVElQMjBfREVDSU1BTFMsIDYpO1xuICB9KTtcbn0pO1xuIl19
|
|
133
|
+
(0, mocha_1.describe)('TIP-20 Transaction Build', () => {
|
|
134
|
+
const mockToken = ethers_1.ethers.utils.getAddress(tempo_1.TESTNET_TOKENS.alphaUSD.address);
|
|
135
|
+
const mockRecipient = ethers_1.ethers.utils.getAddress(tempo_1.TEST_RECIPIENT_ADDRESS);
|
|
136
|
+
const mockFeeToken = ethers_1.ethers.utils.getAddress(tempo_1.TESTNET_TOKENS.betaUSD.address);
|
|
137
|
+
(0, mocha_1.describe)('Build Transaction', () => {
|
|
138
|
+
(0, mocha_1.it)('should build single-operation transaction', async () => {
|
|
139
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
140
|
+
builder
|
|
141
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '100', memo: '1' })
|
|
142
|
+
.feeToken(mockFeeToken)
|
|
143
|
+
.nonce(0)
|
|
144
|
+
.gas(100000n)
|
|
145
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
146
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
147
|
+
const tx = (await builder.build());
|
|
148
|
+
assert_1.default.ok(tx instanceof transaction_1.Tip20Transaction);
|
|
149
|
+
assert_1.default.strictEqual(tx.getOperationCount(), 1);
|
|
150
|
+
assert_1.default.strictEqual(tx.getFeeToken(), mockFeeToken);
|
|
151
|
+
});
|
|
152
|
+
(0, mocha_1.it)('should build batch transaction with multiple operations', async () => {
|
|
153
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
154
|
+
builder
|
|
155
|
+
.addOperation({ token: tempo_1.TESTNET_TOKENS.alphaUSD.address, to: mockRecipient, amount: '10', memo: '1' })
|
|
156
|
+
.addOperation({ token: tempo_1.TESTNET_TOKENS.betaUSD.address, to: mockRecipient, amount: '20', memo: '2' })
|
|
157
|
+
.addOperation({ token: tempo_1.TESTNET_TOKENS.thetaUSD.address, to: mockRecipient, amount: '30', memo: '3' })
|
|
158
|
+
.feeToken(mockFeeToken)
|
|
159
|
+
.nonce(42)
|
|
160
|
+
.gas(300000n)
|
|
161
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
162
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
163
|
+
const tx = (await builder.build());
|
|
164
|
+
assert_1.default.ok(tx instanceof transaction_1.Tip20Transaction);
|
|
165
|
+
assert_1.default.strictEqual(tx.getOperationCount(), 3);
|
|
166
|
+
assert_1.default.strictEqual(tx.isBatch(), true);
|
|
167
|
+
});
|
|
168
|
+
(0, mocha_1.it)('should build transaction without fee token', async () => {
|
|
169
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
170
|
+
builder
|
|
171
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '50' })
|
|
172
|
+
.nonce(1)
|
|
173
|
+
.gas(100000n)
|
|
174
|
+
.maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
|
|
175
|
+
.maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
|
|
176
|
+
const tx = (await builder.build());
|
|
177
|
+
assert_1.default.ok(tx instanceof transaction_1.Tip20Transaction);
|
|
178
|
+
assert_1.default.strictEqual(tx.getFeeToken(), undefined);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
(0, mocha_1.describe)('Build Validation Errors', () => {
|
|
182
|
+
(0, mocha_1.it)('should throw error when no operations added', async () => {
|
|
183
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
184
|
+
builder.nonce(0).gas(100000n).maxFeePerGas(1000000000n).maxPriorityFeePerGas(500000000n);
|
|
185
|
+
await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.noOperations);
|
|
186
|
+
});
|
|
187
|
+
(0, mocha_1.it)('should throw error when nonce not set', async () => {
|
|
188
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
189
|
+
builder
|
|
190
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '100' })
|
|
191
|
+
.gas(100000n)
|
|
192
|
+
.maxFeePerGas(1000000000n)
|
|
193
|
+
.maxPriorityFeePerGas(500000000n);
|
|
194
|
+
await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.missingNonce);
|
|
195
|
+
});
|
|
196
|
+
(0, mocha_1.it)('should throw error when gas not set', async () => {
|
|
197
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
198
|
+
builder
|
|
199
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '100' })
|
|
200
|
+
.nonce(0)
|
|
201
|
+
.maxFeePerGas(1000000000n)
|
|
202
|
+
.maxPriorityFeePerGas(500000000n);
|
|
203
|
+
await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.missingGas);
|
|
204
|
+
});
|
|
205
|
+
(0, mocha_1.it)('should throw error when maxFeePerGas not set', async () => {
|
|
206
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
207
|
+
builder
|
|
208
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '100' })
|
|
209
|
+
.nonce(0)
|
|
210
|
+
.gas(100000n)
|
|
211
|
+
.maxPriorityFeePerGas(500000000n);
|
|
212
|
+
await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.missingMaxFeePerGas);
|
|
213
|
+
});
|
|
214
|
+
(0, mocha_1.it)('should throw error when maxPriorityFeePerGas not set', async () => {
|
|
215
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
216
|
+
builder
|
|
217
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '100' })
|
|
218
|
+
.nonce(0)
|
|
219
|
+
.gas(100000n)
|
|
220
|
+
.maxFeePerGas(1000000000n);
|
|
221
|
+
await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.missingMaxPriorityFeePerGas);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
(0, mocha_1.describe)('Round-Trip: Build -> Serialize -> Operations Check', () => {
|
|
225
|
+
(0, mocha_1.it)('should preserve operation data through build', async () => {
|
|
226
|
+
const operations = [{ token: mockToken, to: mockRecipient, amount: '123', memo: '1' }];
|
|
227
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
228
|
+
builder
|
|
229
|
+
.addOperation(operations[0])
|
|
230
|
+
.feeToken(mockFeeToken)
|
|
231
|
+
.nonce(10)
|
|
232
|
+
.gas(150000n)
|
|
233
|
+
.maxFeePerGas(2000000000n)
|
|
234
|
+
.maxPriorityFeePerGas(1000000000n);
|
|
235
|
+
const tx = (await builder.build());
|
|
236
|
+
const txOps = tx.getOperations();
|
|
237
|
+
assert_1.default.strictEqual(txOps.length, 1);
|
|
238
|
+
assert_1.default.strictEqual(txOps[0].token, operations[0].token);
|
|
239
|
+
assert_1.default.strictEqual(txOps[0].to, operations[0].to);
|
|
240
|
+
assert_1.default.strictEqual(txOps[0].amount, operations[0].amount);
|
|
241
|
+
assert_1.default.strictEqual(txOps[0].memo, operations[0].memo);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
(0, mocha_1.describe)('Build -> Serialize -> Sign Flow', () => {
|
|
245
|
+
(0, mocha_1.it)('should produce serializable unsigned transaction', async () => {
|
|
246
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
247
|
+
builder
|
|
248
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '50', memo: '2' })
|
|
249
|
+
.feeToken(mockFeeToken)
|
|
250
|
+
.nonce(5)
|
|
251
|
+
.gas(100000n)
|
|
252
|
+
.maxFeePerGas(2000000000n)
|
|
253
|
+
.maxPriorityFeePerGas(1000000000n);
|
|
254
|
+
const tx = (await builder.build());
|
|
255
|
+
const unsignedHex = await tx.serialize();
|
|
256
|
+
assert_1.default.ok(unsignedHex.startsWith(constants_1.AA_TRANSACTION_TYPE));
|
|
257
|
+
assert_1.default.ok(/^0x[0-9a-f]+$/i.test(unsignedHex));
|
|
258
|
+
});
|
|
259
|
+
(0, mocha_1.it)('should support full sign and broadcast flow', async () => {
|
|
260
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
261
|
+
builder
|
|
262
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '75', memo: '3' })
|
|
263
|
+
.feeToken(mockFeeToken)
|
|
264
|
+
.nonce(123)
|
|
265
|
+
.gas(120000n)
|
|
266
|
+
.maxFeePerGas(2500000000n)
|
|
267
|
+
.maxPriorityFeePerGas(1200000000n);
|
|
268
|
+
const tx = (await builder.build());
|
|
269
|
+
const unsignedHex = await tx.serialize();
|
|
270
|
+
tx.setSignature(tempo_1.SIGNATURE_TEST_DATA.validSignature);
|
|
271
|
+
const broadcastHex = await tx.toBroadcastFormat();
|
|
272
|
+
assert_1.default.ok(broadcastHex.startsWith(constants_1.AA_TRANSACTION_TYPE));
|
|
273
|
+
assert_1.default.ok(broadcastHex.length > unsignedHex.length, 'Signed should be longer');
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
(0, mocha_1.describe)('Transaction JSON Representation', () => {
|
|
277
|
+
(0, mocha_1.it)('should produce consistent JSON from built transaction', async () => {
|
|
278
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
279
|
+
builder
|
|
280
|
+
.addOperation({ token: mockToken, to: mockRecipient, amount: '100', memo: '4' })
|
|
281
|
+
.feeToken(mockFeeToken)
|
|
282
|
+
.nonce(50)
|
|
283
|
+
.gas(200000n)
|
|
284
|
+
.maxFeePerGas(3000000000n)
|
|
285
|
+
.maxPriorityFeePerGas(1500000000n);
|
|
286
|
+
const tx = (await builder.build());
|
|
287
|
+
const json = tx.toJson();
|
|
288
|
+
assert_1.default.strictEqual(json.type, constants_1.AA_TRANSACTION_TYPE);
|
|
289
|
+
assert_1.default.strictEqual(json.nonce, 50);
|
|
290
|
+
assert_1.default.strictEqual(json.gas, '200000');
|
|
291
|
+
assert_1.default.strictEqual(json.maxFeePerGas, '3000000000');
|
|
292
|
+
assert_1.default.strictEqual(json.maxPriorityFeePerGas, '1500000000');
|
|
293
|
+
assert_1.default.strictEqual(json.callCount, 1);
|
|
294
|
+
assert_1.default.strictEqual(json.feeToken, mockFeeToken);
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixpQ0FBcUM7QUFDckMsbUNBQWdDO0FBQ2hDLHlFQUEyRTtBQUMzRSwyREFBNkQ7QUFDN0QsK0NBTTZCO0FBQzdCLHVEQUE4RTtBQUM5RSw0Q0FBdUM7QUFDdkMsOENBTTRCO0FBRTVCLE1BQU0sY0FBYyxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFM0MsSUFBQSxnQkFBUSxFQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxJQUFBLGdCQUFRLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLElBQUEsVUFBRSxFQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsMEJBQWtCLEVBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDMUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsVUFBRSxFQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFNBQVMsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsZ0JBQVEsRUFBQyxvQkFBb0IsRUFBRSxHQUFH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QU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUaXAyMFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBhbW91bnRUb1RpcDIwVW5pdHMsXG4gIHRpcDIwVW5pdHNUb0Ftb3VudCxcbiAgc3RyaW5nVG9CeXRlczMyLFxuICBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8sXG4gIGlzVmFsaWRUaXAyMEFtb3VudCxcbn0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUSVAyMF9ERUNJTUFMUywgQUFfVFJBTlNBQ1RJT05fVFlQRSB9IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgVEVTVE5FVF9UT0tFTlMsXG4gIFRYX1BBUkFNUyxcbiAgRVJST1JfTUVTU0FHRVMsXG4gIFNJR05BVFVSRV9URVNUX0RBVEEsXG4gIFRFU1RfUkVDSVBJRU5UX0FERFJFU1MsXG59IGZyb20gJy4uL3Jlc291cmNlcy90ZW1wbyc7XG5cbmNvbnN0IG1vY2tDb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0dGVtcG8nKTtcblxuZGVzY3JpYmUoJ1RJUC0yMCBVdGlsaXRpZXMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdhbW91bnRUb1RpcDIwVW5pdHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGRlY2ltYWwgYW1vdW50IHRvIDYtZGVjaW1hbCB1bml0cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhbW91bnRUb1RpcDIwVW5pdHMoJzEuNScpLCAxNTAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYW1vdW50VG9UaXAyMFVuaXRzKCcxMDAnKSwgMTAwMDAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYW1vdW50VG9UaXAyMFVuaXRzKCcwLjAwMDAwMScpLCAxbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYW1vdW50VG9UaXAyMFVuaXRzKCdpbnZhbGlkJyksIC9JbnZhbGlkIGFtb3VudCBmb3JtYXQvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RpcDIwVW5pdHNUb0Ftb3VudCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgNi1kZWNpbWFsIHVuaXRzIHRvIGh1bWFuLXJlYWRhYmxlIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0aXAyMFVuaXRzVG9BbW91bnQoMTUwMDAwMG4pLCAnMS41Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGlwMjBVbml0c1RvQW1vdW50KDEwMDAwMDAwMG4pLCAnMTAwLjAnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0aXAyMFVuaXRzVG9BbW91bnQoMW4pLCAnMC4wMDAwMDEnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0cmluZ1RvQnl0ZXMzMicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgc3RyaW5nIHRvIGJ5dGVzMzInLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzdHJpbmdUb0J5dGVzMzIoJzEyMzQ1Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0Lmxlbmd0aCwgNjYpO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5zdGFydHNXaXRoKCcweCcpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIHN0cmluZyBsb25nZXIgdGhhbiAzMiBieXRlcycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gc3RyaW5nVG9CeXRlczMyKCdhJy5yZXBlYXQoMzMpKSwgL01lbW8gdG9vIGxvbmcvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VuY29kZVRpcDIwVHJhbnNmZXJXaXRoTWVtbycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVuY29kZSB0cmFuc2ZlcldpdGhNZW1vIGNhbGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0byA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweDc0MmQzNWNjNjYzNGMwNTMyOTI1YTNiODQ0YmM5ZTc1OTVmMGJlYjEnKTtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8odG8sIDE1MDAwMDBuLCAnMTIzNDUnKTtcbiAgICAgIGFzc2VydC5vayhlbmNvZGVkLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgICAgYXNzZXJ0Lm9rKGVuY29kZWQubGVuZ3RoID4gMTApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFRpcDIwQW1vdW50JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYW1vdW50cyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCcxLjUnKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCdpbnZhbGlkJyksIGZhbHNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkVGlwMjBBbW91bnQoJy01JyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RJUC0yMCBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBtb2NrVG9rZW4gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHgxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwJyk7XG4gIGNvbnN0IG1vY2tSZWNpcGllbnQgPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHg3NDJkMzVjYzY2MzRjMDUzMjkyNWEzYjg0NGJjOWU3NTk1ZjBiZWIxJyk7XG4gIGNvbnN0IG1vY2tGZWVUb2tlbiA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweGFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2QnKTtcblxuICBkZXNjcmliZSgnYWRkT3BlcmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIG9wZXJhdGlvbiB3aXRoIGFuZCB3aXRob3V0IG1lbW8nLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXIuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcgfSk7XG4gICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICc1MCcsIG1lbW86ICcxJyB9KTtcblxuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IGJ1aWxkZXIuZ2V0T3BlcmF0aW9ucygpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnMubGVuZ3RoLCAyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLm1lbW8sIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1sxXS5tZW1vLCAnMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBhZGRyZXNzZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIuYWRkT3BlcmF0aW9uKHsgdG9rZW46ICcweGludmFsaWQnIGFzIGFueSwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcgfSksXG4gICAgICAgIC9JbnZhbGlkIHRva2VuIGFkZHJlc3MvXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogJzB4aW52YWxpZCcgYXMgYW55LCBhbW91bnQ6ICcxMDAnIH0pLFxuICAgICAgICAvSW52YWxpZCByZWNpcGllbnQgYWRkcmVzcy9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogbW9ja1JlY2lwaWVudCwgYW1vdW50OiAnaW52YWxpZC1hbW91bnQnIH0pLFxuICAgICAgICAvSW52YWxpZCBhbW91bnQvXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgbWVtbyBsb25nZXIgdGhhbiAzMiBieXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogbW9ja1JlY2lwaWVudCwgYW1vdW50OiAnMTAwJywgbWVtbzogJ2EnLnJlcGVhdCgzMykgfSksXG4gICAgICAgIC9NZW1vIHRvbyBsb25nL1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZlZVRva2VuJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IGFuZCBnZXQgZmVlIHRva2VuJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyLmZlZVRva2VuKG1vY2tGZWVUb2tlbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlci5nZXRGZWVUb2tlbigpLCBtb2NrRmVlVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBmZWUgdG9rZW4gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmZlZVRva2VuKCdpbnZhbGlkLWFkZHJlc3MnKSwgL0ludmFsaWQgZmVlIHRva2VuIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgbm9uY2UsIGdhcywgbWF4RmVlUGVyR2FzLCBhbmQgbWF4UHJpb3JpdHlGZWVQZXJHYXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXIubm9uY2UoNDIpLmdhcyg1MDAwMDBuKS5tYXhGZWVQZXJHYXMoMTAwMDAwMDAwMG4pLm1heFByaW9yaXR5RmVlUGVyR2FzKDUwMDAwMDAwMG4pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbm9uY2UsIDQyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9nYXMsIDUwMDAwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkuX21heEZlZVBlckdhcywgMTAwMDAwMDAwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkuX21heFByaW9yaXR5RmVlUGVyR2FzLCA1MDAwMDAwMDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgbm9uY2UgYW5kIGdhcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLm5vbmNlKC0xKSwgL0ludmFsaWQgbm9uY2UvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5nYXMoMG4pLCAvSW52YWxpZCBnYXMgbGltaXQvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ01ldGhvZCBjaGFpbmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgZmx1ZW50IGludGVyZmFjZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcsIG1lbW86ICc1JyB9KVxuICAgICAgICAuZmVlVG9rZW4obW9ja0ZlZVRva2VuKVxuICAgICAgICAubm9uY2UoMTApXG4gICAgICAgIC5nYXMoNDAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcygyMDAwMDAwMDAwbilcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKDEwMDAwMDAwMDBuKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdUSVAtMjAgQ29uc3RhbnRzJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBkZWNpbWFsIHBsYWNlcycsICgpID0+IHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVElQMjBfREVDSU1BTFMsIDYpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnVElQLTIwIFRyYW5zYWN0aW9uIEJ1aWxkJywgKCkgPT4ge1xuICBjb25zdCBtb2NrVG9rZW4gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhURVNUTkVUX1RPS0VOUy5hbHBoYVVTRC5hZGRyZXNzKTtcbiAgY29uc3QgbW9ja1JlY2lwaWVudCA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKFRFU1RfUkVDSVBJRU5UX0FERFJFU1MpO1xuICBjb25zdCBtb2NrRmVlVG9rZW4gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhURVNUTkVUX1RPS0VOUy5iZXRhVVNELmFkZHJlc3MpO1xuXG4gIGRlc2NyaWJlKCdCdWlsZCBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHNpbmdsZS1vcGVyYXRpb24gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICcxMDAnLCBtZW1vOiAnMScgfSlcbiAgICAgICAgLmZlZVRva2VuKG1vY2tGZWVUb2tlbilcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5nYXMoMTAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heEZlZVBlckdhcylcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKFRYX1BBUkFNUy5kZWZhdWx0TWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG5cbiAgICAgIGFzc2VydC5vayh0eCBpbnN0YW5jZW9mIFRpcDIwVHJhbnNhY3Rpb24pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4LmdldE9wZXJhdGlvbkNvdW50KCksIDEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4LmdldEZlZVRva2VuKCksIG1vY2tGZWVUb2tlbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGJhdGNoIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlwbGUgb3BlcmF0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IFRFU1RORVRfVE9LRU5TLmFscGhhVVNELmFkZHJlc3MsIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICcxMCcsIG1lbW86ICcxJyB9KVxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IFRFU1RORVRfVE9LRU5TLmJldGFVU0QuYWRkcmVzcywgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzIwJywgbWVtbzogJzInIH0pXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogVEVTVE5FVF9UT0tFTlMudGhldGFVU0QuYWRkcmVzcywgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzMwJywgbWVtbzogJzMnIH0pXG4gICAgICAgIC5mZWVUb2tlbihtb2NrRmVlVG9rZW4pXG4gICAgICAgIC5ub25jZSg0MilcbiAgICAgICAgLmdhcygzMDAwMDBuKVxuICAgICAgICAubWF4RmVlUGVyR2FzKFRYX1BBUkFNUy5kZWZhdWx0TWF4RmVlUGVyR2FzKVxuICAgICAgICAubWF4UHJpb3JpdHlGZWVQZXJHYXMoVFhfUEFSQU1TLmRlZmF1bHRNYXhQcmlvcml0eUZlZVBlckdhcyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVGlwMjBUcmFuc2FjdGlvbjtcblxuICAgICAgYXNzZXJ0Lm9rKHR4IGluc3RhbmNlb2YgVGlwMjBUcmFuc2FjdGlvbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguZ2V0T3BlcmF0aW9uQ291bnQoKSwgMyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguaXNCYXRjaCgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aG91dCBmZWUgdG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICc1MCcgfSlcbiAgICAgICAgLm5vbmNlKDEpXG4gICAgICAgIC5nYXMoMTAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heEZlZVBlckdhcylcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKFRYX1BBUkFNUy5kZWZhdWx0TWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG5cbiAgICAgIGFzc2VydC5vayh0eCBpbnN0YW5jZW9mIFRpcDIwVHJhbnNhY3Rpb24pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4LmdldEZlZVRva2VuKCksIHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCdWlsZCBWYWxpZGF0aW9uIEVycm9ycycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbm8gb3BlcmF0aW9ucyBhZGRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlci5ub25jZSgwKS5nYXMoMTAwMDAwbikubWF4RmVlUGVyR2FzKDEwMDAwMDAwMDBuKS5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSwgRVJST1JfTUVTU0FHRVMubm9PcGVyYXRpb25zKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBub25jZSBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogbW9ja1JlY2lwaWVudCwgYW1vdW50OiAnMTAwJyB9KVxuICAgICAgICAuZ2FzKDEwMDAwMG4pXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoMTAwMDAwMDAwMG4pXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSwgRVJST1JfTUVTU0FHRVMubWlzc2luZ05vbmNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBnYXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcgfSlcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoMTAwMDAwMDAwMG4pXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSwgRVJST1JfTUVTU0FHRVMubWlzc2luZ0dhcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbWF4RmVlUGVyR2FzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICcxMDAnIH0pXG4gICAgICAgIC5ub25jZSgwKVxuICAgICAgICAuZ2FzKDEwMDAwMG4pXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSwgRVJST1JfTUVTU0FHRVMubWlzc2luZ01heEZlZVBlckdhcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbWF4UHJpb3JpdHlGZWVQZXJHYXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcgfSlcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5nYXMoMTAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcygxMDAwMDAwMDAwbik7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiBhd2FpdCBidWlsZGVyLmJ1aWxkKCksIEVSUk9SX01FU1NBR0VTLm1pc3NpbmdNYXhQcmlvcml0eUZlZVBlckdhcyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSb3VuZC1UcmlwOiBCdWlsZCAtPiBTZXJpYWxpemUgLT4gT3BlcmF0aW9ucyBDaGVjaycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByZXNlcnZlIG9wZXJhdGlvbiBkYXRhIHRocm91Z2ggYnVpbGQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcGVyYXRpb25zID0gW3sgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEyMycsIG1lbW86ICcxJyB9XTtcblxuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24ob3BlcmF0aW9uc1swXSlcbiAgICAgICAgLmZlZVRva2VuKG1vY2tGZWVUb2tlbilcbiAgICAgICAgLm5vbmNlKDEwKVxuICAgICAgICAuZ2FzKDE1MDAwMG4pXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoMjAwMDAwMDAwMG4pXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcygxMDAwMDAwMDAwbik7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVGlwMjBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4T3BzID0gdHguZ2V0T3BlcmF0aW9ucygpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhPcHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eE9wc1swXS50b2tlbiwgb3BlcmF0aW9uc1swXS50b2tlbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhPcHNbMF0udG8sIG9wZXJhdGlvbnNbMF0udG8pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4T3BzWzBdLmFtb3VudCwgb3BlcmF0aW9uc1swXS5hbW91bnQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4T3BzWzBdLm1lbW8sIG9wZXJhdGlvbnNbMF0ubWVtbyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCdWlsZCAtPiBTZXJpYWxpemUgLT4gU2lnbiBGbG93JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBzZXJpYWxpemFibGUgdW5zaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICc1MCcsIG1lbW86ICcyJyB9KVxuICAgICAgICAuZmVlVG9rZW4obW9ja0ZlZVRva2VuKVxuICAgICAgICAubm9uY2UoNSlcbiAgICAgICAgLmdhcygxMDAwMDBuKVxuICAgICAgICAubWF4RmVlUGVyR2FzKDIwMDAwMDAwMDBuKVxuICAgICAgICAubWF4UHJpb3JpdHlGZWVQZXJHYXMoMTAwMDAwMDAwMG4pO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB1bnNpZ25lZEhleCA9IGF3YWl0IHR4LnNlcmlhbGl6ZSgpO1xuXG4gICAgICBhc3NlcnQub2sodW5zaWduZWRIZXguc3RhcnRzV2l0aChBQV9UUkFOU0FDVElPTl9UWVBFKSk7XG4gICAgICBhc3NlcnQub2soL14weFswLTlhLWZdKyQvaS50ZXN0KHVuc2lnbmVkSGV4KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgZnVsbCBzaWduIGFuZCBicm9hZGNhc3QgZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzc1JywgbWVtbzogJzMnIH0pXG4gICAgICAgIC5mZWVUb2tlbihtb2NrRmVlVG9rZW4pXG4gICAgICAgIC5ub25jZSgxMjMpXG4gICAgICAgIC5nYXMoMTIwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcygyNTAwMDAwMDAwbilcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKDEyMDAwMDAwMDBuKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdW5zaWduZWRIZXggPSBhd2FpdCB0eC5zZXJpYWxpemUoKTtcblxuICAgICAgdHguc2V0U2lnbmF0dXJlKFNJR05BVFVSRV9URVNUX0RBVEEudmFsaWRTaWduYXR1cmUpO1xuXG4gICAgICBjb25zdCBicm9hZGNhc3RIZXggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgYXNzZXJ0Lm9rKGJyb2FkY2FzdEhleC5zdGFydHNXaXRoKEFBX1RSQU5TQUNUSU9OX1RZUEUpKTtcbiAgICAgIGFzc2VydC5vayhicm9hZGNhc3RIZXgubGVuZ3RoID4gdW5zaWduZWRIZXgubGVuZ3RoLCAnU2lnbmVkIHNob3VsZCBiZSBsb25nZXInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIEpTT04gUmVwcmVzZW50YXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGNvbnNpc3RlbnQgSlNPTiBmcm9tIGJ1aWx0IHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogbW9ja1JlY2lwaWVudCwgYW1vdW50OiAnMTAwJywgbWVtbzogJzQnIH0pXG4gICAgICAgIC5mZWVUb2tlbihtb2NrRmVlVG9rZW4pXG4gICAgICAgIC5ub25jZSg1MClcbiAgICAgICAgLmdhcygyMDAwMDBuKVxuICAgICAgICAubWF4RmVlUGVyR2FzKDMwMDAwMDAwMDBuKVxuICAgICAgICAubWF4UHJpb3JpdHlGZWVQZXJHYXMoMTUwMDAwMDAwMG4pO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChqc29uLnR5cGUsIEFBX1RSQU5TQUNUSU9OX1RZUEUpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24ubm9uY2UsIDUwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChqc29uLmdhcywgJzIwMDAwMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24ubWF4RmVlUGVyR2FzLCAnMzAwMDAwMDAwMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24ubWF4UHJpb3JpdHlGZWVQZXJHYXMsICcxNTAwMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoanNvbi5jYWxsQ291bnQsIDEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24uZmVlVG9rZW4sIG1vY2tGZWVUb2tlbik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|