@bitgo-beta/sdk-coin-polyx 1.0.1-beta.982 → 1.0.1-beta.983
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/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/nominateBuilder.d.ts +18 -0
- package/dist/src/lib/nominateBuilder.d.ts.map +1 -0
- package/dist/src/lib/nominateBuilder.js +99 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +6 -2
- package/dist/src/lib/txnSchema.js +5 -5
- package/dist/test/resources/index.d.ts +6 -0
- package/dist/test/resources/index.d.ts.map +1 -1
- package/dist/test/resources/index.js +11 -2
- package/dist/test/unit/transactionBuilder/nominateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/nominateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/nominateBuilder.js +169 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
|
|
7
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
8
|
+
const should_1 = __importDefault(require("should"));
|
|
9
|
+
const lib_1 = require("../../../src/lib");
|
|
10
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
11
|
+
const utils_1 = __importDefault(require("../../../src/lib/utils"));
|
|
12
|
+
const resources_1 = require("../../resources");
|
|
13
|
+
describe('Polyx Nominate Builder', function () {
|
|
14
|
+
let builder;
|
|
15
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tpolyx'));
|
|
16
|
+
const senderAddress = resources_1.accounts.account1.address;
|
|
17
|
+
const validatorAddress = resources_1.nominateValidators[0];
|
|
18
|
+
const validatorAddress2 = resources_1.nominateValidators[1];
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
builder = factory.getNominateBuilder();
|
|
21
|
+
});
|
|
22
|
+
describe('transaction type', () => {
|
|
23
|
+
it('should return StakingVote transaction type', () => {
|
|
24
|
+
should_1.default.equal(builder['transactionType'], sdk_core_1.TransactionType.StakingVote);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('validators setter validation', () => {
|
|
28
|
+
it('should reject empty validators array', () => {
|
|
29
|
+
should_1.default.throws(() => builder.validators([]), /at least 1/);
|
|
30
|
+
});
|
|
31
|
+
it('should reject more than 16 validators', () => {
|
|
32
|
+
const tooMany = Array(17).fill(validatorAddress);
|
|
33
|
+
should_1.default.throws(() => builder.validators(tooMany), /at most 16/);
|
|
34
|
+
});
|
|
35
|
+
it('should reject malformed validator addresses', () => {
|
|
36
|
+
should_1.default.throws(() => builder.validators(['not-a-valid-address']), /is not a well-formed/);
|
|
37
|
+
});
|
|
38
|
+
it('should accept valid single validator', () => {
|
|
39
|
+
should_1.default.doesNotThrow(() => builder.validators([validatorAddress]));
|
|
40
|
+
should_1.default.deepEqual(builder.getValidators(), [validatorAddress]);
|
|
41
|
+
});
|
|
42
|
+
it('should accept multiple valid validators', () => {
|
|
43
|
+
should_1.default.doesNotThrow(() => builder.validators([validatorAddress, validatorAddress2]));
|
|
44
|
+
should_1.default.deepEqual(builder.getValidators(), [validatorAddress, validatorAddress2]);
|
|
45
|
+
});
|
|
46
|
+
it('should accept exactly 16 validators', () => {
|
|
47
|
+
const exactly16 = Array(16).fill(validatorAddress);
|
|
48
|
+
should_1.default.doesNotThrow(() => builder.validators(exactly16));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('build unsigned nominate transaction', () => {
|
|
52
|
+
it('should build an unsigned nominate transaction', async () => {
|
|
53
|
+
const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
|
|
54
|
+
builder
|
|
55
|
+
.validators([validatorAddress, validatorAddress2])
|
|
56
|
+
.sender({ address: senderAddress })
|
|
57
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
58
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
59
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 15 })
|
|
60
|
+
.fee({ amount: 0, type: 'tip' })
|
|
61
|
+
.material(material);
|
|
62
|
+
const tx = await builder.build();
|
|
63
|
+
should_1.default.exist(tx);
|
|
64
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingVote);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('build signed nominate transaction', () => {
|
|
68
|
+
it('should parse a signed nominate transaction from hex', () => {
|
|
69
|
+
const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
|
|
70
|
+
const signedBuilder = factory.getNominateBuilder();
|
|
71
|
+
signedBuilder.material(material);
|
|
72
|
+
signedBuilder.from(resources_1.nominateTx.signed);
|
|
73
|
+
const validators = signedBuilder.getValidators();
|
|
74
|
+
should_1.default.exist(validators);
|
|
75
|
+
validators.length.should.be.greaterThan(0);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('validateDecodedTransaction', () => {
|
|
79
|
+
it('should reject non-nominate method name', () => {
|
|
80
|
+
const mockDecoded = {
|
|
81
|
+
method: { name: 'bond', pallet: 'staking', args: {} },
|
|
82
|
+
};
|
|
83
|
+
should_1.default.throws(() => builder.validateDecodedTransaction(mockDecoded), /Invalid transaction type/);
|
|
84
|
+
});
|
|
85
|
+
it('should validate a real built nominate transaction', () => {
|
|
86
|
+
const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
|
|
87
|
+
builder
|
|
88
|
+
.validators([validatorAddress, validatorAddress2])
|
|
89
|
+
.sender({ address: senderAddress })
|
|
90
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
91
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
92
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 15 })
|
|
93
|
+
.fee({ amount: 0, type: 'tip' })
|
|
94
|
+
.material(material);
|
|
95
|
+
const unsignedTx = builder['buildTransaction']();
|
|
96
|
+
const decodedTx = (0, txwrapper_polkadot_1.decode)(unsignedTx, {
|
|
97
|
+
metadataRpc: material.metadata,
|
|
98
|
+
registry: builder['_registry'],
|
|
99
|
+
});
|
|
100
|
+
should_1.default.equal(decodedTx.method.name, 'nominate');
|
|
101
|
+
should_1.default.doesNotThrow(() => builder.validateDecodedTransaction(decodedTx));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('parse from raw signed transaction', () => {
|
|
105
|
+
it('should parse signed nominate tx and recover validators', () => {
|
|
106
|
+
const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
|
|
107
|
+
const newBuilder = factory.getNominateBuilder();
|
|
108
|
+
newBuilder.material(material);
|
|
109
|
+
newBuilder.from(resources_1.nominateTx.signed);
|
|
110
|
+
const validators = newBuilder.getValidators();
|
|
111
|
+
should_1.default.exist(validators);
|
|
112
|
+
validators.length.should.be.greaterThan(0);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('parse from raw unsigned transaction', () => {
|
|
116
|
+
it('should parse unsigned nominate tx and recover validators', async () => {
|
|
117
|
+
const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
|
|
118
|
+
// Build a real unsigned tx first, then parse it back
|
|
119
|
+
const originalBuilder = factory.getNominateBuilder();
|
|
120
|
+
originalBuilder
|
|
121
|
+
.validators([validatorAddress, validatorAddress2])
|
|
122
|
+
.sender({ address: senderAddress })
|
|
123
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
124
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
125
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 15 })
|
|
126
|
+
.fee({ amount: 0, type: 'tip' })
|
|
127
|
+
.material(material);
|
|
128
|
+
const tx = await originalBuilder.build();
|
|
129
|
+
const rawHex = tx.toBroadcastFormat();
|
|
130
|
+
const newBuilder = factory.getNominateBuilder();
|
|
131
|
+
newBuilder.material(material);
|
|
132
|
+
newBuilder.from(rawHex);
|
|
133
|
+
const validators = newBuilder.getValidators();
|
|
134
|
+
should_1.default.exist(validators);
|
|
135
|
+
should_1.default.deepEqual(validators, [validatorAddress, validatorAddress2]);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe('round-trip', () => {
|
|
139
|
+
it('should rebuild from serialized unsigned transaction and preserve validators', async () => {
|
|
140
|
+
const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
|
|
141
|
+
const originalBuilder = factory.getNominateBuilder();
|
|
142
|
+
originalBuilder
|
|
143
|
+
.validators([validatorAddress, validatorAddress2])
|
|
144
|
+
.sender({ address: senderAddress })
|
|
145
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
146
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
147
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 15 })
|
|
148
|
+
.fee({ amount: 0, type: 'tip' })
|
|
149
|
+
.material(material);
|
|
150
|
+
const tx = await originalBuilder.build();
|
|
151
|
+
const rawHex = tx.toBroadcastFormat();
|
|
152
|
+
const rebuiltBuilder = factory.getNominateBuilder();
|
|
153
|
+
rebuiltBuilder.material(material);
|
|
154
|
+
rebuiltBuilder.from(rawHex);
|
|
155
|
+
should_1.default.deepEqual(rebuiltBuilder.getValidators(), [validatorAddress, validatorAddress2]);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('factory routing', () => {
|
|
159
|
+
it('should route raw nominate extrinsic to NominateBuilder', () => {
|
|
160
|
+
const resolvedBuilder = factory.from(resources_1.nominateTx.signed);
|
|
161
|
+
should_1.default.ok(resolvedBuilder instanceof lib_1.NominateBuilder, 'expected NominateBuilder');
|
|
162
|
+
});
|
|
163
|
+
it('should route batchAll bond+nominate to BatchBuilder', () => {
|
|
164
|
+
const resolvedBuilder = factory.from(resources_1.stakingTx.batch.bondAndNominate.signed);
|
|
165
|
+
should_1.default.ok(resolvedBuilder instanceof lib_1.BatchBuilder, 'expected BatchBuilder');
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9taW5hdGVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9ub21pbmF0ZUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzRUFBdUQ7QUFDdkQsaURBQTRDO0FBQzVDLG9EQUE0QjtBQUM1QiwwQ0FBNEY7QUFDNUYsbURBQXVEO0FBQ3ZELG1FQUEyQztBQUMzQywrQ0FBc0Y7QUFFdEYsUUFBUSxDQUFDLHdCQUF3QixFQUFFO0lBQ2pDLElBQUksT0FBd0IsQ0FBQztJQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVuRSxNQUFNLGFBQWEsR0FBRyxvQkFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyw4QkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxNQUFNLGlCQUFpQixHQUFHLDhCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhELFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxPQUFPLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ2hDLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7WUFDcEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsMEJBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtRQUM1QyxFQUFFLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxFQUFFO1lBQzlDLGdCQUFN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LEVBQUUsR0FBRyxFQUFFO1FBQy9CLEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxHQUFHLEVBQUU7WUFDaEUsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hELGdCQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsWUFBWSxxQkFBZSxFQUFFLDBCQUEwQixDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsR0FBRyxFQUFFO1lBQzdELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQVMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdFLGdCQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsWUFBWSxrQkFBWSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItcG9sa2Fkb3QnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIE5vbWluYXRlQnVpbGRlciwgQmF0Y2hCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBhY2NvdW50cywgbm9taW5hdGVUeCwgbm9taW5hdGVWYWxpZGF0b3JzLCBzdGFraW5nVHggfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMnO1xuXG5kZXNjcmliZSgnUG9seXggTm9taW5hdGUgQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJ1aWxkZXI6IE5vbWluYXRlQnVpbGRlcjtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndHBvbHl4JykpO1xuXG4gIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzO1xuICBjb25zdCB2YWxpZGF0b3JBZGRyZXNzID0gbm9taW5hdGVWYWxpZGF0b3JzWzBdO1xuICBjb25zdCB2YWxpZGF0b3JBZGRyZXNzMiA9IG5vbWluYXRlVmFsaWRhdG9yc1sxXTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBidWlsZGVyID0gZmFjdG9yeS5nZXROb21pbmF0ZUJ1aWxkZXIoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIHR5cGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gU3Rha2luZ1ZvdGUgdHJhbnNhY3Rpb24gdHlwZScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChidWlsZGVyWyd0cmFuc2FjdGlvblR5cGUnXSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdWb3RlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRvcnMgc2V0dGVyIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZWplY3QgZW1wdHkgdmFsaWRhdG9ycyBhcnJheScsICgpID0+IHtcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gYnVpbGRlci52YWxpZGF0b3JzKFtdKSwgL2F0IGxlYXN0IDEvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG1vcmUgdGhhbiAxNiB2YWxpZGF0b3JzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdG9vTWFueSA9IEFycmF5KDE3KS5maWxsKHZhbGlkYXRvckFkZHJlc3MpO1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiBidWlsZGVyLnZhbGlkYXRvcnModG9vTWFueSksIC9hdCBtb3N0IDE2Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBtYWxmb3JtZWQgdmFsaWRhdG9yIGFkZHJlc3NlcycsICgpID0+IHtcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gYnVpbGRlci52YWxpZGF0b3JzKFsnbm90LWEtdmFsaWQtYWRkcmVzcyddKSwgL2lzIG5vdCBhIHdlbGwtZm9ybWVkLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBzaW5nbGUgdmFsaWRhdG9yJywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRvcnMoW3ZhbGlkYXRvckFkZHJlc3NdKSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGJ1aWxkZXIuZ2V0VmFsaWRhdG9ycygpLCBbdmFsaWRhdG9yQWRkcmVzc10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgbXVsdGlwbGUgdmFsaWQgdmFsaWRhdG9ycycsICgpID0+IHtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0b3JzKFt2YWxpZGF0b3JBZGRyZXNzLCB2YWxpZGF0b3JBZGRyZXNzMl0pKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoYnVpbGRlci5nZXRWYWxpZGF0b3JzKCksIFt2YWxpZGF0b3JBZGRyZXNzLCB2YWxpZGF0b3JBZGRyZXNzMl0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgZXhhY3RseSAxNiB2YWxpZGF0b3JzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhhY3RseTE2ID0gQXJyYXkoMTYpLmZpbGwodmFsaWRhdG9yQWRkcmVzcyk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdG9ycyhleGFjdGx5MTYpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1aWxkIHVuc2lnbmVkIG5vbWluYXRlIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gdW5zaWduZWQgbm9taW5hdGUgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKGNvaW5zLmdldCgndHBvbHl4JykubmV0d29yay50eXBlKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnZhbGlkYXRvcnMoW3ZhbGlkYXRvckFkZHJlc3MsIHZhbGlkYXRvckFkZHJlc3MyXSlcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlckFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jaygnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMTUgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSlcbiAgICAgICAgLm1hdGVyaWFsKG1hdGVyaWFsKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXhpc3QodHgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVm90ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBzaWduZWQgbm9taW5hdGUgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIHNpZ25lZCBub21pbmF0ZSB0cmFuc2FjdGlvbiBmcm9tIGhleCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29pbnMuZ2V0KCd0cG9seXgnKS5uZXR3b3JrLnR5cGUpO1xuICAgICAgY29uc3Qgc2lnbmVkQnVpbGRlciA9IGZhY3RvcnkuZ2V0Tm9taW5hdGVCdWlsZGVyKCk7XG4gICAgICBzaWduZWRCdWlsZGVyLm1hdGVyaWFsKG1hdGVyaWFsKTtcbiAgICAgIHNpZ25lZEJ1aWxkZXIuZnJvbShub21pbmF0ZVR4LnNpZ25lZCk7XG5cbiAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBzaWduZWRCdWlsZGVyLmdldFZhbGlkYXRvcnMoKTtcbiAgICAgIHNob3VsZC5leGlzdCh2YWxpZGF0b3JzKTtcbiAgICAgIHZhbGlkYXRvcnMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlRGVjb2RlZFRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5vbi1ub21pbmF0ZSBtZXRob2QgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tEZWNvZGVkID0ge1xuICAgICAgICBtZXRob2Q6IHsgbmFtZTogJ2JvbmQnLCBwYWxsZXQ6ICdzdGFraW5nJywgYXJnczoge30gfSxcbiAgICAgIH07XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVEZWNvZGVkVHJhbnNhY3Rpb24obW9ja0RlY29kZWQgYXMgbmV2ZXIpLCAvSW52YWxpZCB0cmFuc2FjdGlvbiB0eXBlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgcmVhbCBidWlsdCBub21pbmF0ZSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29pbnMuZ2V0KCd0cG9seXgnKS5uZXR3b3JrLnR5cGUpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAudmFsaWRhdG9ycyhbdmFsaWRhdG9yQWRkcmVzcywgdmFsaWRhdG9yQWRkcmVzczJdKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyQWRkcmVzcyB9KVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiAzOTMzLCBtYXhEdXJhdGlvbjogNjQgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKCcweDE0OTc5OWJjOTYwMmNiNWNmMjAxZjM0MjVmYjhkMjUzYjJkNGU2MWZjMTE5ZGNhYjMyNDlmMzA3ZjU5NDc1NGQnKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAxNSB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KVxuICAgICAgICAubWF0ZXJpYWwobWF0ZXJpYWwpO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYnVpbGRlclsnYnVpbGRUcmFuc2FjdGlvbiddKCk7XG4gICAgICBjb25zdCBkZWNvZGVkVHggPSBkZWNvZGUodW5zaWduZWRUeCwge1xuICAgICAgICBtZXRhZGF0YVJwYzogbWF0ZXJpYWwubWV0YWRhdGEsXG4gICAgICAgIHJlZ2lzdHJ5OiBidWlsZGVyWydfcmVnaXN0cnknXSxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZFR4Lm1ldGhvZC5uYW1lLCAnbm9taW5hdGUnKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZURlY29kZWRUcmFuc2FjdGlvbihkZWNvZGVkVHgpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BhcnNlIGZyb20gcmF3IHNpZ25lZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIHNpZ25lZCBub21pbmF0ZSB0eCBhbmQgcmVjb3ZlciB2YWxpZGF0b3JzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb2lucy5nZXQoJ3Rwb2x5eCcpLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCBuZXdCdWlsZGVyID0gZmFjdG9yeS5nZXROb21pbmF0ZUJ1aWxkZXIoKTtcbiAgICAgIG5ld0J1aWxkZXIubWF0ZXJpYWwobWF0ZXJpYWwpO1xuICAgICAgbmV3QnVpbGRlci5mcm9tKG5vbWluYXRlVHguc2lnbmVkKTtcblxuICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IG5ld0J1aWxkZXIuZ2V0VmFsaWRhdG9ycygpO1xuICAgICAgc2hvdWxkLmV4aXN0KHZhbGlkYXRvcnMpO1xuICAgICAgdmFsaWRhdG9ycy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2UgZnJvbSByYXcgdW5zaWduZWQgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSB1bnNpZ25lZCBub21pbmF0ZSB0eCBhbmQgcmVjb3ZlciB2YWxpZGF0b3JzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb2lucy5nZXQoJ3Rwb2x5eCcpLm5ldHdvcmsudHlwZSk7XG4gICAgICAvLyBCdWlsZCBhIHJlYWwgdW5zaWduZWQgdHggZmlyc3QsIHRoZW4gcGFyc2UgaXQgYmFja1xuICAgICAgY29uc3Qgb3JpZ2luYWxCdWlsZGVyID0gZmFjdG9yeS5nZXROb21pbmF0ZUJ1aWxkZXIoKTtcbiAgICAgIG9yaWdpbmFsQnVpbGRlclxuICAgICAgICAudmFsaWRhdG9ycyhbdmFsaWRhdG9yQWRkcmVzcywgdmFsaWRhdG9yQWRkcmVzczJdKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyQWRkcmVzcyB9KVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiAzOTMzLCBtYXhEdXJhdGlvbjogNjQgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKCcweDE0OTc5OWJjOTYwMmNiNWNmMjAxZjM0MjVmYjhkMjUzYjJkNGU2MWZjMTE5ZGNhYjMyNDlmMzA3ZjU5NDc1NGQnKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAxNSB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KVxuICAgICAgICAubWF0ZXJpYWwobWF0ZXJpYWwpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IG9yaWdpbmFsQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3SGV4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IGZhY3RvcnkuZ2V0Tm9taW5hdGVCdWlsZGVyKCk7XG4gICAgICBuZXdCdWlsZGVyLm1hdGVyaWFsKG1hdGVyaWFsKTtcbiAgICAgIG5ld0J1aWxkZXIuZnJvbShyYXdIZXgpO1xuXG4gICAgICBjb25zdCB2YWxpZGF0b3JzID0gbmV3QnVpbGRlci5nZXRWYWxpZGF0b3JzKCk7XG4gICAgICBzaG91bGQuZXhpc3QodmFsaWRhdG9ycyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHZhbGlkYXRvcnMsIFt2YWxpZGF0b3JBZGRyZXNzLCB2YWxpZGF0b3JBZGRyZXNzMl0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncm91bmQtdHJpcCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlYnVpbGQgZnJvbSBzZXJpYWxpemVkIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGFuZCBwcmVzZXJ2ZSB2YWxpZGF0b3JzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb2lucy5nZXQoJ3Rwb2x5eCcpLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCBvcmlnaW5hbEJ1aWxkZXIgPSBmYWN0b3J5LmdldE5vbWluYXRlQnVpbGRlcigpO1xuICAgICAgb3JpZ2luYWxCdWlsZGVyXG4gICAgICAgIC52YWxpZGF0b3JzKFt2YWxpZGF0b3JBZGRyZXNzLCB2YWxpZGF0b3JBZGRyZXNzMl0pXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXJBZGRyZXNzIH0pXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCcpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDE1IH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pXG4gICAgICAgIC5tYXRlcmlhbChtYXRlcmlhbCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgb3JpZ2luYWxCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCByZWJ1aWx0QnVpbGRlciA9IGZhY3RvcnkuZ2V0Tm9taW5hdGVCdWlsZGVyKCk7XG4gICAgICByZWJ1aWx0QnVpbGRlci5tYXRlcmlhbChtYXRlcmlhbCk7XG4gICAgICByZWJ1aWx0QnVpbGRlci5mcm9tKHJhd0hleCk7XG5cbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVidWlsdEJ1aWxkZXIuZ2V0VmFsaWRhdG9ycygpLCBbdmFsaWRhdG9yQWRkcmVzcywgdmFsaWRhdG9yQWRkcmVzczJdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZhY3Rvcnkgcm91dGluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJvdXRlIHJhdyBub21pbmF0ZSBleHRyaW5zaWMgdG8gTm9taW5hdGVCdWlsZGVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKG5vbWluYXRlVHguc2lnbmVkKTtcbiAgICAgIHNob3VsZC5vayhyZXNvbHZlZEJ1aWxkZXIgaW5zdGFuY2VvZiBOb21pbmF0ZUJ1aWxkZXIsICdleHBlY3RlZCBOb21pbmF0ZUJ1aWxkZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcm91dGUgYmF0Y2hBbGwgYm9uZCtub21pbmF0ZSB0byBCYXRjaEJ1aWxkZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oc3Rha2luZ1R4LmJhdGNoLmJvbmRBbmROb21pbmF0ZS5zaWduZWQpO1xuICAgICAgc2hvdWxkLm9rKHJlc29sdmVkQnVpbGRlciBpbnN0YW5jZW9mIEJhdGNoQnVpbGRlciwgJ2V4cGVjdGVkIEJhdGNoQnVpbGRlcicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|