cdk-nextjs 0.7.5 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +38 -38
- package/.jsii.tabl.json +1 -1
- package/README.md +12 -3
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
- package/docs/adapter-runtime.md +1 -1
- package/docs/caching-guide.md +11 -1
- package/docs/harness-coverage.md +11 -9
- package/lib/adapter/adapter.mjs +220 -149
- package/lib/adapter/aws-cache-store.d.ts +242 -7
- package/lib/adapter/aws-cache-store.js +520 -54
- package/lib/adapter/aws-cache-store.test.js +710 -3
- package/lib/adapter/build-outputs.js +23 -1
- package/lib/adapter/build-outputs.test.js +18 -1
- package/lib/adapter/cache-handler.d.ts +4 -3
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-handler.mjs +552 -91
- package/lib/adapter/cache-handler.test.js +31 -1
- package/lib/adapter/cache-utils.d.ts +68 -2
- package/lib/adapter/cache-utils.js +108 -2
- package/lib/adapter/cache-utils.test.js +45 -1
- package/lib/adapter/init-cache.d.ts +1 -1
- package/lib/adapter/init-cache.js +60 -37
- package/lib/adapter/init-cache.test.js +55 -2
- package/lib/adapter/local-file-cache-handler.d.ts +2 -2
- package/lib/adapter/local-file-cache-handler.js +4 -5
- package/lib/adapter/s3-cache-handler.d.ts +23 -7
- package/lib/adapter/s3-cache-handler.js +63 -27
- package/lib/adapter/s3-cache-handler.test.js +168 -1
- package/lib/adapter/use-cache-common.d.ts +53 -1
- package/lib/adapter/use-cache-common.js +121 -14
- package/lib/adapter/use-cache-common.test.js +138 -1
- package/lib/adapter/use-cache-default-handler.js +36 -6
- package/lib/adapter/use-cache-default-handler.mjs +557 -51
- package/lib/adapter/use-cache-handlers.test.js +247 -7
- package/lib/adapter/use-cache-remote-handler.js +10 -9
- package/lib/adapter/use-cache-remote-handler.mjs +597 -101
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.d.ts +0 -7
- package/lib/nextjs-build/nextjs-build.js +4 -11
- package/lib/nextjs-build/nextjs-build.test.js +4 -3
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.js +18 -4
- package/lib/runtime/core.test.js +17 -1
- package/lib/runtime/image.d.ts +19 -0
- package/lib/runtime/image.js +28 -2
- package/lib/runtime/image.test.js +43 -1
- package/lib/runtime/lambda.mjs +30 -6
- package/lib/runtime/server.mjs +30 -6
- package/lib/runtime/tag-manifest.d.ts +15 -0
- package/lib/runtime/tag-manifest.js +24 -0
- package/lib/runtime/tag-manifest.test.d.ts +1 -0
- package/lib/runtime/tag-manifest.test.js +21 -0
- package/lib/utils/deployment-build-id.d.ts +11 -0
- package/lib/utils/deployment-build-id.js +15 -0
- package/package.json +3 -3
- package/scripts/e2e-harness/README.md +1 -1
|
@@ -152,6 +152,29 @@ describe("TagMarkerTable", () => {
|
|
|
152
152
|
expiredAt: undefined,
|
|
153
153
|
});
|
|
154
154
|
});
|
|
155
|
+
it("keys a tag past the sort key limit by its hash, and reads it back as the tag", async () => {
|
|
156
|
+
// `revalidatePath` on a long path: an implicit tag is as long as the path.
|
|
157
|
+
const tag = `_N_T_/${"p".repeat(1100)}`;
|
|
158
|
+
send.mockResolvedValue({});
|
|
159
|
+
await table.write(tag, 1000, undefined);
|
|
160
|
+
const written = commandInput(send.mock.calls[0][0], client_dynamodb_1.UpdateItemCommand);
|
|
161
|
+
expect(written.Key.sk.S).toBe((0, aws_cache_store_1.hashedTag)(tag));
|
|
162
|
+
expect((0, aws_cache_store_1.hashedTag)(tag)).toMatch(/^#[0-9a-f]{64}$/);
|
|
163
|
+
send.mockReset();
|
|
164
|
+
send.mockImplementation((command) => {
|
|
165
|
+
const { RequestItems } = commandInput(command, client_dynamodb_1.BatchGetItemCommand);
|
|
166
|
+
return Promise.resolve({
|
|
167
|
+
Responses: {
|
|
168
|
+
tbl: RequestItems.tbl.Keys.map(({ sk }) => ({
|
|
169
|
+
sk,
|
|
170
|
+
revalidatedAt: { N: "7" },
|
|
171
|
+
})),
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
const markers = await table.read([tag, "short"]);
|
|
176
|
+
expect([...markers.keys()].sort()).toEqual(["short", tag].sort());
|
|
177
|
+
});
|
|
155
178
|
// A read-back after the write is eventually consistent, so it can return
|
|
156
179
|
// the marker from before it: the writer tracks what the write returned.
|
|
157
180
|
it("returns the row as the write left it", async () => {
|
|
@@ -269,6 +292,18 @@ describe("RevalidationLog", () => {
|
|
|
269
292
|
},
|
|
270
293
|
]);
|
|
271
294
|
});
|
|
295
|
+
it("hashes a tag too long for the sort key, carrying it in longTag", async () => {
|
|
296
|
+
const tag = `_N_T_/${"p".repeat(1100)}`;
|
|
297
|
+
send.mockResolvedValue({});
|
|
298
|
+
await log.put(tag, 1000, { revalidatedAt: 5 });
|
|
299
|
+
const { Item } = commandInput(send.mock.calls[0][0], client_dynamodb_1.PutItemCommand);
|
|
300
|
+
expect(Item.sk.S).toBe(`000000000001000#${(0, aws_cache_store_1.hashedTag)(tag)}`);
|
|
301
|
+
expect(Item.longTag).toEqual({ S: tag });
|
|
302
|
+
send.mockReset();
|
|
303
|
+
send.mockResolvedValueOnce({ Items: [{ ...Item }] });
|
|
304
|
+
const { rows } = await log.query(0);
|
|
305
|
+
expect(rows.map((row) => row.tag)).toEqual([tag]);
|
|
306
|
+
});
|
|
272
307
|
it("stops after its page bound and says so", async () => {
|
|
273
308
|
send.mockResolvedValue({
|
|
274
309
|
Items: [],
|
|
@@ -317,6 +352,677 @@ describe("CacheBucket", () => {
|
|
|
317
352
|
});
|
|
318
353
|
});
|
|
319
354
|
describe("TrackedTagMarkers", () => {
|
|
355
|
+
it("never counts a render the runtime caught up as behind", async () => {
|
|
356
|
+
let clock = 1_000_000;
|
|
357
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
358
|
+
markers: { read: jest.fn() },
|
|
359
|
+
log: { query: jest.fn() },
|
|
360
|
+
refreshIntervalMs: 1000,
|
|
361
|
+
clock: () => clock,
|
|
362
|
+
});
|
|
363
|
+
// Just short of the line as the request came in: `catchUp` lets it go.
|
|
364
|
+
clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS;
|
|
365
|
+
expect(markers.behind).toBe(false);
|
|
366
|
+
await markers.catchUp(async () => {
|
|
367
|
+
// However long the render takes, its lookups never wait: waiting is
|
|
368
|
+
// what the catch-up before it was for.
|
|
369
|
+
clock += 100;
|
|
370
|
+
expect(markers.behind).toBe(true);
|
|
371
|
+
expect(markers.behindInRender).toBe(false);
|
|
372
|
+
clock += 60_000;
|
|
373
|
+
expect(markers.behindInRender).toBe(false);
|
|
374
|
+
});
|
|
375
|
+
// Outside it - a route handler alongside, in a container - it waits.
|
|
376
|
+
expect(markers.behindInRender).toBe(true);
|
|
377
|
+
});
|
|
378
|
+
it("gives a render no grace when catchUp, holding nothing, did not catch up", async () => {
|
|
379
|
+
let clock = 1_000_000;
|
|
380
|
+
let held = false;
|
|
381
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
382
|
+
markers: { read: jest.fn() },
|
|
383
|
+
log: {
|
|
384
|
+
query: jest.fn(async () => ({ rows: [], truncated: false })),
|
|
385
|
+
},
|
|
386
|
+
refreshIntervalMs: 1000,
|
|
387
|
+
clock: () => clock,
|
|
388
|
+
});
|
|
389
|
+
markers.judgeEntriesOf(() => (held ? 0 : Infinity), () => held);
|
|
390
|
+
clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS + 100;
|
|
391
|
+
await markers.catchUp(async () => {
|
|
392
|
+
// Another request stores an entry before this render's first lookup.
|
|
393
|
+
held = true;
|
|
394
|
+
expect(markers.behindInRender).toBe(true);
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
it("starts a refresh for a page that is not behind, without waiting for it", async () => {
|
|
398
|
+
let clock = 1_000_000;
|
|
399
|
+
let release;
|
|
400
|
+
const query = jest.fn(() => new Promise((resolve) => (release = () => resolve({ rows: [], truncated: false }))));
|
|
401
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
402
|
+
markers: { read: jest.fn() },
|
|
403
|
+
log: { query },
|
|
404
|
+
refreshIntervalMs: 1000,
|
|
405
|
+
clock: () => clock,
|
|
406
|
+
});
|
|
407
|
+
markers.judgeEntriesOf(() => 0);
|
|
408
|
+
clock += 1000;
|
|
409
|
+
expect(markers.behind).toBe(false);
|
|
410
|
+
// A page that reads no cache still keeps the instance current.
|
|
411
|
+
await expect(markers.catchUp(async () => "page")).resolves.toBe("page");
|
|
412
|
+
expect(query).toHaveBeenCalledTimes(1);
|
|
413
|
+
release();
|
|
414
|
+
});
|
|
415
|
+
it("catches up on the log without waiting for the rolling re-read", async () => {
|
|
416
|
+
let clock = 1_000_000;
|
|
417
|
+
let release;
|
|
418
|
+
const read = jest.fn(async (tags) => {
|
|
419
|
+
if (read.mock.calls.length > 1) {
|
|
420
|
+
await new Promise((resolve) => (release = resolve));
|
|
421
|
+
}
|
|
422
|
+
return new Map(tags.map((tag) => [tag, {}]));
|
|
423
|
+
});
|
|
424
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
425
|
+
markers: { read },
|
|
426
|
+
log: {
|
|
427
|
+
query: jest.fn(async () => ({ rows: [], truncated: false })),
|
|
428
|
+
},
|
|
429
|
+
refreshIntervalMs: 1000,
|
|
430
|
+
resyncIntervalMs: 1000,
|
|
431
|
+
random: () => 0,
|
|
432
|
+
clock: () => clock,
|
|
433
|
+
});
|
|
434
|
+
markers.judgeEntriesOf(() => 0);
|
|
435
|
+
await markers.ensure(["posts"]);
|
|
436
|
+
// Due for its re-read, and behind, as after a quiet spell.
|
|
437
|
+
clock += 5000;
|
|
438
|
+
expect(markers.behind).toBe(true);
|
|
439
|
+
let rendered = false;
|
|
440
|
+
await markers.catchUp(async () => (rendered = true));
|
|
441
|
+
// A throttled `BatchGetItem` would otherwise hold the page.
|
|
442
|
+
expect(rendered).toBe(true);
|
|
443
|
+
expect(read).toHaveBeenCalledTimes(2);
|
|
444
|
+
// Nor does a lookup of the tracked tag wait on it.
|
|
445
|
+
let ensured = false;
|
|
446
|
+
void markers.ensure(["posts"]).then(() => (ensured = true));
|
|
447
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
448
|
+
expect(ensured).toBe(true);
|
|
449
|
+
// Still in flight an interval later: not read a second time meanwhile.
|
|
450
|
+
clock += 1000;
|
|
451
|
+
await markers.refresh();
|
|
452
|
+
expect(read).toHaveBeenCalledTimes(2);
|
|
453
|
+
release();
|
|
454
|
+
});
|
|
455
|
+
it("gives a route handler, which no catch-up precedes, no grace more", async () => {
|
|
456
|
+
let clock = 1_000_000;
|
|
457
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
458
|
+
markers: { read: jest.fn() },
|
|
459
|
+
log: { query: jest.fn() },
|
|
460
|
+
refreshIntervalMs: 1000,
|
|
461
|
+
clock: () => clock,
|
|
462
|
+
});
|
|
463
|
+
clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS + 100;
|
|
464
|
+
expect(markers.behindInRender).toBe(true);
|
|
465
|
+
});
|
|
466
|
+
it("reads again only once, however many forgets land meanwhile", async () => {
|
|
467
|
+
let clock = 1_000_000;
|
|
468
|
+
const releases = [];
|
|
469
|
+
const read = jest.fn(async () => {
|
|
470
|
+
await new Promise((resolve) => releases.push(resolve));
|
|
471
|
+
return new Map([["posts", { revalidatedAt: 1 }]]);
|
|
472
|
+
});
|
|
473
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
474
|
+
markers: { read },
|
|
475
|
+
log: {
|
|
476
|
+
query: jest.fn(async () => ({ rows: [], truncated: false })),
|
|
477
|
+
},
|
|
478
|
+
refreshIntervalMs: 0,
|
|
479
|
+
clock: () => clock,
|
|
480
|
+
});
|
|
481
|
+
markers.judgeEntriesOf(() => 0);
|
|
482
|
+
const forget = async () => {
|
|
483
|
+
clock += aws_cache_store_1.MAX_REVALIDATION_LOG_GAP_MS + 1;
|
|
484
|
+
await markers.refresh();
|
|
485
|
+
};
|
|
486
|
+
const ensuring = markers.ensure(["posts"]);
|
|
487
|
+
await forget();
|
|
488
|
+
releases.shift()();
|
|
489
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
490
|
+
await forget();
|
|
491
|
+
releases.shift()();
|
|
492
|
+
await ensuring;
|
|
493
|
+
// A truncated log forgets on every query: waiting for a read no forget
|
|
494
|
+
// overtook would keep the requests waiting on this one for as long.
|
|
495
|
+
expect(read).toHaveBeenCalledTimes(2);
|
|
496
|
+
expect(markers.get("posts")).toEqual({ revalidatedAt: 1 });
|
|
497
|
+
});
|
|
498
|
+
it("reads again what a read from before a forget found", async () => {
|
|
499
|
+
let clock = 1_000_000;
|
|
500
|
+
let release;
|
|
501
|
+
const held = new Promise((resolve) => (release = resolve));
|
|
502
|
+
let revalidatedAt;
|
|
503
|
+
const read = jest.fn(async () => {
|
|
504
|
+
await held;
|
|
505
|
+
return new Map(revalidatedAt === undefined ? [] : [["posts", { revalidatedAt }]]);
|
|
506
|
+
});
|
|
507
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
508
|
+
markers: { read },
|
|
509
|
+
log: {
|
|
510
|
+
query: jest.fn(async () => ({ rows: [], truncated: false })),
|
|
511
|
+
},
|
|
512
|
+
refreshIntervalMs: 0,
|
|
513
|
+
clock: () => clock,
|
|
514
|
+
});
|
|
515
|
+
markers.judgeEntriesOf(() => 0);
|
|
516
|
+
// A background read in flight as the sandbox froze, past the log's TTL.
|
|
517
|
+
const ensuring = markers.ensure(["posts"]);
|
|
518
|
+
clock += aws_cache_store_1.MAX_REVALIDATION_LOG_GAP_MS + 1;
|
|
519
|
+
await markers.refresh();
|
|
520
|
+
// Read again once the stale read returns: tracked, its marker would
|
|
521
|
+
// vouch for every entry with the tag, revalidated during the freeze or
|
|
522
|
+
// not; untracked, the request waiting on it would judge by nothing.
|
|
523
|
+
revalidatedAt = (0, aws_cache_store_1.markerClock)();
|
|
524
|
+
release();
|
|
525
|
+
await ensuring;
|
|
526
|
+
expect(read).toHaveBeenCalledTimes(2);
|
|
527
|
+
expect(markers.get("posts")).toEqual({ revalidatedAt });
|
|
528
|
+
});
|
|
529
|
+
it("moves completeSince past what it forgets", async () => {
|
|
530
|
+
let clock = 1_000_000;
|
|
531
|
+
const later = (0, aws_cache_store_1.markerClock)() + 60_000;
|
|
532
|
+
const rows = ["a", "b"].map((tag, i) => ({
|
|
533
|
+
sk: `${String(clock).padStart(15, "0")}#${tag}`,
|
|
534
|
+
at: clock,
|
|
535
|
+
tag,
|
|
536
|
+
marker: { revalidatedAt: later + i },
|
|
537
|
+
}));
|
|
538
|
+
const query = jest.fn(async () => ({ rows, truncated: false }));
|
|
539
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
540
|
+
markers: { read: jest.fn() },
|
|
541
|
+
log: { query },
|
|
542
|
+
refreshIntervalMs: 0,
|
|
543
|
+
maxTrackedTags: 1,
|
|
544
|
+
clock: () => clock,
|
|
545
|
+
});
|
|
546
|
+
// An entry store holding something older than every row.
|
|
547
|
+
markers.judgeEntriesOf(() => 0);
|
|
548
|
+
const start = markers.completeSince;
|
|
549
|
+
expect(start).toBeLessThanOrEqual((0, aws_cache_store_1.markerClock)());
|
|
550
|
+
// Untracked tags' rows are known from the log alone, as far as they fit.
|
|
551
|
+
await markers.refresh();
|
|
552
|
+
expect(markers.state(["b"], later)).toBe("expired");
|
|
553
|
+
// "a" was dropped for space, and with it what it knew.
|
|
554
|
+
expect(markers.state(["a"], later)).toBe("fresh");
|
|
555
|
+
expect(markers.completeSince).toBe(later);
|
|
556
|
+
// Forgetting everything moves it to now, or past what it forgot: "b".
|
|
557
|
+
clock += aws_cache_store_1.MAX_REVALIDATION_LOG_GAP_MS + 1;
|
|
558
|
+
await markers.refresh();
|
|
559
|
+
expect(markers.completeSince).toBe(later + 1);
|
|
560
|
+
});
|
|
561
|
+
it("moves completeSince past a row it lets go of with no entry held", async () => {
|
|
562
|
+
const clock = 1_000_000;
|
|
563
|
+
const revalidatedAt = (0, aws_cache_store_1.markerClock)() + 60_000;
|
|
564
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
565
|
+
markers: { read: jest.fn() },
|
|
566
|
+
log: {
|
|
567
|
+
query: jest.fn(async () => ({
|
|
568
|
+
rows: [
|
|
569
|
+
{
|
|
570
|
+
sk: `${String(clock).padStart(15, "0")}#posts`,
|
|
571
|
+
at: clock,
|
|
572
|
+
tag: "posts",
|
|
573
|
+
marker: { revalidatedAt },
|
|
574
|
+
},
|
|
575
|
+
],
|
|
576
|
+
truncated: false,
|
|
577
|
+
})),
|
|
578
|
+
},
|
|
579
|
+
refreshIntervalMs: 0,
|
|
580
|
+
clock: () => clock,
|
|
581
|
+
});
|
|
582
|
+
markers.judgeEntriesOf(() => Infinity);
|
|
583
|
+
await markers.refresh();
|
|
584
|
+
// An entry whose generation started before the revalidation, stored once
|
|
585
|
+
// the row is gone, is older than `completeSince`, and so read first.
|
|
586
|
+
expect(markers.state(["posts"], revalidatedAt - 1)).toBe("fresh");
|
|
587
|
+
expect(markers.completeSince).toBe(revalidatedAt);
|
|
588
|
+
});
|
|
589
|
+
it("prunes a profile's row, and moves completeSince to its expiredAt once past", async () => {
|
|
590
|
+
const clock = 1_000_000;
|
|
591
|
+
const staleAt = (0, aws_cache_store_1.markerClock)() + 1000;
|
|
592
|
+
const expiredAt = staleAt + 60_000;
|
|
593
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
594
|
+
markers: { read: jest.fn() },
|
|
595
|
+
log: {
|
|
596
|
+
query: jest.fn(async () => ({
|
|
597
|
+
rows: [
|
|
598
|
+
{
|
|
599
|
+
sk: `${String(clock).padStart(15, "0")}#posts`,
|
|
600
|
+
at: clock,
|
|
601
|
+
tag: "posts",
|
|
602
|
+
marker: { staleAt, expiredAt },
|
|
603
|
+
},
|
|
604
|
+
],
|
|
605
|
+
truncated: false,
|
|
606
|
+
})),
|
|
607
|
+
},
|
|
608
|
+
refreshIntervalMs: 0,
|
|
609
|
+
clock: () => clock,
|
|
610
|
+
});
|
|
611
|
+
markers.judgeEntriesOf(() => staleAt + 1);
|
|
612
|
+
await markers.refresh();
|
|
613
|
+
expect(markers.state(["posts"], staleAt - 1)).toBe("fresh");
|
|
614
|
+
expect(markers.completeSince).toBe(staleAt);
|
|
615
|
+
const now = jest
|
|
616
|
+
.spyOn(performance, "now")
|
|
617
|
+
.mockReturnValue(expiredAt - performance.timeOrigin);
|
|
618
|
+
try {
|
|
619
|
+
expect(markers.completeSince).toBe(expiredAt);
|
|
620
|
+
}
|
|
621
|
+
finally {
|
|
622
|
+
now.mockRestore();
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
it("queues a pruned row's future expiredAt once, however often the lookback returns it", async () => {
|
|
626
|
+
let clock = 1_000_000;
|
|
627
|
+
const staleAt = (0, aws_cache_store_1.markerClock)() + 1000;
|
|
628
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
629
|
+
markers: { read: jest.fn() },
|
|
630
|
+
log: {
|
|
631
|
+
query: jest.fn(async () => ({
|
|
632
|
+
rows: [
|
|
633
|
+
{
|
|
634
|
+
sk: `${String(1_000_000).padStart(15, "0")}#posts`,
|
|
635
|
+
at: 1_000_000,
|
|
636
|
+
tag: "posts",
|
|
637
|
+
marker: { staleAt, expiredAt: staleAt + 60_000 },
|
|
638
|
+
},
|
|
639
|
+
],
|
|
640
|
+
truncated: false,
|
|
641
|
+
})),
|
|
642
|
+
},
|
|
643
|
+
refreshIntervalMs: 0,
|
|
644
|
+
clock: () => clock,
|
|
645
|
+
});
|
|
646
|
+
markers.judgeEntriesOf(() => staleAt + 1);
|
|
647
|
+
for (let i = 0; i < 3; i++) {
|
|
648
|
+
await markers.refresh();
|
|
649
|
+
clock += 1000;
|
|
650
|
+
}
|
|
651
|
+
// Pruned rows are not marked applied, so each query applies it again.
|
|
652
|
+
expect(markers.laterFloors).toHaveLength(1);
|
|
653
|
+
});
|
|
654
|
+
it("merges future expiredAts past its bound without moving completeSince early", async () => {
|
|
655
|
+
const at = (0, aws_cache_store_1.markerClock)();
|
|
656
|
+
const expiries = new Map([
|
|
657
|
+
["a", at + 60_000],
|
|
658
|
+
["b", at + 60_010],
|
|
659
|
+
["c", at + 120_000],
|
|
660
|
+
]);
|
|
661
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
662
|
+
markers: {
|
|
663
|
+
read: jest.fn(async (tags) => new Map(tags.map((tag) => [
|
|
664
|
+
tag,
|
|
665
|
+
{ staleAt: at - 1000, expiredAt: expiries.get(tag) },
|
|
666
|
+
]))),
|
|
667
|
+
},
|
|
668
|
+
log: { query: jest.fn() },
|
|
669
|
+
maxTrackedTags: 1,
|
|
670
|
+
});
|
|
671
|
+
const start = markers.completeSince;
|
|
672
|
+
// "a", then "b", dropped for space: two expiredAts past a bound of one.
|
|
673
|
+
for (const tag of ["a", "b", "c"]) {
|
|
674
|
+
await markers.ensure([tag]);
|
|
675
|
+
}
|
|
676
|
+
expect(markers.completeSince).toBe(start);
|
|
677
|
+
const now = jest.spyOn(performance, "now");
|
|
678
|
+
try {
|
|
679
|
+
now.mockReturnValue(at + 59_999 - performance.timeOrigin);
|
|
680
|
+
expect(markers.completeSince).toBe(start);
|
|
681
|
+
// Merged: "b"'s from "a"'s, 10 ms early.
|
|
682
|
+
now.mockReturnValue(at + 60_000 - performance.timeOrigin);
|
|
683
|
+
expect(markers.completeSince).toBe(at + 60_010);
|
|
684
|
+
}
|
|
685
|
+
finally {
|
|
686
|
+
now.mockRestore();
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
it("does not join a near expiredAt to far ones past its bound", async () => {
|
|
690
|
+
const at = (0, aws_cache_store_1.markerClock)();
|
|
691
|
+
const year = 365 * 24 * 60 * 60 * 1000;
|
|
692
|
+
const expiries = new Map([
|
|
693
|
+
["a", at + year],
|
|
694
|
+
["b", at + year + 10],
|
|
695
|
+
["c", at + 60_000],
|
|
696
|
+
]);
|
|
697
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
698
|
+
markers: {
|
|
699
|
+
read: jest.fn(async (tags) => new Map(tags.map((tag) => [
|
|
700
|
+
tag,
|
|
701
|
+
{ staleAt: at - 1000, expiredAt: expiries.get(tag) },
|
|
702
|
+
]))),
|
|
703
|
+
},
|
|
704
|
+
log: { query: jest.fn() },
|
|
705
|
+
maxTrackedTags: 2,
|
|
706
|
+
});
|
|
707
|
+
for (const tag of ["a", "b", "c", "d", "e"]) {
|
|
708
|
+
await markers.ensure([tag]);
|
|
709
|
+
}
|
|
710
|
+
const now = jest
|
|
711
|
+
.spyOn(performance, "now")
|
|
712
|
+
.mockReturnValue(at + 60_000 - performance.timeOrigin);
|
|
713
|
+
try {
|
|
714
|
+
// "a" and "b" are merged, not "c" into "a": `completeSince` a year
|
|
715
|
+
// early would have every held entry read its markers first until then.
|
|
716
|
+
expect(markers.completeSince).toBe(at + 60_000);
|
|
717
|
+
}
|
|
718
|
+
finally {
|
|
719
|
+
now.mockRestore();
|
|
720
|
+
}
|
|
721
|
+
});
|
|
722
|
+
it("merges the closest future expiredAts past its bound", async () => {
|
|
723
|
+
const at = (0, aws_cache_store_1.markerClock)();
|
|
724
|
+
const expiries = new Map([
|
|
725
|
+
["a", at + 60_000],
|
|
726
|
+
["b", at + 120_000],
|
|
727
|
+
["c", at + 60_010],
|
|
728
|
+
]);
|
|
729
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
730
|
+
markers: {
|
|
731
|
+
read: jest.fn(async (tags) => new Map(tags.map((tag) => [
|
|
732
|
+
tag,
|
|
733
|
+
{ staleAt: at - 1000, expiredAt: expiries.get(tag) },
|
|
734
|
+
]))),
|
|
735
|
+
},
|
|
736
|
+
log: { query: jest.fn() },
|
|
737
|
+
maxTrackedTags: 2,
|
|
738
|
+
});
|
|
739
|
+
// "a", "b", then "c" dropped for space: three expiredAts past a bound of
|
|
740
|
+
// two, and "c" is 10 ms from "a".
|
|
741
|
+
for (const tag of ["a", "b", "c", "d", "e"]) {
|
|
742
|
+
await markers.ensure([tag]);
|
|
743
|
+
}
|
|
744
|
+
const start = markers.completeSince;
|
|
745
|
+
const now = jest.spyOn(performance, "now");
|
|
746
|
+
try {
|
|
747
|
+
now.mockReturnValue(at + 59_999 - performance.timeOrigin);
|
|
748
|
+
expect(markers.completeSince).toBe(start);
|
|
749
|
+
now.mockReturnValue(at + 60_000 - performance.timeOrigin);
|
|
750
|
+
expect(markers.completeSince).toBe(at + 60_010);
|
|
751
|
+
now.mockReturnValue(at + 119_999 - performance.timeOrigin);
|
|
752
|
+
expect(markers.completeSince).toBe(at + 60_010);
|
|
753
|
+
now.mockReturnValue(at + 120_000 - performance.timeOrigin);
|
|
754
|
+
expect(markers.completeSince).toBe(at + 120_000);
|
|
755
|
+
}
|
|
756
|
+
finally {
|
|
757
|
+
now.mockRestore();
|
|
758
|
+
}
|
|
759
|
+
});
|
|
760
|
+
it("catches up only for an entry store holding entries, and not when every check asks anyway", async () => {
|
|
761
|
+
let clock = 1_000_000;
|
|
762
|
+
const instance = (refreshIntervalMs) => {
|
|
763
|
+
const query = jest.fn(async () => ({ rows: [], truncated: false }));
|
|
764
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
765
|
+
markers: { read: jest.fn() },
|
|
766
|
+
log: { query },
|
|
767
|
+
refreshIntervalMs,
|
|
768
|
+
clock: () => clock,
|
|
769
|
+
});
|
|
770
|
+
return { markers, query };
|
|
771
|
+
};
|
|
772
|
+
const noStore = instance(1000);
|
|
773
|
+
const everyCheck = instance(0);
|
|
774
|
+
everyCheck.markers.judgeEntriesOf(() => Infinity);
|
|
775
|
+
// A store, but holding nothing a refresh could expire.
|
|
776
|
+
const emptyStore = instance(1000);
|
|
777
|
+
emptyStore.markers.judgeEntriesOf(() => Infinity);
|
|
778
|
+
const store = instance(1000);
|
|
779
|
+
store.markers.judgeEntriesOf(() => 0);
|
|
780
|
+
clock += 60_000;
|
|
781
|
+
for (const { markers } of [noStore, everyCheck, emptyStore, store]) {
|
|
782
|
+
expect(markers.behind).toBe(true);
|
|
783
|
+
await markers.catchUp(async () => { });
|
|
784
|
+
}
|
|
785
|
+
expect(noStore.query).not.toHaveBeenCalled();
|
|
786
|
+
expect(everyCheck.query).not.toHaveBeenCalled();
|
|
787
|
+
expect(emptyStore.query).not.toHaveBeenCalled();
|
|
788
|
+
expect(store.query).toHaveBeenCalledTimes(1);
|
|
789
|
+
});
|
|
790
|
+
it("moves completeSince to a dropped marker's future expiredAt only once it is past", async () => {
|
|
791
|
+
const at = (0, aws_cache_store_1.markerClock)();
|
|
792
|
+
const read = jest.fn(async (tags) => new Map(tags.map((tag) => [
|
|
793
|
+
tag,
|
|
794
|
+
{ staleAt: at - 1000, expiredAt: at + 60_000 },
|
|
795
|
+
])));
|
|
796
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
797
|
+
markers: { read },
|
|
798
|
+
log: { query: jest.fn() },
|
|
799
|
+
maxTrackedTags: 1,
|
|
800
|
+
});
|
|
801
|
+
const start = markers.completeSince;
|
|
802
|
+
await markers.ensure(["a"]);
|
|
803
|
+
// "a" is dropped for space: a year-long `expire` would otherwise keep
|
|
804
|
+
// every entry reading its markers first for as long.
|
|
805
|
+
await markers.ensure(["b"]);
|
|
806
|
+
expect(markers.completeSince).toBe(start);
|
|
807
|
+
const clock = jest
|
|
808
|
+
.spyOn(performance, "now")
|
|
809
|
+
.mockReturnValue(at + 60_001 - performance.timeOrigin);
|
|
810
|
+
try {
|
|
811
|
+
expect(markers.completeSince).toBe(at + 60_000);
|
|
812
|
+
}
|
|
813
|
+
finally {
|
|
814
|
+
clock.mockRestore();
|
|
815
|
+
}
|
|
816
|
+
});
|
|
817
|
+
it("keeps only the log rows that could apply to an entry held", async () => {
|
|
818
|
+
let clock = 1_000_000;
|
|
819
|
+
const later = (0, aws_cache_store_1.markerClock)() + 60_000;
|
|
820
|
+
const rows = ["old", "new"].map((tag, i) => ({
|
|
821
|
+
sk: `${String(clock).padStart(15, "0")}#${tag}`,
|
|
822
|
+
at: clock,
|
|
823
|
+
tag,
|
|
824
|
+
marker: { revalidatedAt: i === 0 ? 1 : later },
|
|
825
|
+
}));
|
|
826
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
827
|
+
markers: { read: jest.fn() },
|
|
828
|
+
log: {
|
|
829
|
+
query: jest.fn(async () => ({ rows, truncated: false })),
|
|
830
|
+
},
|
|
831
|
+
refreshIntervalMs: 0,
|
|
832
|
+
maxTrackedTags: 1,
|
|
833
|
+
clock: () => clock,
|
|
834
|
+
});
|
|
835
|
+
let oldest = 2;
|
|
836
|
+
markers.judgeEntriesOf(() => oldest);
|
|
837
|
+
const start = markers.completeSince;
|
|
838
|
+
// "old" can expire nothing held, so it takes no room, and "new" is
|
|
839
|
+
// kept without dropping anything for space.
|
|
840
|
+
await markers.refresh();
|
|
841
|
+
expect(markers.state(["new"], later - 1)).toBe("expired");
|
|
842
|
+
expect(markers.completeSince).toBe(start);
|
|
843
|
+
// Once every entry held is newer than it, "new" goes too, taking
|
|
844
|
+
// `completeSince` no further than the oldest entry held.
|
|
845
|
+
oldest = later;
|
|
846
|
+
clock += 1000;
|
|
847
|
+
await markers.refresh();
|
|
848
|
+
expect(markers.state(["new"], later - 1)).toBe("fresh");
|
|
849
|
+
expect(markers.completeSince).toBe(later);
|
|
850
|
+
});
|
|
851
|
+
it("scans the entry stores once a minute, pruning only when the oldest moves", async () => {
|
|
852
|
+
let clock = 1_000_000;
|
|
853
|
+
const later = (0, aws_cache_store_1.markerClock)() + 60_000;
|
|
854
|
+
const rows = [
|
|
855
|
+
{
|
|
856
|
+
sk: `${String(clock).padStart(15, "0")}#new`,
|
|
857
|
+
at: clock,
|
|
858
|
+
tag: "new",
|
|
859
|
+
marker: { revalidatedAt: later },
|
|
860
|
+
},
|
|
861
|
+
];
|
|
862
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
863
|
+
markers: { read: jest.fn() },
|
|
864
|
+
// The row leaves the lookback after the first query: only the prune
|
|
865
|
+
// can let it go.
|
|
866
|
+
log: {
|
|
867
|
+
query: jest
|
|
868
|
+
.fn()
|
|
869
|
+
.mockResolvedValueOnce({ rows, truncated: false })
|
|
870
|
+
.mockResolvedValue({ rows: [], truncated: false }),
|
|
871
|
+
},
|
|
872
|
+
refreshIntervalMs: 0,
|
|
873
|
+
clock: () => clock,
|
|
874
|
+
});
|
|
875
|
+
let bound = 2;
|
|
876
|
+
let exact = 2;
|
|
877
|
+
const oldest = jest.fn((scan) => (scan ? exact : bound));
|
|
878
|
+
markers.judgeEntriesOf(oldest);
|
|
879
|
+
const prune = jest.spyOn(markers, "pruneLogged");
|
|
880
|
+
await markers.refresh();
|
|
881
|
+
expect(oldest).toHaveBeenLastCalledWith(true);
|
|
882
|
+
expect(prune).toHaveBeenCalledTimes(1);
|
|
883
|
+
// Within the minute: the bound, and no prune while it stays put.
|
|
884
|
+
clock += 1000;
|
|
885
|
+
exact = later;
|
|
886
|
+
await markers.refresh();
|
|
887
|
+
expect(oldest).toHaveBeenLastCalledWith(false);
|
|
888
|
+
expect(prune).toHaveBeenCalledTimes(1);
|
|
889
|
+
expect(markers.state(["new"], later - 1)).toBe("expired");
|
|
890
|
+
// The minute's scan finds every entry newer than the row: it goes.
|
|
891
|
+
clock += 60_000;
|
|
892
|
+
await markers.refresh();
|
|
893
|
+
expect(oldest).toHaveBeenLastCalledWith(true);
|
|
894
|
+
expect(prune).toHaveBeenCalledTimes(2);
|
|
895
|
+
expect(markers.state(["new"], later - 1)).toBe("fresh");
|
|
896
|
+
expect(markers.completeSince).toBe(later);
|
|
897
|
+
// An entry set since moves the bound back: nothing to prune.
|
|
898
|
+
clock += 1000;
|
|
899
|
+
bound = 1;
|
|
900
|
+
await markers.refresh();
|
|
901
|
+
expect(prune).toHaveBeenCalledTimes(2);
|
|
902
|
+
});
|
|
903
|
+
it("waits for a fresh query rather than one started before a freeze", async () => {
|
|
904
|
+
let clock = 1_000_000;
|
|
905
|
+
const queries = [];
|
|
906
|
+
const query = jest.fn(() => new Promise((resolve) => queries.push(() => resolve({ rows: [], truncated: false }))));
|
|
907
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
908
|
+
markers: { read: jest.fn() },
|
|
909
|
+
log: { query },
|
|
910
|
+
refreshIntervalMs: 1000,
|
|
911
|
+
clock: () => clock,
|
|
912
|
+
canFreeze: true,
|
|
913
|
+
});
|
|
914
|
+
markers.judgeEntriesOf(() => 0);
|
|
915
|
+
clock += 1000;
|
|
916
|
+
// Started, not waited for, and then the sandbox froze.
|
|
917
|
+
void markers.refresh();
|
|
918
|
+
clock += 60_000;
|
|
919
|
+
expect(markers.behind).toBe(true);
|
|
920
|
+
let caughtUp = false;
|
|
921
|
+
const catchUp = markers
|
|
922
|
+
.catchUp(async () => { })
|
|
923
|
+
.then(() => (caughtUp = true));
|
|
924
|
+
queries.shift()();
|
|
925
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
926
|
+
expect(caughtUp).toBe(false);
|
|
927
|
+
expect(query).toHaveBeenCalledTimes(2);
|
|
928
|
+
queries.shift()();
|
|
929
|
+
await catchUp;
|
|
930
|
+
expect(markers.behind).toBe(false);
|
|
931
|
+
});
|
|
932
|
+
describe("with a refresh in flight", () => {
|
|
933
|
+
let clock;
|
|
934
|
+
beforeEach(() => {
|
|
935
|
+
clock = 1_000_000;
|
|
936
|
+
jest.useFakeTimers({ doNotFake: ["setImmediate", "nextTick"] });
|
|
937
|
+
});
|
|
938
|
+
afterEach(() => jest.useRealTimers());
|
|
939
|
+
/** Move the clock and the timers on together: no freeze. */
|
|
940
|
+
const run = (ms) => {
|
|
941
|
+
for (let step = 0; step < ms; step += 250) {
|
|
942
|
+
clock += 250;
|
|
943
|
+
jest.advanceTimersByTime(250);
|
|
944
|
+
}
|
|
945
|
+
};
|
|
946
|
+
const instance = (fails = false, canFreeze = true) => {
|
|
947
|
+
const queries = [];
|
|
948
|
+
const query = jest.fn(() => new Promise((resolve, reject) => queries.push(() => fails
|
|
949
|
+
? reject(new Error("throttled"))
|
|
950
|
+
: resolve({ rows: [], truncated: false }))));
|
|
951
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
952
|
+
markers: { read: jest.fn() },
|
|
953
|
+
log: { query },
|
|
954
|
+
refreshIntervalMs: 1000,
|
|
955
|
+
clock: () => clock,
|
|
956
|
+
canFreeze,
|
|
957
|
+
});
|
|
958
|
+
markers.judgeEntriesOf(() => 0);
|
|
959
|
+
return { markers, query, queries };
|
|
960
|
+
};
|
|
961
|
+
it("waits for a fresh query after a freeze, even once the late tick has run", async () => {
|
|
962
|
+
const { markers, query, queries } = instance();
|
|
963
|
+
clock += 1000;
|
|
964
|
+
void markers.refresh();
|
|
965
|
+
clock += 60_000;
|
|
966
|
+
// After the thaw the overdue tick can run before any request does.
|
|
967
|
+
jest.advanceTimersByTime(250);
|
|
968
|
+
let caughtUp = false;
|
|
969
|
+
const catchUp = markers
|
|
970
|
+
.catchUp(async () => { })
|
|
971
|
+
.then(() => (caughtUp = true));
|
|
972
|
+
queries.shift()();
|
|
973
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
974
|
+
// What the first query knew predates the freeze.
|
|
975
|
+
expect(markers.behind).toBe(true);
|
|
976
|
+
expect(caughtUp).toBe(false);
|
|
977
|
+
expect(query).toHaveBeenCalledTimes(2);
|
|
978
|
+
queries.shift()();
|
|
979
|
+
await catchUp;
|
|
980
|
+
expect(markers.behind).toBe(false);
|
|
981
|
+
});
|
|
982
|
+
it("in a container, which is never frozen, waits only for the query in flight", async () => {
|
|
983
|
+
const { markers, query, queries } = instance(false, false);
|
|
984
|
+
clock += 1000;
|
|
985
|
+
void markers.refresh();
|
|
986
|
+
// A long stall, not a freeze: no timer to tell them apart, none needed.
|
|
987
|
+
clock += 60_000;
|
|
988
|
+
const catchUp = markers.catchUp(async () => { });
|
|
989
|
+
queries.shift()();
|
|
990
|
+
await catchUp;
|
|
991
|
+
expect(query).toHaveBeenCalledTimes(1);
|
|
992
|
+
expect(markers.behind).toBe(false);
|
|
993
|
+
});
|
|
994
|
+
it("is caught up once the catch-up's slow query returns, the process running throughout", async () => {
|
|
995
|
+
for (const fails of [false, true]) {
|
|
996
|
+
const { markers, queries } = instance(fails);
|
|
997
|
+
clock += 60_000;
|
|
998
|
+
expect(markers.behind).toBe(true);
|
|
999
|
+
const catchUp = markers.catchUp(async () => { });
|
|
1000
|
+
run(3000);
|
|
1001
|
+
queries.shift()();
|
|
1002
|
+
await catchUp;
|
|
1003
|
+
// Or the first `'use cache'` lookup would wait for another query,
|
|
1004
|
+
// inside the render: one request, two waits.
|
|
1005
|
+
expect(markers.behind).toBe(false);
|
|
1006
|
+
}
|
|
1007
|
+
});
|
|
1008
|
+
it("waits only for a slow query in flight, the process running throughout", async () => {
|
|
1009
|
+
const { markers, query, queries } = instance();
|
|
1010
|
+
clock += 60_000;
|
|
1011
|
+
const first = markers.catchUp(async () => { });
|
|
1012
|
+
run(2500);
|
|
1013
|
+
// Past the grace into the query, but the query is as fresh as any.
|
|
1014
|
+
let caughtUp = false;
|
|
1015
|
+
const second = markers
|
|
1016
|
+
.catchUp(async () => { })
|
|
1017
|
+
.then(() => (caughtUp = true));
|
|
1018
|
+
queries.shift()();
|
|
1019
|
+
await first;
|
|
1020
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
1021
|
+
expect(caughtUp).toBe(true);
|
|
1022
|
+
await second;
|
|
1023
|
+
expect(query).toHaveBeenCalledTimes(1);
|
|
1024
|
+
});
|
|
1025
|
+
});
|
|
320
1026
|
it("does not skip a row for an untracked tag that its first read missed", async () => {
|
|
321
1027
|
// The writer puts the log row and the marker at the same time, and the
|
|
322
1028
|
// marker read is eventually consistent: `refresh` can see the row, then
|
|
@@ -344,12 +1050,13 @@ describe("TrackedTagMarkers", () => {
|
|
|
344
1050
|
clock: () => clock,
|
|
345
1051
|
random: () => 0,
|
|
346
1052
|
});
|
|
347
|
-
|
|
1053
|
+
markers.judgeEntriesOf(() => 0);
|
|
348
1054
|
await markers.ensure(["other"]);
|
|
349
1055
|
clock += 1000;
|
|
350
1056
|
await markers.refresh();
|
|
1057
|
+
// The row seen before the read is applied to what the read found.
|
|
351
1058
|
await markers.ensure(["posts"]);
|
|
352
|
-
expect(markers.get("posts")).toEqual({});
|
|
1059
|
+
expect(markers.get("posts")).toEqual({ revalidatedAt });
|
|
353
1060
|
clock += 1000;
|
|
354
1061
|
await markers.refresh();
|
|
355
1062
|
expect(query).toHaveBeenCalledTimes(2);
|
|
@@ -358,4 +1065,4 @@ describe("TrackedTagMarkers", () => {
|
|
|
358
1065
|
expect(read).toHaveBeenCalledTimes(2);
|
|
359
1066
|
});
|
|
360
1067
|
});
|
|
361
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9hd3MtY2FjaGUtc3RvcmUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRXRDLDhEQU1rQztBQUNsQyxrREFLNEI7QUFDNUIsdURBZ0IyQjtBQUUzQixnRUFBZ0U7QUFDaEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFnQixFQUFFLElBQWEsRUFBRSxFQUFFO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQWlCLENBQUM7SUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUM7QUFFRixRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE9BQU8sQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNaLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixHQUFHLFFBQVEsQ0FBQztRQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxHQUFHLE9BQU8sQ0FBQztR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QUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDZCxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELGdEQUFnRDtRQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuamVzdC5tb2NrKFwiQGF3cy1zZGsvY2xpZW50LXMzXCIpO1xuamVzdC5tb2NrKFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCIpO1xuXG5pbXBvcnQge1xuICBCYXRjaEdldEl0ZW1Db21tYW5kLFxuICBEeW5hbW9EQkNsaWVudCxcbiAgUHV0SXRlbUNvbW1hbmQsXG4gIFF1ZXJ5Q29tbWFuZCxcbiAgVXBkYXRlSXRlbUNvbW1hbmQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIjtcbmltcG9ydCB7XG4gIEdldE9iamVjdENvbW1hbmQsXG4gIE5vU3VjaEtleSxcbiAgUHV0T2JqZWN0Q29tbWFuZCxcbiAgUzNDbGllbnQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB7XG4gIGJ1aWxkUzNLZXksXG4gIENhY2hlQnVja2V0LFxuICBtYXJrZXJGb3IsXG4gIG1hcmtlclN0YXRlLFxuICBtYXJrZXJVcGRhdGUsXG4gIG1lcmdlTWFya2VycyxcbiAgcmVzb2x2ZUF3c0NhY2hlQ29uZmlnLFxuICBSRVZBTElEQVRJT05fTE9HX01BWF9QQUdFUyxcbiAgUkVWQUxJREFUSU9OX0xPR19UVExfTVMsXG4gIFJldmFsaWRhdGlvbkxvZyxcbiAgUmV2YWxpZGF0aW9uTG9nUm93LFxuICBUYWdNYXJrZXIsXG4gIFRhZ01hcmtlclRhYmxlLFxuICBUcmFja2VkVGFnTWFya2VycyxcbiAgdXNlQ2FjaGVTM0tleSxcbn0gZnJvbSBcIi4vYXdzLWNhY2hlLXN0b3JlXCI7XG5cbi8qKiBUaGUgaW5wdXQgYW4gYXV0b21vY2tlZCBTREsgY29tbWFuZCB3YXMgY29uc3RydWN0ZWQgd2l0aC4gKi9cbmNvbnN0IGNvbW1hbmRJbnB1dCA9IChjb21tYW5kOiB1bmtub3duLCB0eXBlOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IG1vY2sgPSB0eXBlIGFzIGplc3QuTW9jaztcbiAgcmV0dXJuIG1vY2subW9jay5jYWxsc1ttb2NrLm1vY2suaW5zdGFuY2VzLmluZGV4T2YoY29tbWFuZCldWzBdO1xufTtcblxuZGVzY3JpYmUoXCJyZXNvbHZlQXdzQ2FjaGVDb25maWdcIiwgKCkgPT4ge1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgcHJvY2Vzcy5lbnYgPSB7IC4uLmVudiB9O1xuICB9KTtcbiAgYWZ0ZXJBbGwoKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52ID0gZW52O1xuICB9KTtcblxuICBpdChcInJlYWRzIHRoZSBlbnZpcm9ubWVudCB0aGUgY29uc3RydWN0cyBzZXRcIiwgKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUUgPSBcImJ1Y2tldFwiO1xuICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfUkVWQUxJREFUSU9OX1RBQkxFX05BTUUgPSBcInRhYmxlXCI7XG4gICAgcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19CVUlMRF9JRCA9IFwiYnVpbGRcIjtcbiAgICBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID0gXCJldS13ZXN0LTFcIjtcbiAgICBleHBlY3QocmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCkpLnRvRXF1YWwoe1xuICAgICAgYnVja2V0TmFtZTogXCJidWNrZXRcIixcbiAgICAgIHRhYmxlTmFtZTogXCJ0YWJsZVwiLFxuICAgICAgYnVpbGRJZDogXCJidWlsZFwiLFxuICAgICAgcmVnaW9uOiBcImV1LXdlc3QtMVwiLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcInJlcG9ydHMgd2hhdCBpcyB1bnNldCBhcyBlbXB0eVwiLCAoKSA9PiB7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUU7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfUkVWQUxJREFUSU9OX1RBQkxFX05BTUU7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQ7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkFXU19SRUdJT047XG4gICAgZXhwZWN0KHJlc29sdmVBd3NDYWNoZUNvbmZpZygpKS50b0VxdWFsKHtcbiAgICAgIGJ1Y2tldE5hbWU6IFwiXCIsXG4gICAgICB0YWJsZU5hbWU6IFwiXCIsXG4gICAgICBidWlsZElkOiBcIlwiLFxuICAgICAgcmVnaW9uOiBcInVzLWVhc3QtMVwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlMzIGtleXNcIiwgKCkgPT4ge1xuICBpdChcImtlZXBzIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSdzIHtidWlsZElkfS97a2V5fS5qc29uIGNvbnZlbnRpb25cIiwgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcIi9cIikpLnRvQmUoXCJiL2luZGV4Lmpzb25cIik7XG4gICAgZXhwZWN0KGJ1aWxkUzNLZXkoXCJiXCIsIFwiXCIpKS50b0JlKFwiYi9pbmRleC5qc29uXCIpO1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcIi9ibG9nL3Bvc3RcIikpLnRvQmUoXCJiL2Jsb2cvcG9zdC5qc29uXCIpO1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcImFiYzEyM1wiKSkudG9CZShcImIvYWJjMTIzLmpzb25cIik7XG4gIH0pO1xuXG4gIGl0KFwicHV0cyAndXNlIGNhY2hlJyBlbnRyaWVzIHdoZXJlIG5vIGluY3JlbWVudGFsIGtleSBjYW4gbGFuZFwiLCAoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gdXNlQ2FjaGVTM0tleShcImJcIiwgXCJmXCIucmVwZWF0KDY0KSk7XG4gICAgZXhwZWN0KGtleSkudG9CZShgYi9fdXNlLWNhY2hlLyR7XCJmXCIucmVwZWF0KDY0KX0uZW50cnlgKTtcbiAgICAvLyBFdmVuIGEgcm91dGUgc3BlbGxlZCBsaWtlIHRoZSB1c2UtY2FjaGUga2V5IGdldHMgYC5qc29uYCBhcHBlbmRlZC5cbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgYC9fdXNlLWNhY2hlLyR7XCJmXCIucmVwZWF0KDY0KX0uZW50cnlgKSkubm90LnRvQmUoXG4gICAgICBrZXksXG4gICAgKTtcbiAgICBleHBlY3Qoa2V5LmVuZHNXaXRoKFwiLmpzb25cIikpLnRvQmUoZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInRhZyBtYXJrZXJzXCIsICgpID0+IHtcbiAgaXQoXCJ3cml0ZXMgd2hhdCBtYXJrZXJGb3IgYXBwbGllcyBsb2NhbGx5XCIsICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9ucyBvZiBbdW5kZWZpbmVkLCB7fSwgeyBleHBpcmU6IDYwIH1dKSB7XG4gICAgICBjb25zdCB1cGRhdGUgPSBtYXJrZXJVcGRhdGUoMTAwMCwgZHVyYXRpb25zKTtcbiAgICAgIGNvbnN0IGxvY2FsID0gbWFya2VyRm9yKDEwMDAsIGR1cmF0aW9ucyk7XG4gICAgICBjb25zdCB3cml0dGVuOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIHVwZGF0ZS5FeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzISxcbiAgICAgICkpIHtcbiAgICAgICAgd3JpdHRlbltuYW1lLnNsaWNlKDEpXSA9IE51bWJlcih2YWx1ZS5OKTtcbiAgICAgIH1cbiAgICAgIGV4cGVjdCh3cml0dGVuKS50b0VxdWFsKGxvY2FsKTtcbiAgICB9XG4gICAgZXhwZWN0KG1hcmtlckZvcigxMDAwLCB7IGV4cGlyZTogNjAgfSkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMTAwMCxcbiAgICAgIGV4cGlyZWRBdDogNjEwMDAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgYW4gZWFybGllciBleHBpcmVkQXQgYSBwcm9maWxlIHdpdGggbm8gZXhwaXJlIGxlYXZlc1wiLCAoKSA9PiB7XG4gICAgLy8gVGhlIHJvdyBrZWVwcyBpdCAoYFNFVCBzdGFsZUF0YCBvbmx5KSwgc28gYW4gaW5zdGFuY2UgbGVhcm5pbmcgb2YgdGhlXG4gICAgLy8gc2Vjb25kIHJldmFsaWRhdGlvbiBmcm9tIHRoZSBsb2cgaGFzIHRvIGtlZXAgaXQgdG9vLlxuICAgIGNvbnN0IGZpcnN0ID0gbWFya2VyRm9yKDEwMDAsIHsgZXhwaXJlOiA2MCB9KTtcbiAgICBjb25zdCBzZWNvbmQgPSBtYXJrZXJGb3IoMjAwMCwge30pO1xuICAgIGV4cGVjdChtZXJnZU1hcmtlcnMoZmlyc3QsIHNlY29uZCkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMjAwMCxcbiAgICAgIGV4cGlyZWRBdDogNjEwMDAsXG4gICAgfSk7XG4gICAgZXhwZWN0KG1lcmdlTWFya2VycyhzZWNvbmQsIGZpcnN0KSkudG9FcXVhbCh7XG4gICAgICBzdGFsZUF0OiAyMDAwLFxuICAgICAgZXhwaXJlZEF0OiA2MTAwMCxcbiAgICB9KTtcbiAgICAvLyBBIG5ld2VyIGBleHBpcmVgIHN0aWxsIHJlcGxhY2VzIGl0LlxuICAgIGV4cGVjdChtZXJnZU1hcmtlcnMoZmlyc3QsIG1hcmtlckZvcigyMDAwLCB7IGV4cGlyZTogMSB9KSkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMjAwMCxcbiAgICAgIGV4cGlyZWRBdDogMzAwMCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJqdWRnZXMgYW4gZW50cnkgdGhlIHdheSB0aGUgaW5jcmVtZW50YWwgY2FjaGUgYWx3YXlzIGhhc1wiLCAoKSA9PiB7XG4gICAgLy8gRXhwaXJlZCBvdXRyaWdodCBhZnRlciBjcmVhdGlvbi5cbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyByZXZhbGlkYXRlZEF0OiAyMCB9LCAxMCwgMzApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICAvLyBSZXZhbGlkYXRlZCBiZWZvcmUgdGhlIGVudHJ5IHdhcyBjcmVhdGVkOiBubyBlZmZlY3QuXG4gICAgZXhwZWN0KG1hcmtlclN0YXRlKHsgcmV2YWxpZGF0ZWRBdDogNSB9LCAxMCwgMzApKS50b0JlKFwiZnJlc2hcIik7XG4gICAgLy8gQSBwcm9maWxlOiBzdGFsZSBub3csIGV4cGlyZWQgb25jZSBgZXhwaXJlZEF0YCBwYXNzZXMuXG4gICAgZXhwZWN0KG1hcmtlclN0YXRlKHsgc3RhbGVBdDogMjAsIGV4cGlyZWRBdDogNTAgfSwgMTAsIDMwKSkudG9CZShcInN0YWxlXCIpO1xuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHN0YWxlQXQ6IDIwLCBleHBpcmVkQXQ6IDUwIH0sIDEwLCA2MCkpLnRvQmUoXCJleHBpcmVkXCIpO1xuICAgIC8vIGBleHBpcmU6IDBgOiBzdGFsZSBhbmQgZXhwaXJlZCBhdCBvbmNlLlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHN0YWxlQXQ6IDIwLCBleHBpcmVkQXQ6IDIwIH0sIDEwLCAzMCkpLnRvQmUoXCJleHBpcmVkXCIpO1xuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7fSwgMTAsIDMwKSkudG9CZShcImZyZXNoXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlRhZ01hcmtlclRhYmxlXCIsICgpID0+IHtcbiAgY29uc3Qgc2VuZCA9IGplc3QuZm4oKTtcbiAgbGV0IHRhYmxlOiBUYWdNYXJrZXJUYWJsZTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIChEeW5hbW9EQkNsaWVudCBhcyBqZXN0Lk1vY2spLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiAoeyBzZW5kIH0pKTtcbiAgICB0YWJsZSA9IG5ldyBUYWdNYXJrZXJUYWJsZShuZXcgRHluYW1vREJDbGllbnQoe30pLCBcInRibFwiLCBcImJ1aWxkXCIpO1xuICB9KTtcblxuICBpdChcIndyaXRlcyB0aGUgbWFya2VyIHJvdyB1bmRlciB0aGUgYnVpbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgMTAwMCwgeyBleHBpcmU6IDEgfSk7XG4gICAgY29uc3QgaW5wdXQgPSBjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBVcGRhdGVJdGVtQ29tbWFuZCk7XG4gICAgZXhwZWN0KGlucHV0KS50b0VxdWFsKHtcbiAgICAgIFRhYmxlTmFtZTogXCJ0YmxcIixcbiAgICAgIEtleTogeyBwazogeyBTOiBcImJ1aWxkXCIgfSwgc2s6IHsgUzogXCJwb3N0c1wiIH0gfSxcbiAgICAgIFVwZGF0ZUV4cHJlc3Npb246IFwiU0VUIHN0YWxlQXQgPSA6c3RhbGVBdCwgZXhwaXJlZEF0ID0gOmV4cGlyZWRBdFwiLFxuICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICBcIjpzdGFsZUF0XCI6IHsgTjogXCIxMDAwXCIgfSxcbiAgICAgICAgXCI6ZXhwaXJlZEF0XCI6IHsgTjogXCIyMDAwXCIgfSxcbiAgICAgIH0sXG4gICAgICBSZXR1cm5WYWx1ZXM6IFwiQUxMX05FV1wiLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcInJlYWRzIG1hcmtlcnMgaW4gYmF0Y2hlcyBvZiAxMDAgYW5kIHBhcnNlcyB0aGVtXCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoY29tbWFuZDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgeyBSZXF1ZXN0SXRlbXMgfSA9IGNvbW1hbmRJbnB1dChjb21tYW5kLCBCYXRjaEdldEl0ZW1Db21tYW5kKTtcbiAgICAgIGNvbnN0IGtleXMgPSBSZXF1ZXN0SXRlbXMudGJsLktleXMgYXMgeyBzazogeyBTOiBzdHJpbmcgfSB9W107XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgUmVzcG9uc2VzOiB7XG4gICAgICAgICAgdGJsOiBrZXlzXG4gICAgICAgICAgICAuZmlsdGVyKCh7IHNrIH0pID0+IHNrLlMuZW5kc1dpdGgoXCIwXCIpKVxuICAgICAgICAgICAgLm1hcCgoeyBzayB9KSA9PiAoeyBzaywgcmV2YWxpZGF0ZWRBdDogeyBOOiBcIjdcIiB9IH0pKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxNTAgfSwgKF8sIGkpID0+IGB0JHtpfWApO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBhd2FpdCB0YWJsZS5yZWFkKFsuLi50YWdzLCBcInQwXCJdKTtcbiAgICBleHBlY3Qoc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtYXJrZXJzLnNpemUpLnRvQmUoMTUpO1xuICAgIGV4cGVjdChtYXJrZXJzLmdldChcInQxMFwiKSkudG9FcXVhbCh7XG4gICAgICByZXZhbGlkYXRlZEF0OiA3LFxuICAgICAgc3RhbGVBdDogdW5kZWZpbmVkLFxuICAgICAgZXhwaXJlZEF0OiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEEgcmVhZC1iYWNrIGFmdGVyIHRoZSB3cml0ZSBpcyBldmVudHVhbGx5IGNvbnNpc3RlbnQsIHNvIGl0IGNhbiByZXR1cm5cbiAgLy8gdGhlIG1hcmtlciBmcm9tIGJlZm9yZSBpdDogdGhlIHdyaXRlciB0cmFja3Mgd2hhdCB0aGUgd3JpdGUgcmV0dXJuZWQuXG4gIGl0KFwicmV0dXJucyB0aGUgcm93IGFzIHRoZSB3cml0ZSBsZWZ0IGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7XG4gICAgICBBdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNrOiB7IFM6IFwicG9zdHNcIiB9LFxuICAgICAgICByZXZhbGlkYXRlZEF0OiB7IE46IFwiNTAwMFwiIH0sXG4gICAgICAgIHN0YWxlQXQ6IHsgTjogXCIxMFwiIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChhd2FpdCB0YWJsZS53cml0ZShcInBvc3RzXCIsIDUwMDAsIHVuZGVmaW5lZCkpLnRvRXF1YWwoe1xuICAgICAgcmV2YWxpZGF0ZWRBdDogNTAwMCxcbiAgICAgIHN0YWxlQXQ6IDEwLFxuICAgICAgZXhwaXJlZEF0OiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2Uoe30pO1xuICAgIGV4cGVjdChhd2FpdCB0YWJsZS53cml0ZShcInBvc3RzXCIsIDYwMDAsIHVuZGVmaW5lZCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoXCJhc2tzIGFnYWluIGZvciB1bnByb2Nlc3NlZCBrZXlzLCBhbmQgZ2l2ZXMgdXAgYWZ0ZXIgdGhyZWUgdHJpZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVucHJvY2Vzc2VkID0ge1xuICAgICAgVW5wcm9jZXNzZWRLZXlzOiB7XG4gICAgICAgIHRibDogeyBLZXlzOiBbeyBwazogeyBTOiBcImJ1aWxkXCIgfSwgc2s6IHsgUzogXCJhXCIgfSB9XSB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHVucHJvY2Vzc2VkKS5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2Uoe1xuICAgICAgUmVzcG9uc2VzOiB7IHRibDogW3sgc2s6IHsgUzogXCJhXCIgfSwgc3RhbGVBdDogeyBOOiBcIjNcIiB9IH1dIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KChhd2FpdCB0YWJsZS5yZWFkKFtcImFcIl0pKS5nZXQoXCJhXCIpPy5zdGFsZUF0KS50b0JlKDMpO1xuXG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh1bnByb2Nlc3NlZCk7XG4gICAgYXdhaXQgZXhwZWN0KHRhYmxlLnJlYWQoW1wiYVwiXSkpLnJlamVjdHMudG9UaHJvdygvdW5yZWFkIGFmdGVyIHJldHJ5aW5nLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiUmV2YWxpZGF0aW9uTG9nXCIsICgpID0+IHtcbiAgY29uc3Qgc2VuZCA9IGplc3QuZm4oKTtcbiAgbGV0IGxvZzogUmV2YWxpZGF0aW9uTG9nO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc2V0KCk7XG4gICAgKER5bmFtb0RCQ2xpZW50IGFzIGplc3QuTW9jaykubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+ICh7IHNlbmQgfSkpO1xuICAgIGxvZyA9IG5ldyBSZXZhbGlkYXRpb25Mb2cobmV3IER5bmFtb0RCQ2xpZW50KHt9KSwgXCJ0YmxcIiwgXCJidWlsZFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJwdXRzIG9uZSByb3cgcGVyIHJldmFsaWRhdGlvbiB1bmRlciB0aGUgYnVpbGQncyBsb2csIHdpdGggYSBUVExcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGNvbnN0IGF0ID0gMV83MjdfMDAwXzAwMF8xMjM7XG4gICAgYXdhaXQgbG9nLnB1dChcInVzZXIjNDJcIiwgYXQsIHsgc3RhbGVBdDogNSwgZXhwaXJlZEF0OiA2IH0pO1xuICAgIGV4cGVjdChjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBQdXRJdGVtQ29tbWFuZCkpLnRvRXF1YWwoe1xuICAgICAgVGFibGVOYW1lOiBcInRibFwiLFxuICAgICAgSXRlbToge1xuICAgICAgICBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sXG4gICAgICAgIHNrOiB7IFM6IFwiMDAxNzI3MDAwMDAwMTIzI3VzZXIjNDJcIiB9LFxuICAgICAgICB0dGw6IHsgTjogU3RyaW5nKE1hdGguY2VpbCgoYXQgKyBSRVZBTElEQVRJT05fTE9HX1RUTF9NUykgLyAxMDAwKSkgfSxcbiAgICAgICAgc3RhbGVBdDogeyBOOiBcIjVcIiB9LFxuICAgICAgICBleHBpcmVkQXQ6IHsgTjogXCI2XCIgfSxcbiAgICAgIH0sXG4gICAgICBDb25kaXRpb25FeHByZXNzaW9uOiBcImF0dHJpYnV0ZV9ub3RfZXhpc3RzKHNrKVwiLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcIm1vdmVzIGEgcm93IHRvIHRoZSBuZXh0IG1pbGxpc2Vjb25kIHJhdGhlciB0aGFuIG92ZXJ3cml0ZSBhbm90aGVyIHJldmFsaWRhdGlvblwiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gYHVwZGF0ZVRhZygneCcpYCBhbmQgYHJldmFsaWRhdGVUYWcoJ3gnLCAnbWF4JylgIGluIG9uZSBtaWxsaXNlY29uZC5cbiAgICBjb25zdCB0YWtlbiA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwidGFrZW5cIiksIHtcbiAgICAgIG5hbWU6IFwiQ29uZGl0aW9uYWxDaGVja0ZhaWxlZEV4Y2VwdGlvblwiLFxuICAgIH0pO1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKHRha2VuKS5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2Uoe30pO1xuICAgIGF3YWl0IGxvZy5wdXQoXCJ4XCIsIDEwMDAuNSwgeyByZXZhbGlkYXRlZEF0OiA1IH0pO1xuICAgIGV4cGVjdChcbiAgICAgIHNlbmQubW9jay5jYWxscy5tYXAoXG4gICAgICAgIChbY29tbWFuZF0pID0+IGNvbW1hbmRJbnB1dChjb21tYW5kLCBQdXRJdGVtQ29tbWFuZCkuSXRlbS5zay5TLFxuICAgICAgKSxcbiAgICApLnRvRXF1YWwoW1wiMDAwMDAwMDAwMDAxMDAwI3hcIiwgXCIwMDAwMDAwMDAwMDEwMDEjeFwiXSk7XG4gIH0pO1xuXG4gIGl0KFwiZ2l2ZXMgdXAgYWZ0ZXIgYSBib3VuZGVkIG51bWJlciBvZiBjb2xsaXNpb25zLCBhbmQgb24gb3RoZXIgZXJyb3JzIGF0IG9uY2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRha2VuID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJ0YWtlblwiKSwge1xuICAgICAgbmFtZTogXCJDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uXCIsXG4gICAgfSk7XG4gICAgc2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZSh0YWtlbik7XG4gICAgYXdhaXQgZXhwZWN0KGxvZy5wdXQoXCJ4XCIsIDEwMDAsIHt9KSkucmVqZWN0cy50b0JlKHRha2VuKTtcbiAgICBleHBlY3Qoc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDUpO1xuXG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICBjb25zdCB0aHJvdHRsZWQgPSBuZXcgRXJyb3IoXCJ0aHJvdHRsZWRcIik7XG4gICAgc2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZSh0aHJvdHRsZWQpO1xuICAgIGF3YWl0IGV4cGVjdChsb2cucHV0KFwieFwiLCAxMDAwLCB7fSkpLnJlamVjdHMudG9CZSh0aHJvdHRsZWQpO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gIH0pO1xuXG4gIGl0KFwicXVlcmllcyBmcm9tIGEgemVyby1wYWRkZWQgY3Vyc29yIGFuZCBwYXJzZXMgdGhlIHRhZyBhZnRlciBpdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZFxuICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7XG4gICAgICAgIEl0ZW1zOiBbXG4gICAgICAgICAgeyBzazogeyBTOiBcIjAwMDAwMDAwMDAwMTAwMCNhXCIgfSwgcmV2YWxpZGF0ZWRBdDogeyBOOiBcIjdcIiB9IH0sXG4gICAgICAgICAgeyBzazogeyBTOiBcIm5vdCBhIGxvZyByb3dcIiB9IH0sXG4gICAgICAgIF0sXG4gICAgICAgIExhc3RFdmFsdWF0ZWRLZXk6IHsgcGs6IHsgUzogXCJidWlsZCNsb2dcIiB9LCBzazogeyBTOiBcInhcIiB9IH0sXG4gICAgICB9KVxuICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7XG4gICAgICAgIEl0ZW1zOiBbeyBzazogeyBTOiBcIjAwMDAwMDAwMDAwMjAwMCN1c2VyIzQyXCIgfSwgc3RhbGVBdDogeyBOOiBcIjhcIiB9IH1dLFxuICAgICAgfSk7XG4gICAgY29uc3QgeyByb3dzLCB0cnVuY2F0ZWQgfSA9IGF3YWl0IGxvZy5xdWVyeSg5OTkuNSk7XG5cbiAgICBjb25zdCBmaXJzdCA9IGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFF1ZXJ5Q29tbWFuZCk7XG4gICAgZXhwZWN0KGZpcnN0KS50b01hdGNoT2JqZWN0KHtcbiAgICAgIFRhYmxlTmFtZTogXCJ0YmxcIixcbiAgICAgIEtleUNvbmRpdGlvbkV4cHJlc3Npb246IFwicGsgPSA6cGsgQU5EIHNrID49IDpzaW5jZVwiLFxuICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICBcIjpwa1wiOiB7IFM6IFwiYnVpbGQjbG9nXCIgfSxcbiAgICAgICAgXCI6c2luY2VcIjogeyBTOiBcIjAwMDAwMDAwMDAwMDk5OVwiIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgIGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMV1bMF0sIFF1ZXJ5Q29tbWFuZCkuRXhjbHVzaXZlU3RhcnRLZXksXG4gICAgKS50b0VxdWFsKHsgcGs6IHsgUzogXCJidWlsZCNsb2dcIiB9LCBzazogeyBTOiBcInhcIiB9IH0pO1xuICAgIGV4cGVjdCh0cnVuY2F0ZWQpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChyb3dzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgc2s6IFwiMDAwMDAwMDAwMDAxMDAwI2FcIixcbiAgICAgICAgYXQ6IDEwMDAsXG4gICAgICAgIHRhZzogXCJhXCIsXG4gICAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0OiA3LCBzdGFsZUF0OiB1bmRlZmluZWQsIGV4cGlyZWRBdDogdW5kZWZpbmVkIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzazogXCIwMDAwMDAwMDAwMDIwMDAjdXNlciM0MlwiLFxuICAgICAgICBhdDogMjAwMCxcbiAgICAgICAgdGFnOiBcInVzZXIjNDJcIixcbiAgICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQ6IHVuZGVmaW5lZCwgc3RhbGVBdDogOCwgZXhwaXJlZEF0OiB1bmRlZmluZWQgfSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KFwic3RvcHMgYWZ0ZXIgaXRzIHBhZ2UgYm91bmQgYW5kIHNheXMgc29cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgSXRlbXM6IFtdLFxuICAgICAgTGFzdEV2YWx1YXRlZEtleTogeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSxcbiAgICB9KTtcbiAgICBleHBlY3QoKGF3YWl0IGxvZy5xdWVyeSgwKSkudHJ1bmNhdGVkKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVMpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIkNhY2hlQnVja2V0XCIsICgpID0+IHtcbiAgY29uc3Qgc2VuZCA9IGplc3QuZm4oKTtcbiAgbGV0IGJ1Y2tldDogQ2FjaGVCdWNrZXQ7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoUzNDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgYnVja2V0ID0gbmV3IENhY2hlQnVja2V0KG5ldyBTM0NsaWVudCh7fSksIFwiYmt0XCIpO1xuICB9KTtcblxuICBpdChcInJlYWRzIGFuIG9iamVjdCBhcyB0ZXh0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IHsgdHJhbnNmb3JtVG9TdHJpbmc6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShcInt9XCIpIH0sXG4gICAgICBDb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgfSk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlKFwie31cIik7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIEdldE9iamVjdENvbW1hbmQpKS50b0VxdWFsKHtcbiAgICAgIEJ1Y2tldDogXCJia3RcIixcbiAgICAgIEtleTogXCJrXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyBhIG1pc3Npbmcgb2JqZWN0IG9yIGJvZHkgd2l0aCB1bmRlZmluZWQsIGFuZCB0aHJvd3MgdGhlIHJlc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKFxuICAgICAgbmV3IE5vU3VjaEtleSh7IG1lc3NhZ2U6IFwibWlzc2luZ1wiLCAkbWV0YWRhdGE6IHt9IH0pLFxuICAgICk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBCb2R5OiBudWxsIH0pO1xuICAgIGV4cGVjdChhd2FpdCBidWNrZXQuZ2V0KFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcIkFjY2Vzc0RlbmllZFwiKSk7XG4gICAgYXdhaXQgZXhwZWN0KGJ1Y2tldC5nZXQoXCJrXCIpKS5yZWplY3RzLnRvVGhyb3coXCJBY2Nlc3NEZW5pZWRcIik7XG4gIH0pO1xuXG4gIGl0KFwid3JpdGVzIEpTT05cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IGJ1Y2tldC5wdXRKc29uKFwia1wiLCBcInt9XCIpO1xuICAgIGV4cGVjdChjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBQdXRPYmplY3RDb21tYW5kKSkudG9FcXVhbCh7XG4gICAgICBCdWNrZXQ6IFwiYmt0XCIsXG4gICAgICBLZXk6IFwia1wiLFxuICAgICAgQm9keTogXCJ7fVwiLFxuICAgICAgQ29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlRyYWNrZWRUYWdNYXJrZXJzXCIsICgpID0+IHtcbiAgaXQoXCJkb2VzIG5vdCBza2lwIGEgcm93IGZvciBhbiB1bnRyYWNrZWQgdGFnIHRoYXQgaXRzIGZpcnN0IHJlYWQgbWlzc2VkXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgd3JpdGVyIHB1dHMgdGhlIGxvZyByb3cgYW5kIHRoZSBtYXJrZXIgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHRoZVxuICAgIC8vIG1hcmtlciByZWFkIGlzIGV2ZW50dWFsbHkgY29uc2lzdGVudDogYHJlZnJlc2hgIGNhbiBzZWUgdGhlIHJvdywgdGhlblxuICAgIC8vIGBlbnN1cmVgIHJlYWQgdGhlIG1hcmtlciBmcm9tIGJlZm9yZSBpdC4gTWFya2VkIGFwcGxpZWQgd2hpbGUgdGhlIHRhZ1xuICAgIC8vIHdhcyB1bnRyYWNrZWQsIHRoZSByb3cgd2FzIHNraXBwZWQgYnkgZXZlcnkgcXVlcnkgdGhlIGxvb2tiYWNrIHJldHVybmVkXG4gICAgLy8gaXQgdG8sIGFuZCB0aGUgaW5zdGFuY2Ugc2VydmVkIHRoZSBzdGFsZSBlbnRyeSB1bnRpbCB0aGUgcm9sbGluZyByZS1yZWFkLlxuICAgIGxldCBjbG9jayA9IDFfMDAwXzAwMDtcbiAgICBjb25zdCByZXZhbGlkYXRlZEF0ID0gOTk5XzAwMDtcbiAgICBjb25zdCByb3c6IFJldmFsaWRhdGlvbkxvZ1JvdyA9IHtcbiAgICAgIHNrOiBgJHtTdHJpbmcoY2xvY2spLnBhZFN0YXJ0KDE1LCBcIjBcIil9I3Bvc3RzYCxcbiAgICAgIGF0OiBjbG9jayxcbiAgICAgIHRhZzogXCJwb3N0c1wiLFxuICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQgfSxcbiAgICB9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gamVzdC5mbihhc3luYyAoc2luY2U6IG51bWJlcikgPT4gKHtcbiAgICAgIHJvd3M6IFtyb3ddLmZpbHRlcigocikgPT4gci5hdCA+PSBzaW5jZSksXG4gICAgICB0cnVuY2F0ZWQ6IGZhbHNlLFxuICAgIH0pKTtcbiAgICAvLyBBIHJlcGxpY2EgdGhhdCBoYXMgbm90IHNlZW4gdGhlIHdyaXRlIHlldC5cbiAgICBjb25zdCByZWFkID0gamVzdC5mbihhc3luYyAoKSA9PiBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPigpKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZCB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHsgcXVlcnkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgICAgcmFuZG9tOiAoKSA9PiAwLFxuICAgIH0pO1xuICAgIC8vIFNvbWV0aGluZyB0cmFja2VkLCBzbyB0aGUgcmVmcmVzaCBxdWVyaWVzIHRoZSBsb2cuXG4gICAgYXdhaXQgbWFya2Vycy5lbnN1cmUoW1wib3RoZXJcIl0pO1xuXG4gICAgY2xvY2sgKz0gMTAwMDtcbiAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbXCJwb3N0c1wiXSk7XG4gICAgZXhwZWN0KG1hcmtlcnMuZ2V0KFwicG9zdHNcIikpLnRvRXF1YWwoe30pO1xuXG4gICAgY2xvY2sgKz0gMTAwMDtcbiAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICBleHBlY3QocXVlcnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJwb3N0c1wiKSkudG9FcXVhbCh7IHJldmFsaWRhdGVkQXQgfSk7XG4gICAgLy8gT25seSB0aGUgb25lIHJlYWQgZWFjaCB0YWcncyBmaXJzdCB1c2UgY29zdHMuXG4gICAgZXhwZWN0KHJlYWQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
1068
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9hd3MtY2FjaGUtc3RvcmUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRXRDLDhEQU1rQztBQUNsQyxrREFLNEI7QUFDNUIsdURBb0IyQjtBQUUzQixnRUFBZ0U7QUFDaEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFnQixFQUFFLElBQWEsRUFBRSxFQUFFO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQWlCLENBQUM7SUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUM7QUFFRixRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE9BQU8sQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNaLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixHQUFHLFFBQVEsQ0FBQztRQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxHQUFHLE9BQU8sQ0FBQztR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b3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiKTtcblxuaW1wb3J0IHtcbiAgQmF0Y2hHZXRJdGVtQ29tbWFuZCxcbiAgRHluYW1vREJDbGllbnQsXG4gIFB1dEl0ZW1Db21tYW5kLFxuICBRdWVyeUNvbW1hbmQsXG4gIFVwZGF0ZUl0ZW1Db21tYW5kLFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCI7XG5pbXBvcnQge1xuICBHZXRPYmplY3RDb21tYW5kLFxuICBOb1N1Y2hLZXksXG4gIFB1dE9iamVjdENvbW1hbmQsXG4gIFMzQ2xpZW50LFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQge1xuICBidWlsZFMzS2V5LFxuICBDYWNoZUJ1Y2tldCxcbiAgaGFzaGVkVGFnLFxuICBtYXJrZXJDbG9jayxcbiAgbWFya2VyRm9yLFxuICBtYXJrZXJTdGF0ZSxcbiAgbWFya2VyVXBkYXRlLFxuICBtZXJnZU1hcmtlcnMsXG4gIHJlc29sdmVBd3NDYWNoZUNvbmZpZyxcbiAgTUFYX1JFVkFMSURBVElPTl9MT0dfR0FQX01TLFxuICBSRVZBTElEQVRJT05fTE9HX01BWF9QQUdFUyxcbiAgUkVWQUxJREFUSU9OX0xPR19UVExfTVMsXG4gIFRBR19SRUZSRVNIX0dSQUNFX01TLFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFJldmFsaWRhdGlvbkxvZ1JvdyxcbiAgVGFnTWFya2VyLFxuICBUYWdNYXJrZXJUYWJsZSxcbiAgVHJhY2tlZFRhZ01hcmtlcnMsXG4gIHVzZUNhY2hlUzNLZXksXG59IGZyb20gXCIuL2F3cy1jYWNoZS1zdG9yZVwiO1xuXG4vKiogVGhlIGlucHV0IGFuIGF1dG9tb2NrZWQgU0RLIGNvbW1hbmQgd2FzIGNvbnN0cnVjdGVkIHdpdGguICovXG5jb25zdCBjb21tYW5kSW5wdXQgPSAoY29tbWFuZDogdW5rbm93biwgdHlwZTogdW5rbm93bikgPT4ge1xuICBjb25zdCBtb2NrID0gdHlwZSBhcyBqZXN0Lk1vY2s7XG4gIHJldHVybiBtb2NrLm1vY2suY2FsbHNbbW9jay5tb2NrLmluc3RhbmNlcy5pbmRleE9mKGNvbW1hbmQpXVswXTtcbn07XG5cbmRlc2NyaWJlKFwicmVzb2x2ZUF3c0NhY2hlQ29uZmlnXCIsICgpID0+IHtcbiAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52ID0geyAuLi5lbnYgfTtcbiAgfSk7XG4gIGFmdGVyQWxsKCgpID0+IHtcbiAgICBwcm9jZXNzLmVudiA9IGVudjtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyB0aGUgZW52aXJvbm1lbnQgdGhlIGNvbnN0cnVjdHMgc2V0XCIsICgpID0+IHtcbiAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FID0gXCJidWNrZXRcIjtcbiAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FID0gXCJ0YWJsZVwiO1xuICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQgPSBcImJ1aWxkXCI7XG4gICAgcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA9IFwiZXUtd2VzdC0xXCI7XG4gICAgZXhwZWN0KHJlc29sdmVBd3NDYWNoZUNvbmZpZygpKS50b0VxdWFsKHtcbiAgICAgIGJ1Y2tldE5hbWU6IFwiYnVja2V0XCIsXG4gICAgICB0YWJsZU5hbWU6IFwidGFibGVcIixcbiAgICAgIGJ1aWxkSWQ6IFwiYnVpbGRcIixcbiAgICAgIHJlZ2lvbjogXCJldS13ZXN0LTFcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZXBvcnRzIHdoYXQgaXMgdW5zZXQgYXMgZW1wdHlcIiwgKCkgPT4ge1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0JVSUxEX0lEO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5BV1NfUkVHSU9OO1xuICAgIGV4cGVjdChyZXNvbHZlQXdzQ2FjaGVDb25maWcoKSkudG9FcXVhbCh7XG4gICAgICBidWNrZXROYW1lOiBcIlwiLFxuICAgICAgdGFibGVOYW1lOiBcIlwiLFxuICAgICAgYnVpbGRJZDogXCJcIixcbiAgICAgIHJlZ2lvbjogXCJ1cy1lYXN0LTFcIixcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJTMyBrZXlzXCIsICgpID0+IHtcbiAgaXQoXCJrZWVwcyB0aGUgaW5jcmVtZW50YWwgY2FjaGUncyB7YnVpbGRJZH0ve2tleX0uanNvbiBjb252ZW50aW9uXCIsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCIvXCIpKS50b0JlKFwiYi9pbmRleC5qc29uXCIpO1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcIlwiKSkudG9CZShcImIvaW5kZXguanNvblwiKTtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCIvYmxvZy9wb3N0XCIpKS50b0JlKFwiYi9ibG9nL3Bvc3QuanNvblwiKTtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCJhYmMxMjNcIikpLnRvQmUoXCJiL2FiYzEyMy5qc29uXCIpO1xuICB9KTtcblxuICBpdChcInB1dHMgJ3VzZSBjYWNoZScgZW50cmllcyB3aGVyZSBubyBpbmNyZW1lbnRhbCBrZXkgY2FuIGxhbmRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHVzZUNhY2hlUzNLZXkoXCJiXCIsIFwiZlwiLnJlcGVhdCg2NCkpO1xuICAgIGV4cGVjdChrZXkpLnRvQmUoYGIvX3VzZS1jYWNoZS8ke1wiZlwiLnJlcGVhdCg2NCl9LmVudHJ5YCk7XG4gICAgLy8gRXZlbiBhIHJvdXRlIHNwZWxsZWQgbGlrZSB0aGUgdXNlLWNhY2hlIGtleSBnZXRzIGAuanNvbmAgYXBwZW5kZWQuXG4gICAgZXhwZWN0KGJ1aWxkUzNLZXkoXCJiXCIsIGAvX3VzZS1jYWNoZS8ke1wiZlwiLnJlcGVhdCg2NCl9LmVudHJ5YCkpLm5vdC50b0JlKFxuICAgICAga2V5LFxuICAgICk7XG4gICAgZXhwZWN0KGtleS5lbmRzV2l0aChcIi5qc29uXCIpKS50b0JlKGZhbHNlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJ0YWcgbWFya2Vyc1wiLCAoKSA9PiB7XG4gIGl0KFwid3JpdGVzIHdoYXQgbWFya2VyRm9yIGFwcGxpZXMgbG9jYWxseVwiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBkdXJhdGlvbnMgb2YgW3VuZGVmaW5lZCwge30sIHsgZXhwaXJlOiA2MCB9XSkge1xuICAgICAgY29uc3QgdXBkYXRlID0gbWFya2VyVXBkYXRlKDEwMDAsIGR1cmF0aW9ucyk7XG4gICAgICBjb25zdCBsb2NhbCA9IG1hcmtlckZvcigxMDAwLCBkdXJhdGlvbnMpO1xuICAgICAgY29uc3Qgd3JpdHRlbjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICB1cGRhdGUuRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyEsXG4gICAgICApKSB7XG4gICAgICAgIHdyaXR0ZW5bbmFtZS5zbGljZSgxKV0gPSBOdW1iZXIodmFsdWUuTik7XG4gICAgICB9XG4gICAgICBleHBlY3Qod3JpdHRlbikudG9FcXVhbChsb2NhbCk7XG4gICAgfVxuICAgIGV4cGVjdChtYXJrZXJGb3IoMTAwMCwgeyBleHBpcmU6IDYwIH0pKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDEwMDAsXG4gICAgICBleHBpcmVkQXQ6IDYxMDAwLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImtlZXBzIGFuIGVhcmxpZXIgZXhwaXJlZEF0IGEgcHJvZmlsZSB3aXRoIG5vIGV4cGlyZSBsZWF2ZXNcIiwgKCkgPT4ge1xuICAgIC8vIFRoZSByb3cga2VlcHMgaXQgKGBTRVQgc3RhbGVBdGAgb25seSksIHNvIGFuIGluc3RhbmNlIGxlYXJuaW5nIG9mIHRoZVxuICAgIC8vIHNlY29uZCByZXZhbGlkYXRpb24gZnJvbSB0aGUgbG9nIGhhcyB0byBrZWVwIGl0IHRvby5cbiAgICBjb25zdCBmaXJzdCA9IG1hcmtlckZvcigxMDAwLCB7IGV4cGlyZTogNjAgfSk7XG4gICAgY29uc3Qgc2Vjb25kID0gbWFya2VyRm9yKDIwMDAsIHt9KTtcbiAgICBleHBlY3QobWVyZ2VNYXJrZXJzKGZpcnN0LCBzZWNvbmQpKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDIwMDAsXG4gICAgICBleHBpcmVkQXQ6IDYxMDAwLFxuICAgIH0pO1xuICAgIGV4cGVjdChtZXJnZU1hcmtlcnMoc2Vjb25kLCBmaXJzdCkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMjAwMCxcbiAgICAgIGV4cGlyZWRBdDogNjEwMDAsXG4gICAgfSk7XG4gICAgLy8gQSBuZXdlciBgZXhwaXJlYCBzdGlsbCByZXBsYWNlcyBpdC5cbiAgICBleHBlY3QobWVyZ2VNYXJrZXJzKGZpcnN0LCBtYXJrZXJGb3IoMjAwMCwgeyBleHBpcmU6IDEgfSkpKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDIwMDAsXG4gICAgICBleHBpcmVkQXQ6IDMwMDAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwianVkZ2VzIGFuIGVudHJ5IHRoZSB3YXkgdGhlIGluY3JlbWVudGFsIGNhY2hlIGFsd2F5cyBoYXNcIiwgKCkgPT4ge1xuICAgIC8vIEV4cGlyZWQgb3V0cmlnaHQgYWZ0ZXIgY3JlYXRpb24uXG4gICAgZXhwZWN0KG1hcmtlclN0YXRlKHsgcmV2YWxpZGF0ZWRBdDogMjAgfSwgMTAsIDMwKSkudG9CZShcImV4cGlyZWRcIik7XG4gICAgLy8gUmV2YWxpZGF0ZWQgYmVmb3JlIHRoZSBlbnRyeSB3YXMgY3JlYXRlZDogbm8gZWZmZWN0LlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHJldmFsaWRhdGVkQXQ6IDUgfSwgMTAsIDMwKSkudG9CZShcImZyZXNoXCIpO1xuICAgIC8vIEEgcHJvZmlsZTogc3RhbGUgbm93LCBleHBpcmVkIG9uY2UgYGV4cGlyZWRBdGAgcGFzc2VzLlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHN0YWxlQXQ6IDIwLCBleHBpcmVkQXQ6IDUwIH0sIDEwLCAzMCkpLnRvQmUoXCJzdGFsZVwiKTtcbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyBzdGFsZUF0OiAyMCwgZXhwaXJlZEF0OiA1MCB9LCAxMCwgNjApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICAvLyBgZXhwaXJlOiAwYDogc3RhbGUgYW5kIGV4cGlyZWQgYXQgb25jZS5cbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyBzdGFsZUF0OiAyMCwgZXhwaXJlZEF0OiAyMCB9LCAxMCwgMzApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICBleHBlY3QobWFya2VyU3RhdGUoe30sIDEwLCAzMCkpLnRvQmUoXCJmcmVzaFwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJUYWdNYXJrZXJUYWJsZVwiLCAoKSA9PiB7XG4gIGNvbnN0IHNlbmQgPSBqZXN0LmZuKCk7XG4gIGxldCB0YWJsZTogVGFnTWFya2VyVGFibGU7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoRHluYW1vREJDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgdGFibGUgPSBuZXcgVGFnTWFya2VyVGFibGUobmV3IER5bmFtb0RCQ2xpZW50KHt9KSwgXCJ0YmxcIiwgXCJidWlsZFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJ3cml0ZXMgdGhlIG1hcmtlciByb3cgdW5kZXIgdGhlIGJ1aWxkXCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHt9KTtcbiAgICBhd2FpdCB0YWJsZS53cml0ZShcInBvc3RzXCIsIDEwMDAsIHsgZXhwaXJlOiAxIH0pO1xuICAgIGNvbnN0IGlucHV0ID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgVXBkYXRlSXRlbUNvbW1hbmQpO1xuICAgIGV4cGVjdChpbnB1dCkudG9FcXVhbCh7XG4gICAgICBUYWJsZU5hbWU6IFwidGJsXCIsXG4gICAgICBLZXk6IHsgcGs6IHsgUzogXCJidWlsZFwiIH0sIHNrOiB7IFM6IFwicG9zdHNcIiB9IH0sXG4gICAgICBVcGRhdGVFeHByZXNzaW9uOiBcIlNFVCBzdGFsZUF0ID0gOnN0YWxlQXQsIGV4cGlyZWRBdCA9IDpleHBpcmVkQXRcIixcbiAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgXCI6c3RhbGVBdFwiOiB7IE46IFwiMTAwMFwiIH0sXG4gICAgICAgIFwiOmV4cGlyZWRBdFwiOiB7IE46IFwiMjAwMFwiIH0sXG4gICAgICB9LFxuICAgICAgUmV0dXJuVmFsdWVzOiBcIkFMTF9ORVdcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBtYXJrZXJzIGluIGJhdGNoZXMgb2YgMTAwIGFuZCBwYXJzZXMgdGhlbVwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrSW1wbGVtZW50YXRpb24oKGNvbW1hbmQ6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHsgUmVxdWVzdEl0ZW1zIH0gPSBjb21tYW5kSW5wdXQoY29tbWFuZCwgQmF0Y2hHZXRJdGVtQ29tbWFuZCk7XG4gICAgICBjb25zdCBrZXlzID0gUmVxdWVzdEl0ZW1zLnRibC5LZXlzIGFzIHsgc2s6IHsgUzogc3RyaW5nIH0gfVtdO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIFJlc3BvbnNlczoge1xuICAgICAgICAgIHRibDoga2V5c1xuICAgICAgICAgICAgLmZpbHRlcigoeyBzayB9KSA9PiBzay5TLmVuZHNXaXRoKFwiMFwiKSlcbiAgICAgICAgICAgIC5tYXAoKHsgc2sgfSkgPT4gKHsgc2ssIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI3XCIgfSB9KSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCB0YWdzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTUwIH0sIChfLCBpKSA9PiBgdCR7aX1gKTtcbiAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgdGFibGUucmVhZChbLi4udGFncywgXCJ0MFwiXSk7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5zaXplKS50b0JlKDE1KTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJ0MTBcIikpLnRvRXF1YWwoe1xuICAgICAgcmV2YWxpZGF0ZWRBdDogNyxcbiAgICAgIHN0YWxlQXQ6IHVuZGVmaW5lZCxcbiAgICAgIGV4cGlyZWRBdDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImtleXMgYSB0YWcgcGFzdCB0aGUgc29ydCBrZXkgbGltaXQgYnkgaXRzIGhhc2gsIGFuZCByZWFkcyBpdCBiYWNrIGFzIHRoZSB0YWdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIGByZXZhbGlkYXRlUGF0aGAgb24gYSBsb25nIHBhdGg6IGFuIGltcGxpY2l0IHRhZyBpcyBhcyBsb25nIGFzIHRoZSBwYXRoLlxuICAgIGNvbnN0IHRhZyA9IGBfTl9UXy8ke1wicFwiLnJlcGVhdCgxMTAwKX1gO1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IHRhYmxlLndyaXRlKHRhZywgMTAwMCwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCB3cml0dGVuID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgVXBkYXRlSXRlbUNvbW1hbmQpO1xuICAgIGV4cGVjdCh3cml0dGVuLktleS5zay5TKS50b0JlKGhhc2hlZFRhZyh0YWcpKTtcbiAgICBleHBlY3QoaGFzaGVkVGFnKHRhZykpLnRvTWF0Y2goL14jWzAtOWEtZl17NjR9JC8pO1xuXG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICBzZW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoY29tbWFuZDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgeyBSZXF1ZXN0SXRlbXMgfSA9IGNvbW1hbmRJbnB1dChjb21tYW5kLCBCYXRjaEdldEl0ZW1Db21tYW5kKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBSZXNwb25zZXM6IHtcbiAgICAgICAgICB0Ymw6IFJlcXVlc3RJdGVtcy50YmwuS2V5cy5tYXAoKHsgc2sgfTogeyBzazogdW5rbm93biB9KSA9PiAoe1xuICAgICAgICAgICAgc2ssXG4gICAgICAgICAgICByZXZhbGlkYXRlZEF0OiB7IE46IFwiN1wiIH0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgbWFya2VycyA9IGF3YWl0IHRhYmxlLnJlYWQoW3RhZywgXCJzaG9ydFwiXSk7XG4gICAgZXhwZWN0KFsuLi5tYXJrZXJzLmtleXMoKV0uc29ydCgpKS50b0VxdWFsKFtcInNob3J0XCIsIHRhZ10uc29ydCgpKTtcbiAgfSk7XG5cbiAgLy8gQSByZWFkLWJhY2sgYWZ0ZXIgdGhlIHdyaXRlIGlzIGV2ZW50dWFsbHkgY29uc2lzdGVudCwgc28gaXQgY2FuIHJldHVyblxuICAvLyB0aGUgbWFya2VyIGZyb20gYmVmb3JlIGl0OiB0aGUgd3JpdGVyIHRyYWNrcyB3aGF0IHRoZSB3cml0ZSByZXR1cm5lZC5cbiAgaXQoXCJyZXR1cm5zIHRoZSByb3cgYXMgdGhlIHdyaXRlIGxlZnQgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgIEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2s6IHsgUzogXCJwb3N0c1wiIH0sXG4gICAgICAgIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI1MDAwXCIgfSxcbiAgICAgICAgc3RhbGVBdDogeyBOOiBcIjEwXCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgNTAwMCwgdW5kZWZpbmVkKSkudG9FcXVhbCh7XG4gICAgICByZXZhbGlkYXRlZEF0OiA1MDAwLFxuICAgICAgc3RhbGVBdDogMTAsXG4gICAgICBleHBpcmVkQXQ6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7fSk7XG4gICAgZXhwZWN0KGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgNjAwMCwgdW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICBpdChcImFza3MgYWdhaW4gZm9yIHVucHJvY2Vzc2VkIGtleXMsIGFuZCBnaXZlcyB1cCBhZnRlciB0aHJlZSB0cmllc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdW5wcm9jZXNzZWQgPSB7XG4gICAgICBVbnByb2Nlc3NlZEtleXM6IHtcbiAgICAgICAgdGJsOiB7IEtleXM6IFt7IHBrOiB7IFM6IFwiYnVpbGRcIiB9LCBzazogeyBTOiBcImFcIiB9IH1dIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UodW5wcm9jZXNzZWQpLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7XG4gICAgICBSZXNwb25zZXM6IHsgdGJsOiBbeyBzazogeyBTOiBcImFcIiB9LCBzdGFsZUF0OiB7IE46IFwiM1wiIH0gfV0gfSxcbiAgICB9KTtcbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLnJlYWQoW1wiYVwiXSkpLmdldChcImFcIik/LnN0YWxlQXQpLnRvQmUoMyk7XG5cbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHVucHJvY2Vzc2VkKTtcbiAgICBhd2FpdCBleHBlY3QodGFibGUucmVhZChbXCJhXCJdKSkucmVqZWN0cy50b1Rocm93KC91bnJlYWQgYWZ0ZXIgcmV0cnlpbmcvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSZXZhbGlkYXRpb25Mb2dcIiwgKCkgPT4ge1xuICBjb25zdCBzZW5kID0gamVzdC5mbigpO1xuICBsZXQgbG9nOiBSZXZhbGlkYXRpb25Mb2c7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoRHluYW1vREJDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgbG9nID0gbmV3IFJldmFsaWRhdGlvbkxvZyhuZXcgRHluYW1vREJDbGllbnQoe30pLCBcInRibFwiLCBcImJ1aWxkXCIpO1xuICB9KTtcblxuICBpdChcInB1dHMgb25lIHJvdyBwZXIgcmV2YWxpZGF0aW9uIHVuZGVyIHRoZSBidWlsZCdzIGxvZywgd2l0aCBhIFRUTFwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgY29uc3QgYXQgPSAxXzcyN18wMDBfMDAwXzEyMztcbiAgICBhd2FpdCBsb2cucHV0KFwidXNlciM0MlwiLCBhdCwgeyBzdGFsZUF0OiA1LCBleHBpcmVkQXQ6IDYgfSk7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFB1dEl0ZW1Db21tYW5kKSkudG9FcXVhbCh7XG4gICAgICBUYWJsZU5hbWU6IFwidGJsXCIsXG4gICAgICBJdGVtOiB7XG4gICAgICAgIHBrOiB7IFM6IFwiYnVpbGQjbG9nXCIgfSxcbiAgICAgICAgc2s6IHsgUzogXCIwMDE3MjcwMDAwMDAxMjMjdXNlciM0MlwiIH0sXG4gICAgICAgIHR0bDogeyBOOiBTdHJpbmcoTWF0aC5jZWlsKChhdCArIFJFVkFMSURBVElPTl9MT0dfVFRMX01TKSAvIDEwMDApKSB9LFxuICAgICAgICBzdGFsZUF0OiB7IE46IFwiNVwiIH0sXG4gICAgICAgIGV4cGlyZWRBdDogeyBOOiBcIjZcIiB9LFxuICAgICAgfSxcbiAgICAgIENvbmRpdGlvbkV4cHJlc3Npb246IFwiYXR0cmlidXRlX25vdF9leGlzdHMoc2spXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwibW92ZXMgYSByb3cgdG8gdGhlIG5leHQgbWlsbGlzZWNvbmQgcmF0aGVyIHRoYW4gb3ZlcndyaXRlIGFub3RoZXIgcmV2YWxpZGF0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBgdXBkYXRlVGFnKCd4JylgIGFuZCBgcmV2YWxpZGF0ZVRhZygneCcsICdtYXgnKWAgaW4gb25lIG1pbGxpc2Vjb25kLlxuICAgIGNvbnN0IHRha2VuID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJ0YWtlblwiKSwge1xuICAgICAgbmFtZTogXCJDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uXCIsXG4gICAgfSk7XG4gICAgc2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UodGFrZW4pLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7fSk7XG4gICAgYXdhaXQgbG9nLnB1dChcInhcIiwgMTAwMC41LCB7IHJldmFsaWRhdGVkQXQ6IDUgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgc2VuZC5tb2NrLmNhbGxzLm1hcChcbiAgICAgICAgKFtjb21tYW5kXSkgPT4gY29tbWFuZElucHV0KGNvbW1hbmQsIFB1dEl0ZW1Db21tYW5kKS5JdGVtLnNrLlMsXG4gICAgICApLFxuICAgICkudG9FcXVhbChbXCIwMDAwMDAwMDAwMDEwMDAjeFwiLCBcIjAwMDAwMDAwMDAwMTAwMSN4XCJdKTtcbiAgfSk7XG5cbiAgaXQoXCJnaXZlcyB1cCBhZnRlciBhIGJvdW5kZWQgbnVtYmVyIG9mIGNvbGxpc2lvbnMsIGFuZCBvbiBvdGhlciBlcnJvcnMgYXQgb25jZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFrZW4gPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcInRha2VuXCIpLCB7XG4gICAgICBuYW1lOiBcIkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb25cIixcbiAgICB9KTtcbiAgICBzZW5kLm1vY2tSZWplY3RlZFZhbHVlKHRha2VuKTtcbiAgICBhd2FpdCBleHBlY3QobG9nLnB1dChcInhcIiwgMTAwMCwge30pKS5yZWplY3RzLnRvQmUodGFrZW4pO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoNSk7XG5cbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIGNvbnN0IHRocm90dGxlZCA9IG5ldyBFcnJvcihcInRocm90dGxlZFwiKTtcbiAgICBzZW5kLm1vY2tSZWplY3RlZFZhbHVlKHRocm90dGxlZCk7XG4gICAgYXdhaXQgZXhwZWN0KGxvZy5wdXQoXCJ4XCIsIDEwMDAsIHt9KSkucmVqZWN0cy50b0JlKHRocm90dGxlZCk7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgaXQoXCJxdWVyaWVzIGZyb20gYSB6ZXJvLXBhZGRlZCBjdXJzb3IgYW5kIHBhcnNlcyB0aGUgdGFnIGFmdGVyIGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgICAgSXRlbXM6IFtcbiAgICAgICAgICB7IHNrOiB7IFM6IFwiMDAwMDAwMDAwMDAxMDAwI2FcIiB9LCByZXZhbGlkYXRlZEF0OiB7IE46IFwiN1wiIH0gfSxcbiAgICAgICAgICB7IHNrOiB7IFM6IFwibm90IGEgbG9nIHJvd1wiIH0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgTGFzdEV2YWx1YXRlZEtleTogeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSxcbiAgICAgIH0pXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgICAgSXRlbXM6IFt7IHNrOiB7IFM6IFwiMDAwMDAwMDAwMDAyMDAwI3VzZXIjNDJcIiB9LCBzdGFsZUF0OiB7IE46IFwiOFwiIH0gfV0sXG4gICAgICB9KTtcbiAgICBjb25zdCB7IHJvd3MsIHRydW5jYXRlZCB9ID0gYXdhaXQgbG9nLnF1ZXJ5KDk5OS41KTtcblxuICAgIGNvbnN0IGZpcnN0ID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgUXVlcnlDb21tYW5kKTtcbiAgICBleHBlY3QoZmlyc3QpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgVGFibGVOYW1lOiBcInRibFwiLFxuICAgICAgS2V5Q29uZGl0aW9uRXhwcmVzc2lvbjogXCJwayA9IDpwayBBTkQgc2sgPj0gOnNpbmNlXCIsXG4gICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgIFwiOnBrXCI6IHsgUzogXCJidWlsZCNsb2dcIiB9LFxuICAgICAgICBcIjpzaW5jZVwiOiB7IFM6IFwiMDAwMDAwMDAwMDAwOTk5XCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1sxXVswXSwgUXVlcnlDb21tYW5kKS5FeGNsdXNpdmVTdGFydEtleSxcbiAgICApLnRvRXF1YWwoeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSk7XG4gICAgZXhwZWN0KHRydW5jYXRlZCkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KHJvd3MpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICBzazogXCIwMDAwMDAwMDAwMDEwMDAjYVwiLFxuICAgICAgICBhdDogMTAwMCxcbiAgICAgICAgdGFnOiBcImFcIixcbiAgICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQ6IDcsIHN0YWxlQXQ6IHVuZGVmaW5lZCwgZXhwaXJlZEF0OiB1bmRlZmluZWQgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNrOiBcIjAwMDAwMDAwMDAwMjAwMCN1c2VyIzQyXCIsXG4gICAgICAgIGF0OiAyMDAwLFxuICAgICAgICB0YWc6IFwidXNlciM0MlwiLFxuICAgICAgICBtYXJrZXI6IHsgcmV2YWxpZGF0ZWRBdDogdW5kZWZpbmVkLCBzdGFsZUF0OiA4LCBleHBpcmVkQXQ6IHVuZGVmaW5lZCB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJoYXNoZXMgYSB0YWcgdG9vIGxvbmcgZm9yIHRoZSBzb3J0IGtleSwgY2FycnlpbmcgaXQgaW4gbG9uZ1RhZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFnID0gYF9OX1RfLyR7XCJwXCIucmVwZWF0KDExMDApfWA7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgYXdhaXQgbG9nLnB1dCh0YWcsIDEwMDAsIHsgcmV2YWxpZGF0ZWRBdDogNSB9KTtcbiAgICBjb25zdCB7IEl0ZW0gfSA9IGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFB1dEl0ZW1Db21tYW5kKTtcbiAgICBleHBlY3QoSXRlbS5zay5TKS50b0JlKGAwMDAwMDAwMDAwMDEwMDAjJHtoYXNoZWRUYWcodGFnKX1gKTtcbiAgICBleHBlY3QoSXRlbS5sb25nVGFnKS50b0VxdWFsKHsgUzogdGFnIH0pO1xuXG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IEl0ZW1zOiBbeyAuLi5JdGVtIH1dIH0pO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgbG9nLnF1ZXJ5KDApO1xuICAgIGV4cGVjdChyb3dzLm1hcCgocm93KSA9PiByb3cudGFnKSkudG9FcXVhbChbdGFnXSk7XG4gIH0pO1xuXG4gIGl0KFwic3RvcHMgYWZ0ZXIgaXRzIHBhZ2UgYm91bmQgYW5kIHNheXMgc29cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgSXRlbXM6IFtdLFxuICAgICAgTGFzdEV2YWx1YXRlZEtleTogeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSxcbiAgICB9KTtcbiAgICBleHBlY3QoKGF3YWl0IGxvZy5xdWVyeSgwKSkudHJ1bmNhdGVkKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVMpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIkNhY2hlQnVja2V0XCIsICgpID0+IHtcbiAgY29uc3Qgc2VuZCA9IGplc3QuZm4oKTtcbiAgbGV0IGJ1Y2tldDogQ2FjaGVCdWNrZXQ7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoUzNDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgYnVja2V0ID0gbmV3IENhY2hlQnVja2V0KG5ldyBTM0NsaWVudCh7fSksIFwiYmt0XCIpO1xuICB9KTtcblxuICBpdChcInJlYWRzIGFuIG9iamVjdCBhcyB0ZXh0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IHsgdHJhbnNmb3JtVG9TdHJpbmc6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShcInt9XCIpIH0sXG4gICAgICBDb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgfSk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlKFwie31cIik7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIEdldE9iamVjdENvbW1hbmQpKS50b0VxdWFsKHtcbiAgICAgIEJ1Y2tldDogXCJia3RcIixcbiAgICAgIEtleTogXCJrXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyBhIG1pc3Npbmcgb2JqZWN0IG9yIGJvZHkgd2l0aCB1bmRlZmluZWQsIGFuZCB0aHJvd3MgdGhlIHJlc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKFxuICAgICAgbmV3IE5vU3VjaEtleSh7IG1lc3NhZ2U6IFwibWlzc2luZ1wiLCAkbWV0YWRhdGE6IHt9IH0pLFxuICAgICk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBCb2R5OiBudWxsIH0pO1xuICAgIGV4cGVjdChhd2FpdCBidWNrZXQuZ2V0KFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcIkFjY2Vzc0RlbmllZFwiKSk7XG4gICAgYXdhaXQgZXhwZWN0KGJ1Y2tldC5nZXQoXCJrXCIpKS5yZWplY3RzLnRvVGhyb3coXCJBY2Nlc3NEZW5pZWRcIik7XG4gIH0pO1xuXG4gIGl0KFwid3JpdGVzIEpTT05cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IGJ1Y2tldC5wdXRKc29uKFwia1wiLCBcInt9XCIpO1xuICAgIGV4cGVjdChjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBQdXRPYmplY3RDb21tYW5kKSkudG9FcXVhbCh7XG4gICAgICBCdWNrZXQ6IFwiYmt0XCIsXG4gICAgICBLZXk6IFwia1wiLFxuICAgICAgQm9keTogXCJ7fVwiLFxuICAgICAgQ29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlRyYWNrZWRUYWdNYXJrZXJzXCIsICgpID0+IHtcbiAgaXQoXCJuZXZlciBjb3VudHMgYSByZW5kZXIgdGhlIHJ1bnRpbWUgY2F1Z2h0IHVwIGFzIGJlaGluZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5OiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIC8vIEp1c3Qgc2hvcnQgb2YgdGhlIGxpbmUgYXMgdGhlIHJlcXVlc3QgY2FtZSBpbjogYGNhdGNoVXBgIGxldHMgaXQgZ28uXG4gICAgY2xvY2sgKz0gMTAwMCArIFRBR19SRUZSRVNIX0dSQUNFX01TO1xuICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgYXdhaXQgbWFya2Vycy5jYXRjaFVwKGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEhvd2V2ZXIgbG9uZyB0aGUgcmVuZGVyIHRha2VzLCBpdHMgbG9va3VwcyBuZXZlciB3YWl0OiB3YWl0aW5nIGlzXG4gICAgICAvLyB3aGF0IHRoZSBjYXRjaC11cCBiZWZvcmUgaXQgd2FzIGZvci5cbiAgICAgIGNsb2NrICs9IDEwMDtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZEluUmVuZGVyKS50b0JlKGZhbHNlKTtcbiAgICAgIGNsb2NrICs9IDYwXzAwMDtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZEluUmVuZGVyKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgICAvLyBPdXRzaWRlIGl0IC0gYSByb3V0ZSBoYW5kbGVyIGFsb25nc2lkZSwgaW4gYSBjb250YWluZXIgLSBpdCB3YWl0cy5cbiAgICBleHBlY3QobWFya2Vycy5iZWhpbmRJblJlbmRlcikudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJnaXZlcyBhIHJlbmRlciBubyBncmFjZSB3aGVuIGNhdGNoVXAsIGhvbGRpbmcgbm90aGluZywgZGlkIG5vdCBjYXRjaCB1cFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGxldCBoZWxkID0gZmFsc2U7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoXG4gICAgICAoKSA9PiAoaGVsZCA/IDAgOiBJbmZpbml0eSksXG4gICAgICAoKSA9PiBoZWxkLFxuICAgICk7XG4gICAgY2xvY2sgKz0gMTAwMCArIFRBR19SRUZSRVNIX0dSQUNFX01TICsgMTAwO1xuICAgIGF3YWl0IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBbm90aGVyIHJlcXVlc3Qgc3RvcmVzIGFuIGVudHJ5IGJlZm9yZSB0aGlzIHJlbmRlcidzIGZpcnN0IGxvb2t1cC5cbiAgICAgIGhlbGQgPSB0cnVlO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kSW5SZW5kZXIpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic3RhcnRzIGEgcmVmcmVzaCBmb3IgYSBwYWdlIHRoYXQgaXMgbm90IGJlaGluZCwgd2l0aG91dCB3YWl0aW5nIGZvciBpdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGxldCByZWxlYXNlITogKCkgPT4gdm9pZDtcbiAgICBjb25zdCBxdWVyeSA9IGplc3QuZm4oXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgUHJvbWlzZTx7IHJvd3M6IFJldmFsaWRhdGlvbkxvZ1Jvd1tdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4oXG4gICAgICAgICAgKHJlc29sdmUpID0+XG4gICAgICAgICAgICAocmVsZWFzZSA9ICgpID0+IHJlc29sdmUoeyByb3dzOiBbXSwgdHJ1bmNhdGVkOiBmYWxzZSB9KSksXG4gICAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeSB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDEwMDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgfSk7XG4gICAgbWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiAwKTtcbiAgICBjbG9jayArPSAxMDAwO1xuICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgLy8gQSBwYWdlIHRoYXQgcmVhZHMgbm8gY2FjaGUgc3RpbGwga2VlcHMgdGhlIGluc3RhbmNlIGN1cnJlbnQuXG4gICAgYXdhaXQgZXhwZWN0KG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiBcInBhZ2VcIikpLnJlc29sdmVzLnRvQmUoXCJwYWdlXCIpO1xuICAgIGV4cGVjdChxdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgIHJlbGVhc2UoKTtcbiAgfSk7XG5cbiAgaXQoXCJjYXRjaGVzIHVwIG9uIHRoZSBsb2cgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgcm9sbGluZyByZS1yZWFkXCIsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgbGV0IHJlbGVhc2UhOiAoKSA9PiB2b2lkO1xuICAgIGNvbnN0IHJlYWQgPSBqZXN0LmZuKGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgaWYgKHJlYWQubW9jay5jYWxscy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVsZWFzZSA9IHJlc29sdmUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPih0YWdzLm1hcCgodGFnKSA9PiBbdGFnLCB7fV0pKTtcbiAgICB9KTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZCB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgcmVzeW5jSW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIHJhbmRvbTogKCkgPT4gMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIGF3YWl0IG1hcmtlcnMuZW5zdXJlKFtcInBvc3RzXCJdKTtcbiAgICAvLyBEdWUgZm9yIGl0cyByZS1yZWFkLCBhbmQgYmVoaW5kLCBhcyBhZnRlciBhIHF1aWV0IHNwZWxsLlxuICAgIGNsb2NrICs9IDUwMDA7XG4gICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKHRydWUpO1xuICAgIGxldCByZW5kZXJlZCA9IGZhbHNlO1xuICAgIGF3YWl0IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiAocmVuZGVyZWQgPSB0cnVlKSk7XG4gICAgLy8gQSB0aHJvdHRsZWQgYEJhdGNoR2V0SXRlbWAgd291bGQgb3RoZXJ3aXNlIGhvbGQgdGhlIHBhZ2UuXG4gICAgZXhwZWN0KHJlbmRlcmVkKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChyZWFkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG5cbiAgICAvLyBOb3IgZG9lcyBhIGxvb2t1cCBvZiB0aGUgdHJhY2tlZCB0YWcgd2FpdCBvbiBpdC5cbiAgICBsZXQgZW5zdXJlZCA9IGZhbHNlO1xuICAgIHZvaWQgbWFya2Vycy5lbnN1cmUoW1wicG9zdHNcIl0pLnRoZW4oKCkgPT4gKGVuc3VyZWQgPSB0cnVlKSk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7XG4gICAgZXhwZWN0KGVuc3VyZWQpLnRvQmUodHJ1ZSk7XG5cbiAgICAvLyBTdGlsbCBpbiBmbGlnaHQgYW4gaW50ZXJ2YWwgbGF0ZXI6IG5vdCByZWFkIGEgc2Vjb25kIHRpbWUgbWVhbndoaWxlLlxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KHJlYWQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICByZWxlYXNlKCk7XG4gIH0pO1xuXG4gIGl0KFwiZ2l2ZXMgYSByb3V0ZSBoYW5kbGVyLCB3aGljaCBubyBjYXRjaC11cCBwcmVjZWRlcywgbm8gZ3JhY2UgbW9yZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5OiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIGNsb2NrICs9IDEwMDAgKyBUQUdfUkVGUkVTSF9HUkFDRV9NUyArIDEwMDtcbiAgICBleHBlY3QobWFya2Vycy5iZWhpbmRJblJlbmRlcikudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBhZ2FpbiBvbmx5IG9uY2UsIGhvd2V2ZXIgbWFueSBmb3JnZXRzIGxhbmQgbWVhbndoaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3QgcmVsZWFzZXM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gICAgY29uc3QgcmVhZCA9IGplc3QuZm4oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHJlbGVhc2VzLnB1c2gocmVzb2x2ZSkpO1xuICAgICAgcmV0dXJuIG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KFtbXCJwb3N0c1wiLCB7IHJldmFsaWRhdGVkQXQ6IDEgfV1dKTtcbiAgICB9KTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZCB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gMCk7XG4gICAgY29uc3QgZm9yZ2V0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY2xvY2sgKz0gTUFYX1JFVkFMSURBVElPTl9MT0dfR0FQX01TICsgMTtcbiAgICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIH07XG4gICAgY29uc3QgZW5zdXJpbmcgPSBtYXJrZXJzLmVuc3VyZShbXCJwb3N0c1wiXSk7XG4gICAgYXdhaXQgZm9yZ2V0KCk7XG4gICAgcmVsZWFzZXMuc2hpZnQoKSEoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0SW1tZWRpYXRlKHJlc29sdmUpKTtcbiAgICBhd2FpdCBmb3JnZXQoKTtcbiAgICByZWxlYXNlcy5zaGlmdCgpISgpO1xuICAgIGF3YWl0IGVuc3VyaW5nO1xuICAgIC8vIEEgdHJ1bmNhdGVkIGxvZyBmb3JnZXRzIG9uIGV2ZXJ5IHF1ZXJ5OiB3YWl0aW5nIGZvciBhIHJlYWQgbm8gZm9yZ2V0XG4gICAgLy8gb3ZlcnRvb2sgd291bGQga2VlcCB0aGUgcmVxdWVzdHMgd2FpdGluZyBvbiB0aGlzIG9uZSBmb3IgYXMgbG9uZy5cbiAgICBleHBlY3QocmVhZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtYXJrZXJzLmdldChcInBvc3RzXCIpKS50b0VxdWFsKHsgcmV2YWxpZGF0ZWRBdDogMSB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBhZ2FpbiB3aGF0IGEgcmVhZCBmcm9tIGJlZm9yZSBhIGZvcmdldCBmb3VuZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGxldCByZWxlYXNlITogKCkgPT4gdm9pZDtcbiAgICBjb25zdCBoZWxkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IChyZWxlYXNlID0gcmVzb2x2ZSkpO1xuICAgIGxldCByZXZhbGlkYXRlZEF0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVhZCA9IGplc3QuZm4oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgaGVsZDtcbiAgICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPihcbiAgICAgICAgcmV2YWxpZGF0ZWRBdCA9PT0gdW5kZWZpbmVkID8gW10gOiBbW1wicG9zdHNcIiwgeyByZXZhbGlkYXRlZEF0IH1dXSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7XG4gICAgICAgIHF1ZXJ5OiBqZXN0LmZuKGFzeW5jICgpID0+ICh7IHJvd3M6IFtdLCB0cnVuY2F0ZWQ6IGZhbHNlIH0pKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIC8vIEEgYmFja2dyb3VuZCByZWFkIGluIGZsaWdodCBhcyB0aGUgc2FuZGJveCBmcm96ZSwgcGFzdCB0aGUgbG9nJ3MgVFRMLlxuICAgIGNvbnN0IGVuc3VyaW5nID0gbWFya2Vycy5lbnN1cmUoW1wicG9zdHNcIl0pO1xuICAgIGNsb2NrICs9IE1BWF9SRVZBTElEQVRJT05fTE9HX0dBUF9NUyArIDE7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG5cbiAgICAvLyBSZWFkIGFnYWluIG9uY2UgdGhlIHN0YWxlIHJlYWQgcmV0dXJuczogdHJhY2tlZCwgaXRzIG1hcmtlciB3b3VsZFxuICAgIC8vIHZvdWNoIGZvciBldmVyeSBlbnRyeSB3aXRoIHRoZSB0YWcsIHJldmFsaWRhdGVkIGR1cmluZyB0aGUgZnJlZXplIG9yXG4gICAgLy8gbm90OyB1bnRyYWNrZWQsIHRoZSByZXF1ZXN0IHdhaXRpbmcgb24gaXQgd291bGQganVkZ2UgYnkgbm90aGluZy5cbiAgICByZXZhbGlkYXRlZEF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICByZWxlYXNlKCk7XG4gICAgYXdhaXQgZW5zdXJpbmc7XG4gICAgZXhwZWN0KHJlYWQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJwb3N0c1wiKSkudG9FcXVhbCh7IHJldmFsaWRhdGVkQXQgfSk7XG4gIH0pO1xuXG4gIGl0KFwibW92ZXMgY29tcGxldGVTaW5jZSBwYXN0IHdoYXQgaXQgZm9yZ2V0c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IGxhdGVyID0gbWFya2VyQ2xvY2soKSArIDYwXzAwMDtcbiAgICBjb25zdCByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXSA9IFtcImFcIiwgXCJiXCJdLm1hcCgodGFnLCBpKSA9PiAoe1xuICAgICAgc2s6IGAke1N0cmluZyhjbG9jaykucGFkU3RhcnQoMTUsIFwiMFwiKX0jJHt0YWd9YCxcbiAgICAgIGF0OiBjbG9jayxcbiAgICAgIHRhZyxcbiAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0OiBsYXRlciArIGkgfSxcbiAgICB9KSk7XG4gICAgY29uc3QgcXVlcnkgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7IHJvd3MsIHRydW5jYXRlZDogZmFsc2UgfSkpO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5IH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMCxcbiAgICAgIG1heFRyYWNrZWRUYWdzOiAxLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIC8vIEFuIGVudHJ5IHN0b3JlIGhvbGRpbmcgc29tZXRoaW5nIG9sZGVyIHRoYW4gZXZlcnkgcm93LlxuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gMCk7XG4gICAgY29uc3Qgc3RhcnQgPSBtYXJrZXJzLmNvbXBsZXRlU2luY2U7XG4gICAgZXhwZWN0KHN0YXJ0KS50b0JlTGVzc1RoYW5PckVxdWFsKG1hcmtlckNsb2NrKCkpO1xuXG4gICAgLy8gVW50cmFja2VkIHRhZ3MnIHJvd3MgYXJlIGtub3duIGZyb20gdGhlIGxvZyBhbG9uZSwgYXMgZmFyIGFzIHRoZXkgZml0LlxuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChtYXJrZXJzLnN0YXRlKFtcImJcIl0sIGxhdGVyKSkudG9CZShcImV4cGlyZWRcIik7XG4gICAgLy8gXCJhXCIgd2FzIGRyb3BwZWQgZm9yIHNwYWNlLCBhbmQgd2l0aCBpdCB3aGF0IGl0IGtuZXcuXG4gICAgZXhwZWN0KG1hcmtlcnMuc3RhdGUoW1wiYVwiXSwgbGF0ZXIpKS50b0JlKFwiZnJlc2hcIik7XG4gICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShsYXRlcik7XG5cbiAgICAvLyBGb3JnZXR0aW5nIGV2ZXJ5dGhpbmcgbW92ZXMgaXQgdG8gbm93LCBvciBwYXN0IHdoYXQgaXQgZm9yZ290OiBcImJcIi5cbiAgICBjbG9jayArPSBNQVhfUkVWQUxJREFUSU9OX0xPR19HQVBfTVMgKyAxO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUobGF0ZXIgKyAxKTtcbiAgfSk7XG5cbiAgaXQoXCJtb3ZlcyBjb21wbGV0ZVNpbmNlIHBhc3QgYSByb3cgaXQgbGV0cyBnbyBvZiB3aXRoIG5vIGVudHJ5IGhlbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IHJldmFsaWRhdGVkQXQgPSBtYXJrZXJDbG9jaygpICsgNjBfMDAwO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7XG4gICAgICAgIHF1ZXJ5OiBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgcm93czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzazogYCR7U3RyaW5nKGNsb2NrKS5wYWRTdGFydCgxNSwgXCIwXCIpfSNwb3N0c2AsXG4gICAgICAgICAgICAgIGF0OiBjbG9jayxcbiAgICAgICAgICAgICAgdGFnOiBcInBvc3RzXCIsXG4gICAgICAgICAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0IH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gSW5maW5pdHkpO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIC8vIEFuIGVudHJ5IHdob3NlIGdlbmVyYXRpb24gc3RhcnRlZCBiZWZvcmUgdGhlIHJldmFsaWRhdGlvbiwgc3RvcmVkIG9uY2VcbiAgICAvLyB0aGUgcm93IGlzIGdvbmUsIGlzIG9sZGVyIHRoYW4gYGNvbXBsZXRlU2luY2VgLCBhbmQgc28gcmVhZCBmaXJzdC5cbiAgICBleHBlY3QobWFya2Vycy5zdGF0ZShbXCJwb3N0c1wiXSwgcmV2YWxpZGF0ZWRBdCAtIDEpKS50b0JlKFwiZnJlc2hcIik7XG4gICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShyZXZhbGlkYXRlZEF0KTtcbiAgfSk7XG5cbiAgaXQoXCJwcnVuZXMgYSBwcm9maWxlJ3Mgcm93LCBhbmQgbW92ZXMgY29tcGxldGVTaW5jZSB0byBpdHMgZXhwaXJlZEF0IG9uY2UgcGFzdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3Qgc3RhbGVBdCA9IG1hcmtlckNsb2NrKCkgKyAxMDAwO1xuICAgIGNvbnN0IGV4cGlyZWRBdCA9IHN0YWxlQXQgKyA2MF8wMDA7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNrOiBgJHtTdHJpbmcoY2xvY2spLnBhZFN0YXJ0KDE1LCBcIjBcIil9I3Bvc3RzYCxcbiAgICAgICAgICAgICAgYXQ6IGNsb2NrLFxuICAgICAgICAgICAgICB0YWc6IFwicG9zdHNcIixcbiAgICAgICAgICAgICAgbWFya2VyOiB7IHN0YWxlQXQsIGV4cGlyZWRBdCB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRydW5jYXRlZDogZmFsc2UsXG4gICAgICAgIH0pKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IHN0YWxlQXQgKyAxKTtcbiAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICBleHBlY3QobWFya2Vycy5zdGF0ZShbXCJwb3N0c1wiXSwgc3RhbGVBdCAtIDEpKS50b0JlKFwiZnJlc2hcIik7XG4gICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShzdGFsZUF0KTtcblxuICAgIGNvbnN0IG5vdyA9IGplc3RcbiAgICAgIC5zcHlPbihwZXJmb3JtYW5jZSwgXCJub3dcIilcbiAgICAgIC5tb2NrUmV0dXJuVmFsdWUoZXhwaXJlZEF0IC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgdHJ5IHtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoZXhwaXJlZEF0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbm93Lm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdChcInF1ZXVlcyBhIHBydW5lZCByb3cncyBmdXR1cmUgZXhwaXJlZEF0IG9uY2UsIGhvd2V2ZXIgb2Z0ZW4gdGhlIGxvb2tiYWNrIHJldHVybnMgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjbG9jayA9IDFfMDAwXzAwMDtcbiAgICBjb25zdCBzdGFsZUF0ID0gbWFya2VyQ2xvY2soKSArIDEwMDA7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNrOiBgJHtTdHJpbmcoMV8wMDBfMDAwKS5wYWRTdGFydCgxNSwgXCIwXCIpfSNwb3N0c2AsXG4gICAgICAgICAgICAgIGF0OiAxXzAwMF8wMDAsXG4gICAgICAgICAgICAgIHRhZzogXCJwb3N0c1wiLFxuICAgICAgICAgICAgICBtYXJrZXI6IHsgc3RhbGVBdCwgZXhwaXJlZEF0OiBzdGFsZUF0ICsgNjBfMDAwIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gc3RhbGVBdCArIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICAgIGNsb2NrICs9IDEwMDA7XG4gICAgfVxuICAgIC8vIFBydW5lZCByb3dzIGFyZSBub3QgbWFya2VkIGFwcGxpZWQsIHNvIGVhY2ggcXVlcnkgYXBwbGllcyBpdCBhZ2Fpbi5cbiAgICBleHBlY3QoXG4gICAgICAobWFya2VycyBhcyB1bmtub3duIGFzIHsgbGF0ZXJGbG9vcnM6IHVua25vd25bXSB9KS5sYXRlckZsb29ycyxcbiAgICApLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG5cbiAgaXQoXCJtZXJnZXMgZnV0dXJlIGV4cGlyZWRBdHMgcGFzdCBpdHMgYm91bmQgd2l0aG91dCBtb3ZpbmcgY29tcGxldGVTaW5jZSBlYXJseVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIGNvbnN0IGV4cGlyaWVzID0gbmV3IE1hcChbXG4gICAgICBbXCJhXCIsIGF0ICsgNjBfMDAwXSxcbiAgICAgIFtcImJcIiwgYXQgKyA2MF8wMTBdLFxuICAgICAgW1wiY1wiLCBhdCArIDEyMF8wMDBdLFxuICAgIF0pO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2Vyczoge1xuICAgICAgICByZWFkOiBqZXN0LmZuKFxuICAgICAgICAgIGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KFxuICAgICAgICAgICAgICB0YWdzLm1hcCgodGFnKSA9PiBbXG4gICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgIHsgc3RhbGVBdDogYXQgLSAxMDAwLCBleHBpcmVkQXQ6IGV4cGlyaWVzLmdldCh0YWcpIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeTogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICBtYXhUcmFja2VkVGFnczogMSxcbiAgICB9KTtcbiAgICBjb25zdCBzdGFydCA9IG1hcmtlcnMuY29tcGxldGVTaW5jZTtcbiAgICAvLyBcImFcIiwgdGhlbiBcImJcIiwgZHJvcHBlZCBmb3Igc3BhY2U6IHR3byBleHBpcmVkQXRzIHBhc3QgYSBib3VuZCBvZiBvbmUuXG4gICAgZm9yIChjb25zdCB0YWcgb2YgW1wiYVwiLCBcImJcIiwgXCJjXCJdKSB7XG4gICAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbdGFnXSk7XG4gICAgfVxuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuXG4gICAgY29uc3Qgbm93ID0gamVzdC5zcHlPbihwZXJmb3JtYW5jZSwgXCJub3dcIik7XG4gICAgdHJ5IHtcbiAgICAgIG5vdy5tb2NrUmV0dXJuVmFsdWUoYXQgKyA1OV85OTkgLSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luKTtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuICAgICAgLy8gTWVyZ2VkOiBcImJcIidzIGZyb20gXCJhXCIncywgMTAgbXMgZWFybHkuXG4gICAgICBub3cubW9ja1JldHVyblZhbHVlKGF0ICsgNjBfMDAwIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgICBleHBlY3QobWFya2Vycy5jb21wbGV0ZVNpbmNlKS50b0JlKGF0ICsgNjBfMDEwKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbm93Lm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdChcImRvZXMgbm90IGpvaW4gYSBuZWFyIGV4cGlyZWRBdCB0byBmYXIgb25lcyBwYXN0IGl0cyBib3VuZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIGNvbnN0IHllYXIgPSAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IGV4cGlyaWVzID0gbmV3IE1hcChbXG4gICAgICBbXCJhXCIsIGF0ICsgeWVhcl0sXG4gICAgICBbXCJiXCIsIGF0ICsgeWVhciArIDEwXSxcbiAgICAgIFtcImNcIiwgYXQgKyA2MF8wMDBdLFxuICAgIF0pO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2Vyczoge1xuICAgICAgICByZWFkOiBqZXN0LmZuKFxuICAgICAgICAgIGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KFxuICAgICAgICAgICAgICB0YWdzLm1hcCgodGFnKSA9PiBbXG4gICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgIHsgc3RhbGVBdDogYXQgLSAxMDAwLCBleHBpcmVkQXQ6IGV4cGlyaWVzLmdldCh0YWcpIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeTogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICBtYXhUcmFja2VkVGFnczogMixcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBbXCJhXCIsIFwiYlwiLCBcImNcIiwgXCJkXCIsIFwiZVwiXSkge1xuICAgICAgYXdhaXQgbWFya2Vycy5lbnN1cmUoW3RhZ10pO1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBqZXN0XG4gICAgICAuc3B5T24ocGVyZm9ybWFuY2UsIFwibm93XCIpXG4gICAgICAubW9ja1JldHVyblZhbHVlKGF0ICsgNjBfMDAwIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFwiYVwiIGFuZCBcImJcIiBhcmUgbWVyZ2VkLCBub3QgXCJjXCIgaW50byBcImFcIjogYGNvbXBsZXRlU2luY2VgIGEgeWVhclxuICAgICAgLy8gZWFybHkgd291bGQgaGF2ZSBldmVyeSBoZWxkIGVudHJ5IHJlYWQgaXRzIG1hcmtlcnMgZmlyc3QgdW50aWwgdGhlbi5cbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoYXQgKyA2MF8wMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBub3cubW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwibWVyZ2VzIHRoZSBjbG9zZXN0IGZ1dHVyZSBleHBpcmVkQXRzIHBhc3QgaXRzIGJvdW5kXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgY29uc3QgZXhwaXJpZXMgPSBuZXcgTWFwKFtcbiAgICAgIFtcImFcIiwgYXQgKyA2MF8wMDBdLFxuICAgICAgW1wiYlwiLCBhdCArIDEyMF8wMDBdLFxuICAgICAgW1wiY1wiLCBhdCArIDYwXzAxMF0sXG4gICAgXSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7XG4gICAgICAgIHJlYWQ6IGplc3QuZm4oXG4gICAgICAgICAgYXN5bmMgKHRhZ3M6IHN0cmluZ1tdKSA9PlxuICAgICAgICAgICAgbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oXG4gICAgICAgICAgICAgIHRhZ3MubWFwKCh0YWcpID0+IFtcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgeyBzdGFsZUF0OiBhdCAtIDEwMDAsIGV4cGlyZWRBdDogZXhwaXJpZXMuZ2V0KHRhZykgfSxcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5OiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIG1heFRyYWNrZWRUYWdzOiAyLFxuICAgIH0pO1xuICAgIC8vIFwiYVwiLCBcImJcIiwgdGhlbiBcImNcIiBkcm9wcGVkIGZvciBzcGFjZTogdGhyZWUgZXhwaXJlZEF0cyBwYXN0IGEgYm91bmQgb2ZcbiAgICAvLyB0d28sIGFuZCBcImNcIiBpcyAxMCBtcyBmcm9tIFwiYVwiLlxuICAgIGZvciAoY29uc3QgdGFnIG9mIFtcImFcIiwgXCJiXCIsIFwiY1wiLCBcImRcIiwgXCJlXCJdKSB7XG4gICAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbdGFnXSk7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gbWFya2Vycy5jb21wbGV0ZVNpbmNlO1xuXG4gICAgY29uc3Qgbm93ID0gamVzdC5zcHlPbihwZXJmb3JtYW5jZSwgXCJub3dcIik7XG4gICAgdHJ5IHtcbiAgICAgIG5vdy5tb2NrUmV0dXJuVmFsdWUoYXQgKyA1OV85OTkgLSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luKTtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuICAgICAgbm93Lm1vY2tSZXR1cm5WYWx1ZShhdCArIDYwXzAwMCAtIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShhdCArIDYwXzAxMCk7XG4gICAgICBub3cubW9ja1JldHVyblZhbHVlKGF0ICsgMTE5Xzk5OSAtIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShhdCArIDYwXzAxMCk7XG4gICAgICBub3cubW9ja1JldHVyblZhbHVlKGF0ICsgMTIwXzAwMCAtIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShhdCArIDEyMF8wMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBub3cubW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiY2F0Y2hlcyB1cCBvbmx5IGZvciBhbiBlbnRyeSBzdG9yZSBob2xkaW5nIGVudHJpZXMsIGFuZCBub3Qgd2hlbiBldmVyeSBjaGVjayBhc2tzIGFueXdheVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IGluc3RhbmNlID0gKHJlZnJlc2hJbnRlcnZhbE1zOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gamVzdC5mbihhc3luYyAoKSA9PiAoeyByb3dzOiBbXSwgdHJ1bmNhdGVkOiBmYWxzZSB9KSk7XG4gICAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgICBsb2c6IHsgcXVlcnkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgICAgcmVmcmVzaEludGVydmFsTXMsXG4gICAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgbWFya2VycywgcXVlcnkgfTtcbiAgICB9O1xuICAgIGNvbnN0IG5vU3RvcmUgPSBpbnN0YW5jZSgxMDAwKTtcbiAgICBjb25zdCBldmVyeUNoZWNrID0gaW5zdGFuY2UoMCk7XG4gICAgZXZlcnlDaGVjay5tYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IEluZmluaXR5KTtcbiAgICAvLyBBIHN0b3JlLCBidXQgaG9sZGluZyBub3RoaW5nIGEgcmVmcmVzaCBjb3VsZCBleHBpcmUuXG4gICAgY29uc3QgZW1wdHlTdG9yZSA9IGluc3RhbmNlKDEwMDApO1xuICAgIGVtcHR5U3RvcmUubWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiBJbmZpbml0eSk7XG4gICAgY29uc3Qgc3RvcmUgPSBpbnN0YW5jZSgxMDAwKTtcbiAgICBzdG9yZS5tYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIGNsb2NrICs9IDYwXzAwMDtcbiAgICBmb3IgKGNvbnN0IHsgbWFya2VycyB9IG9mIFtub1N0b3JlLCBldmVyeUNoZWNrLCBlbXB0eVN0b3JlLCBzdG9yZV0pIHtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZSh0cnVlKTtcbiAgICAgIGF3YWl0IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiB7fSk7XG4gICAgfVxuICAgIGV4cGVjdChub1N0b3JlLnF1ZXJ5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChldmVyeUNoZWNrLnF1ZXJ5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChlbXB0eVN0b3JlLnF1ZXJ5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChzdG9yZS5xdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICB9KTtcblxuICBpdChcIm1vdmVzIGNvbXBsZXRlU2luY2UgdG8gYSBkcm9wcGVkIG1hcmtlcidzIGZ1dHVyZSBleHBpcmVkQXQgb25seSBvbmNlIGl0IGlzIHBhc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICBjb25zdCByZWFkID0gamVzdC5mbihcbiAgICAgIGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oXG4gICAgICAgICAgdGFncy5tYXAoKHRhZykgPT4gW1xuICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgeyBzdGFsZUF0OiBhdCAtIDEwMDAsIGV4cGlyZWRBdDogYXQgKyA2MF8wMDAgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICApO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeTogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICBtYXhUcmFja2VkVGFnczogMSxcbiAgICB9KTtcbiAgICBjb25zdCBzdGFydCA9IG1hcmtlcnMuY29tcGxldGVTaW5jZTtcbiAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbXCJhXCJdKTtcbiAgICAvLyBcImFcIiBpcyBkcm9wcGVkIGZvciBzcGFjZTogYSB5ZWFyLWxvbmcgYGV4cGlyZWAgd291bGQgb3RoZXJ3aXNlIGtlZXBcbiAgICAvLyBldmVyeSBlbnRyeSByZWFkaW5nIGl0cyBtYXJrZXJzIGZpcnN0IGZvciBhcyBsb25nLlxuICAgIGF3YWl0IG1hcmtlcnMuZW5zdXJlKFtcImJcIl0pO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuXG4gICAgY29uc3QgY2xvY2sgPSBqZXN0XG4gICAgICAuc3B5T24ocGVyZm9ybWFuY2UsIFwibm93XCIpXG4gICAgICAubW9ja1JldHVyblZhbHVlKGF0ICsgNjBfMDAxIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgdHJ5IHtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoYXQgKyA2MF8wMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbG9jay5tb2NrUmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyBvbmx5IHRoZSBsb2cgcm93cyB0aGF0IGNvdWxkIGFwcGx5IHRvIGFuIGVudHJ5IGhlbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjbG9jayA9IDFfMDAwXzAwMDtcbiAgICBjb25zdCBsYXRlciA9IG1hcmtlckNsb2NrKCkgKyA2MF8wMDA7XG4gICAgY29uc3Qgcm93czogUmV2YWxpZGF0aW9uTG9nUm93W10gPSBbXCJvbGRcIiwgXCJuZXdcIl0ubWFwKCh0YWcsIGkpID0+ICh7XG4gICAgICBzazogYCR7U3RyaW5nKGNsb2NrKS5wYWRTdGFydCgxNSwgXCIwXCIpfSMke3RhZ31gLFxuICAgICAgYXQ6IGNsb2NrLFxuICAgICAgdGFnLFxuICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQ6IGkgPT09IDAgPyAxIDogbGF0ZXIgfSxcbiAgICB9KSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93cywgdHJ1bmNhdGVkOiBmYWxzZSB9KSksXG4gICAgICB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDAsXG4gICAgICBtYXhUcmFja2VkVGFnczogMSxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBsZXQgb2xkZXN0ID0gMjtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IG9sZGVzdCk7XG4gICAgY29uc3Qgc3RhcnQgPSBtYXJrZXJzLmNvbXBsZXRlU2luY2U7XG5cbiAgICAvLyBcIm9sZFwiIGNhbiBleHBpcmUgbm90aGluZyBoZWxkLCBzbyBpdCB0YWtlcyBubyByb29tLCBhbmQgXCJuZXdcIiBpc1xuICAgIC8vIGtlcHQgd2l0aG91dCBkcm9wcGluZyBhbnl0aGluZyBmb3Igc3BhY2UuXG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KG1hcmtlcnMuc3RhdGUoW1wibmV3XCJdLCBsYXRlciAtIDEpKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICBleHBlY3QobWFya2Vycy5jb21wbGV0ZVNpbmNlKS50b0JlKHN0YXJ0KTtcblxuICAgIC8vIE9uY2UgZXZlcnkgZW50cnkgaGVsZCBpcyBuZXdlciB0aGFuIGl0LCBcIm5ld1wiIGdvZXMgdG9vLCB0YWtpbmdcbiAgICAvLyBgY29tcGxldGVTaW5jZWAgbm8gZnVydGhlciB0aGFuIHRoZSBvbGRlc3QgZW50cnkgaGVsZC5cbiAgICBvbGRlc3QgPSBsYXRlcjtcbiAgICBjbG9jayArPSAxMDAwO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChtYXJrZXJzLnN0YXRlKFtcIm5ld1wiXSwgbGF0ZXIgLSAxKSkudG9CZShcImZyZXNoXCIpO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUobGF0ZXIpO1xuICB9KTtcblxuICBpdChcInNjYW5zIHRoZSBlbnRyeSBzdG9yZXMgb25jZSBhIG1pbnV0ZSwgcHJ1bmluZyBvbmx5IHdoZW4gdGhlIG9sZGVzdCBtb3Zlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IGxhdGVyID0gbWFya2VyQ2xvY2soKSArIDYwXzAwMDtcbiAgICBjb25zdCByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgc2s6IGAke1N0cmluZyhjbG9jaykucGFkU3RhcnQoMTUsIFwiMFwiKX0jbmV3YCxcbiAgICAgICAgYXQ6IGNsb2NrLFxuICAgICAgICB0YWc6IFwibmV3XCIsXG4gICAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0OiBsYXRlciB9LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgLy8gVGhlIHJvdyBsZWF2ZXMgdGhlIGxvb2tiYWNrIGFmdGVyIHRoZSBmaXJzdCBxdWVyeTogb25seSB0aGUgcHJ1bmVcbiAgICAgIC8vIGNhbiBsZXQgaXQgZ28uXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3RcbiAgICAgICAgICAuZm4oKVxuICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyByb3dzLCB0cnVuY2F0ZWQ6IGZhbHNlIH0pXG4gICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSksXG4gICAgICB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgfSk7XG4gICAgbGV0IGJvdW5kID0gMjtcbiAgICBsZXQgZXhhY3QgPSAyO1xuICAgIGNvbnN0IG9sZGVzdCA9IGplc3QuZm4oKHNjYW46IGJvb2xlYW4pID0+IChzY2FuID8gZXhhY3QgOiBib3VuZCkpO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2Yob2xkZXN0KTtcbiAgICBjb25zdCBwcnVuZSA9IGplc3Quc3B5T24oXG4gICAgICBtYXJrZXJzIGFzIHVua25vd24gYXMgeyBwcnVuZUxvZ2dlZDogKG9sZGVzdDogbnVtYmVyKSA9PiB2b2lkIH0sXG4gICAgICBcInBydW5lTG9nZ2VkXCIsXG4gICAgKTtcblxuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChvbGRlc3QpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCh0cnVlKTtcbiAgICBleHBlY3QocHJ1bmUpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcblxuICAgIC8vIFdpdGhpbiB0aGUgbWludXRlOiB0aGUgYm91bmQsIGFuZCBubyBwcnVuZSB3aGlsZSBpdCBzdGF5cyBwdXQuXG4gICAgY2xvY2sgKz0gMTAwMDtcbiAgICBleGFjdCA9IGxhdGVyO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChvbGRlc3QpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aChmYWxzZSk7XG4gICAgZXhwZWN0KHBydW5lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgZXhwZWN0KG1hcmtlcnMuc3RhdGUoW1wibmV3XCJdLCBsYXRlciAtIDEpKS50b0JlKFwiZXhwaXJlZFwiKTtcblxuICAgIC8vIFRoZSBtaW51dGUncyBzY2FuIGZpbmRzIGV2ZXJ5IGVudHJ5IG5ld2VyIHRoYW4gdGhlIHJvdzogaXQgZ29lcy5cbiAgICBjbG9jayArPSA2MF8wMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KG9sZGVzdCkudG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoKHRydWUpO1xuICAgIGV4cGVjdChwcnVuZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtYXJrZXJzLnN0YXRlKFtcIm5ld1wiXSwgbGF0ZXIgLSAxKSkudG9CZShcImZyZXNoXCIpO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUobGF0ZXIpO1xuXG4gICAgLy8gQW4gZW50cnkgc2V0IHNpbmNlIG1vdmVzIHRoZSBib3VuZCBiYWNrOiBub3RoaW5nIHRvIHBydW5lLlxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYm91bmQgPSAxO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChwcnVuZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICB9KTtcblxuICBpdChcIndhaXRzIGZvciBhIGZyZXNoIHF1ZXJ5IHJhdGhlciB0aGFuIG9uZSBzdGFydGVkIGJlZm9yZSBhIGZyZWV6ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IHF1ZXJpZXM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gICAgY29uc3QgcXVlcnkgPSBqZXN0LmZuKFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IFByb21pc2U8eyByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+KFxuICAgICAgICAgIChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgcXVlcmllcy5wdXNoKCgpID0+IHJlc29sdmUoeyByb3dzOiBbXSwgdHJ1bmNhdGVkOiBmYWxzZSB9KSksXG4gICAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeSB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDEwMDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgICBjYW5GcmVlemU6IHRydWUsXG4gICAgfSk7XG4gICAgbWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiAwKTtcbiAgICBjbG9jayArPSAxMDAwO1xuICAgIC8vIFN0YXJ0ZWQsIG5vdCB3YWl0ZWQgZm9yLCBhbmQgdGhlbiB0aGUgc2FuZGJveCBmcm96ZS5cbiAgICB2b2lkIG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGNsb2NrICs9IDYwXzAwMDtcbiAgICBleHBlY3QobWFya2Vycy5iZWhpbmQpLnRvQmUodHJ1ZSk7XG5cbiAgICBsZXQgY2F1Z2h0VXAgPSBmYWxzZTtcbiAgICBjb25zdCBjYXRjaFVwID0gbWFya2Vyc1xuICAgICAgLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pXG4gICAgICAudGhlbigoKSA9PiAoY2F1Z2h0VXAgPSB0cnVlKSk7XG4gICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgIGV4cGVjdChjYXVnaHRVcCkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KHF1ZXJ5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgIGF3YWl0IGNhdGNoVXA7XG4gICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJ3aXRoIGEgcmVmcmVzaCBpbiBmbGlnaHRcIiwgKCkgPT4ge1xuICAgIGxldCBjbG9jazogbnVtYmVyO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgICBqZXN0LnVzZUZha2VUaW1lcnMoeyBkb05vdEZha2U6IFtcInNldEltbWVkaWF0ZVwiLCBcIm5leHRUaWNrXCJdIH0pO1xuICAgIH0pO1xuICAgIGFmdGVyRWFjaCgoKSA9PiBqZXN0LnVzZVJlYWxUaW1lcnMoKSk7XG5cbiAgICAvKiogTW92ZSB0aGUgY2xvY2sgYW5kIHRoZSB0aW1lcnMgb24gdG9nZXRoZXI6IG5vIGZyZWV6ZS4gKi9cbiAgICBjb25zdCBydW4gPSAobXM6IG51bWJlcikgPT4ge1xuICAgICAgZm9yIChsZXQgc3RlcCA9IDA7IHN0ZXAgPCBtczsgc3RlcCArPSAyNTApIHtcbiAgICAgICAgY2xvY2sgKz0gMjUwO1xuICAgICAgICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMjUwKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGluc3RhbmNlID0gKGZhaWxzID0gZmFsc2UsIGNhbkZyZWV6ZSA9IHRydWUpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJpZXM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gICAgICBjb25zdCBxdWVyeSA9IGplc3QuZm4oXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IFByb21pc2U8eyByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+KFxuICAgICAgICAgICAgKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAgICAgICAgcXVlcmllcy5wdXNoKCgpID0+XG4gICAgICAgICAgICAgICAgZmFpbHNcbiAgICAgICAgICAgICAgICAgID8gcmVqZWN0KG5ldyBFcnJvcihcInRocm90dGxlZFwiKSlcbiAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZSh7IHJvd3M6IFtdLCB0cnVuY2F0ZWQ6IGZhbHNlIH0pLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgICAgbG9nOiB7IHF1ZXJ5IH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgICAgIGNhbkZyZWV6ZSxcbiAgICAgIH0pO1xuICAgICAgbWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiAwKTtcbiAgICAgIHJldHVybiB7IG1hcmtlcnMsIHF1ZXJ5LCBxdWVyaWVzIH07XG4gICAgfTtcblxuICAgIGl0KFwid2FpdHMgZm9yIGEgZnJlc2ggcXVlcnkgYWZ0ZXIgYSBmcmVlemUsIGV2ZW4gb25jZSB0aGUgbGF0ZSB0aWNrIGhhcyBydW5cIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBtYXJrZXJzLCBxdWVyeSwgcXVlcmllcyB9ID0gaW5zdGFuY2UoKTtcbiAgICAgIGNsb2NrICs9IDEwMDA7XG4gICAgICB2b2lkIG1hcmtlcnMucmVmcmVzaCgpO1xuICAgICAgY2xvY2sgKz0gNjBfMDAwO1xuICAgICAgLy8gQWZ0ZXIgdGhlIHRoYXcgdGhlIG92ZXJkdWUgdGljayBjYW4gcnVuIGJlZm9yZSBhbnkgcmVxdWVzdCBkb2VzLlxuICAgICAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDI1MCk7XG5cbiAgICAgIGxldCBjYXVnaHRVcCA9IGZhbHNlO1xuICAgICAgY29uc3QgY2F0Y2hVcCA9IG1hcmtlcnNcbiAgICAgICAgLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pXG4gICAgICAgIC50aGVuKCgpID0+IChjYXVnaHRVcCA9IHRydWUpKTtcbiAgICAgIHF1ZXJpZXMuc2hpZnQoKSEoKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgICAgLy8gV2hhdCB0aGUgZmlyc3QgcXVlcnkga25ldyBwcmVkYXRlcyB0aGUgZnJlZXplLlxuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KGNhdWdodFVwKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChxdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgICAgYXdhaXQgY2F0Y2hVcDtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdChcImluIGEgY29udGFpbmVyLCB3aGljaCBpcyBuZXZlciBmcm96ZW4sIHdhaXRzIG9ubHkgZm9yIHRoZSBxdWVyeSBpbiBmbGlnaHRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBtYXJrZXJzLCBxdWVyeSwgcXVlcmllcyB9ID0gaW5zdGFuY2UoZmFsc2UsIGZhbHNlKTtcbiAgICAgIGNsb2NrICs9IDEwMDA7XG4gICAgICB2b2lkIG1hcmtlcnMucmVmcmVzaCgpO1xuICAgICAgLy8gQSBsb25nIHN0YWxsLCBub3QgYSBmcmVlemU6IG5vIHRpbWVyIHRvIHRlbGwgdGhlbSBhcGFydCwgbm9uZSBuZWVkZWQuXG4gICAgICBjbG9jayArPSA2MF8wMDA7XG5cbiAgICAgIGNvbnN0IGNhdGNoVXAgPSBtYXJrZXJzLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pO1xuICAgICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgICAgYXdhaXQgY2F0Y2hVcDtcbiAgICAgIGV4cGVjdChxdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KFwiaXMgY2F1Z2h0IHVwIG9uY2UgdGhlIGNhdGNoLXVwJ3Mgc2xvdyBxdWVyeSByZXR1cm5zLCB0aGUgcHJvY2VzcyBydW5uaW5nIHRocm91Z2hvdXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBmYWlscyBvZiBbZmFsc2UsIHRydWVdKSB7XG4gICAgICAgIGNvbnN0IHsgbWFya2VycywgcXVlcmllcyB9ID0gaW5zdGFuY2UoZmFpbHMpO1xuICAgICAgICBjbG9jayArPSA2MF8wMDA7XG4gICAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZSh0cnVlKTtcbiAgICAgICAgY29uc3QgY2F0Y2hVcCA9IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiB7fSk7XG4gICAgICAgIHJ1bigzMDAwKTtcbiAgICAgICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgICAgICBhd2FpdCBjYXRjaFVwO1xuICAgICAgICAvLyBPciB0aGUgZmlyc3QgYCd1c2UgY2FjaGUnYCBsb29rdXAgd291bGQgd2FpdCBmb3IgYW5vdGhlciBxdWVyeSxcbiAgICAgICAgLy8gaW5zaWRlIHRoZSByZW5kZXI6IG9uZSByZXF1ZXN0LCB0d28gd2FpdHMuXG4gICAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdChcIndhaXRzIG9ubHkgZm9yIGEgc2xvdyBxdWVyeSBpbiBmbGlnaHQsIHRoZSBwcm9jZXNzIHJ1bm5pbmcgdGhyb3VnaG91dFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IG1hcmtlcnMsIHF1ZXJ5LCBxdWVyaWVzIH0gPSBpbnN0YW5jZSgpO1xuICAgICAgY2xvY2sgKz0gNjBfMDAwO1xuICAgICAgY29uc3QgZmlyc3QgPSBtYXJrZXJzLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pO1xuICAgICAgcnVuKDI1MDApO1xuICAgICAgLy8gUGFzdCB0aGUgZ3JhY2UgaW50byB0aGUgcXVlcnksIGJ1dCB0aGUgcXVlcnkgaXMgYXMgZnJlc2ggYXMgYW55LlxuICAgICAgbGV0IGNhdWdodFVwID0gZmFsc2U7XG4gICAgICBjb25zdCBzZWNvbmQgPSBtYXJrZXJzXG4gICAgICAgIC5jYXRjaFVwKGFzeW5jICgpID0+IHt9KVxuICAgICAgICAudGhlbigoKSA9PiAoY2F1Z2h0VXAgPSB0cnVlKSk7XG4gICAgICBxdWVyaWVzLnNoaWZ0KCkhKCk7XG4gICAgICBhd2FpdCBmaXJzdDtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgICAgZXhwZWN0KGNhdWdodFVwKS50b0JlKHRydWUpO1xuICAgICAgYXdhaXQgc2Vjb25kO1xuICAgICAgZXhwZWN0KHF1ZXJ5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3Qgc2tpcCBhIHJvdyBmb3IgYW4gdW50cmFja2VkIHRhZyB0aGF0IGl0cyBmaXJzdCByZWFkIG1pc3NlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGhlIHdyaXRlciBwdXRzIHRoZSBsb2cgcm93IGFuZCB0aGUgbWFya2VyIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGVcbiAgICAvLyBtYXJrZXIgcmVhZCBpcyBldmVudHVhbGx5IGNvbnNpc3RlbnQ6IGByZWZyZXNoYCBjYW4gc2VlIHRoZSByb3csIHRoZW5cbiAgICAvLyBgZW5zdXJlYCByZWFkIHRoZSBtYXJrZXIgZnJvbSBiZWZvcmUgaXQuIE1hcmtlZCBhcHBsaWVkIHdoaWxlIHRoZSB0YWdcbiAgICAvLyB3YXMgdW50cmFja2VkLCB0aGUgcm93IHdhcyBza2lwcGVkIGJ5IGV2ZXJ5IHF1ZXJ5IHRoZSBsb29rYmFjayByZXR1cm5lZFxuICAgIC8vIGl0IHRvLCBhbmQgdGhlIGluc3RhbmNlIHNlcnZlZCB0aGUgc3RhbGUgZW50cnkgdW50aWwgdGhlIHJvbGxpbmcgcmUtcmVhZC5cbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3QgcmV2YWxpZGF0ZWRBdCA9IDk5OV8wMDA7XG4gICAgY29uc3Qgcm93OiBSZXZhbGlkYXRpb25Mb2dSb3cgPSB7XG4gICAgICBzazogYCR7U3RyaW5nKGNsb2NrKS5wYWRTdGFydCgxNSwgXCIwXCIpfSNwb3N0c2AsXG4gICAgICBhdDogY2xvY2ssXG4gICAgICB0YWc6IFwicG9zdHNcIixcbiAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0IH0sXG4gICAgfTtcbiAgICBjb25zdCBxdWVyeSA9IGplc3QuZm4oYXN5bmMgKHNpbmNlOiBudW1iZXIpID0+ICh7XG4gICAgICByb3dzOiBbcm93XS5maWx0ZXIoKHIpID0+IHIuYXQgPj0gc2luY2UpLFxuICAgICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgICB9KSk7XG4gICAgLy8gQSByZXBsaWNhIHRoYXQgaGFzIG5vdCBzZWVuIHRoZSB3cml0ZSB5ZXQuXG4gICAgY29uc3QgcmVhZCA9IGplc3QuZm4oYXN5bmMgKCkgPT4gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5IH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICAgIHJhbmRvbTogKCkgPT4gMCxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIGF3YWl0IG1hcmtlcnMuZW5zdXJlKFtcIm90aGVyXCJdKTtcblxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgLy8gVGhlIHJvdyBzZWVuIGJlZm9yZSB0aGUgcmVhZCBpcyBhcHBsaWVkIHRvIHdoYXQgdGhlIHJlYWQgZm91bmQuXG4gICAgYXdhaXQgbWFya2Vycy5lbnN1cmUoW1wicG9zdHNcIl0pO1xuICAgIGV4cGVjdChtYXJrZXJzLmdldChcInBvc3RzXCIpKS50b0VxdWFsKHsgcmV2YWxpZGF0ZWRBdCB9KTtcblxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KHF1ZXJ5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgZXhwZWN0KG1hcmtlcnMuZ2V0KFwicG9zdHNcIikpLnRvRXF1YWwoeyByZXZhbGlkYXRlZEF0IH0pO1xuICAgIC8vIE9ubHkgdGhlIG9uZSByZWFkIGVhY2ggdGFnJ3MgZmlyc3QgdXNlIGNvc3RzLlxuICAgIGV4cGVjdChyZWFkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gIH0pO1xufSk7XG4iXX0=
|