@raspect/workflow-sdk 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/worker.d.ts CHANGED
@@ -35,7 +35,7 @@ export declare class Worker implements WorkerInterface {
35
35
  private kafka;
36
36
  private consumer;
37
37
  private producer;
38
- private heartbeatInterval;
38
+ private heartbeatWorker;
39
39
  private heartbeatIntervalMs;
40
40
  private resultTopic;
41
41
  private maxConcurrentWorkflows;
@@ -62,9 +62,17 @@ export declare class Worker implements WorkerInterface {
62
62
  private connectToServerOnce;
63
63
  private connectToServer;
64
64
  private createKafkaClient;
65
+ /**
66
+ * Start heartbeat in a dedicated worker thread (independent of the main event loop).
67
+ *
68
+ * This ensures heartbeats are never blocked by long-running synchronous
69
+ * activities or workflows, following the same pattern as Temporal's Core SDK.
70
+ */
65
71
  private startHeartbeat;
72
+ private stopHeartbeatWorker;
66
73
  private disconnectFromServer;
67
74
  private processMessage;
75
+ private formatDuration;
68
76
  private executeWorkflow;
69
77
  private processActivityTask;
70
78
  private sendWorkflowResult;
package/dist/worker.js CHANGED
@@ -38,6 +38,7 @@ exports.Worker = void 0;
38
38
  const kafkajs_1 = require("kafkajs");
39
39
  const aws_msk_iam_sasl_signer_js_1 = require("aws-msk-iam-sasl-signer-js");
40
40
  const os = __importStar(require("os"));
41
+ const worker_threads_1 = require("worker_threads");
41
42
  const workflow_1 = require("./workflow");
42
43
  const activity_1 = require("./activity");
43
44
  /**
@@ -75,7 +76,7 @@ class Worker {
75
76
  kafka = null;
76
77
  consumer = null;
77
78
  producer = null;
78
- heartbeatInterval = null;
79
+ heartbeatWorker = null;
79
80
  heartbeatIntervalMs = 30000;
80
81
  resultTopic = null;
81
82
  maxConcurrentWorkflows;
@@ -143,7 +144,14 @@ class Worker {
143
144
  this.kafka = this.createKafkaClient(serverKafkaConfig);
144
145
  // Create consumer
145
146
  const consumerGroupId = this.config.groupId || `workflow-worker-${this.workerId}`;
146
- this.consumer = this.kafka.consumer({ groupId: consumerGroupId });
147
+ // Use generous session/rebalance timeouts so long-running workflows don't
148
+ // cause the broker to drop the consumer from the group.
149
+ this.consumer = this.kafka.consumer({
150
+ groupId: consumerGroupId,
151
+ sessionTimeout: 60000,
152
+ rebalanceTimeout: 120000,
153
+ heartbeatInterval: 10000,
154
+ });
147
155
  // Create producer
148
156
  this.producer = this.kafka.producer();
149
157
  try {
@@ -287,6 +295,13 @@ class Worker {
287
295
  clientId: `workflow-worker-${this.workerId}`,
288
296
  brokers,
289
297
  logLevel: kafkajs_1.logLevel.WARN,
298
+ retry: {
299
+ initialRetryTime: 300,
300
+ retries: 100,
301
+ maxRetryTime: 30000,
302
+ factor: 0.2,
303
+ multiplier: 2,
304
+ },
290
305
  };
291
306
  if (auth?.type === 'msk_iam') {
292
307
  config.ssl = true;
@@ -318,48 +333,91 @@ class Worker {
318
333
  }
319
334
  return new kafkajs_1.Kafka(config);
320
335
  }
336
+ /**
337
+ * Start heartbeat in a dedicated worker thread (independent of the main event loop).
338
+ *
339
+ * This ensures heartbeats are never blocked by long-running synchronous
340
+ * activities or workflows, following the same pattern as Temporal's Core SDK.
341
+ */
321
342
  startHeartbeat() {
322
- let consecutiveFailures = 0;
323
- const maxFailuresBeforeReconnect = 3;
324
- this.heartbeatInterval = setInterval(async () => {
325
- if (!this.running)
326
- return;
327
- try {
328
- const response = await fetch(`${this.config.serverUrl}/workflow/api/v1/workers/heartbeat`, {
329
- method: 'POST',
330
- headers: {
331
- 'Content-Type': 'application/json',
332
- 'Authorization': `Bearer ${this.config.apiKey}`,
333
- },
334
- body: JSON.stringify({ instance_id: this.instanceId }),
335
- });
336
- if (response.ok) {
337
- consecutiveFailures = 0;
338
- }
339
- else if (response.status === 401) {
340
- console.error('Heartbeat failed: Invalid or expired API key');
341
- consecutiveFailures++;
342
- }
343
- else {
344
- console.warn(`Heartbeat failed: HTTP ${response.status}`);
345
- consecutiveFailures++;
346
- }
347
- }
348
- catch (error) {
349
- console.warn('Heartbeat error:', error.message);
350
- consecutiveFailures++;
351
- }
352
- // Trigger reconnection if too many consecutive failures
353
- if (consecutiveFailures >= maxFailuresBeforeReconnect) {
354
- console.warn(`Heartbeat failed ${consecutiveFailures} times consecutively. ` +
343
+ const workerCode = `
344
+ const { parentPort, workerData } = require('worker_threads');
345
+ const { serverUrl, apiKey, instanceId, intervalMs } = workerData;
346
+
347
+ let consecutiveFailures = 0;
348
+ const maxFailures = 3;
349
+
350
+ async function sendHeartbeat() {
351
+ try {
352
+ const response = await fetch(serverUrl + '/workflow/api/v1/workers/heartbeat', {
353
+ method: 'POST',
354
+ headers: {
355
+ 'Content-Type': 'application/json',
356
+ 'Authorization': 'Bearer ' + apiKey,
357
+ },
358
+ body: JSON.stringify({ instance_id: instanceId }),
359
+ });
360
+
361
+ if (response.ok) {
362
+ consecutiveFailures = 0;
363
+ } else if (response.status === 401) {
364
+ parentPort.postMessage({ type: 'error', message: 'Heartbeat failed: Invalid or expired API key' });
365
+ consecutiveFailures++;
366
+ } else {
367
+ parentPort.postMessage({ type: 'warn', message: 'Heartbeat failed: HTTP ' + response.status });
368
+ consecutiveFailures++;
369
+ }
370
+ } catch (error) {
371
+ parentPort.postMessage({ type: 'warn', message: 'Heartbeat error: ' + error.message });
372
+ consecutiveFailures++;
373
+ }
374
+
375
+ if (consecutiveFailures >= maxFailures) {
376
+ parentPort.postMessage({ type: 'reconnect', failures: consecutiveFailures });
377
+ }
378
+ }
379
+
380
+ const interval = setInterval(sendHeartbeat, intervalMs);
381
+
382
+ parentPort.on('message', (msg) => {
383
+ if (msg === 'stop') {
384
+ clearInterval(interval);
385
+ process.exit(0);
386
+ }
387
+ });
388
+ `;
389
+ this.heartbeatWorker = new worker_threads_1.Worker(workerCode, {
390
+ eval: true,
391
+ workerData: {
392
+ serverUrl: this.config.serverUrl,
393
+ apiKey: this.config.apiKey,
394
+ instanceId: this.instanceId,
395
+ intervalMs: this.heartbeatIntervalMs,
396
+ },
397
+ });
398
+ this.heartbeatWorker.on('message', (msg) => {
399
+ if (msg.type === 'reconnect') {
400
+ console.warn(`Heartbeat failed ${msg.failures} times consecutively. ` +
355
401
  'Connection may be lost, triggering reconnection...');
356
402
  this.needsReconnect = true;
357
- if (this.heartbeatInterval) {
358
- clearInterval(this.heartbeatInterval);
359
- this.heartbeatInterval = null;
360
- }
403
+ this.stopHeartbeatWorker();
404
+ }
405
+ else if (msg.type === 'error') {
406
+ console.error(msg.message);
361
407
  }
362
- }, this.heartbeatIntervalMs);
408
+ else if (msg.type === 'warn') {
409
+ console.warn(msg.message);
410
+ }
411
+ });
412
+ this.heartbeatWorker.on('error', (err) => {
413
+ console.warn('Heartbeat worker error:', err.message);
414
+ });
415
+ }
416
+ stopHeartbeatWorker() {
417
+ if (this.heartbeatWorker) {
418
+ this.heartbeatWorker.postMessage('stop');
419
+ this.heartbeatWorker = null;
420
+ }
363
421
  }
364
422
  async disconnectFromServer() {
365
423
  if (!this.instanceId)
@@ -397,8 +455,18 @@ class Worker {
397
455
  await this.processActivityTask(data, resultTopic);
398
456
  }
399
457
  }
458
+ formatDuration(ms) {
459
+ if (ms < 1000)
460
+ return `${ms}ms`;
461
+ const seconds = ms / 1000;
462
+ if (seconds < 60)
463
+ return `${seconds.toFixed(1)}s`;
464
+ const minutes = Math.floor(seconds / 60);
465
+ const remainingSeconds = (seconds % 60).toFixed(0);
466
+ return `${minutes}m${remainingSeconds}s`;
467
+ }
400
468
  async executeWorkflow(task, resultTopic) {
401
- console.log(`Received workflow task ${task.task_id}: ${task.workflow_name}`);
469
+ console.log(`[Workflow ${task.workflow_id}] ${task.workflow_name} started`);
402
470
  // Find the workflow class
403
471
  const workflowCls = this.workflows.get(task.workflow_name);
404
472
  if (!workflowCls) {
@@ -440,14 +508,14 @@ class Worker {
440
508
  });
441
509
  const completedAt = new Date();
442
510
  const durationMs = completedAt.getTime() - startedAt.getTime();
443
- console.log(`Workflow ${task.task_id} completed in ${durationMs}ms`);
511
+ console.log(`[Workflow ${task.workflow_id}] ${task.workflow_name} ended in ${this.formatDuration(durationMs)}`);
444
512
  await this.sendWorkflowResult(task, resultTopic, 'completed', output, undefined, startedAt, completedAt, durationMs);
445
513
  }
446
514
  catch (error) {
447
515
  const completedAt = new Date();
448
516
  const durationMs = completedAt.getTime() - startedAt.getTime();
449
517
  const err = error;
450
- console.error(`Workflow ${task.task_id} failed:`, err.message);
518
+ console.error(`[Workflow ${task.workflow_id}] ${task.workflow_name} failed in ${this.formatDuration(durationMs)}: ${err.message}`);
451
519
  await this.sendWorkflowResult(task, resultTopic, 'failed', undefined, {
452
520
  type: err.name || 'Error',
453
521
  message: err.message,
@@ -457,7 +525,7 @@ class Worker {
457
525
  }
458
526
  async processActivityTask(data, resultTopic) {
459
527
  const task = data;
460
- console.log(`Received activity task ${task.task_id}: ${task.activity_name} (workflow=${task.workflow_id})`);
528
+ console.log(`[Workflow ${task.workflow_id}] ${task.activity_name} (#${task.activity_index}) started`);
461
529
  // Find the activity handler
462
530
  const activityFn = this.activities.get(task.activity_name);
463
531
  if (!activityFn) {
@@ -477,14 +545,14 @@ class Worker {
477
545
  ]);
478
546
  const completedAt = new Date();
479
547
  const durationMs = completedAt.getTime() - startedAt.getTime();
480
- console.log(`Activity ${task.task_id} completed in ${durationMs}ms`);
548
+ console.log(`[Workflow ${task.workflow_id}] ${task.activity_name} (#${task.activity_index}) ended in ${this.formatDuration(durationMs)}`);
481
549
  await this.sendActivityResult(task, resultTopic, 'completed', output, undefined, startedAt, completedAt, durationMs);
482
550
  }
483
551
  catch (error) {
484
552
  const completedAt = new Date();
485
553
  const durationMs = completedAt.getTime() - startedAt.getTime();
486
554
  const err = error;
487
- console.error(`Activity ${task.task_id} failed:`, err.message);
555
+ console.error(`[Workflow ${task.workflow_id}] ${task.activity_name} (#${task.activity_index}) failed in ${this.formatDuration(durationMs)}: ${err.message}`);
488
556
  await this.sendActivityResult(task, resultTopic, 'failed', undefined, {
489
557
  type: err.name || 'Error',
490
558
  message: err.message,
@@ -685,11 +753,8 @@ class Worker {
685
753
  }
686
754
  }
687
755
  async cleanupKafka() {
688
- // Stop heartbeat
689
- if (this.heartbeatInterval) {
690
- clearInterval(this.heartbeatInterval);
691
- this.heartbeatInterval = null;
692
- }
756
+ // Stop heartbeat worker thread
757
+ this.stopHeartbeatWorker();
693
758
  // Stop Kafka clients
694
759
  if (this.consumer) {
695
760
  try {
@@ -718,4 +783,4 @@ class Worker {
718
783
  }
719
784
  }
720
785
  exports.Worker = Worker;
721
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUVBQXlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFekUscUNBQTJFO0FBQzNFLDJFQUFzRjtBQUN0Rix1Q0FBeUI7QUFlekIseUNBQW1IO0FBQ25ILHlDQUE2QztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBYSxNQUFNO0lBQ1QsTUFBTSxDQUFlO0lBQ3JCLFNBQVMsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNsRCxVQUFVLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckQsUUFBUSxHQUFrQixJQUFJLENBQUM7SUFDL0IsVUFBVSxHQUFrQixJQUFJLENBQUM7SUFDakMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQWlCLElBQUksQ0FBQztJQUMzQixRQUFRLEdBQW9CLElBQUksQ0FBQztJQUNqQyxRQUFRLEdBQW9CLElBQUksQ0FBQztJQUNqQyxpQkFBaUIsR0FBMEIsSUFBSSxDQUFDO0lBQ2hELG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUM1QixXQUFXLEdBQWtCLElBQUksQ0FBQztJQUNsQyxzQkFBc0IsQ0FBUztJQUMvQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0lBRTFDLFlBQVksTUFBb0I7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLEdBQUcsTUFBTTtZQUNULFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1NBQy9DLENBQUM7UUFDRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMs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VSxFQUFFLENBQUM7WUFDbkMsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsMkJBQTJCO1lBQzdCLENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPO1FBQ25CLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTFCLHlCQUF5QjtRQUN6QixNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRWxDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsUUFBUSxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUF0ekJELHdCQXN6QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXb3JrZXIgLSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGZvciBleGVjdXRpbmcgd29ya2Zsb3dzIGFuZCBhY3Rpdml0aWVzXG5cbmltcG9ydCB7IEthZmthLCBDb25zdW1lciwgUHJvZHVjZXIsIFNBU0xPcHRpb25zLCBsb2dMZXZlbCB9IGZyb20gJ2thZmthanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBdXRoVG9rZW5Gcm9tQ3JlZGVudGlhbHNQcm92aWRlciB9IGZyb20gJ2F3cy1tc2staWFtLXNhc2wtc2lnbmVyLWpzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCB0eXBlIHtcbiAgV29ya2VyQ29uZmlnLFxuICBBY3Rpdml0eUhhbmRsZXIsXG4gIERlY29yYXRlZEFjdGl2aXR5LFxuICBXb3JrZmxvd0NsYXNzLFxuICBXb3JrZmxvd1Rhc2ssXG4gIEFjdGl2aXR5VGFzayxcbiAgV29ya2Zsb3dSZXN1bHQsXG4gIEFjdGl2aXR5UmVzdWx0LFxuICBXb3JrZmxvd0Vycm9yLFxuICBBY3Rpdml0eUVycm9yLFxuICBLYWZrYUNvbmZpZyxcbiAgQ29ubmVjdFJlc3BvbnNlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFdvcmtmbG93Q29udGV4dCwgcnVuV2l0aENvbnRleHQsIGdldFdvcmtmbG93TmFtZSwgZmluZFJ1bk1ldGhvZCwgdHlwZSBXb3JrZXJJbnRlcmZhY2UgfSBmcm9tICcuL3dvcmtmbG93JztcbmltcG9ydCB7IGdldEFjdGl2aXR5TmFtZSB9IGZyb20gJy4vYWN0aXZpdHknO1xuXG4vKipcbiAqIFdvcmtlciB0aGF0IGV4ZWN1dGVzIHdvcmtmbG93cyBhbmQgYWN0aXZpdGllcy5cbiAqIFxuICogVXNhZ2U6XG4gKiAgIGltcG9ydCB7IFdvcmtlciwgd29ya2Zsb3csIGFjdGl2aXR5IH0gZnJvbSAnQHJhc3BlY3Qvd29ya2Zsb3ctc2RrJztcbiAqICAgXG4gKiAgIGNvbnN0IHNheUhlbGxvID0gYWN0aXZpdHkuZGVmbihhc3luYyAoaW5wdXQ6IHsgbmFtZTogc3RyaW5nIH0pID0+IHtcbiAqICAgICByZXR1cm4geyBtZXNzYWdlOiBgSGVsbG8sICR7aW5wdXQubmFtZX0hYCB9O1xuICogICB9KTtcbiAqICAgXG4gKiAgIEB3b3JrZmxvdy5kZWZuXG4gKiAgIGNsYXNzIEhlbGxvV29ybGRXb3JrZmxvdyB7XG4gKiAgICAgQHdvcmtmbG93LnJ1blxuICogICAgIGFzeW5jIHJ1bihpbnB1dDogeyBuYW1lOiBzdHJpbmcgfSkge1xuICogICAgICAgcmV0dXJuIGF3YWl0IHdvcmtmbG93LmV4ZWN1dGVBY3Rpdml0eShzYXlIZWxsbywgaW5wdXQpO1xuICogICAgIH1cbiAqICAgfVxuICogICBcbiAqICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcih7XG4gKiAgICAgc2VydmVyVXJsOiAnaHR0cHM6Ly93b3JrZmxvdy5leGFtcGxlLmNvbScsXG4gKiAgICAgYXBpS2V5OiAnd2tfeW91cl93b3JrZXJfYXBpX2tleScsICAvLyBXb3JrZXIgQVBJIGtleSBmcm9tIHNlcnZlciBVSVxuICogICB9KTtcbiAqICAgd29ya2VyLnJlZ2lzdGVyKHsgd29ya2Zsb3dzOiBbSGVsbG9Xb3JsZFdvcmtmbG93XSwgYWN0aXZpdGllczogW3NheUhlbGxvXSB9KTtcbiAqICAgYXdhaXQgd29ya2VyLnJ1bigpO1xuICovXG5leHBvcnQgY2xhc3MgV29ya2VyIGltcGxlbWVudHMgV29ya2VySW50ZXJmYWNlIHtcbiAgcHJpdmF0ZSBjb25maWc6IFdvcmtlckNvbmZpZztcbiAgcHJpdmF0ZSB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93Q2xhc3M+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGFjdGl2aXRpZXM6IE1hcDxzdHJpbmcsIEFjdGl2aXR5SGFuZGxlcj4gPSBuZXcgTWFwKCk7XG4gIFxuICBwcml2YXRlIHdvcmtlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbnN0YW5jZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBydW5uaW5nID0gZmFsc2U7XG4gIHByaXZhdGUga2Fma2E6IEthZmthIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29uc3VtZXI6IENvbnN1bWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJvZHVjZXI6IFByb2R1Y2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaGVhcnRiZWF0SW50ZXJ2YWw6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaGVhcnRiZWF0SW50ZXJ2YWxNcyA9IDMwMDAwO1xuICBwcml2YXRlIHJlc3VsdFRvcGljOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXhDb25jdXJyZW50V29ya2Zsb3dzOiBudW1iZXI7XG4gIHByaXZhdGUgbmVlZHNSZWNvbm5lY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSB3b3JrZXJUb3BpYzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBXb3JrZXJDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIHNlcnZlclVybDogY29uZmlnLnNlcnZlclVybC5yZXBsYWNlKC9cXC8kLywgJycpLFxuICAgIH07XG4gICAgdGhpcy5tYXhDb25jdXJyZW50V29ya2Zsb3dzID0gY29uZmlnLm1heENvbmN1cnJlbnRXb3JrZmxvd3MgfHwgMTA7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgd29ya2Zsb3dzIGFuZCBhY3Rpdml0aWVzLlxuICAgKi9cbiAgcmVnaXN0ZXIob3B0aW9uczoge1xuICAgIHdvcmtmbG93cz86IFdvcmtmbG93Q2xhc3NbXTtcbiAgICBhY3Rpdml0aWVzPzogRGVjb3JhdGVkQWN0aXZpdHlbXTtcbiAgfSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgd2ZDbHMgb2Ygb3B0aW9ucy53b3JrZmxvd3MgfHwgW10pIHtcbiAgICAgIGNvbnN0IHdmTmFtZSA9IGdldFdvcmtmbG93TmFtZSh3ZkNscyk7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXQod2ZOYW1lLCB3ZkNscyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhY3Rpdml0eUZuIG9mIG9wdGlvbnMuYWN0aXZpdGllcyB8fCBbXSkge1xuICAgICAgY29uc3QgYWN0aXZpdHlOYW1lID0gZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5Rm4pO1xuICAgICAgdGhpcy5hY3Rpdml0aWVzLnNldChhY3Rpdml0eU5hbWUsIGFjdGl2aXR5Rm4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgd29ya2VyIChibG9ja2luZykuXG4gICAqL1xuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcblxuICAgIC8vIFNldHVwIHNpZ25hbCBoYW5kbGVyc1xuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHRoaXMuc3RvcCgpKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4gdGhpcy5zdG9wKCkpO1xuXG4gICAgLy8gTWFpbiBsb29wIHdpdGggYXV0b21hdGljIHJlY29ubmVjdGlvblxuICAgIHdoaWxlICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdEFuZFJ1bigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcpIGJyZWFrO1xuICAgICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhdXRoIGVycm9yIHRoYXQgc2hvdWxkbid0IGJlIHJldHJpZWRcbiAgICAgICAgaWYgKGVyci5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIG9yIGV4cGlyZWQgQVBJIGtleScpIHx8IFxuICAgICAgICAgICAgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ2RvZXMgbm90IGhhdmUgcGVybWlzc2lvbicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgV29ya2VyIHN0b3BwZWQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcihgV29ya2VyIGVycm9yOiAke2Vyci5tZXNzYWdlfS4gV2lsbCBhdHRlbXB0IHRvIHJlY29ubmVjdC4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXBLYWZrYSgpO1xuICAgICAgICAvLyBTbWFsbCBkZWxheSBiZWZvcmUgcmVjb25uZWN0aW9uIGF0dGVtcHRcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMDApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBbmRSdW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5uZWVkc1JlY29ubmVjdCA9IGZhbHNlO1xuXG4gICAgLy8gQ29ubmVjdCB0byBzZXJ2ZXIgYW5kIGdldCBLYWZrYSBjb25maWdcbiAgICBjb25zdCBzZXJ2ZXJLYWZrYUNvbmZpZyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvU2VydmVyKCk7XG4gICAgY29uc3Qgd29ya2VyVG9waWMgPSBzZXJ2ZXJLYWZrYUNvbmZpZy53b3JrZXJfdG9waWM7XG4gICAgY29uc3QgcmVzdWx0VG9waWMgPSBzZXJ2ZXJLYWZrYUNvbmZpZy5yZXN1bHRfdG9waWM7XG4gICAgdGhpcy5yZXN1bHRUb3BpYyA9IHJlc3VsdFRvcGljO1xuICAgIHRoaXMud29ya2VyVG9waWMgPSB3b3JrZXJUb3BpYztcblxuICAgIC8vIENyZWF0ZSBLYWZrYSBjbGllbnRcbiAgICB0aGlzLmthZmthID0gdGhpcy5jcmVhdGVLYWZrYUNsaWVudChzZXJ2ZXJLYWZrYUNvbmZpZyk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGNvbnN1bWVyXG4gICAgY29uc3QgY29uc3VtZXJHcm91cElkID0gdGhpcy5jb25maWcuZ3JvdXBJZCB8fCBgd29ya2Zsb3ctd29ya2VyLSR7dGhpcy53b3JrZXJJZH1gO1xuICAgIHRoaXMuY29uc3VtZXIgPSB0aGlzLmthZmthLmNvbnN1bWVyKHsgZ3JvdXBJZDogY29uc3VtZXJHcm91cElkIH0pO1xuICAgIFxuICAgIC8vIENyZWF0ZSBwcm9kdWNlclxuICAgIHRoaXMucHJvZHVjZXIgPSB0aGlzLmthZmthLnByb2R1Y2VyKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25zdW1lci5jb25uZWN0KCk7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLmNvbm5lY3QoKTtcbiAgICAgIGF3YWl0IHRoaXMuY29uc3VtZXIuc3Vic2NyaWJlKHsgdG9waWM6IHdvcmtlclRvcGljLCBmcm9tQmVnaW5uaW5nOiBmYWxzZSB9KTtcblxuICAgICAgY29uc3Qgd29ya2Zsb3dzU3RyID0gdGhpcy53b3JrZmxvd3Muc2l6ZSA+IDAgPyBBcnJheS5mcm9tKHRoaXMud29ya2Zsb3dzLmtleXMoKSkuam9pbignLCAnKSA6ICcobm9uZSknO1xuICAgICAgY29uc3QgYWN0aXZpdGllc1N0ciA9IHRoaXMuYWN0aXZpdGllcy5zaXplID4gMCA/IEFycmF5LmZyb20odGhpcy5hY3Rpdml0aWVzLmtleXMoKSkuam9pbignLCAnKSA6ICcobm9uZSknO1xuICAgICAgY29uc29sZS5sb2coYFdvcmtlciAke3RoaXMud29ya2VySWR9IHN0YXJ0ZWQsIGNvbnN1bWluZyBmcm9tICR7d29ya2VyVG9waWN9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgTWF4IGNvbmN1cnJlbnQgd29ya2Zsb3dzOiAke3RoaXMubWF4Q29uY3VycmVudFdvcmtmbG93c31gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBSZWdpc3RlcmVkIHdvcmtmbG93czogJHt3b3JrZmxvd3NTdHJ9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgUmVnaXN0ZXJlZCBhY3Rpdml0aWVzOiAke2FjdGl2aXRpZXNTdHJ9YCk7XG5cbiAgICAgIC8vIFN0YXJ0IGhlYXJ0YmVhdFxuICAgICAgdGhpcy5zdGFydEhlYXJ0YmVhdCgpO1xuXG4gICAgICAvLyBTdGFydCBjb25zdW1pbmcgbWVzc2FnZXNcbiAgICAgIGF3YWl0IHRoaXMuY29uc3VtZXIucnVuKHtcbiAgICAgICAgYXV0b0NvbW1pdDogZmFsc2UsXG4gICAgICAgIHBhcnRpdGlvbnNDb25zdW1lZENvbmN1cnJlbnRseTogdGhpcy5tYXhDb25jdXJyZW50V29ya2Zsb3dzLFxuICAgICAgICBlYWNoTWVzc2FnZTogYXN5bmMgKHsgdG9waWMsIHBhcnRpdGlvbiwgbWVzc2FnZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcgfHwgdGhpcy5uZWVkc1JlY29ubmVjdCkgcmV0dXJuO1xuICAgICAgICAgIFxuICAgICAgICAgIGF3YWl0IHRoaXMuY29uc3VtZXI/LmNvbW1pdE9mZnNldHMoW3tcbiAgICAgICAgICAgIHRvcGljLFxuICAgICAgICAgICAgcGFydGl0aW9uLFxuICAgICAgICAgICAgb2Zmc2V0OiAoQmlnSW50KG1lc3NhZ2Uub2Zmc2V0KSArIDFuKS50b1N0cmluZygpLFxuICAgICAgICAgIH1dKTtcbiAgICAgICAgICBcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZS52YWx1ZT8udG9TdHJpbmcoKSB8fCAne30nKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01lc3NhZ2UoZGF0YSwgcmVzdWx0VG9waWMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJNc2cgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2U/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICAgICAgICBpZiAoZXJyTXNnLmluY2x1ZGVzKCdkaXNjb25uZWN0ZWQnKSB8fCBlcnJNc2cuaW5jbHVkZXMoJ2Nvbm5lY3Rpb24nKSkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0thZmthIGNvbm5lY3Rpb24gbG9zdCwgdHJpZ2dlcmluZyByZWNvbm5lY3Rpb24uLi4nKTtcbiAgICAgICAgICAgICAgdGhpcy5uZWVkc1JlY29ubmVjdCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIG1lc3NhZ2U6JywgKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gS2VlcCBydW5uaW5nIHVudGlsIHN0b3BwZWQgb3IgbmVlZHMgcmVjb25uZWN0XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5ydW5uaW5nIHx8IHRoaXMubmVlZHNSZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY2hlY2tJbnRlcnZhbCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLm5lZWRzUmVjb25uZWN0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZWNvbm5lY3RpbmcgdG8gc2VydmVyIGFuZCBLYWZrYS4uLicpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBLYWZrYSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSB3b3JrZXIgZ3JhY2VmdWxseS5cbiAgICovXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coJ1N0b3BwaW5nIHdvcmtlci4uLicpO1xuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb25uZWN0aW9uRXJyb3Ioc3RhdHVzOiBudW1iZXIsIGVycm9yVGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIHJldHVybiAnSW52YWxpZCBvciBleHBpcmVkIEFQSSBrZXkuIFBsZWFzZSBjaGVjayB5b3VyIHdvcmtlciBBUEkga2V5Lic7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgcmV0dXJuICdBUEkga2V5IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBjb25uZWN0LiBQbGVhc2UgY2hlY2sgd29ya2VyIHBlcm1pc3Npb25zLic7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgcmV0dXJuICdTZXJ2ZXIgZW5kcG9pbnQgbm90IGZvdW5kLiBQbGVhc2UgY2hlY2sgdGhlIHNlcnZlciBVUkwuJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICAgIHJldHVybiBgU2VydmVyIGVycm9yIChIVFRQICR7c3RhdHVzfSkuIFRoZSBzZXJ2ZXIgbWF5IGJlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgSFRUUCAke3N0YXR1c30gLSAke2Vycm9yVGV4dH1gO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvU2VydmVyT25jZSgpOiBQcm9taXNlPEthZmthQ29uZmlnPiB7XG4gICAgY29uc3QgaG9zdG5hbWUgPSBvcy5ob3N0bmFtZSgpO1xuICAgIFxuICAgIGNvbnN0IGNvbm5lY3RQYXlsb2FkID0ge1xuICAgICAgd29ya2Zsb3dzOiBBcnJheS5mcm9tKHRoaXMud29ya2Zsb3dzLmtleXMoKSksXG4gICAgICBhY3Rpdml0aWVzOiBBcnJheS5mcm9tKHRoaXMuYWN0aXZpdGllcy5rZXlzKCkpLFxuICAgICAgaG9zdG5hbWUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5jb25maWcuc2VydmVyVXJsfS93b3JrZmxvdy9hcGkvdjEvd29ya2Vycy9jb25uZWN0YCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3RoaXMuY29uZmlnLmFwaUtleX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNvbm5lY3RQYXlsb2FkKSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgY29uc3QgZXJyb3JNc2cgPSB0aGlzLmZvcm1hdENvbm5lY3Rpb25FcnJvcihyZXNwb25zZS5zdGF0dXMsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbm5lY3QgdG8gJHt0aGlzLmNvbmZpZy5zZXJ2ZXJVcmx9OiAke2Vycm9yTXNnfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ29ubmVjdFJlc3BvbnNlO1xuICAgIFxuICAgIHRoaXMud29ya2VySWQgPSBkYXRhLndvcmtlcl9pZDtcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBkYXRhLmluc3RhbmNlX2lkO1xuICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyA9IGRhdGEuaGVhcnRiZWF0X2ludGVydmFsX21zIHx8IDMwMDAwO1xuXG4gICAgY29uc29sZS5sb2coYENvbm5lY3RlZCB0byBzZXJ2ZXIgYXMgd29ya2VyX2lkPSR7dGhpcy53b3JrZXJJZH0sIGluc3RhbmNlX2lkPSR7dGhpcy5pbnN0YW5jZUlkfWApO1xuXG4gICAgcmV0dXJuIGRhdGEua2Fma2E7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RUb1NlcnZlcigpOiBQcm9taXNlPEthZmthQ29uZmlnPiB7XG4gICAgbGV0IHJldHJ5SW50ZXJ2YWwgPSAxMDAwOyAvLyBTdGFydCBhdCAxIHNlY29uZFxuICAgIGNvbnN0IG1heFJldHJ5SW50ZXJ2YWwgPSA2MDAwMDA7IC8vIE1heCAxMCBtaW51dGVzXG4gICAgY29uc3QgYmFja29mZk11bHRpcGxpZXIgPSAyLjA7XG5cbiAgICB3aGlsZSAodGhpcy5ydW5uaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0VG9TZXJ2ZXJPbmNlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgLy8gRG9uJ3QgcmV0cnkgb24gYXV0aCBlcnJvcnNcbiAgICAgICAgaWYgKGVyci5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIG9yIGV4cGlyZWQgQVBJIGtleScpIHx8IFxuICAgICAgICAgICAgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ2RvZXMgbm90IGhhdmUgcGVybWlzc2lvbicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgV29ya2VyIGZhaWxlZCB0byBzdGFydDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUud2FybihgQ29ubmVjdGlvbiBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9LiBSZXRyeWluZyBpbiAke01hdGgucm91bmQocmV0cnlJbnRlcnZhbCAvIDEwMDApfXMuLi5gKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJldHJ5SW50ZXJ2YWwpKTtcbiAgICAgICAgcmV0cnlJbnRlcnZhbCA9IE1hdGgubWluKHJldHJ5SW50ZXJ2YWwgKiBiYWNrb2ZmTXVsdGlwbGllciwgbWF4UmV0cnlJbnRlcnZhbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdXb3JrZXIgc3RvcHBlZCBiZWZvcmUgY29ubmVjdGlvbiBjb3VsZCBiZSBlc3RhYmxpc2hlZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVLYWZrYUNsaWVudChrYWZrYUNvbmZpZzogS2Fma2FDb25maWcpOiBLYWZrYSB7XG4gICAgY29uc3QgYXV0aCA9IGthZmthQ29uZmlnLmF1dGg7XG4gICAgXG4gICAgLy8gU2VydmVyIHJldHVybnMgYnJva2VycyBhcyBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5XG4gICAgY29uc3QgYnJva2VycyA9IHR5cGVvZiBrYWZrYUNvbmZpZy5icm9rZXJzID09PSAnc3RyaW5nJ1xuICAgICAgPyAoa2Fma2FDb25maWcuYnJva2VycyBhcyBzdHJpbmcpLnNwbGl0KCcsJykubWFwKGIgPT4gYi50cmltKCkpLmZpbHRlcihiID0+IGIpXG4gICAgICA6IGthZmthQ29uZmlnLmJyb2tlcnM7XG4gICAgXG4gICAgY29uc3QgY29uZmlnOiBhbnkgPSB7XG4gICAgICBjbGllbnRJZDogYHdvcmtmbG93LXdvcmtlci0ke3RoaXMud29ya2VySWR9YCxcbiAgICAgIGJyb2tlcnMsXG4gICAgICBsb2dMZXZlbDogbG9nTGV2ZWwuV0FSTixcbiAgICB9O1xuXG4gICAgaWYgKGF1dGg/LnR5cGUgPT09ICdtc2tfaWFtJykge1xuICAgICAgY29uZmlnLnNzbCA9IHRydWU7XG4gICAgICBjb25maWcuc2FzbCA9IHtcbiAgICAgICAgbWVjaGFuaXNtOiAnb2F1dGhiZWFyZXInLFxuICAgICAgICBvYXV0aEJlYXJlclByb3ZpZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZW5lcmF0ZUF1dGhUb2tlbkZyb21DcmVkZW50aWFsc1Byb3ZpZGVyKHtcbiAgICAgICAgICAgIHJlZ2lvbjogYXV0aC5yZWdpb24hLFxuICAgICAgICAgICAgYXdzQ3JlZGVudGlhbHNQcm92aWRlcjogYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IGF1dGguYWNjZXNzX2tleV9pZCEsXG4gICAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleTogYXV0aC5zZWNyZXRfYWNjZXNzX2tleSEsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdG9rZW4udG9rZW4gfTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgU0FTTE9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChhdXRoPy50eXBlID09PSAnc2FzbCcpIHtcbiAgICAgIGlmIChhdXRoLnNlY3VyaXR5X3Byb3RvY29sPy5pbmNsdWRlcygnU1NMJykpIHtcbiAgICAgICAgY29uZmlnLnNzbCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoYXV0aC5zYXNsX21lY2hhbmlzbSAmJiBhdXRoLnNhc2xfdXNlcm5hbWUgJiYgYXV0aC5zYXNsX3Bhc3N3b3JkKSB7XG4gICAgICAgIGNvbmZpZy5zYXNsID0ge1xuICAgICAgICAgIG1lY2hhbmlzbTogYXV0aC5zYXNsX21lY2hhbmlzbS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJy0nLCAnJyksXG4gICAgICAgICAgdXNlcm5hbWU6IGF1dGguc2FzbF91c2VybmFtZSxcbiAgICAgICAgICBwYXNzd29yZDogYXV0aC5zYXNsX3Bhc3N3b3JkLFxuICAgICAgICB9IGFzIFNBU0xPcHRpb25zO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgS2Fma2EoY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRIZWFydGJlYXQoKTogdm9pZCB7XG4gICAgbGV0IGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgIGNvbnN0IG1heEZhaWx1cmVzQmVmb3JlUmVjb25uZWN0ID0gMztcblxuICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucnVubmluZykgcmV0dXJuO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMuY29uZmlnLnNlcnZlclVybH0vd29ya2Zsb3cvYXBpL3YxL3dvcmtlcnMvaGVhcnRiZWF0YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZCB9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdIZWFydGJlYXQgZmFpbGVkOiBJbnZhbGlkIG9yIGV4cGlyZWQgQVBJIGtleScpO1xuICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEhlYXJ0YmVhdCBmYWlsZWQ6IEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcysrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0hlYXJ0YmVhdCBlcnJvcjonLCAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzKys7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyaWdnZXIgcmVjb25uZWN0aW9uIGlmIHRvbyBtYW55IGNvbnNlY3V0aXZlIGZhaWx1cmVzXG4gICAgICBpZiAoY29uc2VjdXRpdmVGYWlsdXJlcyA+PSBtYXhGYWlsdXJlc0JlZm9yZVJlY29ubmVjdCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEhlYXJ0YmVhdCBmYWlsZWQgJHtjb25zZWN1dGl2ZUZhaWx1cmVzfSB0aW1lcyBjb25zZWN1dGl2ZWx5LiBgICtcbiAgICAgICAgICAnQ29ubmVjdGlvbiBtYXkgYmUgbG9zdCwgdHJpZ2dlcmluZyByZWNvbm5lY3Rpb24uLi4nXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubmVlZHNSZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5oZWFydGJlYXRJbnRlcnZhbCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRJbnRlcnZhbCk7XG4gICAgICAgICAgdGhpcy5oZWFydGJlYXRJbnRlcnZhbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNjb25uZWN0RnJvbVNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2VJZCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5jb25maWcuc2VydmVyVXJsfS93b3JrZmxvdy9hcGkvdjEvd29ya2Vycy9kaXNjb25uZWN0YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYXBpS2V5fWAsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZCB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3RlZCBmcm9tIHNlcnZlcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gc2VydmVyOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNZXNzYWdlKGRhdGE6IGFueSwgcmVzdWx0VG9waWM6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gYWN0aXZpdHkgcmVzdWx0IChyZXNwb25zZSBmcm9tIGFub3RoZXIgd29ya2VyIHZpYSBzZXJ2ZXIpXG4gICAgaWYgKGRhdGEuc3RhdHVzICYmIGRhdGEuY29tcGxldGVkX2F0ICYmICFkYXRhLnRhc2tfdHlwZSkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnUmVjZWl2ZWQgYWN0aXZpdHkgcmVzdWx0IG9uIHdvcmtlciB0b3BpYyAoaWdub3JlZCAtIHVzaW5nIHBvbGxpbmcpJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFza1R5cGUgPSBkYXRhLnRhc2tfdHlwZSB8fCAnYWN0aXZpdHknO1xuXG4gICAgaWYgKHRhc2tUeXBlID09PSAnd29ya2Zsb3cnKSB7XG4gICAgICAvLyBDb25jdXJyZW5jeSBpcyBjb250cm9sbGVkIGJ5IHBhcnRpdGlvbnNDb25zdW1lZENvbmN1cnJlbnRseSBpbiBjb25zdW1lci5ydW4oKVxuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlV29ya2Zsb3coZGF0YSBhcyBXb3JrZmxvd1Rhc2ssIHJlc3VsdFRvcGljKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWN0aXZpdHkgdGFza3MgY2FuIGJlIHByb2Nlc3NlZCBpbmxpbmVcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0FjdGl2aXR5VGFzayhkYXRhLCByZXN1bHRUb3BpYyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlV29ya2Zsb3codGFzazogV29ya2Zsb3dUYXNrLCByZXN1bHRUb3BpYzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coYFJlY2VpdmVkIHdvcmtmbG93IHRhc2sgJHt0YXNrLnRhc2tfaWR9OiAke3Rhc2sud29ya2Zsb3dfbmFtZX1gKTtcblxuICAgIC8vIEZpbmQgdGhlIHdvcmtmbG93IGNsYXNzXG4gICAgY29uc3Qgd29ya2Zsb3dDbHMgPSB0aGlzLndvcmtmbG93cy5nZXQodGFzay53b3JrZmxvd19uYW1lKTtcbiAgICBpZiAoIXdvcmtmbG93Q2xzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFVua25vd24gd29ya2Zsb3c6ICR7dGFzay53b3JrZmxvd19uYW1lfWApO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kV29ya2Zsb3dSZXN1bHQodGFzaywgcmVzdWx0VG9waWMsICdmYWlsZWQnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgdHlwZTogJ1Vua25vd25Xb3JrZmxvdycsXG4gICAgICAgIG1lc3NhZ2U6IGBXb3JrZmxvdyAnJHt0YXNrLndvcmtmbG93X25hbWV9JyBub3QgcmVnaXN0ZXJlZGAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBydW4gbWV0aG9kXG4gICAgY29uc3QgcnVuTWV0aG9kID0gZmluZFJ1bk1ldGhvZCh3b3JrZmxvd0Nscyk7XG4gICAgaWYgKCFydW5NZXRob2QpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZFdvcmtmbG93UmVzdWx0KHRhc2ssIHJlc3VsdFRvcGljLCAnZmFpbGVkJywgdW5kZWZpbmVkLCB7XG4gICAgICAgIHR5cGU6ICdOb1J1bk1ldGhvZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBXb3JrZmxvdyAnJHt0YXNrLndvcmtmbG93X25hbWV9JyBoYXMgbm8gcnVuIG1ldGhvZGAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIHRoZSB3b3JrZmxvd1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJ1aWxkIGNvbXBsZXRlZCBhY3Rpdml0aWVzIG1hcCBmb3IgcmVwbGF5XG4gICAgICBjb25zdCBjb21wbGV0ZWRBY3Rpdml0aWVzTWFwID0gbmV3IE1hcDxudW1iZXIsIHVua25vd24+KCk7XG4gICAgICBpZiAodGFzay5jb21wbGV0ZWRfYWN0aXZpdGllcykge1xuICAgICAgICBmb3IgKGNvbnN0IGNhIG9mIHRhc2suY29tcGxldGVkX2FjdGl2aXRpZXMpIHtcbiAgICAgICAgICBjb21wbGV0ZWRBY3Rpdml0aWVzTWFwLnNldChjYS5pbmRleCwgY2Eub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgUmVzdW1pbmcgd29ya2Zsb3cgJHt0YXNrLndvcmtmbG93X2lkfSB3aXRoICR7Y29tcGxldGVkQWN0aXZpdGllc01hcC5zaXplfSBjb21wbGV0ZWQgYWN0aXZpdGllc2BcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHdvcmtmbG93IGNvbnRleHRcbiAgICAgIGNvbnN0IGN0eCA9IG5ldyBXb3JrZmxvd0NvbnRleHQoXG4gICAgICAgIHRoaXMuYWN0aXZpdGllcyxcbiAgICAgICAgdGFzay53b3JrZmxvd19pZCxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgY29tcGxldGVkQWN0aXZpdGllc01hcC5zaXplID4gMCA/IGNvbXBsZXRlZEFjdGl2aXRpZXNNYXAgOiBudWxsLFxuICAgICAgICB0YXNrLm1ldGFkYXRhXG4gICAgICApO1xuXG4gICAgICAvLyBFeGVjdXRlIHdpdGhpbiBjb250ZXh0XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBydW5XaXRoQ29udGV4dChjdHgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgcnVuTWV0aG9kKHRhc2suaW5wdXQpLFxuICAgICAgICAgIG5ldyBQcm9taXNlPG5ldmVyPigoXywgcmVqZWN0KSA9PlxuICAgICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgV29ya2Zsb3cgdGltZWQgb3V0IGFmdGVyICR7dGFzay50aW1lb3V0X21zfW1zYCkpLFxuICAgICAgICAgICAgICB0YXNrLnRpbWVvdXRfbXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gc3RhcnRlZEF0LmdldFRpbWUoKTtcblxuICAgICAgY29uc29sZS5sb2coYFdvcmtmbG93ICR7dGFzay50YXNrX2lkfSBjb21wbGV0ZWQgaW4gJHtkdXJhdGlvbk1zfW1zYCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZFdvcmtmbG93UmVzdWx0KFxuICAgICAgICB0YXNrLFxuICAgICAgICByZXN1bHRUb3BpYyxcbiAgICAgICAgJ2NvbXBsZXRlZCcsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgICBkdXJhdGlvbk1zXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gc3RhcnRlZEF0LmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuXG4gICAgICBjb25zb2xlLmVycm9yKGBXb3JrZmxvdyAke3Rhc2sudGFza19pZH0gZmFpbGVkOmAsIGVyci5tZXNzYWdlKTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kV29ya2Zsb3dSZXN1bHQoXG4gICAgICAgIHRhc2ssXG4gICAgICAgIHJlc3VsdFRvcGljLFxuICAgICAgICAnZmFpbGVkJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogZXJyLm5hbWUgfHwgJ0Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFja190cmFjZTogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgICBkdXJhdGlvbk1zXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0FjdGl2aXR5VGFzayhkYXRhOiBBY3Rpdml0eVRhc2ssIHJlc3VsdFRvcGljOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YXNrID0gZGF0YTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBSZWNlaXZlZCBhY3Rpdml0eSB0YXNrICR7dGFzay50YXNrX2lkfTogJHt0YXNrLmFjdGl2aXR5X25hbWV9ICh3b3JrZmxvdz0ke3Rhc2sud29ya2Zsb3dfaWR9KWBcbiAgICApO1xuXG4gICAgLy8gRmluZCB0aGUgYWN0aXZpdHkgaGFuZGxlclxuICAgIGNvbnN0IGFjdGl2aXR5Rm4gPSB0aGlzLmFjdGl2aXRpZXMuZ2V0KHRhc2suYWN0aXZpdHlfbmFtZSk7XG4gICAgaWYgKCFhY3Rpdml0eUZuKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFVua25vd24gYWN0aXZpdHk6ICR7dGFzay5hY3Rpdml0eV9uYW1lfWApO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQWN0aXZpdHlSZXN1bHQodGFzaywgcmVzdWx0VG9waWMsICdmYWlsZWQnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgdHlwZTogJ1Vua25vd25BY3Rpdml0eScsXG4gICAgICAgIG1lc3NhZ2U6IGBBY3Rpdml0eSAnJHt0YXNrLmFjdGl2aXR5X25hbWV9JyBub3QgcmVnaXN0ZXJlZGAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIHRoZSBhY3Rpdml0eVxuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIFByb21pc2UucmVzb2x2ZShhY3Rpdml0eUZuKHRhc2suaW5wdXQpKSxcbiAgICAgICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+XG4gICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHJlamVjdChuZXcgRXJyb3IoYEFjdGl2aXR5IHRpbWVkIG91dCBhZnRlciAke3Rhc2sudGltZW91dF9tc31tc2ApKSxcbiAgICAgICAgICAgIHRhc2sudGltZW91dF9tc1xuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gc3RhcnRlZEF0LmdldFRpbWUoKTtcblxuICAgICAgY29uc29sZS5sb2coYEFjdGl2aXR5ICR7dGFzay50YXNrX2lkfSBjb21wbGV0ZWQgaW4gJHtkdXJhdGlvbk1zfW1zYCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZEFjdGl2aXR5UmVzdWx0KFxuICAgICAgICB0YXNrLFxuICAgICAgICByZXN1bHRUb3BpYyxcbiAgICAgICAgJ2NvbXBsZXRlZCcsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgICBkdXJhdGlvbk1zXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gc3RhcnRlZEF0LmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuXG4gICAgICBjb25zb2xlLmVycm9yKGBBY3Rpdml0eSAke3Rhc2sudGFza19pZH0gZmFpbGVkOmAsIGVyci5tZXNzYWdlKTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kQWN0aXZpdHlSZXN1bHQoXG4gICAgICAgIHRhc2ssXG4gICAgICAgIHJlc3VsdFRvcGljLFxuICAgICAgICAnZmFpbGVkJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogZXJyLm5hbWUgfHwgJ0Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFja190cmFjZTogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgICBkdXJhdGlvbk1zXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZFdvcmtmbG93UmVzdWx0KFxuICAgIHRhc2s6IFdvcmtmbG93VGFzayxcbiAgICByZXN1bHRUb3BpYzogc3RyaW5nLFxuICAgIHN0YXR1czogJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyxcbiAgICBvdXRwdXQ/OiB1bmtub3duLFxuICAgIGVycm9yPzogV29ya2Zsb3dFcnJvcixcbiAgICBzdGFydGVkQXQ/OiBEYXRlLFxuICAgIGNvbXBsZXRlZEF0PzogRGF0ZSxcbiAgICBkdXJhdGlvbk1zID0gMFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHJlc3VsdDogV29ya2Zsb3dSZXN1bHQgPSB7XG4gICAgICB0YXNrX2lkOiB0YXNrLnRhc2tfaWQsXG4gICAgICB3b3JrZmxvd19pZDogdGFzay53b3JrZmxvd19pZCxcbiAgICAgIHdvcmtmbG93X25hbWU6IHRhc2sud29ya2Zsb3dfbmFtZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIG91dHB1dCxcbiAgICAgIGVycm9yLFxuICAgICAgc3RhcnRlZF9hdDogKHN0YXJ0ZWRBdCB8fCBub3cpLnRvSVNPU3RyaW5nKCksXG4gICAgICBjb21wbGV0ZWRfYXQ6IChjb21wbGV0ZWRBdCB8fCBub3cpLnRvSVNPU3RyaW5nKCksXG4gICAgICBkdXJhdGlvbl9tczogZHVyYXRpb25NcyxcbiAgICAgIHdvcmtlcl9pZDogdGhpcy53b3JrZXJJZCEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnByb2R1Y2VyKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLnNlbmQoe1xuICAgICAgICB0b3BpYzogcmVzdWx0VG9waWMsXG4gICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiB0YXNrLndvcmtmbG93X2lkLFxuICAgICAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5kZWJ1ZyhgU2VudCB3b3JrZmxvdyByZXN1bHQgZm9yIHRhc2sgJHt0YXNrLnRhc2tfaWR9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kQWN0aXZpdHlSZXN1bHQoXG4gICAgdGFzazogQWN0aXZpdHlUYXNrLFxuICAgIHJlc3VsdFRvcGljOiBzdHJpbmcsXG4gICAgc3RhdHVzOiAnY29tcGxldGVkJyB8ICdmYWlsZWQnLFxuICAgIG91dHB1dD86IHVua25vd24sXG4gICAgZXJyb3I/OiBBY3Rpdml0eUVycm9yLFxuICAgIHN0YXJ0ZWRBdD86IERhdGUsXG4gICAgY29tcGxldGVkQXQ/OiBEYXRlLFxuICAgIGR1cmF0aW9uTXMgPSAwXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmVzdWx0OiBBY3Rpdml0eVJlc3VsdCA9IHtcbiAgICAgIHRhc2tfaWQ6IHRhc2sudGFza19pZCxcbiAgICAgIHdvcmtmbG93X2lkOiB0YXNrLndvcmtmbG93X2lkLFxuICAgICAgYWN0aXZpdHlfbmFtZTogdGFzay5hY3Rpdml0eV9uYW1lLFxuICAgICAgYWN0aXZpdHlfaW5kZXg6IHRhc2suYWN0aXZpdHlfaW5kZXgsXG4gICAgICBmYW5fb3V0X2luZGV4OiB0YXNrLmZhbl9vdXRfaW5kZXgsXG4gICAgICBzdGF0dXMsXG4gICAgICBvdXRwdXQsXG4gICAgICBlcnJvcixcbiAgICAgIHN0YXJ0ZWRfYXQ6IChzdGFydGVkQXQgfHwgbm93KS50b0lTT1N0cmluZygpLFxuICAgICAgY29tcGxldGVkX2F0OiAoY29tcGxldGVkQXQgfHwgbm93KS50b0lTT1N0cmluZygpLFxuICAgICAgZHVyYXRpb25fbXM6IGR1cmF0aW9uTXMsXG4gICAgICB3b3JrZXJfaWQ6IHRoaXMud29ya2VySWQhLFxuICAgICAgcmVxdWVzdGVyX3dvcmtlcl9pZDogdGFzay5yZXF1ZXN0ZXJfd29ya2VyX2lkLFxuICAgICAgY29ycmVsYXRpb25faWQ6IHRhc2suY29ycmVsYXRpb25faWQsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnByb2R1Y2VyKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLnNlbmQoe1xuICAgICAgICB0b3BpYzogcmVzdWx0VG9waWMsXG4gICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiB0YXNrLndvcmtmbG93X2lkLFxuICAgICAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5kZWJ1ZyhgU2VudCBhY3Rpdml0eSByZXN1bHQgZm9yIHRhc2sgJHt0YXNrLnRhc2tfaWR9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV29ya2VySW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBXb3JrZmxvd0NvbnRleHRcblxuICBhc3luYyByZXBvcnRMb2NhbEFjdGl2aXR5Q29tcGxldGlvbihcbiAgICB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlOYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlJbmRleDogbnVtYmVyLFxuICAgIG91dHB1dDogdW5rbm93bixcbiAgICBkdXJhdGlvbk1zOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnByb2R1Y2VyIHx8ICF0aGlzLnJlc3VsdFRvcGljKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdDYW5ub3QgcmVwb3J0IGxvY2FsIGFjdGl2aXR5IC0gcHJvZHVjZXIgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0LmdldFRpbWUoKSAtIGR1cmF0aW9uTXMpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgdGFza19pZDogYGxvY2FsLSR7d29ya2Zsb3dJZH0tJHthY3Rpdml0eUluZGV4fWAsXG4gICAgICB3b3JrZmxvd19pZDogd29ya2Zsb3dJZCxcbiAgICAgIGFjdGl2aXR5X25hbWU6IGFjdGl2aXR5TmFtZSxcbiAgICAgIGFjdGl2aXR5X2luZGV4OiBhY3Rpdml0eUluZGV4LFxuICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgIG91dHB1dCxcbiAgICAgIHN0YXJ0ZWRfYXQ6IHN0YXJ0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgY29tcGxldGVkX2F0OiBjb21wbGV0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgZHVyYXRpb25fbXM6IGR1cmF0aW9uTXMsXG4gICAgICB3b3JrZXJfaWQ6IHRoaXMud29ya2VySWQsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLnNlbmQoe1xuICAgICAgICB0b3BpYzogdGhpcy5yZXN1bHRUb3BpYyxcbiAgICAgICAgbWVzc2FnZXM6IFt7IGtleTogd29ya2Zsb3dJZCwgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkgfV0sXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgIGBSZXBvcnRlZCBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uOiB3b3JrZmxvd19pZD0ke3dvcmtmbG93SWR9LCBhY3Rpdml0eT0ke2FjdGl2aXR5TmFtZX0sIGluZGV4PSR7YWN0aXZpdHlJbmRleH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZXBvcnQgbG9jYWwgYWN0aXZpdHkgY29tcGxldGlvbjonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVwb3J0TG9jYWxBY3Rpdml0eUZhaWx1cmUoXG4gICAgd29ya2Zsb3dJZDogc3RyaW5nLFxuICAgIGFjdGl2aXR5TmFtZTogc3RyaW5nLFxuICAgIGFjdGl2aXR5SW5kZXg6IG51bWJlcixcbiAgICBlcnJvcjogc3RyaW5nLFxuICAgIGVycm9yVHlwZTogc3RyaW5nLFxuICAgIGR1cmF0aW9uTXM6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucHJvZHVjZXIgfHwgIXRoaXMucmVzdWx0VG9waWMpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ0Nhbm5vdCByZXBvcnQgbG9jYWwgYWN0aXZpdHkgZmFpbHVyZSAtIHByb2R1Y2VyIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBuZXcgRGF0ZShjb21wbGV0ZWRBdC5nZXRUaW1lKCkgLSBkdXJhdGlvbk1zKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHRhc2tfaWQ6IGBsb2NhbC0ke3dvcmtmbG93SWR9LSR7YWN0aXZpdHlJbmRleH1gLFxuICAgICAgd29ya2Zsb3dfaWQ6IHdvcmtmbG93SWQsXG4gICAgICBhY3Rpdml0eV9uYW1lOiBhY3Rpdml0eU5hbWUsXG4gICAgICBhY3Rpdml0eV9pbmRleDogYWN0aXZpdHlJbmRleCxcbiAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICBvdXRwdXQ6IG51bGwsXG4gICAgICBlcnJvcjogeyB0eXBlOiBlcnJvclR5cGUsIG1lc3NhZ2U6IGVycm9yIH0sXG4gICAgICBzdGFydGVkX2F0OiBzdGFydGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIGNvbXBsZXRlZF9hdDogY29tcGxldGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIGR1cmF0aW9uX21zOiBkdXJhdGlvbk1zLFxuICAgICAgd29ya2VyX2lkOiB0aGlzLndvcmtlcklkLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5wcm9kdWNlci5zZW5kKHtcbiAgICAgICAgdG9waWM6IHRoaXMucmVzdWx0VG9waWMsXG4gICAgICAgIG1lc3NhZ2VzOiBbeyBrZXk6IHdvcmtmbG93SWQsIHZhbHVlOiBKU09OLnN0cmluZ2lmeShyZXN1bHQpIH1dLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICBgUmVwb3J0ZWQgbG9jYWwgYWN0aXZpdHkgZmFpbHVyZTogd29ya2Zsb3dfaWQ9JHt3b3JrZmxvd0lkfSwgYWN0aXZpdHk9JHthY3Rpdml0eU5hbWV9LCBpbmRleD0ke2FjdGl2aXR5SW5kZXh9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVwb3J0IGxvY2FsIGFjdGl2aXR5IGZhaWx1cmU6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVSZW1vdGVBY3Rpdml0eShcbiAgICB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlOYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlJbmRleDogbnVtYmVyLFxuICAgIGlucHV0RGF0YTogdW5rbm93bixcbiAgICB0aW1lb3V0TXM6IG51bWJlclxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMucHJvZHVjZXIgfHwgIXRoaXMucmVzdWx0VG9waWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2Fma2EgcHJvZHVjZXIgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuXG4gICAgLy8gU2VuZCBBY3Rpdml0eVJlcXVlc3QgdG8gc2VydmVyIHZpYSBLYWZrYVxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0ge1xuICAgICAgcmVxdWVzdF90eXBlOiAnYWN0aXZpdHlfcmVxdWVzdCcsXG4gICAgICByZXF1ZXN0X2lkOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgd29ya2Zsb3dfaWQ6IHdvcmtmbG93SWQsXG4gICAgICBhY3Rpdml0eV9uYW1lOiBhY3Rpdml0eU5hbWUsXG4gICAgICBhY3Rpdml0eV9pbmRleDogYWN0aXZpdHlJbmRleCxcbiAgICAgIGlucHV0OiBpbnB1dERhdGEsXG4gICAgICB0aW1lb3V0X21zOiB0aW1lb3V0TXMsXG4gICAgICByZXF1ZXN0ZXJfd29ya2VyX2lkOiB0aGlzLndvcmtlcklkLFxuICAgICAgY29ycmVsYXRpb25faWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG4gICAgICB0b3BpYzogdGhpcy5yZXN1bHRUb3BpYyxcbiAgICAgIG1lc3NhZ2VzOiBbeyBrZXk6IHdvcmtmbG93SWQsIHZhbHVlOiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0UGF5bG9hZCkgfV0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBBY3Rpdml0eSByZXF1ZXN0IHNlbnQgdmlhIEthZmthOiBhY3Rpdml0eT0ke2FjdGl2aXR5TmFtZX0sIHdvcmtmbG93X2lkPSR7d29ya2Zsb3dJZH0sIGFjdGl2aXR5X2luZGV4PSR7YWN0aXZpdHlJbmRleH1gXG4gICAgKTtcblxuICAgIC8vIFBvbGwgc2VydmVyIGZvciByZXN1bHQgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAgbGV0IHBvbGxJbnRlcnZhbCA9IDIwMDA7IC8vIFN0YXJ0IGF0IDIgc2Vjb25kc1xuICAgIGNvbnN0IG1heFBvbGxJbnRlcnZhbCA9IDkwMDAwMDsgLy8gTWF4IDE1IG1pbnV0ZXNcbiAgICBjb25zdCBiYWNrb2ZmTXVsdGlwbGllciA9IDEuNTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gdGltZW91dE1zO1xuXG4gICAgY29uc3QgcG9sbFVybCA9IGAke3RoaXMuY29uZmlnLnNlcnZlclVybH0vd29ya2Zsb3cvYXBpL3YxL3dvcmtmbG93cy8ke3dvcmtmbG93SWR9L2FjdGl2aXRpZXMvJHthY3Rpdml0eUluZGV4fS9yZXN1bHRgO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCB9O1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgaWYgKGVsYXBzZWQgPj0gdGltZW91dFNlY29uZHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gdGltZWQgb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocG9sbFVybCwgeyBoZWFkZXJzIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyB7IHN0YXR1czogc3RyaW5nOyBvdXRwdXQ/OiB1bmtub3duOyBlcnJvcj86IHN0cmluZyB9O1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnY29tcGxldGVkJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEFjdGl2aXR5ICR7YWN0aXZpdHlOYW1lfSBjb21wbGV0ZWQgZm9yIHdvcmtmbG93ICR7d29ya2Zsb3dJZH1gKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQub3V0cHV0O1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gcmVzdWx0LmVycm9yIHx8ICdBY3Rpdml0eSBmYWlsZWQnO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQWN0aXZpdHkgJHthY3Rpdml0eU5hbWV9IGZhaWxlZDogJHtlcnJvck1zZ31gKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAyKSB7XG4gICAgICAgICAgLy8gU3RpbGwgcGVuZGluZy9ydW5uaW5nLCBjb250aW51ZSBwb2xsaW5nXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhgQWN0aXZpdHkgJHthY3Rpdml0eU5hbWV9IHN0aWxsIHJ1bm5pbmcsIHBvbGxpbmcgYWdhaW4gaW4gJHtwb2xsSW50ZXJ2YWx9bXNgKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgIC8vIEFjdGl2aXR5IG5vdCBmb3VuZCB5ZXRcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gbm90IGZvdW5kIHlldCwgcG9sbGluZyBhZ2FpbiBpbiAke3BvbGxJbnRlcnZhbH1tc2ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgVW5leHBlY3RlZCByZXNwb25zZSAke3Jlc3BvbnNlLnN0YXR1c30gd2hlbiBwb2xsaW5nIGFjdGl2aXR5IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlLmluY2x1ZGVzKCd0aW1lZCBvdXQnKSB8fCAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UuaW5jbHVkZXMoJ2ZhaWxlZCcpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBwb2xsaW5nIGFjdGl2aXR5IHJlc3VsdDonLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFdhaXQgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBwb2xsSW50ZXJ2YWwpKTtcbiAgICAgIHBvbGxJbnRlcnZhbCA9IE1hdGgubWluKHBvbGxJbnRlcnZhbCAqIGJhY2tvZmZNdWx0aXBsaWVyLCBtYXhQb2xsSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cEthZmthKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFN0b3AgaGVhcnRiZWF0XG4gICAgaWYgKHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRJbnRlcnZhbCk7XG4gICAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTdG9wIEthZmthIGNsaWVudHNcbiAgICBpZiAodGhpcy5jb25zdW1lcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25zdW1lci5kaXNjb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBkaXNjb25uZWN0IGVycm9yc1xuICAgICAgfVxuICAgICAgdGhpcy5jb25zdW1lciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2R1Y2VyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWdub3JlIGRpc2Nvbm5lY3QgZXJyb3JzXG4gICAgICB9XG4gICAgICB0aGlzLnByb2R1Y2VyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsZWFudXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwS2Fma2EoKTtcblxuICAgIC8vIERpc2Nvbm5lY3QgZnJvbSBzZXJ2ZXJcbiAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3RGcm9tU2VydmVyKCk7XG5cbiAgICBjb25zb2xlLmxvZyhgV29ya2VyICR7dGhpcy53b3JrZXJJZH0gc3RvcHBlZGApO1xuICB9XG59XG4iXX0=
786
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUVBQXlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFekUscUNBQTJFO0FBQzNFLDJFQUFzRjtBQUN0Rix1Q0FBeUI7QUFDekIsbURBQXdEO0FBZXhELHlDQUFtSDtBQUNuSCx5Q0FBNkM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQWEsTUFBTTtJQUNULE1BQU0sQ0FBZTtJQUNyQixTQUFTLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbEQsVUFBVSxHQUFpQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXJELFFBQVEsR0FBa0IsSUFBSSxDQUFDO0lBQy9CLFVBQVUsR0FBa0IsSUFBSSxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsS0FBSyxHQUFpQixJQUFJLENBQUM7SUFDM0IsUUFBUSxHQUFvQixJQUFJLENBQUM7SUFDakMsUUFBUSxHQUFvQixJQUFJLENBQUM7SUFDakMsZUFBZSxHQUF3QixJQUFJLENBQUM7SUFDNUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQzVCLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0lBQ2xDLHNCQUFzQixDQUFTO0lBQy9CLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFFMUMsWUFBWSxNQUFvQjtRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osR0FBRyxNQUFNO1lBQ1QsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7U0FDL0MsQ0FBQztRQUNGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsc0JBQXNCLElBQUksRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7T0FFRztJQUNI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QUFDO1FBRWxDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsUUFBUSxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUF2M0JELHdCQXUzQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXb3JrZXIgLSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGZvciBleGVjdXRpbmcgd29ya2Zsb3dzIGFuZCBhY3Rpdml0aWVzXG5cbmltcG9ydCB7IEthZmthLCBDb25zdW1lciwgUHJvZHVjZXIsIFNBU0xPcHRpb25zLCBsb2dMZXZlbCB9IGZyb20gJ2thZmthanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBdXRoVG9rZW5Gcm9tQ3JlZGVudGlhbHNQcm92aWRlciB9IGZyb20gJ2F3cy1tc2staWFtLXNhc2wtc2lnbmVyLWpzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCB7IFdvcmtlciBhcyBXb3JrZXJUaHJlYWQgfSBmcm9tICd3b3JrZXJfdGhyZWFkcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFdvcmtlckNvbmZpZyxcbiAgQWN0aXZpdHlIYW5kbGVyLFxuICBEZWNvcmF0ZWRBY3Rpdml0eSxcbiAgV29ya2Zsb3dDbGFzcyxcbiAgV29ya2Zsb3dUYXNrLFxuICBBY3Rpdml0eVRhc2ssXG4gIFdvcmtmbG93UmVzdWx0LFxuICBBY3Rpdml0eVJlc3VsdCxcbiAgV29ya2Zsb3dFcnJvcixcbiAgQWN0aXZpdHlFcnJvcixcbiAgS2Fma2FDb25maWcsXG4gIENvbm5lY3RSZXNwb25zZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0NvbnRleHQsIHJ1bldpdGhDb250ZXh0LCBnZXRXb3JrZmxvd05hbWUsIGZpbmRSdW5NZXRob2QsIHR5cGUgV29ya2VySW50ZXJmYWNlIH0gZnJvbSAnLi93b3JrZmxvdyc7XG5pbXBvcnQgeyBnZXRBY3Rpdml0eU5hbWUgfSBmcm9tICcuL2FjdGl2aXR5JztcblxuLyoqXG4gKiBXb3JrZXIgdGhhdCBleGVjdXRlcyB3b3JrZmxvd3MgYW5kIGFjdGl2aXRpZXMuXG4gKiBcbiAqIFVzYWdlOlxuICogICBpbXBvcnQgeyBXb3JrZXIsIHdvcmtmbG93LCBhY3Rpdml0eSB9IGZyb20gJ0ByYXNwZWN0L3dvcmtmbG93LXNkayc7XG4gKiAgIFxuICogICBjb25zdCBzYXlIZWxsbyA9IGFjdGl2aXR5LmRlZm4oYXN5bmMgKGlucHV0OiB7IG5hbWU6IHN0cmluZyB9KSA9PiB7XG4gKiAgICAgcmV0dXJuIHsgbWVzc2FnZTogYEhlbGxvLCAke2lucHV0Lm5hbWV9IWAgfTtcbiAqICAgfSk7XG4gKiAgIFxuICogICBAd29ya2Zsb3cuZGVmblxuICogICBjbGFzcyBIZWxsb1dvcmxkV29ya2Zsb3cge1xuICogICAgIEB3b3JrZmxvdy5ydW5cbiAqICAgICBhc3luYyBydW4oaW5wdXQ6IHsgbmFtZTogc3RyaW5nIH0pIHtcbiAqICAgICAgIHJldHVybiBhd2FpdCB3b3JrZmxvdy5leGVjdXRlQWN0aXZpdHkoc2F5SGVsbG8sIGlucHV0KTtcbiAqICAgICB9XG4gKiAgIH1cbiAqICAgXG4gKiAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIoe1xuICogICAgIHNlcnZlclVybDogJ2h0dHBzOi8vd29ya2Zsb3cuZXhhbXBsZS5jb20nLFxuICogICAgIGFwaUtleTogJ3drX3lvdXJfd29ya2VyX2FwaV9rZXknLCAgLy8gV29ya2VyIEFQSSBrZXkgZnJvbSBzZXJ2ZXIgVUlcbiAqICAgfSk7XG4gKiAgIHdvcmtlci5yZWdpc3Rlcih7IHdvcmtmbG93czogW0hlbGxvV29ybGRXb3JrZmxvd10sIGFjdGl2aXRpZXM6IFtzYXlIZWxsb10gfSk7XG4gKiAgIGF3YWl0IHdvcmtlci5ydW4oKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtlciBpbXBsZW1lbnRzIFdvcmtlckludGVyZmFjZSB7XG4gIHByaXZhdGUgY29uZmlnOiBXb3JrZXJDb25maWc7XG4gIHByaXZhdGUgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd0NsYXNzPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBhY3Rpdml0aWVzOiBNYXA8c3RyaW5nLCBBY3Rpdml0eUhhbmRsZXI+ID0gbmV3IE1hcCgpO1xuICBcbiAgcHJpdmF0ZSB3b3JrZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaW5zdGFuY2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcnVubmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGthZmthOiBLYWZrYSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbnN1bWVyOiBDb25zdW1lciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByb2R1Y2VyOiBQcm9kdWNlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhlYXJ0YmVhdFdvcmtlcjogV29ya2VyVGhyZWFkIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaGVhcnRiZWF0SW50ZXJ2YWxNcyA9IDMwMDAwO1xuICBwcml2YXRlIHJlc3VsdFRvcGljOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXhDb25jdXJyZW50V29ya2Zsb3dzOiBudW1iZXI7XG4gIHByaXZhdGUgbmVlZHNSZWNvbm5lY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSB3b3JrZXJUb3BpYzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBXb3JrZXJDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIHNlcnZlclVybDogY29uZmlnLnNlcnZlclVybC5yZXBsYWNlKC9cXC8kLywgJycpLFxuICAgIH07XG4gICAgdGhpcy5tYXhDb25jdXJyZW50V29ya2Zsb3dzID0gY29uZmlnLm1heENvbmN1cnJlbnRXb3JrZmxvd3MgfHwgMTA7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgd29ya2Zsb3dzIGFuZCBhY3Rpdml0aWVzLlxuICAgKi9cbiAgcmVnaXN0ZXIob3B0aW9uczoge1xuICAgIHdvcmtmbG93cz86IFdvcmtmbG93Q2xhc3NbXTtcbiAgICBhY3Rpdml0aWVzPzogRGVjb3JhdGVkQWN0aXZpdHlbXTtcbiAgfSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgd2ZDbHMgb2Ygb3B0aW9ucy53b3JrZmxvd3MgfHwgW10pIHtcbiAgICAgIGNvbnN0IHdmTmFtZSA9IGdldFdvcmtmbG93TmFtZSh3ZkNscyk7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXQod2ZOYW1lLCB3ZkNscyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhY3Rpdml0eUZuIG9mIG9wdGlvbnMuYWN0aXZpdGllcyB8fCBbXSkge1xuICAgICAgY29uc3QgYWN0aXZpdHlOYW1lID0gZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5Rm4pO1xuICAgICAgdGhpcy5hY3Rpdml0aWVzLnNldChhY3Rpdml0eU5hbWUsIGFjdGl2aXR5Rm4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgd29ya2VyIChibG9ja2luZykuXG4gICAqL1xuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcblxuICAgIC8vIFNldHVwIHNpZ25hbCBoYW5kbGVyc1xuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHRoaXMuc3RvcCgpKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4gdGhpcy5zdG9wKCkpO1xuXG4gICAgLy8gTWFpbiBsb29wIHdpdGggYXV0b21hdGljIHJlY29ubmVjdGlvblxuICAgIHdoaWxlICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdEFuZFJ1bigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcpIGJyZWFrO1xuICAgICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhdXRoIGVycm9yIHRoYXQgc2hvdWxkbid0IGJlIHJldHJpZWRcbiAgICAgICAgaWYgKGVyci5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIG9yIGV4cGlyZWQgQVBJIGtleScpIHx8IFxuICAgICAgICAgICAgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ2RvZXMgbm90IGhhdmUgcGVybWlzc2lvbicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgV29ya2VyIHN0b3BwZWQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcihgV29ya2VyIGVycm9yOiAke2Vyci5tZXNzYWdlfS4gV2lsbCBhdHRlbXB0IHRvIHJlY29ubmVjdC4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXBLYWZrYSgpO1xuICAgICAgICAvLyBTbWFsbCBkZWxheSBiZWZvcmUgcmVjb25uZWN0aW9uIGF0dGVtcHRcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMDApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBbmRSdW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5uZWVkc1JlY29ubmVjdCA9IGZhbHNlO1xuXG4gICAgLy8gQ29ubmVjdCB0byBzZXJ2ZXIgYW5kIGdldCBLYWZrYSBjb25maWdcbiAgICBjb25zdCBzZXJ2ZXJLYWZrYUNvbmZpZyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvU2VydmVyKCk7XG4gICAgY29uc3Qgd29ya2VyVG9waWMgPSBzZXJ2ZXJLYWZrYUNvbmZpZy53b3JrZXJfdG9waWM7XG4gICAgY29uc3QgcmVzdWx0VG9waWMgPSBzZXJ2ZXJLYWZrYUNvbmZpZy5yZXN1bHRfdG9waWM7XG4gICAgdGhpcy5yZXN1bHRUb3BpYyA9IHJlc3VsdFRvcGljO1xuICAgIHRoaXMud29ya2VyVG9waWMgPSB3b3JrZXJUb3BpYztcblxuICAgIC8vIENyZWF0ZSBLYWZrYSBjbGllbnRcbiAgICB0aGlzLmthZmthID0gdGhpcy5jcmVhdGVLYWZrYUNsaWVudChzZXJ2ZXJLYWZrYUNvbmZpZyk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGNvbnN1bWVyXG4gICAgY29uc3QgY29uc3VtZXJHcm91cElkID0gdGhpcy5jb25maWcuZ3JvdXBJZCB8fCBgd29ya2Zsb3ctd29ya2VyLSR7dGhpcy53b3JrZXJJZH1gO1xuICAgIC8vIFVzZSBnZW5lcm91cyBzZXNzaW9uL3JlYmFsYW5jZSB0aW1lb3V0cyBzbyBsb25nLXJ1bm5pbmcgd29ya2Zsb3dzIGRvbid0XG4gICAgLy8gY2F1c2UgdGhlIGJyb2tlciB0byBkcm9wIHRoZSBjb25zdW1lciBmcm9tIHRoZSBncm91cC5cbiAgICB0aGlzLmNvbnN1bWVyID0gdGhpcy5rYWZrYS5jb25zdW1lcih7XG4gICAgICBncm91cElkOiBjb25zdW1lckdyb3VwSWQsXG4gICAgICBzZXNzaW9uVGltZW91dDogNjAwMDAsXG4gICAgICByZWJhbGFuY2VUaW1lb3V0OiAxMjAwMDAsXG4gICAgICBoZWFydGJlYXRJbnRlcnZhbDogMTAwMDAsXG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIHByb2R1Y2VyXG4gICAgdGhpcy5wcm9kdWNlciA9IHRoaXMua2Fma2EucHJvZHVjZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbnN1bWVyLmNvbm5lY3QoKTtcbiAgICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuY29ubmVjdCgpO1xuICAgICAgYXdhaXQgdGhpcy5jb25zdW1lci5zdWJzY3JpYmUoeyB0b3BpYzogd29ya2VyVG9waWMsIGZyb21CZWdpbm5pbmc6IGZhbHNlIH0pO1xuXG4gICAgICBjb25zdCB3b3JrZmxvd3NTdHIgPSB0aGlzLndvcmtmbG93cy5zaXplID4gMCA/IEFycmF5LmZyb20odGhpcy53b3JrZmxvd3Mua2V5cygpKS5qb2luKCcsICcpIDogJyhub25lKSc7XG4gICAgICBjb25zdCBhY3Rpdml0aWVzU3RyID0gdGhpcy5hY3Rpdml0aWVzLnNpemUgPiAwID8gQXJyYXkuZnJvbSh0aGlzLmFjdGl2aXRpZXMua2V5cygpKS5qb2luKCcsICcpIDogJyhub25lKSc7XG4gICAgICBjb25zb2xlLmxvZyhgV29ya2VyICR7dGhpcy53b3JrZXJJZH0gc3RhcnRlZCwgY29uc3VtaW5nIGZyb20gJHt3b3JrZXJUb3BpY31gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBNYXggY29uY3VycmVudCB3b3JrZmxvd3M6ICR7dGhpcy5tYXhDb25jdXJyZW50V29ya2Zsb3dzfWApO1xuICAgICAgY29uc29sZS5sb2coYFJlZ2lzdGVyZWQgd29ya2Zsb3dzOiAke3dvcmtmbG93c1N0cn1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBSZWdpc3RlcmVkIGFjdGl2aXRpZXM6ICR7YWN0aXZpdGllc1N0cn1gKTtcblxuICAgICAgLy8gU3RhcnQgaGVhcnRiZWF0XG4gICAgICB0aGlzLnN0YXJ0SGVhcnRiZWF0KCk7XG5cbiAgICAgIC8vIFN0YXJ0IGNvbnN1bWluZyBtZXNzYWdlc1xuICAgICAgYXdhaXQgdGhpcy5jb25zdW1lci5ydW4oe1xuICAgICAgICBhdXRvQ29tbWl0OiBmYWxzZSxcbiAgICAgICAgcGFydGl0aW9uc0NvbnN1bWVkQ29uY3VycmVudGx5OiB0aGlzLm1heENvbmN1cnJlbnRXb3JrZmxvd3MsXG4gICAgICAgIGVhY2hNZXNzYWdlOiBhc3luYyAoeyB0b3BpYywgcGFydGl0aW9uLCBtZXNzYWdlIH0pID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMucnVubmluZyB8fCB0aGlzLm5lZWRzUmVjb25uZWN0KSByZXR1cm47XG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25zdW1lcj8uY29tbWl0T2Zmc2V0cyhbe1xuICAgICAgICAgICAgdG9waWMsXG4gICAgICAgICAgICBwYXJ0aXRpb24sXG4gICAgICAgICAgICBvZmZzZXQ6IChCaWdJbnQobWVzc2FnZS5vZmZzZXQpICsgMW4pLnRvU3RyaW5nKCksXG4gICAgICAgICAgfV0pO1xuICAgICAgICAgIFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlLnZhbHVlPy50b1N0cmluZygpIHx8ICd7fScpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzTWVzc2FnZShkYXRhLCByZXN1bHRUb3BpYyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IChlcnJvciBhcyBFcnJvcikubWVzc2FnZT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgICAgICAgIGlmIChlcnJNc2cuaW5jbHVkZXMoJ2Rpc2Nvbm5lY3RlZCcpIHx8IGVyck1zZy5pbmNsdWRlcygnY29ubmVjdGlvbicpKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignS2Fma2EgY29ubmVjdGlvbiBsb3N0LCB0cmlnZ2VyaW5nIHJlY29ubmVjdGlvbi4uLicpO1xuICAgICAgICAgICAgICB0aGlzLm5lZWRzUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgbWVzc2FnZTonLCAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBLZWVwIHJ1bm5pbmcgdW50aWwgc3RvcHBlZCBvciBuZWVkcyByZWNvbm5lY3RcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcgfHwgdGhpcy5uZWVkc1JlY29ubmVjdCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjaGVja0ludGVydmFsKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMubmVlZHNSZWNvbm5lY3QpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlY29ubmVjdGluZyB0byBzZXJ2ZXIgYW5kIEthZmthLi4uJyk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cEthZmthKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIHdvcmtlciBncmFjZWZ1bGx5LlxuICAgKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZygnU3RvcHBpbmcgd29ya2VyLi4uJyk7XG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdENvbm5lY3Rpb25FcnJvcihzdGF0dXM6IG51bWJlciwgZXJyb3JUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgcmV0dXJuICdJbnZhbGlkIG9yIGV4cGlyZWQgQVBJIGtleS4gUGxlYXNlIGNoZWNrIHlvdXIgd29ya2VyIEFQSSBrZXkuJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICByZXR1cm4gJ0FQSSBrZXkgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNvbm5lY3QuIFBsZWFzZSBjaGVjayB3b3JrZXIgcGVybWlzc2lvbnMuJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4gJ1NlcnZlciBlbmRwb2ludCBub3QgZm91bmQuIFBsZWFzZSBjaGVjayB0aGUgc2VydmVyIFVSTC4nO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgcmV0dXJuIGBTZXJ2ZXIgZXJyb3IgKEhUVFAgJHtzdGF0dXN9KS4gVGhlIHNlcnZlciBtYXkgYmUgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBIVFRQICR7c3RhdHVzfSAtICR7ZXJyb3JUZXh0fWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9TZXJ2ZXJPbmNlKCk6IFByb21pc2U8S2Fma2FDb25maWc+IHtcbiAgICBjb25zdCBob3N0bmFtZSA9IG9zLmhvc3RuYW1lKCk7XG4gICAgXG4gICAgY29uc3QgY29ubmVjdFBheWxvYWQgPSB7XG4gICAgICB3b3JrZmxvd3M6IEFycmF5LmZyb20odGhpcy53b3JrZmxvd3Mua2V5cygpKSxcbiAgICAgIGFjdGl2aXRpZXM6IEFycmF5LmZyb20odGhpcy5hY3Rpdml0aWVzLmtleXMoKSksXG4gICAgICBob3N0bmFtZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmNvbmZpZy5zZXJ2ZXJVcmx9L3dvcmtmbG93L2FwaS92MS93b3JrZXJzL2Nvbm5lY3RgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYXBpS2V5fWAsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY29ubmVjdFBheWxvYWQpLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICBjb25zdCBlcnJvck1zZyA9IHRoaXMuZm9ybWF0Q29ubmVjdGlvbkVycm9yKHJlc3BvbnNlLnN0YXR1cywgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29ubmVjdCB0byAke3RoaXMuY29uZmlnLnNlcnZlclVybH06ICR7ZXJyb3JNc2d9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDb25uZWN0UmVzcG9uc2U7XG4gICAgXG4gICAgdGhpcy53b3JrZXJJZCA9IGRhdGEud29ya2VyX2lkO1xuICAgIHRoaXMuaW5zdGFuY2VJZCA9IGRhdGEuaW5zdGFuY2VfaWQ7XG4gICAgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zID0gZGF0YS5oZWFydGJlYXRfaW50ZXJ2YWxfbXMgfHwgMzAwMDA7XG5cbiAgICBjb25zb2xlLmxvZyhgQ29ubmVjdGVkIHRvIHNlcnZlciBhcyB3b3JrZXJfaWQ9JHt0aGlzLndvcmtlcklkfSwgaW5zdGFuY2VfaWQ9JHt0aGlzLmluc3RhbmNlSWR9YCk7XG5cbiAgICByZXR1cm4gZGF0YS5rYWZrYTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvU2VydmVyKCk6IFByb21pc2U8S2Fma2FDb25maWc+IHtcbiAgICBsZXQgcmV0cnlJbnRlcnZhbCA9IDEwMDA7IC8vIFN0YXJ0IGF0IDEgc2Vjb25kXG4gICAgY29uc3QgbWF4UmV0cnlJbnRlcnZhbCA9IDYwMDAwMDsgLy8gTWF4IDEwIG1pbnV0ZXNcbiAgICBjb25zdCBiYWNrb2ZmTXVsdGlwbGllciA9IDIuMDtcblxuICAgIHdoaWxlICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3RUb1NlcnZlck9uY2UoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICAvLyBEb24ndCByZXRyeSBvbiBhdXRoIGVycm9yc1xuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgb3IgZXhwaXJlZCBBUEkga2V5JykgfHwgXG4gICAgICAgICAgICBlcnIubWVzc2FnZS5pbmNsdWRlcygnZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uJykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBXb3JrZXIgZmFpbGVkIHRvIHN0YXJ0OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBDb25uZWN0aW9uIGZhaWxlZDogJHtlcnIubWVzc2FnZX0uIFJldHJ5aW5nIGluICR7TWF0aC5yb3VuZChyZXRyeUludGVydmFsIC8gMTAwMCl9cy4uLmApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcmV0cnlJbnRlcnZhbCkpO1xuICAgICAgICByZXRyeUludGVydmFsID0gTWF0aC5taW4ocmV0cnlJbnRlcnZhbCAqIGJhY2tvZmZNdWx0aXBsaWVyLCBtYXhSZXRyeUludGVydmFsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtlciBzdG9wcGVkIGJlZm9yZSBjb25uZWN0aW9uIGNvdWxkIGJlIGVzdGFibGlzaGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUthZmthQ2xpZW50KGthZmthQ29uZmlnOiBLYWZrYUNvbmZpZyk6IEthZmthIHtcbiAgICBjb25zdCBhdXRoID0ga2Fma2FDb25maWcuYXV0aDtcbiAgICBcbiAgICAvLyBTZXJ2ZXIgcmV0dXJucyBicm9rZXJzIGFzIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcsIGNvbnZlcnQgdG8gYXJyYXlcbiAgICBjb25zdCBicm9rZXJzID0gdHlwZW9mIGthZmthQ29uZmlnLmJyb2tlcnMgPT09ICdzdHJpbmcnXG4gICAgICA/IChrYWZrYUNvbmZpZy5icm9rZXJzIGFzIHN0cmluZykuc3BsaXQoJywnKS5tYXAoYiA9PiBiLnRyaW0oKSkuZmlsdGVyKGIgPT4gYilcbiAgICAgIDoga2Fma2FDb25maWcuYnJva2VycztcbiAgICBcbiAgICBjb25zdCBjb25maWc6IGFueSA9IHtcbiAgICAgIGNsaWVudElkOiBgd29ya2Zsb3ctd29ya2VyLSR7dGhpcy53b3JrZXJJZH1gLFxuICAgICAgYnJva2VycyxcbiAgICAgIGxvZ0xldmVsOiBsb2dMZXZlbC5XQVJOLFxuICAgICAgcmV0cnk6IHtcbiAgICAgICAgaW5pdGlhbFJldHJ5VGltZTogMzAwLFxuICAgICAgICByZXRyaWVzOiAxMDAsXG4gICAgICAgIG1heFJldHJ5VGltZTogMzAwMDAsXG4gICAgICAgIGZhY3RvcjogMC4yLFxuICAgICAgICBtdWx0aXBsaWVyOiAyLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgaWYgKGF1dGg/LnR5cGUgPT09ICdtc2tfaWFtJykge1xuICAgICAgY29uZmlnLnNzbCA9IHRydWU7XG4gICAgICBjb25maWcuc2FzbCA9IHtcbiAgICAgICAgbWVjaGFuaXNtOiAnb2F1dGhiZWFyZXInLFxuICAgICAgICBvYXV0aEJlYXJlclByb3ZpZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZW5lcmF0ZUF1dGhUb2tlbkZyb21DcmVkZW50aWFsc1Byb3ZpZGVyKHtcbiAgICAgICAgICAgIHJlZ2lvbjogYXV0aC5yZWdpb24hLFxuICAgICAgICAgICAgYXdzQ3JlZGVudGlhbHNQcm92aWRlcjogYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IGF1dGguYWNjZXNzX2tleV9pZCEsXG4gICAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleTogYXV0aC5zZWNyZXRfYWNjZXNzX2tleSEsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdG9rZW4udG9rZW4gfTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgU0FTTE9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChhdXRoPy50eXBlID09PSAnc2FzbCcpIHtcbiAgICAgIGlmIChhdXRoLnNlY3VyaXR5X3Byb3RvY29sPy5pbmNsdWRlcygnU1NMJykpIHtcbiAgICAgICAgY29uZmlnLnNzbCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoYXV0aC5zYXNsX21lY2hhbmlzbSAmJiBhdXRoLnNhc2xfdXNlcm5hbWUgJiYgYXV0aC5zYXNsX3Bhc3N3b3JkKSB7XG4gICAgICAgIGNvbmZpZy5zYXNsID0ge1xuICAgICAgICAgIG1lY2hhbmlzbTogYXV0aC5zYXNsX21lY2hhbmlzbS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJy0nLCAnJyksXG4gICAgICAgICAgdXNlcm5hbWU6IGF1dGguc2FzbF91c2VybmFtZSxcbiAgICAgICAgICBwYXNzd29yZDogYXV0aC5zYXNsX3Bhc3N3b3JkLFxuICAgICAgICB9IGFzIFNBU0xPcHRpb25zO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgS2Fma2EoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBoZWFydGJlYXQgaW4gYSBkZWRpY2F0ZWQgd29ya2VyIHRocmVhZCAoaW5kZXBlbmRlbnQgb2YgdGhlIG1haW4gZXZlbnQgbG9vcCkuXG4gICAqXG4gICAqIFRoaXMgZW5zdXJlcyBoZWFydGJlYXRzIGFyZSBuZXZlciBibG9ja2VkIGJ5IGxvbmctcnVubmluZyBzeW5jaHJvbm91c1xuICAgKiBhY3Rpdml0aWVzIG9yIHdvcmtmbG93cywgZm9sbG93aW5nIHRoZSBzYW1lIHBhdHRlcm4gYXMgVGVtcG9yYWwncyBDb3JlIFNESy5cbiAgICovXG4gIHByaXZhdGUgc3RhcnRIZWFydGJlYXQoKTogdm9pZCB7XG4gICAgY29uc3Qgd29ya2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHsgcGFyZW50UG9ydCwgd29ya2VyRGF0YSB9ID0gcmVxdWlyZSgnd29ya2VyX3RocmVhZHMnKTtcbiAgICAgIGNvbnN0IHsgc2VydmVyVXJsLCBhcGlLZXksIGluc3RhbmNlSWQsIGludGVydmFsTXMgfSA9IHdvcmtlckRhdGE7XG5cbiAgICAgIGxldCBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgIGNvbnN0IG1heEZhaWx1cmVzID0gMztcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gc2VuZEhlYXJ0YmVhdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHNlcnZlclVybCArICcvd29ya2Zsb3cvYXBpL3YxL3dvcmtlcnMvaGVhcnRiZWF0Jywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogJ0JlYXJlciAnICsgYXBpS2V5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5zdGFuY2VfaWQ6IGluc3RhbmNlSWQgfSksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAnZXJyb3InLCBtZXNzYWdlOiAnSGVhcnRiZWF0IGZhaWxlZDogSW52YWxpZCBvciBleHBpcmVkIEFQSSBrZXknIH0pO1xuICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHsgdHlwZTogJ3dhcm4nLCBtZXNzYWdlOiAnSGVhcnRiZWF0IGZhaWxlZDogSFRUUCAnICsgcmVzcG9uc2Uuc3RhdHVzIH0pO1xuICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlcysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHsgdHlwZTogJ3dhcm4nLCBtZXNzYWdlOiAnSGVhcnRiZWF0IGVycm9yOiAnICsgZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uc2VjdXRpdmVGYWlsdXJlcyA+PSBtYXhGYWlsdXJlcykge1xuICAgICAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAncmVjb25uZWN0JywgZmFpbHVyZXM6IGNvbnNlY3V0aXZlRmFpbHVyZXMgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChzZW5kSGVhcnRiZWF0LCBpbnRlcnZhbE1zKTtcblxuICAgICAgcGFyZW50UG9ydC5vbignbWVzc2FnZScsIChtc2cpID0+IHtcbiAgICAgICAgaWYgKG1zZyA9PT0gJ3N0b3AnKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBgO1xuXG4gICAgdGhpcy5oZWFydGJlYXRXb3JrZXIgPSBuZXcgV29ya2VyVGhyZWFkKHdvcmtlckNvZGUsIHtcbiAgICAgIGV2YWw6IHRydWUsXG4gICAgICB3b3JrZXJEYXRhOiB7XG4gICAgICAgIHNlcnZlclVybDogdGhpcy5jb25maWcuc2VydmVyVXJsLFxuICAgICAgICBhcGlLZXk6IHRoaXMuY29uZmlnLmFwaUtleSxcbiAgICAgICAgaW5zdGFuY2VJZDogdGhpcy5pbnN0YW5jZUlkLFxuICAgICAgICBpbnRlcnZhbE1zOiB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5oZWFydGJlYXRXb3JrZXIub24oJ21lc3NhZ2UnLCAobXNnOiB7IHR5cGU6IHN0cmluZzsgbWVzc2FnZT86IHN0cmluZzsgZmFpbHVyZXM/OiBudW1iZXIgfSkgPT4ge1xuICAgICAgaWYgKG1zZy50eXBlID09PSAncmVjb25uZWN0Jykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEhlYXJ0YmVhdCBmYWlsZWQgJHttc2cuZmFpbHVyZXN9IHRpbWVzIGNvbnNlY3V0aXZlbHkuIGAgK1xuICAgICAgICAgICdDb25uZWN0aW9uIG1heSBiZSBsb3N0LCB0cmlnZ2VyaW5nIHJlY29ubmVjdGlvbi4uLidcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5uZWVkc1JlY29ubmVjdCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RvcEhlYXJ0YmVhdFdvcmtlcigpO1xuICAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZy5tZXNzYWdlKTtcbiAgICAgIH0gZWxzZSBpZiAobXNnLnR5cGUgPT09ICd3YXJuJykge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5oZWFydGJlYXRXb3JrZXIub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgY29uc29sZS53YXJuKCdIZWFydGJlYXQgd29ya2VyIGVycm9yOicsIGVyci5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcEhlYXJ0YmVhdFdvcmtlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWFydGJlYXRXb3JrZXIpIHtcbiAgICAgIHRoaXMuaGVhcnRiZWF0V29ya2VyLnBvc3RNZXNzYWdlKCdzdG9wJyk7XG4gICAgICB0aGlzLmhlYXJ0YmVhdFdvcmtlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNjb25uZWN0RnJvbVNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2VJZCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5jb25maWcuc2VydmVyVXJsfS93b3JrZmxvdy9hcGkvdjEvd29ya2Vycy9kaXNjb25uZWN0YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYXBpS2V5fWAsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZCB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3RlZCBmcm9tIHNlcnZlcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gc2VydmVyOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNZXNzYWdlKGRhdGE6IGFueSwgcmVzdWx0VG9waWM6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gYWN0aXZpdHkgcmVzdWx0IChyZXNwb25zZSBmcm9tIGFub3RoZXIgd29ya2VyIHZpYSBzZXJ2ZXIpXG4gICAgaWYgKGRhdGEuc3RhdHVzICYmIGRhdGEuY29tcGxldGVkX2F0ICYmICFkYXRhLnRhc2tfdHlwZSkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnUmVjZWl2ZWQgYWN0aXZpdHkgcmVzdWx0IG9uIHdvcmtlciB0b3BpYyAoaWdub3JlZCAtIHVzaW5nIHBvbGxpbmcpJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFza1R5cGUgPSBkYXRhLnRhc2tfdHlwZSB8fCAnYWN0aXZpdHknO1xuXG4gICAgaWYgKHRhc2tUeXBlID09PSAnd29ya2Zsb3cnKSB7XG4gICAgICAvLyBDb25jdXJyZW5jeSBpcyBjb250cm9sbGVkIGJ5IHBhcnRpdGlvbnNDb25zdW1lZENvbmN1cnJlbnRseSBpbiBjb25zdW1lci5ydW4oKVxuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlV29ya2Zsb3coZGF0YSBhcyBXb3JrZmxvd1Rhc2ssIHJlc3VsdFRvcGljKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWN0aXZpdHkgdGFza3MgY2FuIGJlIHByb2Nlc3NlZCBpbmxpbmVcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0FjdGl2aXR5VGFzayhkYXRhLCByZXN1bHRUb3BpYyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREdXJhdGlvbihtczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobXMgPCAxMDAwKSByZXR1cm4gYCR7bXN9bXNgO1xuICAgIGNvbnN0IHNlY29uZHMgPSBtcyAvIDEwMDA7XG4gICAgaWYgKHNlY29uZHMgPCA2MCkgcmV0dXJuIGAke3NlY29uZHMudG9GaXhlZCgxKX1zYDtcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGNvbnN0IHJlbWFpbmluZ1NlY29uZHMgPSAoc2Vjb25kcyAlIDYwKS50b0ZpeGVkKDApO1xuICAgIHJldHVybiBgJHttaW51dGVzfW0ke3JlbWFpbmluZ1NlY29uZHN9c2A7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVXb3JrZmxvdyh0YXNrOiBXb3JrZmxvd1Rhc2ssIHJlc3VsdFRvcGljOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgW1dvcmtmbG93ICR7dGFzay53b3JrZmxvd19pZH1dICR7dGFzay53b3JrZmxvd19uYW1lfSBzdGFydGVkYCk7XG5cbiAgICAvLyBGaW5kIHRoZSB3b3JrZmxvdyBjbGFzc1xuICAgIGNvbnN0IHdvcmtmbG93Q2xzID0gdGhpcy53b3JrZmxvd3MuZ2V0KHRhc2sud29ya2Zsb3dfbmFtZSk7XG4gICAgaWYgKCF3b3JrZmxvd0Nscykge1xuICAgICAgY29uc29sZS53YXJuKGBVbmtub3duIHdvcmtmbG93OiAke3Rhc2sud29ya2Zsb3dfbmFtZX1gKTtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZFdvcmtmbG93UmVzdWx0KHRhc2ssIHJlc3VsdFRvcGljLCAnZmFpbGVkJywgdW5kZWZpbmVkLCB7XG4gICAgICAgIHR5cGU6ICdVbmtub3duV29ya2Zsb3cnLFxuICAgICAgICBtZXNzYWdlOiBgV29ya2Zsb3cgJyR7dGFzay53b3JrZmxvd19uYW1lfScgbm90IHJlZ2lzdGVyZWRgLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcnVuIG1ldGhvZFxuICAgIGNvbnN0IHJ1bk1ldGhvZCA9IGZpbmRSdW5NZXRob2Qod29ya2Zsb3dDbHMpO1xuICAgIGlmICghcnVuTWV0aG9kKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRXb3JrZmxvd1Jlc3VsdCh0YXNrLCByZXN1bHRUb3BpYywgJ2ZhaWxlZCcsIHVuZGVmaW5lZCwge1xuICAgICAgICB0eXBlOiAnTm9SdW5NZXRob2QnLFxuICAgICAgICBtZXNzYWdlOiBgV29ya2Zsb3cgJyR7dGFzay53b3JrZmxvd19uYW1lfScgaGFzIG5vIHJ1biBtZXRob2RgLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSB0aGUgd29ya2Zsb3dcbiAgICBjb25zdCBzdGFydGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIHRyeSB7XG4gICAgICAvLyBCdWlsZCBjb21wbGV0ZWQgYWN0aXZpdGllcyBtYXAgZm9yIHJlcGxheVxuICAgICAgY29uc3QgY29tcGxldGVkQWN0aXZpdGllc01hcCA9IG5ldyBNYXA8bnVtYmVyLCB1bmtub3duPigpO1xuICAgICAgaWYgKHRhc2suY29tcGxldGVkX2FjdGl2aXRpZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYSBvZiB0YXNrLmNvbXBsZXRlZF9hY3Rpdml0aWVzKSB7XG4gICAgICAgICAgY29tcGxldGVkQWN0aXZpdGllc01hcC5zZXQoY2EuaW5kZXgsIGNhLm91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYFJlc3VtaW5nIHdvcmtmbG93ICR7dGFzay53b3JrZmxvd19pZH0gd2l0aCAke2NvbXBsZXRlZEFjdGl2aXRpZXNNYXAuc2l6ZX0gY29tcGxldGVkIGFjdGl2aXRpZXNgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSB3b3JrZmxvdyBjb250ZXh0XG4gICAgICBjb25zdCBjdHggPSBuZXcgV29ya2Zsb3dDb250ZXh0KFxuICAgICAgICB0aGlzLmFjdGl2aXRpZXMsXG4gICAgICAgIHRhc2sud29ya2Zsb3dfaWQsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGNvbXBsZXRlZEFjdGl2aXRpZXNNYXAuc2l6ZSA+IDAgPyBjb21wbGV0ZWRBY3Rpdml0aWVzTWFwIDogbnVsbCxcbiAgICAgICAgdGFzay5tZXRhZGF0YVxuICAgICAgKTtcblxuICAgICAgLy8gRXhlY3V0ZSB3aXRoaW4gY29udGV4dFxuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcnVuV2l0aENvbnRleHQoY3R4LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgIHJ1bk1ldGhvZCh0YXNrLmlucHV0KSxcbiAgICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFdvcmtmbG93IHRpbWVkIG91dCBhZnRlciAke3Rhc2sudGltZW91dF9tc31tc2ApKSxcbiAgICAgICAgICAgICAgdGFzay50aW1lb3V0X21zXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgXSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29tcGxldGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IGNvbXBsZXRlZEF0LmdldFRpbWUoKSAtIHN0YXJ0ZWRBdC5nZXRUaW1lKCk7XG5cbiAgICAgIGNvbnNvbGUubG9nKGBbV29ya2Zsb3cgJHt0YXNrLndvcmtmbG93X2lkfV0gJHt0YXNrLndvcmtmbG93X25hbWV9IGVuZGVkIGluICR7dGhpcy5mb3JtYXREdXJhdGlvbihkdXJhdGlvbk1zKX1gKTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kV29ya2Zsb3dSZXN1bHQoXG4gICAgICAgIHRhc2ssXG4gICAgICAgIHJlc3VsdFRvcGljLFxuICAgICAgICAnY29tcGxldGVkJyxcbiAgICAgICAgb3V0cHV0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQsXG4gICAgICAgIGR1cmF0aW9uTXNcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBjb21wbGV0ZWRBdC5nZXRUaW1lKCkgLSBzdGFydGVkQXQuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgRXJyb3I7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtXb3JrZmxvdyAke3Rhc2sud29ya2Zsb3dfaWR9XSAke3Rhc2sud29ya2Zsb3dfbmFtZX0gZmFpbGVkIGluICR7dGhpcy5mb3JtYXREdXJhdGlvbihkdXJhdGlvbk1zKX06ICR7ZXJyLm1lc3NhZ2V9YCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZFdvcmtmbG93UmVzdWx0KFxuICAgICAgICB0YXNrLFxuICAgICAgICByZXN1bHRUb3BpYyxcbiAgICAgICAgJ2ZhaWxlZCcsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IGVyci5uYW1lIHx8ICdFcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgc3RhY2tfdHJhY2U6IGVyci5zdGFjayxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnRlZEF0LFxuICAgICAgICBjb21wbGV0ZWRBdCxcbiAgICAgICAgZHVyYXRpb25Nc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NBY3Rpdml0eVRhc2soZGF0YTogQWN0aXZpdHlUYXNrLCByZXN1bHRUb3BpYzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFzayA9IGRhdGE7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgW1dvcmtmbG93ICR7dGFzay53b3JrZmxvd19pZH1dICR7dGFzay5hY3Rpdml0eV9uYW1lfSAoIyR7dGFzay5hY3Rpdml0eV9pbmRleH0pIHN0YXJ0ZWRgXG4gICAgKTtcblxuICAgIC8vIEZpbmQgdGhlIGFjdGl2aXR5IGhhbmRsZXJcbiAgICBjb25zdCBhY3Rpdml0eUZuID0gdGhpcy5hY3Rpdml0aWVzLmdldCh0YXNrLmFjdGl2aXR5X25hbWUpO1xuICAgIGlmICghYWN0aXZpdHlGbikge1xuICAgICAgY29uc29sZS53YXJuKGBVbmtub3duIGFjdGl2aXR5OiAke3Rhc2suYWN0aXZpdHlfbmFtZX1gKTtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEFjdGl2aXR5UmVzdWx0KHRhc2ssIHJlc3VsdFRvcGljLCAnZmFpbGVkJywgdW5kZWZpbmVkLCB7XG4gICAgICAgIHR5cGU6ICdVbmtub3duQWN0aXZpdHknLFxuICAgICAgICBtZXNzYWdlOiBgQWN0aXZpdHkgJyR7dGFzay5hY3Rpdml0eV9uYW1lfScgbm90IHJlZ2lzdGVyZWRgLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSB0aGUgYWN0aXZpdHlcbiAgICBjb25zdCBzdGFydGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoYWN0aXZpdHlGbih0YXNrLmlucHV0KSksXG4gICAgICAgIG5ldyBQcm9taXNlPG5ldmVyPigoXywgcmVqZWN0KSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiByZWplY3QobmV3IEVycm9yKGBBY3Rpdml0eSB0aW1lZCBvdXQgYWZ0ZXIgJHt0YXNrLnRpbWVvdXRfbXN9bXNgKSksXG4gICAgICAgICAgICB0YXNrLnRpbWVvdXRfbXNcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgY29tcGxldGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IGNvbXBsZXRlZEF0LmdldFRpbWUoKSAtIHN0YXJ0ZWRBdC5nZXRUaW1lKCk7XG5cbiAgICAgIGNvbnNvbGUubG9nKGBbV29ya2Zsb3cgJHt0YXNrLndvcmtmbG93X2lkfV0gJHt0YXNrLmFjdGl2aXR5X25hbWV9ICgjJHt0YXNrLmFjdGl2aXR5X2luZGV4fSkgZW5kZWQgaW4gJHt0aGlzLmZvcm1hdER1cmF0aW9uKGR1cmF0aW9uTXMpfWApO1xuXG4gICAgICBhd2FpdCB0aGlzLnNlbmRBY3Rpdml0eVJlc3VsdChcbiAgICAgICAgdGFzayxcbiAgICAgICAgcmVzdWx0VG9waWMsXG4gICAgICAgICdjb21wbGV0ZWQnLFxuICAgICAgICBvdXRwdXQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgc3RhcnRlZEF0LFxuICAgICAgICBjb21wbGV0ZWRBdCxcbiAgICAgICAgZHVyYXRpb25Nc1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgY29tcGxldGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IGNvbXBsZXRlZEF0LmdldFRpbWUoKSAtIHN0YXJ0ZWRBdC5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBFcnJvcjtcblxuICAgICAgY29uc29sZS5lcnJvcihgW1dvcmtmbG93ICR7dGFzay53b3JrZmxvd19pZH1dICR7dGFzay5hY3Rpdml0eV9uYW1lfSAoIyR7dGFzay5hY3Rpdml0eV9pbmRleH0pIGZhaWxlZCBpbiAke3RoaXMuZm9ybWF0RHVyYXRpb24oZHVyYXRpb25Ncyl9OiAke2Vyci5tZXNzYWdlfWApO1xuXG4gICAgICBhd2FpdCB0aGlzLnNlbmRBY3Rpdml0eVJlc3VsdChcbiAgICAgICAgdGFzayxcbiAgICAgICAgcmVzdWx0VG9waWMsXG4gICAgICAgICdmYWlsZWQnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBlcnIubmFtZSB8fCAnRXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIHN0YWNrX3RyYWNlOiBlcnIuc3RhY2ssXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQsXG4gICAgICAgIGR1cmF0aW9uTXNcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kV29ya2Zsb3dSZXN1bHQoXG4gICAgdGFzazogV29ya2Zsb3dUYXNrLFxuICAgIHJlc3VsdFRvcGljOiBzdHJpbmcsXG4gICAgc3RhdHVzOiAnY29tcGxldGVkJyB8ICdmYWlsZWQnLFxuICAgIG91dHB1dD86IHVua25vd24sXG4gICAgZXJyb3I/OiBXb3JrZmxvd0Vycm9yLFxuICAgIHN0YXJ0ZWRBdD86IERhdGUsXG4gICAgY29tcGxldGVkQXQ/OiBEYXRlLFxuICAgIGR1cmF0aW9uTXMgPSAwXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmVzdWx0OiBXb3JrZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHRhc2tfaWQ6IHRhc2sudGFza19pZCxcbiAgICAgIHdvcmtmbG93X2lkOiB0YXNrLndvcmtmbG93X2lkLFxuICAgICAgd29ya2Zsb3dfbmFtZTogdGFzay53b3JrZmxvd19uYW1lLFxuICAgICAgc3RhdHVzLFxuICAgICAgb3V0cHV0LFxuICAgICAgZXJyb3IsXG4gICAgICBzdGFydGVkX2F0OiAoc3RhcnRlZEF0IHx8IG5vdykudG9JU09TdHJpbmcoKSxcbiAgICAgIGNvbXBsZXRlZF9hdDogKGNvbXBsZXRlZEF0IHx8IG5vdykudG9JU09TdHJpbmcoKSxcbiAgICAgIGR1cmF0aW9uX21zOiBkdXJhdGlvbk1zLFxuICAgICAgd29ya2VyX2lkOiB0aGlzLndvcmtlcklkISxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMucHJvZHVjZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG4gICAgICAgIHRvcGljOiByZXN1bHRUb3BpYyxcbiAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IHRhc2sud29ya2Zsb3dfaWQsXG4gICAgICAgICAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkocmVzdWx0KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmRlYnVnKGBTZW50IHdvcmtmbG93IHJlc3VsdCBmb3IgdGFzayAke3Rhc2sudGFza19pZH1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRBY3Rpdml0eVJlc3VsdChcbiAgICB0YXNrOiBBY3Rpdml0eVRhc2ssXG4gICAgcmVzdWx0VG9waWM6IHN0cmluZyxcbiAgICBzdGF0dXM6ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcsXG4gICAgb3V0cHV0PzogdW5rbm93bixcbiAgICBlcnJvcj86IEFjdGl2aXR5RXJyb3IsXG4gICAgc3RhcnRlZEF0PzogRGF0ZSxcbiAgICBjb21wbGV0ZWRBdD86IERhdGUsXG4gICAgZHVyYXRpb25NcyA9IDBcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCByZXN1bHQ6IEFjdGl2aXR5UmVzdWx0ID0ge1xuICAgICAgdGFza19pZDogdGFzay50YXNrX2lkLFxuICAgICAgd29ya2Zsb3dfaWQ6IHRhc2sud29ya2Zsb3dfaWQsXG4gICAgICBhY3Rpdml0eV9uYW1lOiB0YXNrLmFjdGl2aXR5X25hbWUsXG4gICAgICBhY3Rpdml0eV9pbmRleDogdGFzay5hY3Rpdml0eV9pbmRleCxcbiAgICAgIGZhbl9vdXRfaW5kZXg6IHRhc2suZmFuX291dF9pbmRleCxcbiAgICAgIHN0YXR1cyxcbiAgICAgIG91dHB1dCxcbiAgICAgIGVycm9yLFxuICAgICAgc3RhcnRlZF9hdDogKHN0YXJ0ZWRBdCB8fCBub3cpLnRvSVNPU3RyaW5nKCksXG4gICAgICBjb21wbGV0ZWRfYXQ6IChjb21wbGV0ZWRBdCB8fCBub3cpLnRvSVNPU3RyaW5nKCksXG4gICAgICBkdXJhdGlvbl9tczogZHVyYXRpb25NcyxcbiAgICAgIHdvcmtlcl9pZDogdGhpcy53b3JrZXJJZCEsXG4gICAgICByZXF1ZXN0ZXJfd29ya2VyX2lkOiB0YXNrLnJlcXVlc3Rlcl93b3JrZXJfaWQsXG4gICAgICBjb3JyZWxhdGlvbl9pZDogdGFzay5jb3JyZWxhdGlvbl9pZCxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMucHJvZHVjZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG4gICAgICAgIHRvcGljOiByZXN1bHRUb3BpYyxcbiAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IHRhc2sud29ya2Zsb3dfaWQsXG4gICAgICAgICAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkocmVzdWx0KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmRlYnVnKGBTZW50IGFjdGl2aXR5IHJlc3VsdCBmb3IgdGFzayAke3Rhc2sudGFza19pZH1gKTtcbiAgICB9XG4gIH1cblxuICAvLyBXb3JrZXJJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFdvcmtmbG93Q29udGV4dFxuXG4gIGFzeW5jIHJlcG9ydExvY2FsQWN0aXZpdHlDb21wbGV0aW9uKFxuICAgIHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBhY3Rpdml0eU5hbWU6IHN0cmluZyxcbiAgICBhY3Rpdml0eUluZGV4OiBudW1iZXIsXG4gICAgb3V0cHV0OiB1bmtub3duLFxuICAgIGR1cmF0aW9uTXM6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucHJvZHVjZXIgfHwgIXRoaXMucmVzdWx0VG9waWMpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ0Nhbm5vdCByZXBvcnQgbG9jYWwgYWN0aXZpdHkgLSBwcm9kdWNlciBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gZHVyYXRpb25Ncyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICB0YXNrX2lkOiBgbG9jYWwtJHt3b3JrZmxvd0lkfS0ke2FjdGl2aXR5SW5kZXh9YCxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0lkLFxuICAgICAgYWN0aXZpdHlfbmFtZTogYWN0aXZpdHlOYW1lLFxuICAgICAgYWN0aXZpdHlfaW5kZXg6IGFjdGl2aXR5SW5kZXgsXG4gICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgb3V0cHV0LFxuICAgICAgc3RhcnRlZF9hdDogc3RhcnRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICBjb21wbGV0ZWRfYXQ6IGNvbXBsZXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICBkdXJhdGlvbl9tczogZHVyYXRpb25NcyxcbiAgICAgIHdvcmtlcl9pZDogdGhpcy53b3JrZXJJZCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG4gICAgICAgIHRvcGljOiB0aGlzLnJlc3VsdFRvcGljLFxuICAgICAgICBtZXNzYWdlczogW3sga2V5OiB3b3JrZmxvd0lkLCB2YWx1ZTogSlNPTi5zdHJpbmdpZnkocmVzdWx0KSB9XSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgYFJlcG9ydGVkIGxvY2FsIGFjdGl2aXR5IGNvbXBsZXRpb246IHdvcmtmbG93X2lkPSR7d29ya2Zsb3dJZH0sIGFjdGl2aXR5PSR7YWN0aXZpdHlOYW1lfSwgaW5kZXg9JHthY3Rpdml0eUluZGV4fWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHJlcG9ydCBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXBvcnRMb2NhbEFjdGl2aXR5RmFpbHVyZShcbiAgICB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlOYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlJbmRleDogbnVtYmVyLFxuICAgIGVycm9yOiBzdHJpbmcsXG4gICAgZXJyb3JUeXBlOiBzdHJpbmcsXG4gICAgZHVyYXRpb25NczogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wcm9kdWNlciB8fCAhdGhpcy5yZXN1bHRUb3BpYykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnQ2Fubm90IHJlcG9ydCBsb2NhbCBhY3Rpdml0eSBmYWlsdXJlIC0gcHJvZHVjZXIgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0LmdldFRpbWUoKSAtIGR1cmF0aW9uTXMpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgdGFza19pZDogYGxvY2FsLSR7d29ya2Zsb3dJZH0tJHthY3Rpdml0eUluZGV4fWAsXG4gICAgICB3b3JrZmxvd19pZDogd29ya2Zsb3dJZCxcbiAgICAgIGFjdGl2aXR5X25hbWU6IGFjdGl2aXR5TmFtZSxcbiAgICAgIGFjdGl2aXR5X2luZGV4OiBhY3Rpdml0eUluZGV4LFxuICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgIG91dHB1dDogbnVsbCxcbiAgICAgIGVycm9yOiB7IHR5cGU6IGVycm9yVHlwZSwgbWVzc2FnZTogZXJyb3IgfSxcbiAgICAgIHN0YXJ0ZWRfYXQ6IHN0YXJ0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgY29tcGxldGVkX2F0OiBjb21wbGV0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgZHVyYXRpb25fbXM6IGR1cmF0aW9uTXMsXG4gICAgICB3b3JrZXJfaWQ6IHRoaXMud29ya2VySWQsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLnNlbmQoe1xuICAgICAgICB0b3BpYzogdGhpcy5yZXN1bHRUb3BpYyxcbiAgICAgICAgbWVzc2FnZXM6IFt7IGtleTogd29ya2Zsb3dJZCwgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkgfV0sXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgIGBSZXBvcnRlZCBsb2NhbCBhY3Rpdml0eSBmYWlsdXJlOiB3b3JrZmxvd19pZD0ke3dvcmtmbG93SWR9LCBhY3Rpdml0eT0ke2FjdGl2aXR5TmFtZX0sIGluZGV4PSR7YWN0aXZpdHlJbmRleH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZXBvcnQgbG9jYWwgYWN0aXZpdHkgZmFpbHVyZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVJlbW90ZUFjdGl2aXR5KFxuICAgIHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBhY3Rpdml0eU5hbWU6IHN0cmluZyxcbiAgICBhY3Rpdml0eUluZGV4OiBudW1iZXIsXG4gICAgaW5wdXREYXRhOiB1bmtub3duLFxuICAgIHRpbWVvdXRNczogbnVtYmVyXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5wcm9kdWNlciB8fCAhdGhpcy5yZXN1bHRUb3BpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdLYWZrYSBwcm9kdWNlciBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBTZW5kIEFjdGl2aXR5UmVxdWVzdCB0byBzZXJ2ZXIgdmlhIEthZmthXG4gICAgY29uc3QgcmVxdWVzdFBheWxvYWQgPSB7XG4gICAgICByZXF1ZXN0X3R5cGU6ICdhY3Rpdml0eV9yZXF1ZXN0JyxcbiAgICAgIHJlcXVlc3RfaWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICB3b3JrZmxvd19pZDogd29ya2Zsb3dJZCxcbiAgICAgIGFjdGl2aXR5X25hbWU6IGFjdGl2aXR5TmFtZSxcbiAgICAgIGFjdGl2aXR5X2luZGV4OiBhY3Rpdml0eUluZGV4LFxuICAgICAgaW5wdXQ6IGlucHV0RGF0YSxcbiAgICAgIHRpbWVvdXRfbXM6IHRpbWVvdXRNcyxcbiAgICAgIHJlcXVlc3Rlcl93b3JrZXJfaWQ6IHRoaXMud29ya2VySWQsXG4gICAgICBjb3JyZWxhdGlvbl9pZDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5wcm9kdWNlci5zZW5kKHtcbiAgICAgIHRvcGljOiB0aGlzLnJlc3VsdFRvcGljLFxuICAgICAgbWVzc2FnZXM6IFt7IGtleTogd29ya2Zsb3dJZCwgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3RQYXlsb2FkKSB9XSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYEFjdGl2aXR5IHJlcXVlc3Qgc2VudCB2aWEgS2Fma2E6IGFjdGl2aXR5PSR7YWN0aXZpdHlOYW1lfSwgd29ya2Zsb3dfaWQ9JHt3b3JrZmxvd0lkfSwgYWN0aXZpdHlfaW5kZXg9JHthY3Rpdml0eUluZGV4fWBcbiAgICApO1xuXG4gICAgLy8gUG9sbCBzZXJ2ZXIgZm9yIHJlc3VsdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICBsZXQgcG9sbEludGVydmFsID0gMjAwMDsgLy8gU3RhcnQgYXQgMiBzZWNvbmRzXG4gICAgY29uc3QgbWF4UG9sbEludGVydmFsID0gOTAwMDAwOyAvLyBNYXggMTUgbWludXRlc1xuICAgIGNvbnN0IGJhY2tvZmZNdWx0aXBsaWVyID0gMS41O1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdGltZW91dFNlY29uZHMgPSB0aW1lb3V0TXM7XG5cbiAgICBjb25zdCBwb2xsVXJsID0gYCR7dGhpcy5jb25maWcuc2VydmVyVXJsfS93b3JrZmxvdy9hcGkvdjEvd29ya2Zsb3dzLyR7d29ya2Zsb3dJZH0vYWN0aXZpdGllcy8ke2FjdGl2aXR5SW5kZXh9L3Jlc3VsdGA7XG4gICAgY29uc3QgaGVhZGVycyA9IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY29uZmlnLmFwaUtleX1gIH07XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBpZiAoZWxhcHNlZCA+PSB0aW1lb3V0U2Vjb25kcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2aXR5ICR7YWN0aXZpdHlOYW1lfSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChwb2xsVXJsLCB7IGhlYWRlcnMgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIHsgc3RhdHVzOiBzdHJpbmc7IG91dHB1dD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQWN0aXZpdHkgJHthY3Rpdml0eU5hbWV9IGNvbXBsZXRlZCBmb3Igd29ya2Zsb3cgJHt3b3JrZmxvd0lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5vdXRwdXQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSByZXN1bHQuZXJyb3IgfHwgJ0FjdGl2aXR5IGZhaWxlZCc7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gZmFpbGVkOiAke2Vycm9yTXNnfWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDIpIHtcbiAgICAgICAgICAvLyBTdGlsbCBwZW5kaW5nL3J1bm5pbmcsIGNvbnRpbnVlIHBvbGxpbmdcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gc3RpbGwgcnVubmluZywgcG9sbGluZyBhZ2FpbiBpbiAke3BvbGxJbnRlcnZhbH1tc2ApO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgLy8gQWN0aXZpdHkgbm90IGZvdW5kIHlldFxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYEFjdGl2aXR5ICR7YWN0aXZpdHlOYW1lfSBub3QgZm91bmQgeWV0LCBwb2xsaW5nIGFnYWluIGluICR7cG9sbEludGVydmFsfW1zYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBVbmV4cGVjdGVkIHJlc3BvbnNlICR7cmVzcG9uc2Uuc3RhdHVzfSB3aGVuIHBvbGxpbmcgYWN0aXZpdHkgcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UuaW5jbHVkZXMoJ3RpbWVkIG91dCcpIHx8IChlcnJvciBhcyBFcnJvcikubWVzc2FnZS5pbmNsdWRlcygnZmFpbGVkJykpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIHBvbGxpbmcgYWN0aXZpdHkgcmVzdWx0OicsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2FpdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHBvbGxJbnRlcnZhbCkpO1xuICAgICAgcG9sbEludGVydmFsID0gTWF0aC5taW4ocG9sbEludGVydmFsICogYmFja29mZk11bHRpcGxpZXIsIG1heFBvbGxJbnRlcnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwS2Fma2EoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU3RvcCBoZWFydGJlYXQgd29ya2VyIHRocmVhZFxuICAgIHRoaXMuc3RvcEhlYXJ0YmVhdFdvcmtlcigpO1xuXG4gICAgLy8gU3RvcCBLYWZrYSBjbGllbnRzXG4gICAgaWYgKHRoaXMuY29uc3VtZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uc3VtZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZ25vcmUgZGlzY29ubmVjdCBlcnJvcnNcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uc3VtZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9kdWNlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9kdWNlci5kaXNjb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBkaXNjb25uZWN0IGVycm9yc1xuICAgICAgfVxuICAgICAgdGhpcy5wcm9kdWNlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cEthZmthKCk7XG5cbiAgICAvLyBEaXNjb25uZWN0IGZyb20gc2VydmVyXG4gICAgYXdhaXQgdGhpcy5kaXNjb25uZWN0RnJvbVNlcnZlcigpO1xuXG4gICAgY29uc29sZS5sb2coYFdvcmtlciAke3RoaXMud29ya2VySWR9IHN0b3BwZWRgKTtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raspect/workflow-sdk",
3
- "version": "0.4.0",
3
+ "version": "1.0.0",
4
4
  "description": "Node.js SDK for Inspectica Workflow Server - Activity worker implementation",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",