@bitgo-beta/sdk-coin-icp 1.0.1-beta.81 → 1.0.1-beta.811

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.
Files changed (68) hide show
  1. package/dist/resources/messageCompiled.d.ts +797 -0
  2. package/dist/resources/messageCompiled.js +1859 -0
  3. package/dist/src/icp.d.ts +55 -2
  4. package/dist/src/icp.d.ts.map +1 -1
  5. package/dist/src/icp.js +300 -9
  6. package/dist/src/lib/icpAgent.d.ts +36 -0
  7. package/dist/src/lib/icpAgent.d.ts.map +1 -0
  8. package/dist/src/lib/icpAgent.js +90 -0
  9. package/dist/src/lib/iface.d.ts +191 -0
  10. package/dist/src/lib/iface.d.ts.map +1 -0
  11. package/dist/src/lib/iface.js +44 -0
  12. package/dist/src/lib/index.d.ts +4 -0
  13. package/dist/src/lib/index.d.ts.map +1 -1
  14. package/dist/src/lib/index.js +12 -2
  15. package/dist/src/lib/keyPair.js +4 -4
  16. package/dist/src/lib/signedTransactionBuilder.d.ts +9 -0
  17. package/dist/src/lib/signedTransactionBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/signedTransactionBuilder.js +64 -0
  19. package/dist/src/lib/transaction.d.ts +54 -0
  20. package/dist/src/lib/transaction.d.ts.map +1 -0
  21. package/dist/src/lib/transaction.js +255 -0
  22. package/dist/src/lib/transactionBuilder.d.ts +58 -28
  23. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/transactionBuilder.js +127 -40
  25. package/dist/src/lib/transactionBuilderFactory.d.ts +15 -14
  26. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  27. package/dist/src/lib/transactionBuilderFactory.js +43 -27
  28. package/dist/src/lib/transferBuilder.d.ts +7 -24
  29. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  30. package/dist/src/lib/transferBuilder.js +88 -43
  31. package/dist/src/lib/unsignedTransactionBuilder.d.ts +13 -0
  32. package/dist/src/lib/unsignedTransactionBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/unsignedTransactionBuilder.js +90 -0
  34. package/dist/src/lib/utils.d.ts +285 -7
  35. package/dist/src/lib/utils.d.ts.map +1 -1
  36. package/dist/src/lib/utils.js +607 -52
  37. package/dist/src/ticp.d.ts +0 -4
  38. package/dist/src/ticp.d.ts.map +1 -1
  39. package/dist/src/ticp.js +1 -7
  40. package/dist/test/resources/icp.d.ts +268 -0
  41. package/dist/test/resources/icp.d.ts.map +1 -0
  42. package/dist/test/resources/icp.js +377 -0
  43. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  44. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  45. package/dist/test/unit/getBuilderFactory.js +10 -0
  46. package/dist/test/unit/icp.d.ts +2 -0
  47. package/dist/test/unit/icp.d.ts.map +1 -0
  48. package/dist/test/unit/icp.js +246 -0
  49. package/dist/test/unit/keyPair.d.ts +2 -0
  50. package/dist/test/unit/keyPair.d.ts.map +1 -0
  51. package/dist/test/unit/keyPair.js +107 -0
  52. package/dist/test/unit/transaction.d.ts +2 -0
  53. package/dist/test/unit/transaction.d.ts.map +1 -0
  54. package/dist/test/unit/transaction.js +109 -0
  55. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  56. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  57. package/dist/test/unit/transactionBuilder/transactionBuilder.js +274 -0
  58. package/dist/test/unit/transactionBuilder/transactionRecover.d.ts +2 -0
  59. package/dist/test/unit/transactionBuilder/transactionRecover.d.ts.map +1 -0
  60. package/dist/test/unit/transactionBuilder/transactionRecover.js +188 -0
  61. package/dist/test/unit/utils.d.ts +2 -0
  62. package/dist/test/unit/utils.d.ts.map +1 -0
  63. package/dist/test/unit/utils.js +206 -0
  64. package/dist/tsconfig.tsbuildinfo +1 -0
  65. package/package.json +23 -12
  66. package/.eslintignore +0 -4
  67. package/.mocharc.yml +0 -8
  68. package/CHANGELOG.md +0 -44
