@bitgo-beta/sdk-coin-flrp 1.0.1-beta.67 → 1.0.1-beta.68

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 (113) hide show
  1. package/dist/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +6 -6
  3. package/dist/src/flrp.d.ts +0 -91
  4. package/dist/src/flrp.d.ts.map +0 -1
  5. package/dist/src/flrp.js +0 -343
  6. package/dist/src/iface.d.ts +0 -25
  7. package/dist/src/iface.d.ts.map +0 -1
  8. package/dist/src/iface.js +0 -3
  9. package/dist/src/index.d.ts +0 -6
  10. package/dist/src/index.d.ts.map +0 -1
  11. package/dist/src/index.js +0 -45
  12. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +0 -26
  13. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +0 -1
  14. package/dist/src/lib/atomicInCTransactionBuilder.js +0 -64
  15. package/dist/src/lib/atomicTransactionBuilder.d.ts +0 -96
  16. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +0 -1
  17. package/dist/src/lib/atomicTransactionBuilder.js +0 -318
  18. package/dist/src/lib/constants.d.ts +0 -170
  19. package/dist/src/lib/constants.d.ts.map +0 -1
  20. package/dist/src/lib/constants.js +0 -227
  21. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
  22. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  23. package/dist/src/lib/delegatorTxBuilder.js +0 -224
  24. package/dist/src/lib/errors.d.ts +0 -8
  25. package/dist/src/lib/errors.d.ts.map +0 -1
  26. package/dist/src/lib/errors.js +0 -19
  27. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  28. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  29. package/dist/src/lib/exportInCTxBuilder.js +0 -199
  30. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  31. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  32. package/dist/src/lib/exportInPTxBuilder.js +0 -120
  33. package/dist/src/lib/iface.d.ts +0 -119
  34. package/dist/src/lib/iface.d.ts.map +0 -1
  35. package/dist/src/lib/iface.js +0 -22
  36. package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
  37. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  38. package/dist/src/lib/importInCTxBuilder.js +0 -403
  39. package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
  40. package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
  41. package/dist/src/lib/importInPTxBuilder.js +0 -464
  42. package/dist/src/lib/index.d.ts +0 -12
  43. package/dist/src/lib/index.d.ts.map +0 -1
  44. package/dist/src/lib/index.js +0 -39
  45. package/dist/src/lib/keyPair.d.ts +0 -58
  46. package/dist/src/lib/keyPair.d.ts.map +0 -1
  47. package/dist/src/lib/keyPair.js +0 -142
  48. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +0 -81
  49. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
  50. package/dist/src/lib/permissionlessValidatorTxBuilder.js +0 -248
  51. package/dist/src/lib/transaction.d.ts +0 -111
  52. package/dist/src/lib/transaction.d.ts.map +0 -1
  53. package/dist/src/lib/transaction.js +0 -322
  54. package/dist/src/lib/transactionBuilder.d.ts +0 -85
  55. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  56. package/dist/src/lib/transactionBuilder.js +0 -167
  57. package/dist/src/lib/transactionBuilderFactory.d.ts +0 -37
  58. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  59. package/dist/src/lib/transactionBuilderFactory.js +0 -91
  60. package/dist/src/lib/types.d.ts +0 -78
  61. package/dist/src/lib/types.d.ts.map +0 -1
  62. package/dist/src/lib/types.js +0 -5
  63. package/dist/src/lib/utils.d.ts +0 -217
  64. package/dist/src/lib/utils.d.ts.map +0 -1
  65. package/dist/src/lib/utils.js +0 -498
  66. package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
  67. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  68. package/dist/src/lib/validatorTxBuilder.js +0 -180
  69. package/dist/src/register.d.ts +0 -3
  70. package/dist/src/register.d.ts.map +0 -1
  71. package/dist/src/register.js +0 -11
  72. package/dist/src/tflrp.d.ts +0 -8
  73. package/dist/src/tflrp.d.ts.map +0 -1
  74. package/dist/src/tflrp.js +0 -14
  75. package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
  76. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
  77. package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
  78. package/dist/test/unit/flrp.d.ts +0 -2
  79. package/dist/test/unit/flrp.d.ts.map +0 -1
  80. package/dist/test/unit/flrp.js +0 -118
  81. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  82. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  83. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  84. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +0 -2
  85. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +0 -1
  86. package/dist/test/unit/lib/exportInCTxBuilder.js +0 -584
  87. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +0 -2
  88. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +0 -1
  89. package/dist/test/unit/lib/exportInPTxBuilder.js +0 -377
  90. package/dist/test/unit/lib/importInCTxBuilder.d.ts +0 -2
  91. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +0 -1
  92. package/dist/test/unit/lib/importInCTxBuilder.js +0 -257
  93. package/dist/test/unit/lib/importInPTxBuilder.d.ts +0 -2
  94. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +0 -1
  95. package/dist/test/unit/lib/importInPTxBuilder.js +0 -500
  96. package/dist/test/unit/lib/transaction.d.ts +0 -2
  97. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  98. package/dist/test/unit/lib/transaction.js +0 -460
  99. package/dist/test/unit/lib/utils.d.ts +0 -2
  100. package/dist/test/unit/lib/utils.d.ts.map +0 -1
  101. package/dist/test/unit/lib/utils.js +0 -286
  102. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
  103. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
  104. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
  105. package/dist/test/unit/smoke.d.ts +0 -2
  106. package/dist/test/unit/smoke.d.ts.map +0 -1
  107. package/dist/test/unit/smoke.js +0 -23
  108. package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
  109. package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
  110. package/dist/test/unit/transactionBuilder.test.js +0 -114
  111. package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
  112. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
  113. package/dist/test/unit/validatorTxBuilder.test.js +0 -293
