@ragemp-mango/core 2.0.6-beta.0 → 2.0.6-beta.1

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.
@@ -0,0 +1,1906 @@
1
+ import {
2
+ ExecutionContextBase,
3
+ MangoRequestBase,
4
+ MangoResponseBase
5
+ } from "./chunk-AO6BXG54.js";
6
+ import {
7
+ Tree,
8
+ TreeNode
9
+ } from "./chunk-RYOUF322.js";
10
+ import {
11
+ validateControllerOptions,
12
+ validateErrorFilter,
13
+ validateGuard,
14
+ validateInjectableMetadata,
15
+ validateInjectionToken,
16
+ validateInterceptor,
17
+ validateModuleOptions,
18
+ validatePipe
19
+ } from "./chunk-PGWRESZG.js";
20
+ import {
21
+ Controller,
22
+ ControllerEventHandler,
23
+ ControllerFlowHandler,
24
+ ControllerMetadataReader,
25
+ ControllerRPCHandler,
26
+ PipelineHandler
27
+ } from "./chunk-SKPH3K2M.js";
28
+ import {
29
+ APP_ENVIROMENT,
30
+ CONTAINER_OPTIONS,
31
+ ENABLE_SHUTDOWN_HOOKS,
32
+ EXECUTION_CONTEXT_FACTORY,
33
+ GLOBAL_APP_CONTAINER,
34
+ GLOBAL_ERROR_FILTERS,
35
+ GLOBAL_GUARDS,
36
+ GLOBAL_INTERCEPTORS,
37
+ GLOBAL_PIPES,
38
+ INTERNAL_APP_CONTAINER,
39
+ MANGO_REQUEST_FACTORY,
40
+ MANGO_RESPONSE_FACTORY,
41
+ MULTIPLAYER_SERVICE,
42
+ PLUGINS
43
+ } from "./chunk-HK7QTFPA.js";
44
+ import {
45
+ Module,
46
+ ModuleContainer,
47
+ ModuleMetadataReader
48
+ } from "./chunk-73LIJA6X.js";
49
+ import {
50
+ CoreMetadataKey,
51
+ MethodParamType
52
+ } from "./chunk-TBWHLT75.js";
53
+ import {
54
+ LOGGER_SERVICE,
55
+ MODULE_CONTAINER,
56
+ REFLECTOR_SERVICE,
57
+ TIMER_SERVICE
58
+ } from "./chunk-DJZCOYB3.js";
59
+ import {
60
+ ErrorMessage
61
+ } from "./chunk-DXPVUDXD.js";
62
+ import {
63
+ generateRandomId,
64
+ isEmpty,
65
+ isNil,
66
+ isNumber,
67
+ isObject,
68
+ isString
69
+ } from "./chunk-E6IQL4S6.js";
70
+ import {
71
+ __name
72
+ } from "./chunk-7QVYU63E.js";
73
+
74
+ // src/services/reflector.service.ts
75
+ import { injectable as injectable9 } from "inversify";
76
+
77
+ // src/decorators/core/controller.decorator.ts
78
+ import { injectable } from "inversify";
79
+ function Controller2(options) {
80
+ return (target) => {
81
+ if (Reflect.hasMetadata(CoreMetadataKey.Controller, target)) {
82
+ throw new Error(ErrorMessage.DuplicateDecoratorUsage);
83
+ }
84
+ const { valid, value, error } = validateControllerOptions(options);
85
+ if (!valid) throw new Error(error);
86
+ Reflect.defineMetadata(CoreMetadataKey.Controller, value, target);
87
+ return injectable()(target);
88
+ };
89
+ }
90
+ __name(Controller2, "Controller");
91
+
92
+ // src/decorators/core/global.decorator.ts
93
+ function Global() {
94
+ return (target) => {
95
+ Reflect.defineMetadata(CoreMetadataKey.GlobalModule, true, target);
96
+ return target;
97
+ };
98
+ }
99
+ __name(Global, "Global");
100
+
101
+ // src/decorators/core/inject.decorator.ts
102
+ import { inject } from "inversify";
103
+ function Inject(key) {
104
+ return (target, propertyKey, paramIndex) => {
105
+ if (!isNil(key) && !validateInjectionToken(key).valid) {
106
+ throw new Error(ErrorMessage.InvalidInjectionTokenSpecified);
107
+ }
108
+ const token = key ?? Reflect.getMetadata("design:type", target, propertyKey);
109
+ if (!token) {
110
+ throw new Error(ErrorMessage.InjectionTokenNotFound);
111
+ }
112
+ inject(token)(target, propertyKey, paramIndex);
113
+ };
114
+ }
115
+ __name(Inject, "Inject");
116
+
117
+ // src/decorators/core/injectable.decorator.ts
118
+ import { injectable as injectable2 } from "inversify";
119
+ function Injectable(options) {
120
+ return (target) => {
121
+ if (Reflect.hasMetadata(CoreMetadataKey.Injectable, target)) {
122
+ throw new Error(ErrorMessage.DuplicateDecoratorUsage);
123
+ }
124
+ const { valid, value, error } = validateInjectableMetadata(options);
125
+ if (!valid) throw new Error(error);
126
+ Reflect.defineMetadata(CoreMetadataKey.Injectable, value, target);
127
+ return injectable2()(target);
128
+ };
129
+ }
130
+ __name(Injectable, "Injectable");
131
+
132
+ // src/decorators/core/module.decorator.ts
133
+ import { injectable as injectable3 } from "inversify";
134
+ function Module2(options) {
135
+ return (target) => {
136
+ if (Reflect.hasMetadata(CoreMetadataKey.Module, target)) {
137
+ throw new Error(ErrorMessage.DuplicateDecoratorUsage);
138
+ }
139
+ const { valid, value, error } = validateModuleOptions(options);
140
+ if (!valid) throw new Error(error);
141
+ Reflect.defineMetadata(CoreMetadataKey.Module, value, target);
142
+ return injectable3()(target);
143
+ };
144
+ }
145
+ __name(Module2, "Module");
146
+
147
+ // src/decorators/core/optional.decorator.ts
148
+ import { optional } from "inversify";
149
+ function Optional() {
150
+ return (target, propertyKey, paramIndex) => {
151
+ return optional()(target, propertyKey, paramIndex);
152
+ };
153
+ }
154
+ __name(Optional, "Optional");
155
+
156
+ // src/decorators/core/set-metadata.decorator.ts
157
+ function SetMetadata(key, value) {
158
+ const decoratorFactory = /* @__PURE__ */ __name((target, _method, descriptor) => {
159
+ if (descriptor) {
160
+ Reflect.defineMetadata(key, value, descriptor.value);
161
+ return descriptor;
162
+ }
163
+ Reflect.defineMetadata(key, value, target);
164
+ return target;
165
+ }, "decoratorFactory");
166
+ decoratorFactory.KEY = key;
167
+ return decoratorFactory;
168
+ }
169
+ __name(SetMetadata, "SetMetadata");
170
+
171
+ // src/decorators/errors/catch.decorator.ts
172
+ function Catch(...exceptions) {
173
+ return (target) => {
174
+ if (Reflect.hasMetadata(CoreMetadataKey.Catch, target)) {
175
+ throw new Error(ErrorMessage.DuplicateDecoratorUsage);
176
+ }
177
+ const duplicates = exceptions.filter((exception, index) => exceptions.indexOf(exception) !== index);
178
+ if (duplicates.length) {
179
+ throw new Error(ErrorMessage.ExceptionHandlingConflict);
180
+ }
181
+ Reflect.defineMetadata(CoreMetadataKey.Catch, exceptions, target);
182
+ return target;
183
+ };
184
+ }
185
+ __name(Catch, "Catch");
186
+
187
+ // src/decorators/errors/use-filters.decorator.ts
188
+ function UseFilters(...filters) {
189
+ return (target, method, descriptor) => {
190
+ const validatedFilters = [];
191
+ for (const filter of filters) {
192
+ const { valid, value, error } = validateErrorFilter(filter);
193
+ if (!valid) throw new Error(error);
194
+ validatedFilters.push(value);
195
+ }
196
+ if (!isNil(descriptor) && !isNil(descriptor.value)) {
197
+ if (filters.length === 0) {
198
+ throw new Error(ErrorMessage.AtLeastOneFilterRequired);
199
+ }
200
+ const methodFilters = Reflect.getMetadata(CoreMetadataKey.ErrorFilters, target.constructor, method) || [];
201
+ if (!isNil(methodFilters.find((filter) => filters.includes(filter)))) {
202
+ throw new Error(ErrorMessage.DuplicateErrorFilterDetected);
203
+ }
204
+ Reflect.defineMetadata(CoreMetadataKey.ErrorFilters, [
205
+ ...validatedFilters,
206
+ ...methodFilters
207
+ ], target.constructor, method);
208
+ return descriptor;
209
+ }
210
+ if (filters.length === 0) {
211
+ throw new Error(ErrorMessage.AtLeastOneFilterRequired);
212
+ }
213
+ const classFilters = Reflect.getMetadata(CoreMetadataKey.ErrorFilters, target) || [];
214
+ if (!isNil(classFilters.find((filter) => filters.includes(filter)))) {
215
+ throw new Error(ErrorMessage.DuplicateErrorFilterDetected);
216
+ }
217
+ Reflect.defineMetadata(CoreMetadataKey.ErrorFilters, [
218
+ ...validatedFilters,
219
+ ...classFilters
220
+ ], target);
221
+ return target;
222
+ };
223
+ }
224
+ __name(UseFilters, "UseFilters");
225
+
226
+ // src/app/module-tree/app-runtime.ts
227
+ import { inject as inject2, injectable as injectable4, optional as optional2 } from "inversify";
228
+ function _ts_decorate(decorators, target, key, desc) {
229
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
230
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
231
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
232
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
233
+ }
234
+ __name(_ts_decorate, "_ts_decorate");
235
+ function _ts_metadata(k, v) {
236
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
237
+ }
238
+ __name(_ts_metadata, "_ts_metadata");
239
+ var AppRuntime = class {
240
+ static {
241
+ __name(this, "AppRuntime");
242
+ }
243
+ eventHandler;
244
+ rpcHandler;
245
+ globalGuards;
246
+ globalInterceptors;
247
+ globalPipes;
248
+ globalErrorFilters;
249
+ loggerService;
250
+ enableShutdownHooks;
251
+ async boot(resolvedTree) {
252
+ await resolvedTree.asyncTraverse(async (node) => {
253
+ const startTime = Date.now();
254
+ const module = node.value;
255
+ module.instance = module.container.get(module.metadata.classRef);
256
+ module.controllers.forEach((controller) => controller.instance = module.container.get(controller.metadata.classRef));
257
+ [
258
+ ...module.metadata.internalProviders,
259
+ ...module.metadata.externalProviders
260
+ ].forEach(([token]) => module.container.get(token));
261
+ this.loggerService.log(`~lw~Module ~lb~${module.metadata.classRef.name} ~lw~loaded ~lk~(${Date.now() - startTime}ms)`);
262
+ await this.runLifecycleMethod(module, "onModuleInit");
263
+ });
264
+ await this.runLifecycleMethods(resolvedTree, "onAppBootstrap");
265
+ resolvedTree.traverse((node) => {
266
+ const module = node.value;
267
+ module.controllers.forEach((controller) => {
268
+ const time = Date.now();
269
+ this.registerTimers(controller);
270
+ this.registerListeners(controller);
271
+ this.loggerService.log(`~lw~Controller ~lc~${controller.metadata.classRef.name} ~lw~timers and listeners registered ~lk~(${Date.now() - time}ms)`);
272
+ });
273
+ });
274
+ }
275
+ async shutdown(resolvedTree) {
276
+ if (this.enableShutdownHooks) {
277
+ await this.runLifecycleMethods(resolvedTree, "onModuleDestroy");
278
+ await this.runLifecycleMethods(resolvedTree, "beforeAppShutdown");
279
+ }
280
+ await resolvedTree.asyncTraverse(async (node) => {
281
+ const module = node.value;
282
+ module.controllers.forEach((controller) => {
283
+ const timerService = controller.owner.container.get(TIMER_SERVICE);
284
+ timerService.everyticks.forEach((timer) => timer.destroy());
285
+ timerService.intervals.forEach((timer) => timer.destroy());
286
+ timerService.timeouts.forEach((timer) => timer.destroy());
287
+ timerService.crons.forEach((cron) => cron.stop());
288
+ controller.eventHandlers.forEach((handler) => handler.destroy());
289
+ controller.rpcHandlers.forEach((handler) => handler.destroy());
290
+ });
291
+ });
292
+ if (this.enableShutdownHooks) {
293
+ await this.runLifecycleMethods(resolvedTree, "onAppShutdown");
294
+ }
295
+ }
296
+ registerListeners(controller) {
297
+ const module = controller.owner;
298
+ controller.metadata.events.forEach((event) => {
299
+ const guards = [
300
+ ...this.globalGuards,
301
+ ...module.metadata.guards,
302
+ ...controller.metadata.guards,
303
+ ...event.guards
304
+ ];
305
+ const interceptors = [
306
+ ...this.globalInterceptors,
307
+ ...module.metadata.interceptors,
308
+ ...controller.metadata.interceptors,
309
+ ...event.interceptors
310
+ ];
311
+ const pipes = [
312
+ ...this.globalPipes,
313
+ ...module.metadata.pipes,
314
+ ...controller.metadata.pipes,
315
+ ...event.pipes
316
+ ];
317
+ const mappedErrorFilters = this.mapErrorFilters([
318
+ ...this.globalErrorFilters,
319
+ ...module.metadata.errorFilters,
320
+ ...controller.metadata.errorFilters,
321
+ ...event.errorFilters
322
+ ]);
323
+ const handler = this.eventHandler.registerEvent(guards, interceptors, pipes, mappedErrorFilters, controller, event);
324
+ controller.eventHandlers.push(handler);
325
+ });
326
+ controller.metadata.rpcs.forEach(async (rpc) => {
327
+ const guards = [
328
+ ...this.globalGuards,
329
+ ...module.metadata.guards,
330
+ ...controller.metadata.guards,
331
+ ...rpc.guards
332
+ ];
333
+ const interceptors = [
334
+ ...this.globalInterceptors,
335
+ ...module.metadata.interceptors,
336
+ ...controller.metadata.interceptors,
337
+ ...rpc.interceptors
338
+ ];
339
+ const pipes = [
340
+ ...this.globalPipes,
341
+ ...module.metadata.pipes,
342
+ ...controller.metadata.pipes,
343
+ ...rpc.pipes
344
+ ];
345
+ const mappedErrorFilters = this.mapErrorFilters([
346
+ ...this.globalErrorFilters,
347
+ ...module.metadata.errorFilters,
348
+ ...controller.metadata.errorFilters,
349
+ ...rpc.errorFilters
350
+ ]);
351
+ const handler = await this.rpcHandler.registerRPC(guards, interceptors, pipes, mappedErrorFilters, controller, rpc);
352
+ controller.rpcHandlers.push(handler);
353
+ });
354
+ }
355
+ registerTimers(controller) {
356
+ const timerService = controller.owner.container.get(TIMER_SERVICE);
357
+ controller.metadata.timers.forEach((timer) => {
358
+ if (timer.type === "cron") {
359
+ timerService.createCronJob(controller.instance[timer.method].bind(controller.instance), timer.options);
360
+ } else if (timer.type === "everytick") {
361
+ timerService.createEveryTick(controller.instance[timer.method].bind(controller.instance), timer.name);
362
+ } else if (timer.type === "interval") {
363
+ timerService.createInterval(controller.instance[timer.method].bind(controller.instance), timer.options.timeout, timer.name);
364
+ } else if (timer.type === "timeout") {
365
+ timerService.createTimeout(controller.instance[timer.method].bind(controller.instance), timer.options.timeout, timer.name);
366
+ }
367
+ });
368
+ }
369
+ mapErrorFilters(errorFilters) {
370
+ const filterMap = [];
371
+ for (const filter of errorFilters) {
372
+ const errors = Reflect.getMetadata(CoreMetadataKey.Catch, filter) ?? [];
373
+ if (errors.length === 0) {
374
+ errors.push("MANGO_ANY_ERROR");
375
+ }
376
+ for (const error of errors) {
377
+ if (!isNil(filterMap.find((filterError) => filterError[0] === error))) {
378
+ this.loggerService.error("An error occurred while trying to map error filters.");
379
+ throw new Error(ErrorMessage.ErrorAlreadyHandledByFilter);
380
+ }
381
+ filterMap.push([
382
+ error,
383
+ filter
384
+ ]);
385
+ }
386
+ }
387
+ return filterMap;
388
+ }
389
+ async runLifecycleMethods(resolvedTree, method) {
390
+ return resolvedTree.asyncTraverse(async (node) => await this.runLifecycleMethod(node.value, method));
391
+ }
392
+ async runLifecycleMethod(module, method) {
393
+ await Promise.all(module.controllers.map(async (controller) => {
394
+ if (!isObject(controller.instance) || isNil(controller.instance[method])) return;
395
+ await controller.instance[method]();
396
+ }));
397
+ await Promise.all([
398
+ ...module.metadata.internalProviders,
399
+ ...module.metadata.externalProviders
400
+ ].map(async ([token]) => {
401
+ const providerInstance = module.container.get(token);
402
+ if (!isObject(providerInstance) || isNil(providerInstance[method])) return;
403
+ await providerInstance[method]();
404
+ }));
405
+ if (!isObject(module.instance) || isNil(module.instance[method])) return;
406
+ await module.instance[method]();
407
+ }
408
+ };
409
+ _ts_decorate([
410
+ inject2(ControllerEventHandler),
411
+ _ts_metadata("design:type", typeof ControllerEventHandler === "undefined" ? Object : ControllerEventHandler)
412
+ ], AppRuntime.prototype, "eventHandler", void 0);
413
+ _ts_decorate([
414
+ inject2(ControllerRPCHandler),
415
+ _ts_metadata("design:type", typeof ControllerRPCHandler === "undefined" ? Object : ControllerRPCHandler)
416
+ ], AppRuntime.prototype, "rpcHandler", void 0);
417
+ _ts_decorate([
418
+ inject2(GLOBAL_GUARDS),
419
+ _ts_metadata("design:type", Array)
420
+ ], AppRuntime.prototype, "globalGuards", void 0);
421
+ _ts_decorate([
422
+ inject2(GLOBAL_INTERCEPTORS),
423
+ _ts_metadata("design:type", Array)
424
+ ], AppRuntime.prototype, "globalInterceptors", void 0);
425
+ _ts_decorate([
426
+ inject2(GLOBAL_PIPES),
427
+ _ts_metadata("design:type", Array)
428
+ ], AppRuntime.prototype, "globalPipes", void 0);
429
+ _ts_decorate([
430
+ inject2(GLOBAL_ERROR_FILTERS),
431
+ _ts_metadata("design:type", Array)
432
+ ], AppRuntime.prototype, "globalErrorFilters", void 0);
433
+ _ts_decorate([
434
+ inject2(LOGGER_SERVICE),
435
+ _ts_metadata("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
436
+ ], AppRuntime.prototype, "loggerService", void 0);
437
+ _ts_decorate([
438
+ inject2(ENABLE_SHUTDOWN_HOOKS),
439
+ optional2(),
440
+ _ts_metadata("design:type", Boolean)
441
+ ], AppRuntime.prototype, "enableShutdownHooks", void 0);
442
+ AppRuntime = _ts_decorate([
443
+ injectable4()
444
+ ], AppRuntime);
445
+
446
+ // src/app/module-tree/dependency-binder.ts
447
+ import { Container, inject as inject3, injectable as injectable5, optional as optional3 } from "inversify";
448
+ function _ts_decorate2(decorators, target, key, desc) {
449
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
450
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
451
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
452
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
453
+ }
454
+ __name(_ts_decorate2, "_ts_decorate");
455
+ function _ts_metadata2(k, v) {
456
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
457
+ }
458
+ __name(_ts_metadata2, "_ts_metadata");
459
+ var ModuleDependencyBinder = class {
460
+ static {
461
+ __name(this, "ModuleDependencyBinder");
462
+ }
463
+ globalAppContainer;
464
+ loggerService;
465
+ containerOptions;
466
+ async bind(resolvedTree) {
467
+ await resolvedTree.asyncTraverse(async (node) => {
468
+ const startTime = Date.now();
469
+ const module = node.value;
470
+ module.container = new ModuleContainer(module.metadata.container ?? this.containerOptions);
471
+ module.container.parent = this.globalAppContainer;
472
+ this.globalAppContainer.bind(module.metadata.classRef).toSelf().inSingletonScope();
473
+ if (module.metadata.global) {
474
+ for (const [_, provider] of module.metadata.externalProviders) {
475
+ this.bindProvider(provider, this.globalAppContainer);
476
+ }
477
+ } else {
478
+ for (const [token, provider] of module.metadata.externalProviders) {
479
+ this.bindProvider(provider, module.container);
480
+ module.parent?.container.bind(token).toDynamicValue(() => module.container.get(token));
481
+ }
482
+ for (const importModule of module.repetitiveImports) {
483
+ for (const [token] of importModule.metadata.externalProviders) {
484
+ module.container.bind(token).toDynamicValue(() => importModule.container.get(token));
485
+ }
486
+ }
487
+ }
488
+ for (const [_, provider] of module.metadata.internalProviders) {
489
+ this.bindProvider(provider, module.container);
490
+ }
491
+ module.container.bind(MODULE_CONTAINER).toConstantValue(module.container);
492
+ for (const classRef of module.metadata.controllers) {
493
+ module.container.bind(classRef).toSelf().inSingletonScope();
494
+ }
495
+ module.container.bind(TIMER_SERVICE).to(TimerService).inSingletonScope();
496
+ this.loggerService.log(`~lw~Module ~lb~${module.metadata.classRef.name} ~lw~dependencies binded ~lk~(${Date.now() - startTime}ms)`);
497
+ });
498
+ }
499
+ bindProvider(provider, container) {
500
+ if ("useValue" in provider) {
501
+ container.bind(provider.provide).toConstantValue(provider.useValue);
502
+ } else if ("useFactory" in provider) {
503
+ const binding = container.bind(provider.provide).toDynamicValue((ctx) => {
504
+ const deps = provider.inject?.map((dep) => {
505
+ if (isObject(dep) && "token" in dep && "optional" in dep) {
506
+ try {
507
+ return ctx.container.get(dep.token);
508
+ } catch (err) {
509
+ if (dep.optional) return void 0;
510
+ this.loggerService.error("An error occurred while trying to resolve a dependency.");
511
+ throw err;
512
+ }
513
+ }
514
+ return ctx.container.get(dep);
515
+ }) ?? [];
516
+ return provider.useFactory(...deps);
517
+ });
518
+ if (provider.scope === "transient") binding.inTransientScope();
519
+ else if (provider.scope === "request") binding.inRequestScope();
520
+ else binding.inSingletonScope();
521
+ } else if ("useClass" in provider) {
522
+ const binding = container.bind(provider.provide).to(provider.useClass);
523
+ if (provider.scope === "transient") binding.inTransientScope();
524
+ else if (provider.scope === "request") binding.inRequestScope();
525
+ else binding.inSingletonScope();
526
+ } else if ("useExisting" in provider) {
527
+ container.bind(provider.provide).toService(provider.useExisting);
528
+ }
529
+ }
530
+ };
531
+ _ts_decorate2([
532
+ inject3(GLOBAL_APP_CONTAINER),
533
+ _ts_metadata2("design:type", typeof Container === "undefined" ? Object : Container)
534
+ ], ModuleDependencyBinder.prototype, "globalAppContainer", void 0);
535
+ _ts_decorate2([
536
+ inject3(LOGGER_SERVICE),
537
+ _ts_metadata2("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
538
+ ], ModuleDependencyBinder.prototype, "loggerService", void 0);
539
+ _ts_decorate2([
540
+ optional3(),
541
+ inject3(CONTAINER_OPTIONS),
542
+ _ts_metadata2("design:type", typeof interfaces === "undefined" || typeof interfaces.ContainerOptions === "undefined" ? Object : interfaces.ContainerOptions)
543
+ ], ModuleDependencyBinder.prototype, "containerOptions", void 0);
544
+ ModuleDependencyBinder = _ts_decorate2([
545
+ injectable5()
546
+ ], ModuleDependencyBinder);
547
+
548
+ // src/app/module-tree/module-tree-scanner.ts
549
+ import { inject as inject4, injectable as injectable6 } from "inversify";
550
+ function _ts_decorate3(decorators, target, key, desc) {
551
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
552
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
553
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
554
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
555
+ }
556
+ __name(_ts_decorate3, "_ts_decorate");
557
+ function _ts_metadata3(k, v) {
558
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
559
+ }
560
+ __name(_ts_metadata3, "_ts_metadata");
561
+ var ModuleTreeScanner = class {
562
+ static {
563
+ __name(this, "ModuleTreeScanner");
564
+ }
565
+ moduleMetadataReader;
566
+ controllerMetadataReader;
567
+ loggerService;
568
+ async scan(classRef) {
569
+ const startTime = Date.now();
570
+ const moduleMetadata = await this.moduleMetadataReader.read(classRef);
571
+ const module = new Module();
572
+ module.metadata = moduleMetadata;
573
+ this.loggerService.log(`~lw~Module ~lb~${module.metadata.classRef.name} ~lw~scanned ~lk~(${Date.now() - startTime}ms)`);
574
+ await this.scanControllers(module);
575
+ const moduleTree = new Tree(module);
576
+ const scannedModules = /* @__PURE__ */ new Map();
577
+ scannedModules.set(classRef, module);
578
+ for (const importedModule of moduleMetadata.imports) {
579
+ await this.scanModules(moduleTree.root, importedModule, scannedModules);
580
+ }
581
+ return moduleTree;
582
+ }
583
+ async scanModules(parentNode, classRef, scannedModules = /* @__PURE__ */ new Map()) {
584
+ const scannedModule = scannedModules.get(classRef);
585
+ if (!isNil(scannedModule)) {
586
+ parentNode.value.repetitiveImports.add(scannedModule);
587
+ return;
588
+ }
589
+ const startTime = Date.now();
590
+ const moduleMetadata = await this.moduleMetadataReader.read(classRef);
591
+ this.checkCircularDependency(parentNode.value.metadata, moduleMetadata);
592
+ const module = new Module();
593
+ module.metadata = moduleMetadata;
594
+ module.parent = parentNode.value;
595
+ this.loggerService.log(`~lw~Module ~lb~${module.metadata.classRef.name} ~lw~scanned ~lk~(${Date.now() - startTime}ms)`);
596
+ await this.scanControllers(module);
597
+ const treeNode = new TreeNode(module);
598
+ parentNode.addChild(treeNode);
599
+ scannedModules.set(classRef, module);
600
+ for (const importModule of moduleMetadata.imports) {
601
+ await this.scanModules(treeNode, importModule, scannedModules);
602
+ }
603
+ }
604
+ async scanControllers(module) {
605
+ for (const classRef of module.metadata.controllers) {
606
+ const startTime = Date.now();
607
+ const controllerMetadata = await this.controllerMetadataReader.read(classRef);
608
+ const controller = new Controller();
609
+ controller.metadata = controllerMetadata;
610
+ controller.owner = module;
611
+ module.controllers.push(controller);
612
+ this.loggerService.log(`~lw~Controller ~lc~${classRef.name} ~lw~scanned ~lk~(${Date.now() - startTime}ms)`);
613
+ }
614
+ }
615
+ async checkCircularDependency(parentMetadata, moduleMetadata) {
616
+ if (moduleMetadata.imports.includes(parentMetadata.classRef)) {
617
+ throw new Error(ErrorMessage.CircularDependencyDetected);
618
+ }
619
+ }
620
+ };
621
+ _ts_decorate3([
622
+ inject4(ModuleMetadataReader),
623
+ _ts_metadata3("design:type", typeof ModuleMetadataReader === "undefined" ? Object : ModuleMetadataReader)
624
+ ], ModuleTreeScanner.prototype, "moduleMetadataReader", void 0);
625
+ _ts_decorate3([
626
+ inject4(ControllerMetadataReader),
627
+ _ts_metadata3("design:type", typeof ControllerMetadataReader === "undefined" ? Object : ControllerMetadataReader)
628
+ ], ModuleTreeScanner.prototype, "controllerMetadataReader", void 0);
629
+ _ts_decorate3([
630
+ inject4(LOGGER_SERVICE),
631
+ _ts_metadata3("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
632
+ ], ModuleTreeScanner.prototype, "loggerService", void 0);
633
+ ModuleTreeScanner = _ts_decorate3([
634
+ injectable6()
635
+ ], ModuleTreeScanner);
636
+
637
+ // src/app/multiplayer/ragemp/ragemp-script-event-handler.ts
638
+ var RageMPScriptEvent = class {
639
+ static {
640
+ __name(this, "RageMPScriptEvent");
641
+ }
642
+ eventName;
643
+ listener;
644
+ constructor(eventName, listener) {
645
+ this.eventName = eventName;
646
+ this.listener = listener;
647
+ }
648
+ destroy() {
649
+ mp.events.remove(this.eventName, this.listener);
650
+ }
651
+ };
652
+
653
+ // src/app/multiplayer/ragemp/ragemp-event-emmiter.ts
654
+ var RageMPEventEmmiter = class {
655
+ static {
656
+ __name(this, "RageMPEventEmmiter");
657
+ }
658
+ mapEvents;
659
+ mapEventsShared = {
660
+ // Map alt:V event names to RageMP equivalents
661
+ "entityColShapeEnter": "playerEnterColshape",
662
+ "entityColShapeLeave": "playerExitColshape"
663
+ };
664
+ constructor(mapEvents = {}) {
665
+ this.mapEvents = mapEvents;
666
+ }
667
+ getEventName(eventName) {
668
+ return this.mapEventsShared[eventName] || this.mapEvents[eventName] || eventName;
669
+ }
670
+ emit(eventName, ...args) {
671
+ mp.events.call(eventName, ...args);
672
+ }
673
+ on(eventName, listener) {
674
+ const mappedEventName = this.getEventName(eventName);
675
+ mp.events.add(mappedEventName, listener);
676
+ return new RageMPScriptEvent(mappedEventName, listener);
677
+ }
678
+ once(eventName, listener) {
679
+ const mappedEventName = this.getEventName(eventName);
680
+ const onceWrapper = /* @__PURE__ */ __name((...args) => {
681
+ mp.events.remove(mappedEventName, onceWrapper);
682
+ listener(...args);
683
+ }, "onceWrapper");
684
+ mp.events.add(mappedEventName, onceWrapper);
685
+ return new RageMPScriptEvent(mappedEventName, onceWrapper);
686
+ }
687
+ off(eventName, listener) {
688
+ mp.events.remove(eventName, listener);
689
+ }
690
+ };
691
+
692
+ // src/app/multiplayer/ragemp/ragemp-timer.ts
693
+ var RageMPTimer = class {
694
+ static {
695
+ __name(this, "RageMPTimer");
696
+ }
697
+ id;
698
+ interval;
699
+ once;
700
+ callback;
701
+ clearTimer;
702
+ lastTick = Date.now();
703
+ constructor(id, interval = 0, once, callback, clearTimer) {
704
+ this.id = id;
705
+ this.interval = interval;
706
+ this.once = once;
707
+ this.callback = callback;
708
+ this.clearTimer = clearTimer;
709
+ }
710
+ destroy() {
711
+ this.clearTimer();
712
+ }
713
+ };
714
+
715
+ // src/app/multiplayer/ragemp/ragemp-timers.ts
716
+ var RageMPTimers = class {
717
+ static {
718
+ __name(this, "RageMPTimers");
719
+ }
720
+ timerIncrementer = 0;
721
+ timers = /* @__PURE__ */ new Map();
722
+ everyTickHandlers = /* @__PURE__ */ new Map();
723
+ isEveryTickRunning = false;
724
+ everyTickMainHandler = null;
725
+ get all() {
726
+ return [
727
+ ...this.timers.values()
728
+ ];
729
+ }
730
+ get warningThreshold() {
731
+ return 0;
732
+ }
733
+ set warningThreshold(_value) {
734
+ }
735
+ get sourceLocationFrameSkipCount() {
736
+ return 0;
737
+ }
738
+ set sourceLocationFrameSkipCount(_value) {
739
+ }
740
+ getByID(id) {
741
+ const timer = this.timers.get(id);
742
+ return timer ?? null;
743
+ }
744
+ createTimer(createTimer, clear, callback, interval, once, ...args) {
745
+ const callbackBind = callback.bind(this, ...Array.isArray(args) ? args : []);
746
+ const timerId = typeof interval === "number" ? createTimer(callbackBind, interval) : createTimer(callbackBind);
747
+ const id = this.timerIncrementer++;
748
+ const rageMPTimer = new RageMPTimer(id, interval ?? 0, once, callbackBind, () => {
749
+ clear(timerId);
750
+ this.timers.delete(id);
751
+ });
752
+ this.timers.set(id, rageMPTimer);
753
+ return rageMPTimer;
754
+ }
755
+ setInterval(callback, time, ...args) {
756
+ return this.createTimer((cb, interval) => setInterval(cb, interval), (id) => clearInterval(id), callback, time, false, ...args);
757
+ }
758
+ setTimeout(callback, time, ...args) {
759
+ const id = this.timerIncrementer++;
760
+ const callbackBind = callback.bind(this, ...Array.isArray(args) ? args : []);
761
+ const timerId = setTimeout(() => {
762
+ callbackBind();
763
+ this.timers.delete(id);
764
+ }, time);
765
+ const rageMPTimer = new RageMPTimer(id, time, true, callbackBind, () => {
766
+ clearTimeout(timerId);
767
+ this.timers.delete(id);
768
+ });
769
+ this.timers.set(id, rageMPTimer);
770
+ return rageMPTimer;
771
+ }
772
+ everyTick(callback, ...args) {
773
+ const id = this.timerIncrementer++;
774
+ const callbackBind = callback.bind(this, ...Array.isArray(args) ? args : []);
775
+ this.everyTickHandlers.set(id, {
776
+ callback,
777
+ bound: callbackBind
778
+ });
779
+ const isClientSide = typeof mp !== "undefined" && typeof mp.browsers !== "undefined";
780
+ if (!this.isEveryTickRunning) {
781
+ this.isEveryTickRunning = true;
782
+ if (isClientSide) {
783
+ this.everyTickMainHandler = () => {
784
+ for (const [, handler] of this.everyTickHandlers) {
785
+ try {
786
+ handler.bound();
787
+ } catch (e) {
788
+ mp.console.logError(`Error in everyTick handler: ${e}`);
789
+ }
790
+ }
791
+ };
792
+ mp.events.add("render", this.everyTickMainHandler);
793
+ } else {
794
+ const intervalHandler = /* @__PURE__ */ __name(() => {
795
+ for (const [, handler] of this.everyTickHandlers) {
796
+ try {
797
+ handler.bound();
798
+ } catch (e) {
799
+ mp.console.logError(`Error in everyTick handler: ${e}`);
800
+ }
801
+ }
802
+ }, "intervalHandler");
803
+ this._everyTickInterval = setInterval(intervalHandler, 0);
804
+ }
805
+ }
806
+ const rageMPTimer = new RageMPTimer(id, 0, false, callbackBind, () => {
807
+ this.everyTickHandlers.delete(id);
808
+ this.timers.delete(id);
809
+ if (this.everyTickHandlers.size === 0) {
810
+ if (isClientSide && this.everyTickMainHandler) {
811
+ mp.events.remove("render", this.everyTickMainHandler);
812
+ this.everyTickMainHandler = null;
813
+ } else if (this._everyTickInterval) {
814
+ clearInterval(this._everyTickInterval);
815
+ this._everyTickInterval = null;
816
+ }
817
+ this.isEveryTickRunning = false;
818
+ }
819
+ });
820
+ this.timers.set(id, rageMPTimer);
821
+ return rageMPTimer;
822
+ }
823
+ nextTick(callback, ...args) {
824
+ const id = this.timerIncrementer++;
825
+ const callbackBind = callback.bind(this, ...Array.isArray(args) ? args : []);
826
+ const isClientSide = typeof mp !== "undefined" && typeof mp.browsers !== "undefined";
827
+ let timerId;
828
+ if (isClientSide) {
829
+ const handler = /* @__PURE__ */ __name(() => {
830
+ try {
831
+ callbackBind();
832
+ } finally {
833
+ mp.events.remove("render", handler);
834
+ this.timers.delete(id);
835
+ }
836
+ }, "handler");
837
+ mp.events.add("render", handler);
838
+ const rageMPTimer = new RageMPTimer(id, 0, true, callbackBind, () => {
839
+ mp.events.remove("render", handler);
840
+ this.timers.delete(id);
841
+ });
842
+ this.timers.set(id, rageMPTimer);
843
+ return rageMPTimer;
844
+ } else {
845
+ timerId = setTimeout(() => {
846
+ try {
847
+ callbackBind();
848
+ } finally {
849
+ this.timers.delete(id);
850
+ }
851
+ }, 0);
852
+ const rageMPTimer = new RageMPTimer(id, 0, true, callbackBind, () => {
853
+ clearTimeout(timerId);
854
+ this.timers.delete(id);
855
+ });
856
+ this.timers.set(id, rageMPTimer);
857
+ return rageMPTimer;
858
+ }
859
+ }
860
+ time(_name) {
861
+ }
862
+ timeEnd(_name) {
863
+ }
864
+ };
865
+
866
+ // src/app/multiplayer/ragemp/ragemp-multiplayer.service.ts
867
+ var RageMPMultiplayerService = class {
868
+ static {
869
+ __name(this, "RageMPMultiplayerService");
870
+ }
871
+ Timers;
872
+ Events;
873
+ constructor() {
874
+ this.Events = new RageMPEventEmmiter();
875
+ this.Timers = new RageMPTimers();
876
+ }
877
+ parseInternalArgs(...args) {
878
+ const player = isObject(args[0]) ? args[0] : void 0;
879
+ return {
880
+ player,
881
+ body: args
882
+ };
883
+ }
884
+ log(arg, ...args) {
885
+ const message = [
886
+ arg,
887
+ ...args
888
+ ].map((a) => typeof a === "object" ? JSON.stringify(a) : String(a)).join(" ");
889
+ mp.console.logInfo(message);
890
+ }
891
+ logError(arg, ...args) {
892
+ const message = [
893
+ arg,
894
+ ...args
895
+ ].map((a) => typeof a === "object" ? JSON.stringify(a) : String(a)).join(" ");
896
+ mp.console.logError(message);
897
+ }
898
+ logWarning(arg, ...args) {
899
+ const message = [
900
+ arg,
901
+ ...args
902
+ ].map((a) => typeof a === "object" ? JSON.stringify(a) : String(a)).join(" ");
903
+ mp.console.logWarning(message);
904
+ }
905
+ logDebug(arg, ...args) {
906
+ const message = [
907
+ arg,
908
+ ...args
909
+ ].map((a) => typeof a === "object" ? JSON.stringify(a) : String(a)).join(" ");
910
+ mp.console.logInfo(`[DEBUG] ${message}`);
911
+ }
912
+ };
913
+
914
+ // src/app/app-builder.ts
915
+ import { inject as inject6, Container as Container3, injectable as injectable8 } from "inversify";
916
+
917
+ // src/app/app.ts
918
+ import { Container as Container2, inject as inject5, injectable as injectable7 } from "inversify";
919
+ function _ts_decorate4(decorators, target, key, desc) {
920
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
921
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
922
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
923
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
924
+ }
925
+ __name(_ts_decorate4, "_ts_decorate");
926
+ function _ts_metadata4(k, v) {
927
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
928
+ }
929
+ __name(_ts_metadata4, "_ts_metadata");
930
+ var App = class {
931
+ static {
932
+ __name(this, "App");
933
+ }
934
+ moduleTreeScanner;
935
+ moduleDependencyBinder;
936
+ appRuntime;
937
+ internalAppContainer;
938
+ plugins;
939
+ loggerService;
940
+ moduleTree;
941
+ loaded = false;
942
+ async start(rootModule) {
943
+ if (this.loaded) {
944
+ this.loggerService.error("Error occurred while starting the app.");
945
+ throw new Error(ErrorMessage.AppAlreadyLoaded);
946
+ }
947
+ this.loggerService.log("~lw~Starting app...");
948
+ await this.runPluginMethods("beforeStart");
949
+ this.loggerService.log("~lw~Scanning module tree...");
950
+ await this.runPluginMethods("beforeScan");
951
+ this.moduleTree = await this.moduleTreeScanner.scan(rootModule);
952
+ await this.runPluginMethods("afterScan");
953
+ this.loggerService.log("~lw~Binding module dependencies...");
954
+ await this.runPluginMethods("beforeBind");
955
+ await this.moduleDependencyBinder.bind(this.moduleTree);
956
+ await this.runPluginMethods("afterBind");
957
+ this.loggerService.log("~lw~Loading app...");
958
+ await this.runPluginMethods("beforeLoad");
959
+ await this.appRuntime.boot(this.moduleTree);
960
+ this.loaded = true;
961
+ await this.runPluginMethods("afterLoad");
962
+ this.loggerService.log("~lw~App loaded");
963
+ await this.runPluginMethods("afterStart");
964
+ }
965
+ async stop() {
966
+ if (!this.loaded) {
967
+ this.loggerService.error("Error occurred while stopping the app.");
968
+ throw new Error(ErrorMessage.AppNotLoaded);
969
+ }
970
+ await this.runPluginMethods("beforeStop");
971
+ this.loggerService.log("~lw~Stopping app...");
972
+ await this.appRuntime.shutdown(this.moduleTree);
973
+ this.loaded = false;
974
+ this.loggerService.log("~lw~App stopped");
975
+ await this.runPluginMethods("afterStop");
976
+ }
977
+ async runPluginMethods(method) {
978
+ await Promise.all(this.plugins.map(async (p) => {
979
+ const plugin = this.internalAppContainer.get(p);
980
+ if (!plugin[method]) return Promise.resolve();
981
+ return Promise.resolve(plugin[method]());
982
+ }));
983
+ }
984
+ };
985
+ _ts_decorate4([
986
+ inject5(ModuleTreeScanner),
987
+ _ts_metadata4("design:type", typeof ModuleTreeScanner === "undefined" ? Object : ModuleTreeScanner)
988
+ ], App.prototype, "moduleTreeScanner", void 0);
989
+ _ts_decorate4([
990
+ inject5(ModuleDependencyBinder),
991
+ _ts_metadata4("design:type", typeof ModuleDependencyBinder === "undefined" ? Object : ModuleDependencyBinder)
992
+ ], App.prototype, "moduleDependencyBinder", void 0);
993
+ _ts_decorate4([
994
+ inject5(AppRuntime),
995
+ _ts_metadata4("design:type", typeof AppRuntime === "undefined" ? Object : AppRuntime)
996
+ ], App.prototype, "appRuntime", void 0);
997
+ _ts_decorate4([
998
+ inject5(INTERNAL_APP_CONTAINER),
999
+ _ts_metadata4("design:type", typeof Container2 === "undefined" ? Object : Container2)
1000
+ ], App.prototype, "internalAppContainer", void 0);
1001
+ _ts_decorate4([
1002
+ inject5(PLUGINS),
1003
+ _ts_metadata4("design:type", Array)
1004
+ ], App.prototype, "plugins", void 0);
1005
+ _ts_decorate4([
1006
+ inject5(LOGGER_SERVICE),
1007
+ _ts_metadata4("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
1008
+ ], App.prototype, "loggerService", void 0);
1009
+ App = _ts_decorate4([
1010
+ injectable7()
1011
+ ], App);
1012
+
1013
+ // src/app/app-builder.ts
1014
+ function _ts_decorate5(decorators, target, key, desc) {
1015
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1016
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1017
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1018
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1019
+ }
1020
+ __name(_ts_decorate5, "_ts_decorate");
1021
+ function _ts_metadata5(k, v) {
1022
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1023
+ }
1024
+ __name(_ts_metadata5, "_ts_metadata");
1025
+ var AppBuilder = class {
1026
+ static {
1027
+ __name(this, "AppBuilder");
1028
+ }
1029
+ enviroment;
1030
+ internalAppContainer;
1031
+ multiplayerService;
1032
+ plugins;
1033
+ globalContainerOptions = {};
1034
+ useGlobalGuards(...guards) {
1035
+ const validatedGuards = [];
1036
+ for (const guard of guards) {
1037
+ const { valid, value, error } = validateGuard(guard);
1038
+ if (!valid) throw new Error(error);
1039
+ validatedGuards.push(value);
1040
+ }
1041
+ this.internalAppContainer.bind(GLOBAL_GUARDS).toConstantValue(validatedGuards);
1042
+ return this;
1043
+ }
1044
+ useGlobalInterceptors(...interceptors) {
1045
+ const validatedInterceptors = [];
1046
+ for (const interceptor of interceptors) {
1047
+ const { valid, value, error } = validateInterceptor(interceptor);
1048
+ if (!valid) throw new Error(error);
1049
+ validatedInterceptors.push(value);
1050
+ }
1051
+ this.internalAppContainer.bind(GLOBAL_INTERCEPTORS).toConstantValue(validatedInterceptors);
1052
+ return this;
1053
+ }
1054
+ useGlobalPipes(...pipes) {
1055
+ const validatedPipes = [];
1056
+ for (const pipe of pipes) {
1057
+ const { valid, value, error } = validatePipe(pipe);
1058
+ if (!valid) throw new Error(error);
1059
+ validatedPipes.push(value);
1060
+ }
1061
+ this.internalAppContainer.bind(GLOBAL_PIPES).toConstantValue(validatedPipes);
1062
+ return this;
1063
+ }
1064
+ useGlobalFilters(...filters) {
1065
+ const validatedFIlters = [];
1066
+ for (const filter of filters) {
1067
+ const { valid, value, error } = validateErrorFilter(filter);
1068
+ if (!valid) throw new Error(error);
1069
+ validatedFIlters.push(value);
1070
+ }
1071
+ this.internalAppContainer.bind(GLOBAL_ERROR_FILTERS).toConstantValue(validatedFIlters);
1072
+ return this;
1073
+ }
1074
+ usePlugins(...plugins) {
1075
+ plugins.forEach((p) => this.internalAppContainer.bind(p).toSelf().inSingletonScope());
1076
+ const internalPlugins = this.internalAppContainer.get(PLUGINS);
1077
+ this.internalAppContainer.rebind(PLUGINS).toConstantValue([
1078
+ ...internalPlugins,
1079
+ ...plugins
1080
+ ]);
1081
+ return this;
1082
+ }
1083
+ enableShutdownHooks() {
1084
+ this.internalAppContainer.bind(ENABLE_SHUTDOWN_HOOKS).toConstantValue(true);
1085
+ return this;
1086
+ }
1087
+ setContainerOptions(options, onlyGlobal = false) {
1088
+ this.globalContainerOptions = options;
1089
+ if (onlyGlobal) return this;
1090
+ this.internalAppContainer.bind(CONTAINER_OPTIONS).toConstantValue(options);
1091
+ return this;
1092
+ }
1093
+ async build() {
1094
+ const globalAppContainer = new Container3(this.globalContainerOptions);
1095
+ globalAppContainer.bind(REFLECTOR_SERVICE).toConstantValue(ReflectorService);
1096
+ globalAppContainer.bind(ReflectorService).toService(REFLECTOR_SERVICE);
1097
+ globalAppContainer.bind(MULTIPLAYER_SERVICE).toConstantValue(this.multiplayerService);
1098
+ this.internalAppContainer.bind(App).toSelf().inSingletonScope();
1099
+ this.internalAppContainer.bind(GLOBAL_APP_CONTAINER).toConstantValue(globalAppContainer);
1100
+ this.internalAppContainer.bind(ModuleTreeScanner).toSelf().inSingletonScope();
1101
+ this.internalAppContainer.bind(ModuleDependencyBinder).toSelf().inSingletonScope();
1102
+ this.internalAppContainer.bind(AppRuntime).toSelf().inSingletonScope();
1103
+ this.internalAppContainer.bind(PipelineHandler).toSelf().inSingletonScope();
1104
+ this.internalAppContainer.bind(Module).toSelf().inTransientScope();
1105
+ this.internalAppContainer.bind(ModuleMetadataReader).toSelf().inSingletonScope();
1106
+ this.internalAppContainer.bind(Controller).toSelf().inTransientScope();
1107
+ this.internalAppContainer.bind(ControllerMetadataReader).toSelf().inSingletonScope();
1108
+ this.internalAppContainer.bind(ControllerFlowHandler).toSelf().inSingletonScope();
1109
+ this.internalAppContainer.bind(ControllerEventHandler).toSelf().inSingletonScope();
1110
+ this.internalAppContainer.bind(ControllerRPCHandler).toSelf().inSingletonScope();
1111
+ this.internalAppContainer.bind(MangoRequestBase).toSelf().inTransientScope();
1112
+ this.internalAppContainer.bind(MANGO_REQUEST_FACTORY).toFactory((context) => {
1113
+ return (body, player) => {
1114
+ const request = context.container.get(MangoRequestBase);
1115
+ request.$body = body;
1116
+ request.$player = player;
1117
+ return request;
1118
+ };
1119
+ });
1120
+ this.internalAppContainer.bind(MangoResponseBase).toSelf().inTransientScope();
1121
+ this.internalAppContainer.bind(MANGO_RESPONSE_FACTORY).toFactory((context) => {
1122
+ return () => {
1123
+ return context.container.get(MangoResponseBase);
1124
+ };
1125
+ });
1126
+ this.internalAppContainer.bind(ExecutionContextBase).toSelf().inTransientScope();
1127
+ this.internalAppContainer.bind(EXECUTION_CONTEXT_FACTORY).toFactory((context) => {
1128
+ return (type, classRef, handler, request, response, name) => {
1129
+ const executionContext = context.container.get(ExecutionContextBase);
1130
+ executionContext.$type = type;
1131
+ executionContext.$request = request;
1132
+ executionContext.$response = response;
1133
+ executionContext.$handler = handler;
1134
+ executionContext.$classRef = classRef;
1135
+ executionContext.$name = name;
1136
+ return executionContext;
1137
+ };
1138
+ });
1139
+ for (const plugin of this.plugins) {
1140
+ this.internalAppContainer.bind(plugin).toSelf().inSingletonScope();
1141
+ const pluginInstance = this.internalAppContainer.get(plugin);
1142
+ if (!pluginInstance.onBuild) continue;
1143
+ await pluginInstance.onBuild();
1144
+ }
1145
+ if (!this.internalAppContainer.isBound(GLOBAL_GUARDS)) this.internalAppContainer.bind(GLOBAL_GUARDS).toConstantValue([]);
1146
+ if (!this.internalAppContainer.isBound(GLOBAL_INTERCEPTORS)) this.internalAppContainer.bind(GLOBAL_INTERCEPTORS).toConstantValue([]);
1147
+ if (!this.internalAppContainer.isBound(GLOBAL_PIPES)) this.internalAppContainer.bind(GLOBAL_PIPES).toConstantValue([]);
1148
+ if (!this.internalAppContainer.isBound(GLOBAL_ERROR_FILTERS)) this.internalAppContainer.bind(GLOBAL_ERROR_FILTERS).toConstantValue([]);
1149
+ return this.internalAppContainer.get(App);
1150
+ }
1151
+ };
1152
+ _ts_decorate5([
1153
+ inject6(APP_ENVIROMENT),
1154
+ _ts_metadata5("design:type", String)
1155
+ ], AppBuilder.prototype, "enviroment", void 0);
1156
+ _ts_decorate5([
1157
+ inject6(INTERNAL_APP_CONTAINER),
1158
+ _ts_metadata5("design:type", typeof Container3 === "undefined" ? Object : Container3)
1159
+ ], AppBuilder.prototype, "internalAppContainer", void 0);
1160
+ _ts_decorate5([
1161
+ inject6(MULTIPLAYER_SERVICE),
1162
+ _ts_metadata5("design:type", typeof MultiplayerService === "undefined" ? Object : MultiplayerService)
1163
+ ], AppBuilder.prototype, "multiplayerService", void 0);
1164
+ _ts_decorate5([
1165
+ inject6(PLUGINS),
1166
+ _ts_metadata5("design:type", Array)
1167
+ ], AppBuilder.prototype, "plugins", void 0);
1168
+ AppBuilder = _ts_decorate5([
1169
+ injectable8()
1170
+ ], AppBuilder);
1171
+
1172
+ // src/app/create-app.ts
1173
+ import { Container as Container4 } from "inversify";
1174
+ async function createAppBuilder({ enviroment, plugins, appBuilderInherit, multiplayerService }) {
1175
+ const internalAppContainer = new Container4();
1176
+ if (multiplayerService) internalAppContainer.bind(MULTIPLAYER_SERVICE).toConstantValue(multiplayerService);
1177
+ internalAppContainer.bind(INTERNAL_APP_CONTAINER).toConstantValue(internalAppContainer);
1178
+ internalAppContainer.bind(APP_ENVIROMENT).toConstantValue(enviroment);
1179
+ internalAppContainer.bind(PLUGINS).toConstantValue(plugins);
1180
+ internalAppContainer.bind(appBuilderInherit).toSelf().inSingletonScope();
1181
+ return internalAppContainer.get(appBuilderInherit);
1182
+ }
1183
+ __name(createAppBuilder, "createAppBuilder");
1184
+
1185
+ // src/decorators/create-event-decorator.ts
1186
+ function createEventDecorator(type, name, webViewId) {
1187
+ return (target, method) => {
1188
+ if (!isNil(name) && !isString(name)) {
1189
+ throw new Error(ErrorMessage.EventNameMustBeString);
1190
+ }
1191
+ name = name ?? method;
1192
+ const events = Reflect.getMetadata(CoreMetadataKey.ControllerEvents, target) ?? [];
1193
+ if (events.some((event) => event.method === method && event.name === name && event.type === type)) {
1194
+ throw new Error(ErrorMessage.EventNameMustBeUnique);
1195
+ }
1196
+ Reflect.defineMetadata(CoreMetadataKey.ControllerEvents, [
1197
+ ...events,
1198
+ {
1199
+ method,
1200
+ name,
1201
+ type,
1202
+ webViewId
1203
+ }
1204
+ ], target);
1205
+ };
1206
+ }
1207
+ __name(createEventDecorator, "createEventDecorator");
1208
+
1209
+ // src/decorators/events/on-internal.decorator.ts
1210
+ function OnInternal(eventName) {
1211
+ return createEventDecorator("onInternal", eventName);
1212
+ }
1213
+ __name(OnInternal, "OnInternal");
1214
+
1215
+ // src/decorators/events/on-webview.decorator.ts
1216
+ function OnWebView(id, eventName) {
1217
+ return createEventDecorator("onWebView", eventName, id);
1218
+ }
1219
+ __name(OnWebView, "OnWebView");
1220
+
1221
+ // src/decorators/events/on.decorator.ts
1222
+ function On(eventName) {
1223
+ return createEventDecorator("on", eventName);
1224
+ }
1225
+ __name(On, "On");
1226
+
1227
+ // src/decorators/events/once-internal.decorator.ts
1228
+ function OnceInternal(eventName) {
1229
+ return createEventDecorator("onceInternal", eventName);
1230
+ }
1231
+ __name(OnceInternal, "OnceInternal");
1232
+
1233
+ // src/decorators/events/once.decorator.ts
1234
+ function Once(eventName) {
1235
+ return createEventDecorator("once", eventName);
1236
+ }
1237
+ __name(Once, "Once");
1238
+
1239
+ // src/decorators/events/once-webview.decorator.ts
1240
+ function OnceWebView(id, eventName) {
1241
+ return createEventDecorator("onceWebView", eventName, id);
1242
+ }
1243
+ __name(OnceWebView, "OnceWebView");
1244
+
1245
+ // src/decorators/params/body.decorator.ts
1246
+ function Body(...pipes) {
1247
+ return (target, method, index) => {
1248
+ const validatedPipes = [];
1249
+ for (const pipe of pipes) {
1250
+ const { valid, value, error } = validatePipe(pipe);
1251
+ if (!valid) throw new Error(error);
1252
+ validatedPipes.push(value);
1253
+ }
1254
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1255
+ if (params.some((param) => param.index === index)) {
1256
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1257
+ }
1258
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1259
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1260
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1261
+ ...params,
1262
+ {
1263
+ index,
1264
+ method,
1265
+ pipes: validatedPipes,
1266
+ type: MethodParamType.Body,
1267
+ data: void 0,
1268
+ metatype
1269
+ }
1270
+ ], target, method);
1271
+ };
1272
+ }
1273
+ __name(Body, "Body");
1274
+
1275
+ // src/decorators/params/index.decorator.ts
1276
+ function Index(key, ...pipes) {
1277
+ return (target, method, index) => {
1278
+ if (!isNumber(key)) {
1279
+ throw new Error(ErrorMessage.IndexKeyMustBeNumber);
1280
+ }
1281
+ const validatedPipes = [];
1282
+ for (const pipe of pipes) {
1283
+ const { valid, value, error } = validatePipe(pipe);
1284
+ if (!valid) throw new Error(error);
1285
+ validatedPipes.push(value);
1286
+ }
1287
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1288
+ if (params.some((param) => param.index === index)) {
1289
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1290
+ }
1291
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1292
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1293
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1294
+ ...params,
1295
+ {
1296
+ index,
1297
+ method,
1298
+ pipes: validatedPipes,
1299
+ type: MethodParamType.Index,
1300
+ data: key,
1301
+ metatype
1302
+ }
1303
+ ], target, method);
1304
+ };
1305
+ }
1306
+ __name(Index, "Index");
1307
+
1308
+ // src/decorators/params/request.decorator.ts
1309
+ function Request() {
1310
+ return (target, method, index) => {
1311
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1312
+ if (params.some((param) => param.index === index)) {
1313
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1314
+ }
1315
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1316
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1317
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1318
+ ...params,
1319
+ {
1320
+ index,
1321
+ method,
1322
+ type: MethodParamType.Request,
1323
+ data: void 0,
1324
+ metatype
1325
+ }
1326
+ ], target, method);
1327
+ };
1328
+ }
1329
+ __name(Request, "Request");
1330
+ function Req() {
1331
+ return Request();
1332
+ }
1333
+ __name(Req, "Req");
1334
+
1335
+ // src/decorators/params/param.decorator.ts
1336
+ function Param(key, ...pipes) {
1337
+ return (target, method, index) => {
1338
+ if (!isString(key)) {
1339
+ throw new Error(ErrorMessage.ParamKeyMustBeString);
1340
+ }
1341
+ const validatedPipes = [];
1342
+ for (const pipe of pipes) {
1343
+ const { valid, value, error } = validatePipe(pipe);
1344
+ if (!valid) throw new Error(error);
1345
+ validatedPipes.push(value);
1346
+ }
1347
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1348
+ if (params.some((param) => param.index === index)) {
1349
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1350
+ }
1351
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1352
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1353
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1354
+ ...params,
1355
+ {
1356
+ index,
1357
+ method,
1358
+ data: key,
1359
+ pipes: validatedPipes,
1360
+ type: MethodParamType.Param,
1361
+ metatype
1362
+ }
1363
+ ], target, method);
1364
+ };
1365
+ }
1366
+ __name(Param, "Param");
1367
+
1368
+ // src/decorators/params/response.deorator.ts
1369
+ function Response() {
1370
+ return (target, method, index) => {
1371
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1372
+ if (params.some((param) => param.index === index)) {
1373
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1374
+ }
1375
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1376
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1377
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1378
+ ...params,
1379
+ {
1380
+ index,
1381
+ method,
1382
+ type: MethodParamType.Response,
1383
+ data: void 0,
1384
+ metatype
1385
+ }
1386
+ ], target, method);
1387
+ };
1388
+ }
1389
+ __name(Response, "Response");
1390
+ function Res() {
1391
+ return Response();
1392
+ }
1393
+ __name(Res, "Res");
1394
+
1395
+ // src/decorators/pipeline/use-guards.decorator.ts
1396
+ function UseGuards(...guards) {
1397
+ return (target, method, descriptor) => {
1398
+ const validatedGuards = [];
1399
+ for (const guard of guards) {
1400
+ const { valid, value, error } = validateGuard(guard);
1401
+ if (!valid) throw new Error(error);
1402
+ validatedGuards.push(value);
1403
+ }
1404
+ if (!isNil(descriptor) && !isNil(descriptor.value)) {
1405
+ if (guards.length === 0) {
1406
+ throw new Error(ErrorMessage.AtLeastOneGuardRequired);
1407
+ }
1408
+ const methodGuards = Reflect.getMetadata(CoreMetadataKey.Guards, target.constructor, method) || [];
1409
+ Reflect.defineMetadata(CoreMetadataKey.Guards, [
1410
+ ...validatedGuards,
1411
+ ...methodGuards
1412
+ ], target.constructor, method);
1413
+ return descriptor;
1414
+ }
1415
+ if (guards.length === 0) {
1416
+ throw new Error(ErrorMessage.AtLeastOneGuardRequired);
1417
+ }
1418
+ const classGuards = Reflect.getMetadata(CoreMetadataKey.Guards, target) || [];
1419
+ Reflect.defineMetadata(CoreMetadataKey.Guards, [
1420
+ ...validatedGuards,
1421
+ ...classGuards
1422
+ ], target);
1423
+ return target;
1424
+ };
1425
+ }
1426
+ __name(UseGuards, "UseGuards");
1427
+
1428
+ // src/decorators/pipeline/use-interceptors.decorator.ts
1429
+ function UseInterceptors(...interceptors) {
1430
+ return (target, method, descriptor) => {
1431
+ const validatedInterceptors = [];
1432
+ for (const interceptor of interceptors) {
1433
+ const { valid, value, error } = validateInterceptor(interceptor);
1434
+ if (!valid) throw new Error(error);
1435
+ validatedInterceptors.push(value);
1436
+ }
1437
+ if (!isNil(descriptor) && !isNil(descriptor.value)) {
1438
+ if (interceptors.length === 0) {
1439
+ throw new Error(ErrorMessage.AtLeastOneInterceptorRequired);
1440
+ }
1441
+ const methodInterceptors = Reflect.getMetadata(CoreMetadataKey.Interceptors, target.constructor, method) || [];
1442
+ Reflect.defineMetadata(CoreMetadataKey.Interceptors, [
1443
+ ...validatedInterceptors,
1444
+ ...methodInterceptors
1445
+ ], target.constructor, method);
1446
+ return descriptor;
1447
+ }
1448
+ if (interceptors.length === 0) {
1449
+ throw new Error(ErrorMessage.AtLeastOneInterceptorRequired);
1450
+ }
1451
+ const classInterceptors = Reflect.getMetadata(CoreMetadataKey.Interceptors, target) || [];
1452
+ Reflect.defineMetadata(CoreMetadataKey.Interceptors, [
1453
+ ...validatedInterceptors,
1454
+ ...classInterceptors
1455
+ ], target);
1456
+ return target;
1457
+ };
1458
+ }
1459
+ __name(UseInterceptors, "UseInterceptors");
1460
+
1461
+ // src/decorators/pipeline/use-pipes.decorator.ts
1462
+ function UsePipes(...pipes) {
1463
+ return (target, method, descriptor) => {
1464
+ const validatedPipes = [];
1465
+ for (const pipe of pipes) {
1466
+ const { valid, value, error } = validatePipe(pipe);
1467
+ if (!valid) throw new Error(error);
1468
+ validatedPipes.push(value);
1469
+ }
1470
+ if (!isNil(descriptor) && !isNil(descriptor.value)) {
1471
+ if (pipes.length === 0) {
1472
+ throw new Error(ErrorMessage.AtLeastOnePipeRequired);
1473
+ }
1474
+ const methodPipes = Reflect.getMetadata(CoreMetadataKey.Pipes, target.constructor, method) || [];
1475
+ Reflect.defineMetadata(CoreMetadataKey.Pipes, [
1476
+ ...validatedPipes,
1477
+ ...methodPipes
1478
+ ], target.constructor, method);
1479
+ return descriptor;
1480
+ }
1481
+ if (pipes.length === 0) {
1482
+ throw new Error(ErrorMessage.AtLeastOnePipeRequired);
1483
+ }
1484
+ const classPipes = Reflect.getMetadata(CoreMetadataKey.Pipes, target) || [];
1485
+ Reflect.defineMetadata(CoreMetadataKey.Pipes, [
1486
+ ...validatedPipes,
1487
+ ...classPipes
1488
+ ], target);
1489
+ return target;
1490
+ };
1491
+ }
1492
+ __name(UsePipes, "UsePipes");
1493
+
1494
+ // src/decorators/create-rpc-decorator.ts
1495
+ function createRPCDecorator(type, name, webViewId) {
1496
+ return (target, method) => {
1497
+ if (!isNil(webViewId) && !isString(webViewId) && !isNumber(webViewId)) {
1498
+ throw new Error(ErrorMessage.WebViewIdMustBeStringOrNumber);
1499
+ }
1500
+ if (!isNil(name) && !isString(name)) {
1501
+ throw new Error(ErrorMessage.RPCNameMustBeString);
1502
+ }
1503
+ name = name ?? method;
1504
+ const rpcs = Reflect.getMetadata(CoreMetadataKey.ControllerRPCs, target) ?? [];
1505
+ if (rpcs.some((rpc) => rpc.method === method && rpc.name === name && rpc.type === type)) {
1506
+ throw new Error(ErrorMessage.RPCNameMustBeUnique);
1507
+ }
1508
+ Reflect.defineMetadata(CoreMetadataKey.ControllerRPCs, [
1509
+ ...rpcs,
1510
+ {
1511
+ method,
1512
+ name,
1513
+ type,
1514
+ webViewId
1515
+ }
1516
+ ], target);
1517
+ };
1518
+ }
1519
+ __name(createRPCDecorator, "createRPCDecorator");
1520
+
1521
+ // src/decorators/rpc/on-request.decorator.ts
1522
+ function OnRequest(rpcName) {
1523
+ return createRPCDecorator("onRequest", rpcName);
1524
+ }
1525
+ __name(OnRequest, "OnRequest");
1526
+
1527
+ // src/decorators/rpc/on-webview-request.decorator.ts
1528
+ function OnWebViewRequest(id, rpcName) {
1529
+ return createRPCDecorator("onWebViewRequest", rpcName, id);
1530
+ }
1531
+ __name(OnWebViewRequest, "OnWebViewRequest");
1532
+
1533
+ // src/decorators/create-timer.decorator.ts
1534
+ function createTimerDecorator(type, name, options) {
1535
+ return (target, method) => {
1536
+ if (!isNil(name) && !isString(name)) {
1537
+ throw new Error(ErrorMessage.TimerNameMustBeString);
1538
+ }
1539
+ name = name ?? method;
1540
+ const timers = Reflect.getMetadata(CoreMetadataKey.Timers, target) ?? [];
1541
+ if (timers.some((timer) => timer.method === method && timer.name === name && timer.type === type)) {
1542
+ throw new Error(ErrorMessage.EventNameMustBeUnique);
1543
+ }
1544
+ Reflect.defineMetadata(CoreMetadataKey.Timers, [
1545
+ ...timers,
1546
+ {
1547
+ method,
1548
+ name,
1549
+ type,
1550
+ options
1551
+ }
1552
+ ], target);
1553
+ };
1554
+ }
1555
+ __name(createTimerDecorator, "createTimerDecorator");
1556
+
1557
+ // src/decorators/timers/cron.decorator.ts
1558
+ function Cron(pattern, options = {}) {
1559
+ return createTimerDecorator("cron", options.name, {
1560
+ pattern,
1561
+ ...options
1562
+ });
1563
+ }
1564
+ __name(Cron, "Cron");
1565
+
1566
+ // src/decorators/timers/every-tick.decorator.ts
1567
+ function EveryTick(name) {
1568
+ return createTimerDecorator("everytick", name);
1569
+ }
1570
+ __name(EveryTick, "EveryTick");
1571
+
1572
+ // src/decorators/timers/interval.decorator.ts
1573
+ function Interval(nameOrTimeout, timeout) {
1574
+ const [name, intervalTimeout] = isString(nameOrTimeout) ? [
1575
+ nameOrTimeout,
1576
+ timeout
1577
+ ] : [
1578
+ void 0,
1579
+ nameOrTimeout
1580
+ ];
1581
+ return createTimerDecorator("interval", name, {
1582
+ timeout: intervalTimeout
1583
+ });
1584
+ }
1585
+ __name(Interval, "Interval");
1586
+
1587
+ // src/decorators/timers/timeout.decorator.ts
1588
+ function Timeout(nameOrTimeout, timeout) {
1589
+ const [name, intervalTimeout] = isString(nameOrTimeout) ? [
1590
+ nameOrTimeout,
1591
+ timeout
1592
+ ] : [
1593
+ void 0,
1594
+ nameOrTimeout
1595
+ ];
1596
+ return createTimerDecorator("timeout", name, {
1597
+ timeout: intervalTimeout
1598
+ });
1599
+ }
1600
+ __name(Timeout, "Timeout");
1601
+
1602
+ // src/decorators/apply-decorator.util.ts
1603
+ function applyDecorators(...decorators) {
1604
+ return (target, propertyKey, descriptor) => {
1605
+ for (const decorator of decorators) {
1606
+ if (target instanceof Function && !descriptor) {
1607
+ decorator(target);
1608
+ continue;
1609
+ }
1610
+ decorator(target, propertyKey, descriptor);
1611
+ }
1612
+ };
1613
+ }
1614
+ __name(applyDecorators, "applyDecorators");
1615
+
1616
+ // src/decorators/create-param.util.ts
1617
+ function createParamDecorator(factory) {
1618
+ return (data, ...pipes) => {
1619
+ return (target, method, index) => {
1620
+ const validatedPipes = [];
1621
+ for (const pipe of pipes) {
1622
+ const { valid, value, error } = validatePipe(pipe);
1623
+ if (!valid) throw new Error(error);
1624
+ validatedPipes.push(value);
1625
+ }
1626
+ const params = Reflect.getMetadata(CoreMetadataKey.ControllerParams, target, method) ?? [];
1627
+ if (params.some((param) => param.index === index)) {
1628
+ throw new Error(ErrorMessage.MultipleDecoratorsOnSingleParameterNotAllowed);
1629
+ }
1630
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target, method);
1631
+ const metatype = Array.isArray(paramTypes) ? paramTypes[index] : void 0;
1632
+ Reflect.defineMetadata(CoreMetadataKey.ControllerParams, [
1633
+ ...params,
1634
+ {
1635
+ index,
1636
+ method,
1637
+ pipes: validatedPipes,
1638
+ type: MethodParamType.Custom,
1639
+ factory,
1640
+ data,
1641
+ metatype
1642
+ }
1643
+ ], target, method);
1644
+ };
1645
+ };
1646
+ }
1647
+ __name(createParamDecorator, "createParamDecorator");
1648
+
1649
+ // src/decorators/forward-ref.util.ts
1650
+ import { LazyServiceIdentifer } from "inversify";
1651
+ function forwardRef(fn) {
1652
+ return new LazyServiceIdentifer(fn);
1653
+ }
1654
+ __name(forwardRef, "forwardRef");
1655
+
1656
+ // src/services/reflector.service.ts
1657
+ function _ts_decorate6(decorators, target, key, desc) {
1658
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1659
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1660
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1661
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1662
+ }
1663
+ __name(_ts_decorate6, "_ts_decorate");
1664
+ var ReflectorService = class {
1665
+ static {
1666
+ __name(this, "ReflectorService");
1667
+ }
1668
+ get(metadataKey, target) {
1669
+ return Reflect.getMetadata(metadataKey, target);
1670
+ }
1671
+ getAll(metadataKey, targets) {
1672
+ return (targets || []).map((target) => this.get(metadataKey, target));
1673
+ }
1674
+ getAllAndMerge(metadataKey, targets) {
1675
+ const metadataCollection = this.getAll(metadataKey, targets).filter((item) => item !== void 0);
1676
+ if (isEmpty(metadataCollection)) return metadataCollection;
1677
+ return metadataCollection.reduce((a, b) => {
1678
+ if (Array.isArray(a)) {
1679
+ return a.concat(b);
1680
+ }
1681
+ if (isObject(a) && isObject(b)) {
1682
+ return {
1683
+ ...a,
1684
+ ...b
1685
+ };
1686
+ }
1687
+ return [
1688
+ a,
1689
+ b
1690
+ ];
1691
+ });
1692
+ }
1693
+ getAllAndOverride(metadataKey, targets) {
1694
+ for (const target of targets) {
1695
+ const result = this.get(metadataKey, target);
1696
+ if (result !== void 0) return result;
1697
+ }
1698
+ return void 0;
1699
+ }
1700
+ static createDecorator(options = {}) {
1701
+ const metadataKey = options.key ?? generateRandomId();
1702
+ const decoratorFn = /* @__PURE__ */ __name((metadataValue) => (target, key, descriptor) => {
1703
+ const value = options.transform ? options.transform(metadataValue) : metadataValue;
1704
+ SetMetadata(metadataKey, value ?? {})(target, key, descriptor);
1705
+ }, "decoratorFn");
1706
+ decoratorFn.KEY = metadataKey;
1707
+ return decoratorFn;
1708
+ }
1709
+ };
1710
+ ReflectorService = _ts_decorate6([
1711
+ injectable9()
1712
+ ], ReflectorService);
1713
+
1714
+ // src/services/timer.service.ts
1715
+ import { inject as inject7, injectable as injectable10 } from "inversify";
1716
+ import { Cron as Cron2 } from "croner";
1717
+ function _ts_decorate7(decorators, target, key, desc) {
1718
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1719
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1720
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1721
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1722
+ }
1723
+ __name(_ts_decorate7, "_ts_decorate");
1724
+ function _ts_metadata6(k, v) {
1725
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1726
+ }
1727
+ __name(_ts_metadata6, "_ts_metadata");
1728
+ var TimerService = class {
1729
+ static {
1730
+ __name(this, "TimerService");
1731
+ }
1732
+ multiplayerService;
1733
+ $everyticks = /* @__PURE__ */ new Map();
1734
+ $intervals = /* @__PURE__ */ new Map();
1735
+ $timeouts = /* @__PURE__ */ new Map();
1736
+ $crons = /* @__PURE__ */ new Map();
1737
+ get all() {
1738
+ return this.multiplayerService.Timers.all;
1739
+ }
1740
+ get everyticks() {
1741
+ return [
1742
+ ...this.$everyticks.values()
1743
+ ];
1744
+ }
1745
+ get intervals() {
1746
+ return [
1747
+ ...this.$intervals.values()
1748
+ ];
1749
+ }
1750
+ get timeouts() {
1751
+ return [
1752
+ ...this.$timeouts.values()
1753
+ ];
1754
+ }
1755
+ get crons() {
1756
+ return [
1757
+ ...this.$crons.values()
1758
+ ];
1759
+ }
1760
+ set warningThreshold(value) {
1761
+ this.multiplayerService.Timers.warningThreshold = value;
1762
+ }
1763
+ get warningThreshold() {
1764
+ return this.multiplayerService.Timers.warningThreshold;
1765
+ }
1766
+ set sourceLocationFrameSkipCount(value) {
1767
+ this.multiplayerService.Timers.sourceLocationFrameSkipCount = value;
1768
+ }
1769
+ get sourceLocationFrameSkipCount() {
1770
+ return this.multiplayerService.Timers.sourceLocationFrameSkipCount;
1771
+ }
1772
+ createCronJob(callback, options) {
1773
+ const { pattern, ...cronOptions } = options;
1774
+ const cron = Cron2(pattern, cronOptions, callback);
1775
+ if (isString(options.name)) this.$crons.set(options.name, cron);
1776
+ return cron;
1777
+ }
1778
+ createInterval(callback, interval, name) {
1779
+ const timer = this.multiplayerService.Timers.setInterval(callback, interval);
1780
+ if (isString(name)) this.$intervals.set(name, timer);
1781
+ return timer;
1782
+ }
1783
+ createTimeout(callback, timeout, name) {
1784
+ const timer = this.multiplayerService.Timers.setTimeout(callback, timeout);
1785
+ if (isString(name)) this.$timeouts.set(name, timer);
1786
+ return timer;
1787
+ }
1788
+ createEveryTick(callback, name) {
1789
+ const timer = this.multiplayerService.Timers.everyTick(callback);
1790
+ if (isString(name)) this.$everyticks.set(name, timer);
1791
+ return timer;
1792
+ }
1793
+ delete(type, name) {
1794
+ switch (type) {
1795
+ case "cron":
1796
+ const cronJob = this.$crons.get(name);
1797
+ if (cronJob) {
1798
+ cronJob.stop();
1799
+ this.$crons.delete(name);
1800
+ }
1801
+ break;
1802
+ case "everytick":
1803
+ const everytick = this.$everyticks.get(name);
1804
+ if (everytick) {
1805
+ everytick.destroy();
1806
+ this.$everyticks.delete(name);
1807
+ }
1808
+ break;
1809
+ case "interval":
1810
+ const interval = this.$intervals.get(name);
1811
+ if (interval) {
1812
+ interval.destroy();
1813
+ this.$intervals.delete(name);
1814
+ }
1815
+ break;
1816
+ case "timeout":
1817
+ const timeout = this.$timeouts.get(name);
1818
+ if (timeout) {
1819
+ timeout.destroy();
1820
+ this.$timeouts.delete(name);
1821
+ }
1822
+ break;
1823
+ }
1824
+ }
1825
+ getByName(type, name) {
1826
+ switch (type) {
1827
+ case "cron":
1828
+ return this.$crons.get(name);
1829
+ case "everytick":
1830
+ return this.$everyticks.get(name);
1831
+ case "interval":
1832
+ return this.$intervals.get(name);
1833
+ case "timeout":
1834
+ return this.$timeouts.get(name);
1835
+ }
1836
+ }
1837
+ getById(id) {
1838
+ return this.multiplayerService.Timers.getByID(id);
1839
+ }
1840
+ time(name) {
1841
+ return this.multiplayerService.Timers.time(name);
1842
+ }
1843
+ timeEnd(name) {
1844
+ return this.multiplayerService.Timers.timeEnd(name);
1845
+ }
1846
+ };
1847
+ _ts_decorate7([
1848
+ inject7(MULTIPLAYER_SERVICE),
1849
+ _ts_metadata6("design:type", typeof MultiplayerService === "undefined" ? Object : MultiplayerService)
1850
+ ], TimerService.prototype, "multiplayerService", void 0);
1851
+ TimerService = _ts_decorate7([
1852
+ injectable10()
1853
+ ], TimerService);
1854
+
1855
+ export {
1856
+ Controller2 as Controller,
1857
+ Global,
1858
+ Inject,
1859
+ Injectable,
1860
+ Module2 as Module,
1861
+ Optional,
1862
+ SetMetadata,
1863
+ Catch,
1864
+ UseFilters,
1865
+ AppRuntime,
1866
+ ReflectorService,
1867
+ TimerService,
1868
+ ModuleDependencyBinder,
1869
+ ModuleTreeScanner,
1870
+ RageMPScriptEvent,
1871
+ RageMPEventEmmiter,
1872
+ RageMPTimer,
1873
+ RageMPTimers,
1874
+ RageMPMultiplayerService,
1875
+ App,
1876
+ AppBuilder,
1877
+ createAppBuilder,
1878
+ createEventDecorator,
1879
+ OnInternal,
1880
+ OnWebView,
1881
+ On,
1882
+ OnceInternal,
1883
+ Once,
1884
+ OnceWebView,
1885
+ Body,
1886
+ Index,
1887
+ Request,
1888
+ Req,
1889
+ Param,
1890
+ Response,
1891
+ Res,
1892
+ UseGuards,
1893
+ UseInterceptors,
1894
+ UsePipes,
1895
+ createRPCDecorator,
1896
+ OnRequest,
1897
+ OnWebViewRequest,
1898
+ Cron,
1899
+ EveryTick,
1900
+ Interval,
1901
+ Timeout,
1902
+ applyDecorators,
1903
+ createParamDecorator,
1904
+ forwardRef
1905
+ };
1906
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NlcnZpY2VzL3JlZmxlY3Rvci5zZXJ2aWNlLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvY29udHJvbGxlci5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY29yZS9nbG9iYWwuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvaW5qZWN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL2luamVjdGFibGUuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NvcmUvbW9kdWxlLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL29wdGlvbmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jb3JlL3NldC1tZXRhZGF0YS5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXJyb3JzL2NhdGNoLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9lcnJvcnMvdXNlLWZpbHRlcnMuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9hcHAvbW9kdWxlLXRyZWUvYXBwLXJ1bnRpbWUudHMiLCAiLi4vc3JjL2FwcC9tb2R1bGUtdHJlZS9kZXBlbmRlbmN5LWJpbmRlci50cyIsICIuLi9zcmMvYXBwL21vZHVsZS10cmVlL21vZHVsZS10cmVlLXNjYW5uZXIudHMiLCAiLi4vc3JjL2FwcC9tdWx0aXBsYXllci9yYWdlbXAvcmFnZW1wLXNjcmlwdC1ldmVudC1oYW5kbGVyLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC1ldmVudC1lbW1pdGVyLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC10aW1lci50cyIsICIuLi9zcmMvYXBwL211bHRpcGxheWVyL3JhZ2VtcC9yYWdlbXAtdGltZXJzLnRzIiwgIi4uL3NyYy9hcHAvbXVsdGlwbGF5ZXIvcmFnZW1wL3JhZ2VtcC1tdWx0aXBsYXllci5zZXJ2aWNlLnRzIiwgIi4uL3NyYy9hcHAvYXBwLWJ1aWxkZXIudHMiLCAiLi4vc3JjL2FwcC9hcHAudHMiLCAiLi4vc3JjL2FwcC9jcmVhdGUtYXBwLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uLWludGVybmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ldmVudHMvb24td2Vidmlldy5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ldmVudHMvb25jZS1pbnRlcm5hbC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZXZlbnRzL29uY2UuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2V2ZW50cy9vbmNlLXdlYnZpZXcuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9ib2R5LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9wYXJhbXMvaW5kZXguZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9wYXJhbXMvcGFyYW0uZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3BhcmFtcy9yZXNwb25zZS5kZW9yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtZ3VhcmRzLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtaW50ZXJjZXB0b3JzLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9waXBlbGluZS91c2UtcGlwZXMuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL2NyZWF0ZS1ycGMtZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3JwYy9vbi1yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9ycGMvb24td2Vidmlldy1yZXF1ZXN0LmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy9jcmVhdGUtdGltZXIuZGVjb3JhdG9yLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3RpbWVycy9jcm9uLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy90aW1lcnMvZXZlcnktdGljay5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvdGltZXJzL2ludGVydmFsLmRlY29yYXRvci50cyIsICIuLi9zcmMvZGVjb3JhdG9ycy90aW1lcnMvdGltZW91dC5kZWNvcmF0b3IudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvYXBwbHktZGVjb3JhdG9yLnV0aWwudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvY3JlYXRlLXBhcmFtLnV0aWwudHMiLCAiLi4vc3JjL2RlY29yYXRvcnMvZm9yd2FyZC1yZWYudXRpbC50cyIsICIuLi9zcmMvc2VydmljZXMvdGltZXIuc2VydmljZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBTZXRNZXRhZGF0YSB9IGZyb20gJy4uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVEZWNvcmF0b3JPcHRpb25zLCBDcmVhdGVEZWNvcmF0b3JXaXRoVHJhbnNmb3JtT3B0aW9ucywgUmVmbGVjdGFibGVEZWNvcmF0b3IgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlUmFuZG9tSWQsIGlzRW1wdHksIGlzT2JqZWN0IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVmbGVjdG9yU2VydmljZSB7XG4gICAgcHVibGljIGdldDxUUmVzdWx0ID0gdW5rbm93biwgVEtleSBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCA9IHN0cmluZz4obWV0YWRhdGFLZXk6IFRLZXksIHRhcmdldDogTmV3YWJsZSB8IEZ1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE1ldGFkYXRhPFRSZXN1bHQ+KG1ldGFkYXRhS2V5LCB0YXJnZXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGw8VFJlc3VsdCBleHRlbmRzIHVua25vd25bXSA9IHVua25vd25bXSwgVEtleSBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCA9IHN0cmluZz4oXG4gICAgICAgIG1ldGFkYXRhS2V5OiBUS2V5LFxuICAgICAgICB0YXJnZXRzOiAoTmV3YWJsZSB8IEZ1bmN0aW9uKVtdLFxuICAgICkge1xuICAgICAgICByZXR1cm4gPFRSZXN1bHQ+KHRhcmdldHMgfHwgW10pLm1hcCgodGFyZ2V0KSA9PiB0aGlzLmdldChtZXRhZGF0YUtleSwgdGFyZ2V0KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFsbEFuZE1lcmdlPFRSZXN1bHQgZXh0ZW5kcyB1bmtub3duW10gPSB1bmtub3duW10sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgPSBzdHJpbmc+KFxuICAgICAgICBtZXRhZGF0YUtleTogVEtleSxcbiAgICAgICAgdGFyZ2V0czogKE5ld2FibGUgfCBGdW5jdGlvbilbXSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFDb2xsZWN0aW9uID0gdGhpcy5nZXRBbGw8VFJlc3VsdCwgVEtleT4obWV0YWRhdGFLZXksIHRhcmdldHMpLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICBpZiAoaXNFbXB0eShtZXRhZGF0YUNvbGxlY3Rpb24pKSByZXR1cm4gPFRSZXN1bHQ+bWV0YWRhdGFDb2xsZWN0aW9uO1xuXG4gICAgICAgIHJldHVybiA8VFJlc3VsdD5tZXRhZGF0YUNvbGxlY3Rpb24ucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc09iamVjdChhKSAmJiBpc09iamVjdChiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIC4uLmIsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbYSwgYl07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxBbmRPdmVycmlkZTxUUmVzdWx0ID0gdW5rbm93biwgVEtleSBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCA9IHN0cmluZz4obWV0YWRhdGFLZXk6IFRLZXksIHRhcmdldHM6IChOZXdhYmxlIHwgRnVuY3Rpb24pW10pIHtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXQobWV0YWRhdGFLZXksIHRhcmdldCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHJldHVybiA8VFJlc3VsdD5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZURlY29yYXRvcjxUUGFyYW0+KG9wdGlvbnM/OiBDcmVhdGVEZWNvcmF0b3JPcHRpb25zPFRQYXJhbT4pOiBSZWZsZWN0YWJsZURlY29yYXRvcjxUUGFyYW0+O1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPihcbiAgICAgICAgb3B0aW9uczogQ3JlYXRlRGVjb3JhdG9yV2l0aFRyYW5zZm9ybU9wdGlvbnM8VFBhcmFtLCBUVHJhbnNmb3JtZWQ+LFxuICAgICk6IFJlZmxlY3RhYmxlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPjtcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZURlY29yYXRvcjxUUGFyYW0sIFRUcmFuc2Zvcm1lZCA9IFRQYXJhbT4oXG4gICAgICAgIG9wdGlvbnM6IENyZWF0ZURlY29yYXRvck9wdGlvbnM8VFBhcmFtLCBUVHJhbnNmb3JtZWQ+ID0ge30sXG4gICAgKTogUmVmbGVjdGFibGVEZWNvcmF0b3I8VFBhcmFtLCBUVHJhbnNmb3JtZWQ+IHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFLZXkgPSBvcHRpb25zLmtleSA/PyBnZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvckZuID0gKG1ldGFkYXRhVmFsdWU6IFRQYXJhbSkgPT4gKHRhcmdldDogb2JqZWN0IHwgRnVuY3Rpb24sIGtleT86IHN0cmluZyB8IHN5bWJvbCwgZGVzY3JpcHRvcj86IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnRyYW5zZm9ybSA/IG9wdGlvbnMudHJhbnNmb3JtKG1ldGFkYXRhVmFsdWUpIDogbWV0YWRhdGFWYWx1ZTtcbiAgICAgICAgICAgIFNldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB2YWx1ZSA/PyB7fSkodGFyZ2V0LCBrZXkhLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkZWNvcmF0b3JGbi5LRVkgPSBtZXRhZGF0YUtleTtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvckZuIGFzIFJlZmxlY3RhYmxlRGVjb3JhdG9yPFRQYXJhbSwgVFRyYW5zZm9ybWVkPjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgQ29udHJvbGxlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHZhbGlkYXRlQ29udHJvbGxlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29udHJvbGxlcjxUIGV4dGVuZHMgTmV3YWJsZT4ob3B0aW9ucz86IENvbnRyb2xsZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IFQpID0+IHtcbiAgICAgICAgaWYgKFJlZmxlY3QuaGFzTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXIsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUNvbnRyb2xsZXJPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyLCB2YWx1ZSwgdGFyZ2V0KTtcblxuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZSgpKHRhcmdldCk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gR2xvYmFsPFQgZXh0ZW5kcyBOZXdhYmxlPigpIHtcbiAgICByZXR1cm4gKHRhcmdldDogVCkgPT4ge1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5HbG9iYWxNb2R1bGUsIHRydWUsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlSW5qZWN0aW9uVG9rZW4gfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gSW5qZWN0PFQgPSB1bmtub3duPihrZXk/OiBJbmplY3Rpb25Ub2tlbjxUPikge1xuICAgIHJldHVybiA8UHJvcGVydHlEZWNvcmF0b3IgJiBQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZywgcGFyYW1JbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoIWlzTmlsKGtleSkgJiYgIXZhbGlkYXRlSW5qZWN0aW9uVG9rZW4oa2V5KS52YWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5JbnZhbGlkSW5qZWN0aW9uVG9rZW5TcGVjaWZpZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9rZW4gPSBrZXkgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YTxJbmplY3Rpb25Ub2tlbj4oJ2Rlc2lnbjp0eXBlJywgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuSW5qZWN0aW9uVG9rZW5Ob3RGb3VuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtSW5kZXgpO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgSW5qZWN0YWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBJbmplY3RhYmxlPFQgZXh0ZW5kcyBOZXdhYmxlPihvcHRpb25zPzogSW5qZWN0YWJsZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gKHRhcmdldDogVCkgPT4ge1xuICAgICAgICBpZiAoUmVmbGVjdC5oYXNNZXRhZGF0YShDb3JlTWV0YWRhdGFLZXkuSW5qZWN0YWJsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5JbmplY3RhYmxlLCB2YWx1ZSwgdGFyZ2V0KTtcblxuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZSgpKHRhcmdldCk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlTW9kdWxlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gTW9kdWxlPFQgZXh0ZW5kcyBOZXdhYmxlPihvcHRpb25zPzogTW9kdWxlT3B0aW9ucykge1xuICAgIHJldHVybiAodGFyZ2V0OiBUKSA9PiB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Nb2R1bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRHVwbGljYXRlRGVjb3JhdG9yVXNhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZU1vZHVsZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvciEpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5Nb2R1bGUsIHZhbHVlLCB0YXJnZXQpO1xuXG4gICAgICAgIHJldHVybiBpbmplY3RhYmxlKCkodGFyZ2V0KTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IG9wdGlvbmFsIH0gZnJvbSAnaW52ZXJzaWZ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIE9wdGlvbmFsKCkge1xuICAgIHJldHVybiA8UHJvcGVydHlEZWNvcmF0b3IgJiBQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZywgcGFyYW1JbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gb3B0aW9uYWwoKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbUluZGV4KTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEN1c3RvbURlY29yYXRvciB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFNldE1ldGFkYXRhPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFYgPSB1bmtub3duPihrZXk6IEssIHZhbHVlOiBWKSB7XG4gICAgY29uc3QgZGVjb3JhdG9yRmFjdG9yeSA9IDxDdXN0b21EZWNvcmF0b3I+KCh0YXJnZXQ6IG9iamVjdCwgX21ldGhvZD86IHN0cmluZywgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShrZXksIHZhbHVlLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoa2V5LCB2YWx1ZSwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbiAgICBkZWNvcmF0b3JGYWN0b3J5LktFWSA9IGtleTtcbiAgICByZXR1cm4gZGVjb3JhdG9yRmFjdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ2F0Y2g8VCBleHRlbmRzIE5ld2FibGU+KC4uLmV4Y2VwdGlvbnM6IHVua25vd25bXSkge1xuICAgIHJldHVybiAodGFyZ2V0OiBUKSA9PiB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKENvcmVNZXRhZGF0YUtleS5DYXRjaCwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVEZWNvcmF0b3JVc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gZXhjZXB0aW9ucy5maWx0ZXIoKGV4Y2VwdGlvbiwgaW5kZXgpID0+IGV4Y2VwdGlvbnMuaW5kZXhPZihleGNlcHRpb24pICE9PSBpbmRleCk7XG4gICAgICAgIGlmIChkdXBsaWNhdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5FeGNlcHRpb25IYW5kbGluZ0NvbmZsaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkNhdGNoLCBleGNlcHRpb25zLCB0YXJnZXQpO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRmlsdGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVFcnJvckZpbHRlciB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRmlsdGVycyguLi5maWx0ZXJzOiAoTmV3YWJsZTxFcnJvckZpbHRlcj4gfCBFcnJvckZpbHRlcilbXSkge1xuICAgIHJldHVybiA8Q2xhc3NEZWNvcmF0b3IgJiBNZXRob2REZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kPzogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZpbHRlcnM6IChOZXdhYmxlPEVycm9yRmlsdGVyPiB8IEVycm9yRmlsdGVyKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVFcnJvckZpbHRlcihmaWx0ZXIpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZEZpbHRlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmlsKGRlc2NyaXB0b3IpICYmICFpc05pbChkZXNjcmlwdG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGZpbHRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lRmlsdGVyUmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXRob2RGaWx0ZXJzID1cbiAgICAgICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8RXJyb3JGaWx0ZXI+W10+KENvcmVNZXRhZGF0YUtleS5FcnJvckZpbHRlcnMsIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKSB8fCBbXTtcbiAgICAgICAgICAgIGlmICghaXNOaWwobWV0aG9kRmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5EdXBsaWNhdGVFcnJvckZpbHRlckRldGVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkVycm9yRmlsdGVycywgWy4uLnZhbGlkYXRlZEZpbHRlcnMsIC4uLm1ldGhvZEZpbHRlcnNdLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCk7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lRmlsdGVyUmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NGaWx0ZXJzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPEVycm9yRmlsdGVyPltdPihDb3JlTWV0YWRhdGFLZXkuRXJyb3JGaWx0ZXJzLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBpZiAoIWlzTmlsKGNsYXNzRmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKSkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkR1cGxpY2F0ZUVycm9yRmlsdGVyRGV0ZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5LkVycm9yRmlsdGVycywgWy4uLnZhbGlkYXRlZEZpbHRlcnMsIC4uLmNsYXNzRmlsdGVyc10sIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXNOaWwsIGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRU5BQkxFX1NIVVRET1dOX0hPT0tTLCBHTE9CQUxfRVJST1JfRklMVEVSUywgR0xPQkFMX0dVQVJEUywgR0xPQkFMX0lOVEVSQ0VQVE9SUywgR0xPQkFMX1BJUEVTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgRXJyb3JGaWx0ZXIsIEd1YXJkLCBJbnRlcmNlcHRvciB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSwgb3B0aW9uYWwgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgQ29udHJvbGxlckV2ZW50SGFuZGxlciwgQ29udHJvbGxlclJQQ0hhbmRsZXIgfSBmcm9tICcuLi9jb250cm9sbGVyJztcbmltcG9ydCB7IExPR0dFUl9TRVJWSUNFLCBUSU1FUl9TRVJWSUNFIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTG9nZ2VyU2VydmljZSwgUGlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBUcmVlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBUaW1lclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcHBSdW50aW1lIHtcbiAgICBAaW5qZWN0KENvbnRyb2xsZXJFdmVudEhhbmRsZXIpIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyOiBDb250cm9sbGVyRXZlbnRIYW5kbGVyO1xuICAgIEBpbmplY3QoQ29udHJvbGxlclJQQ0hhbmRsZXIpIHByaXZhdGUgcmVhZG9ubHkgcnBjSGFuZGxlcjogQ29udHJvbGxlclJQQ0hhbmRsZXI7XG4gICAgQGluamVjdChHTE9CQUxfR1VBUkRTKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEd1YXJkczogKE5ld2FibGU8R3VhcmQ+IHwgR3VhcmQpW107XG4gICAgQGluamVjdChHTE9CQUxfSU5URVJDRVBUT1JTKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEludGVyY2VwdG9yczogKE5ld2FibGU8SW50ZXJjZXB0b3I+IHwgSW50ZXJjZXB0b3IpW107XG4gICAgQGluamVjdChHTE9CQUxfUElQRVMpIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXTtcbiAgICBAaW5qZWN0KEdMT0JBTF9FUlJPUl9GSUxURVJTKSBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEVycm9yRmlsdGVyczogKE5ld2FibGU8RXJyb3JGaWx0ZXI+IHwgRXJyb3JGaWx0ZXIpW107XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuICAgIEBpbmplY3QoRU5BQkxFX1NIVVRET1dOX0hPT0tTKSBAb3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZVNodXRkb3duSG9va3M6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdChyZXNvbHZlZFRyZWU6IFRyZWU8TW9kdWxlPikge1xuICAgICAgICBhd2FpdCByZXNvbHZlZFRyZWUuYXN5bmNUcmF2ZXJzZShhc3luYyAobm9kZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbW9kdWxlLCBjb250cm9sbGVycyBhbmQgcHJvdmlkZXJzLlxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIG1vZHVsZS5pbnN0YW5jZSA9IG1vZHVsZS5jb250YWluZXIuZ2V0PHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfT4obW9kdWxlLm1ldGFkYXRhLmNsYXNzUmVmKTtcbiAgICAgICAgICAgIG1vZHVsZS5jb250cm9sbGVycy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChjb250cm9sbGVyKSA9PiAoY29udHJvbGxlci5pbnN0YW5jZSA9IG1vZHVsZS5jb250YWluZXIuZ2V0PHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfT4oY29udHJvbGxlci5tZXRhZGF0YS5jbGFzc1JlZikpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFsuLi5tb2R1bGUubWV0YWRhdGEuaW50ZXJuYWxQcm92aWRlcnMsIC4uLm1vZHVsZS5tZXRhZGF0YS5leHRlcm5hbFByb3ZpZGVyc10uZm9yRWFjaCgoW3Rva2VuXSkgPT5cbiAgICAgICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLmdldDxhbnk+KHRva2VuKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIExvZyBtb2R1bGUgbG9hZGVkLlxuICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhgfmx3fk1vZHVsZSB+bGJ+JHttb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gfmx3fmxvYWRlZCB+bGt+KCR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcylgKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuTGlmZWN5Y2xlTWV0aG9kKG1vZHVsZSwgJ29uTW9kdWxlSW5pdCcpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2RzKHJlc29sdmVkVHJlZSwgJ29uTW9kdWxlSW5pdCcpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1bkxpZmVjeWNsZU1ldGhvZHMocmVzb2x2ZWRUcmVlLCAnb25BcHBCb290c3RyYXAnKTtcblxuICAgICAgICAvLyBSZWdpc3RlciBldmVudCBhbmQgcnBjIGxpc3RlbmVycy5cbiAgICAgICAgcmVzb2x2ZWRUcmVlLnRyYXZlcnNlKChub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgbW9kdWxlLmNvbnRyb2xsZXJzLmZvckVhY2goKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGltZXJzKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYH5sd35Db250cm9sbGVyIH5sY34ke2NvbnRyb2xsZXIubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gfmx3fnRpbWVycyBhbmQgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgfmxrfigke0RhdGUubm93KCkgLSB0aW1lfW1zKWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ocmVzb2x2ZWRUcmVlOiBUcmVlPE1vZHVsZT4pIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2h1dGRvd25Ib29rcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2RzKHJlc29sdmVkVHJlZSwgJ29uTW9kdWxlRGVzdHJveScpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2RzKHJlc29sdmVkVHJlZSwgJ2JlZm9yZUFwcFNodXRkb3duJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCByZXNvbHZlZFRyZWUuYXN5bmNUcmF2ZXJzZShhc3luYyAobm9kZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIG1vZHVsZS5jb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXJTZXJ2aWNlID0gY29udHJvbGxlci5vd25lci5jb250YWluZXIuZ2V0PFRpbWVyU2VydmljZT4oVElNRVJfU0VSVklDRSk7XG5cbiAgICAgICAgICAgICAgICAvLyBEZXN0cm95IGFsbCB0aW1lcnMuXG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmV2ZXJ5dGlja3MuZm9yRWFjaCgodGltZXIpID0+IHRpbWVyLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmludGVydmFscy5mb3JFYWNoKCh0aW1lcikgPT4gdGltZXIuZGVzdHJveSgpKTtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UudGltZW91dHMuZm9yRWFjaCgodGltZXIpID0+IHRpbWVyLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmNyb25zLmZvckVhY2goKGNyb24pID0+IGNyb24uc3RvcCgpKTtcblxuICAgICAgICAgICAgICAgIC8vIERlc3Ryb3kgYWxsIHNjcmlwdCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmV2ZW50SGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlci5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucnBjSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlci5kZXN0cm95KCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIC8vIERlc3Ryb3kgYWxsIHRpbWVycy5cbiAgICAgICAgLy8gdGhpcy50aW1lclNlcnZpY2UuZXZlcnl0aWNrcy5mb3JFYWNoKCh0aW1lcikgPT4gdGltZXIuZGVzdHJveSgpKTtcbiAgICAgICAgLy8gdGhpcy50aW1lclNlcnZpY2UuaW50ZXJ2YWxzLmZvckVhY2goKHRpbWVyKSA9PiB0aW1lci5kZXN0cm95KCkpO1xuICAgICAgICAvLyB0aGlzLnRpbWVyU2VydmljZS50aW1lb3V0cy5mb3JFYWNoKCh0aW1lcikgPT4gdGltZXIuZGVzdHJveSgpKTtcbiAgICAgICAgLy8gdGhpcy50aW1lclNlcnZpY2UuY3JvbkpvYnMuZm9yRWFjaCgoY3JvbkpvYikgPT4gY3JvbkpvYi5zdG9wKCkpO1xuXG4gICAgICAgIC8vIC8vIERlc3Ryb3kgYWxsIHNjcmlwdCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgLy8gdGhpcy5ldmVudFNlcnZpY2UuJGxvY2FsSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlci5kZXN0cm95KCkpO1xuICAgICAgICAvLyB0aGlzLmV2ZW50U2VydmljZS4kaW50ZXJuYWxIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyLmRlc3Ryb3koKSk7XG4gICAgICAgIC8vIHRoaXMuZXZlbnRTZXJ2aWNlLiRyZW1vdGVIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyLmRlc3Ryb3koKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2h1dGRvd25Ib29rcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2RzKHJlc29sdmVkVHJlZSwgJ29uQXBwU2h1dGRvd24nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJMaXN0ZW5lcnMoY29udHJvbGxlcjogQ29udHJvbGxlcikge1xuICAgICAgICBjb25zdCBtb2R1bGUgPSBjb250cm9sbGVyLm93bmVyO1xuICAgICAgICBjb250cm9sbGVyLm1ldGFkYXRhLmV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3VhcmRzID0gWy4uLnRoaXMuZ2xvYmFsR3VhcmRzLCAuLi5tb2R1bGUubWV0YWRhdGEuZ3VhcmRzLCAuLi5jb250cm9sbGVyLm1ldGFkYXRhLmd1YXJkcywgLi4uZXZlbnQuZ3VhcmRzXTtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdsb2JhbEludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgICAuLi5tb2R1bGUubWV0YWRhdGEuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIC4uLmV2ZW50LmludGVyY2VwdG9ycyxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjb25zdCBwaXBlcyA9IFsuLi50aGlzLmdsb2JhbFBpcGVzLCAuLi5tb2R1bGUubWV0YWRhdGEucGlwZXMsIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEucGlwZXMsIC4uLmV2ZW50LnBpcGVzXTtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZEVycm9yRmlsdGVycyA9IHRoaXMubWFwRXJyb3JGaWx0ZXJzKFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdsb2JhbEVycm9yRmlsdGVycyxcbiAgICAgICAgICAgICAgICAuLi5tb2R1bGUubWV0YWRhdGEuZXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEuZXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIC4uLmV2ZW50LmVycm9yRmlsdGVycyxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5ldmVudEhhbmRsZXIucmVnaXN0ZXJFdmVudChndWFyZHMsIGludGVyY2VwdG9ycywgcGlwZXMsIG1hcHBlZEVycm9yRmlsdGVycywgY29udHJvbGxlciwgZXZlbnQpO1xuICAgICAgICAgICAgY29udHJvbGxlci5ldmVudEhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRyb2xsZXIubWV0YWRhdGEucnBjcy5mb3JFYWNoKGFzeW5jIChycGMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGd1YXJkcyA9IFsuLi50aGlzLmdsb2JhbEd1YXJkcywgLi4ubW9kdWxlLm1ldGFkYXRhLmd1YXJkcywgLi4uY29udHJvbGxlci5tZXRhZGF0YS5ndWFyZHMsIC4uLnJwYy5ndWFyZHNdO1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3JzID0gW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2xvYmFsSW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAgIC4uLm1vZHVsZS5tZXRhZGF0YS5pbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbGxlci5tZXRhZGF0YS5pbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICAgLi4ucnBjLmludGVyY2VwdG9ycyxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjb25zdCBwaXBlcyA9IFsuLi50aGlzLmdsb2JhbFBpcGVzLCAuLi5tb2R1bGUubWV0YWRhdGEucGlwZXMsIC4uLmNvbnRyb2xsZXIubWV0YWRhdGEucGlwZXMsIC4uLnJwYy5waXBlc107XG4gICAgICAgICAgICBjb25zdCBtYXBwZWRFcnJvckZpbHRlcnMgPSB0aGlzLm1hcEVycm9yRmlsdGVycyhbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nbG9iYWxFcnJvckZpbHRlcnMsXG4gICAgICAgICAgICAgICAgLi4ubW9kdWxlLm1ldGFkYXRhLmVycm9yRmlsdGVycyxcbiAgICAgICAgICAgICAgICAuLi5jb250cm9sbGVyLm1ldGFkYXRhLmVycm9yRmlsdGVycyxcbiAgICAgICAgICAgICAgICAuLi5ycGMuZXJyb3JGaWx0ZXJzLFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLnJwY0hhbmRsZXIucmVnaXN0ZXJSUEMoZ3VhcmRzLCBpbnRlcmNlcHRvcnMsIHBpcGVzLCBtYXBwZWRFcnJvckZpbHRlcnMsIGNvbnRyb2xsZXIsIHJwYyk7XG4gICAgICAgICAgICBjb250cm9sbGVyLnJwY0hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclRpbWVycyhjb250cm9sbGVyOiBDb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHRpbWVyU2VydmljZSA9IGNvbnRyb2xsZXIub3duZXIuY29udGFpbmVyLmdldDxUaW1lclNlcnZpY2U+KFRJTUVSX1NFUlZJQ0UpO1xuXG4gICAgICAgIGNvbnRyb2xsZXIubWV0YWRhdGEudGltZXJzLmZvckVhY2goKHRpbWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAodGltZXIudHlwZSA9PT0gJ2Nyb24nKSB7XG4gICAgICAgICAgICAgICAgdGltZXJTZXJ2aWNlLmNyZWF0ZUNyb25Kb2IoY29udHJvbGxlci5pbnN0YW5jZVt0aW1lci5tZXRob2RdIS5iaW5kKGNvbnRyb2xsZXIuaW5zdGFuY2UpLCB0aW1lci5vcHRpb25zKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXIudHlwZSA9PT0gJ2V2ZXJ5dGljaycpIHtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UuY3JlYXRlRXZlcnlUaWNrKGNvbnRyb2xsZXIuaW5zdGFuY2VbdGltZXIubWV0aG9kXSEuYmluZChjb250cm9sbGVyLmluc3RhbmNlKSwgdGltZXIubmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVyLnR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgICAgICAgICAgICB0aW1lclNlcnZpY2UuY3JlYXRlSW50ZXJ2YWwoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuaW5zdGFuY2VbdGltZXIubWV0aG9kXSEuYmluZChjb250cm9sbGVyLmluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgdGltZXIub3B0aW9ucy50aW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICB0aW1lci5uYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVyLnR5cGUgPT09ICd0aW1lb3V0Jykge1xuICAgICAgICAgICAgICAgIHRpbWVyU2VydmljZS5jcmVhdGVUaW1lb3V0KGNvbnRyb2xsZXIuaW5zdGFuY2VbdGltZXIubWV0aG9kXSEuYmluZChjb250cm9sbGVyLmluc3RhbmNlKSwgdGltZXIub3B0aW9ucy50aW1lb3V0LCB0aW1lci5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBFcnJvckZpbHRlcnMoZXJyb3JGaWx0ZXJzOiAoTmV3YWJsZTxFcnJvckZpbHRlcj4gfCBFcnJvckZpbHRlcilbXSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJNYXA6IFt1bmtub3duIHwgJ01BTkdPX0FOWV9FUlJPUicsIE5ld2FibGU8RXJyb3JGaWx0ZXI+IHwgRXJyb3JGaWx0ZXJdW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBlcnJvckZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8YW55W10+KENvcmVNZXRhZGF0YUtleS5DYXRjaCwgZmlsdGVyKSA/PyBbXTtcbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goJ01BTkdPX0FOWV9FUlJPUicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmlsKGZpbHRlck1hcC5maW5kKChmaWx0ZXJFcnJvcikgPT4gZmlsdGVyRXJyb3JbMF0gPT09IGVycm9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gbWFwIGVycm9yIGZpbHRlcnMuJyk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRXJyb3JBbHJlYWR5SGFuZGxlZEJ5RmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmlsdGVyTWFwLnB1c2goW2Vycm9yLCBmaWx0ZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJNYXA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5MaWZlY3ljbGVNZXRob2RzKFxuICAgICAgICByZXNvbHZlZFRyZWU6IFRyZWU8TW9kdWxlPixcbiAgICAgICAgbWV0aG9kOiAnb25Nb2R1bGVJbml0JyB8ICdvbk1vZHVsZURlc3Ryb3knIHwgJ29uQXBwQm9vdHN0cmFwJyB8ICdiZWZvcmVBcHBTaHV0ZG93bicgfCAnb25BcHBTaHV0ZG93bicsXG4gICAgKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFRyZWUuYXN5bmNUcmF2ZXJzZShhc3luYyAobm9kZSkgPT4gYXdhaXQgdGhpcy5ydW5MaWZlY3ljbGVNZXRob2Qobm9kZS52YWx1ZSwgbWV0aG9kKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5MaWZlY3ljbGVNZXRob2QoXG4gICAgICAgIG1vZHVsZTogTW9kdWxlLFxuICAgICAgICBtZXRob2Q6ICdvbk1vZHVsZUluaXQnIHwgJ29uTW9kdWxlRGVzdHJveScgfCAnb25BcHBCb290c3RyYXAnIHwgJ2JlZm9yZUFwcFNodXRkb3duJyB8ICdvbkFwcFNodXRkb3duJyxcbiAgICApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBtb2R1bGUuY29udHJvbGxlcnMubWFwKGFzeW5jIChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc09iamVjdChjb250cm9sbGVyLmluc3RhbmNlKSB8fCBpc05pbChjb250cm9sbGVyLmluc3RhbmNlW21ldGhvZF0pKSByZXR1cm47XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbGxlci5pbnN0YW5jZVttZXRob2RdISgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgWy4uLm1vZHVsZS5tZXRhZGF0YS5pbnRlcm5hbFByb3ZpZGVycywgLi4ubW9kdWxlLm1ldGFkYXRhLmV4dGVybmFsUHJvdmlkZXJzXS5tYXAoYXN5bmMgKFt0b2tlbl0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm92aWRlckluc3RhbmNlID0gPHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfT5tb2R1bGUuY29udGFpbmVyLmdldCh0b2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKCFpc09iamVjdChwcm92aWRlckluc3RhbmNlKSB8fCBpc05pbChwcm92aWRlckluc3RhbmNlW21ldGhvZF0pKSByZXR1cm47XG4gICAgICAgICAgICAgICAgYXdhaXQgcHJvdmlkZXJJbnN0YW5jZVttZXRob2RdISgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaXNPYmplY3QobW9kdWxlLmluc3RhbmNlKSB8fCBpc05pbChtb2R1bGUuaW5zdGFuY2VbbWV0aG9kXSkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgbW9kdWxlLmluc3RhbmNlW21ldGhvZF0hKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTG9nZ2VyU2VydmljZSwgUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ09OVEFJTkVSX09QVElPTlMsIEdMT0JBTF9BUFBfQ09OVEFJTkVSIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE1vZHVsZSwgTW9kdWxlQ29udGFpbmVyIH0gZnJvbSAnLi4vbW9kdWxlJztcbmltcG9ydCB7IENvbnRhaW5lciwgaW5qZWN0LCBpbmplY3RhYmxlLCBvcHRpb25hbCwgdHlwZSBpbnRlcmZhY2VzIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IExPR0dFUl9TRVJWSUNFLCBNT0RVTEVfQ09OVEFJTkVSLCBUSU1FUl9TRVJWSUNFIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgVHJlZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vZHVsZURlcGVuZGVuY3lCaW5kZXIge1xuICAgIEBpbmplY3QoR0xPQkFMX0FQUF9DT05UQUlORVIpIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsQXBwQ29udGFpbmVyOiBDb250YWluZXI7XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuICAgIEBvcHRpb25hbCgpIEBpbmplY3QoQ09OVEFJTkVSX09QVElPTlMpIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyT3B0aW9ucz86IGludGVyZmFjZXMuQ29udGFpbmVyT3B0aW9ucztcblxuICAgIHB1YmxpYyBhc3luYyBiaW5kKHJlc29sdmVkVHJlZTogVHJlZTxNb2R1bGU+KSB7XG4gICAgICAgIGF3YWl0IHJlc29sdmVkVHJlZS5hc3luY1RyYXZlcnNlKGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgbW9kdWxlLmNvbnRhaW5lciA9IG5ldyBNb2R1bGVDb250YWluZXIobW9kdWxlLm1ldGFkYXRhLmNvbnRhaW5lciA/PyB0aGlzLmNvbnRhaW5lck9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gQXR0YWNoIHRoZSBnbG9iYWwgY29udGFpbmVyIHRvIHRoZSBtb2R1bGUgY29udGFpbmVyLCBzbyBpdCBjYW4gYmUgdXNlZCB0byByZXNvbHZlIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgIG1vZHVsZS5jb250YWluZXIucGFyZW50ID0gdGhpcy5nbG9iYWxBcHBDb250YWluZXI7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbEFwcENvbnRhaW5lci5iaW5kKG1vZHVsZS5tZXRhZGF0YS5jbGFzc1JlZikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbW9kdWxlIGlzIGdsb2JhbCwgd2Ugd2FudCB0byBiaW5kIGl0IHRvIHRoZSBnbG9iYWwgY29udGFpbmVyLlxuICAgICAgICAgICAgaWYgKG1vZHVsZS5tZXRhZGF0YS5nbG9iYWwpIHtcbiAgICAgICAgICAgICAgICAvLyBCaW5kIGV4dGVybmFsIHByb3ZpZGVycyB0byB0aGUgZ2xvYmFsIGNvbnRhaW5lciwgc28gdGhleSBjYW4gYmUgaW5qZWN0ZWQgaW4gb3RoZXIgbW9kdWxlcy5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBwcm92aWRlcl0gb2YgbW9kdWxlLm1ldGFkYXRhLmV4dGVybmFsUHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFByb3ZpZGVyKHByb3ZpZGVyLCB0aGlzLmdsb2JhbEFwcENvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbW9kdWxlIGlzIG5vdCBnbG9iYWwsIHdlIHdhbnQgdG8gYmluZCBpdCB0byBpdHMgb3duIGNvbnRhaW5lci5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0b2tlbiwgcHJvdmlkZXJdIG9mIG1vZHVsZS5tZXRhZGF0YS5leHRlcm5hbFByb3ZpZGVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRQcm92aWRlcihwcm92aWRlciwgbW9kdWxlLmNvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5wYXJlbnQ/LmNvbnRhaW5lci5iaW5kKHRva2VuKS50b0R5bmFtaWNWYWx1ZSgoKSA9PiBtb2R1bGUuY29udGFpbmVyLmdldCh0b2tlbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGltcG9ydE1vZHVsZSBvZiBtb2R1bGUucmVwZXRpdGl2ZUltcG9ydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbdG9rZW5dIG9mIGltcG9ydE1vZHVsZS5tZXRhZGF0YS5leHRlcm5hbFByb3ZpZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmNvbnRhaW5lci5iaW5kKHRva2VuKS50b0R5bmFtaWNWYWx1ZSgoKSA9PiBpbXBvcnRNb2R1bGUuY29udGFpbmVyLmdldCh0b2tlbikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCaW5kIGludGVybmFsIHByb3ZpZGVycy5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW18sIHByb3ZpZGVyXSBvZiBtb2R1bGUubWV0YWRhdGEuaW50ZXJuYWxQcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRQcm92aWRlcihwcm92aWRlciwgbW9kdWxlLmNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJpbmQgY29udGFpbmVyIHRvIGl0c2VsZiBzbyBpdCBjYW4gYmUgaW5qZWN0ZWQuXG4gICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLmJpbmQoTU9EVUxFX0NPTlRBSU5FUikudG9Db25zdGFudFZhbHVlKG1vZHVsZS5jb250YWluZXIpO1xuXG4gICAgICAgICAgICAvLyBCaW5kIGNvbnRyb2xsZXJzIHRvIHRoZSBjb250YWluZXIuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNsYXNzUmVmIG9mIG1vZHVsZS5tZXRhZGF0YS5jb250cm9sbGVycykge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5jb250YWluZXIuYmluZChjbGFzc1JlZikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCaW5kIHNlcnZpY2VzIHRvIHRoZSBjb250YWluZXIuXG4gICAgICAgICAgICBtb2R1bGUuY29udGFpbmVyLmJpbmQoVElNRVJfU0VSVklDRSkudG8oVGltZXJTZXJ2aWNlKS5pblNpbmdsZXRvblNjb3BlKCk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coXG4gICAgICAgICAgICAgICAgYH5sd35Nb2R1bGUgfmxifiR7bW9kdWxlLm1ldGFkYXRhLmNsYXNzUmVmLm5hbWV9IH5sd35kZXBlbmRlbmNpZXMgYmluZGVkIH5sa34oJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRQcm92aWRlcihwcm92aWRlcjogRXhjbHVkZTxQcm92aWRlciwgTmV3YWJsZT4sIGNvbnRhaW5lcjogQ29udGFpbmVyKSB7XG4gICAgICAgIGlmICgndXNlVmFsdWUnIGluIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb250YWluZXIuYmluZChwcm92aWRlci5wcm92aWRlKS50b0NvbnN0YW50VmFsdWUocHJvdmlkZXIudXNlVmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKCd1c2VGYWN0b3J5JyBpbiBwcm92aWRlcikge1xuICAgICAgICAgICAgY29uc3QgYmluZGluZyA9IGNvbnRhaW5lci5iaW5kKHByb3ZpZGVyLnByb3ZpZGUpLnRvRHluYW1pY1ZhbHVlKChjdHgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBzID1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuaW5qZWN0Py5tYXAoKGRlcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGRlcCkgJiYgJ3Rva2VuJyBpbiBkZXAgJiYgJ29wdGlvbmFsJyBpbiBkZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmNvbnRhaW5lci5nZXQoZGVwLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcC5vcHRpb25hbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVzb2x2ZSBhIGRlcGVuZGVuY3kuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmNvbnRhaW5lci5nZXQoZGVwKTtcbiAgICAgICAgICAgICAgICAgICAgfSkgPz8gW107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLnVzZUZhY3RvcnkoLi4uZGVwcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlci5zY29wZSA9PT0gJ3RyYW5zaWVudCcpIGJpbmRpbmcuaW5UcmFuc2llbnRTY29wZSgpO1xuICAgICAgICAgICAgZWxzZSBpZiAocHJvdmlkZXIuc2NvcGUgPT09ICdyZXF1ZXN0JykgYmluZGluZy5pblJlcXVlc3RTY29wZSgpO1xuICAgICAgICAgICAgZWxzZSBiaW5kaW5nLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICgndXNlQ2xhc3MnIGluIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gY29udGFpbmVyLmJpbmQocHJvdmlkZXIucHJvdmlkZSkudG8ocHJvdmlkZXIudXNlQ2xhc3MpO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVyLnNjb3BlID09PSAndHJhbnNpZW50JykgYmluZGluZy5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlci5zY29wZSA9PT0gJ3JlcXVlc3QnKSBiaW5kaW5nLmluUmVxdWVzdFNjb3BlKCk7XG4gICAgICAgICAgICBlbHNlIGJpbmRpbmcuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCd1c2VFeGlzdGluZycgaW4gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5iaW5kKHByb3ZpZGVyLnByb3ZpZGUpLnRvU2VydmljZShwcm92aWRlci51c2VFeGlzdGluZyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEeW5hbWljTW9kdWxlLCBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDb250cm9sbGVyLCBDb250cm9sbGVyTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuLi9jb250cm9sbGVyJztcbmltcG9ydCB7IE1vZHVsZSwgTW9kdWxlTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuLi9tb2R1bGUnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IFRyZWUsIFRyZWVOb2RlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgTE9HR0VSX1NFUlZJQ0UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVNZXRhZGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2R1bGVUcmVlU2Nhbm5lciB7XG4gICAgQGluamVjdChNb2R1bGVNZXRhZGF0YVJlYWRlcikgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVNZXRhZGF0YVJlYWRlcjogTW9kdWxlTWV0YWRhdGFSZWFkZXI7XG4gICAgQGluamVjdChDb250cm9sbGVyTWV0YWRhdGFSZWFkZXIpIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbGxlck1ldGFkYXRhUmVhZGVyOiBDb250cm9sbGVyTWV0YWRhdGFSZWFkZXI7XG4gICAgQGluamVjdChMT0dHRVJfU0VSVklDRSkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xuXG4gICAgcHVibGljIGFzeW5jIHNjYW4oY2xhc3NSZWY6IE5ld2FibGUgfCBEeW5hbWljTW9kdWxlIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPikge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBSZWFkIG1vZHVsZSBtZXRhZGF0YVxuICAgICAgICBjb25zdCBtb2R1bGVNZXRhZGF0YSA9IGF3YWl0IHRoaXMubW9kdWxlTWV0YWRhdGFSZWFkZXIucmVhZChjbGFzc1JlZik7XG4gICAgICAgIC8vIENyZWF0ZSBtb2R1bGUgaW5zdGFuY2UgYW5kIHNldCBtZXRhZGF0YSB0byBpdFxuICAgICAgICBjb25zdCBtb2R1bGUgPSBuZXcgTW9kdWxlKCk7XG4gICAgICAgIG1vZHVsZS5tZXRhZGF0YSA9IG1vZHVsZU1ldGFkYXRhO1xuICAgICAgICAvLyBMb2cgbW9kdWxlIGluZm9cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhgfmx3fk1vZHVsZSB+bGJ+JHttb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gfmx3fnNjYW5uZWQgfmxrfigke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXMpYCk7XG4gICAgICAgIC8vIFNjYW4gY29udHJvbGxlcnMgaW4gbW9kdWxlXG4gICAgICAgIGF3YWl0IHRoaXMuc2NhbkNvbnRyb2xsZXJzKG1vZHVsZSk7XG4gICAgICAgIC8vIFNjYW4gY29udHJvbGxlcnMgaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZVRyZWUgPSBuZXcgVHJlZShtb2R1bGUpO1xuICAgICAgICBjb25zdCBzY2FubmVkTW9kdWxlcyA9IG5ldyBNYXA8TmV3YWJsZSB8IER5bmFtaWNNb2R1bGUgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+LCBNb2R1bGU+KCk7XG4gICAgICAgIHNjYW5uZWRNb2R1bGVzLnNldChjbGFzc1JlZiwgbW9kdWxlKTtcbiAgICAgICAgLy8gU2NhbiBpbXBvcnRlZCBtb2R1bGVzXG4gICAgICAgIGZvciAoY29uc3QgaW1wb3J0ZWRNb2R1bGUgb2YgbW9kdWxlTWV0YWRhdGEuaW1wb3J0cykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY2FuTW9kdWxlcyhtb2R1bGVUcmVlLnJvb3QsIGltcG9ydGVkTW9kdWxlLCBzY2FubmVkTW9kdWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZVRyZWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzY2FuTW9kdWxlcyhcbiAgICAgICAgcGFyZW50Tm9kZTogVHJlZU5vZGU8TW9kdWxlPixcbiAgICAgICAgY2xhc3NSZWY6IE5ld2FibGUgfCBEeW5hbWljTW9kdWxlIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPixcbiAgICAgICAgc2Nhbm5lZE1vZHVsZXMgPSBuZXcgTWFwPE5ld2FibGUgfCBEeW5hbWljTW9kdWxlIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPiwgTW9kdWxlPigpLFxuICAgICkge1xuICAgICAgICAvLyBDaGVjayBpZiBtb2R1bGUgaXMgYWxyZWFkeSBpbXBvcnRlZFxuICAgICAgICBjb25zdCBzY2FubmVkTW9kdWxlID0gc2Nhbm5lZE1vZHVsZXMuZ2V0KGNsYXNzUmVmKTtcbiAgICAgICAgaWYgKCFpc05pbChzY2FubmVkTW9kdWxlKSkge1xuICAgICAgICAgICAgcGFyZW50Tm9kZS52YWx1ZS5yZXBldGl0aXZlSW1wb3J0cy5hZGQoc2Nhbm5lZE1vZHVsZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFJlYWQgbW9kdWxlIG1ldGFkYXRhXG4gICAgICAgIGNvbnN0IG1vZHVsZU1ldGFkYXRhID0gYXdhaXQgdGhpcy5tb2R1bGVNZXRhZGF0YVJlYWRlci5yZWFkKGNsYXNzUmVmKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgICAgIHRoaXMuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGFyZW50Tm9kZS52YWx1ZS5tZXRhZGF0YSwgbW9kdWxlTWV0YWRhdGEpO1xuICAgICAgICAvLyBDcmVhdGUgbW9kdWxlIGluc3RhbmNlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBNb2R1bGUoKTtcbiAgICAgICAgbW9kdWxlLm1ldGFkYXRhID0gbW9kdWxlTWV0YWRhdGE7XG4gICAgICAgIG1vZHVsZS5wYXJlbnQgPSBwYXJlbnROb2RlLnZhbHVlO1xuICAgICAgICAvLyBMb2cgbW9kdWxlIGluZm9cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZyhgfmx3fk1vZHVsZSB+bGJ+JHttb2R1bGUubWV0YWRhdGEuY2xhc3NSZWYubmFtZX0gfmx3fnNjYW5uZWQgfmxrfigke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXMpYCk7XG4gICAgICAgIC8vIFNjYW4gY29udHJvbGxlcnMgaW4gbW9kdWxlXG4gICAgICAgIGF3YWl0IHRoaXMuc2NhbkNvbnRyb2xsZXJzKG1vZHVsZSk7XG4gICAgICAgIC8vIEFkZCBtb2R1bGUgdG8gdHJlZVxuICAgICAgICBjb25zdCB0cmVlTm9kZSA9IG5ldyBUcmVlTm9kZShtb2R1bGUpO1xuICAgICAgICBwYXJlbnROb2RlLmFkZENoaWxkKHRyZWVOb2RlKTtcbiAgICAgICAgLy8gQWRkIG1vZHVsZSB0byBpbXBvcnRlZCBtb2R1bGVzIHNldCB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHNjYW5uaW5nXG4gICAgICAgIHNjYW5uZWRNb2R1bGVzLnNldChjbGFzc1JlZiwgbW9kdWxlKTtcbiAgICAgICAgLy8gU2NhbiBpbXBvcnRlZCBtb2R1bGVzIHJlY3Vyc2l2ZWx5XG4gICAgICAgIGZvciAoY29uc3QgaW1wb3J0TW9kdWxlIG9mIG1vZHVsZU1ldGFkYXRhLmltcG9ydHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nhbk1vZHVsZXModHJlZU5vZGUsIGltcG9ydE1vZHVsZSwgc2Nhbm5lZE1vZHVsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzY2FuQ29udHJvbGxlcnMobW9kdWxlOiBNb2R1bGUpIHtcbiAgICAgICAgLy8gU2NhbiBjb250cm9sbGVyc1xuICAgICAgICBmb3IgKGNvbnN0IGNsYXNzUmVmIG9mIG1vZHVsZS5tZXRhZGF0YS5jb250cm9sbGVycykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXJNZXRhZGF0YSA9IGF3YWl0IHRoaXMuY29udHJvbGxlck1ldGFkYXRhUmVhZGVyLnJlYWQoY2xhc3NSZWYpO1xuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyKCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLm1ldGFkYXRhID0gY29udHJvbGxlck1ldGFkYXRhO1xuICAgICAgICAgICAgY29udHJvbGxlci5vd25lciA9IG1vZHVsZTtcbiAgICAgICAgICAgIG1vZHVsZS5jb250cm9sbGVycy5wdXNoKGNvbnRyb2xsZXIpO1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKGB+bHd+Q29udHJvbGxlciB+bGN+JHtjbGFzc1JlZi5uYW1lfSB+bHd+c2Nhbm5lZCB+bGt+KCR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcylgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGFyZW50TWV0YWRhdGE6IE1vZHVsZU1ldGFkYXRhLCBtb2R1bGVNZXRhZGF0YTogTW9kdWxlTWV0YWRhdGEpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgcGFyZW50IG1vZHVsZSBpcyBpbXBvcnRlZCBpbiBtb2R1bGVcbiAgICAgICAgaWYgKG1vZHVsZU1ldGFkYXRhLmltcG9ydHMuaW5jbHVkZXMocGFyZW50TWV0YWRhdGEuY2xhc3NSZWYpKSB7XG4gICAgICAgICAgICAvLyB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNjYW5uaW5nIHRoZSBtb2R1bGUgdHJlZS4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQ2lyY3VsYXJEZXBlbmRlbmN5RGV0ZWN0ZWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2NyaXB0RXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBTY3JpcHRFdmVudCBpbXBsZW1lbnRzIFNjcmlwdEV2ZW50SGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCxcbiAgICApIHt9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBtcC5ldmVudHMucmVtb3ZlKHRoaXMuZXZlbnROYW1lLCB0aGlzLmxpc3RlbmVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFdmVudEVtbWl0ZXIsIFNjcmlwdEV2ZW50SGFuZGxlciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmFnZU1QU2NyaXB0RXZlbnQgfSBmcm9tICcuL3JhZ2VtcC1zY3JpcHQtZXZlbnQtaGFuZGxlcic7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBFdmVudEVtbWl0ZXIgaW1wbGVtZW50cyBFdmVudEVtbWl0ZXIge1xuICAgIHByaXZhdGUgbWFwRXZlbnRzU2hhcmVkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAvLyBNYXAgYWx0OlYgZXZlbnQgbmFtZXMgdG8gUmFnZU1QIGVxdWl2YWxlbnRzXG4gICAgICAgICdlbnRpdHlDb2xTaGFwZUVudGVyJzogJ3BsYXllckVudGVyQ29sc2hhcGUnLFxuICAgICAgICAnZW50aXR5Q29sU2hhcGVMZWF2ZSc6ICdwbGF5ZXJFeGl0Q29sc2hhcGUnLFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1hcEV2ZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9KSB7fVxuXG4gICAgcHJpdmF0ZSBnZXRFdmVudE5hbWUoZXZlbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBFdmVudHNTaGFyZWRbZXZlbnROYW1lXSB8fCB0aGlzLm1hcEV2ZW50c1tldmVudE5hbWVdIHx8IGV2ZW50TmFtZTtcbiAgICB9XG5cbiAgICBlbWl0KGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBtcC5ldmVudHMuY2FsbChldmVudE5hbWUsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogU2NyaXB0RXZlbnRIYW5kbGVyIHtcbiAgICAgICAgY29uc3QgbWFwcGVkRXZlbnROYW1lID0gdGhpcy5nZXRFdmVudE5hbWUoZXZlbnROYW1lKTtcbiAgICAgICAgbXAuZXZlbnRzLmFkZChtYXBwZWRFdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWdlTVBTY3JpcHRFdmVudChtYXBwZWRFdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBvbmNlKGV2ZW50TmFtZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogU2NyaXB0RXZlbnRIYW5kbGVyIHtcbiAgICAgICAgY29uc3QgbWFwcGVkRXZlbnROYW1lID0gdGhpcy5nZXRFdmVudE5hbWUoZXZlbnROYW1lKTtcbiAgICAgICAgY29uc3Qgb25jZVdyYXBwZXIgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICAgIG1wLmV2ZW50cy5yZW1vdmUobWFwcGVkRXZlbnROYW1lLCBvbmNlV3JhcHBlcik7XG4gICAgICAgICAgICBsaXN0ZW5lciguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgbXAuZXZlbnRzLmFkZChtYXBwZWRFdmVudE5hbWUsIG9uY2VXcmFwcGVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWdlTVBTY3JpcHRFdmVudChtYXBwZWRFdmVudE5hbWUsIG9uY2VXcmFwcGVyKTtcbiAgICB9XG5cbiAgICBvZmYoZXZlbnROYW1lOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgbXAuZXZlbnRzLnJlbW92ZShldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aXBsYXllclRpbWVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBjbGFzcyBSYWdlTVBUaW1lciBpbXBsZW1lbnRzIE11bHRpcGxheWVyVGltZXIge1xuICAgIHB1YmxpYyBsYXN0VGljayA9IERhdGUubm93KCk7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpZDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgaW50ZXJ2YWw6IG51bWJlciA9IDAsXG4gICAgICAgIHB1YmxpYyBvbmNlOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgY2FsbGJhY2s6IEZ1bmN0aW9uLFxuICAgICAgICBwcml2YXRlIGNsZWFyVGltZXI6IEZ1bmN0aW9uLFxuICAgICkge31cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpcGxheWVyVGltZXIsIE11bHRpcGxheWVyVGltZXJzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSYWdlTVBUaW1lciB9IGZyb20gJy4vcmFnZW1wLXRpbWVyJztcblxuZXhwb3J0IGNsYXNzIFJhZ2VNUFRpbWVycyBpbXBsZW1lbnRzIE11bHRpcGxheWVyVGltZXJzIHtcbiAgICBwcml2YXRlIHRpbWVySW5jcmVtZW50ZXI6IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSB0aW1lcnMgPSBuZXcgTWFwPG51bWJlciwgTXVsdGlwbGF5ZXJUaW1lcj4oKTtcbiAgICBwcml2YXRlIGV2ZXJ5VGlja0hhbmRsZXJzID0gbmV3IE1hcDxudW1iZXIsIHsgY2FsbGJhY2s6IEZ1bmN0aW9uOyBib3VuZDogRnVuY3Rpb24gfT4oKTtcbiAgICBwcml2YXRlIGlzRXZlcnlUaWNrUnVubmluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgZXZlcnlUaWNrTWFpbkhhbmRsZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIGdldCBhbGwoKTogTXVsdGlwbGF5ZXJUaW1lcltdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnRpbWVycy52YWx1ZXMoKV07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB3YXJuaW5nVGhyZXNob2xkKCk6IG51bWJlciB7XG4gICAgICAgIC8vIFJhZ2VNUCBkb2Vzbid0IGhhdmUgdGhpcyBmZWF0dXJlXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgd2FybmluZ1RocmVzaG9sZChfdmFsdWU6IG51bWJlcikge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIHRoaXMgZmVhdHVyZVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudCgpOiBudW1iZXIge1xuICAgICAgICAvLyBSYWdlTVAgZG9lc24ndCBoYXZlIHRoaXMgZmVhdHVyZVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQoX3ZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgLy8gUmFnZU1QIGRvZXNuJ3QgaGF2ZSB0aGlzIGZlYXR1cmVcbiAgICB9XG5cbiAgICBnZXRCeUlEKGlkOiBudW1iZXIpOiBNdWx0aXBsYXllclRpbWVyIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy50aW1lcnMuZ2V0KGlkKTtcbiAgICAgICAgcmV0dXJuIHRpbWVyID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUaW1lcihcbiAgICAgICAgY3JlYXRlVGltZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gbnVtYmVyLFxuICAgICAgICBjbGVhcjogKGlkOiBudW1iZXIpID0+IHZvaWQsXG4gICAgICAgIGNhbGxiYWNrOiBGdW5jdGlvbixcbiAgICAgICAgaW50ZXJ2YWw6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgb25jZTogYm9vbGVhbixcbiAgICAgICAgLi4uYXJnczogdW5rbm93bltdXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrQmluZCA9IGNhbGxiYWNrLmJpbmQodGhpcywgLi4uKEFycmF5LmlzQXJyYXkoYXJncykgPyBhcmdzIDogW10pKTtcbiAgICAgICAgY29uc3QgdGltZXJJZCA9IHR5cGVvZiBpbnRlcnZhbCA9PT0gJ251bWJlcicgPyBjcmVhdGVUaW1lcihjYWxsYmFja0JpbmQsIGludGVydmFsKSA6IGNyZWF0ZVRpbWVyKGNhbGxiYWNrQmluZCk7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy50aW1lckluY3JlbWVudGVyKys7XG5cbiAgICAgICAgY29uc3QgcmFnZU1QVGltZXIgPSBuZXcgUmFnZU1QVGltZXIoaWQsIGludGVydmFsID8/IDAsIG9uY2UsIGNhbGxiYWNrQmluZCwgKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXIodGltZXJJZCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUoaWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50aW1lcnMuc2V0KGlkLCByYWdlTVBUaW1lcik7XG4gICAgICAgIHJldHVybiByYWdlTVBUaW1lcjtcbiAgICB9XG5cbiAgICBzZXRJbnRlcnZhbChjYWxsYmFjazogRnVuY3Rpb24sIHRpbWU6IG51bWJlciwgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRpbWVyKFxuICAgICAgICAgICAgKGNiOiBGdW5jdGlvbiwgaW50ZXJ2YWw6IG51bWJlcikgPT4gc2V0SW50ZXJ2YWwoY2IgYXMgKCkgPT4gdm9pZCwgaW50ZXJ2YWwpIGFzIHVua25vd24gYXMgbnVtYmVyLFxuICAgICAgICAgICAgKGlkOiBudW1iZXIpID0+IGNsZWFySW50ZXJ2YWwoaWQpLFxuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICB0aW1lLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dChjYWxsYmFjazogRnVuY3Rpb24sIHRpbWU6IG51bWJlciwgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy50aW1lckluY3JlbWVudGVyKys7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrQmluZCA9IGNhbGxiYWNrLmJpbmQodGhpcywgLi4uKEFycmF5LmlzQXJyYXkoYXJncykgPyBhcmdzIDogW10pKTtcblxuICAgICAgICBjb25zdCB0aW1lcklkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFja0JpbmQoKTtcbiAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgIH0sIHRpbWUpIGFzIHVua25vd24gYXMgbnVtYmVyO1xuXG4gICAgICAgIGNvbnN0IHJhZ2VNUFRpbWVyID0gbmV3IFJhZ2VNUFRpbWVyKGlkLCB0aW1lLCB0cnVlLCBjYWxsYmFja0JpbmQsICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVycy5zZXQoaWQsIHJhZ2VNUFRpbWVyKTtcbiAgICAgICAgcmV0dXJuIHJhZ2VNUFRpbWVyO1xuICAgIH1cblxuICAgIGV2ZXJ5VGljayhjYWxsYmFjazogRnVuY3Rpb24sIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMudGltZXJJbmNyZW1lbnRlcisrO1xuICAgICAgICBjb25zdCBjYWxsYmFja0JpbmQgPSBjYWxsYmFjay5iaW5kKHRoaXMsIC4uLihBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFtdKSk7XG5cbiAgICAgICAgdGhpcy5ldmVyeVRpY2tIYW5kbGVycy5zZXQoaWQsIHsgY2FsbGJhY2ssIGJvdW5kOiBjYWxsYmFja0JpbmQgfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgb24gY2xpZW50LXNpZGUgKHJlbmRlciBldmVudCBleGlzdHMpIG9yIHNlcnZlci1zaWRlXG4gICAgICAgIGNvbnN0IGlzQ2xpZW50U2lkZSA9IHR5cGVvZiBtcCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIChtcCBhcyBhbnkpLmJyb3dzZXJzICE9PSAndW5kZWZpbmVkJztcblxuICAgICAgICAvLyBTdGFydCB0aGUgdGljayBsb29wIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmdcbiAgICAgICAgaWYgKCF0aGlzLmlzRXZlcnlUaWNrUnVubmluZykge1xuICAgICAgICAgICAgdGhpcy5pc0V2ZXJ5VGlja1J1bm5pbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoaXNDbGllbnRTaWRlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xpZW50LXNpZGU6IHVzZSByZW5kZXIgZXZlbnQgZm9yIGZyYW1lLWFjY3VyYXRlIHRpY2tpbmdcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZXJ5VGlja01haW5IYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFssIGhhbmRsZXJdIG9mIHRoaXMuZXZlcnlUaWNrSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5ib3VuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wLmNvbnNvbGUubG9nRXJyb3IoYEVycm9yIGluIGV2ZXJ5VGljayBoYW5kbGVyOiAke2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1wLmV2ZW50cy5hZGQoJ3JlbmRlcicsIHRoaXMuZXZlcnlUaWNrTWFpbkhhbmRsZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTZXJ2ZXItc2lkZTogdXNlIHNldEludGVydmFsIHdpdGggbWluaW1hbCBkZWxheSBhcyBhcHByb3hpbWF0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWxIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFssIGhhbmRsZXJdIG9mIHRoaXMuZXZlcnlUaWNrSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5ib3VuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wLmNvbnNvbGUubG9nRXJyb3IoYEVycm9yIGluIGV2ZXJ5VGljayBoYW5kbGVyOiAke2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSkuX2V2ZXJ5VGlja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoaW50ZXJ2YWxIYW5kbGVyLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhZ2VNUFRpbWVyID0gbmV3IFJhZ2VNUFRpbWVyKGlkLCAwLCBmYWxzZSwgY2FsbGJhY2tCaW5kLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmV2ZXJ5VGlja0hhbmRsZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUoaWQpO1xuXG4gICAgICAgICAgICAvLyBTdG9wIHRoZSB0aWNrIGxvb3AgaWYgbm8gbW9yZSBoYW5kbGVyc1xuICAgICAgICAgICAgaWYgKHRoaXMuZXZlcnlUaWNrSGFuZGxlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpc0NsaWVudFNpZGUgJiYgdGhpcy5ldmVyeVRpY2tNYWluSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBtcC5ldmVudHMucmVtb3ZlKCdyZW5kZXInLCB0aGlzLmV2ZXJ5VGlja01haW5IYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVyeVRpY2tNYWluSGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcyBhcyBhbnkpLl9ldmVyeVRpY2tJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKCh0aGlzIGFzIGFueSkuX2V2ZXJ5VGlja0ludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KS5fZXZlcnlUaWNrSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmlzRXZlcnlUaWNrUnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50aW1lcnMuc2V0KGlkLCByYWdlTVBUaW1lcik7XG4gICAgICAgIHJldHVybiByYWdlTVBUaW1lcjtcbiAgICB9XG5cbiAgICBuZXh0VGljayhjYWxsYmFjazogRnVuY3Rpb24sIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMudGltZXJJbmNyZW1lbnRlcisrO1xuICAgICAgICBjb25zdCBjYWxsYmFja0JpbmQgPSBjYWxsYmFjay5iaW5kKHRoaXMsIC4uLihBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFtdKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgb24gY2xpZW50LXNpZGUgKHJlbmRlciBldmVudCBleGlzdHMpIG9yIHNlcnZlci1zaWRlXG4gICAgICAgIGNvbnN0IGlzQ2xpZW50U2lkZSA9IHR5cGVvZiBtcCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIChtcCBhcyBhbnkpLmJyb3dzZXJzICE9PSAndW5kZWZpbmVkJztcblxuICAgICAgICBsZXQgdGltZXJJZDogYW55O1xuXG4gICAgICAgIGlmIChpc0NsaWVudFNpZGUpIHtcbiAgICAgICAgICAgIC8vIENsaWVudC1zaWRlOiB1c2UgcmVuZGVyIGV2ZW50IGZvciBuZXh0IGZyYW1lXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQmluZCgpO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIG1wLmV2ZW50cy5yZW1vdmUoJ3JlbmRlcicsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtcC5ldmVudHMuYWRkKCdyZW5kZXInLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY29uc3QgcmFnZU1QVGltZXIgPSBuZXcgUmFnZU1QVGltZXIoaWQsIDAsIHRydWUsIGNhbGxiYWNrQmluZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1wLmV2ZW50cy5yZW1vdmUoJ3JlbmRlcicsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGltZXJzLnNldChpZCwgcmFnZU1QVGltZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHJhZ2VNUFRpbWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2VydmVyLXNpZGU6IHVzZSBzZXRJbW1lZGlhdGUgb3Igc2V0VGltZW91dCgwKSBmb3IgbmV4dCB0aWNrXG4gICAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tCaW5kKCk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKTtcblxuICAgICAgICAgICAgY29uc3QgcmFnZU1QVGltZXIgPSBuZXcgUmFnZU1QVGltZXIoaWQsIDAsIHRydWUsIGNhbGxiYWNrQmluZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRpbWVycy5zZXQoaWQsIHJhZ2VNUFRpbWVyKTtcbiAgICAgICAgICAgIHJldHVybiByYWdlTVBUaW1lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRpbWUoX25hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgLy8gUmFnZU1QIGRvZXNuJ3QgaGF2ZSBjb25zb2xlLnRpbWUgZXF1aXZhbGVudFxuICAgICAgICAvLyBDb3VsZCBpbXBsZW1lbnQgY3VzdG9tIHRpbWluZyBpZiBuZWVkZWRcbiAgICB9XG5cbiAgICB0aW1lRW5kKF9uYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIC8vIFJhZ2VNUCBkb2Vzbid0IGhhdmUgY29uc29sZS50aW1lRW5kIGVxdWl2YWxlbnRcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFdmVudEVtbWl0ZXIsIE11bHRpcGxheWVyU2VydmljZSwgTXVsdGlwbGF5ZXJUaW1lcnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJhZ2VNUEV2ZW50RW1taXRlciB9IGZyb20gJy4vcmFnZW1wLWV2ZW50LWVtbWl0ZXInO1xuaW1wb3J0IHsgUmFnZU1QVGltZXJzIH0gZnJvbSAnLi9yYWdlbXAtdGltZXJzJztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUmFnZU1QTXVsdGlwbGF5ZXJTZXJ2aWNlIGltcGxlbWVudHMgTXVsdGlwbGF5ZXJTZXJ2aWNlIHtcbiAgICByZWFkb25seSBUaW1lcnM6IE11bHRpcGxheWVyVGltZXJzO1xuICAgIHJlYWRvbmx5IEV2ZW50czogRXZlbnRFbW1pdGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuRXZlbnRzID0gbmV3IFJhZ2VNUEV2ZW50RW1taXRlcigpO1xuICAgICAgICB0aGlzLlRpbWVycyA9IG5ldyBSYWdlTVBUaW1lcnMoKTtcbiAgICB9XG5cbiAgICBwYXJzZUludGVybmFsQXJnczxVID0gdW5rbm93biwgVCA9IHVua25vd24+KFxuICAgICAgICAuLi5hcmdzOiBhbnlcbiAgICApOiB7XG4gICAgICAgIHBsYXllcj86IFU7XG4gICAgICAgIGJvZHk/OiBUO1xuICAgIH0ge1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSAoaXNPYmplY3QoYXJnc1swXSkgPyBhcmdzWzBdIDogdW5kZWZpbmVkKSBhcyBVO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwbGF5ZXIsXG4gICAgICAgICAgICBib2R5OiBhcmdzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGxvZyhhcmc6IGFueSwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFthcmcsIC4uLmFyZ3NdLm1hcChhID0+XG4gICAgICAgICAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhKSA6IFN0cmluZyhhKVxuICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgbXAuY29uc29sZS5sb2dJbmZvKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGxvZ0Vycm9yKGFyZzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gW2FyZywgLi4uYXJnc10ubWFwKGEgPT5cbiAgICAgICAgICAgIHR5cGVvZiBhID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGEpIDogU3RyaW5nKGEpXG4gICAgICAgICkuam9pbignICcpO1xuICAgICAgICBtcC5jb25zb2xlLmxvZ0Vycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGxvZ1dhcm5pbmcoYXJnOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbYXJnLCAuLi5hcmdzXS5tYXAoYSA9PlxuICAgICAgICAgICAgdHlwZW9mIGEgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYSkgOiBTdHJpbmcoYSlcbiAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgIG1wLmNvbnNvbGUubG9nV2FybmluZyhtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBsb2dEZWJ1Zyhhcmc6IGFueSwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgLy8gUmFnZU1QIGRvZXNuJ3QgaGF2ZSBhIGRlZGljYXRlZCBkZWJ1ZyBsb2csIHVzZSBpbmZvXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbYXJnLCAuLi5hcmdzXS5tYXAoYSA9PlxuICAgICAgICAgICAgdHlwZW9mIGEgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYSkgOiBTdHJpbmcoYSlcbiAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgIG1wLmNvbnNvbGUubG9nSW5mbyhgW0RFQlVHXSAke21lc3NhZ2V9YCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IHZhbGlkYXRlRXJyb3JGaWx0ZXIsIHZhbGlkYXRlR3VhcmQsIHZhbGlkYXRlSW50ZXJjZXB0b3IsIHZhbGlkYXRlUGlwZSB9IGZyb20gJy4uL3NjaGVtYXMvZXZlbnRzJztcbmltcG9ydCB7XG4gICAgSU5URVJOQUxfQVBQX0NPTlRBSU5FUixcbiAgICBHTE9CQUxfRVJST1JfRklMVEVSUyxcbiAgICBHTE9CQUxfR1VBUkRTLFxuICAgIEdMT0JBTF9JTlRFUkNFUFRPUlMsXG4gICAgR0xPQkFMX1BJUEVTLFxuICAgIEVOQUJMRV9TSFVURE9XTl9IT09LUyxcbiAgICBQTFVHSU5TLFxuICAgIEdMT0JBTF9BUFBfQ09OVEFJTkVSLFxuICAgIEFQUF9FTlZJUk9NRU5ULFxuICAgIE1BTkdPX1JFUVVFU1RfRkFDVE9SWSxcbiAgICBNQU5HT19SRVNQT05TRV9GQUNUT1JZLFxuICAgIEVYRUNVVElPTl9DT05URVhUX0ZBQ1RPUlksXG4gICAgQ09OVEFJTkVSX09QVElPTlMsXG4gICAgTVVMVElQTEFZRVJfU0VSVklDRSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgaW5qZWN0LCBDb250YWluZXIsIGluamVjdGFibGUsIHR5cGUgaW50ZXJmYWNlcyB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuL2FwcCc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRmlsdGVyLCBHdWFyZCwgSW50ZXJjZXB0b3IsIE1hbmdvUGx1Z2luLCBNdWx0aXBsYXllclNlcnZpY2UgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBQaXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICAgIENvbnRyb2xsZXJFdmVudEhhbmRsZXIsXG4gICAgQ29udHJvbGxlckZsb3dIYW5kbGVyLFxuICAgIENvbnRyb2xsZXJNZXRhZGF0YVJlYWRlcixcbiAgICBDb250cm9sbGVyUlBDSGFuZGxlcixcbiAgICBQaXBlbGluZUhhbmRsZXIsXG59IGZyb20gJy4vY29udHJvbGxlcic7XG5pbXBvcnQgeyBNb2R1bGUsIE1vZHVsZU1ldGFkYXRhUmVhZGVyIH0gZnJvbSAnLi9tb2R1bGUnO1xuaW1wb3J0IHsgQXBwUnVudGltZSwgTW9kdWxlRGVwZW5kZW5jeUJpbmRlciwgTW9kdWxlVHJlZVNjYW5uZXIgfSBmcm9tICcuL21vZHVsZS10cmVlJztcbmltcG9ydCB7IENvbnRyb2xsZXIgfSBmcm9tICcuL2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRXhlY3V0aW9uQ29udGV4dEJhc2UsIE1hbmdvUmVxdWVzdEJhc2UsIE1hbmdvUmVzcG9uc2VCYXNlIH0gZnJvbSAnLi9waXBlbGluZSc7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHRUeXBlIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBSRUZMRUNUT1JfU0VSVklDRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSZWZsZWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXBwQnVpbGRlcjxHIGV4dGVuZHMgR3VhcmQgPSBHdWFyZCwgSSBleHRlbmRzIEludGVyY2VwdG9yID0gSW50ZXJjZXB0b3IsIEVGIGV4dGVuZHMgRXJyb3JGaWx0ZXIgPSBFcnJvckZpbHRlcj4ge1xuICAgIEBpbmplY3QoQVBQX0VOVklST01FTlQpIHByb3RlY3RlZCByZWFkb25seSBlbnZpcm9tZW50OiBzdHJpbmc7XG4gICAgQGluamVjdChJTlRFUk5BTF9BUFBfQ09OVEFJTkVSKSBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZXJuYWxBcHBDb250YWluZXI6IENvbnRhaW5lcjtcbiAgICBAaW5qZWN0KE1VTFRJUExBWUVSX1NFUlZJQ0UpIHByb3RlY3RlZCByZWFkb25seSBtdWx0aXBsYXllclNlcnZpY2U6IE11bHRpcGxheWVyU2VydmljZTtcbiAgICBAaW5qZWN0KFBMVUdJTlMpIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5zOiBOZXdhYmxlPE1hbmdvUGx1Z2luPltdO1xuXG4gICAgcHJpdmF0ZSBnbG9iYWxDb250YWluZXJPcHRpb25zOiBpbnRlcmZhY2VzLkNvbnRhaW5lck9wdGlvbnMgPSB7fTtcblxuICAgIHB1YmxpYyB1c2VHbG9iYWxHdWFyZHMoLi4uZ3VhcmRzOiAoTmV3YWJsZTxHPiB8IEcpW10pIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkR3VhcmRzOiAoTmV3YWJsZTxHPiB8IEcpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBndWFyZCBvZiBndWFyZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVHdWFyZChndWFyZCk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkR3VhcmRzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9HVUFSRFMpLnRvQ29uc3RhbnRWYWx1ZSh2YWxpZGF0ZWRHdWFyZHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9yczogKE5ld2FibGU8ST4gfCBJKVtdKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEludGVyY2VwdG9yczogKE5ld2FibGU8ST4gfCBJKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2YgaW50ZXJjZXB0b3JzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZEludGVyY2VwdG9ycy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfSU5URVJDRVBUT1JTKS50b0NvbnN0YW50VmFsdWUodmFsaWRhdGVkSW50ZXJjZXB0b3JzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10pIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBpcGUgb2YgcGlwZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVQaXBlKHBpcGUpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZFBpcGVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEdMT0JBTF9QSVBFUykudG9Db25zdGFudFZhbHVlKHZhbGlkYXRlZFBpcGVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHVzZUdsb2JhbEZpbHRlcnMoLi4uZmlsdGVyczogKE5ld2FibGU8RUY+IHwgRUYpW10pIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRklsdGVyczogKE5ld2FibGU8RUY+IHwgRUYpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUVycm9yRmlsdGVyKGZpbHRlcik7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkRklsdGVycy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfRVJST1JfRklMVEVSUykudG9Db25zdGFudFZhbHVlKHZhbGlkYXRlZEZJbHRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdXNlUGx1Z2lucyguLi5wbHVnaW5zOiBOZXdhYmxlPE1hbmdvUGx1Z2luPltdKSB7XG4gICAgICAgIHBsdWdpbnMuZm9yRWFjaCgocCkgPT4gdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKHApLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKSk7XG4gICAgICAgIGNvbnN0IGludGVybmFsUGx1Z2lucyA9IHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuZ2V0PE5ld2FibGU8TWFuZ29QbHVnaW4+W10+KFBMVUdJTlMpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLnJlYmluZChQTFVHSU5TKS50b0NvbnN0YW50VmFsdWUoWy4uLmludGVybmFsUGx1Z2lucywgLi4ucGx1Z2luc10pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZW5hYmxlU2h1dGRvd25Ib29rcygpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKEVOQUJMRV9TSFVURE9XTl9IT09LUykudG9Db25zdGFudFZhbHVlKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29udGFpbmVyT3B0aW9ucyhvcHRpb25zOiBpbnRlcmZhY2VzLkNvbnRhaW5lck9wdGlvbnMsIG9ubHlHbG9iYWwgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmdsb2JhbENvbnRhaW5lck9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBpZiAob25seUdsb2JhbCkgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChDT05UQUlORVJfT1BUSU9OUykudG9Db25zdGFudFZhbHVlKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYnVpbGQoKSB7XG4gICAgICAgIGNvbnN0IGdsb2JhbEFwcENvbnRhaW5lciA9IG5ldyBDb250YWluZXIodGhpcy5nbG9iYWxDb250YWluZXJPcHRpb25zKTtcbiAgICAgICAgLy8gR0xvYmFsIHNlcnZpY2UgYmluZGluZ3NcbiAgICAgICAgZ2xvYmFsQXBwQ29udGFpbmVyLmJpbmQoUkVGTEVDVE9SX1NFUlZJQ0UpLnRvQ29uc3RhbnRWYWx1ZShSZWZsZWN0b3JTZXJ2aWNlKTtcbiAgICAgICAgZ2xvYmFsQXBwQ29udGFpbmVyLmJpbmQoUmVmbGVjdG9yU2VydmljZSkudG9TZXJ2aWNlKFJFRkxFQ1RPUl9TRVJWSUNFKTtcblxuICAgICAgICAvLyBNdWx0aXBsYXllciBzZXJ2aWNlIGJpbmRpbmdzXG4gICAgICAgIGdsb2JhbEFwcENvbnRhaW5lci5iaW5kKE1VTFRJUExBWUVSX1NFUlZJQ0UpLnRvQ29uc3RhbnRWYWx1ZSh0aGlzLm11bHRpcGxheWVyU2VydmljZSk7XG4gXG4gICAgICAgIC8vIEFwcCBiaW5kaW5nc1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQXBwKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfQVBQX0NPTlRBSU5FUikudG9Db25zdGFudFZhbHVlKGdsb2JhbEFwcENvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gTW9kdWxlIHRyZWUgYmluZGluZ3NcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1vZHVsZVRyZWVTY2FubmVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNb2R1bGVEZXBlbmRlbmN5QmluZGVyKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChBcHBSdW50aW1lKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG5cbiAgICAgICAgLy8gQXBwIGJpbmRpbmdzXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChQaXBlbGluZUhhbmRsZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcblxuICAgICAgICAvLyBNb2R1bGUgYmluZGluZ3NcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKE1vZHVsZSkudG9TZWxmKCkuaW5UcmFuc2llbnRTY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTW9kdWxlTWV0YWRhdGFSZWFkZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcblxuICAgICAgICAvLyBDb250cm9sbGVyIGJpbmRpbmdzXG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChDb250cm9sbGVyKS50b1NlbGYoKS5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChDb250cm9sbGVyTWV0YWRhdGFSZWFkZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKENvbnRyb2xsZXJGbG93SGFuZGxlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQ29udHJvbGxlckV2ZW50SGFuZGxlcikudG9TZWxmKCkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoQ29udHJvbGxlclJQQ0hhbmRsZXIpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcblxuICAgICAgICAvLyBNYW5nbyBSZXF1ZXN0IGFuZCBSZXNwb25zZSBiaW5kaW5nc1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTWFuZ29SZXF1ZXN0QmFzZSkudG9TZWxmKCkuaW5UcmFuc2llbnRTY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTUFOR09fUkVRVUVTVF9GQUNUT1JZKS50b0ZhY3RvcnkoKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoYm9keTogdW5rbm93biwgcGxheWVyOiBQbGF5ZXJNcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBjb250ZXh0LmNvbnRhaW5lci5nZXQoTWFuZ29SZXF1ZXN0QmFzZSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC4kYm9keSA9IGJvZHk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC4kcGxheWVyID0gcGxheWVyO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNYW5nb1Jlc3BvbnNlQmFzZSkudG9TZWxmKCkuaW5UcmFuc2llbnRTY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoTUFOR09fUkVTUE9OU0VfRkFDVE9SWSkudG9GYWN0b3J5KChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbnRhaW5lci5nZXQoTWFuZ29SZXNwb25zZUJhc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChFeGVjdXRpb25Db250ZXh0QmFzZSkudG9TZWxmKCkuaW5UcmFuc2llbnRTY29wZSgpO1xuICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoRVhFQ1VUSU9OX0NPTlRFWFRfRkFDVE9SWSkudG9GYWN0b3J5KChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHR5cGU6IEV4ZWN1dGlvbkNvbnRleHRUeXBlLFxuICAgICAgICAgICAgICAgIGNsYXNzUmVmOiBOZXdhYmxlLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IEZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IE1hbmdvUmVxdWVzdEJhc2UsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IE1hbmdvUmVzcG9uc2VCYXNlLFxuICAgICAgICAgICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSBjb250ZXh0LmNvbnRhaW5lci5nZXQoRXhlY3V0aW9uQ29udGV4dEJhc2UpO1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQuJHR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQuJHJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQuJHJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dC4kaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dC4kY2xhc3NSZWYgPSBjbGFzc1JlZjtcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LiRuYW1lID0gbmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0aW9uQ29udGV4dDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFBsdWdpbnMgYmluZGluZ3NcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKSB7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQocGx1Z2luKS50b1NlbGYoKS5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuZ2V0KHBsdWdpbik7XG4gICAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlLm9uQnVpbGQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgYXdhaXQgcGx1Z2luSW5zdGFuY2Uub25CdWlsZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmlzQm91bmQoR0xPQkFMX0dVQVJEUykpIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfR1VBUkRTKS50b0NvbnN0YW50VmFsdWUoW10pO1xuICAgICAgICBpZiAoIXRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuaXNCb3VuZChHTE9CQUxfSU5URVJDRVBUT1JTKSlcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChHTE9CQUxfSU5URVJDRVBUT1JTKS50b0NvbnN0YW50VmFsdWUoW10pO1xuICAgICAgICBpZiAoIXRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuaXNCb3VuZChHTE9CQUxfUElQRVMpKSB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX1BJUEVTKS50b0NvbnN0YW50VmFsdWUoW10pO1xuICAgICAgICBpZiAoIXRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuaXNCb3VuZChHTE9CQUxfRVJST1JfRklMVEVSUykpXG4gICAgICAgICAgICB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoR0xPQkFMX0VSUk9SX0ZJTFRFUlMpLnRvQ29uc3RhbnRWYWx1ZShbXSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxBcHBDb250YWluZXIuZ2V0KEFwcCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENvbnRhaW5lciwgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IE1vZHVsZURlcGVuZGVuY3lCaW5kZXIsIE1vZHVsZVRyZWVTY2FubmVyIH0gZnJvbSAnLi9tb2R1bGUtdHJlZSc7XG5pbXBvcnQgeyBNb2R1bGUgfSBmcm9tICcuL21vZHVsZS9tb2R1bGUnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgSU5URVJOQUxfQVBQX0NPTlRBSU5FUiwgUExVR0lOUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEFwcFJ1bnRpbWUgfSBmcm9tICcuL21vZHVsZS10cmVlJztcbmltcG9ydCB0eXBlIHsgTWFuZ29QbHVnaW4gfSBmcm9tICcuL2ludGVyZmFjZXMvY29yZS9tYW5nby1wbHVnaW4uaW50ZXJmYWNlJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgVHJlZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMT0dHRVJfU0VSVklDRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcHAge1xuICAgIEBpbmplY3QoTW9kdWxlVHJlZVNjYW5uZXIpIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlVHJlZVNjYW5uZXI6IE1vZHVsZVRyZWVTY2FubmVyO1xuICAgIEBpbmplY3QoTW9kdWxlRGVwZW5kZW5jeUJpbmRlcikgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVEZXBlbmRlbmN5QmluZGVyOiBNb2R1bGVEZXBlbmRlbmN5QmluZGVyO1xuICAgIEBpbmplY3QoQXBwUnVudGltZSkgcHJpdmF0ZSByZWFkb25seSBhcHBSdW50aW1lOiBBcHBSdW50aW1lO1xuICAgIEBpbmplY3QoSU5URVJOQUxfQVBQX0NPTlRBSU5FUikgcHJpdmF0ZSByZWFkb25seSBpbnRlcm5hbEFwcENvbnRhaW5lcjogQ29udGFpbmVyO1xuICAgIEBpbmplY3QoUExVR0lOUykgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5zOiBOZXdhYmxlPE1hbmdvUGx1Z2luPltdO1xuICAgIEBpbmplY3QoTE9HR0VSX1NFUlZJQ0UpIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyU2VydmljZTogTG9nZ2VyU2VydmljZTtcbiAgICBwcml2YXRlIG1vZHVsZVRyZWU6IFRyZWU8TW9kdWxlPjtcbiAgICBwcml2YXRlIGxvYWRlZCA9IGZhbHNlO1xuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0PFQ+KHJvb3RNb2R1bGU6IE5ld2FibGU8VD4pIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIHN0YXJ0aW5nIHRoZSBhcHAuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkFwcEFscmVhZHlMb2FkZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ35sd35TdGFydGluZyBhcHAuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdiZWZvcmVTdGFydCcpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ35sd35TY2FubmluZyBtb2R1bGUgdHJlZS4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2JlZm9yZVNjYW4nKTtcbiAgICAgICAgdGhpcy5tb2R1bGVUcmVlID0gYXdhaXQgdGhpcy5tb2R1bGVUcmVlU2Nhbm5lci5zY2FuKHJvb3RNb2R1bGUpO1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2FmdGVyU2NhbicpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2coJ35sd35CaW5kaW5nIG1vZHVsZSBkZXBlbmRlbmNpZXMuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdiZWZvcmVCaW5kJyk7XG4gICAgICAgIGF3YWl0IHRoaXMubW9kdWxlRGVwZW5kZW5jeUJpbmRlci5iaW5kKHRoaXMubW9kdWxlVHJlZSk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYWZ0ZXJCaW5kJyk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZygnfmx3fkxvYWRpbmcgYXBwLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYmVmb3JlTG9hZCcpO1xuICAgICAgICBhd2FpdCB0aGlzLmFwcFJ1bnRpbWUuYm9vdCh0aGlzLm1vZHVsZVRyZWUpO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYWZ0ZXJMb2FkJyk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZygnfmx3fkFwcCBsb2FkZWQnKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnJ1blBsdWdpbk1ldGhvZHMoJ2FmdGVyU3RhcnQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RvcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBzdG9wcGluZyB0aGUgYXBwLicpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BcHBOb3RMb2FkZWQpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucnVuUGx1Z2luTWV0aG9kcygnYmVmb3JlU3RvcCcpO1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCd+bHd+U3RvcHBpbmcgYXBwLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwUnVudGltZS5zaHV0ZG93bih0aGlzLm1vZHVsZVRyZWUpO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nKCd+bHd+QXBwIHN0b3BwZWQnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5QbHVnaW5NZXRob2RzKCdhZnRlclN0b3AnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1blBsdWdpbk1ldGhvZHMobWV0aG9kOiBrZXlvZiBNYW5nb1BsdWdpbikge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmludGVybmFsQXBwQ29udGFpbmVyLmdldChwKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBsdWdpblttZXRob2RdKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwbHVnaW5bbWV0aG9kXSEoKSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEFQUF9FTlZJUk9NRU5ULCBJTlRFUk5BTF9BUFBfQ09OVEFJTkVSLCBNVUxUSVBMQVlFUl9TRVJWSUNFLCBQTFVHSU5TIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNYW5nb1BsdWdpbiwgTXVsdGlwbGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgQXBwRW52aXJvbWVudCB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBBcHBCdWlsZGVyIH0gZnJvbSAnLi9hcHAtYnVpbGRlcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBcHBCdWlsZGVyPFQgZXh0ZW5kcyBBcHBCdWlsZGVyPih7XG4gICAgZW52aXJvbWVudCxcbiAgICBwbHVnaW5zLFxuICAgIGFwcEJ1aWxkZXJJbmhlcml0LFxuICAgIG11bHRpcGxheWVyU2VydmljZSxcbn06IHtcbiAgICBlbnZpcm9tZW50OiBBcHBFbnZpcm9tZW50O1xuICAgIHBsdWdpbnM6IE5ld2FibGU8TWFuZ29QbHVnaW4+W107XG4gICAgYXBwQnVpbGRlckluaGVyaXQ6IE5ld2FibGU8VD47XG4gICAgbXVsdGlwbGF5ZXJTZXJ2aWNlPzogTXVsdGlwbGF5ZXJTZXJ2aWNlO1xufSkge1xuICAgIGNvbnN0IGludGVybmFsQXBwQ29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpO1xuXG4gICAgaWYgKG11bHRpcGxheWVyU2VydmljZSkgaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChNVUxUSVBMQVlFUl9TRVJWSUNFKS50b0NvbnN0YW50VmFsdWUobXVsdGlwbGF5ZXJTZXJ2aWNlKTtcbiAgICBpbnRlcm5hbEFwcENvbnRhaW5lci5iaW5kKElOVEVSTkFMX0FQUF9DT05UQUlORVIpLnRvQ29uc3RhbnRWYWx1ZShpbnRlcm5hbEFwcENvbnRhaW5lcik7XG4gICAgaW50ZXJuYWxBcHBDb250YWluZXIuYmluZChBUFBfRU5WSVJPTUVOVCkudG9Db25zdGFudFZhbHVlKGVudmlyb21lbnQpO1xuICAgIGludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoUExVR0lOUykudG9Db25zdGFudFZhbHVlKHBsdWdpbnMpO1xuICAgIGludGVybmFsQXBwQ29udGFpbmVyLmJpbmQoYXBwQnVpbGRlckluaGVyaXQpLnRvU2VsZigpLmluU2luZ2xldG9uU2NvcGUoKTtcblxuICAgIHJldHVybiBpbnRlcm5hbEFwcENvbnRhaW5lci5nZXQoYXBwQnVpbGRlckluaGVyaXQpO1xufVxuIiwgImltcG9ydCB7IGlzTmlsLCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSwgdHlwZSBFdmVudE1ldGFkYXRhLCB0eXBlIFBpcGVsaW5lTWV0YWRhdGEgfSBmcm9tICcuLi9hcHAnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnREZWNvcmF0b3IodHlwZTogRXZlbnRNZXRhZGF0YVsndHlwZSddLCBuYW1lPzogc3RyaW5nLCB3ZWJWaWV3SWQ/OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gPE1ldGhvZERlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIWlzTmlsKG5hbWUpICYmICFpc1N0cmluZyhuYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5FdmVudE5hbWVNdXN0QmVTdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmFtZSA9IG5hbWUgPz8gbWV0aG9kO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50cyA9XG4gICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhPE9taXQ8RXZlbnRNZXRhZGF0YSwgJ3BhcmFtcycgfCBrZXlvZiBQaXBlbGluZU1ldGFkYXRhPltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlckV2ZW50cywgdGFyZ2V0KSA/PyBbXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnNvbWUoKGV2ZW50KSA9PiBldmVudC5tZXRob2QgPT09IG1ldGhvZCAmJiBldmVudC5uYW1lID09PSBuYW1lICYmIGV2ZW50LnR5cGUgPT09IHR5cGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkV2ZW50TmFtZU11c3RCZVVuaXF1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE9taXQ8RXZlbnRNZXRhZGF0YSwgJ3BhcmFtcycgfCBrZXlvZiBQaXBlbGluZU1ldGFkYXRhPltdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyRXZlbnRzLFxuICAgICAgICAgICAgWy4uLmV2ZW50cywgeyBtZXRob2QsIG5hbWUsIHR5cGUsIHdlYlZpZXdJZCB9XSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVFdmVudERlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT25JbnRlcm5hbChldmVudE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVFdmVudERlY29yYXRvcignb25JbnRlcm5hbCcsIGV2ZW50TmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlRXZlbnREZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtZXZlbnQtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uV2ViVmlldyhpZDogc3RyaW5nIHwgbnVtYmVyLCBldmVudE5hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnREZWNvcmF0b3IoJ29uV2ViVmlldycsIGV2ZW50TmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLWV2ZW50LWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPbihldmVudE5hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnREZWNvcmF0b3IoJ29uJywgZXZlbnROYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVFdmVudERlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ldmVudC1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT25jZUludGVybmFsKGV2ZW50TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV2ZW50RGVjb3JhdG9yKCdvbmNlSW50ZXJuYWwnLCBldmVudE5hbWUpO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLWV2ZW50LWRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBPbmNlKGV2ZW50TmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVFdmVudERlY29yYXRvcignb25jZScsIGV2ZW50TmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlRXZlbnREZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtZXZlbnQtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uY2VXZWJWaWV3KGlkOiBzdHJpbmcgfCBudW1iZXIsIGV2ZW50TmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVFdmVudERlY29yYXRvcignb25jZVdlYlZpZXcnLCBldmVudE5hbWUsIGlkKTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNZXRob2RQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNZXRob2RQYXJhbVR5cGUgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBQaXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcblxuZXhwb3J0IGZ1bmN0aW9uIEJvZHkoLi4ucGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSkge1xuICAgIHJldHVybiA8UGFyYW1ldGVyRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZFBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwaXBlIG9mIHBpcGVzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlUGlwZShwaXBlKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRQaXBlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLCB0YXJnZXQsIG1ldGhvZCkgPz8gW107XG5cbiAgICAgICAgaWYgKHBhcmFtcy5zb21lKChwYXJhbSkgPT4gcGFyYW0uaW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5NdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZVtdPignZGVzaWduOnBhcmFtdHlwZXMnLCB0YXJnZXQsIG1ldGhvZCk7XG4gICAgICAgIGNvbnN0IG1ldGF0eXBlID0gQXJyYXkuaXNBcnJheShwYXJhbVR5cGVzKSA/IHBhcmFtVHlwZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KFxuICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsXG4gICAgICAgICAgICBbLi4ucGFyYW1zLCB7IGluZGV4LCBtZXRob2QsIHBpcGVzOiB2YWxpZGF0ZWRQaXBlcywgdHlwZTogTWV0aG9kUGFyYW1UeXBlLkJvZHksIGRhdGE6IHVuZGVmaW5lZCwgbWV0YXR5cGUgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWV0aG9kUGFyYW1UeXBlIH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgUGlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcblxuZXhwb3J0IGZ1bmN0aW9uIEluZGV4KGtleTogbnVtYmVyLCAuLi5waXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdKSB7XG4gICAgcmV0dXJuIDxQYXJhbWV0ZXJEZWNvcmF0b3I+KCh0YXJnZXQ6IE9iamVjdCwgbWV0aG9kOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCFpc051bWJlcihrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkluZGV4S2V5TXVzdEJlTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWxpZGF0ZWRQaXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGlwZSBvZiBwaXBlcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZVBpcGUocGlwZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkUGlwZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcywgdGFyZ2V0LCBtZXRob2QpID8/IFtdO1xuXG4gICAgICAgIGlmIChwYXJhbXMuc29tZSgocGFyYW0pID0+IHBhcmFtLmluZGV4ID09PSBpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGVbXT4oJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdGFyZ2V0LCBtZXRob2QpO1xuICAgICAgICBjb25zdCBtZXRhdHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1UeXBlcykgPyBwYXJhbVR5cGVzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLFxuICAgICAgICAgICAgWy4uLnBhcmFtcywgeyBpbmRleCwgbWV0aG9kLCBwaXBlczogdmFsaWRhdGVkUGlwZXMsIHR5cGU6IE1ldGhvZFBhcmFtVHlwZS5JbmRleCwgZGF0YToga2V5LCBtZXRhdHlwZSB9XSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNZXRob2RQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNZXRob2RQYXJhbVR5cGUgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWVzdCgpIHtcbiAgICByZXR1cm4gPFBhcmFtZXRlckRlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcywgdGFyZ2V0LCBtZXRob2QpID8/IFtdO1xuXG4gICAgICAgIGlmIChwYXJhbXMuc29tZSgocGFyYW0pID0+IHBhcmFtLmluZGV4ID09PSBpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGVbXT4oJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdGFyZ2V0LCBtZXRob2QpO1xuICAgICAgICBjb25zdCBtZXRhdHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1UeXBlcykgPyBwYXJhbVR5cGVzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLFxuICAgICAgICAgICAgWy4uLnBhcmFtcywgeyBpbmRleCwgbWV0aG9kLCB0eXBlOiBNZXRob2RQYXJhbVR5cGUuUmVxdWVzdCwgZGF0YTogdW5kZWZpbmVkLCBtZXRhdHlwZSB9XSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcSgpIHtcbiAgICByZXR1cm4gUmVxdWVzdCgpO1xufVxuIiwgImltcG9ydCB7IENvcmVNZXRhZGF0YUtleSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE5ld2FibGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGhvZFBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1ldGhvZFBhcmFtVHlwZSB9IGZyb20gJy4uLy4uL2FwcC9lbnVtcyc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgUGlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBQYXJhbShrZXk6IHN0cmluZywgLi4ucGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSkge1xuICAgIHJldHVybiA8UGFyYW1ldGVyRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICghaXNTdHJpbmcoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5QYXJhbUtleU11c3RCZVN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsaWRhdGVkUGlwZXM6IChOZXdhYmxlPFBpcGU+IHwgUGlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBpcGUgb2YgcGlwZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIHZhbHVlLCBlcnJvciB9ID0gdmFsaWRhdGVQaXBlKHBpcGUpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZFBpcGVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsIHRhcmdldCwgbWV0aG9kKSA/PyBbXTtcblxuICAgICAgICBpZiAocGFyYW1zLnNvbWUoKHBhcmFtKSA9PiBwYXJhbS5pbmRleCA9PT0gaW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlW10+KCdkZXNpZ246cGFyYW10eXBlcycsIHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBBcnJheS5pc0FycmF5KHBhcmFtVHlwZXMpID8gcGFyYW1UeXBlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YTxNZXRob2RQYXJhbWV0ZXJbXT4oXG4gICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcyxcbiAgICAgICAgICAgIFsuLi5wYXJhbXMsIHsgaW5kZXgsIG1ldGhvZCwgZGF0YToga2V5LCBwaXBlczogdmFsaWRhdGVkUGlwZXMsIHR5cGU6IE1ldGhvZFBhcmFtVHlwZS5QYXJhbSwgbWV0YXR5cGUgfV0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICk7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWV0aG9kUGFyYW1UeXBlIH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgTmV3YWJsZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFJlc3BvbnNlKCkge1xuICAgIHJldHVybiA8UGFyYW1ldGVyRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUGFyYW1zLCB0YXJnZXQsIG1ldGhvZCkgPz8gW107XG5cbiAgICAgICAgaWYgKHBhcmFtcy5zb21lKChwYXJhbSkgPT4gcGFyYW0uaW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5NdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZVtdPignZGVzaWduOnBhcmFtdHlwZXMnLCB0YXJnZXQsIG1ldGhvZCk7XG4gICAgICAgIGNvbnN0IG1ldGF0eXBlID0gQXJyYXkuaXNBcnJheShwYXJhbVR5cGVzKSA/IHBhcmFtVHlwZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8TWV0aG9kUGFyYW1ldGVyW10+KFxuICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJQYXJhbXMsXG4gICAgICAgICAgICBbLi4ucGFyYW1zLCB7IGluZGV4LCBtZXRob2QsIHR5cGU6IE1ldGhvZFBhcmFtVHlwZS5SZXNwb25zZSwgZGF0YTogdW5kZWZpbmVkLCBtZXRhdHlwZSB9XSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcygpIHtcbiAgICByZXR1cm4gUmVzcG9uc2UoKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEd1YXJkIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVHdWFyZCB9IGZyb20gJy4uLy4uL3NjaGVtYXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlR3VhcmRzKC4uLmd1YXJkczogKE5ld2FibGU8R3VhcmQ+IHwgR3VhcmQpW10pIHtcbiAgICByZXR1cm4gPENsYXNzRGVjb3JhdG9yICYgTWV0aG9kRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZD86IHN0cmluZywgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRHdWFyZHM6IChOZXdhYmxlPEd1YXJkPiB8IEd1YXJkKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZ3VhcmQgb2YgZ3VhcmRzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlR3VhcmQoZ3VhcmQpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhbGlkYXRlZEd1YXJkcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOaWwoZGVzY3JpcHRvcikgJiYgIWlzTmlsKGRlc2NyaXB0b3IudmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoZ3VhcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXRMZWFzdE9uZUd1YXJkUmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXRob2RHdWFyZHMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8R3VhcmQ+W10+KENvcmVNZXRhZGF0YUtleS5HdWFyZHMsIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKSB8fCBbXTtcbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQ29yZU1ldGFkYXRhS2V5Lkd1YXJkcywgWy4uLnZhbGlkYXRlZEd1YXJkcywgLi4ubWV0aG9kR3VhcmRzXSwgdGFyZ2V0LmNvbnN0cnVjdG9yLCBtZXRob2QpO1xuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ3VhcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lR3VhcmRSZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFzc0d1YXJkcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZTxHdWFyZD5bXT4oQ29yZU1ldGFkYXRhS2V5Lkd1YXJkcywgdGFyZ2V0KSB8fCBbXTtcbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShDb3JlTWV0YWRhdGFLZXkuR3VhcmRzLCBbLi4udmFsaWRhdGVkR3VhcmRzLCAuLi5jbGFzc0d1YXJkc10sIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmNlcHRvciB9IGZyb20gJy4uLy4uL2FwcC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29yZU1ldGFkYXRhS2V5IH0gZnJvbSAnLi4vLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IHZhbGlkYXRlSW50ZXJjZXB0b3IgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZUludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnM6IChOZXdhYmxlPEludGVyY2VwdG9yPiB8IEludGVyY2VwdG9yKVtdKSB7XG4gICAgcmV0dXJuIDxDbGFzc0RlY29yYXRvciAmIE1ldGhvZERlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q/OiBzdHJpbmcsIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkSW50ZXJjZXB0b3JzOiAoTmV3YWJsZTxJbnRlcmNlcHRvcj4gfCBJbnRlcmNlcHRvcilbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9yIG9mIGludGVyY2VwdG9ycykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTtcbiAgICAgICAgICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB2YWxpZGF0ZWRJbnRlcmNlcHRvcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmlsKGRlc2NyaXB0b3IpICYmICFpc05pbChkZXNjcmlwdG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLkF0TGVhc3RPbmVJbnRlcmNlcHRvclJlcXVpcmVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWV0aG9kSW50ZXJjZXB0b3JzID1cbiAgICAgICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhPE5ld2FibGU8SW50ZXJjZXB0b3I+W10+KENvcmVNZXRhZGF0YUtleS5JbnRlcmNlcHRvcnMsIHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kKSB8fCBbXTtcbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgICAgICAgICAgQ29yZU1ldGFkYXRhS2V5LkludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgICBbLi4udmFsaWRhdGVkSW50ZXJjZXB0b3JzLCAuLi5tZXRob2RJbnRlcmNlcHRvcnNdLFxuICAgICAgICAgICAgICAgIHRhcmdldC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5BdExlYXN0T25lSW50ZXJjZXB0b3JSZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFzc0ludGVyY2VwdG9ycyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8TmV3YWJsZTxJbnRlcmNlcHRvcj5bXT4oQ29yZU1ldGFkYXRhS2V5LkludGVyY2VwdG9ycywgdGFyZ2V0KSB8fCBbXTtcbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShDb3JlTWV0YWRhdGFLZXkuSW50ZXJjZXB0b3JzLCBbLi4udmFsaWRhdGVkSW50ZXJjZXB0b3JzLCAuLi5jbGFzc0ludGVyY2VwdG9yc10sIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi8uLi9hcHAvZW51bXMnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBQaXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9zY2hlbWFzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZVBpcGVzKC4uLnBpcGVzOiAoTmV3YWJsZTxQaXBlPiB8IFBpcGUpW10pIHtcbiAgICByZXR1cm4gPENsYXNzRGVjb3JhdG9yICYgTWV0aG9kRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZD86IHN0cmluZywgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRQaXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGlwZSBvZiBwaXBlcykge1xuICAgICAgICAgICAgY29uc3QgeyB2YWxpZCwgdmFsdWUsIGVycm9yIH0gPSB2YWxpZGF0ZVBpcGUocGlwZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdmFsaWRhdGVkUGlwZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmlsKGRlc2NyaXB0b3IpICYmICFpc05pbChkZXNjcmlwdG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHBpcGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXRMZWFzdE9uZVBpcGVSZXF1aXJlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZFBpcGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPFBpcGU+W10+KENvcmVNZXRhZGF0YUtleS5QaXBlcywgdGFyZ2V0LmNvbnN0cnVjdG9yLCBtZXRob2QpIHx8IFtdO1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShDb3JlTWV0YWRhdGFLZXkuUGlwZXMsIFsuLi52YWxpZGF0ZWRQaXBlcywgLi4ubWV0aG9kUGlwZXNdLCB0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZCk7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwaXBlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuQXRMZWFzdE9uZVBpcGVSZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFzc1BpcGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlPFBpcGU+W10+KENvcmVNZXRhZGF0YUtleS5QaXBlcywgdGFyZ2V0KSB8fCBbXTtcbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShDb3JlTWV0YWRhdGFLZXkuUGlwZXMsIFsuLi52YWxpZGF0ZWRQaXBlcywgLi4uY2xhc3NQaXBlc10sIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHsgaXNOaWwsIGlzTnVtYmVyLCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IENvcmVNZXRhZGF0YUtleSwgdHlwZSBQaXBlbGluZU1ldGFkYXRhLCB0eXBlIFJQQ01ldGFkYXRhIH0gZnJvbSAnLi4vYXBwJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJQQ0RlY29yYXRvcih0eXBlOiBSUENNZXRhZGF0YVsndHlwZSddLCBuYW1lPzogc3RyaW5nLCB3ZWJWaWV3SWQ/OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gPE1ldGhvZERlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIWlzTmlsKHdlYlZpZXdJZCkgJiYgIWlzU3RyaW5nKHdlYlZpZXdJZCkgJiYgIWlzTnVtYmVyKHdlYlZpZXdJZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuV2ViVmlld0lkTXVzdEJlU3RyaW5nT3JOdW1iZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05pbChuYW1lKSAmJiAhaXNTdHJpbmcobmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuUlBDTmFtZU11c3RCZVN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBuYW1lID0gbmFtZSA/PyBtZXRob2Q7XG5cbiAgICAgICAgY29uc3QgcnBjcyA9XG4gICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhPE9taXQ8UlBDTWV0YWRhdGEsICdwYXJhbXMnIHwga2V5b2YgUGlwZWxpbmVNZXRhZGF0YT5bXT4oQ29yZU1ldGFkYXRhS2V5LkNvbnRyb2xsZXJSUENzLCB0YXJnZXQpID8/IFtdO1xuXG4gICAgICAgIGlmIChycGNzLnNvbWUoKHJwYykgPT4gcnBjLm1ldGhvZCA9PT0gbWV0aG9kICYmIHJwYy5uYW1lID09PSBuYW1lICYmIHJwYy50eXBlID09PSB0eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5SUENOYW1lTXVzdEJlVW5pcXVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8T21pdDxSUENNZXRhZGF0YSwgJ3BhcmFtcycgfCBrZXlvZiBQaXBlbGluZU1ldGFkYXRhPltdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5Db250cm9sbGVyUlBDcyxcbiAgICAgICAgICAgIFsuLi5ycGNzLCB7IG1ldGhvZCwgbmFtZSwgdHlwZSwgd2ViVmlld0lkIH1dLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICApO1xuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZVJQQ0RlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS1ycGMtZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIE9uUmVxdWVzdChycGNOYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJQQ0RlY29yYXRvcignb25SZXF1ZXN0JywgcnBjTmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlUlBDRGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLXJwYy1kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gT25XZWJWaWV3UmVxdWVzdChpZDogc3RyaW5nIHwgbnVtYmVyLCBycGNOYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJQQ0RlY29yYXRvcignb25XZWJWaWV3UmVxdWVzdCcsIHJwY05hbWUsIGlkKTtcbn1cbiIsICJpbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXksIHR5cGUgVGltZXJNZXRhZGF0YSB9IGZyb20gJy4uL2FwcCc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgeyBpc05pbCwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUaW1lckRlY29yYXRvcih0eXBlOiBUaW1lck1ldGFkYXRhWyd0eXBlJ10sIG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBUaW1lck1ldGFkYXRhWydvcHRpb25zJ10pIHtcbiAgICByZXR1cm4gPE1ldGhvZERlY29yYXRvcj4oKHRhcmdldDogT2JqZWN0LCBtZXRob2Q6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIWlzTmlsKG5hbWUpICYmICFpc1N0cmluZyhuYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5UaW1lck5hbWVNdXN0QmVTdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmFtZSA9IG5hbWUgPz8gbWV0aG9kO1xuXG4gICAgICAgIGNvbnN0IHRpbWVycyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGE8VGltZXJNZXRhZGF0YVtdPihDb3JlTWV0YWRhdGFLZXkuVGltZXJzLCB0YXJnZXQpID8/IFtdO1xuXG4gICAgICAgIGlmICh0aW1lcnMuc29tZSgodGltZXIpID0+IHRpbWVyLm1ldGhvZCA9PT0gbWV0aG9kICYmIHRpbWVyLm5hbWUgPT09IG5hbWUgJiYgdGltZXIudHlwZSA9PT0gdHlwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuRXZlbnROYW1lTXVzdEJlVW5pcXVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGE8VGltZXJNZXRhZGF0YVtdPihcbiAgICAgICAgICAgIENvcmVNZXRhZGF0YUtleS5UaW1lcnMsXG4gICAgICAgICAgICBbLi4udGltZXJzLCA8VGltZXJNZXRhZGF0YT57IG1ldGhvZCwgbmFtZSwgdHlwZSwgb3B0aW9ucyB9XSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENyb25PcHRpb25zIH0gZnJvbSAnY3JvbmVyJztcbmltcG9ydCB7IGNyZWF0ZVRpbWVyRGVjb3JhdG9yIH0gZnJvbSAnLi4vY3JlYXRlLXRpbWVyLmRlY29yYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBDcm9uKHBhdHRlcm46IHN0cmluZyB8IERhdGUsIG9wdGlvbnM6IENyb25PcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gY3JlYXRlVGltZXJEZWNvcmF0b3IoJ2Nyb24nLCBvcHRpb25zLm5hbWUsIHsgcGF0dGVybiwgLi4ub3B0aW9ucyB9KTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVUaW1lckRlY29yYXRvciB9IGZyb20gJy4uL2NyZWF0ZS10aW1lci5kZWNvcmF0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gRXZlcnlUaWNrKG5hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlVGltZXJEZWNvcmF0b3IoJ2V2ZXJ5dGljaycsIG5hbWUpO1xufVxuIiwgImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlVGltZXJEZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtdGltZXIuZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIEludGVydmFsKHRpbWVvdXQ6IG51bWJlcik6IE1ldGhvZERlY29yYXRvcjtcbmV4cG9ydCBmdW5jdGlvbiBJbnRlcnZhbChuYW1lOiBzdHJpbmcsIHRpbWVvdXQ6IG51bWJlcik6IE1ldGhvZERlY29yYXRvcjtcbmV4cG9ydCBmdW5jdGlvbiBJbnRlcnZhbChuYW1lT3JUaW1lb3V0OiBzdHJpbmcgfCBudW1iZXIsIHRpbWVvdXQ/OiBudW1iZXIpOiBNZXRob2REZWNvcmF0b3Ige1xuICAgIGNvbnN0IFtuYW1lLCBpbnRlcnZhbFRpbWVvdXRdID0gaXNTdHJpbmcobmFtZU9yVGltZW91dCkgPyBbbmFtZU9yVGltZW91dCwgdGltZW91dF0gOiBbdW5kZWZpbmVkLCBuYW1lT3JUaW1lb3V0XTtcbiAgICByZXR1cm4gY3JlYXRlVGltZXJEZWNvcmF0b3IoJ2ludGVydmFsJywgbmFtZSwgeyB0aW1lb3V0OiBpbnRlcnZhbFRpbWVvdXQhIH0pO1xufVxuIiwgImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlVGltZXJEZWNvcmF0b3IgfSBmcm9tICcuLi9jcmVhdGUtdGltZXIuZGVjb3JhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVvdXQodGltZW91dDogbnVtYmVyKTogTWV0aG9kRGVjb3JhdG9yO1xuZXhwb3J0IGZ1bmN0aW9uIFRpbWVvdXQobmFtZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogTWV0aG9kRGVjb3JhdG9yO1xuZXhwb3J0IGZ1bmN0aW9uIFRpbWVvdXQobmFtZU9yVGltZW91dDogc3RyaW5nIHwgbnVtYmVyLCB0aW1lb3V0PzogbnVtYmVyKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICBjb25zdCBbbmFtZSwgaW50ZXJ2YWxUaW1lb3V0XSA9IGlzU3RyaW5nKG5hbWVPclRpbWVvdXQpID8gW25hbWVPclRpbWVvdXQsIHRpbWVvdXRdIDogW3VuZGVmaW5lZCwgbmFtZU9yVGltZW91dF07XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVyRGVjb3JhdG9yKCd0aW1lb3V0JywgbmFtZSwgeyB0aW1lb3V0OiBpbnRlcnZhbFRpbWVvdXQhIH0pO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBhcHBseURlY29yYXRvcnMoLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IpW10pIHtcbiAgICByZXR1cm4gPFRGdW5jdGlvbiBleHRlbmRzIEZ1bmN0aW9uLCBZPihcbiAgICAgICAgdGFyZ2V0OiBURnVuY3Rpb24gfCBPYmplY3QsXG4gICAgICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgIGRlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPFk+LFxuICAgICkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgICAgICAoPENsYXNzRGVjb3JhdG9yPmRlY29yYXRvcikodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICg8TWV0aG9kRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3I+ZGVjb3JhdG9yKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0LCBNZXRob2RQYXJhbWV0ZXIgfSBmcm9tICcuLi9hcHAvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb3JlTWV0YWRhdGFLZXkgfSBmcm9tICcuLi9hcHAvZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBOZXdhYmxlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgTWV0aG9kUGFyYW1UeXBlIH0gZnJvbSAnLi4vYXBwL2VudW1zJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgUGlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQaXBlIH0gZnJvbSAnLi4vc2NoZW1hcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUSW5wdXQgPSB1bmtub3duLCBUT3V0cHV0ID0gdW5rbm93bj4oZmFjdG9yeTogKGRhdGE6IFRJbnB1dCwgY3R4OiBFeGVjdXRpb25Db250ZXh0KSA9PiBUT3V0cHV0KSB7XG4gICAgcmV0dXJuIDxUSW5wdXQgPSB1bmtub3duPihkYXRhPzogVElucHV0LCAuLi5waXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdKSA9PiB7XG4gICAgICAgIHJldHVybiA8UGFyYW1ldGVyRGVjb3JhdG9yPigodGFyZ2V0OiBPYmplY3QsIG1ldGhvZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRQaXBlczogKE5ld2FibGU8UGlwZT4gfCBQaXBlKVtdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBpcGUgb2YgcGlwZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHZhbGlkLCB2YWx1ZSwgZXJyb3IgfSA9IHZhbGlkYXRlUGlwZShwaXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBpcGVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcywgdGFyZ2V0LCBtZXRob2QpID8/IFtdO1xuXG4gICAgICAgICAgICBpZiAocGFyYW1zLnNvbWUoKHBhcmFtKSA9PiBwYXJhbS5pbmRleCA9PT0gaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVycm9yTWVzc2FnZS5NdWx0aXBsZURlY29yYXRvcnNPblNpbmdsZVBhcmFtZXRlck5vdEFsbG93ZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJhbVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YTxOZXdhYmxlW10+KCdkZXNpZ246cGFyYW10eXBlcycsIHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF0eXBlID0gQXJyYXkuaXNBcnJheShwYXJhbVR5cGVzKSA/IHBhcmFtVHlwZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhPE1ldGhvZFBhcmFtZXRlcltdPihcbiAgICAgICAgICAgICAgICBDb3JlTWV0YWRhdGFLZXkuQ29udHJvbGxlclBhcmFtcyxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaXBlczogdmFsaWRhdGVkUGlwZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRob2RQYXJhbVR5cGUuQ3VzdG9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeTogPChkYXRhOiB1bmtub3duLCBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0KSA9PiB1bmtub3duPmZhY3RvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXR5cGUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBMYXp5U2VydmljZUlkZW50aWZlciwgdHlwZSBpbnRlcmZhY2VzIH0gZnJvbSAnaW52ZXJzaWZ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmRSZWY8VCA9IHVua25vd24+KGZuOiAoKSA9PiBpbnRlcmZhY2VzLlNlcnZpY2VJZGVudGlmaWVyPFQ+KSB7XG4gICAgcmV0dXJuIG5ldyBMYXp5U2VydmljZUlkZW50aWZlcjxUPihmbik7XG59XG4iLCAiaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ3JvbiwgdHlwZSBDcm9uT3B0aW9ucyB9IGZyb20gJ2Nyb25lcic7XG5pbXBvcnQgeyBNVUxUSVBMQVlFUl9TRVJWSUNFLCB0eXBlIE11bHRpcGxheWVyU2VydmljZSwgdHlwZSBNdWx0aXBsYXllclRpbWVyIH0gZnJvbSAnLi4vYXBwJztcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRpbWVyU2VydmljZSB7XG4gICAgQGluamVjdChNVUxUSVBMQVlFUl9TRVJWSUNFKSBwcml2YXRlIHJlYWRvbmx5IG11bHRpcGxheWVyU2VydmljZTogTXVsdGlwbGF5ZXJTZXJ2aWNlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgJGV2ZXJ5dGlja3MgPSBuZXcgTWFwPHN0cmluZywgTXVsdGlwbGF5ZXJUaW1lcj4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5ICRpbnRlcnZhbHMgPSBuZXcgTWFwPHN0cmluZywgTXVsdGlwbGF5ZXJUaW1lcj4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5ICR0aW1lb3V0cyA9IG5ldyBNYXA8c3RyaW5nLCBNdWx0aXBsYXllclRpbWVyPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgJGNyb25zID0gbmV3IE1hcDxzdHJpbmcsIENyb24+KCk7XG5cbiAgICBwdWJsaWMgZ2V0IGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy5hbGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBldmVyeXRpY2tzKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuJGV2ZXJ5dGlja3MudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaW50ZXJ2YWxzKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuJGludGVydmFscy52YWx1ZXMoKV07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aW1lb3V0cygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLiR0aW1lb3V0cy52YWx1ZXMoKV07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjcm9ucygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLiRjcm9ucy52YWx1ZXMoKV07XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB3YXJuaW5nVGhyZXNob2xkKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLndhcm5pbmdUaHJlc2hvbGQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHdhcm5pbmdUaHJlc2hvbGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMud2FybmluZ1RocmVzaG9sZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuc291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy5zb3VyY2VMb2NhdGlvbkZyYW1lU2tpcENvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVDcm9uSm9iKGNhbGxiYWNrOiBGdW5jdGlvbiwgb3B0aW9uczogQ3Jvbk9wdGlvbnMgJiB7IHBhdHRlcm46IHN0cmluZyB8IERhdGUgfSkge1xuICAgICAgICBjb25zdCB7IHBhdHRlcm4sIC4uLmNyb25PcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGNvbnN0IGNyb24gPSBDcm9uKHBhdHRlcm4sIGNyb25PcHRpb25zLCBjYWxsYmFjayk7XG4gICAgICAgIGlmIChpc1N0cmluZyhvcHRpb25zLm5hbWUpKSB0aGlzLiRjcm9ucy5zZXQob3B0aW9ucy5uYW1lLCBjcm9uKTtcblxuICAgICAgICByZXR1cm4gY3JvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlSW50ZXJ2YWwoY2FsbGJhY2s6IEZ1bmN0aW9uLCBpbnRlcnZhbDogbnVtYmVyLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLnNldEludGVydmFsKGNhbGxiYWNrLCBpbnRlcnZhbCk7XG4gICAgICAgIGlmIChpc1N0cmluZyhuYW1lKSkgdGhpcy4kaW50ZXJ2YWxzLnNldChuYW1lLCB0aW1lcik7XG4gICAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlVGltZW91dChjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlciwgbmFtZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy5zZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0KTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKG5hbWUpKSB0aGlzLiR0aW1lb3V0cy5zZXQobmFtZSwgdGltZXIpO1xuICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUV2ZXJ5VGljayhjYWxsYmFjazogRnVuY3Rpb24sIG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLm11bHRpcGxheWVyU2VydmljZS5UaW1lcnMuZXZlcnlUaWNrKGNhbGxiYWNrKTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKG5hbWUpKSB0aGlzLiRldmVyeXRpY2tzLnNldChuYW1lLCB0aW1lcik7XG4gICAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKHR5cGU6ICdjcm9uJyB8ICdldmVyeXRpY2snIHwgJ3RpbWVvdXQnIHwgJ2ludGVydmFsJywgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY3Jvbic6XG4gICAgICAgICAgICAgICAgY29uc3QgY3JvbkpvYiA9IHRoaXMuJGNyb25zLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoY3JvbkpvYikge1xuICAgICAgICAgICAgICAgICAgICBjcm9uSm9iLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kY3JvbnMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2V2ZXJ5dGljayc6XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlcnl0aWNrID0gdGhpcy4kZXZlcnl0aWNrcy5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZXJ5dGljaykge1xuICAgICAgICAgICAgICAgICAgICBldmVyeXRpY2suZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRldmVyeXRpY2tzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpbnRlcnZhbCc6XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLiRpbnRlcnZhbHMuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGludGVydmFscy5kZWxldGUobmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndGltZW91dCc6XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHRoaXMuJHRpbWVvdXRzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kdGltZW91dHMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCeU5hbWUodHlwZTogJ2Nyb24nIHwgJ2V2ZXJ5dGljaycgfCAndGltZW91dCcgfCAnaW50ZXJ2YWwnLCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjcm9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kY3JvbnMuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgY2FzZSAnZXZlcnl0aWNrJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZXZlcnl0aWNrcy5nZXQobmFtZSk7XG4gICAgICAgICAgICBjYXNlICdpbnRlcnZhbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGludGVydmFscy5nZXQobmFtZSk7XG4gICAgICAgICAgICBjYXNlICd0aW1lb3V0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kdGltZW91dHMuZ2V0KG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEJ5SWQoaWQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsYXllclNlcnZpY2UuVGltZXJzLmdldEJ5SUQoaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0aW1lKG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy50aW1lKG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0aW1lRW5kKG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGF5ZXJTZXJ2aWNlLlRpbWVycy50aW1lRW5kKG5hbWUpO1xuICAgIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEs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QUFPaUMsSUFBSWQsSUFBQUE7TUFDM0IsS0FBSztBQUNELGVBQU8sS0FBS3ZCLFlBQVlxQyxJQUFJZCxJQUFBQTtNQUNoQyxLQUFLO0FBQ0QsZUFBTyxLQUFLckIsV0FBV21DLElBQUlkLElBQUFBO01BQy9CLEtBQUs7QUFDRCxlQUFPLEtBQUtwQixVQUFVa0MsSUFBSWQsSUFBQUE7SUFDbEM7RUFDSjtFQUVPbUIsUUFBUUMsSUFBWTtBQUN2QixXQUFPLEtBQUs1QyxtQkFBbUJPLE9BQU9zQyxRQUFRRCxFQUFBQTtFQUNsRDtFQUVPRSxLQUFLdEIsTUFBZTtBQUN2QixXQUFPLEtBQUt4QixtQkFBbUJPLE9BQU91QyxLQUFLdEIsSUFBQUE7RUFDL0M7RUFFT3VCLFFBQVF2QixNQUFlO0FBQzFCLFdBQU8sS0FBS3hCLG1CQUFtQk8sT0FBT3dDLFFBQVF2QixJQUFBQTtFQUNsRDtBQUNKOzs7Ozs7OzsiLAogICJuYW1lcyI6IFsiaW5qZWN0YWJsZSIsICJpbmplY3RhYmxlIiwgIkNvbnRyb2xsZXIiLCAib3B0aW9ucyIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJoYXNNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkR1cGxpY2F0ZURlY29yYXRvclVzYWdlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlQ29udHJvbGxlck9wdGlvbnMiLCAiZGVmaW5lTWV0YWRhdGEiLCAiaW5qZWN0YWJsZSIsICJHbG9iYWwiLCAidGFyZ2V0IiwgIlJlZmxlY3QiLCAiZGVmaW5lTWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkdsb2JhbE1vZHVsZSIsICJpbmplY3QiLCAiSW5qZWN0IiwgImtleSIsICJ0YXJnZXQiLCAicHJvcGVydHlLZXkiLCAicGFyYW1JbmRleCIsICJpc05pbCIsICJ2YWxpZGF0ZUluamVjdGlvblRva2VuIiwgInZhbGlkIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJJbnZhbGlkSW5qZWN0aW9uVG9rZW5TcGVjaWZpZWQiLCAidG9rZW4iLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJJbmplY3Rpb25Ub2tlbk5vdEZvdW5kIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIkluamVjdGFibGUiLCAib3B0aW9ucyIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJoYXNNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkR1cGxpY2F0ZURlY29yYXRvclVzYWdlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlSW5qZWN0YWJsZU1ldGFkYXRhIiwgImRlZmluZU1ldGFkYXRhIiwgImluamVjdGFibGUiLCAiaW5qZWN0YWJsZSIsICJNb2R1bGUiLCAib3B0aW9ucyIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJoYXNNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkR1cGxpY2F0ZURlY29yYXRvclVzYWdlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlTW9kdWxlT3B0aW9ucyIsICJkZWZpbmVNZXRhZGF0YSIsICJpbmplY3RhYmxlIiwgIm9wdGlvbmFsIiwgIk9wdGlvbmFsIiwgInRhcmdldCIsICJwcm9wZXJ0eUtleSIsICJwYXJhbUluZGV4IiwgIm9wdGlvbmFsIiwgIlNldE1ldGFkYXRhIiwgImtleSIsICJ2YWx1ZSIsICJkZWNvcmF0b3JGYWN0b3J5IiwgInRhcmdldCIsICJfbWV0aG9kIiwgImRlc2NyaXB0b3IiLCAiUmVmbGVjdCIsICJkZWZpbmVNZXRhZGF0YSIsICJLRVkiLCAiQ2F0Y2giLCAiZXhjZXB0aW9ucyIsICJ0YXJnZXQiLCAiUmVmbGVjdCIsICJoYXNNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIkR1cGxpY2F0ZURlY29yYXRvclVzYWdlIiwgImR1cGxpY2F0ZXMiLCAiZmlsdGVyIiwgImV4Y2VwdGlvbiIsICJpbmRleCIsICJpbmRleE9mIiwgImxlbmd0aCIsICJFeGNlcHRpb25IYW5kbGluZ0NvbmZsaWN0IiwgImRlZmluZU1ldGFkYXRhIiwgIlVzZUZpbHRlcnMiLCAiZmlsdGVycyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImRlc2NyaXB0b3IiLCAidmFsaWRhdGVkRmlsdGVycyIsICJmaWx0ZXIiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVFcnJvckZpbHRlciIsICJFcnJvciIsICJwdXNoIiwgImlzTmlsIiwgImxlbmd0aCIsICJFcnJvck1lc3NhZ2UiLCAiQXRMZWFzdE9uZUZpbHRlclJlcXVpcmVkIiwgIm1ldGhvZEZpbHRlcnMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiRXJyb3JGaWx0ZXJzIiwgImZpbmQiLCAiaW5jbHVkZXMiLCAiRHVwbGljYXRlRXJyb3JGaWx0ZXJEZXRlY3RlZCIsICJkZWZpbmVNZXRhZGF0YSIsICJjbGFzc0ZpbHRlcnMiLCAiaW5qZWN0IiwgImluamVjdGFibGUiLCAib3B0aW9uYWwiLCAiQXBwUnVudGltZSIsICJldmVudEhhbmRsZXIiLCAicnBjSGFuZGxlciIsICJnbG9iYWxHdWFyZHMiLCAiZ2xvYmFsSW50ZXJjZXB0b3JzIiwgImdsb2JhbFBpcGVzIiwgImdsb2JhbEVycm9yRmlsdGVycyIsICJsb2dnZXJTZXJ2aWNlIiwgImVuYWJsZVNodXRkb3duSG9va3MiLCAiYm9vdCIsICJyZXNvbHZlZFRyZWUiLCAiYXN5bmNUcmF2ZXJzZSIsICJub2RlIiwgInN0YXJ0VGltZSIsICJEYXRlIiwgIm5vdyIsICJtb2R1bGUiLCAidmFsdWUiLCAiaW5zdGFuY2UiLCAiY29udGFpbmVyIiwgImdldCIsICJtZXRhZGF0YSIsICJjbGFzc1JlZiIsICJjb250cm9sbGVycyIsICJmb3JFYWNoIiwgImNvbnRyb2xsZXIiLCAiaW50ZXJuYWxQcm92aWRlcnMiLCAiZXh0ZXJuYWxQcm92aWRlcnMiLCAidG9rZW4iLCAibG9nIiwgIm5hbWUiLCAicnVuTGlmZWN5Y2xlTWV0aG9kIiwgInJ1bkxpZmVjeWNsZU1ldGhvZHMiLCAidHJhdmVyc2UiLCAidGltZSIsICJyZWdpc3RlclRpbWVycyIsICJyZWdpc3Rlckxpc3RlbmVycyIsICJzaHV0ZG93biIsICJ0aW1lclNlcnZpY2UiLCAib3duZXIiLCAiVElNRVJfU0VSVklDRSIsICJldmVyeXRpY2tzIiwgInRpbWVyIiwgImRlc3Ryb3kiLCAiaW50ZXJ2YWxzIiwgInRpbWVvdXRzIiwgImNyb25zIiwgImNyb24iLCAic3RvcCIsICJldmVudEhhbmRsZXJzIiwgImhhbmRsZXIiLCAicnBjSGFuZGxlcnMiLCAiZXZlbnRzIiwgImV2ZW50IiwgImd1YXJkcyIsICJpbnRlcmNlcHRvcnMiLCAicGlwZXMiLCAibWFwcGVkRXJyb3JGaWx0ZXJzIiwgIm1hcEVycm9yRmlsdGVycyIsICJlcnJvckZpbHRlcnMiLCAicmVnaXN0ZXJFdmVudCIsICJwdXNoIiwgInJwY3MiLCAicnBjIiwgInJlZ2lzdGVyUlBDIiwgInRpbWVycyIsICJ0eXBlIiwgImNyZWF0ZUNyb25Kb2IiLCAibWV0aG9kIiwgImJpbmQiLCAib3B0aW9ucyIsICJjcmVhdGVFdmVyeVRpY2siLCAiY3JlYXRlSW50ZXJ2YWwiLCAidGltZW91dCIsICJjcmVhdGVUaW1lb3V0IiwgImZpbHRlck1hcCIsICJmaWx0ZXIiLCAiZXJyb3JzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNhdGNoIiwgImxlbmd0aCIsICJlcnJvciIsICJpc05pbCIsICJmaW5kIiwgImZpbHRlckVycm9yIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJFcnJvckFscmVhZHlIYW5kbGVkQnlGaWx0ZXIiLCAiUHJvbWlzZSIsICJhbGwiLCAibWFwIiwgImlzT2JqZWN0IiwgInByb3ZpZGVySW5zdGFuY2UiLCAiQ29udGFpbmVyIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIm9wdGlvbmFsIiwgIk1vZHVsZURlcGVuZGVuY3lCaW5kZXIiLCAiZ2xvYmFsQXBwQ29udGFpbmVyIiwgImxvZ2dlclNlcnZpY2UiLCAiY29udGFpbmVyT3B0aW9ucyIsICJiaW5kIiwgInJlc29sdmVkVHJlZSIsICJhc3luY1RyYXZlcnNlIiwgIm5vZGUiLCAic3RhcnRUaW1lIiwgIkRhdGUiLCAibm93IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJjb250YWluZXIiLCAiTW9kdWxlQ29udGFpbmVyIiwgIm1ldGFkYXRhIiwgInBhcmVudCIsICJjbGFzc1JlZiIsICJ0b1NlbGYiLCAiaW5TaW5nbGV0b25TY29wZSIsICJnbG9iYWwiLCAiXyIsICJwcm92aWRlciIsICJleHRlcm5hbFByb3ZpZGVycyIsICJiaW5kUHJvdmlkZXIiLCAidG9rZW4iLCAidG9EeW5hbWljVmFsdWUiLCAiZ2V0IiwgImltcG9ydE1vZHVsZSIsICJyZXBldGl0aXZlSW1wb3J0cyIsICJpbnRlcm5hbFByb3ZpZGVycyIsICJNT0RVTEVfQ09OVEFJTkVSIiwgInRvQ29uc3RhbnRWYWx1ZSIsICJjb250cm9sbGVycyIsICJUSU1FUl9TRVJWSUNFIiwgInRvIiwgIlRpbWVyU2VydmljZSIsICJsb2ciLCAibmFtZSIsICJwcm92aWRlIiwgInVzZVZhbHVlIiwgImJpbmRpbmciLCAiY3R4IiwgImRlcHMiLCAiaW5qZWN0IiwgIm1hcCIsICJkZXAiLCAiaXNPYmplY3QiLCAiZXJyIiwgIm9wdGlvbmFsIiwgInVuZGVmaW5lZCIsICJlcnJvciIsICJ1c2VGYWN0b3J5IiwgInNjb3BlIiwgImluVHJhbnNpZW50U2NvcGUiLCAiaW5SZXF1ZXN0U2NvcGUiLCAidXNlQ2xhc3MiLCAidG9TZXJ2aWNlIiwgInVzZUV4aXN0aW5nIiwgImluamVjdCIsICJpbmplY3RhYmxlIiwgIk1vZHVsZVRyZWVTY2FubmVyIiwgIm1vZHVsZU1ldGFkYXRhUmVhZGVyIiwgImNvbnRyb2xsZXJNZXRhZGF0YVJlYWRlciIsICJsb2dnZXJTZXJ2aWNlIiwgInNjYW4iLCAiY2xhc3NSZWYiLCAic3RhcnRUaW1lIiwgIkRhdGUiLCAibm93IiwgIm1vZHVsZU1ldGFkYXRhIiwgInJlYWQiLCAibW9kdWxlIiwgIk1vZHVsZSIsICJtZXRhZGF0YSIsICJsb2ciLCAibmFtZSIsICJzY2FuQ29udHJvbGxlcnMiLCAibW9kdWxlVHJlZSIsICJUcmVlIiwgInNjYW5uZWRNb2R1bGVzIiwgIk1hcCIsICJzZXQiLCAiaW1wb3J0ZWRNb2R1bGUiLCAiaW1wb3J0cyIsICJzY2FuTW9kdWxlcyIsICJyb290IiwgInBhcmVudE5vZGUiLCAic2Nhbm5lZE1vZHVsZSIsICJnZXQiLCAiaXNOaWwiLCAidmFsdWUiLCAicmVwZXRpdGl2ZUltcG9ydHMiLCAiYWRkIiwgImNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5IiwgInBhcmVudCIsICJ0cmVlTm9kZSIsICJUcmVlTm9kZSIsICJhZGRDaGlsZCIsICJpbXBvcnRNb2R1bGUiLCAiY29udHJvbGxlcnMiLCAiY29udHJvbGxlck1ldGFkYXRhIiwgImNvbnRyb2xsZXIiLCAiQ29udHJvbGxlciIsICJvd25lciIsICJwdXNoIiwgInBhcmVudE1ldGFkYXRhIiwgImluY2x1ZGVzIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJDaXJjdWxhckRlcGVuZGVuY3lEZXRlY3RlZCIsICJSYWdlTVBTY3JpcHRFdmVudCIsICJldmVudE5hbWUiLCAibGlzdGVuZXIiLCAiZGVzdHJveSIsICJtcCIsICJldmVudHMiLCAicmVtb3ZlIiwgIlJhZ2VNUEV2ZW50RW1taXRlciIsICJtYXBFdmVudHNTaGFyZWQiLCAibWFwRXZlbnRzIiwgImdldEV2ZW50TmFtZSIsICJldmVudE5hbWUiLCAiZW1pdCIsICJhcmdzIiwgIm1wIiwgImV2ZW50cyIsICJjYWxsIiwgIm9uIiwgImxpc3RlbmVyIiwgIm1hcHBlZEV2ZW50TmFtZSIsICJhZGQiLCAiUmFnZU1QU2NyaXB0RXZlbnQiLCAib25jZSIsICJvbmNlV3JhcHBlciIsICJyZW1vdmUiLCAib2ZmIiwgIlJhZ2VNUFRpbWVyIiwgImxhc3RUaWNrIiwgIkRhdGUiLCAibm93IiwgImlkIiwgImludGVydmFsIiwgIm9uY2UiLCAiY2FsbGJhY2siLCAiY2xlYXJUaW1lciIsICJkZXN0cm95IiwgIlJhZ2VNUFRpbWVycyIsICJ0aW1lckluY3JlbWVudGVyIiwgInRpbWVycyIsICJNYXAiLCAiZXZlcnlUaWNrSGFuZGxlcnMiLCAiaXNFdmVyeVRpY2tSdW5uaW5nIiwgImV2ZXJ5VGlja01haW5IYW5kbGVyIiwgImFsbCIsICJ2YWx1ZXMiLCAid2FybmluZ1RocmVzaG9sZCIsICJfdmFsdWUiLCAic291cmNlTG9jYXRpb25GcmFtZVNraXBDb3VudCIsICJnZXRCeUlEIiwgImlkIiwgInRpbWVyIiwgImdldCIsICJjcmVhdGVUaW1lciIsICJjbGVhciIsICJjYWxsYmFjayIsICJpbnRlcnZhbCIsICJvbmNlIiwgImFyZ3MiLCAiY2FsbGJhY2tCaW5kIiwgImJpbmQiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ0aW1lcklkIiwgInJhZ2VNUFRpbWVyIiwgIlJhZ2VNUFRpbWVyIiwgImRlbGV0ZSIsICJzZXQiLCAic2V0SW50ZXJ2YWwiLCAidGltZSIsICJjYiIsICJjbGVhckludGVydmFsIiwgInNldFRpbWVvdXQiLCAiY2xlYXJUaW1lb3V0IiwgImV2ZXJ5VGljayIsICJib3VuZCIsICJpc0NsaWVudFNpZGUiLCAibXAiLCAiYnJvd3NlcnMiLCAiaGFuZGxlciIsICJlIiwgImNvbnNvbGUiLCAibG9nRXJyb3IiLCAiZXZlbnRzIiwgImFkZCIsICJpbnRlcnZhbEhhbmRsZXIiLCAiX2V2ZXJ5VGlja0ludGVydmFsIiwgInNpemUiLCAicmVtb3ZlIiwgIm5leHRUaWNrIiwgIl9uYW1lIiwgInRpbWVFbmQiLCAiUmFnZU1QTXVsdGlwbGF5ZXJTZXJ2aWNlIiwgIlRpbWVycyIsICJFdmVudHMiLCAiUmFnZU1QRXZlbnRFbW1pdGVyIiwgIlJhZ2VNUFRpbWVycyIsICJwYXJzZUludGVybmFsQXJncyIsICJhcmdzIiwgInBsYXllciIsICJpc09iamVjdCIsICJ1bmRlZmluZWQiLCAiYm9keSIsICJsb2ciLCAiYXJnIiwgIm1lc3NhZ2UiLCAibWFwIiwgImEiLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAiU3RyaW5nIiwgImpvaW4iLCAibXAiLCAiY29uc29sZSIsICJsb2dJbmZvIiwgImxvZ0Vycm9yIiwgImxvZ1dhcm5pbmciLCAibG9nRGVidWciLCAiaW5qZWN0IiwgIkNvbnRhaW5lciIsICJpbmplY3RhYmxlIiwgIkNvbnRhaW5lciIsICJpbmplY3QiLCAiaW5qZWN0YWJsZSIsICJBcHAiLCAibW9kdWxlVHJlZVNjYW5uZXIiLCAibW9kdWxlRGVwZW5kZW5jeUJpbmRlciIsICJhcHBSdW50aW1lIiwgImludGVybmFsQXBwQ29udGFpbmVyIiwgInBsdWdpbnMiLCAibG9nZ2VyU2VydmljZSIsICJtb2R1bGVUcmVlIiwgImxvYWRlZCIsICJzdGFydCIsICJyb290TW9kdWxlIiwgImVycm9yIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJBcHBBbHJlYWR5TG9hZGVkIiwgImxvZyIsICJydW5QbHVnaW5NZXRob2RzIiwgInNjYW4iLCAiYmluZCIsICJib290IiwgInN0b3AiLCAiQXBwTm90TG9hZGVkIiwgInNodXRkb3duIiwgIm1ldGhvZCIsICJQcm9taXNlIiwgImFsbCIsICJtYXAiLCAicCIsICJwbHVnaW4iLCAiZ2V0IiwgInJlc29sdmUiLCAiQXBwQnVpbGRlciIsICJlbnZpcm9tZW50IiwgImludGVybmFsQXBwQ29udGFpbmVyIiwgIm11bHRpcGxheWVyU2VydmljZSIsICJwbHVnaW5zIiwgImdsb2JhbENvbnRhaW5lck9wdGlvbnMiLCAidXNlR2xvYmFsR3VhcmRzIiwgImd1YXJkcyIsICJ2YWxpZGF0ZWRHdWFyZHMiLCAiZ3VhcmQiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVHdWFyZCIsICJFcnJvciIsICJwdXNoIiwgImJpbmQiLCAiR0xPQkFMX0dVQVJEUyIsICJ0b0NvbnN0YW50VmFsdWUiLCAidXNlR2xvYmFsSW50ZXJjZXB0b3JzIiwgImludGVyY2VwdG9ycyIsICJ2YWxpZGF0ZWRJbnRlcmNlcHRvcnMiLCAiaW50ZXJjZXB0b3IiLCAidmFsaWRhdGVJbnRlcmNlcHRvciIsICJHTE9CQUxfSU5URVJDRVBUT1JTIiwgInVzZUdsb2JhbFBpcGVzIiwgInBpcGVzIiwgInZhbGlkYXRlZFBpcGVzIiwgInBpcGUiLCAidmFsaWRhdGVQaXBlIiwgIkdMT0JBTF9QSVBFUyIsICJ1c2VHbG9iYWxGaWx0ZXJzIiwgImZpbHRlcnMiLCAidmFsaWRhdGVkRklsdGVycyIsICJmaWx0ZXIiLCAidmFsaWRhdGVFcnJvckZpbHRlciIsICJHTE9CQUxfRVJST1JfRklMVEVSUyIsICJ1c2VQbHVnaW5zIiwgImZvckVhY2giLCAicCIsICJ0b1NlbGYiLCAiaW5TaW5nbGV0b25TY29wZSIsICJpbnRlcm5hbFBsdWdpbnMiLCAiZ2V0IiwgIlBMVUdJTlMiLCAicmViaW5kIiwgImVuYWJsZVNodXRkb3duSG9va3MiLCAiRU5BQkxFX1NIVVRET1dOX0hPT0tTIiwgInNldENvbnRhaW5lck9wdGlvbnMiLCAib3B0aW9ucyIsICJvbmx5R2xvYmFsIiwgIkNPTlRBSU5FUl9PUFRJT05TIiwgImJ1aWxkIiwgImdsb2JhbEFwcENvbnRhaW5lciIsICJDb250YWluZXIiLCAiUkVGTEVDVE9SX1NFUlZJQ0UiLCAiUmVmbGVjdG9yU2VydmljZSIsICJ0b1NlcnZpY2UiLCAiTVVMVElQTEFZRVJfU0VSVklDRSIsICJBcHAiLCAiR0xPQkFMX0FQUF9DT05UQUlORVIiLCAiTW9kdWxlVHJlZVNjYW5uZXIiLCAiTW9kdWxlRGVwZW5kZW5jeUJpbmRlciIsICJBcHBSdW50aW1lIiwgIlBpcGVsaW5lSGFuZGxlciIsICJNb2R1bGUiLCAiaW5UcmFuc2llbnRTY29wZSIsICJNb2R1bGVNZXRhZGF0YVJlYWRlciIsICJDb250cm9sbGVyIiwgIkNvbnRyb2xsZXJNZXRhZGF0YVJlYWRlciIsICJDb250cm9sbGVyRmxvd0hhbmRsZXIiLCAiQ29udHJvbGxlckV2ZW50SGFuZGxlciIsICJDb250cm9sbGVyUlBDSGFuZGxlciIsICJNYW5nb1JlcXVlc3RCYXNlIiwgIk1BTkdPX1JFUVVFU1RfRkFDVE9SWSIsICJ0b0ZhY3RvcnkiLCAiY29udGV4dCIsICJib2R5IiwgInBsYXllciIsICJyZXF1ZXN0IiwgImNvbnRhaW5lciIsICIkYm9keSIsICIkcGxheWVyIiwgIk1hbmdvUmVzcG9uc2VCYXNlIiwgIk1BTkdPX1JFU1BPTlNFX0ZBQ1RPUlkiLCAiRXhlY3V0aW9uQ29udGV4dEJhc2UiLCAiRVhFQ1VUSU9OX0NPTlRFWFRfRkFDVE9SWSIsICJ0eXBlIiwgImNsYXNzUmVmIiwgImhhbmRsZXIiLCAicmVzcG9uc2UiLCAibmFtZSIsICJleGVjdXRpb25Db250ZXh0IiwgIiR0eXBlIiwgIiRyZXF1ZXN0IiwgIiRyZXNwb25zZSIsICIkaGFuZGxlciIsICIkY2xhc3NSZWYiLCAiJG5hbWUiLCAicGx1Z2luIiwgInBsdWdpbkluc3RhbmNlIiwgIm9uQnVpbGQiLCAiaXNCb3VuZCIsICJDb250YWluZXIiLCAiY3JlYXRlQXBwQnVpbGRlciIsICJlbnZpcm9tZW50IiwgInBsdWdpbnMiLCAiYXBwQnVpbGRlckluaGVyaXQiLCAibXVsdGlwbGF5ZXJTZXJ2aWNlIiwgImludGVybmFsQXBwQ29udGFpbmVyIiwgIkNvbnRhaW5lciIsICJiaW5kIiwgIk1VTFRJUExBWUVSX1NFUlZJQ0UiLCAidG9Db25zdGFudFZhbHVlIiwgIklOVEVSTkFMX0FQUF9DT05UQUlORVIiLCAiQVBQX0VOVklST01FTlQiLCAiUExVR0lOUyIsICJ0b1NlbGYiLCAiaW5TaW5nbGV0b25TY29wZSIsICJnZXQiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAidHlwZSIsICJuYW1lIiwgIndlYlZpZXdJZCIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImlzTmlsIiwgImlzU3RyaW5nIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJFdmVudE5hbWVNdXN0QmVTdHJpbmciLCAiZXZlbnRzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJFdmVudHMiLCAic29tZSIsICJldmVudCIsICJFdmVudE5hbWVNdXN0QmVVbmlxdWUiLCAiZGVmaW5lTWV0YWRhdGEiLCAiT25JbnRlcm5hbCIsICJldmVudE5hbWUiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAiT25XZWJWaWV3IiwgImlkIiwgImV2ZW50TmFtZSIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJPbiIsICJldmVudE5hbWUiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAiT25jZUludGVybmFsIiwgImV2ZW50TmFtZSIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJPbmNlIiwgImV2ZW50TmFtZSIsICJjcmVhdGVFdmVudERlY29yYXRvciIsICJPbmNlV2ViVmlldyIsICJpZCIsICJldmVudE5hbWUiLCAiY3JlYXRlRXZlbnREZWNvcmF0b3IiLCAiQm9keSIsICJwaXBlcyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgInZhbGlkYXRlZFBpcGVzIiwgInBpcGUiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVQaXBlIiwgIkVycm9yIiwgInB1c2giLCAicGFyYW1zIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJQYXJhbXMiLCAic29tZSIsICJwYXJhbSIsICJFcnJvck1lc3NhZ2UiLCAiTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkIiwgInBhcmFtVHlwZXMiLCAibWV0YXR5cGUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ1bmRlZmluZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAidHlwZSIsICJNZXRob2RQYXJhbVR5cGUiLCAiZGF0YSIsICJJbmRleCIsICJrZXkiLCAicGlwZXMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJpbmRleCIsICJpc051bWJlciIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiSW5kZXhLZXlNdXN0QmVOdW1iZXIiLCAidmFsaWRhdGVkUGlwZXMiLCAicGlwZSIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZVBpcGUiLCAicHVzaCIsICJwYXJhbXMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiQ29udHJvbGxlclBhcmFtcyIsICJzb21lIiwgInBhcmFtIiwgIk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCIsICJwYXJhbVR5cGVzIiwgIm1ldGF0eXBlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidW5kZWZpbmVkIiwgImRlZmluZU1ldGFkYXRhIiwgInR5cGUiLCAiTWV0aG9kUGFyYW1UeXBlIiwgImRhdGEiLCAiUmVxdWVzdCIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgInBhcmFtcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUGFyYW1zIiwgInNvbWUiLCAicGFyYW0iLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCIsICJwYXJhbVR5cGVzIiwgIm1ldGF0eXBlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidW5kZWZpbmVkIiwgImRlZmluZU1ldGFkYXRhIiwgInR5cGUiLCAiTWV0aG9kUGFyYW1UeXBlIiwgImRhdGEiLCAiUmVxIiwgIlBhcmFtIiwgImtleSIsICJwaXBlcyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgImlzU3RyaW5nIiwgIkVycm9yIiwgIkVycm9yTWVzc2FnZSIsICJQYXJhbUtleU11c3RCZVN0cmluZyIsICJ2YWxpZGF0ZWRQaXBlcyIsICJwaXBlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlUGlwZSIsICJwdXNoIiwgInBhcmFtcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUGFyYW1zIiwgInNvbWUiLCAicGFyYW0iLCAiTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkIiwgInBhcmFtVHlwZXMiLCAibWV0YXR5cGUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ1bmRlZmluZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAiZGF0YSIsICJ0eXBlIiwgIk1ldGhvZFBhcmFtVHlwZSIsICJSZXNwb25zZSIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgInBhcmFtcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUGFyYW1zIiwgInNvbWUiLCAicGFyYW0iLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIk11bHRpcGxlRGVjb3JhdG9yc09uU2luZ2xlUGFyYW1ldGVyTm90QWxsb3dlZCIsICJwYXJhbVR5cGVzIiwgIm1ldGF0eXBlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAidW5kZWZpbmVkIiwgImRlZmluZU1ldGFkYXRhIiwgInR5cGUiLCAiTWV0aG9kUGFyYW1UeXBlIiwgImRhdGEiLCAiUmVzIiwgIlVzZUd1YXJkcyIsICJndWFyZHMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJkZXNjcmlwdG9yIiwgInZhbGlkYXRlZEd1YXJkcyIsICJndWFyZCIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZUd1YXJkIiwgIkVycm9yIiwgInB1c2giLCAiaXNOaWwiLCAibGVuZ3RoIiwgIkVycm9yTWVzc2FnZSIsICJBdExlYXN0T25lR3VhcmRSZXF1aXJlZCIsICJtZXRob2RHdWFyZHMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiR3VhcmRzIiwgImRlZmluZU1ldGFkYXRhIiwgImNsYXNzR3VhcmRzIiwgIlVzZUludGVyY2VwdG9ycyIsICJpbnRlcmNlcHRvcnMiLCAidGFyZ2V0IiwgIm1ldGhvZCIsICJkZXNjcmlwdG9yIiwgInZhbGlkYXRlZEludGVyY2VwdG9ycyIsICJpbnRlcmNlcHRvciIsICJ2YWxpZCIsICJ2YWx1ZSIsICJlcnJvciIsICJ2YWxpZGF0ZUludGVyY2VwdG9yIiwgIkVycm9yIiwgInB1c2giLCAiaXNOaWwiLCAibGVuZ3RoIiwgIkVycm9yTWVzc2FnZSIsICJBdExlYXN0T25lSW50ZXJjZXB0b3JSZXF1aXJlZCIsICJtZXRob2RJbnRlcmNlcHRvcnMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiSW50ZXJjZXB0b3JzIiwgImRlZmluZU1ldGFkYXRhIiwgImNsYXNzSW50ZXJjZXB0b3JzIiwgIlVzZVBpcGVzIiwgInBpcGVzIiwgInRhcmdldCIsICJtZXRob2QiLCAiZGVzY3JpcHRvciIsICJ2YWxpZGF0ZWRQaXBlcyIsICJwaXBlIiwgInZhbGlkIiwgInZhbHVlIiwgImVycm9yIiwgInZhbGlkYXRlUGlwZSIsICJFcnJvciIsICJwdXNoIiwgImlzTmlsIiwgImxlbmd0aCIsICJFcnJvck1lc3NhZ2UiLCAiQXRMZWFzdE9uZVBpcGVSZXF1aXJlZCIsICJtZXRob2RQaXBlcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJQaXBlcyIsICJkZWZpbmVNZXRhZGF0YSIsICJjbGFzc1BpcGVzIiwgImNyZWF0ZVJQQ0RlY29yYXRvciIsICJ0eXBlIiwgIm5hbWUiLCAid2ViVmlld0lkIiwgInRhcmdldCIsICJtZXRob2QiLCAiaXNOaWwiLCAiaXNTdHJpbmciLCAiaXNOdW1iZXIiLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIldlYlZpZXdJZE11c3RCZVN0cmluZ09yTnVtYmVyIiwgIlJQQ05hbWVNdXN0QmVTdHJpbmciLCAicnBjcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgIkNvcmVNZXRhZGF0YUtleSIsICJDb250cm9sbGVyUlBDcyIsICJzb21lIiwgInJwYyIsICJSUENOYW1lTXVzdEJlVW5pcXVlIiwgImRlZmluZU1ldGFkYXRhIiwgIk9uUmVxdWVzdCIsICJycGNOYW1lIiwgImNyZWF0ZVJQQ0RlY29yYXRvciIsICJPbldlYlZpZXdSZXF1ZXN0IiwgImlkIiwgInJwY05hbWUiLCAiY3JlYXRlUlBDRGVjb3JhdG9yIiwgImNyZWF0ZVRpbWVyRGVjb3JhdG9yIiwgInR5cGUiLCAibmFtZSIsICJvcHRpb25zIiwgInRhcmdldCIsICJtZXRob2QiLCAiaXNOaWwiLCAiaXNTdHJpbmciLCAiRXJyb3IiLCAiRXJyb3JNZXNzYWdlIiwgIlRpbWVyTmFtZU11c3RCZVN0cmluZyIsICJ0aW1lcnMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJDb3JlTWV0YWRhdGFLZXkiLCAiVGltZXJzIiwgInNvbWUiLCAidGltZXIiLCAiRXZlbnROYW1lTXVzdEJlVW5pcXVlIiwgImRlZmluZU1ldGFkYXRhIiwgIkNyb24iLCAicGF0dGVybiIsICJvcHRpb25zIiwgImNyZWF0ZVRpbWVyRGVjb3JhdG9yIiwgIm5hbWUiLCAiRXZlcnlUaWNrIiwgIm5hbWUiLCAiY3JlYXRlVGltZXJEZWNvcmF0b3IiLCAiSW50ZXJ2YWwiLCAibmFtZU9yVGltZW91dCIsICJ0aW1lb3V0IiwgIm5hbWUiLCAiaW50ZXJ2YWxUaW1lb3V0IiwgImlzU3RyaW5nIiwgInVuZGVmaW5lZCIsICJjcmVhdGVUaW1lckRlY29yYXRvciIsICJUaW1lb3V0IiwgIm5hbWVPclRpbWVvdXQiLCAidGltZW91dCIsICJuYW1lIiwgImludGVydmFsVGltZW91dCIsICJpc1N0cmluZyIsICJ1bmRlZmluZWQiLCAiY3JlYXRlVGltZXJEZWNvcmF0b3IiLCAiYXBwbHlEZWNvcmF0b3JzIiwgImRlY29yYXRvcnMiLCAidGFyZ2V0IiwgInByb3BlcnR5S2V5IiwgImRlc2NyaXB0b3IiLCAiZGVjb3JhdG9yIiwgIkZ1bmN0aW9uIiwgImNyZWF0ZVBhcmFtRGVjb3JhdG9yIiwgImZhY3RvcnkiLCAiZGF0YSIsICJwaXBlcyIsICJ0YXJnZXQiLCAibWV0aG9kIiwgImluZGV4IiwgInZhbGlkYXRlZFBpcGVzIiwgInBpcGUiLCAidmFsaWQiLCAidmFsdWUiLCAiZXJyb3IiLCAidmFsaWRhdGVQaXBlIiwgIkVycm9yIiwgInB1c2giLCAicGFyYW1zIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiQ29yZU1ldGFkYXRhS2V5IiwgIkNvbnRyb2xsZXJQYXJhbXMiLCAic29tZSIsICJwYXJhbSIsICJFcnJvck1lc3NhZ2UiLCAiTXVsdGlwbGVEZWNvcmF0b3JzT25TaW5nbGVQYXJhbWV0ZXJOb3RBbGxvd2VkIiwgInBhcmFtVHlwZXMiLCAibWV0YXR5cGUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ1bmRlZmluZWQiLCAiZGVmaW5lTWV0YWRhdGEiLCAidHlwZSIsICJNZXRob2RQYXJhbVR5cGUiLCAiQ3VzdG9tIiwgIkxhenlTZXJ2aWNlSWRlbnRpZmVyIiwgImZvcndhcmRSZWYiLCAiZm4iLCAiTGF6eVNlcnZpY2VJZGVudGlmZXIiLCAiUmVmbGVjdG9yU2VydmljZSIsICJnZXQiLCAibWV0YWRhdGFLZXkiLCAidGFyZ2V0IiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAiZ2V0QWxsIiwgInRhcmdldHMiLCAibWFwIiwgImdldEFsbEFuZE1lcmdlIiwgIm1ldGFkYXRhQ29sbGVjdGlvbiIsICJmaWx0ZXIiLCAiaXRlbSIsICJ1bmRlZmluZWQiLCAiaXNFbXB0eSIsICJyZWR1Y2UiLCAiYSIsICJiIiwgIkFycmF5IiwgImlzQXJyYXkiLCAiY29uY2F0IiwgImlzT2JqZWN0IiwgImdldEFsbEFuZE92ZXJyaWRlIiwgInJlc3VsdCIsICJjcmVhdGVEZWNvcmF0b3IiLCAib3B0aW9ucyIsICJrZXkiLCAiZ2VuZXJhdGVSYW5kb21JZCIsICJkZWNvcmF0b3JGbiIsICJtZXRhZGF0YVZhbHVlIiwgImRlc2NyaXB0b3IiLCAidmFsdWUiLCAidHJhbnNmb3JtIiwgIlNldE1ldGFkYXRhIiwgIktFWSIsICJpbmplY3QiLCAiaW5qZWN0YWJsZSIsICJDcm9uIiwgIlRpbWVyU2VydmljZSIsICJtdWx0aXBsYXllclNlcnZpY2UiLCAiJGV2ZXJ5dGlja3MiLCAiTWFwIiwgIiRpbnRlcnZhbHMiLCAiJHRpbWVvdXRzIiwgIiRjcm9ucyIsICJhbGwiLCAiVGltZXJzIiwgImV2ZXJ5dGlja3MiLCAidmFsdWVzIiwgImludGVydmFscyIsICJ0aW1lb3V0cyIsICJjcm9ucyIsICJ3YXJuaW5nVGhyZXNob2xkIiwgInZhbHVlIiwgInNvdXJjZUxvY2F0aW9uRnJhbWVTa2lwQ291bnQiLCAiY3JlYXRlQ3JvbkpvYiIsICJjYWxsYmFjayIsICJvcHRpb25zIiwgInBhdHRlcm4iLCAiY3Jvbk9wdGlvbnMiLCAiY3JvbiIsICJDcm9uIiwgImlzU3RyaW5nIiwgIm5hbWUiLCAic2V0IiwgImNyZWF0ZUludGVydmFsIiwgImludGVydmFsIiwgInRpbWVyIiwgInNldEludGVydmFsIiwgImNyZWF0ZVRpbWVvdXQiLCAidGltZW91dCIsICJzZXRUaW1lb3V0IiwgImNyZWF0ZUV2ZXJ5VGljayIsICJldmVyeVRpY2siLCAiZGVsZXRlIiwgInR5cGUiLCAiY3JvbkpvYiIsICJnZXQiLCAic3RvcCIsICJldmVyeXRpY2siLCAiZGVzdHJveSIsICJnZXRCeU5hbWUiLCAiZ2V0QnlJZCIsICJpZCIsICJnZXRCeUlEIiwgInRpbWUiLCAidGltZUVuZCJdCn0K