@cartanova/qgrid-cli 2.4.4 → 2.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,8 @@ import { CodexAppServerWorker } from "./codex-worker.js";
6
6
  import { readOpenAIQuotaUsage } from "./openai-quota.js";
7
7
  import { handleChatgptAuthTokensRefresh } from "./openai-refresh.js";
8
8
  import { getLogger } from "@logtape/logtape";
9
+ import { readFileSync } from "node:fs";
10
+ import { freemem } from "node:os";
9
11
  //#region src/utils/providers/openai/openai-dispatcher.ts
10
12
  /**
11
13
  * OpenAIDispatcher — codex app-server worker pool + 토큰 라우팅.
@@ -24,15 +26,55 @@ var ImageGenerationError = class extends Error {
24
26
  }
25
27
  };
26
28
  const DEFAULT_EFFORT = "low";
27
- const WORKERS_PER_TOKEN = Math.min(Number(process.env.QGRID_WORKERS_PER_TOKEN ?? 3), 5);
29
+ const MAX_OPENAI_WORKERS_PER_TOKEN = 20;
30
+ const DEFAULT_OPENAI_MIN_WORKERS_PER_TOKEN = 5;
31
+ const DEFAULT_OPENAI_MAX_WORKERS_PER_TOKEN = 15;
28
32
  const QUEUE_TIMEOUT_MS = 6e4;
29
33
  const MAX_QUEUE_SIZE = 50;
30
34
  const SPAWN_INTERVAL_MS = 500;
35
+ const OPENAI_WORKER_BASE_RSS_GIB = .71;
36
+ const OPENAI_WORKER_RSS_GIB = .157;
37
+ function boundedInteger(value, fallback, min, max) {
38
+ const parsed = Number(value);
39
+ if (!Number.isFinite(parsed)) return fallback;
40
+ return Math.max(min, Math.min(Math.floor(parsed), max));
41
+ }
42
+ function boundedNumber(value, fallback, min) {
43
+ const parsed = Number(value);
44
+ if (!Number.isFinite(parsed)) return fallback;
45
+ return Math.max(min, parsed);
46
+ }
47
+ function resolveOpenAIWorkerPoolConfig(env = process.env) {
48
+ const autoscale = env.QGRID_OPENAI_AUTOSCALE !== "false" && env.QGRID_OPENAI_AUTOSCALE !== "0";
49
+ const legacyWorkers = boundedInteger(env.QGRID_WORKERS_PER_TOKEN, DEFAULT_OPENAI_MIN_WORKERS_PER_TOKEN, 1, 20);
50
+ const minWorkersPerToken = boundedInteger(env.QGRID_OPENAI_MIN_WORKERS_PER_TOKEN, legacyWorkers, 1, 20);
51
+ const configuredMax = boundedInteger(env.QGRID_OPENAI_MAX_WORKERS_PER_TOKEN, autoscale ? DEFAULT_OPENAI_MAX_WORKERS_PER_TOKEN : minWorkersPerToken, 1, 20);
52
+ return {
53
+ autoscale,
54
+ minWorkersPerToken,
55
+ maxWorkersPerToken: autoscale ? Math.max(minWorkersPerToken, configuredMax) : minWorkersPerToken,
56
+ scaleIntervalMs: boundedInteger(env.QGRID_OPENAI_SCALE_INTERVAL_MS, 5e3, 250, 3e5),
57
+ scaleDownIdleMs: boundedInteger(env.QGRID_OPENAI_SCALE_DOWN_IDLE_MS, 10 * 6e4, 1e3, 1440 * 6e4),
58
+ maxEstimatedRssGiB: boundedNumber(env.QGRID_OPENAI_MAX_ESTIMATED_RSS_GIB, 16, 1),
59
+ minHostAvailableGiB: boundedNumber(env.QGRID_OPENAI_MIN_HOST_AVAILABLE_GIB, 20, 0)
60
+ };
61
+ }
62
+ function estimateOpenAIWorkerRssGiB(totalWorkers) {
63
+ return OPENAI_WORKER_BASE_RSS_GIB + OPENAI_WORKER_RSS_GIB * totalWorkers;
64
+ }
65
+ function readHostAvailableGiB() {
66
+ try {
67
+ const match = readFileSync("/proc/meminfo", "utf8").match(/^MemAvailable:\s+(\d+)\s+kB$/m);
68
+ if (match?.[1]) return Number(match[1]) / 1024 / 1024;
69
+ } catch {}
70
+ return freemem() / 1024 / 1024 / 1024;
71
+ }
31
72
  const THREAD_REUSE_ENABLED = process.env.QGRID_OPENAI_THREAD_REUSE !== "false";
32
73
  const REUSE_WORKER_WAIT_MS = 5e3;
33
74
  const REUSE_WORKER_POLL_MS = 50;
34
- function makeWorkerId(tokenId, workerIndex) {
35
- return tokenId * 10 + workerIndex;
75
+ const OPENAI_WORKER_ID_STRIDE = 100;
76
+ function makeOpenAIWorkerId(tokenId, workerIndex) {
77
+ return tokenId * OPENAI_WORKER_ID_STRIDE + workerIndex;
36
78
  }
37
79
  function sleep(ms) {
38
80
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -45,20 +87,41 @@ var OpenAIDispatcher = class OpenAIDispatcher {
45
87
  workerPool = /* @__PURE__ */ new Map();
46
88
  tokenMetadata = /* @__PURE__ */ new Map();
47
89
  queue = [];
90
+ poolConfig;
48
91
  weightedSelector = new SmoothWeightedRoundRobin();
49
92
  workerCursorByToken = /* @__PURE__ */ new Map();
93
+ getHostAvailableGiB;
50
94
  draining = false;
51
95
  drainAgain = false;
96
+ scalerTimer = null;
97
+ scalingPromise = null;
98
+ lastRequestAt = Date.now();
99
+ stopped = false;
100
+ constructor(poolConfig = resolveOpenAIWorkerPoolConfig(), getHostAvailableGiB = readHostAvailableGiB) {
101
+ this.poolConfig = poolConfig;
102
+ this.getHostAvailableGiB = getHostAvailableGiB;
103
+ }
52
104
  async start() {
105
+ this.stopped = false;
53
106
  const { rows } = await TokenModel.findMany("A");
54
107
  const openaiTokens = rows.filter((t) => t.provider === "openai");
55
- logger.info(`starting ${openaiTokens.length} openai tokens (${WORKERS_PER_TOKEN} workers each)`);
108
+ logger.info(this.poolConfig.autoscale ? `starting ${openaiTokens.length} openai tokens (${this.poolConfig.minWorkersPerToken}-${this.poolConfig.maxWorkersPerToken} workers each, autoscale)` : `starting ${openaiTokens.length} openai tokens (${this.poolConfig.minWorkersPerToken} workers each)`);
56
109
  await Promise.allSettled(openaiTokens.map(async (t) => {
57
110
  await this.spawnWorkers(t.id, t.name, t.credentials, t.quota_threshold, t.weight);
58
111
  if (!t.active) this.onTokenDeactivated(t.id);
59
112
  }));
113
+ if (this.poolConfig.autoscale) {
114
+ this.scalerTimer = setInterval(() => this.requestAutoscaleEvaluation(), this.poolConfig.scaleIntervalMs);
115
+ this.scalerTimer.unref?.();
116
+ }
60
117
  }
61
118
  async stop() {
119
+ this.stopped = true;
120
+ if (this.scalerTimer) {
121
+ clearInterval(this.scalerTimer);
122
+ this.scalerTimer = null;
123
+ }
124
+ await this.scalingPromise?.catch(() => {});
62
125
  this.rejectAllQueued("DISPATCHER_SHUTDOWN");
63
126
  const kills = [...this.workerPool.values()].flat().map((w) => w.kill());
64
127
  await Promise.allSettled(kills);
@@ -70,7 +133,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
70
133
  this.rateLimitsCache.clear();
71
134
  }
72
135
  async onTokenAdded(id, name, credentials, quotaThreshold, weight = 1) {
73
- this.setTokenMetadata(id, name, quotaThreshold, weight);
136
+ this.setTokenMetadata(id, name, credentials, quotaThreshold, weight);
74
137
  if (this.workerPool.has(id)) return;
75
138
  await this.spawnWorkers(id, name, credentials, quotaThreshold, weight);
76
139
  }