@@ -1,293 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- const statics_1 = require("@bitgo-beta/statics");
37
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
38
- const assert = __importStar(require("assert"));
39
- const validatorTxBuilder_1 = require("../../src/lib/validatorTxBuilder");
40
- const delegatorTxBuilder_1 = require("../../src/lib/delegatorTxBuilder");
41
- describe('ValidatorTxBuilder', function () {
42
- const coinConfig = statics_1.coins.get('tflrp');
43
- let builder;
44
- beforeEach(function () {
45
- builder = new validatorTxBuilder_1.ValidatorTxBuilder(coinConfig);
46
- });
47
- describe('Constructor', function () {
48
- it('should initialize with coin config', function () {
49
- assert.ok(builder);
50
- assert.ok(builder instanceof validatorTxBuilder_1.ValidatorTxBuilder);
51
- assert.ok(builder instanceof delegatorTxBuilder_1.DelegatorTxBuilder);
52
- });
53
- it('should have correct transaction type', function () {
54
- assert.strictEqual(builder['transactionType'], sdk_core_1.TransactionType.AddValidator);
55
- });
56
- it('should initialize with undefined delegation fee rate', function () {
57
- assert.strictEqual(builder['_delegationFeeRate'], undefined);
58
- });
59
- });
60
- describe('delegationFeeRate', function () {
61
- it('should set valid delegation fee rate', function () {
62
- const result = builder.delegationFeeRate(25000); // 2.5%
63
- assert.strictEqual(result, builder);
64
- assert.strictEqual(builder['_delegationFeeRate'], 25000);
65
- });
66
- it('should reject negative delegation fee rate', function () {
67
- assert.throws(() => {
68
- builder.delegationFeeRate(-1000);
69
- }, sdk_core_1.BuildTransactionError);
70
- });
71
- it('should reject delegation fee rate below minimum (2%)', function () {
72
- assert.throws(() => {
73
- builder.delegationFeeRate(19999); // Below 2%
74
- }, sdk_core_1.BuildTransactionError);
75
- });
76
- it('should accept minimum delegation fee rate (2%)', function () {
77
- assert.doesNotThrow(() => {
78
- builder.delegationFeeRate(20000); // Exactly 2%
79
- });
80
- });
81
- it('should accept delegation fee rate above minimum', function () {
82
- assert.doesNotThrow(() => {
83
- builder.delegationFeeRate(30000); // 3%
84
- });
85
- });
86
- it('should handle maximum possible delegation fee rate', function () {
87
- assert.doesNotThrow(() => {
88
- builder.delegationFeeRate(1000000); // 100%
89
- });
90
- });
91
- it('should update delegation fee rate when called multiple times', function () {
92
- builder.delegationFeeRate(25000);
93
- assert.strictEqual(builder['_delegationFeeRate'], 25000);
94
- builder.delegationFeeRate(30000);
95
- assert.strictEqual(builder['_delegationFeeRate'], 30000);
96
- });
97
- });
98
- describe('Method chaining', function () {
99
- it('should allow method chaining with delegation fee rate', function () {
100
- const result = builder
101
- .delegationFeeRate(25000) // 2.5%
102
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
103
- .startTime(1640995200)
104
- .endTime(1641081600)
105
- .stakeAmount('1000000000000000000');
106
- assert.strictEqual(result, builder);
107
- assert.strictEqual(builder['_delegationFeeRate'], 25000);
108
- assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
109
- assert.strictEqual(builder['_startTime'], 1640995200n);
110
- assert.strictEqual(builder['_endTime'], 1641081600n);
111
- assert.strictEqual(builder['_stakeAmount'], 1000000000000000000n);
112
- });
113
- it('should chain with all delegator methods', function () {
114
- const result = builder
115
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
116
- .startTime(1640995200)
117
- .endTime(1641081600)
118
- .stakeAmount('1000000000000000000')
119
- .delegationFeeRate(25000) // 2.5%
120
- .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
121
- assert.strictEqual(result, builder);
122
- assert.strictEqual(builder['_delegationFeeRate'], 25000);
123
- });
124
- it('should work when delegation fee rate is set first', function () {
125
- const result = builder
126
- .delegationFeeRate(30000) // 3%
127
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
128
- assert.strictEqual(result, builder);
129
- assert.strictEqual(builder['_delegationFeeRate'], 30000);
130
- assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
131
- });
132
- it('should work when delegation fee rate is set last', function () {
133
- const result = builder
134
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
135
- .startTime(1640995200)
136
- .delegationFeeRate(25000); // 2.5%
137
- assert.strictEqual(result, builder);
138
- assert.strictEqual(builder['_delegationFeeRate'], 25000);
139
- assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
140
- });
141
- });
142
- describe('Inheritance from DelegatorTxBuilder', function () {
143
- it('should inherit nodeID method', function () {
144
- const result = builder.nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
145
- assert.strictEqual(result, builder);
146
- assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
147
- });
148
- it('should inherit startTime method', function () {
149
- const result = builder.startTime(1640995200);
150
- assert.strictEqual(result, builder);
151
- assert.strictEqual(builder['_startTime'], 1640995200n);
152
- });
153
- it('should inherit endTime method', function () {
154
- const result = builder.endTime(1641081600);
155
- assert.strictEqual(result, builder);
156
- assert.strictEqual(builder['_endTime'], 1641081600n);
157
- });
158
- it('should inherit stakeAmount method', function () {
159
- const result = builder.stakeAmount('1000000000000000000');
160
- assert.strictEqual(result, builder);
161
- assert.strictEqual(builder['_stakeAmount'], 1000000000000000000n);
162
- });
163
- it('should inherit rewardAddresses method', function () {
164
- const addresses = ['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m'];
165
- const result = builder.rewardAddresses(addresses);
166
- assert.strictEqual(result, builder);
167
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
168
- assert.deepStrictEqual(builder.transaction._rewardAddresses, addresses);
169
- });
170
- it('should inherit validation from delegator methods', function () {
171
- // Should inherit node ID validation - empty node ID should throw
172
- assert.throws(() => {
173
- builder.nodeID('');
174
- }, sdk_core_1.BuildTransactionError);
175
- // Should inherit time validation - negative time should throw
176
- assert.throws(() => {
177
- builder.startTime(-1);
178
- }, sdk_core_1.BuildTransactionError);
179
- // Should inherit stake amount validation - negative amount should throw
180
- assert.throws(() => {
181
- builder.stakeAmount(-1000);
182
- }, sdk_core_1.BuildTransactionError);
183
- });
184
- });
185
- describe('Transaction building validation', function () {
186
- it('should require delegation fee rate for validation', async function () {
187
- builder
188
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
189
- .startTime(1640995200)
190
- .endTime(1641081600)
191
- .stakeAmount('1000000000000000000')
192
- .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
193
- // Validator builder should fail validation without delegation fee rate (0 is invalid)
194
- await assert.rejects(async () => {
195
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
196
- await builder.buildFlareTransaction();
197
- }, sdk_core_1.BuildTransactionError);
198
- });
199
- it('should pass validation with delegation fee rate', async function () {
200
- builder
201
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
202
- .startTime(1640995200)
203
- .endTime(1641081600)
204
- .stakeAmount('1000000000000000000')
205
- .delegationFeeRate(25000) // 2.5%
206
- .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
207
- await assert.doesNotReject(async () => {
208
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
- await builder.buildFlareTransaction();
210
- });
211
- });
212
- it('should require all delegator fields', async function () {
213
- builder.delegationFeeRate(25000); // 2.5%
214
- // Should still fail without other required fields
215
- await assert.rejects(async () => {
216
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
217
- await builder.buildFlareTransaction();
218
- }, sdk_core_1.BuildTransactionError);
219
- });
220
- });
221
- describe('buildFlareTransaction', function () {
222
- it('should reject building without delegation fee rate', async function () {
223
- builder
224
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
225
- .startTime(1640995200)
226
- .endTime(1641081600)
227
- .stakeAmount('1000000000000000000')
228
- .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
229
- await assert.rejects(async () => {
230
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
231
- await builder.buildFlareTransaction();
232
- }, sdk_core_1.BuildTransactionError);
233
- });
234
- it('should reject building without required delegator fields', async function () {
235
- builder.delegationFeeRate(25000); // 2.5%
236
- await assert.rejects(async () => {
237
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
238
- await builder.buildFlareTransaction();
239
- }, sdk_core_1.BuildTransactionError);
240
- });
241
- it('should build transaction with all required fields', async function () {
242
- builder
243
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
244
- .startTime(1640995200)
245
- .endTime(1641081600)
246
- .stakeAmount('1000000000000000000')
247
- .delegationFeeRate(25000) // 2.5%
248
- .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
249
- await assert.doesNotReject(async () => {
250
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
251
- await builder.buildFlareTransaction();
252
- });
253
- });
254
- it('should inherit time validation from delegator builder', function () {
255
- // This test verifies that time validation happens immediately when setting values
256
- assert.throws(() => {
257
- builder
258
- .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
259
- .startTime(1641081600)
260
- .endTime(1640995200) // End time before start time
261
- .stakeAmount('1000000000000000000')
262
- .delegationFeeRate(25000); // 2.5%
263
- }, sdk_core_1.BuildTransactionError);
264
- });
265
- });
266
- describe('Edge cases and validation', function () {
267
- it('should handle minimum delegation fee rate (2%)', function () {
268
- assert.doesNotThrow(() => {
269
- builder.delegationFeeRate(20000); // 2%
270
- });
271
- assert.strictEqual(builder['_delegationFeeRate'], 20000);
272
- });
273
- it('should handle higher delegation fee rates', function () {
274
- assert.doesNotThrow(() => {
275
- builder.delegationFeeRate(50000); // 5%
276
- });
277
- assert.strictEqual(builder['_delegationFeeRate'], 50000);
278
- });
279
- it('should handle fee rate validation edge cases', function () {
280
- // Just below minimum (2%)
281
- assert.throws(() => builder.delegationFeeRate(19999), sdk_core_1.BuildTransactionError);
282
- // Just at minimum
283
- assert.doesNotThrow(() => builder.delegationFeeRate(20000));
284
- });
285
- it('should maintain validator-specific properties after operations', function () {
286
- builder.delegationFeeRate(25000); // 2.5%
287
- builder.nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
288
- assert.strictEqual(builder['_delegationFeeRate'], 25000);
289
- assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
290
- });
291
- });
292
- });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yVHhCdWlsZGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmFsaWRhdG9yVHhCdWlsZGVyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsbURBQThFO0FBQzlFLCtDQUFpQztBQUNqQyx5RUFBc0U7QUFDdEUseUVBQXNFO0FBRXRFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLElBQUksT0FBMkIsQ0FBQztJQUVoQyxVQUFVLENBQUM7UUFDVCxPQUFPLEdBQUcsSUFBSSx1Q0FBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLFlBQVksdUNBQWtCLENBQUMsQ0FBQztZQUNqRCxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sWUFBWSx1Q0FBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsMEJBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzREFBc0QsRUFBRTtZQUN6RCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFD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QUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsMENBQTBDLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFZhbGlkYXRvclR4QnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvdmFsaWRhdG9yVHhCdWlsZGVyJztcbmltcG9ydCB7IERlbGVnYXRvclR4QnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvZGVsZWdhdG9yVHhCdWlsZGVyJztcblxuZGVzY3JpYmUoJ1ZhbGlkYXRvclR4QnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgndGZscnAnKTtcbiAgbGV0IGJ1aWxkZXI6IFZhbGlkYXRvclR4QnVpbGRlcjtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBidWlsZGVyID0gbmV3IFZhbGlkYXRvclR4QnVpbGRlcihjb2luQ29uZmlnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NvbnN0cnVjdG9yJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB3aXRoIGNvaW4gY29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKGJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0Lm9rKGJ1aWxkZXIgaW5zdGFuY2VvZiBWYWxpZGF0b3JUeEJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0Lm9rKGJ1aWxkZXIgaW5zdGFuY2VvZiBEZWxlZ2F0b3JUeEJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgdHJhbnNhY3Rpb24gdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWyd0cmFuc2FjdGlvblR5cGUnXSwgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgd2l0aCB1bmRlZmluZWQgZGVsZWdhdGlvbiBmZWUgcmF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfZGVsZWdhdGlvbkZlZVJhdGUnXSwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlbGVnYXRpb25GZWVSYXRlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHZhbGlkIGRlbGVnYXRpb24gZmVlIHJhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDI1MDAwKTsgLy8gMi41JVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2RlbGVnYXRpb25GZWVSYXRlJ10sIDI1MDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGRlbGVnYXRpb24gZmVlIHJhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgtMTAwMCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgZGVsZWdhdGlvbiBmZWUgcmF0ZSBiZWxvdyBtaW5pbXVtICgyJSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgxOTk5OSk7IC8vIEJlbG93IDIlXG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgbWluaW11bSBkZWxlZ2F0aW9uIGZlZSByYXRlICgyJSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgyMDAwMCk7IC8vIEV4YWN0bHkgMiVcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgZGVsZWdhdGlvbiBmZWUgcmF0ZSBhYm92ZSBtaW5pbXVtJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZGVsZWdhdGlvbkZlZVJhdGUoMzAwMDApOyAvLyAzJVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtYXhpbXVtIHBvc3NpYmxlIGRlbGVnYXRpb24gZmVlIHJhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgxMDAwMDAwKTsgLy8gMTAwJVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVwZGF0ZSBkZWxlZ2F0aW9uIGZlZSByYXRlIHdoZW4gY2FsbGVkIG11bHRpcGxlIHRpbWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgyNTAwMCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2RlbGVnYXRpb25GZWVSYXRlJ10sIDI1MDAwKTtcblxuICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgzMDAwMCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2RlbGVnYXRpb25GZWVSYXRlJ10sIDMwMDAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ01ldGhvZCBjaGFpbmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFsbG93IG1ldGhvZCBjaGFpbmluZyB3aXRoIGRlbGVnYXRpb24gZmVlIHJhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyXG4gICAgICAgIC5kZWxlZ2F0aW9uRmVlUmF0ZSgyNTAwMCkgLy8gMi41JVxuICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJylcbiAgICAgICAgLnN0YXJ0VGltZSgxNjQwOTk1MjAwKVxuICAgICAgICAuZW5kVGltZSgxNjQxMDgxNjAwKVxuICAgICAgICAuc3Rha2VBbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2RlbGVnYXRpb25GZWVSYXRlJ10sIDI1MDAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfbm9kZUlEJ10sICdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX3N0YXJ0VGltZSddLCAxNjQwOTk1MjAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2VuZFRpbWUnXSwgMTY0MTA4MTYwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19zdGFrZUFtb3VudCddLCAxMDAwMDAwMDAwMDAwMDAwMDAwbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNoYWluIHdpdGggYWxsIGRlbGVnYXRvciBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlclxuICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJylcbiAgICAgICAgLnN0YXJ0VGltZSgxNjQwOTk1MjAwKVxuICAgICAgICAuZW5kVGltZSgxNjQxMDgxNjAwKVxuICAgICAgICAuc3Rha2VBbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKVxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUoMjUwMDApIC8vIDIuNSVcbiAgICAgICAgLnJld2FyZEFkZHJlc3NlcyhbJ1AtZmxhcmUxeDByNWgwbDh3Nm5qM2sycDBkNWc5dDViOHYzYTlrMW0nXSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19kZWxlZ2F0aW9uRmVlUmF0ZSddLCAyNTAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdvcmsgd2hlbiBkZWxlZ2F0aW9uIGZlZSByYXRlIGlzIHNldCBmaXJzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXJcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKDMwMDAwKSAvLyAzJVxuICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19kZWxlZ2F0aW9uRmVlUmF0ZSddLCAzMDAwMCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX25vZGVJRCddLCAnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIHdoZW4gZGVsZWdhdGlvbiBmZWUgcmF0ZSBpcyBzZXQgbGFzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCgnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpXG4gICAgICAgIC5zdGFydFRpbWUoMTY0MDk5NTIwMClcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKDI1MDAwKTsgLy8gMi41JVxuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfZGVsZWdhdGlvbkZlZVJhdGUnXSwgMjUwMDApO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19ub2RlSUQnXSwgJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0luaGVyaXRhbmNlIGZyb20gRGVsZWdhdG9yVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaW5oZXJpdCBub2RlSUQgbWV0aG9kJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci5ub2RlSUQoJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19ub2RlSUQnXSwgJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5oZXJpdCBzdGFydFRpbWUgbWV0aG9kJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci5zdGFydFRpbWUoMTY0MDk5NTIwMCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfc3RhcnRUaW1lJ10sIDE2NDA5OTUyMDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5oZXJpdCBlbmRUaW1lIG1ldGhvZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuZW5kVGltZSgxNjQxMDgxNjAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19lbmRUaW1lJ10sIDE2NDEwODE2MDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5oZXJpdCBzdGFrZUFtb3VudCBtZXRob2QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnN0YWtlQW1vdW50KCcxMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfc3Rha2VBbW91bnQnXSwgMTAwMDAwMDAwMDAwMDAwMDAwMG4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmhlcml0IHJld2FyZEFkZHJlc3NlcyBtZXRob2QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbJ1AtZmxhcmUxeDByNWgwbDh3Nm5qM2sycDBkNWc5dDViOHYzYTlrMW0nXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIucmV3YXJkQWRkcmVzc2VzKGFkZHJlc3Nlcyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcywgYWRkcmVzc2VzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5oZXJpdCB2YWxpZGF0aW9uIGZyb20gZGVsZWdhdG9yIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTaG91bGQgaW5oZXJpdCBub2RlIElEIHZhbGlkYXRpb24gLSBlbXB0eSBub2RlIElEIHNob3VsZCB0aHJvd1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIubm9kZUlEKCcnKTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG5cbiAgICAgIC8vIFNob3VsZCBpbmhlcml0IHRpbWUgdmFsaWRhdGlvbiAtIG5lZ2F0aXZlIHRpbWUgc2hvdWxkIHRocm93XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5zdGFydFRpbWUoLTEpO1xuICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcblxuICAgICAgLy8gU2hvdWxkIGluaGVyaXQgc3Rha2UgYW1vdW50IHZhbGlkYXRpb24gLSBuZWdhdGl2ZSBhbW91bnQgc2hvdWxkIHRocm93XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5zdGFrZUFtb3VudCgtMTAwMCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gYnVpbGRpbmcgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlcXVpcmUgZGVsZWdhdGlvbiBmZWUgcmF0ZSBmb3IgdmFsaWRhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCgnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpXG4gICAgICAgIC5zdGFydFRpbWUoMTY0MDk5NTIwMClcbiAgICAgICAgLmVuZFRpbWUoMTY0MTA4MTYwMClcbiAgICAgICAgLnN0YWtlQW1vdW50KCcxMDAwMDAwMDAwMDAwMDAwMDAwJylcbiAgICAgICAgLnJld2FyZEFkZHJlc3NlcyhbJ1AtZmxhcmUxeDByNWgwbDh3Nm5qM2sycDBkNWc5dDViOHYzYTlrMW0nXSk7XG5cbiAgICAgIC8vIFZhbGlkYXRvciBidWlsZGVyIHNob3VsZCBmYWlsIHZhbGlkYXRpb24gd2l0aG91dCBkZWxlZ2F0aW9uIGZlZSByYXRlICgwIGlzIGludmFsaWQpXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGF3YWl0IChidWlsZGVyIGFzIGFueSkuYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIHZhbGlkYXRpb24gd2l0aCBkZWxlZ2F0aW9uIGZlZSByYXRlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJylcbiAgICAgICAgLnN0YXJ0VGltZSgxNjQwOTk1MjAwKVxuICAgICAgICAuZW5kVGltZSgxNjQxMDgxNjAwKVxuICAgICAgICAuc3Rha2VBbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKVxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUoMjUwMDApIC8vIDIuNSVcbiAgICAgICAgLnJld2FyZEFkZHJlc3NlcyhbJ1AtZmxhcmUxeDByNWgwbDh3Nm5qM2sycDBkNWc5dDViOHYzYTlrMW0nXSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5kb2VzTm90UmVqZWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgYXdhaXQgKGJ1aWxkZXIgYXMgYW55KS5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXF1aXJlIGFsbCBkZWxlZ2F0b3IgZmllbGRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgyNTAwMCk7IC8vIDIuNSVcblxuICAgICAgLy8gU2hvdWxkIHN0aWxsIGZhaWwgd2l0aG91dCBvdGhlciByZXF1aXJlZCBmaWVsZHNcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgYXdhaXQgKGJ1aWxkZXIgYXMgYW55KS5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZEZsYXJlVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYnVpbGRpbmcgd2l0aG91dCBkZWxlZ2F0aW9uIGZlZSByYXRlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJylcbiAgICAgICAgLnN0YXJ0VGltZSgxNjQwOTk1MjAwKVxuICAgICAgICAuZW5kVGltZSgxNjQxMDgxNjAwKVxuICAgICAgICAuc3Rha2VBbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKVxuICAgICAgICAucmV3YXJkQWRkcmVzc2VzKFsnUC1mbGFyZTF4MHI1aDBsOHc2bmozazJwMGQ1Zzl0NWI4djNhOWsxbSddKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBhd2FpdCAoYnVpbGRlciBhcyBhbnkpLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGJ1aWxkaW5nIHdpdGhvdXQgcmVxdWlyZWQgZGVsZWdhdG9yIGZpZWxkcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuZGVsZWdhdGlvbkZlZVJhdGUoMjUwMDApOyAvLyAyLjUlXG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgYXdhaXQgKGJ1aWxkZXIgYXMgYW55KS5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggYWxsIHJlcXVpcmVkIGZpZWxkcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCgnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpXG4gICAgICAgIC5zdGFydFRpbWUoMTY0MDk5NTIwMClcbiAgICAgICAgLmVuZFRpbWUoMTY0MTA4MTYwMClcbiAgICAgICAgLnN0YWtlQW1vdW50KCcxMDAwMDAwMDAwMDAwMDAwMDAwJylcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKDI1MDAwKSAvLyAyLjUlXG4gICAgICAgIC5yZXdhcmRBZGRyZXNzZXMoWydQLWZsYXJlMXgwcjVoMGw4dzZuajNrMnAwZDVnOXQ1Yjh2M2E5azFtJ10pO1xuXG4gICAgICBhd2FpdCBhc3NlcnQuZG9lc05vdFJlamVjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGF3YWl0IChidWlsZGVyIGFzIGFueSkuYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5oZXJpdCB0aW1lIHZhbGlkYXRpb24gZnJvbSBkZWxlZ2F0b3IgYnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRpbWUgdmFsaWRhdGlvbiBoYXBwZW5zIGltbWVkaWF0ZWx5IHdoZW4gc2V0dGluZyB2YWx1ZXNcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyXG4gICAgICAgICAgLm5vZGVJRCgnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpXG4gICAgICAgICAgLnN0YXJ0VGltZSgxNjQxMDgxNjAwKVxuICAgICAgICAgIC5lbmRUaW1lKDE2NDA5OTUyMDApIC8vIEVuZCB0aW1lIGJlZm9yZSBzdGFydCB0aW1lXG4gICAgICAgICAgLnN0YWtlQW1vdW50KCcxMDAwMDAwMDAwMDAwMDAwMDAwJylcbiAgICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUoMjUwMDApOyAvLyAyLjUlXG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRWRnZSBjYXNlcyBhbmQgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaW5pbXVtIGRlbGVnYXRpb24gZmVlIHJhdGUgKDIlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDIwMDAwKTsgLy8gMiVcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19kZWxlZ2F0aW9uRmVlUmF0ZSddLCAyMDAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBoaWdoZXIgZGVsZWdhdGlvbiBmZWUgcmF0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSg1MDAwMCk7IC8vIDUlXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfZGVsZWdhdGlvbkZlZVJhdGUnXSwgNTAwMDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZmVlIHJhdGUgdmFsaWRhdGlvbiBlZGdlIGNhc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gSnVzdCBiZWxvdyBtaW5pbXVtICgyJSlcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgxOTk5OSksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG5cbiAgICAgIC8vIEp1c3QgYXQgbWluaW11bVxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDIwMDAwKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG1haW50YWluIHZhbGlkYXRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzIGFmdGVyIG9wZXJhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDI1MDAwKTsgLy8gMi41JVxuICAgICAgYnVpbGRlci5ub2RlSUQoJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19kZWxlZ2F0aW9uRmVlUmF0ZSddLCAyNTAwMCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX25vZGVJRCddLCAnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19