@mecanizou/telemetry-hub 1.0.2 → 1.0.5

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 (72) hide show
  1. package/.github/workflows/pull_request.yml +32 -32
  2. package/.github/workflows/release.yml +129 -129
  3. package/.prettierignore +4 -4
  4. package/CHANGELOG.md +36 -14
  5. package/DOCS_GUIDE.md +151 -151
  6. package/README.md +248 -248
  7. package/dist/core/__tests__/logger-types.test.js +1 -1
  8. package/dist/core/__tests__/logger.test.js +1 -1
  9. package/dist/core/__tests__/tracer.test.js +1 -1
  10. package/dist/core/index.js +1 -1
  11. package/dist/core/logger-types.js +1 -1
  12. package/dist/core/logger.js +1 -1
  13. package/dist/core/tracer-types.js +1 -1
  14. package/dist/core/tracer.js +1 -1
  15. package/dist/index.js +1 -1
  16. package/dist/sst/__tests__/telemetry.test.js +1 -1
  17. package/dist/sst/index.js +1 -1
  18. package/dist/sst/middy/index.js +1 -1
  19. package/dist/sst/middy/middleware.js +1 -1
  20. package/dist/sst/telemetry.js +1 -1
  21. package/dist/tsed/__tests__/config.test.js +1 -1
  22. package/dist/tsed/__tests__/service.test.js +1 -1
  23. package/dist/tsed/config.js +1 -1
  24. package/dist/tsed/index.js +1 -1
  25. package/dist/tsed/log-telemetry.js +1 -1
  26. package/dist/tsed/service.js +1 -1
  27. package/dist/tsed/sync-log-record-processor.js +1 -1
  28. package/package.json +72 -72
  29. package/release.config.js +23 -23
  30. package/vitest.config.ts +22 -22
  31. package/dist/telemetry/core/__tests__/logger-types.test.d.ts +0 -1
  32. package/dist/telemetry/core/__tests__/logger-types.test.js +0 -325
  33. package/dist/telemetry/core/__tests__/logger.test.d.ts +0 -1
  34. package/dist/telemetry/core/__tests__/logger.test.js +0 -337
  35. package/dist/telemetry/core/__tests__/tracer.test.d.ts +0 -1
  36. package/dist/telemetry/core/__tests__/tracer.test.js +0 -330
  37. package/dist/telemetry/core/index.d.ts +0 -4
  38. package/dist/telemetry/core/index.js +0 -8
  39. package/dist/telemetry/core/logger-types.d.ts +0 -43
  40. package/dist/telemetry/core/logger-types.js +0 -3
  41. package/dist/telemetry/core/logger.d.ts +0 -13
  42. package/dist/telemetry/core/logger.js +0 -123
  43. package/dist/telemetry/core/tracer-types.d.ts +0 -50
  44. package/dist/telemetry/core/tracer-types.js +0 -3
  45. package/dist/telemetry/core/tracer.d.ts +0 -10
  46. package/dist/telemetry/core/tracer.js +0 -114
  47. package/dist/telemetry/index.d.ts +0 -3
  48. package/dist/telemetry/index.js +0 -20
  49. package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +0 -1
  50. package/dist/telemetry/sst/__tests__/telemetry.test.js +0 -138
  51. package/dist/telemetry/sst/index.d.ts +0 -1
  52. package/dist/telemetry/sst/index.js +0 -18
  53. package/dist/telemetry/sst/middy/index.d.ts +0 -1
  54. package/dist/telemetry/sst/middy/index.js +0 -18
  55. package/dist/telemetry/sst/middy/middleware.d.ts +0 -5
  56. package/dist/telemetry/sst/middy/middleware.js +0 -157
  57. package/dist/telemetry/sst/telemetry.d.ts +0 -4
  58. package/dist/telemetry/sst/telemetry.js +0 -121
  59. package/dist/telemetry/tsed/__tests__/config.test.d.ts +0 -1
  60. package/dist/telemetry/tsed/__tests__/config.test.js +0 -146
  61. package/dist/telemetry/tsed/__tests__/service.test.d.ts +0 -1
  62. package/dist/telemetry/tsed/__tests__/service.test.js +0 -63
  63. package/dist/telemetry/tsed/config.d.ts +0 -26
  64. package/dist/telemetry/tsed/config.js +0 -166
  65. package/dist/telemetry/tsed/index.d.ts +0 -4
  66. package/dist/telemetry/tsed/index.js +0 -21
  67. package/dist/telemetry/tsed/log-telemetry.d.ts +0 -1
  68. package/dist/telemetry/tsed/log-telemetry.js +0 -196
  69. package/dist/telemetry/tsed/service.d.ts +0 -26
  70. package/dist/telemetry/tsed/service.js +0 -150
  71. package/dist/telemetry/tsed/sync-log-record-processor.d.ts +0 -11
  72. package/dist/telemetry/tsed/sync-log-record-processor.js +0 -74