@@ -92,7 +155,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
92
155
  async onTokenUpdated(id, name, credentials, quotaThreshold, weight = 1) {
93
156
  const existing = this.workerPool.get(id) ?? [];
94
157
  const renamed = existing.some((w) => w.tokenName !== name);
95
- this.setTokenMetadata(id, name, quotaThreshold, weight);
158
+ this.setTokenMetadata(id, name, credentials, quotaThreshold, weight);
96
159
  if (renamed) this.rateLimitsCache.delete(id);
97
160
  if (existing.length === 0) {
98
161
  await this.spawnWorkers(id, name, credentials, quotaThreshold, weight);
@@ -112,6 +175,8 @@ var OpenAIDispatcher = class OpenAIDispatcher {
112
175
  onTokenDeactivated(id) {
113
176
  const workers = this.workerPool.get(id) ?? [];
114
177
  const tokenName = workers[0]?.tokenName;
178
+ const metadata = this.tokenMetadata.get(id);
179
+ if (metadata) metadata.active = false;
115
180
  const changed = workers.some((worker) => worker.active);
116
181
  workers.forEach((w) => {
117
182
  w.active = false;
@@ -124,6 +189,8 @@ var OpenAIDispatcher = class OpenAIDispatcher {
124
189
  onTokenActivated(id) {
125
190
  const workers = this.workerPool.get(id) ?? [];
126
191
  const tokenName = workers[0]?.tokenName;
192
+ const metadata = this.tokenMetadata.get(id);
193
+ if (metadata) metadata.active = true;
127
194
  const changed = workers.some((worker) => !worker.active);
128
195
  workers.forEach((w) => {
129
196
  w.active = true;
@@ -143,6 +210,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
143
210
  }
144
211
  }
145
212
  async generate(req) {
213
+ this.lastRequestAt = Date.now();
146
214
  const excludedTokenIds = /* @__PURE__ */ new Set();
147
215
  const reuseWorker = await this.acquireReuseWorker(req, excludedTokenIds);
148
216
  if (reuseWorker) {
@@ -160,6 +228,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
160
228
  }, excludedTokenIds);
161
229
  }
162
230
  async generateStream(req, cb) {
231
+ this.lastRequestAt = Date.now();
163
232
  if (req.imageGeneration) throw new ImageGenerationError("gate", "image generation is not supported on the streaming path");
164
233
  const excludedTokenIds = /* @__PURE__ */ new Set();
165
234
  const reuseWorker = await this.acquireReuseWorker(req, excludedTokenIds);
@@ -195,7 +264,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
195
264
  }
196
265
  }
197
266
  findWorkerById(workerId) {
198
- for (const workers of this.workerPool.values()) for (const w of workers) if (makeWorkerId(w.tokenId, w.workerIndex) === workerId) return w;
267
+ for (const workers of this.workerPool.values()) for (const w of workers) if (makeOpenAIWorkerId(w.tokenId, w.workerIndex) === workerId) return w;
199
268
  return null;
200
269
  }
201
270
  async interruptWorkerTurn(threadId, turnId) {
@@ -254,6 +323,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
254
323
  excludedTokenIds: new Set(excludedTokenIds)
255
324
  };
256
325
  this.queue.push(item);
326
+ this.requestAutoscaleEvaluation();
257
327
  });
258
328
  }
259
329
  removeFromQueue(item) {
@@ -347,7 +417,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
347
417
  ttftMs: result.ttftMs,
348
418
  model: result.model,
349
419
  threadCoord: {
350
- workerId: makeWorkerId(worker.tokenId, worker.workerIndex),
420
+ workerId: makeOpenAIWorkerId(worker.tokenId, worker.workerIndex),
351
421
  threadId: result.threadId,
352
422
  epoch: worker.epoch
353
423
  },
@@ -368,7 +438,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
368
438
  ...result,
369
439
  tokenName: worker.tokenName,
370
440
  threadCoord: {
371
- workerId: makeWorkerId(worker.tokenId, worker.workerIndex),
441
+ workerId: makeOpenAIWorkerId(worker.tokenId, worker.workerIndex),
372
442
  threadId: resolvedThreadId,
373
443
  epoch: worker.epoch
374
444
  }
@@ -378,9 +448,9 @@ var OpenAIDispatcher = class OpenAIDispatcher {
378
448
  await worker.executeTurnStream(turnReq, wrappedCb, reuseThreadId);
379
449
  }
380
450
  async spawnWorkers(tokenId, tokenName, credentials, quotaThreshold, weight = 1) {
381
- this.setTokenMetadata(tokenId, tokenName, quotaThreshold, weight);
451
+ this.setTokenMetadata(tokenId, tokenName, credentials, quotaThreshold, weight);
382
452
  const workers = [];
383
- for (let i = 0; i < WORKERS_PER_TOKEN; i++) {
453
+ for (let i = 0; i < this.poolConfig.minWorkersPerToken; i++) {
384
454
  if (i > 0) await sleep(SPAWN_INTERVAL_MS);
385
455
  const worker = await this.spawnSingleWorker(tokenId, tokenName, credentials, i);
386
456
  if (worker) workers.push(worker);
@@ -411,6 +481,92 @@ var OpenAIDispatcher = class OpenAIDispatcher {
411
481
  return null;
412
482
  }
413
483
  }
484
+ async evaluateAutoscaling() {
485
+ if (!this.poolConfig.autoscale || this.stopped) return;
486
+ if (this.queue.length > 0) {
487
+ await this.scaleUpOneStep();
488
+ return;
489
+ }
490
+ if (Date.now() - this.lastRequestAt >= this.poolConfig.scaleDownIdleMs) await this.scaleDownOneStep();
491
+ }
492
+ async scaleUpOneStep() {
493
+ if (!this.poolConfig.autoscale || this.stopped) return;
494
+ await this.runScaling(async () => {
495
+ const candidates = [...this.tokenMetadata.entries()].filter(([tokenId, metadata]) => {
496
+ if (!metadata.active) return false;
497
+ return (this.workerPool.get(tokenId)?.length ?? 0) < this.poolConfig.maxWorkersPerToken;
498
+ });
499
+ if (candidates.length === 0) return;
500
+ const projectedRssGiB = estimateOpenAIWorkerRssGiB(this.workerCount + candidates.length);
501
+ if (projectedRssGiB > this.poolConfig.maxEstimatedRssGiB) {
502
+ logger.warn(`openai autoscale blocked: estimated RSS ${projectedRssGiB.toFixed(2)}GiB exceeds ${this.poolConfig.maxEstimatedRssGiB.toFixed(2)}GiB`);
503
+ return;
504
+ }
505
+ const hostAvailableGiB = this.getHostAvailableGiB();
506
+ if (hostAvailableGiB < this.poolConfig.minHostAvailableGiB) {
507
+ logger.warn(`openai autoscale blocked: host available ${hostAvailableGiB.toFixed(2)}GiB below ${this.poolConfig.minHostAvailableGiB.toFixed(2)}GiB`);
508
+ return;
509
+ }
510
+ const added = (await Promise.all(candidates.map(async ([tokenId, metadata]) => {
511
+ const workers = this.workerPool.get(tokenId) ?? [];
512
+ const workerIndex = this.nextAvailableWorkerIndex(workers);
513
+ if (workerIndex >= this.poolConfig.maxWorkersPerToken) return null;
514
+ const worker = await this.spawnSingleWorker(tokenId, metadata.name, metadata.credentials, workerIndex);
515
+ if (!worker) return null;
516
+ const currentMetadata = this.tokenMetadata.get(tokenId);
517
+ const currentWorkers = this.workerPool.get(tokenId);
518
+ if (!currentMetadata?.active || currentMetadata !== metadata || !currentWorkers || currentWorkers.some((entry) => entry.workerIndex === workerIndex)) {
519
+ await worker.kill().catch(() => {});
520
+ return null;
521
+ }
522
+ currentWorkers.push(worker);
523
+ currentWorkers.sort((a, b) => a.workerIndex - b.workerIndex);
524
+ return worker;
525
+ }))).filter((worker) => worker !== null).length;
526
+ if (added > 0) {
527
+ logger.info(`openai autoscale up: +${added} workers (${this.workerCount} total, queue ${this.queue.length})`);
528
+ this.requestDrainQueue();
529
+ if (this.queue.length > 0) setTimeout(() => this.requestAutoscaleEvaluation(), Math.min(this.poolConfig.scaleIntervalMs, 1e3)).unref?.();
530
+ }
531
+ });
532
+ }
533
+ async scaleDownOneStep() {
534
+ if (!this.poolConfig.autoscale || this.stopped) return;
535
+ await this.runScaling(async () => {
536
+ const removed = [];
537
+ for (const tokenId of this.tokenMetadata.keys()) {
538
+ const workers = this.workerPool.get(tokenId) ?? [];
539
+ if (workers.length <= this.poolConfig.minWorkersPerToken) continue;
540
+ const worker = workers.toSorted((a, b) => b.workerIndex - a.workerIndex).find((entry) => entry.hasCapacity);
541
+ if (!worker) continue;
542
+ this.workerPool.set(tokenId, workers.filter((entry) => entry !== worker));
543
+ removed.push(worker);
544
+ }
545
+ if (removed.length === 0) return;
546
+ await Promise.allSettled(removed.map((worker) => worker.kill()));
547
+ logger.info(`openai autoscale down: -${removed.length} workers (${this.workerCount} total)`);
548
+ });
549
+ }
550
+ nextAvailableWorkerIndex(workers) {
551
+ const used = new Set(workers.map((worker) => worker.workerIndex));
552
+ for (let index = 0; index < this.poolConfig.maxWorkersPerToken; index++) if (!used.has(index)) return index;
553
+ return this.poolConfig.maxWorkersPerToken;
554
+ }
555
+ requestAutoscaleEvaluation() {
556
+ if (!this.poolConfig.autoscale || this.stopped) return;
557
+ this.evaluateAutoscaling().catch((e) => logger.warn(`openai autoscale evaluation failed: ${e.message}`));
558
+ }
559
+ async runScaling(task) {
560
+ if (this.scalingPromise) {
561
+ await this.scalingPromise;
562
+ return;
563
+ }
564
+ const scaling = task().finally(() => {
565
+ if (this.scalingPromise === scaling) this.scalingPromise = null;
566
+ });
567
+ this.scalingPromise = scaling;
568
+ await scaling;
569
+ }
414
570
  rateLimitsCache = /* @__PURE__ */ new Map();
415
571
  static RATE_LIMITS_CACHE_TTL = 6e4;
416
572
  async getRateLimitsByTokenId(tokenId) {
@@ -428,11 +584,13 @@ var OpenAIDispatcher = class OpenAIDispatcher {
428
584
  requestDrainQueue() {
429
585
  this.drainQueue().catch((e) => logger.warn(`drainQueue failed: ${e.message}`));
430
586
  }
431
- setTokenMetadata(id, name, quotaThreshold, weight) {
587
+ setTokenMetadata(id, name, credentials, quotaThreshold, weight) {
432
588
  this.tokenMetadata.set(id, {
433
589
  name,
590
+ credentials,
434
591
  quotaThreshold,
435
- weight
592
+ weight,
593
+ active: this.tokenMetadata.get(id)?.active ?? true
436
594
  });
437
595
  this.weightedSelector.setToken(id, weight);
438
596
  }
@@ -609,6 +767,6 @@ var OpenAIDispatcher = class OpenAIDispatcher {
609
767
  }
610
768
  };
611
769
  //#endregion
612
- export { ImageGenerationError, OpenAIDispatcher };
770
+ export { ImageGenerationError, MAX_OPENAI_WORKERS_PER_TOKEN, OPENAI_WORKER_BASE_RSS_GIB, OPENAI_WORKER_RSS_GIB, OpenAIDispatcher, estimateOpenAIWorkerRssGiB, makeOpenAIWorkerId, resolveOpenAIWorkerPoolConfig };
613
771
 
614
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBOIHdvcmtlciAoQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpLCDquLDrs7ggM1xuICogLSBpZGxlIHdvcmtlciByb3VuZC1yb2JpbiDshKDtg50gKyDtgZAg64yA6riwICjsoITrtoAgYnVzeSDsi5wpXG4gKiAtIFRva2VuU3Vic2NyaWJlciDsnbTrsqTtirjroZwgd29ya2VyIHBvb2wg64+Z6riw7ZmUXG4gKiAtIGJhY2twcmVzc3VyZTog7YGQIGZ1bGwg65iQ64qUIHRpbWVvdXQg7IucIFNFUlZFUl9CVVNZXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvciB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBPcGVuQUlDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL0dldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLCB0eXBlIFR1cm5SZXF1ZXN0IH0gZnJvbSBcIi4vY29kZXgtd29ya2VyXCI7XG5pbXBvcnQge1xuICByZWFkT3BlbkFJUXVvdGFVc2FnZSxcbiAgdHlwZSBPcGVuQUlRdW90YVVzYWdlUmVzdWx0LFxuICB0eXBlIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSxcbn0gZnJvbSBcIi4vb3BlbmFpLXF1b3RhXCI7XG5pbXBvcnQgeyBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2ggfSBmcm9tIFwiLi9vcGVuYWktcmVmcmVzaFwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvcGVuYWktZGlzcGF0Y2hlclwiXSk7XG5cbi8vIOydtOuvuOyngCDsg53shLEg7JqU7LKt7J20IOqyjOydtO2KuC/sg53shLHsl5Ag7Iuk7Yyo7ZaI7J2EIOuVjOydmCDqtazrtoTsnpAuXG4vLyAtIFwiZ2F0ZVwiOiDsgqzsoIQg6rKA7KadIOyLpO2MqChjYXBhYmlsaXR5L+uqqOuNuCDrqYDti7Drqqjri6wg67aI7Lap7KGxKSDigJQgdHVybiDrr7jsi6TtlokuXG4vLyAtIFwibm90X2NhbGxlZFwiOiB0dXJuIOydgCDshLHqs7XtlojsnLzrgpgg66qo64247J20IGltYWdlIHRvb2wg7J2EIO2YuOy2nCDslYgg7ZWoIOKAlCDsnqzsi5zrj4Qg66y07J21KO2UhOuhrO2UhO2KuCDrrLjsoJwpLlxuLy8gLSBcImluY29tcGxldGVcIjogdG9vbCDsi5zrj4TrkJDsnLzrgpgg7JmE7ISxIOydtOuvuOyngCDrr7jrj4TssKkg4oCUIOyerOyLnOuPhCDtm4Trs7Qo7ISc67KE7LihIOyLpO2MqC/qsbDrtoApLlxuZXhwb3J0IHR5cGUgSW1hZ2VGYWlsdXJlS2luZCA9IFwiZ2F0ZVwiIHwgXCJub3RfY2FsbGVkXCIgfCBcImluY29tcGxldGVcIjtcblxuZXhwb3J0IGNsYXNzIEltYWdlR2VuZXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBraW5kOiBJbWFnZUZhaWx1cmVLaW5kLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJJbWFnZUdlbmVyYXRpb25FcnJvclwiO1xuICB9XG59XG5cbmNvbnN0IERFRkFVTFRfRUZGT1JUID0gXCJsb3dcIjtcbmNvbnN0IE1BWF9XT1JLRVJTX1BFUl9UT0tFTiA9IDU7XG5jb25zdCBXT1JLRVJTX1BFUl9UT0tFTiA9IE1hdGgubWluKFxuICBOdW1iZXIocHJvY2Vzcy5lbnYuUUdSSURfV09SS0VSU19QRVJfVE9LRU4gPz8gMyksXG4gIE1BWF9XT1JLRVJTX1BFUl9UT0tFTixcbik7XG5jb25zdCBRVUVVRV9USU1FT1VUX01TID0gNjBfMDAwO1xuY29uc3QgTUFYX1FVRVVFX1NJWkUgPSA1MDtcbmNvbnN0IFNQQVdOX0lOVEVSVkFMX01TID0gNTAwO1xuXG4vLyB0aHJlYWQg7J6s7IKs7JqpKHByb21wdCBjYWNoZSDqs6DsoJUpLiDrgYTrqbQg6riw7KG0IFwi66ekIHR1cm4g7IOIIHRocmVhZCArIGhpc3RvcnkgaW5qZWN0XCIg64+Z7J6RLlxuY29uc3QgVEhSRUFEX1JFVVNFX0VOQUJMRUQgPSBwcm9jZXNzLmVudi5RR1JJRF9PUEVOQUlfVEhSRUFEX1JFVVNFICE9PSBcImZhbHNlXCI7XG4vLyDsooztkZwgd29ya2VyIOqwgCBidXN5IOydvCDrlYwgZnJlZSDrpbwg6riw64uk66as64qUIOy1nOuMgCDsi5zqsIQuIOy0iOqzvCDsi5wg7IOIIHRocmVhZCDroZwg7Y+067CxLlxuY29uc3QgUkVVU0VfV09SS0VSX1dBSVRfTVMgPSA1XzAwMDtcbmNvbnN0IFJFVVNFX1dPUktFUl9QT0xMX01TID0gNTA7XG5cbi8vIHdvcmtlcklkIO2VqeyEsTogdG9rZW5JZCDsmYAgd29ya2VySW5kZXgoMC4uNCkg66W8IO2VmOuCmOydmCDslYjsoJUg7Iir7J6Q66GcIOyduOy9lOuUqS5cbmZ1bmN0aW9uIG1ha2VXb3JrZXJJZCh0b2tlbklkOiBudW1iZXIsIHdvcmtlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9rZW5JZCAqIDEwICsgd29ya2VySW5kZXg7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFxuICBwcm92aWRlcjogc3RyaW5nLFxuICB0b2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlscyA9IHRva2Vuc1xuICAgIC5tYXAoKHRva2VuKSA9PiBgJHt0b2tlbi50b2tlbk5hbWV9ICh0aHJlc2hvbGQgJHt0b2tlbi50aHJlc2hvbGR9JSlgKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxzLmxlbmd0aCA+IDBcbiAgICA/IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZDogJHtkZXRhaWxzfWBcbiAgICA6IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZGA7XG59XG5cbnR5cGUgUXVldWVJdGVtID0ge1xuICByZXNvbHZlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGFib3J0Q2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+O1xufTtcblxudHlwZSBUb2tlbk1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0OiBudW1iZXI7XG59O1xuXG50eXBlIFRva2VuRWxpZ2liaWxpdHkgPSB7XG4gIHJlYWR5QWN0aXZlVG9rZW5JZHM6IFNldDxudW1iZXI+O1xuICBlbGlnaWJsZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT47XG4gIHRocmVzaG9sZGVkVG9rZW5Db3VudDogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSURpc3BhdGNoZXIgaW1wbGVtZW50cyBQcm92aWRlckRpc3BhdGNoZXIge1xuICB3b3JrZXJQb29sID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gIHRva2VuTWV0YWRhdGEgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5NZXRhZGF0YT4oKTtcbiAgcXVldWU6IFF1ZXVlSXRlbVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgd2VpZ2h0ZWRTZWxlY3RvciA9IG5ldyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3b3JrZXJDdXJzb3JCeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBkcmFpbmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWluQWdhaW4gPSBmYWxzZTtcblxuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIGNvbnN0IG9wZW5haVRva2VucyA9IHJvd3MuZmlsdGVyKCh0KSA9PiB0LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBzdGFydGluZyAke29wZW5haVRva2Vucy5sZW5ndGh9IG9wZW5haSB0b2tlbnMgKCR7V09SS0VSU19QRVJfVE9LRU59IHdvcmtlcnMgZWFjaClgLFxuICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBvcGVuYWlUb2tlbnMubWFwKGFzeW5jICh0KSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKFxuICAgICAgICAgIHQuaWQsXG4gICAgICAgICAgdC5uYW1lLFxuICAgICAgICAgIHQuY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgdC5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgdC53ZWlnaHQsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghdC5hY3RpdmUpIHRoaXMub25Ub2tlbkRlYWN0aXZhdGVkKHQuaWQpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJESVNQQVRDSEVSX1NIVVRET1dOXCIpO1xuICAgIGNvbnN0IGtpbGxzID0gWy4uLnRoaXMud29ya2VyUG9vbC52YWx1ZXMoKV0uZmxhdCgpLm1hcCgodykgPT4gdy5raWxsKCkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChraWxscyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiB0aGlzLnRva2VuTWV0YWRhdGEua2V5cygpKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMud29ya2VyUG9vbC5jbGVhcigpO1xuICAgIHRoaXMudG9rZW5NZXRhZGF0YS5jbGVhcigpO1xuICAgIHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5jbGVhcigpO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmNsZWFyKCk7XG4gIH1cblxuICAvLyDilIDilIAgVG9rZW4gZXZlbnRzIChmcm9tIFRva2VuU3Vic2NyaWJlcikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgb25Ub2tlbkFkZGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZXRUb2tlbk1ldGFkYXRhKGlkLCBuYW1lLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhpZCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLmRlbGV0ZShpZCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZGVsZXRlKGlkKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5kZWxldGUoaWQpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh3b3JrZXJzLm1hcCgodykgPT4gdy5raWxsKCkpKTtcbiAgICBpZiAodGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGlmICh3b3JrZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdG9rZW5OYW1lID8/IGB0b2tlbiAke2lkfWA7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VycyByZW1vdmVkOiAke2xhYmVsfSAoJHt3b3JrZXJzLmxlbmd0aH0pYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25Ub2tlblVwZGF0ZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGNvbnN0IHJlbmFtZWQgPSBleGlzdGluZy5zb21lKCh3KSA9PiB3LnRva2VuTmFtZSAhPT0gbmFtZSk7XG4gICAgdGhpcy5zZXRUb2tlbk1ldGFkYXRhKGlkLCBuYW1lLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBpZiAocmVuYW1lZCkgdGhpcy5yYXRlTGltaXRzQ2FjaGUuZGVsZXRlKGlkKTtcblxuICAgIGlmIChleGlzdGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nLmV2ZXJ5KCh3KSA9PiB3LmNhblJldXNlRm9yVG9rZW4obmFtZSwgY3JlZGVudGlhbHMpKSkge1xuICAgICAgZXhpc3RpbmcuZm9yRWFjaCgodykgPT4gdy51cGRhdGVUb2tlblN0YXRlKG5hbWUsIGNyZWRlbnRpYWxzKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VycyB1cGRhdGVkIGluLXBsYWNlOiAke25hbWV9YCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZXhpc3RpbmcubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuRGVhY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgY2hhbmdlZCA9IHdvcmtlcnMuc29tZSgod29ya2VyKSA9PiB3b3JrZXIuYWN0aXZlKTtcbiAgICB3b3JrZXJzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG4gICAgaWYgKGNoYW5nZWQpIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBkZWFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgY2hhbmdlZCA9IHdvcmtlcnMuc29tZSgod29ya2VyKSA9PiAhd29ya2VyLmFjdGl2ZSk7XG4gICAgd29ya2Vycy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IHRydWU7XG4gICAgfSk7XG4gICAgaWYgKGNoYW5nZWQpIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICBjb25zdCBsYWJlbCA9IHRva2VuTmFtZSA/PyBgdG9rZW4gJHtpZH1gO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIGFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxhY2VUb2tlbnMoXG4gICAgcm93czogQXJyYXk8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHdlaWdodDogbnVtYmVyO1xuICAgIH0+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChyb3dzLm1hcCgocikgPT4gci5pZCkpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgQXJyYXkuZnJvbSh0aGlzLndvcmtlclBvb2wua2V5cygpKSkge1xuICAgICAgaWYgKCFuZXh0LmhhcyhpZCkpIGF3YWl0IHRoaXMub25Ub2tlblJlbW92ZWQoaWQpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGlmICh0aGlzLndvcmtlclBvb2wuaGFzKHJvdy5pZCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vblRva2VuVXBkYXRlZChcbiAgICAgICAgICByb3cuaWQsXG4gICAgICAgICAgcm93Lm5hbWUsXG4gICAgICAgICAgcm93LmNyZWRlbnRpYWxzLFxuICAgICAgICAgIHJvdy5xdW90YVRocmVzaG9sZCxcbiAgICAgICAgICByb3cud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vblRva2VuQWRkZWQocm93LmlkLCByb3cubmFtZSwgcm93LmNyZWRlbnRpYWxzLCByb3cucXVvdGFUaHJlc2hvbGQsIHJvdy53ZWlnaHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5vblRva2VuQWN0aXZhdGVkKHJvdy5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIEdlbmVyYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7IOd7ISx7J2AIG5vbi1zdHJlYW0g7KCE7JqpKFIyKTogY29kZXgg6rCAIOydtOuvuOyngCDrjbjtg4Drpbwg7KO87KeAIOyViuqzoCDsmYTshLEgYmFzZTY0IOulvFxuICAgIC8vIO2VnCDrsojsl5Ag7KSA64ukLiDsiqTtirjrpqzrsI0g6rK966Gc66GcIOydtOuvuOyngCDsmpTssq3snbQg7Jik66m0IOuqheyLnOyggSDsl5Drn6wuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgICAgXCJnYXRlXCIsXG4gICAgICAgIFwiaW1hZ2UgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzdHJlYW1pbmcgcGF0aFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGNvbnN0IHJldXNlV29ya2VyID0gYXdhaXQgdGhpcy5hY3F1aXJlUmV1c2VXb3JrZXIocmVxLCBleGNsdWRlZFRva2VuSWRzKTtcbiAgICBpZiAocmV1c2VXb3JrZXIpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihrsgJHtyZXVzZVdvcmtlci50b2tlbk5hbWV9WyR7cmV1c2VXb3JrZXIudG9rZW5JZH1dIChyZXVzZSB0aHJlYWQsIFtzdHJlYW1dKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IsIHJlcS5yZXVzZSEudGhyZWFkSWQpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVJZGxlV29ya2VyKGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmICh3b3JrZXIpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3b3JrZXIudG9rZW5OYW1lfVske3dvcmtlci50b2tlbklkfV0gKG1vZGVsOiAke3JlcS5tb2RlbH0sIFtzdHJlYW1dKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2Uod29ya2VyLCAodykgPT4gdGhpcy5leGVjdXRlU3RyZWFtVHVybih3LCByZXEsIGNiKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0sIHF1ZXVlZClgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpO1xuICAgIH0sIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICB9XG5cbiAgLy8gcmV1c2Ug7KKM7ZGc6rCAIOycoO2aqO2VmOuptCDqt7ggd29ya2VyIOulvCBidXN5IOygkOycoO2VtCDrsJjtmZguIOyXhuqxsOuCmCDtj7TrsLEg64yA7IOB7J2066m0IG51bGwuXG4gIC8vIO2PtOuwsSDsgqzsnKA6IOq4sOuKpSBvZmYgLyDsooztkZwg7JeG7J2MIC8gd29ya2VyIOu2gOyerMK37KO97J2MIC8gZXBvY2gg67aI7J287LmYKHJlc3RhcnQpIC8gdGhyZWFkIOyGjOupuCAvXG4gIC8vICAgICAgICAgICAgYnVzeSDrjIDquLAg7YOA7J6E7JWE7JuDLiBudWxsIOuwmO2ZmCDsi5wg7Zi47Lac67aA64qUIOyDiCB0aHJlYWQg6rK966Gc66GcIOynhO2WiS5cbiAgYXN5bmMgYWNxdWlyZVJldXNlV29ya2VyKFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKSxcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7JqU7LKt7J2AIO2VreyDgSBjb2xkIHRocmVhZChSOCk6IOyerOyCrOyaqSDsooztkZzqsIAg7J6I7Ja064+EIOqxtOuEiOubtOuLpC5cbiAgICAvLyBiYXNlNjQg6rCAIHRocmVhZCDrqZTrqqjrpqzCt+y6kOyLnCBwcmVmaXgg7JeQIOyDgeyjvO2VmOuKlCDqsoPsnYQg66eJ64qU64ukLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIVRIUkVBRF9SRVVTRV9FTkFCTEVEIHx8ICFyZXEucmV1c2UpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHsgd29ya2VySWQsIHRocmVhZElkLCBlcG9jaCB9ID0gcmVxLnJldXNlO1xuXG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy5maW5kV29ya2VyQnlJZCh3b3JrZXJJZCk7XG4gICAgaWYgKCF3b3JrZXIgfHwgIXdvcmtlci5pc1JlYWR5IHx8ICF3b3JrZXIuYWN0aXZlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAod29ya2VyLmVwb2NoICE9PSBlcG9jaCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF3b3JrZXIuaGFzVGhyZWFkKHRocmVhZElkKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSwgZXhjbHVkZWRUb2tlbklkcykpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSRVVTRV9XT1JLRVJfV0FJVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyByZXN0YXJ0KGVwb2NoIOuzgOqyvSkgLyB0aHJlYWQg7IaM66m47J20IOuMgOq4sCDspJHsl5Ag67Cc7IOd7ZWY66m0IO2PtOuwsS5cbiAgICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoIHx8ICF3b3JrZXIuaGFzVGhyZWFkKHRocmVhZElkKSkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAod29ya2VyLnRyeUFjcXVpcmVUdXJuKCkpIHJldHVybiB3b3JrZXI7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBzbGVlcChSRVVTRV9XT1JLRVJfUE9MTF9NUyk7XG4gICAgfVxuICB9XG5cbiAgZmluZFdvcmtlckJ5SWQod29ya2VySWQ6IG51bWJlcik6IENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB3b3JrZXJzIG9mIHRoaXMud29ya2VyUG9vbC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCB3IG9mIHdvcmtlcnMpIHtcbiAgICAgICAgaWYgKG1ha2VXb3JrZXJJZCh3LnRva2VuSWQsIHcud29ya2VySW5kZXgpID09PSB3b3JrZXJJZCkgcmV0dXJuIHc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhbGxXb3JrZXJzLm1hcCgodykgPT4gdy5pbnRlcnJ1cHRUdXJuKHRocmVhZElkLCB0dXJuSWQpKSk7XG4gIH1cblxuICAvLyDilIDilIAgV29ya2VyIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gUXVvdGEtZWxpZ2libGUgaWRsZSB0b2tlbuydhCB3ZWlnaHTroZwg6rOg66W4IOuSpCwg6re4IHRva2VuIOyViOyXkOyEnCB3b3JrZXLrpbwg7Iic7ZmY7ZWc64ukLlxuICBhc3luYyBhY3F1aXJlSWRsZVdvcmtlcihcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZWxpZ2liaWxpdHkgPSBhd2FpdCB0aGlzLnJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLnNpemUgPT09IDApIHRoaXMudGhyb3dRdW90YVRocmVzaG9sZEV4Y2VlZGVkKGVsaWdpYmlsaXR5KTtcblxuICAgIGNvbnN0IHdvcmtlcnNCeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKSkge1xuICAgICAgaWYgKCFlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkgfHwgIXdvcmtlci5oYXNDYXBhY2l0eSkgY29udGludWU7XG4gICAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHdvcmtlci50b2tlbklkKSA/PyBbXTtcbiAgICAgIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgd29ya2Vyc0J5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFRva2VuSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQod29ya2Vyc0J5VG9rZW4ua2V5cygpKSk7XG4gICAgaWYgKHNlbGVjdGVkVG9rZW5JZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgd29ya2VycyA9IHdvcmtlcnNCeVRva2VuLmdldChzZWxlY3RlZFRva2VuSWQpITtcbiAgICBjb25zdCBjdXJzb3IgPSB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkgPz8gMDtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCB3b3JrZXJzLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKGN1cnNvciArIG9mZnNldCkgJSB3b3JrZXJzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaW5kZXhdITtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkge1xuICAgICAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uc2V0KHNlbGVjdGVkVG9rZW5JZCwgKGluZGV4ICsgMSkgJSB3b3JrZXJzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB3ZWlnaHRlZCB0b2tlbiAke3NlbGVjdGVkVG9rZW5JZH0gbG9zdCBpZGxlIGNhcGFjaXR5IGR1cmluZyBzeW5jaHJvbm91cyBhY3F1aXJlYCxcbiAgICApO1xuICB9XG5cbiAgZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk6IENvZGV4QXBwU2VydmVyV29ya2VyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkgJiYgdy5hY3RpdmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGVucXVldWU8VD4oXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKGVsaWdpYmlsaXR5LnJlYWR5QWN0aXZlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgaWYgKGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+PSBNQVhfUVVFVUVfU0laRSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcbiAgICAgICAgcmVzb2x2ZTogKHdvcmtlcikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2Uod29ya2VyLCBleGVjdXRlKSlcbiAgICAgICAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdDogKGVycikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVyOiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyb21RdWV1ZShpdGVtKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIikpO1xuICAgICAgICB9LCBRVUVVRV9USU1FT1VUX01TKSxcbiAgICAgICAgZXhjbHVkZWRUb2tlbklkczogbmV3IFNldChleGNsdWRlZFRva2VuSWRzKSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMucXVldWUucHVzaChpdGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUZyb21RdWV1ZShpdGVtOiBRdWV1ZUl0ZW0pOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMucXVldWUuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaWR4ICE9PSAtMSkgdGhpcy5xdWV1ZS5zcGxpY2UoaWR4LCAxKTtcbiAgfVxuXG4gIHJlamVjdEFsbFF1ZXVlZChyZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihyZWFzb24pO1xuICAgIHRoaXMucXVldWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgaXRlbS5yZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gIH1cblxuICBhc3luYyBkcmFpblF1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRyYWluaW5nKSB7XG4gICAgICB0aGlzLmRyYWluQWdhaW4gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZHJhaW5pbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IGZhbHNlO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWluUXVldWVPbmNlKCk7XG4gICAgICB9IHdoaWxlICh0aGlzLmRyYWluQWdhaW4pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBkcmFpblF1ZXVlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5kcmFpbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZHJhaW5RdWV1ZU9uY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWVbMF0hO1xuICAgICAgbGV0IHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgd29ya2VyID0gYXdhaXQgdGhpcy5hY3F1aXJlSWRsZVdvcmtlcihuZXh0LmV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcikge1xuICAgICAgICAgIHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICAgICAgICBuZXh0LnJlamVjdChlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKCF3b3JrZXIpIGJyZWFrO1xuICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgbmV4dC5yZXNvbHZlKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIEV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBleGVjdXRlQW5kUmVsZWFzZTxUPihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIGV4ZWN1dGU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGUod29ya2VyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd29ya2VyLnJlbGVhc2VUdXJuKCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmV1c2VUaHJlYWRJZCDqsIAg7J6I7Jy866m0IOq4sOyhtCB0aHJlYWQg7JeQIGRlbHRhKHJldXNlSW5wdXQp66eMLCDsl4bsnLzrqbQg7IOIIHRocmVhZCDsl5Ag7KCE7LK0XG4gIC8vIHByb21wdChjb2xkSW5wdXQpICsgaGlzdG9yeSBpbmplY3QuIHJldXNlIOqwgCBkaXNwYXRjaGVyIOuLqOyXkOyEnCDtj7TrsLHrkJjrqbQg7ZuE7J6Q66GcIOuWqOyWtOynhOuLpC5cbiAgcHJpdmF0ZSBidWlsZFR1cm5SZXF1ZXN0KHJlcTogR2VuZXJhdGVSZXF1ZXN0LCByZXVzZVRocmVhZElkPzogc3RyaW5nKTogVHVyblJlcXVlc3Qge1xuICAgIGNvbnN0IHJldXNpbmcgPSByZXVzZVRocmVhZElkICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiByZXVzaW5nICYmIHJlcS5yZXVzZUlucHV0ID8gcmVxLnJldXNlSW5wdXQgOiByZXEuY29sZElucHV0LFxuICAgICAgaGlzdG9yeTogcmV1c2luZyA/IHVuZGVmaW5lZCA6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgIG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCA/PyBERUZBVUxUX0VGRk9SVCxcbiAgICAgIG1vZGVsOiByZXEubW9kZWwsXG4gICAgICB2ZXJib3NpdHk6IHJlcS52ZXJib3NpdHksXG4gICAgICByZWFzb25pbmdTdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgIHNlcnZpY2VUaWVyOiByZXEuc2VydmljZVRpZXIsXG4gICAgICBpbWFnZUdlbmVyYXRpb246IHJlcS5pbWFnZUdlbmVyYXRpb24sXG4gICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgLy8g7J2066+47KeAIOyalOyyrSDsgqzsoIQg6rKM7J207Yq4KFI1KTog67Cw7KCV65CcIHdvcmtlciDsnZggY2FwYWJpbGl0eSArIOyggeyaqSDrqqjrjbgg66mA7Yuw66qo64usLlxuICAgIC8vIOu2iOy2qeyhseydtOuptCB0dXJuIOydhCDsi6TtlontlZjsp4Ag7JWK6rOgIOuqheyLnOyggSDsl5Drn6wuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IGF3YWl0IHdvcmtlci5jaGVja0ltYWdlR2VuZXJhdGlvblN1cHBvcnQocmVxLm1vZGVsKTtcbiAgICAgIGlmIChyZWFzb24pIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImdhdGVcIiwgcmVhc29uKTtcbiAgICB9XG5cbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuKHR1cm5SZXEsIHJldXNlVGhyZWFkSWQpO1xuXG4gICAgLy8g7J2066+47KeAIDDqsJwg7Iuk7YyoIOu2hOulmChSNik6IHRvb2wg66+47Zi47LacKOyerOyLnOuPhCDrrLTsnbUpIHZzIOyLnOuPhCDtm4Qg66+47JmE7ISxKOyerOyLnOuPhCDtm4Trs7QpLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uICYmICghcmVzdWx0LmltYWdlcyB8fCByZXN1bHQuaW1hZ2VzLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHRocm93IHJlc3VsdC5pbWFnZUF0dGVtcHRlZFxuICAgICAgICA/IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJpbWFnZSB0b29sIHJhbiBidXQgcHJvZHVjZWQgbm8gY29tcGxldGVkIGltYWdlXCIpXG4gICAgICAgIDogbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwibm90X2NhbGxlZFwiLCBcIm1vZGVsIGRpZCBub3QgY2FsbCB0aGUgaW1hZ2VfZ2VuZXJhdGlvbiB0b29sXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgIHRva2VuTmFtZTogd29ya2VyLnRva2VuTmFtZSxcbiAgICAgIHVzYWdlOiByZXN1bHQudXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyxcbiAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICB3b3JrZXJJZDogbWFrZVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICB0aHJlYWRJZDogcmVzdWx0LnRocmVhZElkLFxuICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgfSxcbiAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVN0cmVhbVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MsXG4gICAgcmV1c2VUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdHVyblJlcSA9IHRoaXMuYnVpbGRUdXJuUmVxdWVzdChyZXEsIHJldXNlVGhyZWFkSWQpO1xuICAgIC8vIHdvcmtlciDsnZggVHVyblJlc3VsdCDsl5AgdG9rZW5OYW1lL3RocmVhZENvb3JkIOulvCDrtpnsl6wg7IOB7JyEKEdlbmVyYXRlUmVzdWx0KeuhnCDsmKzrprDri6QuXG4gICAgLy8gdGhyZWFkSWQg64qUIOyDiCB0aHJlYWQg66m0IG9uVGhyZWFkSWQg66GcIO2ZleygleuQmOuvgOuhnCDrr7jrpqwg67O06rSA7ZW0IOuRkOqzoCBvbkNvbXBsZXRlIOuVjCDsnb3ripTri6QuXG4gICAgbGV0IHJlc29sdmVkVGhyZWFkSWQgPSByZXVzZVRocmVhZElkID8/IFwiXCI7XG4gICAgY29uc3Qgd3JhcHBlZENiOiBTdHJlYW1DYWxsYmFja3MgPSB7XG4gICAgICAuLi5jYixcbiAgICAgIG9uVGhyZWFkSWQ6ICh0aHJlYWRJZCkgPT4ge1xuICAgICAgICByZXNvbHZlZFRocmVhZElkID0gdGhyZWFkSWQ7XG4gICAgICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICBjYi5vbkNvbXBsZXRlKHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgICAgICB3b3JrZXJJZDogbWFrZVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHJlc29sdmVkVGhyZWFkSWQsXG4gICAgICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGF3YWl0IHdvcmtlci5leGVjdXRlVHVyblN0cmVhbSh0dXJuUmVxLCB3cmFwcGVkQ2IsIHJldXNlVGhyZWFkSWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXduIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIHNwYXduV29ya2VycyhcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEodG9rZW5JZCwgdG9rZW5OYW1lLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBjb25zdCB3b3JrZXJzOiBDb2RleEFwcFNlcnZlcldvcmtlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBXT1JLRVJTX1BFUl9UT0tFTjsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgaSk7XG4gICAgICBpZiAod29ya2VyKSB3b3JrZXJzLnB1c2god29ya2VyKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkgdGhpcy53b3JrZXJQb29sLnNldCh0b2tlbklkLCB3b3JrZXJzKTtcbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcblxuICAgIHdvcmtlci5zZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihhc3luYyAobWV0aG9kKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcImFjY291bnQvY2hhdGdwdEF1dGhUb2tlbnMvcmVmcmVzaFwiKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBzZXJ2ZXItcmVxdWVzdDogJHttZXRob2R9YCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgc3Bhd25lZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XWApO1xuICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgd29ya2VyIHNwYXduIGZhaWxlZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHJhdGVMaW1pdHNDYWNoZSA9IG5ldyBNYXA8bnVtYmVyLCB7IGRhdGE6IEdldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2U7IGNhY2hlZEF0OiBudW1iZXIgfT4oKTtcbiAgc3RhdGljIHJlYWRvbmx5IFJBVEVfTElNSVRTX0NBQ0hFX1RUTCA9IDYwXzAwMDtcblxuICBhc3luYyBnZXRSYXRlTGltaXRzQnlUb2tlbklkKHRva2VuSWQ6IG51bWJlcik6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yYXRlTGltaXRzQ2FjaGUuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChjYWNoZWQgJiYgRGF0ZS5ub3coKSAtIGNhY2hlZC5jYWNoZWRBdCA8IE9wZW5BSURpc3BhdGNoZXIuUkFURV9MSU1JVFNfQ0FDSEVfVFRMKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9ICh0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdKS5maW5kKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGlmICghd29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJubyByZWFkeSBvcGVuYWkgd29ya2Vyc1wiKTtcbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHdvcmtlci5nZXRSYXRlTGltaXRzKCkpIGFzIEdldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2U7XG4gICAgY29uc3QgZW50cnkgPSB7IGRhdGEsIGNhY2hlZEF0OiBEYXRlLm5vdygpIH07XG4gICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuc2V0KHRva2VuSWQsIGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3REcmFpblF1ZXVlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5kcmFpblF1ZXVlKCkuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBkcmFpblF1ZXVlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gIH1cblxuICBwcml2YXRlIHNldFRva2VuTWV0YWRhdGEoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgd2VpZ2h0OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5NZXRhZGF0YS5zZXQoaWQsIHsgbmFtZSwgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIGdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQ6IG51bWJlcik6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpPy5xdW90YVRocmVzaG9sZDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzUXVvdGFUaHJlc2hvbGQodG9rZW5JZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5nZXRRdW90YVRocmVzaG9sZCh0b2tlbklkKTtcbiAgICByZXR1cm4gdGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgdGhyZXNob2xkICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlVG9rZW5FbGlnaWJpbGl0eShleGNsdWRlZFRva2VuSWRzOiBTZXQ8bnVtYmVyPik6IFByb21pc2U8VG9rZW5FbGlnaWJpbGl0eT4ge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpO1xuICAgIGNvbnN0IGJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgd29ya2VyIG9mIHdvcmtlcnMpIHtcbiAgICAgIGlmICghYnlUb2tlbi5oYXMod29ya2VyLnRva2VuSWQpKSBieVRva2VuLnNldCh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZHlBY3RpdmVUb2tlbklkcyA9IG5ldyBTZXQoYnlUb2tlbi5rZXlzKCkpO1xuICAgIGNvbnN0IGVsaWdpYmxlVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBjb25zdCBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCB0aHJlc2hvbGRlZFRva2VuQ291bnQgPSAwO1xuXG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmZyb20oYnlUb2tlbi5lbnRyaWVzKCkpO1xuICAgIGNvbnN0IGNoZWNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIGVudHJpZXMubWFwKGFzeW5jIChbdG9rZW5JZCwgdG9rZW5OYW1lXSkgPT4ge1xuICAgICAgICBpZiAoZXhjbHVkZWRUb2tlbklkcy5oYXModG9rZW5JZCkpIHtcbiAgICAgICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQrKztcbiAgICAgICAgICByZXR1cm4geyB0b2tlbklkLCB0b2tlbk5hbWUsIGVsaWdpYmxlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5oYXNRdW90YVRocmVzaG9sZCh0b2tlbklkKSkge1xuICAgICAgICAgIHJldHVybiB7IHRva2VuSWQsIHRva2VuTmFtZSwgZWxpZ2libGU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQrKztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b2tlbklkLFxuICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICBlbGlnaWJsZTogYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh0b2tlbklkLCB0b2tlbk5hbWUpLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNoZWNrcy5mb3JFYWNoKChjaGVjaywgaW5kZXgpID0+IHtcbiAgICAgIGlmIChjaGVjay5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIHtcbiAgICAgICAgaWYgKGNoZWNrLnZhbHVlLmVsaWdpYmxlKSB7XG4gICAgICAgICAgZWxpZ2libGVUb2tlbklkcy5hZGQoY2hlY2sudmFsdWUudG9rZW5JZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5nZXRRdW90YVRocmVzaG9sZChjaGVjay52YWx1ZS50b2tlbklkKTtcbiAgICAgICAgICBpZiAodGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgdGhyZXNob2xkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLnB1c2goeyB0b2tlbk5hbWU6IGNoZWNrLnZhbHVlLnRva2VuTmFtZSwgdGhyZXNob2xkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgY29uc3QgW3Rva2VuSWQsIHRva2VuTmFtZV0gPSBlbnRyeTtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuSWQsIHRva2VuTmFtZSwgU3RyaW5nKGNoZWNrLnJlYXNvbikpO1xuICAgICAgICBlbGlnaWJsZVRva2VuSWRzLmFkZCh0b2tlbklkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IHJlYWR5QWN0aXZlVG9rZW5JZHMsIGVsaWdpYmxlVG9rZW5JZHMsIG92ZXJUaHJlc2hvbGRUb2tlbnMsIHRocmVzaG9sZGVkVG9rZW5Db3VudCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpc1Rva2VuUXVvdGFFbGlnaWJsZShcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgZXhjbHVkZWRUb2tlbklkcz86IFNldDxudW1iZXI+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQpO1xuICAgIGlmICh0aHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCB0aHJlc2hvbGQgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gICAgbGV0IHJlc3VsdDogT3BlbkFJUXVvdGFVc2FnZVJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZE9wZW5BSVF1b3RhVXNhZ2UoKCkgPT4gdGhpcy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKHRva2VuSWQpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5OYW1lLCAoZSBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5OYW1lLCByZXN1bHQucmVhc29uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQudXRpbGl6YXRpb25QY3QgPj0gdGhyZXNob2xkKSB7XG4gICAgICB0aGlzLmxvZ1F1b3RhT3ZlclRocmVzaG9sZCh0b2tlbklkLCB0b2tlbk5hbWUsIHRocmVzaG9sZCwgcmVzdWx0KTtcbiAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM/LmFkZCh0b2tlbklkKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFPdmVyVGhyZXNob2xkKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICByZXN1bHQ6IEV4dHJhY3Q8T3BlbkFJUXVvdGFVc2FnZVJlc3VsdCwgeyBraW5kOiBcIm9rXCIgfT4sXG4gICk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IG92ZXJfdGhyZXNob2xkXCIsIHtcbiAgICAgIHRva2VuSWQsXG4gICAgICB0b2tlbk5hbWUsXG4gICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGNhY2hlZFV0aWxpemF0aW9uOiByZXN1bHQudXRpbGl6YXRpb25QY3QsXG4gICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJlc3VsdC53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICByZXNldHNBdDogcmVzdWx0LnJlc2V0c0F0LFxuICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICByZWFzb246IFwib3Zlcl90aHJlc2hvbGRcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkOiBudW1iZXIsIHRva2VuTmFtZTogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eTogVG9rZW5FbGlnaWJpbGl0eSk6IG5ldmVyIHtcbiAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0b2tlbkNvdW50OiBlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUsXG4gICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IGVsaWdpYmlsaXR5LnRocmVzaG9sZGVkVG9rZW5Db3VudCxcbiAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwib3BlbmFpXCIsIGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxNQUFNLFNBQVMs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
772
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBOIHdvcmtlciAoQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpLCDquLDrs7ggM1xuICogLSBpZGxlIHdvcmtlciByb3VuZC1yb2JpbiDshKDtg50gKyDtgZAg64yA6riwICjsoITrtoAgYnVzeSDsi5wpXG4gKiAtIFRva2VuU3Vic2NyaWJlciDsnbTrsqTtirjroZwgd29ya2VyIHBvb2wg64+Z6riw7ZmUXG4gKiAtIGJhY2twcmVzc3VyZTog7YGQIGZ1bGwg65iQ64qUIHRpbWVvdXQg7IucIFNFUlZFUl9CVVNZXG4gKi9cbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBmcmVlbWVtIH0gZnJvbSBcIm5vZGU6b3NcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEdldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvR2V0QWNjb3VudFJhdGVMaW1pdHNSZXNwb25zZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlcXVlc3QsXG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MsXG4gIHR5cGUgUHJvdmlkZXJEaXNwYXRjaGVyLFxufSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFNtb290aFdlaWdodGVkUm91bmRSb2JpbiB9IGZyb20gXCIuLi9jb21tb24vc21vb3RoLXdlaWdodGVkLXJvdW5kLXJvYmluXCI7XG5pbXBvcnQgeyBDb2RleEFwcFNlcnZlcldvcmtlciwgdHlwZSBTdHJlYW1DYWxsYmFja3MsIHR5cGUgVHVyblJlcXVlc3QgfSBmcm9tIFwiLi9jb2RleC13b3JrZXJcIjtcbmltcG9ydCB7XG4gIHJlYWRPcGVuQUlRdW90YVVzYWdlLFxuICB0eXBlIE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsXG4gIHR5cGUgT3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhLFxufSBmcm9tIFwiLi9vcGVuYWktcXVvdGFcIjtcbmltcG9ydCB7IGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCB9IGZyb20gXCIuL29wZW5haS1yZWZyZXNoXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9wZW5haS1kaXNwYXRjaGVyXCJdKTtcblxuLy8g7J2066+47KeAIOyDneyEsSDsmpTssq3snbQg6rKM7J207Yq4L+yDneyEseyXkCDsi6TtjKjtlojsnYQg65WM7J2YIOq1rOu2hOyekC5cbi8vIC0gXCJnYXRlXCI6IOyCrOyghCDqsoDspp0g7Iuk7YyoKGNhcGFiaWxpdHkv66qo6424IOupgO2LsOuqqOuLrCDrtojstqnsobEpIOKAlCB0dXJuIOuvuOyLpO2WiS5cbi8vIC0gXCJub3RfY2FsbGVkXCI6IHR1cm4g7J2AIOyEseqzte2WiOycvOuCmCDrqqjrjbjsnbQgaW1hZ2UgdG9vbCDsnYQg7Zi47LacIOyViCDtlagg4oCUIOyerOyLnOuPhCDrrLTsnbUo7ZSE66Gs7ZSE7Yq4IOusuOygnCkuXG4vLyAtIFwiaW5jb21wbGV0ZVwiOiB0b29sIOyLnOuPhOuQkOycvOuCmCDsmYTshLEg7J2066+47KeAIOuvuOuPhOywqSDigJQg7J6s7Iuc64+EIO2bhOuztCjshJzrsoTsuKEg7Iuk7YyoL+qxsOu2gCkuXG5leHBvcnQgdHlwZSBJbWFnZUZhaWx1cmVLaW5kID0gXCJnYXRlXCIgfCBcIm5vdF9jYWxsZWRcIiB8IFwiaW5jb21wbGV0ZVwiO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IEltYWdlRmFpbHVyZUtpbmQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkltYWdlR2VuZXJhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImxvd1wiO1xuZXhwb3J0IGNvbnN0IE1BWF9PUEVOQUlfV09SS0VSU19QRVJfVE9LRU4gPSAyMDtcbmNvbnN0IERFRkFVTFRfT1BFTkFJX01JTl9XT1JLRVJTX1BFUl9UT0tFTiA9IDU7XG5jb25zdCBERUZBVUxUX09QRU5BSV9NQVhfV09SS0VSU19QRVJfVE9LRU4gPSAxNTtcbmNvbnN0IFFVRVVFX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5jb25zdCBNQVhfUVVFVUVfU0laRSA9IDUwO1xuY29uc3QgU1BBV05fSU5URVJWQUxfTVMgPSA1MDA7XG5cbmV4cG9ydCBjb25zdCBPUEVOQUlfV09SS0VSX0JBU0VfUlNTX0dJQiA9IDAuNzE7XG5leHBvcnQgY29uc3QgT1BFTkFJX1dPUktFUl9SU1NfR0lCID0gMC4xNTc7XG5cbmV4cG9ydCB0eXBlIE9wZW5BSVdvcmtlclBvb2xDb25maWcgPSB7XG4gIGF1dG9zY2FsZTogYm9vbGVhbjtcbiAgbWluV29ya2Vyc1BlclRva2VuOiBudW1iZXI7XG4gIG1heFdvcmtlcnNQZXJUb2tlbjogbnVtYmVyO1xuICBzY2FsZUludGVydmFsTXM6IG51bWJlcjtcbiAgc2NhbGVEb3duSWRsZU1zOiBudW1iZXI7XG4gIG1heEVzdGltYXRlZFJzc0dpQjogbnVtYmVyO1xuICBtaW5Ib3N0QXZhaWxhYmxlR2lCOiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBib3VuZGVkSW50ZWdlcihcbiAgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZmFsbGJhY2s6IG51bWJlcixcbiAgbWluOiBudW1iZXIsXG4gIG1heDogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihNYXRoLmZsb29yKHBhcnNlZCksIG1heCkpO1xufVxuXG5mdW5jdGlvbiBib3VuZGVkTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIsIG1pbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBwYXJzZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHByb2Nlc3MuZW52LFxuKTogT3BlbkFJV29ya2VyUG9vbENvbmZpZyB7XG4gIGNvbnN0IGF1dG9zY2FsZSA9IGVudi5RR1JJRF9PUEVOQUlfQVVUT1NDQUxFICE9PSBcImZhbHNlXCIgJiYgZW52LlFHUklEX09QRU5BSV9BVVRPU0NBTEUgIT09IFwiMFwiO1xuICBjb25zdCBsZWdhY3lXb3JrZXJzID0gYm91bmRlZEludGVnZXIoXG4gICAgZW52LlFHUklEX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgIERFRkFVTFRfT1BFTkFJX01JTl9XT1JLRVJTX1BFUl9UT0tFTixcbiAgICAxLFxuICAgIE1BWF9PUEVOQUlfV09SS0VSU19QRVJfVE9LRU4sXG4gICk7XG4gIGNvbnN0IG1pbldvcmtlcnNQZXJUb2tlbiA9IGJvdW5kZWRJbnRlZ2VyKFxuICAgIGVudi5RR1JJRF9PUEVOQUlfTUlOX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgIGxlZ2FjeVdvcmtlcnMsXG4gICAgMSxcbiAgICBNQVhfT1BFTkFJX1dPUktFUlNfUEVSX1RPS0VOLFxuICApO1xuICBjb25zdCBjb25maWd1cmVkTWF4ID0gYm91bmRlZEludGVnZXIoXG4gICAgZW52LlFHUklEX09QRU5BSV9NQVhfV09SS0VSU19QRVJfVE9LRU4sXG4gICAgYXV0b3NjYWxlID8gREVGQVVMVF9PUEVOQUlfTUFYX1dPUktFUlNfUEVSX1RPS0VOIDogbWluV29ya2Vyc1BlclRva2VuLFxuICAgIDEsXG4gICAgTUFYX09QRU5BSV9XT1JLRVJTX1BFUl9UT0tFTixcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGF1dG9zY2FsZSxcbiAgICBtaW5Xb3JrZXJzUGVyVG9rZW4sXG4gICAgbWF4V29ya2Vyc1BlclRva2VuOiBhdXRvc2NhbGVcbiAgICAgID8gTWF0aC5tYXgobWluV29ya2Vyc1BlclRva2VuLCBjb25maWd1cmVkTWF4KVxuICAgICAgOiBtaW5Xb3JrZXJzUGVyVG9rZW4sXG4gICAgc2NhbGVJbnRlcnZhbE1zOiBib3VuZGVkSW50ZWdlcihlbnYuUUdSSURfT1BFTkFJX1NDQUxFX0lOVEVSVkFMX01TLCA1XzAwMCwgMjUwLCAzMDBfMDAwKSxcbiAgICBzY2FsZURvd25JZGxlTXM6IGJvdW5kZWRJbnRlZ2VyKFxuICAgICAgZW52LlFHUklEX09QRU5BSV9TQ0FMRV9ET1dOX0lETEVfTVMsXG4gICAgICAxMCAqIDYwXzAwMCxcbiAgICAgIDFfMDAwLFxuICAgICAgMjQgKiA2MCAqIDYwXzAwMCxcbiAgICApLFxuICAgIG1heEVzdGltYXRlZFJzc0dpQjogYm91bmRlZE51bWJlcihlbnYuUUdSSURfT1BFTkFJX01BWF9FU1RJTUFURURfUlNTX0dJQiwgMTYsIDEpLFxuICAgIG1pbkhvc3RBdmFpbGFibGVHaUI6IGJvdW5kZWROdW1iZXIoZW52LlFHUklEX09QRU5BSV9NSU5fSE9TVF9BVkFJTEFCTEVfR0lCLCAyMCwgMCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc3RpbWF0ZU9wZW5BSVdvcmtlclJzc0dpQih0b3RhbFdvcmtlcnM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBPUEVOQUlfV09SS0VSX0JBU0VfUlNTX0dJQiArIE9QRU5BSV9XT1JLRVJfUlNTX0dJQiAqIHRvdGFsV29ya2Vycztcbn1cblxuZnVuY3Rpb24gcmVhZEhvc3RBdmFpbGFibGVHaUIoKTogbnVtYmVyIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaCA9IHJlYWRGaWxlU3luYyhcIi9wcm9jL21lbWluZm9cIiwgXCJ1dGY4XCIpLm1hdGNoKC9eTWVtQXZhaWxhYmxlOlxccysoXFxkKylcXHMra0IkL20pO1xuICAgIGlmIChtYXRjaD8uWzFdKSByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKSAvIDEwMjQgLyAxMDI0O1xuICB9IGNhdGNoIHt9XG4gIHJldHVybiBmcmVlbWVtKCkgLyAxMDI0IC8gMTAyNCAvIDEwMjQ7XG59XG5cbi8vIHRocmVhZCDsnqzsgqzsmqkocHJvbXB0IGNhY2hlIOqzoOyglSkuIOuBhOuptCDquLDsobQgXCLrp6QgdHVybiDsg4ggdGhyZWFkICsgaGlzdG9yeSBpbmplY3RcIiDrj5nsnpEuXG5jb25zdCBUSFJFQURfUkVVU0VfRU5BQkxFRCA9IHByb2Nlc3MuZW52LlFHUklEX09QRU5BSV9USFJFQURfUkVVU0UgIT09IFwiZmFsc2VcIjtcbi8vIOyijO2RnCB3b3JrZXIg6rCAIGJ1c3kg7J28IOuVjCBmcmVlIOulvCDquLDri6TrpqzripQg7LWc64yAIOyLnOqwhC4g7LSI6rO8IOyLnCDsg4ggdGhyZWFkIOuhnCDtj7TrsLEuXG5jb25zdCBSRVVTRV9XT1JLRVJfV0FJVF9NUyA9IDVfMDAwO1xuY29uc3QgUkVVU0VfV09SS0VSX1BPTExfTVMgPSA1MDtcblxuLy8gd29ya2VySWQg7ZWp7ISxOiB0b2tlbklkIOyZgCB3b3JrZXJJbmRleCgwLi4xOSkg66W8IO2VmOuCmOydmCDslYjsoJUg7Iir7J6Q66GcIOyduOy9lOuUqS5cbmNvbnN0IE9QRU5BSV9XT1JLRVJfSURfU1RSSURFID0gMTAwO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VPcGVuQUlXb3JrZXJJZCh0b2tlbklkOiBudW1iZXIsIHdvcmtlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9rZW5JZCAqIE9QRU5BSV9XT1JLRVJfSURfU1RSSURFICsgd29ya2VySW5kZXg7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFxuICBwcm92aWRlcjogc3RyaW5nLFxuICB0b2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlscyA9IHRva2Vuc1xuICAgIC5tYXAoKHRva2VuKSA9PiBgJHt0b2tlbi50b2tlbk5hbWV9ICh0aHJlc2hvbGQgJHt0b2tlbi50aHJlc2hvbGR9JSlgKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxzLmxlbmd0aCA+IDBcbiAgICA/IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZDogJHtkZXRhaWxzfWBcbiAgICA6IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZGA7XG59XG5cbnR5cGUgUXVldWVJdGVtID0ge1xuICByZXNvbHZlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGFib3J0Q2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+O1xufTtcblxudHlwZSBUb2tlbk1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuO1xufTtcblxudHlwZSBUb2tlbkVsaWdpYmlsaXR5ID0ge1xuICByZWFkeUFjdGl2ZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgZWxpZ2libGVUb2tlbklkczogU2V0PG51bWJlcj47XG4gIG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+O1xuICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgd29ya2VyUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBDb2RleEFwcFNlcnZlcldvcmtlcltdPigpO1xuICB0b2tlbk1ldGFkYXRhID0gbmV3IE1hcDxudW1iZXIsIFRva2VuTWV0YWRhdGE+KCk7XG4gIHF1ZXVlOiBRdWV1ZUl0ZW1bXSA9IFtdO1xuICByZWFkb25seSBwb29sQ29uZmlnOiBPcGVuQUlXb3JrZXJQb29sQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHdlaWdodGVkU2VsZWN0b3IgPSBuZXcgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2VyQ3Vyc29yQnlUb2tlbiA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0SG9zdEF2YWlsYWJsZUdpQjogKCkgPT4gbnVtYmVyO1xuICBwcml2YXRlIGRyYWluaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgZHJhaW5BZ2FpbiA9IGZhbHNlO1xuICBwcml2YXRlIHNjYWxlclRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2FsaW5nUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICBwcml2YXRlIHN0b3BwZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb29sQ29uZmlnOiBPcGVuQUlXb3JrZXJQb29sQ29uZmlnID0gcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcoKSxcbiAgICBnZXRIb3N0QXZhaWxhYmxlR2lCOiAoKSA9PiBudW1iZXIgPSByZWFkSG9zdEF2YWlsYWJsZUdpQixcbiAgKSB7XG4gICAgdGhpcy5wb29sQ29uZmlnID0gcG9vbENvbmZpZztcbiAgICB0aGlzLmdldEhvc3RBdmFpbGFibGVHaUIgPSBnZXRIb3N0QXZhaWxhYmxlR2lCO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBvcGVuYWlUb2tlbnMgPSByb3dzLmZpbHRlcigodCkgPT4gdC5wcm92aWRlciA9PT0gXCJvcGVuYWlcIik7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICB0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlXG4gICAgICAgID8gYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHt0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VufS0ke3RoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW59IHdvcmtlcnMgZWFjaCwgYXV0b3NjYWxlKWBcbiAgICAgICAgOiBgc3RhcnRpbmcgJHtvcGVuYWlUb2tlbnMubGVuZ3RofSBvcGVuYWkgdG9rZW5zICgke3RoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW59IHdvcmtlcnMgZWFjaClgLFxuICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBvcGVuYWlUb2tlbnMubWFwKGFzeW5jICh0KSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKFxuICAgICAgICAgIHQuaWQsXG4gICAgICAgICAgdC5uYW1lLFxuICAgICAgICAgIHQuY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgdC5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgdC53ZWlnaHQsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghdC5hY3RpdmUpIHRoaXMub25Ub2tlbkRlYWN0aXZhdGVkKHQuaWQpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlKSB7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyID0gc2V0SW50ZXJ2YWwoXG4gICAgICAgICgpID0+IHRoaXMucmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKSxcbiAgICAgICAgdGhpcy5wb29sQ29uZmlnLnNjYWxlSW50ZXJ2YWxNcyxcbiAgICAgICk7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyLnVucmVmPy4oKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2NhbGVyVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY2FsZXJUaW1lcik7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zY2FsaW5nUHJvbWlzZT8uY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiRElTUEFUQ0hFUl9TSFVURE9XTlwiKTtcbiAgICBjb25zdCBraWxscyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5tYXAoKHcpID0+IHcua2lsbCgpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoa2lsbHMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy50b2tlbk1ldGFkYXRhLmtleXMoKSkgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlclBvb2wuY2xlYXIoKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uY2xlYXIoKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRva2VuIGV2ZW50cyAoZnJvbSBUb2tlblN1YnNjcmliZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIG9uVG9rZW5BZGRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICAgIGlmICh0aGlzLndvcmtlclBvb2wuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGNvbnN0IHRva2VuTmFtZSA9IHdvcmtlcnNbMF0/LnRva2VuTmFtZTtcbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuZGVsZXRlKGlkKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5kZWxldGUoaWQpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmRlbGV0ZShpZCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHdvcmtlcnMubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHJlbW92ZWQ6ICR7bGFiZWx9ICgke3dvcmtlcnMubGVuZ3RofSlgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgcmVuYW1lZCA9IGV4aXN0aW5nLnNvbWUoKHcpID0+IHcudG9rZW5OYW1lICE9PSBuYW1lKTtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEoaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBpZiAocmVuYW1lZCkgdGhpcy5yYXRlTGltaXRzQ2FjaGUuZGVsZXRlKGlkKTtcblxuICAgIGlmIChleGlzdGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nLmV2ZXJ5KCh3KSA9PiB3LmNhblJldXNlRm9yVG9rZW4obmFtZSwgY3JlZGVudGlhbHMpKSkge1xuICAgICAgZXhpc3RpbmcuZm9yRWFjaCgodykgPT4gdy51cGRhdGVUb2tlblN0YXRlKG5hbWUsIGNyZWRlbnRpYWxzKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VycyB1cGRhdGVkIGluLXBsYWNlOiAke25hbWV9YCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZXhpc3RpbmcubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuRGVhY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGEpIG1ldGFkYXRhLmFjdGl2ZSA9IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gd29ya2VyLmFjdGl2ZSk7XG4gICAgd29ya2Vycy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICBpZiAodGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiTk9fQUNUSVZFX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsID0gdG9rZW5OYW1lID8/IGB0b2tlbiAke2lkfWA7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlcnMgZGVhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBvblRva2VuQWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdG9rZW5OYW1lID0gd29ya2Vyc1swXT8udG9rZW5OYW1lO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk7XG4gICAgaWYgKG1ldGFkYXRhKSBtZXRhZGF0YS5hY3RpdmUgPSB0cnVlO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gIXdvcmtlci5hY3RpdmUpO1xuICAgIHdvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy53b3JrZXJQb29sLmtleXMoKSkpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhyb3cuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlbkFkZGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Ub2tlbkFjdGl2YXRlZChyb3cuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgbm9uLXN0cmVhbSDsoITsmqkoUjIpOiBjb2RleCDqsIAg7J2066+47KeAIOuNuO2DgOulvCDso7zsp4Ag7JWK6rOgIOyZhOyEsSBiYXNlNjQg66W8XG4gICAgLy8g7ZWcIOuyiOyXkCDspIDri6QuIOyKpO2KuOumrOuwjSDqsr3roZzroZwg7J2066+47KeAIOyalOyyreydtCDsmKTrqbQg66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEsIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAg7ZWt7IOBIGNvbGQgdGhyZWFkKFI4KTog7J6s7IKs7JqpIOyijO2RnOqwgCDsnojslrTrj4Qg6rG064SI65u064ukLlxuICAgIC8vIGJhc2U2NCDqsIAgdGhyZWFkIOuplOuqqOumrMK37LqQ7IucIHByZWZpeCDsl5Ag7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nripTri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHJldHVybiBudWxsO1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzVG9rZW5RdW90YUVsaWdpYmxlKHdvcmtlci50b2tlbklkLCB3b3JrZXIudG9rZW5OYW1lLCBleGNsdWRlZFRva2VuSWRzKSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFJFVVNFX1dPUktFUl9XQUlUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIC8vIHJlc3RhcnQoZXBvY2gg67OA6rK9KSAvIHRocmVhZCDshozrqbjsnbQg64yA6riwIOykkeyXkCDrsJzsg53tlZjrqbQg7Y+067CxLlxuICAgICAgaWYgKHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHwgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkgcmV0dXJuIHdvcmtlcjtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSByZXR1cm4gbnVsbDtcbiAgICAgIGF3YWl0IHNsZWVwKFJFVVNFX1dPUktFUl9QT0xMX01TKTtcbiAgICB9XG4gIH1cblxuICBmaW5kV29ya2VyQnlJZCh3b3JrZXJJZDogbnVtYmVyKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IHdvcmtlcnMgb2YgdGhpcy53b3JrZXJQb29sLnZhbHVlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IHcgb2Ygd29ya2Vycykge1xuICAgICAgICBpZiAobWFrZU9wZW5BSVdvcmtlcklkKHcudG9rZW5JZCwgdy53b3JrZXJJbmRleCkgPT09IHdvcmtlcklkKSByZXR1cm4gdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHRXb3JrZXJUdXJuKHRocmVhZElkOiBzdHJpbmcsIHR1cm5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsV29ya2VycyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGFsbFdvcmtlcnMubWFwKCh3KSA9PiB3LmludGVycnVwdFR1cm4odGhyZWFkSWQsIHR1cm5JZCkpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXb3JrZXIgc2VsZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBRdW90YS1lbGlnaWJsZSBpZGxlIHRva2Vu7J2EIHdlaWdodOuhnCDqs6Drpbgg65KkLCDqt7ggdG9rZW4g7JWI7JeQ7IScIHdvcmtlcuulvCDsiJztmZjtlZzri6QuXG4gIGFzeW5jIGFjcXVpcmVJZGxlV29ya2VyKFxuICAgIGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKSxcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKGVsaWdpYmlsaXR5LnJlYWR5QWN0aXZlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuXG4gICAgY29uc3Qgd29ya2Vyc0J5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXT4oKTtcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpKSB7XG4gICAgICBpZiAoIWVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKSB8fCAhd29ya2VyLmhhc0NhcGFjaXR5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHdvcmtlcnMgPSB3b3JrZXJzQnlUb2tlbi5nZXQod29ya2VyLnRva2VuSWQpID8/IFtdO1xuICAgICAgd29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICB3b3JrZXJzQnlUb2tlbi5zZXQod29ya2VyLnRva2VuSWQsIHdvcmtlcnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkVG9rZW5JZCA9IHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZWxlY3QobmV3IFNldCh3b3JrZXJzQnlUb2tlbi5rZXlzKCkpKTtcbiAgICBpZiAoc2VsZWN0ZWRUb2tlbklkID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkhO1xuICAgIGNvbnN0IGN1cnNvciA9IHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5nZXQoc2VsZWN0ZWRUb2tlbklkKSA/PyAwO1xuICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHdvcmtlcnMubGVuZ3RoOyBvZmZzZXQrKykge1xuICAgICAgY29uc3QgaW5kZXggPSAoY3Vyc29yICsgb2Zmc2V0KSAlIHdvcmtlcnMubGVuZ3RoO1xuICAgICAgY29uc3Qgd29ya2VyID0gd29ya2Vyc1tpbmRleF0hO1xuICAgICAgaWYgKHdvcmtlci50cnlBY3F1aXJlVHVybigpKSB7XG4gICAgICAgIHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5zZXQoc2VsZWN0ZWRUb2tlbklkLCAoaW5kZXggKyAxKSAlIHdvcmtlcnMubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHdlaWdodGVkIHRva2VuICR7c2VsZWN0ZWRUb2tlbklkfSBsb3N0IGlkbGUgY2FwYWNpdHkgZHVyaW5nIHN5bmNocm9ub3VzIGFjcXVpcmVgLFxuICAgICk7XG4gIH1cblxuICBnZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSAmJiB3LmFjdGl2ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUXVldWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgZW5xdWV1ZTxUPihcbiAgICBleGVjdXRlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gUHJvbWlzZTxUPixcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGVsaWdpYmlsaXR5ID0gYXdhaXQgdGhpcy5yZXNvbHZlVG9rZW5FbGlnaWJpbGl0eShleGNsdWRlZFRva2VuSWRzKTtcbiAgICBpZiAoZWxpZ2liaWxpdHkucmVhZHlBY3RpdmVUb2tlbklkcy5zaXplID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICBpZiAoZWxpZ2liaWxpdHkuZWxpZ2libGVUb2tlbklkcy5zaXplID09PSAwKSB0aGlzLnRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eSk7XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID49IE1BWF9RVUVVRV9TSVpFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTRVJWRVJfQlVTWVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgaXRlbTogUXVldWVJdGVtID0ge1xuICAgICAgICByZXNvbHZlOiAod29ya2VyKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsIGV4ZWN1dGUpKVxuICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVqZWN0OiAoZXJyKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGltZXI6IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVF1ZXVlKGl0ZW0pO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJTRVJWRVJfQlVTWVwiKSk7XG4gICAgICAgIH0sIFFVRVVFX1RJTUVPVVRfTVMpLFxuICAgICAgICBleGNsdWRlZFRva2VuSWRzOiBuZXcgU2V0KGV4Y2x1ZGVkVG9rZW5JZHMpLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGl0ZW0pO1xuICAgICAgdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRnJvbVF1ZXVlKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5xdWV1ZS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpZHggIT09IC0xKSB0aGlzLnF1ZXVlLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgcmVqZWN0QWxsUXVldWVkKHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKHJlYXNvbik7XG4gICAgdGhpcy5xdWV1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICBpdGVtLnJlamVjdChlcnIpO1xuICAgIH0pO1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuXG4gIGFzeW5jIGRyYWluUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZHJhaW5pbmcpIHtcbiAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgdGhpcy5kcmFpbkFnYWluID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJhaW5RdWV1ZU9uY2UoKTtcbiAgICAgIH0gd2hpbGUgKHRoaXMuZHJhaW5BZ2Fpbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGRyYWluUXVldWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmFpblF1ZXVlT25jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZVswXSE7XG4gICAgICBsZXQgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVJZGxlV29ya2VyKG5leHQuZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIG5leHQucmVqZWN0KGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAoIXdvcmtlcikgYnJlYWs7XG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICBuZXh0LnJlc29sdmUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGV4ZWN1dGVBbmRSZWxlYXNlPFQ+KFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSh3b3JrZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3b3JrZXIucmVsZWFzZVR1cm4oKTtcbiAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXVzZVRocmVhZElkIOqwgCDsnojsnLzrqbQg6riw7KG0IHRocmVhZCDsl5AgZGVsdGEocmV1c2VJbnB1dCnrp4wsIOyXhuycvOuptCDsg4ggdGhyZWFkIOyXkCDsoITssrRcbiAgLy8gcHJvbXB0KGNvbGRJbnB1dCkgKyBoaXN0b3J5IGluamVjdC4gcmV1c2Ug6rCAIGRpc3BhdGNoZXIg64uo7JeQ7IScIO2PtOuwseuQmOuptCDtm4TsnpDroZwg65ao7Ja07KeE64ukLlxuICBwcml2YXRlIGJ1aWxkVHVyblJlcXVlc3QocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcpOiBUdXJuUmVxdWVzdCB7XG4gICAgY29uc3QgcmV1c2luZyA9IHJldXNlVGhyZWFkSWQgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQ6IHJldXNpbmcgJiYgcmVxLnJldXNlSW5wdXQgPyByZXEucmV1c2VJbnB1dCA6IHJlcS5jb2xkSW5wdXQsXG4gICAgICBoaXN0b3J5OiByZXVzaW5nID8gdW5kZWZpbmVkIDogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgb3V0cHV0U2NoZW1hOiByZXEub3V0cHV0U2NoZW1hLFxuICAgICAgZWZmb3J0OiByZXEuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgICAgbW9kZWw6IHJlcS5tb2RlbCxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICAgIGltYWdlR2VuZXJhdGlvbjogcmVxLmltYWdlR2VuZXJhdGlvbixcbiAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7JqU7LKtIOyCrOyghCDqsozsnbTtirgoUjUpOiDrsLDsoJXrkJwgd29ya2VyIOydmCBjYXBhYmlsaXR5ICsg7KCB7JqpIOuqqOuNuCDrqYDti7Drqqjri6wuXG4gICAgLy8g67aI7Lap7KGx7J2066m0IHR1cm4g7J2EIOyLpO2Wie2VmOyngCDslYrqs6Ag66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgY29uc3QgcmVhc29uID0gYXdhaXQgd29ya2VyLmNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChyZXEubW9kZWwpO1xuICAgICAgaWYgKHJlYXNvbikgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiZ2F0ZVwiLCByZWFzb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHR1cm5SZXEgPSB0aGlzLmJ1aWxkVHVyblJlcXVlc3QocmVxLCByZXVzZVRocmVhZElkKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JrZXIuZXhlY3V0ZVR1cm4odHVyblJlcSwgcmV1c2VUaHJlYWRJZCk7XG5cbiAgICAvLyDsnbTrr7jsp4AgMOqwnCDsi6TtjKgg67aE66WYKFI2KTogdG9vbCDrr7jtmLjstpwo7J6s7Iuc64+EIOustOydtSkgdnMg7Iuc64+EIO2bhCDrr7jsmYTshLEo7J6s7Iuc64+EIO2bhOuztCkuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24gJiYgKCFyZXN1bHQuaW1hZ2VzIHx8IHJlc3VsdC5pbWFnZXMubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhyb3cgcmVzdWx0LmltYWdlQXR0ZW1wdGVkXG4gICAgICAgID8gbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcImltYWdlIHRvb2wgcmFuIGJ1dCBwcm9kdWNlZCBubyBjb21wbGV0ZWQgaW1hZ2VcIilcbiAgICAgICAgOiBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJub3RfY2FsbGVkXCIsIFwibW9kZWwgZGlkIG5vdCBjYWxsIHRoZSBpbWFnZV9nZW5lcmF0aW9uIHRvb2xcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgdXNhZ2U6IHJlc3VsdC51c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgdHRmdE1zOiByZXN1bHQudHRmdE1zLFxuICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgIHRocmVhZElkOiByZXN1bHQudGhyZWFkSWQsXG4gICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICB9LFxuICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlU3RyZWFtVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgLy8gd29ya2VyIOydmCBUdXJuUmVzdWx0IOyXkCB0b2tlbk5hbWUvdGhyZWFkQ29vcmQg66W8IOu2meyXrCDsg4HsnIQoR2VuZXJhdGVSZXN1bHQp66GcIOyYrOumsOuLpC5cbiAgICAvLyB0aHJlYWRJZCDripQg7IOIIHRocmVhZCDrqbQgb25UaHJlYWRJZCDroZwg7ZmV7KCV65CY66+A66GcIOuvuOumrCDrs7TqtIDtlbQg65GQ6rOgIG9uQ29tcGxldGUg65WMIOydveuKlOuLpC5cbiAgICBsZXQgcmVzb2x2ZWRUaHJlYWRJZCA9IHJldXNlVGhyZWFkSWQgPz8gXCJcIjtcbiAgICBjb25zdCB3cmFwcGVkQ2I6IFN0cmVhbUNhbGxiYWNrcyA9IHtcbiAgICAgIC4uLmNiLFxuICAgICAgb25UaHJlYWRJZDogKHRocmVhZElkKSA9PiB7XG4gICAgICAgIHJlc29sdmVkVGhyZWFkSWQgPSB0aHJlYWRJZDtcbiAgICAgICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNiLm9uQ29tcGxldGUoe1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHdvcmtlci50b2tlbk5hbWUsXG4gICAgICAgICAgdGhyZWFkQ29vcmQ6IHtcbiAgICAgICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgICAgICB0aHJlYWRJZDogcmVzb2x2ZWRUaHJlYWRJZCxcbiAgICAgICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuU3RyZWFtKHR1cm5SZXEsIHdyYXBwZWRDYiwgcmV1c2VUaHJlYWRJZCk7XG4gIH1cblxuICAvLyDilIDilIAgU3Bhd24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgc3Bhd25Xb3JrZXJzKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YSh0b2tlbklkLCB0b2tlbk5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBjb25zdCB3b3JrZXJzOiBDb2RleEFwcFNlcnZlcldvcmtlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VuOyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkgYXdhaXQgc2xlZXAoU1BBV05fSU5URVJWQUxfTVMpO1xuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcih0b2tlbklkLCB0b2tlbk5hbWUsIGNyZWRlbnRpYWxzLCBpKTtcbiAgICAgIGlmICh3b3JrZXIpIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgIH1cbiAgICBpZiAod29ya2Vycy5sZW5ndGggPiAwKSB0aGlzLndvcmtlclBvb2wuc2V0KHRva2VuSWQsIHdvcmtlcnMpO1xuICB9XG5cbiAgYXN5bmMgc3Bhd25TaW5nbGVXb3JrZXIoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICB3b3JrZXJJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBDb2RleEFwcFNlcnZlcldvcmtlcih7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgYWNjZXNzVG9rZW46IGNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLFxuICAgICAgYWNjb3VudElkOiBjcmVkZW50aWFscy5hY2NvdW50SWQsXG4gICAgICBwbGFuVHlwZTogY3JlZGVudGlhbHMucGxhblR5cGUsXG4gICAgICB3b3JrZXJJbmRleCxcbiAgICB9KTtcblxuICAgIHdvcmtlci5vblJlYWR5ID0gKCkgPT4gdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuXG4gICAgd29ya2VyLnNldFNlcnZlclJlcXVlc3RIYW5kbGVyKGFzeW5jIChtZXRob2QpID0+IHtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCh0b2tlbklkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHNlcnZlci1yZXF1ZXN0OiAke21ldGhvZH1gKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JrZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3Rva2VuTmFtZX1bJHt3b3JrZXJJbmRleH1dYCk7XG4gICAgICByZXR1cm4gd29ya2VyO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgc3Bhd24gZmFpbGVkOiAke3Rva2VuTmFtZX1bJHt3b3JrZXJJbmRleH1dOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBldmFsdWF0ZUF1dG9zY2FsaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSB8fCB0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnNjYWxlVXBPbmVTdGVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0UmVxdWVzdEF0ID49IHRoaXMucG9vbENvbmZpZy5zY2FsZURvd25JZGxlTXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2NhbGVEb3duT25lU3RlcCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNjYWxlVXBPbmVTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSB8fCB0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnJ1blNjYWxpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXS5maWx0ZXIoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHtcbiAgICAgICAgaWYgKCFtZXRhZGF0YS5hY3RpdmUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuICh0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpPy5sZW5ndGggPz8gMCkgPCB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuO1xuICAgICAgfSk7XG4gICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgcHJvamVjdGVkV29ya2VyQ291bnQgPSB0aGlzLndvcmtlckNvdW50ICsgY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgICBjb25zdCBwcm9qZWN0ZWRSc3NHaUIgPSBlc3RpbWF0ZU9wZW5BSVdvcmtlclJzc0dpQihwcm9qZWN0ZWRXb3JrZXJDb3VudCk7XG4gICAgICBpZiAocHJvamVjdGVkUnNzR2lCID4gdGhpcy5wb29sQ29uZmlnLm1heEVzdGltYXRlZFJzc0dpQikge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgb3BlbmFpIGF1dG9zY2FsZSBibG9ja2VkOiBlc3RpbWF0ZWQgUlNTICR7cHJvamVjdGVkUnNzR2lCLnRvRml4ZWQoMil9R2lCIGV4Y2VlZHMgJHt0aGlzLnBvb2xDb25maWcubWF4RXN0aW1hdGVkUnNzR2lCLnRvRml4ZWQoMil9R2lCYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBob3N0QXZhaWxhYmxlR2lCID0gdGhpcy5nZXRIb3N0QXZhaWxhYmxlR2lCKCk7XG4gICAgICBpZiAoaG9zdEF2YWlsYWJsZUdpQiA8IHRoaXMucG9vbENvbmZpZy5taW5Ib3N0QXZhaWxhYmxlR2lCKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIGJsb2NrZWQ6IGhvc3QgYXZhaWxhYmxlICR7aG9zdEF2YWlsYWJsZUdpQi50b0ZpeGVkKDIpfUdpQiBiZWxvdyAke3RoaXMucG9vbENvbmZpZy5taW5Ib3N0QXZhaWxhYmxlR2lCLnRvRml4ZWQoMil9R2lCYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGF3bmVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNhbmRpZGF0ZXMubWFwKGFzeW5jIChbdG9rZW5JZCwgbWV0YWRhdGFdKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCkgPz8gW107XG4gICAgICAgICAgY29uc3Qgd29ya2VySW5kZXggPSB0aGlzLm5leHRBdmFpbGFibGVXb3JrZXJJbmRleCh3b3JrZXJzKTtcbiAgICAgICAgICBpZiAod29ya2VySW5kZXggPj0gdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcihcbiAgICAgICAgICAgIHRva2VuSWQsXG4gICAgICAgICAgICBtZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgbWV0YWRhdGEuY3JlZGVudGlhbHMsXG4gICAgICAgICAgICB3b3JrZXJJbmRleCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghd29ya2VyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRNZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFjdXJyZW50TWV0YWRhdGE/LmFjdGl2ZSB8fFxuICAgICAgICAgICAgY3VycmVudE1ldGFkYXRhICE9PSBtZXRhZGF0YSB8fFxuICAgICAgICAgICAgIWN1cnJlbnRXb3JrZXJzIHx8XG4gICAgICAgICAgICBjdXJyZW50V29ya2Vycy5zb21lKChlbnRyeSkgPT4gZW50cnkud29ya2VySW5kZXggPT09IHdvcmtlckluZGV4KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgICAgIGN1cnJlbnRXb3JrZXJzLnNvcnQoKGEsIGIpID0+IGEud29ya2VySW5kZXggLSBiLndvcmtlckluZGV4KTtcbiAgICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFkZGVkID0gc3Bhd25lZC5maWx0ZXIoKHdvcmtlcikgPT4gd29ya2VyICE9PSBudWxsKS5sZW5ndGg7XG4gICAgICBpZiAoYWRkZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIHVwOiArJHthZGRlZH0gd29ya2VycyAoJHt0aGlzLndvcmtlckNvdW50fSB0b3RhbCwgcXVldWUgJHt0aGlzLnF1ZXVlLmxlbmd0aH0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpLFxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5wb29sQ29uZmlnLnNjYWxlSW50ZXJ2YWxNcywgMV8wMDApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGltZXIudW5yZWY/LigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzY2FsZURvd25PbmVTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSB8fCB0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnJ1blNjYWxpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVtb3ZlZDogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0b2tlbklkIG9mIHRoaXMudG9rZW5NZXRhZGF0YS5rZXlzKCkpIHtcbiAgICAgICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCkgPz8gW107XG4gICAgICAgIGlmICh3b3JrZXJzLmxlbmd0aCA8PSB0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VuKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB3b3JrZXIgPSB3b3JrZXJzXG4gICAgICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBiLndvcmtlckluZGV4IC0gYS53b3JrZXJJbmRleClcbiAgICAgICAgICAuZmluZCgoZW50cnkpID0+IGVudHJ5Lmhhc0NhcGFjaXR5KTtcbiAgICAgICAgaWYgKCF3b3JrZXIpIGNvbnRpbnVlO1xuXG4gICAgICAgIHRoaXMud29ya2VyUG9vbC5zZXQoXG4gICAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgICB3b3JrZXJzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSB3b3JrZXIpLFxuICAgICAgICApO1xuICAgICAgICByZW1vdmVkLnB1c2god29ya2VyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlbW92ZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocmVtb3ZlZC5tYXAoKHdvcmtlcikgPT4gd29ya2VyLmtpbGwoKSkpO1xuICAgICAgbG9nZ2VyLmluZm8oYG9wZW5haSBhdXRvc2NhbGUgZG93bjogLSR7cmVtb3ZlZC5sZW5ndGh9IHdvcmtlcnMgKCR7dGhpcy53b3JrZXJDb3VudH0gdG90YWwpYCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG5leHRBdmFpbGFibGVXb3JrZXJJbmRleCh3b3JrZXJzOiBDb2RleEFwcFNlcnZlcldvcmtlcltdKTogbnVtYmVyIHtcbiAgICBjb25zdCB1c2VkID0gbmV3IFNldCh3b3JrZXJzLm1hcCgod29ya2VyKSA9PiB3b3JrZXIud29ya2VySW5kZXgpKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbjsgaW5kZXgrKykge1xuICAgICAgaWYgKCF1c2VkLmhhcyhpbmRleCkpIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSB8fCB0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICB2b2lkIHRoaXMuZXZhbHVhdGVBdXRvc2NhbGluZygpLmNhdGNoKChlKSA9PlxuICAgICAgbG9nZ2VyLndhcm4oYG9wZW5haSBhdXRvc2NhbGUgZXZhbHVhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU2NhbGluZyh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2NhbGluZ1Byb21pc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2NhbGluZ1Byb21pc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjYWxpbmcgPSB0YXNrKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zY2FsaW5nUHJvbWlzZSA9PT0gc2NhbGluZykgdGhpcy5zY2FsaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG4gICAgdGhpcy5zY2FsaW5nUHJvbWlzZSA9IHNjYWxpbmc7XG4gICAgYXdhaXQgc2NhbGluZztcbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICByYXRlTGltaXRzQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgeyBkYXRhOiBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlOyBjYWNoZWRBdDogbnVtYmVyIH0+KCk7XG4gIHN0YXRpYyByZWFkb25seSBSQVRFX0xJTUlUU19DQUNIRV9UVEwgPSA2MF8wMDA7XG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZCh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YT4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmF0ZUxpbWl0c0NhY2hlLmdldCh0b2tlbklkKTtcbiAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZXIgPSAodGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKSA/PyBbXSkuZmluZCgodykgPT4gdy5pc1JlYWR5KTtcbiAgICBpZiAoIXdvcmtlcikgdGhyb3cgbmV3IEVycm9yKFwibm8gcmVhZHkgb3BlbmFpIHdvcmtlcnNcIik7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCB3b3JrZXIuZ2V0UmF0ZUxpbWl0cygpKSBhcyBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlO1xuICAgIGNvbnN0IGVudHJ5ID0geyBkYXRhLCBjYWNoZWRBdDogRGF0ZS5ub3coKSB9O1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLnNldCh0b2tlbklkLCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0RHJhaW5RdWV1ZSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuZHJhaW5RdWV1ZSgpLmNhdGNoKChlKSA9PiBsb2dnZXIud2FybihgZHJhaW5RdWV1ZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUb2tlbk1ldGFkYXRhKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICB3ZWlnaHQ6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwge1xuICAgICAgbmFtZSxcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgcXVvdGFUaHJlc2hvbGQsXG4gICAgICB3ZWlnaHQsXG4gICAgICBhY3RpdmU6IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpPy5hY3RpdmUgPz8gdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIGdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQ6IG51bWJlcik6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpPy5xdW90YVRocmVzaG9sZDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzUXVvdGFUaHJlc2hvbGQodG9rZW5JZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5nZXRRdW90YVRocmVzaG9sZCh0b2tlbklkKTtcbiAgICByZXR1cm4gdGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgdGhyZXNob2xkICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlVG9rZW5FbGlnaWJpbGl0eShleGNsdWRlZFRva2VuSWRzOiBTZXQ8bnVtYmVyPik6IFByb21pc2U8VG9rZW5FbGlnaWJpbGl0eT4ge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpO1xuICAgIGNvbnN0IGJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgd29ya2VyIG9mIHdvcmtlcnMpIHtcbiAgICAgIGlmICghYnlUb2tlbi5oYXMod29ya2VyLnRva2VuSWQpKSBieVRva2VuLnNldCh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZHlBY3RpdmVUb2tlbklkcyA9IG5ldyBTZXQoYnlUb2tlbi5rZXlzKCkpO1xuICAgIGNvbnN0IGVsaWdpYmxlVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBjb25zdCBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCB0aHJlc2hvbGRlZFRva2VuQ291bnQgPSAwO1xuXG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmZyb20oYnlUb2tlbi5lbnRyaWVzKCkpO1xuICAgIGNvbnN0IGNoZWNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIGVudHJpZXMubWFwKGFzeW5jIChbdG9rZW5JZCwgdG9rZW5OYW1lXSkgPT4ge1xuICAgICAgICBpZiAoZXhjbHVkZWRUb2tlbklkcy5oYXModG9rZW5JZCkpIHtcbiAgICAgICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQrKztcbiAgICAgICAgICByZXR1cm4geyB0b2tlbklkLCB0b2tlbk5hbWUsIGVsaWdpYmxlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5oYXNRdW90YVRocmVzaG9sZCh0b2tlbklkKSkge1xuICAgICAgICAgIHJldHVybiB7IHRva2VuSWQsIHRva2VuTmFtZSwgZWxpZ2libGU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQrKztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b2tlbklkLFxuICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICBlbGlnaWJsZTogYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh0b2tlbklkLCB0b2tlbk5hbWUpLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNoZWNrcy5mb3JFYWNoKChjaGVjaywgaW5kZXgpID0+IHtcbiAgICAgIGlmIChjaGVjay5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIHtcbiAgICAgICAgaWYgKGNoZWNrLnZhbHVlLmVsaWdpYmxlKSB7XG4gICAgICAgICAgZWxpZ2libGVUb2tlbklkcy5hZGQoY2hlY2sudmFsdWUudG9rZW5JZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5nZXRRdW90YVRocmVzaG9sZChjaGVjay52YWx1ZS50b2tlbklkKTtcbiAgICAgICAgICBpZiAodGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgdGhyZXNob2xkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLnB1c2goeyB0b2tlbk5hbWU6IGNoZWNrLnZhbHVlLnRva2VuTmFtZSwgdGhyZXNob2xkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgY29uc3QgW3Rva2VuSWQsIHRva2VuTmFtZV0gPSBlbnRyeTtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuSWQsIHRva2VuTmFtZSwgU3RyaW5nKGNoZWNrLnJlYXNvbikpO1xuICAgICAgICBlbGlnaWJsZVRva2VuSWRzLmFkZCh0b2tlbklkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IHJlYWR5QWN0aXZlVG9rZW5JZHMsIGVsaWdpYmxlVG9rZW5JZHMsIG92ZXJUaHJlc2hvbGRUb2tlbnMsIHRocmVzaG9sZGVkVG9rZW5Db3VudCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpc1Rva2VuUXVvdGFFbGlnaWJsZShcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgZXhjbHVkZWRUb2tlbklkcz86IFNldDxudW1iZXI+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQpO1xuICAgIGlmICh0aHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCB0aHJlc2hvbGQgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gICAgbGV0IHJlc3VsdDogT3BlbkFJUXVvdGFVc2FnZVJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZE9wZW5BSVF1b3RhVXNhZ2UoKCkgPT4gdGhpcy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKHRva2VuSWQpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5OYW1lLCAoZSBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5OYW1lLCByZXN1bHQucmVhc29uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQudXRpbGl6YXRpb25QY3QgPj0gdGhyZXNob2xkKSB7XG4gICAgICB0aGlzLmxvZ1F1b3RhT3ZlclRocmVzaG9sZCh0b2tlbklkLCB0b2tlbk5hbWUsIHRocmVzaG9sZCwgcmVzdWx0KTtcbiAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM/LmFkZCh0b2tlbklkKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFPdmVyVGhyZXNob2xkKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICByZXN1bHQ6IEV4dHJhY3Q8T3BlbkFJUXVvdGFVc2FnZVJlc3VsdCwgeyBraW5kOiBcIm9rXCIgfT4sXG4gICk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IG92ZXJfdGhyZXNob2xkXCIsIHtcbiAgICAgIHRva2VuSWQsXG4gICAgICB0b2tlbk5hbWUsXG4gICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGNhY2hlZFV0aWxpemF0aW9uOiByZXN1bHQudXRpbGl6YXRpb25QY3QsXG4gICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJlc3VsdC53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICByZXNldHNBdDogcmVzdWx0LnJlc2V0c0F0LFxuICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICByZWFzb246IFwib3Zlcl90aHJlc2hvbGRcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkOiBudW1iZXIsIHRva2VuTmFtZTogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eTogVG9rZW5FbGlnaWJpbGl0eSk6IG5ldmVyIHtcbiAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0b2tlbkNvdW50OiBlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUsXG4gICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IGVsaWdpYmlsaXR5LnRocmVzaG9sZGVkVG9rZW5Db3VudCxcbiAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwib3BlbmFpXCIsIGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxvQkFBb0IsQ0FBQztBQVF4RCxJQUFhLHVCQUFiLGNBQTBDLE1BQU07Q0FDOUMsWUFDRSxNQUNBLFNBQ0E7QUFDQSxRQUFNLFFBQVE7QUFITCxPQUFBLE9BQUE7QUFJVCxPQUFLLE9BQU87OztBQUloQixNQUFNLGlCQUFpQjtBQUN2QixNQUFhLCtCQUErQjtBQUM1QyxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLHVDQUF1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