@@ -0,0 +1,206 @@
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 should_1 = __importDefault(require("should"));
7
+ const utils_1 = __importDefault(require("../../src/lib/utils"));
8
+ const icp_1 = require("../resources/icp");
9
+ const { encode } = require('cbor-x/index-no-eval');
10
+ const crypto_1 = require("crypto");
11
+ describe('utils', () => {
12
+ describe('isValidAddress()', () => {
13
+ it('should validate addresses correctly', () => {
14
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account1.address), true);
15
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account2.address), true);
16
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account3.address), true);
17
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account4.address), true);
18
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account5.address), true);
19
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account6.address), true);
20
+ });
21
+ it('should invalidate wrong addresses correctly', () => {
22
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account1.address), false);
23
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account2.address), false);
24
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account3.address), false);
25
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account4.address), false);
26
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account5.address), false);
27
+ should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account6.address), false);
28
+ });
29
+ });
30
+ describe('isValidBlockId()', () => {
31
+ it('should validate block hashes correctly', () => {
32
+ should_1.default.equal(utils_1.default.isValidBlockId(icp_1.BlockHashes.validHashes.block1), true);
33
+ should_1.default.equal(utils_1.default.isValidBlockId(icp_1.BlockHashes.validHashes.block2), true);
34
+ should_1.default.equal(utils_1.default.isValidBlockId(icp_1.BlockHashes.validHashes.block3), true);
35
+ });
36
+ });
37
+ describe('isValidTransactionId()', () => {
38
+ it('should validate transaction hashes correctly', () => {
39
+ should_1.default.equal(utils_1.default.isValidBlockId(icp_1.TransactionHashes.validHashes.txId1), true);
40
+ should_1.default.equal(utils_1.default.isValidBlockId(icp_1.TransactionHashes.validHashes.txId2), true);
41
+ should_1.default.equal(utils_1.default.isValidBlockId(icp_1.TransactionHashes.validHashes.txId3), true);
42
+ });
43
+ });
44
+ describe('gasData()', () => {
45
+ it('should return correct gas data', () => {
46
+ should_1.default.equal(utils_1.default.feeData(), '-10000');
47
+ });
48
+ });
49
+ describe('isValidPublicKey()', () => {
50
+ it('should validate public key correctly', () => {
51
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account1.publicKey), true);
52
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account2.publicKey), true);
53
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account3.publicKey), true);
54
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account4.publicKey), true);
55
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account5.publicKey), true);
56
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account6.publicKey), true);
57
+ });
58
+ it('should invalidate public key correctly', () => {
59
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account1.publicKey), false);
60
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account2.publicKey), false);
61
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account3.publicKey), false);
62
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account4.publicKey), false);
63
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account5.publicKey), false);
64
+ should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account6.publicKey), false);
65
+ });
66
+ });
67
+ describe('cborEncode()', () => {
68
+ it('should correctly encode an object', () => {
69
+ const value = { key: 'value' };
70
+ const expectedHex = Buffer.from(encode(value)).toString('hex');
71
+ should_1.default.equal(utils_1.default.cborEncode(value), expectedHex);
72
+ });
73
+ it('should encode and decode a big number correctly', () => {
74
+ const original = { number: BigInt(1740680777458000000) };
75
+ const encoded = encode(original);
76
+ const decoded = utils_1.default.cborDecode(encoded);
77
+ should_1.default.deepEqual(decoded, original);
78
+ });
79
+ });
80
+ describe('cborDecode()', () => {
81
+ it('should correctly decode a CBOR-encoded object', () => {
82
+ const original = { key: 'value', number: 100 };
83
+ const encoded = encode(original);
84
+ const decoded = utils_1.default.cborDecode(encoded);
85
+ should_1.default.deepEqual(decoded, original);
86
+ });
87
+ });
88
+ describe('isValidLength()', () => {
89
+ it('should return true for a valid compressed public key length (66 characters)', () => {
90
+ should_1.default.equal(utils_1.default.isValidLength('a'.repeat(66)), true);
91
+ });
92
+ });
93
+ describe('isValidHex()', () => {
94
+ it('should return true for a valid hexadecimal string', () => {
95
+ should_1.default.equal(utils_1.default.isValidHex('abcdef1234567890ABCDEF'), true);
96
+ });
97
+ });
98
+ describe('hexToBytes()', () => {
99
+ it('should correctly convert a valid hexadecimal string to a Uint8Array', () => {
100
+ const hex = 'abcdef123456';
101
+ const expected = new Uint8Array([0xab, 0xcd, 0xef, 0x12, 0x34, 0x56]);
102
+ should_1.default.deepEqual(utils_1.default.hexToBytes(hex), expected);
103
+ });
104
+ });
105
+ describe('isValidPrivateKey()', () => {
106
+ it('should validate private key correctly', () => {
107
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account1.secretKey), true);
108
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account2.secretKey), true);
109
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account3.secretKey), true);
110
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account4.secretKey), true);
111
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account5.secretKey), true);
112
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account6.secretKey), true);
113
+ });
114
+ it('should invalidate private key correctly', () => {
115
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account1.secretKey), false);
116
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account2.secretKey), false);
117
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account3.secretKey), false);
118
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account4.secretKey), false);
119
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account5.secretKey), false);
120
+ should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account6.secretKey), false);
121
+ });
122
+ });
123
+ describe('getAddressFromPublicKey()', () => {
124
+ it('should return the correct address for a valid public key', async () => {
125
+ const address1 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
126
+ should_1.default.equal(address1, icp_1.Accounts.account1.address);
127
+ const address2 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
128
+ should_1.default.equal(address2, icp_1.Accounts.account1.address);
129
+ const address3 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
130
+ should_1.default.equal(address3, icp_1.Accounts.account1.address);
131
+ const address4 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
132
+ should_1.default.equal(address4, icp_1.Accounts.account1.address);
133
+ const address5 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
134
+ should_1.default.equal(address5, icp_1.Accounts.account1.address);
135
+ const address6 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
136
+ should_1.default.equal(address6, icp_1.Accounts.account1.address);
137
+ });
138
+ it('should throw an error for an invalid public key', async () => {
139
+ await (0, should_1.default)(utils_1.default.getAddressFromPublicKey(icp_1.Accounts.errorsAccounts.account1.publicKey)).be.rejectedWith('Invalid hex-encoded public key format.');
140
+ });
141
+ });
142
+ describe('generateKeyPair()', () => {
143
+ it('should generate a valid key pair without a seed', () => {
144
+ const keyPair = utils_1.default.generateKeyPair();
145
+ should_1.default.exist(keyPair);
146
+ should_1.default.exist(keyPair.pub);
147
+ should_1.default.exist(keyPair.prv);
148
+ });
149
+ it('should generate a valid key pair with a given seed', () => {
150
+ const seed = (0, crypto_1.randomBytes)(32);
151
+ const keyPair = utils_1.default.generateKeyPair(seed);
152
+ should_1.default.exist(keyPair);
153
+ should_1.default.exist(keyPair.pub);
154
+ should_1.default.exist(keyPair.prv);
155
+ });
156
+ it('should generate different key pairs for different seeds', () => {
157
+ const seed1 = (0, crypto_1.randomBytes)(32);
158
+ const seed2 = (0, crypto_1.randomBytes)(32);
159
+ const keyPair1 = utils_1.default.generateKeyPair(seed1);
160
+ const keyPair2 = utils_1.default.generateKeyPair(seed2);
161
+ should_1.default.notEqual(keyPair1.pub, keyPair2.pub);
162
+ should_1.default.notEqual(keyPair1.prv, keyPair2.prv);
163
+ });
164
+ it('should generate the same key pair for the same seed', () => {
165
+ const seed = (0, crypto_1.randomBytes)(32);
166
+ const keyPair1 = utils_1.default.generateKeyPair(seed);
167
+ const keyPair2 = utils_1.default.generateKeyPair(seed);
168
+ should_1.default.equal(keyPair1.pub, keyPair2.pub);
169
+ should_1.default.equal(keyPair1.prv, keyPair2.prv);
170
+ });
171
+ });
172
+ describe('validateRawTransaction()', () => {
173
+ const data = icp_1.IcpTransactionData;
174
+ it('should validate icpTransactionData correctly', () => {
175
+ utils_1.default.validateRawTransaction(data);
176
+ });
177
+ it('should throw an error for invalid expiryTime', () => {
178
+ (data.expiryTime = Date.now()), should_1.default.throws(() => utils_1.default.validateRawTransaction(data), 'Invalid expiry time');
179
+ });
180
+ it('should throw an error for invalid fee', () => {
181
+ data.fee = '-100';
182
+ should_1.default.throws(() => utils_1.default.validateRawTransaction(data), 'Invalid fee value');
183
+ });
184
+ it('should throw an error for invalid amount', () => {
185
+ data.amount = '0';
186
+ should_1.default.throws(() => utils_1.default.validateRawTransaction(data), 'amount cannot be less than or equal to zero');
187
+ });
188
+ });
189
+ describe('getTransactionId()', () => {
190
+ const sender = '47867f2cfb85094275c847435fa10cad54a813eba7e6a9bc3538aa2f537f1d73';
191
+ const receiver = 'a1c60efca988c411cd7bc5e481364b9c94caebb24c00e01db269e3a0541ee498';
192
+ it('should return the correct transaction hash for amount less than 2^32 (amount = 1000)', () => {
193
+ const unsignedTransaction = 'b90002677570646174657381826b5452414e53414354494f4eb900056b63616e69737465725f69644a000000000000000201016b6d6574686f645f6e616d656773656e645f70626361726758400a02080012050a0308e8071a0308904e2a220a20a1c60efca988c411cd7bc5e481364b9c94caebb24c00e01db269e3a0541ee4983a0a088084a8a988e4f4a0186673656e646572581da905b86bba9bfed194ac8c12377b5d48847128dbfff10f01adb80f7f026e696e67726573735f6578706972791b000000000000000070696e67726573735f6578706972696573811b1841d35866476200';
194
+ const transactionHash = utils_1.default.getTransactionId(unsignedTransaction, sender, receiver);
195
+ const expectedTransactionHash = 'bb502d0566f726da02a1925415f68cb6f175cdd6cba1e09823143078715b2ba4';
196
+ should_1.default.equal(transactionHash, expectedTransactionHash);
197
+ });
198
+ it('should return the correct transaction hash for amount greater than 2^32 (amount = 6948150200)', () => {
199
+ const unsignedTransaction = 'b90002677570646174657381826b5452414e53414354494f4eb900056b63616e69737465725f69644a000000000000000201016b6d6574686f645f6e616d656773656e645f70626361726758430a02080012080a0608b8b791f1191a0308904e2a220a20a1c60efca988c411cd7bc5e481364b9c94caebb24c00e01db269e3a0541ee4983a0a0880b8a789bfebf4a0186673656e646572581da905b86bba9bfed194ac8c12377b5d48847128dbfff10f01adb80f7f026e696e67726573735f6578706972791b000000000000000070696e67726573735f6578706972696573811b1841d393d2473c00';
200
+ const transactionHash = utils_1.default.getTransactionId(unsignedTransaction, sender, receiver);
201
+ const expectedTransactionHash = '016411110006d4645cbcb553a84efdec6c402847f856caa909111d81bb513565';
202
+ should_1.default.equal(transactionHash, expectedTransactionHash);
203
+ });
204
+ });
205
+ });
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsZ0VBQXdDO0FBQ3hDLDBDQUFnRztBQUNoRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDbkQsbUNBQXFDO0FBRXJDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO0lBQ3JCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtZQUM3QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLGNBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxjQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsY0FBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLGNBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxjQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsY0FBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMs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QUFtQixHQUN2Qiw4Y0FBOGMsQ0FBQztZQUNqZCxNQUFNLGVBQWUsR0FBRyxlQUFLLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RGLE1BQU0sdUJBQXVCLEdBQUcsa0VBQWtFLENBQUM7WUFDbkcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0ZBQStGLEVBQUUsR0FBRyxFQUFFO1lBQ3ZHLE1BQU0sbUJBQW1CLEdBQ3ZCLG9kQUFvZCxDQUFDO1lBQ3ZkLE1BQU0sZUFBZSxHQUFHLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEYsTUFBTSx1QkFBdUIsR0FBRyxrRUFBa0UsQ0FBQztZQUNuRyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBBY2NvdW50cywgSWNwVHJhbnNhY3Rpb25EYXRhLCBCbG9ja0hhc2hlcywgVHJhbnNhY3Rpb25IYXNoZXMgfSBmcm9tICcuLi9yZXNvdXJjZXMvaWNwJztcbmNvbnN0IHsgZW5jb2RlIH0gPSByZXF1aXJlKCdjYm9yLXgvaW5kZXgtbm8tZXZhbCcpO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5kZXNjcmliZSgndXRpbHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdpc1ZhbGlkQWRkcmVzcygpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmFjY291bnQzLmFkZHJlc3MpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5hY2NvdW50NC5hZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuYWNjb3VudDUuYWRkcmVzcyksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmFjY291bnQ2LmFkZHJlc3MpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW52YWxpZGF0ZSB3cm9uZyBhZGRyZXNzZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQxLmFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50My5hZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQ0LmFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDUuYWRkcmVzcyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50Ni5hZGRyZXNzKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZEJsb2NrSWQoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGJsb2NrIGhhc2hlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoQmxvY2tIYXNoZXMudmFsaWRIYXNoZXMuYmxvY2sxKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoQmxvY2tIYXNoZXMudmFsaWRIYXNoZXMuYmxvY2syKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoQmxvY2tIYXNoZXMudmFsaWRIYXNoZXMuYmxvY2szKSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkVHJhbnNhY3Rpb25JZCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdHJhbnNhY3Rpb24gaGFzaGVzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQmxvY2tJZChUcmFuc2FjdGlvbkhhc2hlcy52YWxpZEhhc2hlcy50eElkMSksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKFRyYW5zYWN0aW9uSGFzaGVzLnZhbGlkSGFzaGVzLnR4SWQyKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoVHJhbnNhY3Rpb25IYXNoZXMudmFsaWRIYXNoZXMudHhJZDMpLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dhc0RhdGEoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGdhcyBkYXRhJywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmZlZURhdGEoKSwgJy0xMDAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFB1YmxpY0tleSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgcHVibGljIGtleSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHVibGljS2V5KEFjY291bnRzLmFjY291bnQyLnB1YmxpY0tleSksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDMucHVibGljS2V5KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50NC5wdWJsaWNLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHVibGljS2V5KEFjY291bnRzLmFjY291bnQ1LnB1YmxpY0tleSksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDYucHVibGljS2V5KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGludmFsaWRhdGUgcHVibGljIGtleSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50Mi5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50My5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50NC5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50NS5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50Ni5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYm9yRW5jb2RlKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIGFuIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0geyBrZXk6ICd2YWx1ZScgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkSGV4ID0gQnVmZmVyLmZyb20oZW5jb2RlKHZhbHVlKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmNib3JFbmNvZGUodmFsdWUpLCBleHBlY3RlZEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGVuY29kZSBhbmQgZGVjb2RlIGEgYmlnIG51bWJlciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IHsgbnVtYmVyOiBCaWdJbnQoMTc0MDY4MDc3NzQ1ODAwMDAwMCkgfTtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGUob3JpZ2luYWwpO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmNib3JEZWNvZGUoZW5jb2RlZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGRlY29kZWQsIG9yaWdpbmFsKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Nib3JEZWNvZGUoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBkZWNvZGUgYSBDQk9SLWVuY29kZWQgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWwgPSB7IGtleTogJ3ZhbHVlJywgbnVtYmVyOiAxMDAgfTtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGUob3JpZ2luYWwpO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmNib3JEZWNvZGUoZW5jb2RlZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGRlY29kZWQsIG9yaWdpbmFsKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRMZW5ndGgoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBhIHZhbGlkIGNvbXByZXNzZWQgcHVibGljIGtleSBsZW5ndGggKDY2IGNoYXJhY3RlcnMpJywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRMZW5ndGgoJ2EnLnJlcGVhdCg2NikpLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRIZXgoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBhIHZhbGlkIGhleGFkZWNpbWFsIHN0cmluZycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkSGV4KCdhYmNkZWYxMjM0NTY3ODkwQUJDREVGJyksIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGV4VG9CeXRlcygpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGNvbnZlcnQgYSB2YWxpZCBoZXhhZGVjaW1hbCBzdHJpbmcgdG8gYSBVaW50OEFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgaGV4ID0gJ2FiY2RlZjEyMzQ1Nic7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IG5ldyBVaW50OEFycmF5KFsweGFiLCAweGNkLCAweGVmLCAweDEyLCAweDM0LCAweDU2XSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHV0aWxzLmhleFRvQnl0ZXMoaGV4KSwgZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFByaXZhdGVLZXkoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHByaXZhdGUga2V5IGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50MS5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50Mi5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50My5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50NC5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50NS5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50Ni5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW52YWxpZGF0ZSBwcml2YXRlIGtleSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDEuc2VjcmV0S2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQyLnNlY3JldEtleSksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50My5zZWNyZXRLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDQuc2VjcmV0S2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQ1LnNlY3JldEtleSksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50Ni5zZWNyZXRLZXkpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzRnJvbVB1YmxpY0tleSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGFkZHJlc3MgZm9yIGEgdmFsaWQgcHVibGljIGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZHJlc3MxID0gYXdhaXQgdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChhZGRyZXNzMSwgQWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICBjb25zdCBhZGRyZXNzMiA9IGF3YWl0IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoYWRkcmVzczIsIEFjY291bnRzLmFjY291bnQxLmFkZHJlc3MpO1xuICAgICAgY29uc3QgYWRkcmVzczMgPSBhd2FpdCB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKGFkZHJlc3MzLCBBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IGFkZHJlc3M0ID0gYXdhaXQgdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChhZGRyZXNzNCwgQWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICBjb25zdCBhZGRyZXNzNSA9IGF3YWl0IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoYWRkcmVzczUsIEFjY291bnRzLmFjY291bnQxLmFkZHJlc3MpO1xuICAgICAgY29uc3QgYWRkcmVzczYgPSBhd2FpdCB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKGFkZHJlc3M2LCBBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgZm9yIGFuIGludmFsaWQgcHVibGljIGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNob3VsZCh1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpKS5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdJbnZhbGlkIGhleC1lbmNvZGVkIHB1YmxpYyBrZXkgZm9ybWF0LidcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZW5lcmF0ZUtleVBhaXIoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgdmFsaWQga2V5IHBhaXIgd2l0aG91dCBhIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gdXRpbHMuZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgICBzaG91bGQuZXhpc3Qoa2V5UGFpcik7XG4gICAgICBzaG91bGQuZXhpc3Qoa2V5UGFpci5wdWIpO1xuICAgICAgc2hvdWxkLmV4aXN0KGtleVBhaXIucHJ2KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSB2YWxpZCBrZXkgcGFpciB3aXRoIGEgZ2l2ZW4gc2VlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcygzMik7XG4gICAgICBjb25zdCBrZXlQYWlyID0gdXRpbHMuZ2VuZXJhdGVLZXlQYWlyKHNlZWQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGtleVBhaXIpO1xuICAgICAgc2hvdWxkLmV4aXN0KGtleVBhaXIucHViKTtcbiAgICAgIHNob3VsZC5leGlzdChrZXlQYWlyLnBydik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGRpZmZlcmVudCBrZXkgcGFpcnMgZm9yIGRpZmZlcmVudCBzZWVkcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlZWQxID0gcmFuZG9tQnl0ZXMoMzIpO1xuICAgICAgY29uc3Qgc2VlZDIgPSByYW5kb21CeXRlcygzMik7XG4gICAgICBjb25zdCBrZXlQYWlyMSA9IHV0aWxzLmdlbmVyYXRlS2V5UGFpcihzZWVkMSk7XG4gICAgICBjb25zdCBrZXlQYWlyMiA9IHV0aWxzLmdlbmVyYXRlS2V5UGFpcihzZWVkMik7XG5cbiAgICAgIHNob3VsZC5ub3RFcXVhbChrZXlQYWlyMS5wdWIsIGtleVBhaXIyLnB1Yik7XG4gICAgICBzaG91bGQubm90RXF1YWwoa2V5UGFpcjEucHJ2LCBrZXlQYWlyMi5wcnYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSB0aGUgc2FtZSBrZXkgcGFpciBmb3IgdGhlIHNhbWUgc2VlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcygzMik7XG4gICAgICBjb25zdCBrZXlQYWlyMSA9IHV0aWxzLmdlbmVyYXRlS2V5UGFpcihzZWVkKTtcbiAgICAgIGNvbnN0IGtleVBhaXIyID0gdXRpbHMuZ2VuZXJhdGVLZXlQYWlyKHNlZWQpO1xuXG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpcjEucHViLCBrZXlQYWlyMi5wdWIpO1xuICAgICAgc2hvdWxkLmVxdWFsKGtleVBhaXIxLnBydiwga2V5UGFpcjIucHJ2KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oKScsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gSWNwVHJhbnNhY3Rpb25EYXRhO1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgaWNwVHJhbnNhY3Rpb25EYXRhIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHV0aWxzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oZGF0YSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3IgaW52YWxpZCBleHBpcnlUaW1lJywgKCkgPT4ge1xuICAgICAgKGRhdGEuZXhwaXJ5VGltZSA9IERhdGUubm93KCkpLCBzaG91bGQudGhyb3dzKCgpID0+IHV0aWxzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oZGF0YSksICdJbnZhbGlkIGV4cGlyeSB0aW1lJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3IgaW52YWxpZCBmZWUnLCAoKSA9PiB7XG4gICAgICBkYXRhLmZlZSA9ICctMTAwJztcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihkYXRhKSwgJ0ludmFsaWQgZmVlIHZhbHVlJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3IgaW52YWxpZCBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBkYXRhLmFtb3VudCA9ICcwJztcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihkYXRhKSwgJ2Ftb3VudCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFRyYW5zYWN0aW9uSWQoKScsICgpID0+IHtcbiAgICBjb25zdCBzZW5kZXIgPSAnNDc4NjdmMmNmYjg1MDk0Mjc1Yzg0NzQzNWZhMTBjYWQ1NGE4MTNlYmE3ZTZhOWJjMzUzOGFhMmY1MzdmMWQ3Myc7XG4gICAgY29uc3QgcmVjZWl2ZXIgPSAnYTFjNjBlZmNhOTg4YzQxMWNkN2JjNWU0ODEzNjRiOWM5NGNhZWJiMjRjMDBlMDFkYjI2OWUzYTA1NDFlZTQ5OCc7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgdHJhbnNhY3Rpb24gaGFzaCBmb3IgYW1vdW50IGxlc3MgdGhhbiAyXjMyIChhbW91bnQgPSAxMDAwKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHJhbnNhY3Rpb24gPVxuICAgICAgICAnYjkwMDAyNjc3NTcwNjQ2MTc0NjU3MzgxODI2YjU0NTI0MTRlNTM0MTQzNTQ0OTRmNGViOTAwMDU2YjYzNjE2ZTY5NzM3NDY1NzI1ZjY5NjQ0YTAwMDAwMDAwMDAwMDAwMDIwMTAxNmI2ZDY1NzQ2ODZmNjQ1ZjZlNjE2ZDY1Njc3MzY1NmU2NDVmNzA2MjYzNjE3MjY3NTg0MDBhMDIwODAwMTIwNTBhMDMwOGU4MDcxYTAzMDg5MDRlMmEyMjBhMjBhMWM2MGVmY2E5ODhjNDExY2Q3YmM1ZTQ4MTM2NGI5Yzk0Y2FlYmIyNGMwMGUwMWRiMjY5ZTNhMDU0MWVlNDk4M2EwYTA4ODA4NGE4YTk4OGU0ZjRhMDE4NjY3MzY1NmU2NDY1NzI1ODFkYTkwNWI4NmJiYTliZmVkMTk0YWM4YzEyMzc3YjVkNDg4NDcxMjhkYmZmZjEwZjAxYWRiODBmN2YwMjZlNjk2ZTY3NzI2NTczNzM1ZjY1Nzg3MDY5NzI3OTFiMDAwMDAwMDAwMDAwMDAwMDcwNjk2ZTY3NzI2NTczNzM1ZjY1Nzg3MDY5NzI2OTY1NzM4MTFiMTg0MWQzNTg2NjQ3NjIwMCc7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbkhhc2ggPSB1dGlscy5nZXRUcmFuc2FjdGlvbklkKHVuc2lnbmVkVHJhbnNhY3Rpb24sIHNlbmRlciwgcmVjZWl2ZXIpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbkhhc2ggPSAnYmI1MDJkMDU2NmY3MjZkYTAyYTE5MjU0MTVmNjhjYjZmMTc1Y2RkNmNiYTFlMDk4MjMxNDMwNzg3MTViMmJhNCc7XG4gICAgICBzaG91bGQuZXF1YWwodHJhbnNhY3Rpb25IYXNoLCBleHBlY3RlZFRyYW5zYWN0aW9uSGFzaCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCB0cmFuc2FjdGlvbiBoYXNoIGZvciBhbW91bnQgZ3JlYXRlciB0aGFuIDJeMzIgKGFtb3VudCA9IDY5NDgxNTAyMDApJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9XG4gICAgICAgICdiOTAwMDI2Nzc1NzA2NDYxNzQ2NTczODE4MjZiNTQ1MjQxNGU1MzQxNDM1NDQ5NGY0ZWI5MDAwNTZiNjM2MTZlNjk3Mzc0NjU3MjVmNjk2NDRhMDAwMDAwMDAwMDAwMDAwMjAxMDE2YjZkNjU3NDY4NmY2NDVmNmU2MTZkNjU2NzczNjU2ZTY0NWY3MDYyNjM2MTcyNjc1ODQzMGEwMjA4MDAxMjA4MGEwNjA4YjhiNzkxZjExOTFhMDMwODkwNGUyYTIyMGEyMGExYzYwZWZjYTk4OGM0MTFjZDdiYzVlNDgxMzY0YjljOTRjYWViYjI0YzAwZTAxZGIyNjllM2EwNTQxZWU0OTgzYTBhMDg4MGI4YTc4OWJmZWJmNGEwMTg2NjczNjU2ZTY0NjU3MjU4MWRhOTA1Yjg2YmJhOWJmZWQxOTRhYzhjMTIzNzdiNWQ0ODg0NzEyOGRiZmZmMTBmMDFhZGI4MGY3ZjAyNmU2OTZlNjc3MjY1NzM3MzVmNjU3ODcwNjk3Mjc5MWIwMDAwMDAwMDAwMDAwMDAwNzA2OTZlNjc3MjY1NzM3MzVmNjU3ODcwNjk3MjY5NjU3MzgxMWIxODQxZDM5M2QyNDczYzAwJztcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSGFzaCA9IHV0aWxzLmdldFRyYW5zYWN0aW9uSWQodW5zaWduZWRUcmFuc2FjdGlvbiwgc2VuZGVyLCByZWNlaXZlcik7XG4gICAgICBjb25zdCBleHBlY3RlZFRyYW5zYWN0aW9uSGFzaCA9ICcwMTY0MTExMTAwMDZkNDY0NWNiY2I1NTNhODRlZmRlYzZjNDAyODQ3Zjg1NmNhYTkwOTExMWQ4MWJiNTEzNTY1JztcbiAgICAgIHNob3VsZC5lcXVhbCh0cmFuc2FjdGlvbkhhc2gsIGV4cGVjdGVkVHJhbnNhY3Rpb25IYXNoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==