@@ -1,337 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- const vitest_1 = require("vitest");
13
- const logger_1 = require("../logger");
14
- const api_logs_1 = require("@opentelemetry/api-logs");
15
- (0, vitest_1.describe)('StandardLogger', () => {
16
- let mockLogger;
17
- let standardLogger;
18
- (0, vitest_1.beforeEach)(() => {
19
- mockLogger = {
20
- emit: vitest_1.vi.fn(),
21
- };
22
- standardLogger = new logger_1.StandardLogger(mockLogger, 'test-service');
23
- });
24
- (0, vitest_1.describe)('logError', () => {
25
- (0, vitest_1.it)('deve emitir log com severity ERROR', () => __awaiter(void 0, void 0, void 0, function* () {
26
- const errorData = {
27
- message: 'Test error message',
28
- serviceName: 'test-service',
29
- environment: 'test',
30
- };
31
- yield standardLogger.logError(errorData);
32
- (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
33
- const emittedLog = mockLogger.emit.mock.calls[0][0];
34
- (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.ERROR);
35
- (0, vitest_1.expect)(emittedLog.severityText).toBe('ERROR');
36
- (0, vitest_1.expect)(emittedLog.body).toBe('Test error message');
37
- }));
38
- (0, vitest_1.it)('deve incluir informações do erro quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
39
- const error = new Error('Custom error');
40
- const errorData = {
41
- message: 'Error occurred',
42
- error,
43
- serviceName: 'test-service',
44
- environment: 'production',
45
- };
46
- yield standardLogger.logError(errorData);
47
- const emittedLog = mockLogger.emit.mock.calls[0][0];
48
- (0, vitest_1.expect)(emittedLog.attributes['error.type']).toBe('Error');
49
- (0, vitest_1.expect)(emittedLog.attributes['error.message']).toBe('Custom error');
50
- (0, vitest_1.expect)(emittedLog.attributes['error.stack']).toBeDefined();
51
- }));
52
- (0, vitest_1.it)('deve incluir contexto HTTP quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
53
- const errorData = {
54
- message: 'HTTP error',
55
- serviceName: 'test-service',
56
- environment: 'production',
57
- http: {
58
- method: 'POST',
59
- url: '/api/test',
60
- endpoint: '/api/test',
61
- statusCode: 500,
62
- headers: { 'content-type': 'application/json' },
63
- body: { test: 'data' },
64
- params: { id: '123' },
65
- query: { filter: 'active' },
66
- },
67
- };
68
- yield standardLogger.logError(errorData);
69
- const emittedLog = mockLogger.emit.mock.calls[0][0];
70
- (0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
71
- (0, vitest_1.expect)(emittedLog.attributes['http.url']).toBe('/api/test');
72
- (0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
73
- (0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBe(500);
74
- (0, vitest_1.expect)(emittedLog.attributes['http.headers']).toBe(JSON.stringify({ 'content-type': 'application/json' }));
75
- (0, vitest_1.expect)(emittedLog.attributes['http.body']).toBe(JSON.stringify({ test: 'data' }));
76
- }));
77
- (0, vitest_1.it)('deve incluir informações de usuário quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
78
- const errorData = {
79
- message: 'User error',
80
- serviceName: 'test-service',
81
- environment: 'production',
82
- user: {
83
- accountUserUid: 'user-123',
84
- accountUid: 'account-456',
85
- applicationUid: 'app-789',
86
- },
87
- };
88
- yield standardLogger.logError(errorData);
89
- const emittedLog = mockLogger.emit.mock.calls[0][0];
90
- (0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
91
- (0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBe('account-456');
92
- (0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBe('app-789');
93
- }));
94
- (0, vitest_1.it)('deve incluir informações de execução quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
95
- const errorData = {
96
- message: 'Execution error',
97
- serviceName: 'test-service',
98
- environment: 'production',
99
- execution: {
100
- requestId: 'req-123',
101
- awsRequestId: 'aws-456',
102
- functionName: 'testFunction',
103
- invocationId: 'inv-789',
104
- controller: 'TestController',
105
- controllerMethod: 'testMethod',
106
- origin: 'mobile',
107
- },
108
- };
109
- yield standardLogger.logError(errorData);
110
- const emittedLog = mockLogger.emit.mock.calls[0][0];
111
- (0, vitest_1.expect)(emittedLog.attributes['request.id']).toBe('req-123');
112
- (0, vitest_1.expect)(emittedLog.attributes['aws.request.id']).toBe('aws-456');
113
- (0, vitest_1.expect)(emittedLog.attributes['faas.name']).toBe('testFunction');
114
- (0, vitest_1.expect)(emittedLog.attributes['faas.invocation_id']).toBe('inv-789');
115
- (0, vitest_1.expect)(emittedLog.attributes['controller.name']).toBe('TestController');
116
- (0, vitest_1.expect)(emittedLog.attributes['controller.method']).toBe('testMethod');
117
- (0, vitest_1.expect)(emittedLog.attributes['origin']).toBe('mobile');
118
- }));
119
- (0, vitest_1.it)('deve incluir métricas de performance quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
120
- const errorData = {
121
- message: 'Performance error',
122
- serviceName: 'test-service',
123
- environment: 'production',
124
- performance: {
125
- durationMs: 1500,
126
- success: false,
127
- },
128
- };
129
- yield standardLogger.logError(errorData);
130
- const emittedLog = mockLogger.emit.mock.calls[0][0];
131
- (0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(1500);
132
- (0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(false);
133
- }));
134
- (0, vitest_1.it)('deve incluir contexto adicional quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
135
- const errorData = {
136
- message: 'Context error',
137
- serviceName: 'test-service',
138
- environment: 'production',
139
- context: {
140
- additionalInfo: 'some data',
141
- nested: { value: 123 },
142
- },
143
- };
144
- yield standardLogger.logError(errorData);
145
- const emittedLog = mockLogger.emit.mock.calls[0][0];
146
- (0, vitest_1.expect)(emittedLog.attributes['context']).toBe(JSON.stringify({ additionalInfo: 'some data', nested: { value: 123 } }));
147
- }));
148
- (0, vitest_1.it)('deve usar serviceName padrão quando não fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
149
- const errorData = {
150
- message: 'Default service error',
151
- serviceName: '',
152
- environment: 'production',
153
- };
154
- yield standardLogger.logError(errorData);
155
- const emittedLog = mockLogger.emit.mock.calls[0][0];
156
- (0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('test-service');
157
- }));
158
- (0, vitest_1.it)('deve adicionar timestamp automaticamente', () => __awaiter(void 0, void 0, void 0, function* () {
159
- const errorData = {
160
- message: 'Timestamp test',
161
- serviceName: 'test-service',
162
- environment: 'production',
163
- };
164
- yield standardLogger.logError(errorData);
165
- const emittedLog = mockLogger.emit.mock.calls[0][0];
166
- (0, vitest_1.expect)(emittedLog.attributes['timestamp']).toBeDefined();
167
- (0, vitest_1.expect)(emittedLog.attributes['timestamp']).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
168
- }));
169
- (0, vitest_1.it)('deve filtrar valores undefined e null dos atributos', () => __awaiter(void 0, void 0, void 0, function* () {
170
- const errorData = {
171
- message: 'Filter test',
172
- serviceName: 'test-service',
173
- environment: 'production',
174
- user: {
175
- accountUserUid: 'user-123',
176
- accountUid: undefined,
177
- applicationUid: undefined,
178
- },
179
- };
180
- yield standardLogger.logError(errorData);
181
- const emittedLog = mockLogger.emit.mock.calls[0][0];
182
- (0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
183
- (0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBeUndefined();
184
- (0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBeUndefined();
185
- }));
186
- });
187
- (0, vitest_1.describe)('logInfo', () => {
188
- (0, vitest_1.it)('deve emitir log com severity INFO', () => __awaiter(void 0, void 0, void 0, function* () {
189
- const infoData = {
190
- message: 'Info message',
191
- serviceName: 'test-service',
192
- environment: 'production',
193
- };
194
- yield standardLogger.logInfo(infoData);
195
- (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
196
- const emittedLog = mockLogger.emit.mock.calls[0][0];
197
- (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.INFO);
198
- (0, vitest_1.expect)(emittedLog.severityText).toBe('INFO');
199
- (0, vitest_1.expect)(emittedLog.body).toBe('Info message');
200
- }));
201
- (0, vitest_1.it)('deve incluir dados de performance em log de sucesso', () => __awaiter(void 0, void 0, void 0, function* () {
202
- const infoData = {
203
- message: 'Request completed',
204
- serviceName: 'test-service',
205
- environment: 'production',
206
- performance: {
207
- durationMs: 250,
208
- success: true,
209
- },
210
- };
211
- yield standardLogger.logInfo(infoData);
212
- const emittedLog = mockLogger.emit.mock.calls[0][0];
213
- (0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(250);
214
- (0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(true);
215
- }));
216
- });
217
- (0, vitest_1.describe)('logWarn', () => {
218
- (0, vitest_1.it)('deve emitir log com severity WARN', () => __awaiter(void 0, void 0, void 0, function* () {
219
- const warnData = {
220
- message: 'Warning message',
221
- serviceName: 'test-service',
222
- environment: 'production',
223
- };
224
- yield standardLogger.logWarn(warnData);
225
- (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
226
- const emittedLog = mockLogger.emit.mock.calls[0][0];
227
- (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.WARN);
228
- (0, vitest_1.expect)(emittedLog.severityText).toBe('WARN');
229
- (0, vitest_1.expect)(emittedLog.body).toBe('Warning message');
230
- }));
231
- });
232
- (0, vitest_1.describe)('logDebug', () => {
233
- (0, vitest_1.it)('deve emitir log com severity DEBUG', () => __awaiter(void 0, void 0, void 0, function* () {
234
- const debugData = {
235
- message: 'Debug message',
236
- serviceName: 'test-service',
237
- environment: 'development',
238
- };
239
- yield standardLogger.logDebug(debugData);
240
- (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
241
- const emittedLog = mockLogger.emit.mock.calls[0][0];
242
- (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.DEBUG);
243
- (0, vitest_1.expect)(emittedLog.severityText).toBe('DEBUG');
244
- (0, vitest_1.expect)(emittedLog.body).toBe('Debug message');
245
- }));
246
- });
247
- (0, vitest_1.describe)('buildAttributes', () => {
248
- (0, vitest_1.it)('deve construir atributos completos com todos os campos', () => __awaiter(void 0, void 0, void 0, function* () {
249
- const fullData = {
250
- message: 'Complete log',
251
- serviceName: 'complete-service',
252
- environment: 'production',
253
- error: new Error('Test error'),
254
- http: {
255
- method: 'GET',
256
- url: '/api/users',
257
- endpoint: '/api/users',
258
- statusCode: 200,
259
- },
260
- user: {
261
- accountUserUid: 'user-abc',
262
- accountUid: 'account-xyz',
263
- applicationUid: 'app-123',
264
- },
265
- execution: {
266
- requestId: 'req-001',
267
- awsRequestId: 'aws-002',
268
- functionName: 'getUsers',
269
- invocationId: 'inv-003',
270
- controller: 'UserController',
271
- controllerMethod: 'getAll',
272
- origin: 'web',
273
- },
274
- performance: {
275
- durationMs: 300,
276
- success: true,
277
- },
278
- context: {
279
- custom: 'data',
280
- },
281
- };
282
- yield standardLogger.logInfo(fullData);
283
- const emittedLog = mockLogger.emit.mock.calls[0][0];
284
- const attrs = emittedLog.attributes;
285
- (0, vitest_1.expect)(attrs['service.name']).toBe('complete-service');
286
- (0, vitest_1.expect)(attrs['deployment.environment.name']).toBe('production');
287
- (0, vitest_1.expect)(attrs['error.type']).toBe('Error');
288
- (0, vitest_1.expect)(attrs['http.method']).toBe('GET');
289
- (0, vitest_1.expect)(attrs['accountUser.uid']).toBe('user-abc');
290
- (0, vitest_1.expect)(attrs['request.id']).toBe('req-001');
291
- (0, vitest_1.expect)(attrs['duration.ms']).toBe(300);
292
- (0, vitest_1.expect)(attrs['context']).toBe(JSON.stringify({ custom: 'data' }));
293
- }));
294
- (0, vitest_1.it)('deve lidar com campos HTTP parciais', () => __awaiter(void 0, void 0, void 0, function* () {
295
- const partialHttpData = {
296
- message: 'Partial HTTP',
297
- serviceName: 'test-service',
298
- environment: 'production',
299
- http: {
300
- method: 'POST',
301
- endpoint: '/api/test',
302
- },
303
- };
304
- yield standardLogger.logInfo(partialHttpData);
305
- const emittedLog = mockLogger.emit.mock.calls[0][0];
306
- (0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
307
- (0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
308
- (0, vitest_1.expect)(emittedLog.attributes['http.url']).toBeUndefined();
309
- (0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBeUndefined();
310
- }));
311
- });
312
- (0, vitest_1.describe)('construtor', () => {
313
- (0, vitest_1.it)('deve aceitar serviceName padrão personalizado', () => {
314
- const customLogger = new logger_1.StandardLogger(mockLogger, 'custom-service');
315
- const logData = {
316
- message: 'Test',
317
- serviceName: '',
318
- environment: 'test',
319
- };
320
- customLogger.logInfo(logData);
321
- const emittedLog = mockLogger.emit.mock.calls[0][0];
322
- (0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('custom-service');
323
- });
324
- (0, vitest_1.it)('deve usar "unknown-service" como padrão quando não especificado', () => {
325
- const defaultLogger = new logger_1.StandardLogger(mockLogger);
326
- const logData = {
327
- message: 'Test',
328
- serviceName: '',
329
- environment: 'test',
330
- };
331
- defaultLogger.logInfo(logData);
332
- const emittedLog = mockLogger.emit.mock.calls[0][0];
333
- (0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('unknown-service');
334
- });
335
- });
336
- });
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVsZW1ldHJ5L2NvcmUvX190ZXN0c19fL2xvZ2dlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsbUNBQThEO0FBQzlELHNDQUEyQztBQUMzQyxzREFBeUQ7QUFFekQsSUFBQSxpQkFBUSxFQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixJQUFJLFVBQWUsQ0FBQztJQUNwQixJQUFJLGNBQThCLENBQUM7SUFFbkMsSUFBQSxtQkFBVSxFQUFDLEdBQUcsRUFBRTtRQUNkLFVBQVUsR0FBRztZQUNYLElBQUksRUFBRSxXQUFFLENBQUMsRUFBRSxFQUFFO1NBQ2QsQ0FBQztRQUNGLGNBQWMsR0FBRyxJQUFJLHVCQUFjLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxpQkFBUSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDeEIsSUFBQSxXQUFFLEVBQUMsb0NBQW9DLEVBQUUsR0FBUyxFQUFFO1lBQ2xELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsb0JBQW9CO2dCQUM3QixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLE1BQU07YUFDcEIsQ0FBQztZQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUEsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsbURBQW1ELEVBQUUsR0FBUyxFQUFFO1lBQ2pFLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixLQUFLO2dCQUNMLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTthQUMxQixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyw2Q0FBNkMsRUFBRSxHQUFTLEVBQUU7WUFDM0QsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxZQUFZO2dCQUNyQixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLFlBQVk7Z0JBQ3pCLElBQUksRUFBRTtvQkFDSixNQUFNLEVBQUUsTUFBTTtvQkFDZCxHQUFHLEVBQUUsV0FBVztvQkFDaEIsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFVBQVUsRUFBRSxHQUFHO29CQUNmLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtvQkFDL0MsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtvQkFDdEIsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRTtvQkFDckIsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtpQkFDNUI7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQ3ZELENBQUM7WUFDRixJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQ2pDLENBQUM7UUFDSixDQUFDLENBQUEsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsc0RBQXNELEVBQUUsR0FBUyxFQUFFO1lBQ3BFLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsWUFBWTtnQkFDckIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixJQUFJLEVBQUU7b0JBQ0osY0FBYyxFQUFFLFVBQVU7b0JBQzFCLFVBQVUsRUFBRSxhQUFhO29CQUN6QixjQUFjLEVBQUUsU0FBUztpQkFDMUI7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqRSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLHVEQUF1RCxFQUFFLEdBQVMsRUFBRTtZQUNyRSxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixTQUFTLEVBQUU7b0JBQ1QsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFlBQVksRUFBRSxTQUFTO29CQUN2QixZQUFZLEVBQUUsY0FBYztvQkFDNUIsWUFBWSxFQUFFLFNBQVM7b0JBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7b0JBQzVCLGdCQUFnQixFQUFFLFlBQVk7b0JBQzlCLE1BQU0sRUFBRSxRQUFRO2lCQUNqQjthQUNGLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hFLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BFLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hFLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0RSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyx1REFBdUQsRUFBRSxHQUFTLEVBQUU7WUFDckUsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxtQkFBbUI7Z0JBQzVCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsV0FBVyxFQUFFO29CQUNYLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsS0FBSztpQkFDZjthQUNGLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyxrREFBa0QsRUFBRSxHQUFTLEVBQUU7WUFDaEUsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLFlBQVk7Z0JBQ3pCLE9BQU8sRUFBRTtvQkFDUCxjQUFjLEVBQUUsV0FBVztvQkFDM0IsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtpQkFDdkI7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUN4RSxDQUFDO1FBQ0osQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLG1EQUFtRCxFQUFFLEdBQVMsRUFBRTtZQUNqRSxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTyxFQUFFLHVCQUF1QjtnQkFDaEMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsV0FBVyxFQUFFLFlBQVk7YUFDMUIsQ0FBQztZQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUEsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsMENBQTBDLEVBQUUsR0FBUyxFQUFFO1lBQ3hELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLFlBQVk7YUFDMUIsQ0FBQztZQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2hELCtDQUErQyxDQUNoRCxDQUFDO1FBQ0osQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLHFEQUFxRCxFQUFFLEdBQVMsRUFBRTtZQUNuRSxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsSUFBSSxFQUFFO29CQUNKLGNBQWMsRUFBRSxVQUFVO29CQUMxQixVQUFVLEVBQUUsU0FBZ0I7b0JBQzVCLGNBQWMsRUFBRSxTQUFnQjtpQkFDakM7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25FLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsaUJBQVEsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3ZCLElBQUEsV0FBRSxFQUFDLG1DQUFtQyxFQUFFLEdBQVMsRUFBRTtZQUNqRCxNQUFNLFFBQVEsR0FBRztnQkFDZixPQUFPLEVBQUUsY0FBYztnQkFDdkIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2FBQzFCLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkMsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyxxREFBcUQsRUFBRSxHQUFTLEVBQUU7WUFDbkUsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsT0FBTyxFQUFFLG1CQUFtQjtnQkFDNUIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixXQUFXLEVBQUU7b0JBQ1gsVUFBVSxFQUFFLEdBQUc7b0JBQ2YsT0FBTyxFQUFFLElBQUk7aUJBQ2Q7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGlCQUFRLEVBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixJQUFBLFdBQUUsRUFBQyxtQ0FBbUMsRUFBRSxHQUFTLEVBQUU7WUFDakQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2FBQzFCLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkMsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxpQkFBUSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDeEIsSUFBQSxXQUFFLEVBQUMsb0NBQW9DLEVBQUUsR0FBUyxFQUFFO1lBQ2xELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxhQUFhO2FBQzNCLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0QsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsaUJBQVEsRUFBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsSUFBQSxXQUFFLEVBQUMsd0RBQXdELEVBQUUsR0FBUyxFQUFFO1lBQ3RFLE1BQU0sUUFBUSxHQUFHO2dCQUNmLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixXQUFXLEVBQUUsa0JBQWtCO2dCQUMvQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDOUIsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRSxLQUFLO29CQUNiLEdBQUcsRUFBRSxZQUFZO29CQUNqQixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsVUFBVSxFQUFFLEdBQUc7aUJBQ2hCO2dCQUNELElBQUksRUFBRTtvQkFDSixjQUFjLEVBQUUsVUFBVTtvQkFDMUIsVUFBVSxFQUFFLGFBQWE7b0JBQ3pCLGNBQWMsRUFBRSxTQUFTO2lCQUMxQjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFlBQVksRUFBRSxTQUFTO29CQUN2QixZQUFZLEVBQUUsVUFBVTtvQkFDeEIsWUFBWSxFQUFFLFNBQVM7b0JBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7b0JBQzVCLGdCQUFnQixFQUFFLFFBQVE7b0JBQzFCLE1BQU0sRUFBRSxLQUFLO2lCQUNkO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsR0FBRztvQkFDZixPQUFPLEVBQUUsSUFBSTtpQkFDZDtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsTUFBTSxFQUFFLE1BQU07aUJBQ2Y7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBR3BDLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZELElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxJQUFBLGVBQU0sRUFBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBQSxlQUFNLEVBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsSUFBQSxlQUFNLEVBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFBLGVBQU0sRUFBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLHFDQUFxQyxFQUFFLEdBQVMsRUFBRTtZQUNuRCxNQUFNLGVBQWUsR0FBRztnQkFDdEIsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRSxNQUFNO29CQUNkLFFBQVEsRUFBRSxXQUFXO2lCQUV0QjthQUNGLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFOUMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEUsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxpQkFBUSxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7UUFDMUIsSUFBQSxXQUFFLEVBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksdUJBQWMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN0RSxNQUFNLE9BQU8sR0FBRztnQkFDZCxPQUFPLEVBQUUsTUFBTTtnQkFDZixXQUFXLEVBQUUsRUFBRTtnQkFDZixXQUFXLEVBQUUsTUFBTTthQUNwQixDQUFDO1lBRUYsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5QixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsaUVBQWlFLEVBQUUsR0FBRyxFQUFFO1lBQ3pFLE1BQU0sYUFBYSxHQUFHLElBQUksdUJBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxNQUFNLE9BQU8sR0FBRztnQkFDZCxPQUFPLEVBQUUsTUFBTTtnQkFDZixXQUFXLEVBQUUsRUFBRTtnQkFDZixXQUFXLEVBQUUsTUFBTTthQUNwQixDQUFDO1lBRUYsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUvQixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCwgZXhwZWN0LCB2aSwgYmVmb3JlRWFjaCB9IGZyb20gJ3ZpdGVzdCc7XHJcbmltcG9ydCB7IFN0YW5kYXJkTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyJztcclxuaW1wb3J0IHsgU2V2ZXJpdHlOdW1iZXIgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGktbG9ncyc7XHJcblxyXG5kZXNjcmliZSgnU3RhbmRhcmRMb2dnZXInLCAoKSA9PiB7XHJcbiAgbGV0IG1vY2tMb2dnZXI6IGFueTtcclxuICBsZXQgc3RhbmRhcmRMb2dnZXI6IFN0YW5kYXJkTG9nZ2VyO1xyXG5cclxuICBiZWZvcmVFYWNoKCgpID0+IHtcclxuICAgIG1vY2tMb2dnZXIgPSB7XHJcbiAgICAgIGVtaXQ6IHZpLmZuKCksXHJcbiAgICB9O1xyXG4gICAgc3RhbmRhcmRMb2dnZXIgPSBuZXcgU3RhbmRhcmRMb2dnZXIobW9ja0xvZ2dlciwgJ3Rlc3Qtc2VydmljZScpO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnbG9nRXJyb3InLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBlbWl0aXIgbG9nIGNvbSBzZXZlcml0eSBFUlJPUicsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUZXN0IGVycm9yIG1lc3NhZ2UnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Rlc3QnLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrTG9nZ2VyLmVtaXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eU51bWJlcikudG9CZShTZXZlcml0eU51bWJlci5FUlJPUik7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5VGV4dCkudG9CZSgnRVJST1InKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYm9keSkudG9CZSgnVGVzdCBlcnJvciBtZXNzYWdlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGluZm9ybWHDp8O1ZXMgZG8gZXJybyBxdWFuZG8gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignQ3VzdG9tIGVycm9yJyk7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRXJyb3Igb2NjdXJyZWQnLFxyXG4gICAgICAgIGVycm9yLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZXJyb3IudHlwZSddKS50b0JlKCdFcnJvcicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydlcnJvci5tZXNzYWdlJ10pLnRvQmUoJ0N1c3RvbSBlcnJvcicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydlcnJvci5zdGFjayddKS50b0JlRGVmaW5lZCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBjb250ZXh0byBIVFRQIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnSFRUUCBlcnJvcicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICB1cmw6ICcvYXBpL3Rlc3QnLFxyXG4gICAgICAgICAgZW5kcG9pbnQ6ICcvYXBpL3Rlc3QnLFxyXG4gICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxyXG4gICAgICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICAgICAgICBib2R5OiB7IHRlc3Q6ICdkYXRhJyB9LFxyXG4gICAgICAgICAgcGFyYW1zOiB7IGlkOiAnMTIzJyB9LFxyXG4gICAgICAgICAgcXVlcnk6IHsgZmlsdGVyOiAnYWN0aXZlJyB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLm1ldGhvZCddKS50b0JlKCdQT1NUJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAudXJsJ10pLnRvQmUoJy9hcGkvdGVzdCcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLmVuZHBvaW50J10pLnRvQmUoJy9hcGkvdGVzdCcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLnN0YXR1c19jb2RlJ10pLnRvQmUoNTAwKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5oZWFkZXJzJ10pLnRvQmUoXHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuYm9keSddKS50b0JlKFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgdGVzdDogJ2RhdGEnIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGluZm9ybWHDp8O1ZXMgZGUgdXN1w6FyaW8gcXVhbmRvIGZvcm5lY2lkbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdVc2VyIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICB1c2VyOiB7XHJcbiAgICAgICAgICBhY2NvdW50VXNlclVpZDogJ3VzZXItMTIzJyxcclxuICAgICAgICAgIGFjY291bnRVaWQ6ICdhY2NvdW50LTQ1NicsXHJcbiAgICAgICAgICBhcHBsaWNhdGlvblVpZDogJ2FwcC03ODknLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50VXNlci51aWQnXSkudG9CZSgndXNlci0xMjMnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYWNjb3VudC51aWQnXSkudG9CZSgnYWNjb3VudC00NTYnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYXBwbGljYXRpb24udWlkJ10pLnRvQmUoJ2FwcC03ODknKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgaW5mb3JtYcOnw7VlcyBkZSBleGVjdcOnw6NvIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRXhlY3V0aW9uIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIHJlcXVlc3RJZDogJ3JlcS0xMjMnLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAnYXdzLTQ1NicsXHJcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICd0ZXN0RnVuY3Rpb24nLFxyXG4gICAgICAgICAgaW52b2NhdGlvbklkOiAnaW52LTc4OScsXHJcbiAgICAgICAgICBjb250cm9sbGVyOiAnVGVzdENvbnRyb2xsZXInLFxyXG4gICAgICAgICAgY29udHJvbGxlck1ldGhvZDogJ3Rlc3RNZXRob2QnLFxyXG4gICAgICAgICAgb3JpZ2luOiAnbW9iaWxlJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1sncmVxdWVzdC5pZCddKS50b0JlKCdyZXEtMTIzJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2F3cy5yZXF1ZXN0LmlkJ10pLnRvQmUoJ2F3cy00NTYnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZmFhcy5uYW1lJ10pLnRvQmUoJ3Rlc3RGdW5jdGlvbicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydmYWFzLmludm9jYXRpb25faWQnXSkudG9CZSgnaW52LTc4OScpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydjb250cm9sbGVyLm5hbWUnXSkudG9CZSgnVGVzdENvbnRyb2xsZXInKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snY29udHJvbGxlci5tZXRob2QnXSkudG9CZSgndGVzdE1ldGhvZCcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydvcmlnaW4nXSkudG9CZSgnbW9iaWxlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIG3DqXRyaWNhcyBkZSBwZXJmb3JtYW5jZSBxdWFuZG8gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1BlcmZvcm1hbmNlIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgZHVyYXRpb25NczogMTUwMCxcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydkdXJhdGlvbi5tcyddKS50b0JlKDE1MDApO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydleGVjdXRpb24uc3VjY2VzcyddKS50b0JlKGZhbHNlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgY29udGV4dG8gYWRpY2lvbmFsIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnQ29udGV4dCBlcnJvcicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgYWRkaXRpb25hbEluZm86ICdzb21lIGRhdGEnLFxyXG4gICAgICAgICAgbmVzdGVkOiB7IHZhbHVlOiAxMjMgfSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snY29udGV4dCddKS50b0JlKFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgYWRkaXRpb25hbEluZm86ICdzb21lIGRhdGEnLCBuZXN0ZWQ6IHsgdmFsdWU6IDEyMyB9IH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSB1c2FyIHNlcnZpY2VOYW1lIHBhZHLDo28gcXVhbmRvIG7Do28gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0RlZmF1bHQgc2VydmljZSBlcnJvcicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICcnLCAvLyBFbXB0eSBzdHJpbmcgcGFyYSB0ZXN0YXIgZmFsbGJhY2tcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ3Rlc3Qtc2VydmljZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgYWRpY2lvbmFyIHRpbWVzdGFtcCBhdXRvbWF0aWNhbWVudGUnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnVGltZXN0YW1wIHRlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1sndGltZXN0YW1wJ10pLnRvQmVEZWZpbmVkKCk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ3RpbWVzdGFtcCddKS50b01hdGNoKFxyXG4gICAgICAgIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7M31aJC9cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGZpbHRyYXIgdmFsb3JlcyB1bmRlZmluZWQgZSBudWxsIGRvcyBhdHJpYnV0b3MnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRmlsdGVyIHRlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci0xMjMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogdW5kZWZpbmVkIGFzIGFueSxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiB1bmRlZmluZWQgYXMgYW55LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50VXNlci51aWQnXSkudG9CZSgndXNlci0xMjMnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYWNjb3VudC51aWQnXSkudG9CZVVuZGVmaW5lZCgpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhcHBsaWNhdGlvbi51aWQnXSkudG9CZVVuZGVmaW5lZCgpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdsb2dJbmZvJywgKCkgPT4ge1xyXG4gICAgaXQoJ2RldmUgZW1pdGlyIGxvZyBjb20gc2V2ZXJpdHkgSU5GTycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgaW5mb0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0luZm8gbWVzc2FnZScsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKGluZm9EYXRhKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrTG9nZ2VyLmVtaXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eU51bWJlcikudG9CZShTZXZlcml0eU51bWJlci5JTkZPKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdJTkZPJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmJvZHkpLnRvQmUoJ0luZm8gbWVzc2FnZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBkYWRvcyBkZSBwZXJmb3JtYW5jZSBlbSBsb2cgZGUgc3VjZXNzbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgaW5mb0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1JlcXVlc3QgY29tcGxldGVkJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgZHVyYXRpb25NczogMjUwLFxyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nSW5mbyhpbmZvRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2R1cmF0aW9uLm1zJ10pLnRvQmUoMjUwKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZXhlY3V0aW9uLnN1Y2Nlc3MnXSkudG9CZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnbG9nV2FybicsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGVtaXRpciBsb2cgY29tIHNldmVyaXR5IFdBUk4nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhcm5EYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdXYXJuaW5nIG1lc3NhZ2UnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nV2Fybih3YXJuRGF0YSk7XHJcblxyXG4gICAgICBleHBlY3QobW9ja0xvZ2dlci5lbWl0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlOdW1iZXIpLnRvQmUoU2V2ZXJpdHlOdW1iZXIuV0FSTik7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5VGV4dCkudG9CZSgnV0FSTicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5ib2R5KS50b0JlKCdXYXJuaW5nIG1lc3NhZ2UnKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnbG9nRGVidWcnLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBlbWl0aXIgbG9nIGNvbSBzZXZlcml0eSBERUJVRycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZGVidWdEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdEZWJ1ZyBtZXNzYWdlJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dEZWJ1ZyhkZWJ1Z0RhdGEpO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tMb2dnZXIuZW1pdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5TnVtYmVyKS50b0JlKFNldmVyaXR5TnVtYmVyLkRFQlVHKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdERUJVRycpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5ib2R5KS50b0JlKCdEZWJ1ZyBtZXNzYWdlJyk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ2J1aWxkQXR0cmlidXRlcycsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGNvbnN0cnVpciBhdHJpYnV0b3MgY29tcGxldG9zIGNvbSB0b2RvcyBvcyBjYW1wb3MnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZ1bGxEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdDb21wbGV0ZSBsb2cnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnY29tcGxldGUtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBlcnJvcjogbmV3IEVycm9yKCdUZXN0IGVycm9yJyksXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICAgIHVybDogJy9hcGkvdXNlcnMnLFxyXG4gICAgICAgICAgZW5kcG9pbnQ6ICcvYXBpL3VzZXJzJyxcclxuICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci1hYmMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogJ2FjY291bnQteHl6JyxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiAnYXBwLTEyMycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIHJlcXVlc3RJZDogJ3JlcS0wMDEnLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAnYXdzLTAwMicsXHJcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdnZXRVc2VycycsXHJcbiAgICAgICAgICBpbnZvY2F0aW9uSWQ6ICdpbnYtMDAzJyxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6ICdVc2VyQ29udHJvbGxlcicsXHJcbiAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiAnZ2V0QWxsJyxcclxuICAgICAgICAgIG9yaWdpbjogJ3dlYicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgZHVyYXRpb25NczogMzAwLFxyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgIGN1c3RvbTogJ2RhdGEnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKGZ1bGxEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgY29uc3QgYXR0cnMgPSBlbWl0dGVkTG9nLmF0dHJpYnV0ZXM7XHJcblxyXG4gICAgICAvLyBWZXJpZmljYXIgdG9kb3Mgb3MgY2FtcG9zXHJcbiAgICAgIGV4cGVjdChhdHRyc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ2NvbXBsZXRlLXNlcnZpY2UnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydkZXBsb3ltZW50LmVudmlyb25tZW50Lm5hbWUnXSkudG9CZSgncHJvZHVjdGlvbicpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2Vycm9yLnR5cGUnXSkudG9CZSgnRXJyb3InKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydodHRwLm1ldGhvZCddKS50b0JlKCdHRVQnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydhY2NvdW50VXNlci51aWQnXSkudG9CZSgndXNlci1hYmMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydyZXF1ZXN0LmlkJ10pLnRvQmUoJ3JlcS0wMDEnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydkdXJhdGlvbi5tcyddKS50b0JlKDMwMCk7XHJcbiAgICAgIGV4cGVjdChhdHRyc1snY29udGV4dCddKS50b0JlKEpTT04uc3RyaW5naWZ5KHsgY3VzdG9tOiAnZGF0YScgfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgbGlkYXIgY29tIGNhbXBvcyBIVFRQIHBhcmNpYWlzJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJ0aWFsSHR0cERhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1BhcnRpYWwgSFRUUCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvdGVzdCcsXHJcbiAgICAgICAgICAvLyB1cmwsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIGV0YyBuw6NvIGZvcm5lY2lkb3NcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nSW5mbyhwYXJ0aWFsSHR0cERhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLm1ldGhvZCddKS50b0JlKCdQT1NUJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuZW5kcG9pbnQnXSkudG9CZSgnL2FwaS90ZXN0Jyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAudXJsJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5zdGF0dXNfY29kZSddKS50b0JlVW5kZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ2NvbnN0cnV0b3InLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBhY2VpdGFyIHNlcnZpY2VOYW1lIHBhZHLDo28gcGVyc29uYWxpemFkbycsICgpID0+IHtcclxuICAgICAgY29uc3QgY3VzdG9tTG9nZ2VyID0gbmV3IFN0YW5kYXJkTG9nZ2VyKG1vY2tMb2dnZXIsICdjdXN0b20tc2VydmljZScpO1xyXG4gICAgICBjb25zdCBsb2dEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUZXN0JyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGN1c3RvbUxvZ2dlci5sb2dJbmZvKGxvZ0RhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydzZXJ2aWNlLm5hbWUnXSkudG9CZSgnY3VzdG9tLXNlcnZpY2UnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIHVzYXIgXCJ1bmtub3duLXNlcnZpY2VcIiBjb21vIHBhZHLDo28gcXVhbmRvIG7Do28gZXNwZWNpZmljYWRvJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkZWZhdWx0TG9nZ2VyID0gbmV3IFN0YW5kYXJkTG9nZ2VyKG1vY2tMb2dnZXIpO1xyXG4gICAgICBjb25zdCBsb2dEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUZXN0JyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGRlZmF1bHRMb2dnZXIubG9nSW5mbyhsb2dEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ3Vua25vd24tc2VydmljZScpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn0pO1xyXG4iXX0=
@@ -1 +0,0 @@
1
- export {};