experimental-agent 0.0.4 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/agent-workflow.d.mts +2 -3
  2. package/dist/agent-workflow.d.ts +2 -3
  3. package/dist/agent-workflow.js +947 -436
  4. package/dist/agent-workflow.mjs +3 -2
  5. package/dist/chunk-2IIWVPZB.mjs +334 -0
  6. package/dist/chunk-A63YU65A.mjs +20 -0
  7. package/dist/{chunk-3ODWQVIA.mjs → chunk-BJTO5JO5.mjs} +1 -2
  8. package/dist/chunk-GJETDXOU.mjs +361 -0
  9. package/dist/chunk-RDKDLHXM.mjs +2031 -0
  10. package/dist/{chunk-T7PMZLOX.mjs → chunk-T2UUL6VC.mjs} +4 -4
  11. package/dist/{chunk-TQRCSTCF.mjs → chunk-VGJISV6O.mjs} +9 -4
  12. package/dist/chunk-VS7U6SXN.mjs +1261 -0
  13. package/dist/{client-SREKHM6I.mjs → client-66JIQLSA.mjs} +2 -2
  14. package/dist/client-DjcE0ATp.d.mts +710 -0
  15. package/dist/client-DwrDzn4_.d.ts +710 -0
  16. package/dist/client.mjs +1 -1
  17. package/dist/{handler-36FM5H35.mjs → handler-BQY5SOI2.mjs} +2 -2
  18. package/dist/index.d.mts +18 -4
  19. package/dist/index.d.ts +18 -4
  20. package/dist/index.js +1178 -509
  21. package/dist/index.mjs +152 -49
  22. package/dist/lifecycle-workflow.d.mts +3 -2
  23. package/dist/lifecycle-workflow.d.ts +3 -2
  24. package/dist/lifecycle-workflow.js +111 -5
  25. package/dist/lifecycle-workflow.mjs +3 -2
  26. package/dist/local-fs-handlers-Q5W52DKV.mjs +290 -0
  27. package/dist/next/loader.js +7 -7
  28. package/dist/next/loader.mjs +3 -3
  29. package/dist/next.js +9 -4
  30. package/dist/next.mjs +11 -6
  31. package/dist/{process-manager-JAKAXROL.mjs → process-manager-ZCET3VD2.mjs} +1 -1
  32. package/dist/{sandbox-QAPGBVYM.mjs → sandbox-27X2DSE3.mjs} +4 -3
  33. package/dist/{storage-Q376OZH3.mjs → storage-KQYV42J4.mjs} +3 -3
  34. package/dist/{client-6g79J0s3.d.mts → types-DuTc4UQW.d.mts} +229 -590
  35. package/dist/{client-6g79J0s3.d.ts → types-DuTc4UQW.d.ts} +229 -590
  36. package/dist/vercel-SD3JTECG.mjs +20 -0
  37. package/dist/{vercel-sdk-VHKEX2GQ.mjs → vercel-sdk-I6A4MVAN.mjs} +3 -3
  38. package/package.json +3 -3
  39. package/dist/chunk-GSRJYPWF.mjs +0 -284
  40. package/dist/chunk-JCPQQWIK.mjs +0 -2057
  41. package/dist/chunk-JEE2FQ4O.mjs +0 -844
  42. package/dist/chunk-VBLZWXVE.mjs +0 -318
  43. package/dist/local-fs-handlers-P4WGW3QY.mjs +0 -235
  44. package/dist/vercel-LLXAHKVJ.mjs +0 -20
@@ -30,6 +30,24 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  ));
31
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
32
 
33
+ // src/rpc-registry.ts
34
+ function resolveRpc(name) {
35
+ const fn = registry.get(name);
36
+ if (!fn) {
37
+ throw new Error(
38
+ `No RPC registered for agent "${name}". Ensure withAgent is set up in next.config.ts.`
39
+ );
40
+ }
41
+ return fn;
42
+ }
43
+ var registry;
44
+ var init_rpc_registry = __esm({
45
+ "src/rpc-registry.ts"() {
46
+ "use strict";
47
+ registry = /* @__PURE__ */ new Map();
48
+ }
49
+ });
50
+
33
51
  // src/sandbox/process-manager.ts
34
52
  var process_manager_exports = {};
35
53
  __export(process_manager_exports, {
@@ -458,6 +476,56 @@ function getStorageClient(rpcFn, name) {
458
476
  return new StorageError({ reason: String(e), cause: e });
459
477
  }
460
478
  }
479
+ },
480
+ acquireLock: async (record, lockTimeoutMs) => {
481
+ try {
482
+ return await rpc("sandbox.acquireLock", {
483
+ record,
484
+ lockTimeoutMs
485
+ });
486
+ } catch (e) {
487
+ if (e instanceof StorageError) {
488
+ return e;
489
+ }
490
+ return new StorageError({ reason: String(e), cause: e });
491
+ }
492
+ }
493
+ },
494
+ setup: {
495
+ get: async (key) => {
496
+ try {
497
+ return await rpc("setup.get", { key });
498
+ } catch (e) {
499
+ if (e instanceof StorageError) {
500
+ return e;
501
+ }
502
+ return new StorageError({ reason: String(e), cause: e });
503
+ }
504
+ },
505
+ set: async (snapshot) => {
506
+ try {
507
+ await rpc("setup.set", snapshot);
508
+ return snapshot;
509
+ } catch (e) {
510
+ if (e instanceof StorageError) {
511
+ return e;
512
+ }
513
+ return new StorageError({ reason: String(e), cause: e });
514
+ }
515
+ },
516
+ acquireLock: async (key, lockId, lockTimeoutMs) => {
517
+ try {
518
+ return await rpc("setup.acquireLock", {
519
+ key,
520
+ lockId,
521
+ lockTimeoutMs
522
+ });
523
+ } catch (e) {
524
+ if (e instanceof StorageError) {
525
+ return e;
526
+ }
527
+ return new StorageError({ reason: String(e), cause: e });
528
+ }
461
529
  }
462
530
  },
463
531
  command: {
@@ -514,7 +582,41 @@ var init_client = __esm({
514
582
  }
515
583
  });
516
584
 
585
+ // src/utils/debug.ts
586
+ function debug(...args) {
587
+ if (enabled) {
588
+ console.log(...args);
589
+ }
590
+ }
591
+ var enabled;
592
+ var init_debug = __esm({
593
+ "src/utils/debug.ts"() {
594
+ "use strict";
595
+ enabled = process.env.AGENT_DEBUG === "1" || process.env.AGENT_DEBUG === "true";
596
+ }
597
+ });
598
+
517
599
  // src/sandbox/write-files.ts
600
+ async function execChecked(sandbox, opts, errorLabel) {
601
+ for (let attempt = 0; ; attempt++) {
602
+ const execResult = await sandbox.exec(opts);
603
+ if (execResult instanceof Error) {
604
+ throw execResult;
605
+ }
606
+ const result = await execResult.result;
607
+ if (result.exitCode === 0) {
608
+ return result;
609
+ }
610
+ const isTransient = result.exitCode === 255 && !result.stderr.trim();
611
+ if (isTransient && attempt < MAX_RETRIES) {
612
+ await new Promise((r) => setTimeout(r, RETRY_BASE_MS * (attempt + 1)));
613
+ continue;
614
+ }
615
+ throw new Error(
616
+ `${errorLabel} with exit code ${result.exitCode}: ${result.stderr}`
617
+ );
618
+ }
619
+ }
518
620
  async function writeFiles(opts) {
519
621
  const { sandbox, files, destPath } = opts;
520
622
  if (files.length === 0) {
@@ -540,24 +642,19 @@ async function writeFiles(opts) {
540
642
  const base64Content = toBase64(file.content);
541
643
  if (base64Content.length < CHUNK_SIZE) {
542
644
  const marker = `EOF_${i}`;
543
- const execResult = await sandbox.exec({
544
- command: "bash",
545
- args: [
546
- "-c",
547
- `base64 -d > ${quote(fullPath)} << '${marker}'
645
+ await execChecked(
646
+ sandbox,
647
+ {
648
+ command: "bash",
649
+ args: [
650
+ "-c",
651
+ `base64 -d > ${quote(fullPath)} << '${marker}'
548
652
  ${base64Content}
549
653
  ${marker}`
550
- ]
551
- });
552
- if (execResult instanceof Error) {
553
- throw execResult;
554
- }
555
- const { exitCode, stderr } = await execResult.result;
556
- if (exitCode !== 0) {
557
- throw new Error(
558
- `writeFiles failed with exit code ${exitCode}: ${stderr}`
559
- );
560
- }
654
+ ]
655
+ },
656
+ "writeFiles failed"
657
+ );
561
658
  } else {
562
659
  const tempB64 = `/tmp/chunk-${Date.now()}-${i}.b64`;
563
660
  const clearResult = await sandbox.exec({
@@ -571,41 +668,31 @@ ${marker}`
571
668
  for (let offset = 0; offset < base64Content.length; offset += CHUNK_SIZE) {
572
669
  const chunk = base64Content.slice(offset, offset + CHUNK_SIZE);
573
670
  const marker = `CHUNK_${offset}`;
574
- const appendResult = await sandbox.exec({
575
- command: "bash",
576
- args: [
577
- "-c",
578
- `cat >> ${quote(tempB64)} << '${marker}'
671
+ await execChecked(
672
+ sandbox,
673
+ {
674
+ command: "bash",
675
+ args: [
676
+ "-c",
677
+ `cat >> ${quote(tempB64)} << '${marker}'
579
678
  ${chunk}
580
679
  ${marker}`
581
- ]
582
- });
583
- if (appendResult instanceof Error) {
584
- throw appendResult;
585
- }
586
- const { exitCode: exitCode2, stderr: stderr2 } = await appendResult.result;
587
- if (exitCode2 !== 0) {
588
- throw new Error(
589
- `writeFiles chunk failed with exit code ${exitCode2}: ${stderr2}`
590
- );
591
- }
592
- }
593
- const decodeResult = await sandbox.exec({
594
- command: "bash",
595
- args: [
596
- "-c",
597
- `base64 -d < ${quote(tempB64)} > ${quote(fullPath)} && rm -f ${quote(tempB64)}`
598
- ]
599
- });
600
- if (decodeResult instanceof Error) {
601
- throw decodeResult;
602
- }
603
- const { exitCode, stderr } = await decodeResult.result;
604
- if (exitCode !== 0) {
605
- throw new Error(
606
- `writeFiles decode failed with exit code ${exitCode}: ${stderr}`
680
+ ]
681
+ },
682
+ "writeFiles chunk failed"
607
683
  );
608
684
  }
685
+ await execChecked(
686
+ sandbox,
687
+ {
688
+ command: "bash",
689
+ args: [
690
+ "-c",
691
+ `base64 -d < ${quote(tempB64)} > ${quote(fullPath)} && rm -f ${quote(tempB64)}`
692
+ ]
693
+ },
694
+ "writeFiles decode failed"
695
+ );
609
696
  }
610
697
  }
611
698
  if (shellScripts.length > 0) {
@@ -628,27 +715,34 @@ function toBase64(content) {
628
715
  function quote(s) {
629
716
  return `'${s.replace(/'/g, "'\\''")}'`;
630
717
  }
631
- var path;
718
+ var path, MAX_RETRIES, RETRY_BASE_MS;
632
719
  var init_write_files = __esm({
633
720
  "src/sandbox/write-files.ts"() {
634
721
  "use strict";
635
722
  path = __toESM(require("path"));
723
+ MAX_RETRIES = 2;
724
+ RETRY_BASE_MS = 500;
636
725
  }
637
726
  });
638
727
 
639
728
  // src/sandbox/bindings/local.ts
640
- var import_node_child_process, errore2, import_ulid, localSandbox;
729
+ var import_node_child_process, fs, path2, errore2, import_ulid, localSandbox;
641
730
  var init_local = __esm({
642
731
  "src/sandbox/bindings/local.ts"() {
643
732
  "use strict";
644
733
  import_node_child_process = require("child_process");
734
+ fs = __toESM(require("fs/promises"));
735
+ path2 = __toESM(require("path"));
645
736
  errore2 = __toESM(require("errore"));
646
737
  import_ulid = require("ulid");
647
738
  init_errors();
739
+ init_debug();
648
740
  init_write_files();
649
741
  localSandbox = ({
650
742
  sandboxRecord,
651
- storage
743
+ storage,
744
+ setup,
745
+ onRestart
652
746
  }) => {
653
747
  const config = sandboxRecord.config;
654
748
  const basePath = config.path ?? process.cwd();
@@ -682,7 +776,7 @@ var init_local = __esm({
682
776
  logQueue.push({ stream: "stderr", data: str });
683
777
  logResolve?.();
684
778
  });
685
- const result = new Promise((resolve, reject) => {
779
+ const result2 = new Promise((resolve, reject) => {
686
780
  child.on("error", (err) => {
687
781
  processes.delete(commandId);
688
782
  closed = true;
@@ -709,7 +803,7 @@ var init_local = __esm({
709
803
  }
710
804
  }
711
805
  }
712
- return Promise.resolve({ commandId, logs, result });
806
+ return Promise.resolve({ commandId, logs, result: result2 });
713
807
  },
714
808
  catch: (e) => new SandboxError({ reason: String(e), cause: e })
715
809
  });
@@ -730,16 +824,32 @@ var init_local = __esm({
730
824
  return new SandboxError({ reason: cmd.message, cause: cmd });
731
825
  }
732
826
  if (cmd && cmd.status === "running") {
733
- const result = await storage2.command.set({
827
+ const result2 = await storage2.command.set({
734
828
  ...cmd,
735
829
  status: "killed"
736
830
  });
737
- if (result instanceof Error) {
738
- return new SandboxError({ reason: result.message, cause: result });
831
+ if (result2 instanceof Error) {
832
+ return new SandboxError({ reason: result2.message, cause: result2 });
833
+ }
834
+ }
835
+ },
836
+ readFile: async ({ path: filePath }) => {
837
+ const fullPath = path2.join(basePath, filePath);
838
+ try {
839
+ return await fs.readFile(fullPath);
840
+ } catch (e) {
841
+ if (e instanceof Error && "code" in e && e.code === "ENOENT") {
842
+ return null;
739
843
  }
844
+ return new SandboxError({ reason: String(e), cause: e });
740
845
  }
741
846
  },
742
847
  writeFiles: (opts) => writeFiles({ sandbox, ...opts }),
848
+ updateNetworkPolicy: () => Promise.resolve(
849
+ new SandboxError({
850
+ reason: "updateNetworkPolicy is only available for Vercel sandboxes"
851
+ })
852
+ ),
743
853
  tag: {
744
854
  list: async () => {
745
855
  const sandboxRecord2 = await storage.sandbox.get(sandbox.id);
@@ -756,28 +866,70 @@ var init_local = __esm({
756
866
  return sandboxRecord2.tags?.[key];
757
867
  },
758
868
  set: async (key, value) => {
759
- const result = await storage.sandbox.tag.set({
869
+ const result2 = await storage.sandbox.tag.set({
760
870
  sandboxId: sandbox.id,
761
871
  tags: { [key]: value }
762
872
  });
763
- if (result instanceof Error) {
764
- return result;
873
+ if (result2 instanceof Error) {
874
+ return result2;
765
875
  }
766
876
  return void 0;
767
877
  },
768
878
  setMany: async (tags) => {
769
- const result = await storage.sandbox.tag.set({
879
+ const result2 = await storage.sandbox.tag.set({
770
880
  sandboxId: sandbox.id,
771
881
  tags
772
882
  });
773
- if (result instanceof Error) {
774
- return result;
883
+ if (result2 instanceof Error) {
884
+ return result2;
775
885
  }
776
886
  return void 0;
777
887
  }
778
888
  }
779
889
  };
780
- return sandbox;
890
+ const result = sandbox;
891
+ if (setup || onRestart) {
892
+ let resolveSetupMeta;
893
+ result._setupMeta = new Promise((r) => {
894
+ resolveSetupMeta = r;
895
+ });
896
+ result._onReady = (async () => {
897
+ let needsSetupRun = !!setup;
898
+ if (setup) {
899
+ const existing = await storage.setup.get(setup.key);
900
+ if (!(existing instanceof Error) && existing) {
901
+ debug(
902
+ `[sandbox:setup] setup already complete for key "${setup.key}", skipping`
903
+ );
904
+ needsSetupRun = false;
905
+ }
906
+ }
907
+ resolveSetupMeta({
908
+ needsSetupRun,
909
+ createdFromSnapshot: false
910
+ });
911
+ if (needsSetupRun && setup) {
912
+ debug(`[sandbox:setup] running setup.run (local, key="${setup.key}")`);
913
+ await setup.run(sandbox);
914
+ await storage.setup.set({
915
+ key: setup.key,
916
+ snapshotId: null,
917
+ createdAt: Date.now(),
918
+ lastUsedAt: null,
919
+ acquiringLockId: null,
920
+ acquiringLockAt: null
921
+ });
922
+ debug(
923
+ `[sandbox:setup] setup complete, stored record (key="${setup.key}")`
924
+ );
925
+ }
926
+ if (onRestart) {
927
+ debug("[sandbox:setup] running onRestart (local)");
928
+ await onRestart(sandbox);
929
+ }
930
+ })();
931
+ }
932
+ return result;
781
933
  };
782
934
  }
783
935
  });
@@ -791,7 +943,7 @@ var import_sandbox;
791
943
  var init_vercel_sdk = __esm({
792
944
  "src/sandbox/bindings/vercel-sdk.ts"() {
793
945
  "use strict";
794
- import_sandbox = require("sandbox");
946
+ import_sandbox = require("@vercel/sandbox");
795
947
  }
796
948
  });
797
949
 
@@ -802,7 +954,7 @@ function ListResultSchema(itemSchema) {
802
954
  nextCursor: import_zod3.z.string().nullable()
803
955
  });
804
956
  }
805
- var import_zod3, VercelLifecycleConfigSchema, SandboxConfigSchema, GenerationSchema, SessionSchema, StepUsageSchema, UsageSummarySchema, MessageUsageSchema, MessageSchema, PartSchema, CommandResultSchema, SandboxRecordSchema, CommandBaseSchema, CommandSchema, methods, STORAGE_RPC_METHODS;
957
+ var import_zod3, VercelLifecycleConfigSchema, NetworkPolicySchema, SandboxConfigSchema, GenerationSchema, SessionSchema, StepUsageSchema, UsageSummarySchema, MessageUsageSchema, MessageSchema, PartSchema, CommandResultSchema, SandboxRecordSchema, CommandBaseSchema, CommandSchema, SetupSnapshotSchema, methods, STORAGE_RPC_METHODS;
806
958
  var init_rpc = __esm({
807
959
  "src/storage/rpc.ts"() {
808
960
  "use strict";
@@ -814,12 +966,24 @@ var init_rpc = __esm({
814
966
  snapshotId: import_zod3.z.string().optional(),
815
967
  autoStart: import_zod3.z.boolean().optional()
816
968
  });
969
+ NetworkPolicySchema = import_zod3.z.union([
970
+ import_zod3.z.literal("allow-all"),
971
+ import_zod3.z.literal("deny-all"),
972
+ import_zod3.z.object({
973
+ allow: import_zod3.z.array(import_zod3.z.string()).optional(),
974
+ subnets: import_zod3.z.object({
975
+ allow: import_zod3.z.array(import_zod3.z.string()).optional(),
976
+ deny: import_zod3.z.array(import_zod3.z.string()).optional()
977
+ }).optional()
978
+ })
979
+ ]).optional();
817
980
  SandboxConfigSchema = import_zod3.z.discriminatedUnion("type", [
818
981
  import_zod3.z.object({
819
982
  type: import_zod3.z.literal("vercel"),
820
983
  resources: import_zod3.z.object({ vcpus: import_zod3.z.number() }).optional(),
821
984
  ports: import_zod3.z.array(import_zod3.z.number()).optional(),
822
- lifecycle: VercelLifecycleConfigSchema.optional()
985
+ lifecycle: VercelLifecycleConfigSchema.optional(),
986
+ networkPolicy: NetworkPolicySchema
823
987
  }),
824
988
  import_zod3.z.object({
825
989
  type: import_zod3.z.literal("local"),
@@ -941,6 +1105,14 @@ var init_rpc = __esm({
941
1105
  result: CommandResultSchema
942
1106
  })
943
1107
  ]);
1108
+ SetupSnapshotSchema = import_zod3.z.object({
1109
+ key: import_zod3.z.string(),
1110
+ snapshotId: import_zod3.z.string().nullable(),
1111
+ createdAt: import_zod3.z.number(),
1112
+ lastUsedAt: import_zod3.z.number().nullable(),
1113
+ acquiringLockId: import_zod3.z.string().nullable(),
1114
+ acquiringLockAt: import_zod3.z.number().nullable()
1115
+ });
944
1116
  methods = {
945
1117
  "session.get": {
946
1118
  params: import_zod3.z.object({ id: import_zod3.z.string() }),
@@ -1075,6 +1247,29 @@ var init_rpc = __esm({
1075
1247
  limit: import_zod3.z.number().optional()
1076
1248
  }),
1077
1249
  result: ListResultSchema(CommandSchema)
1250
+ },
1251
+ "setup.get": {
1252
+ params: import_zod3.z.object({ key: import_zod3.z.string() }),
1253
+ result: SetupSnapshotSchema.nullable()
1254
+ },
1255
+ "setup.set": {
1256
+ params: SetupSnapshotSchema,
1257
+ result: import_zod3.z.void()
1258
+ },
1259
+ "setup.acquireLock": {
1260
+ params: import_zod3.z.object({
1261
+ key: import_zod3.z.string(),
1262
+ lockId: import_zod3.z.string(),
1263
+ lockTimeoutMs: import_zod3.z.number()
1264
+ }),
1265
+ result: SetupSnapshotSchema.nullable()
1266
+ },
1267
+ "sandbox.acquireLock": {
1268
+ params: import_zod3.z.object({
1269
+ record: SandboxRecordSchema,
1270
+ lockTimeoutMs: import_zod3.z.number()
1271
+ }),
1272
+ result: SandboxRecordSchema.nullable()
1078
1273
  }
1079
1274
  };
1080
1275
  STORAGE_RPC_METHODS = Object.keys(methods);
@@ -1143,9 +1338,10 @@ async function checkAndSnapshotStep(input) {
1143
1338
  "use step";
1144
1339
  const { Sandbox: VercelSandboxSDK2 } = await Promise.resolve().then(() => (init_vercel_sdk(), vercel_sdk_exports));
1145
1340
  const { getStorage: getStorage2 } = await Promise.resolve().then(() => (init_storage(), storage_exports));
1341
+ const rpc = resolveRpc(input.storageConfig.name ?? "default");
1146
1342
  const storage = getStorage2({
1147
1343
  config: input.storageConfig,
1148
- rpc: input.rpc
1344
+ rpc
1149
1345
  });
1150
1346
  const record = await storage.sandbox.get(input.id);
1151
1347
  if (record instanceof Error) {
@@ -1212,6 +1408,7 @@ var DEFAULT_POLL_INTERVAL_MS, DEFAULT_IDLE_TIMEOUT_MS, SNAPSHOT_BEFORE_TIMEOUT_M
1212
1408
  var init_lifecycle_workflow_steps = __esm({
1213
1409
  "src/sandbox/bindings/lifecycle-workflow-steps.ts"() {
1214
1410
  "use strict";
1411
+ init_rpc_registry();
1215
1412
  DEFAULT_POLL_INTERVAL_MS = 2 * 60 * 1e3;
1216
1413
  DEFAULT_IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
1217
1414
  SNAPSHOT_BEFORE_TIMEOUT_MS = 10 * 60 * 1e3;
@@ -1265,18 +1462,19 @@ function isSandboxGoneError(e) {
1265
1462
  }
1266
1463
  return false;
1267
1464
  }
1268
- var errore3, import_sandbox2, import_api, VERCEL_MAX_TIMEOUT_MS, LOCK_TIMEOUT_MS, LOCK_POLL_INTERVAL_MS, getTestCredentials2, createPromises, ACTIVITY_THROTTLE_MS, lastActivitySent, DEFAULT_VCPUS, vercelSandbox;
1465
+ var path3, import_sandbox2, errore3, import_api, VERCEL_MAX_TIMEOUT_MS, LOCK_TIMEOUT_MS, LOCK_POLL_INTERVAL_MS, getTestCredentials2, createPromises, ACTIVITY_THROTTLE_MS, lastActivitySent, DEFAULT_VCPUS, vercelSandbox;
1269
1466
  var init_vercel = __esm({
1270
1467
  "src/sandbox/bindings/vercel.ts"() {
1271
1468
  "use strict";
1469
+ path3 = __toESM(require("path"));
1470
+ import_sandbox2 = require("@vercel/sandbox");
1272
1471
  errore3 = __toESM(require("errore"));
1273
- import_sandbox2 = require("sandbox");
1274
1472
  import_api = require("workflow/api");
1275
1473
  init_errors();
1276
- init_write_files();
1474
+ init_debug();
1277
1475
  init_lifecycle_workflow();
1278
1476
  VERCEL_MAX_TIMEOUT_MS = 5 * 60 * 60 * 1e3;
1279
- LOCK_TIMEOUT_MS = 2 * 60 * 1e3;
1477
+ LOCK_TIMEOUT_MS = 5 * 60 * 1e3;
1280
1478
  LOCK_POLL_INTERVAL_MS = 200;
1281
1479
  getTestCredentials2 = () => process.env.NODE_ENV === "test" ? {
1282
1480
  token: process.env.TEST_VERCEL_TOKEN,
@@ -1292,14 +1490,18 @@ var init_vercel = __esm({
1292
1490
  storageConfig,
1293
1491
  enableLifecycleWorkflow,
1294
1492
  storage,
1295
- rpc
1493
+ setup,
1494
+ onRestart
1296
1495
  }) => {
1297
1496
  const { id, config } = sandboxRecord;
1298
1497
  const vcpus = config.resources?.vcpus ?? DEFAULT_VCPUS;
1299
1498
  const ports = config.ports;
1499
+ const networkPolicy = config.networkPolicy;
1300
1500
  const initialVercel = sandboxRecord.providerMetadata?.provider === "vercel" ? sandboxRecord.providerMetadata : null;
1301
1501
  let sandboxPromise = null;
1302
1502
  let recoveredFromStale = false;
1503
+ let createdFromSnapshot = false;
1504
+ let needsSetupRun = false;
1303
1505
  const HOME_DIR = "/home/vercel-sandbox";
1304
1506
  async function pollForSandboxId() {
1305
1507
  const deadline = Date.now() + LOCK_TIMEOUT_MS;
@@ -1339,8 +1541,7 @@ var init_vercel = __esm({
1339
1541
  const lifecycleInput = {
1340
1542
  id,
1341
1543
  vercelSandboxId,
1342
- storageConfig,
1343
- rpc
1544
+ storageConfig
1344
1545
  };
1345
1546
  await (0, import_api.start)(sandboxLifecycleWorkflow, [{ input: lifecycleInput }]).catch(
1346
1547
  // biome-ignore lint/suspicious/noEmptyBlockStatements: intentionally ignored - workflow start is fire-and-forget
@@ -1356,6 +1557,7 @@ var init_vercel = __esm({
1356
1557
  resources: { vcpus },
1357
1558
  timeout: VERCEL_MAX_TIMEOUT_MS,
1358
1559
  ports,
1560
+ networkPolicy,
1359
1561
  ...getTestCredentials2()
1360
1562
  });
1361
1563
  const now = Date.now();
@@ -1386,6 +1588,7 @@ var init_vercel = __esm({
1386
1588
  resources: { vcpus },
1387
1589
  timeout: VERCEL_MAX_TIMEOUT_MS,
1388
1590
  ports,
1591
+ networkPolicy,
1389
1592
  ...getTestCredentials2()
1390
1593
  });
1391
1594
  const now = Date.now();
@@ -1409,6 +1612,232 @@ var init_vercel = __esm({
1409
1612
  catch: (e) => new SandboxError({ reason: String(e), cause: e })
1410
1613
  });
1411
1614
  }
1615
+ function execOnInstance(instance, {
1616
+ command,
1617
+ args,
1618
+ signal
1619
+ }) {
1620
+ return errore3.tryAsync({
1621
+ try: async () => {
1622
+ const output = await instance.runCommand({
1623
+ cwd: HOME_DIR,
1624
+ args,
1625
+ cmd: command,
1626
+ signal,
1627
+ detached: true
1628
+ });
1629
+ let stdout = "";
1630
+ let stderr = "";
1631
+ const logBuffer = [];
1632
+ const state = {
1633
+ resolve: null,
1634
+ consumed: false
1635
+ };
1636
+ const consumeLogs = (async () => {
1637
+ try {
1638
+ for await (const log of output.logs()) {
1639
+ const entry = log.stream === "stdout" ? { stream: "stdout", data: log.data } : { stream: "stderr", data: log.data };
1640
+ if (log.stream === "stdout") {
1641
+ stdout += log.data;
1642
+ } else {
1643
+ stderr += log.data;
1644
+ }
1645
+ logBuffer.push(entry);
1646
+ state.resolve?.();
1647
+ }
1648
+ } catch {
1649
+ }
1650
+ state.consumed = true;
1651
+ state.resolve?.();
1652
+ })();
1653
+ async function* logs() {
1654
+ let index = 0;
1655
+ while (!state.consumed || index < logBuffer.length) {
1656
+ if (index < logBuffer.length) {
1657
+ yield logBuffer[index++];
1658
+ } else {
1659
+ await new Promise((resolve) => {
1660
+ state.resolve = resolve;
1661
+ });
1662
+ state.resolve = null;
1663
+ }
1664
+ }
1665
+ }
1666
+ const result = consumeLogs.then(async () => {
1667
+ try {
1668
+ const finished = await output.wait();
1669
+ return {
1670
+ stdout,
1671
+ stderr,
1672
+ exitCode: finished.exitCode
1673
+ };
1674
+ } catch (e) {
1675
+ if (isSandboxGoneError(e)) {
1676
+ return { stdout, stderr, exitCode: 1 };
1677
+ }
1678
+ throw e;
1679
+ }
1680
+ });
1681
+ return { commandId: output.cmdId, logs, result };
1682
+ },
1683
+ catch: (e) => new SandboxError({ reason: String(e), cause: e })
1684
+ });
1685
+ }
1686
+ function readFileOnInstance(instance, { path: path4 }) {
1687
+ return errore3.tryAsync({
1688
+ try: () => instance.readFileToBuffer({ path: path4, cwd: HOME_DIR }),
1689
+ catch: (e) => new SandboxError({ reason: String(e), cause: e })
1690
+ });
1691
+ }
1692
+ async function writeFilesOnInstance(instance, opts) {
1693
+ const { files, destPath } = opts;
1694
+ if (files.length === 0) {
1695
+ return;
1696
+ }
1697
+ const nativeFiles = files.map((file) => {
1698
+ const filePath = path3.posix.join(destPath, file.path);
1699
+ const absolutePath = path3.posix.isAbsolute(filePath) ? filePath : path3.posix.join(HOME_DIR, filePath);
1700
+ return {
1701
+ path: absolutePath,
1702
+ content: typeof file.content === "string" ? Buffer.from(file.content) : file.content
1703
+ };
1704
+ });
1705
+ await instance.writeFiles(nativeFiles);
1706
+ const shellScripts = nativeFiles.filter((f) => f.path.endsWith(".sh"));
1707
+ if (shellScripts.length > 0) {
1708
+ const chmodResult = await execOnInstance(instance, {
1709
+ command: "chmod",
1710
+ args: ["+x", ...shellScripts.map((f) => f.path)]
1711
+ });
1712
+ if (chmodResult instanceof Error) {
1713
+ throw chmodResult;
1714
+ }
1715
+ await chmodResult.result;
1716
+ }
1717
+ }
1718
+ function createTempSandbox(instance) {
1719
+ const tempSandbox = {
1720
+ id: `__setup_temp_${Date.now()}`,
1721
+ config,
1722
+ exec: (opts) => execOnInstance(instance, opts),
1723
+ readFile: (opts) => readFileOnInstance(instance, opts),
1724
+ getDomain: () => Promise.resolve(
1725
+ new SandboxError({ reason: "not available during setup" })
1726
+ ),
1727
+ kill: () => Promise.resolve(
1728
+ new SandboxError({ reason: "not available during setup" })
1729
+ ),
1730
+ writeFiles: (opts) => writeFilesOnInstance(instance, opts),
1731
+ updateNetworkPolicy: (policy) => errore3.tryAsync({
1732
+ try: () => instance.updateNetworkPolicy(policy),
1733
+ catch: (e) => new SandboxError({ reason: String(e), cause: e })
1734
+ }),
1735
+ tag: {
1736
+ list: async () => ({}),
1737
+ get: async () => void 0,
1738
+ set: async () => void 0,
1739
+ setMany: async () => void 0
1740
+ }
1741
+ };
1742
+ return tempSandbox;
1743
+ }
1744
+ async function pollForSetupSnapshot(key) {
1745
+ const deadline = Date.now() + LOCK_TIMEOUT_MS;
1746
+ while (Date.now() < deadline) {
1747
+ await new Promise((r) => setTimeout(r, LOCK_POLL_INTERVAL_MS));
1748
+ const record = await storage.setup.get(key);
1749
+ if (record instanceof Error) {
1750
+ return null;
1751
+ }
1752
+ if (record?.snapshotId) {
1753
+ return record.snapshotId;
1754
+ }
1755
+ if (!record?.acquiringLockId) {
1756
+ return null;
1757
+ }
1758
+ }
1759
+ return null;
1760
+ }
1761
+ async function createSetupSnapshot(opts) {
1762
+ if (!setup) {
1763
+ return;
1764
+ }
1765
+ const setupKey = setup.key;
1766
+ if (!opts?.force) {
1767
+ const existing = await storage.setup.get(setupKey);
1768
+ if (!(existing instanceof Error) && existing?.snapshotId) {
1769
+ return;
1770
+ }
1771
+ }
1772
+ debug(`[sandbox:setup] acquiring lock for setup key "${setupKey}"`);
1773
+ const lockId = crypto.randomUUID();
1774
+ const locked = await storage.setup.acquireLock(
1775
+ setupKey,
1776
+ lockId,
1777
+ LOCK_TIMEOUT_MS
1778
+ );
1779
+ if (locked instanceof Error || !locked) {
1780
+ debug(
1781
+ `[sandbox:setup] lock not acquired for key "${setupKey}" (another process holds it)`
1782
+ );
1783
+ return;
1784
+ }
1785
+ if (!opts?.force && locked.snapshotId) {
1786
+ debug(
1787
+ `[sandbox:setup] snapshot already exists after lock for key "${setupKey}", skipping`
1788
+ );
1789
+ return;
1790
+ }
1791
+ let tempInstance = null;
1792
+ try {
1793
+ debug(
1794
+ `[sandbox:setup] creating temp sandbox for snapshot (key="${setupKey}")`
1795
+ );
1796
+ tempInstance = await import_sandbox2.Sandbox.create({
1797
+ resources: { vcpus },
1798
+ timeout: VERCEL_MAX_TIMEOUT_MS,
1799
+ ports,
1800
+ networkPolicy,
1801
+ ...getTestCredentials2()
1802
+ });
1803
+ const tempSandbox = createTempSandbox(
1804
+ tempInstance
1805
+ );
1806
+ await setup.run(tempSandbox);
1807
+ debug(
1808
+ `[sandbox:setup] setup.run complete, snapshotting (key="${setupKey}")`
1809
+ );
1810
+ const snapshot = await tempInstance.snapshot();
1811
+ await storage.setup.set({
1812
+ key: setupKey,
1813
+ snapshotId: snapshot.snapshotId,
1814
+ createdAt: locked.createdAt,
1815
+ lastUsedAt: null,
1816
+ acquiringLockId: null,
1817
+ acquiringLockAt: null
1818
+ });
1819
+ debug(
1820
+ `[sandbox:setup] snapshot stored: ${snapshot.snapshotId} (key="${setupKey}")`
1821
+ );
1822
+ await tempInstance.stop().catch(() => void 0);
1823
+ } catch (e) {
1824
+ console.error(
1825
+ `[sandbox:setup] failed to create setup snapshot (key="${setupKey}"):`,
1826
+ e
1827
+ );
1828
+ if (tempInstance) {
1829
+ await tempInstance.stop().catch(() => void 0);
1830
+ }
1831
+ await storage.setup.set({
1832
+ key: setupKey,
1833
+ snapshotId: null,
1834
+ createdAt: locked.createdAt,
1835
+ lastUsedAt: null,
1836
+ acquiringLockId: null,
1837
+ acquiringLockAt: null
1838
+ }).catch(() => void 0);
1839
+ }
1840
+ }
1412
1841
  async function doGetOrCreateSandboxId() {
1413
1842
  if (initialVercel?.sandboxId && !recoveredFromStale) {
1414
1843
  return initialVercel.sandboxId;
@@ -1431,35 +1860,106 @@ var init_vercel = __esm({
1431
1860
  }
1432
1861
  const lockId = crypto.randomUUID();
1433
1862
  const now = Date.now();
1434
- await storage.sandbox.set({
1435
- id,
1436
- config,
1437
- tags: existingRecord?.tags ?? sandboxRecord.tags,
1438
- createdAt: existingRecord?.createdAt ?? sandboxRecord.createdAt,
1439
- lastActivityAt: existingRecord?.lastActivityAt ?? sandboxRecord.lastActivityAt,
1440
- acquiringLockId: lockId,
1441
- acquiringLockAt: now,
1442
- providerMetadata: {
1443
- provider: "vercel",
1444
- sandboxId: null,
1445
- snapshotId: existingVercel?.snapshotId ?? initialVercel?.snapshotId ?? null
1446
- }
1447
- });
1448
- const afterLock = await storage.sandbox.get(id);
1449
- if (afterLock instanceof Error) {
1450
- return new SandboxError({ reason: afterLock.message, cause: afterLock });
1863
+ const locked = await storage.sandbox.acquireLock(
1864
+ {
1865
+ id,
1866
+ config,
1867
+ tags: existingRecord?.tags ?? sandboxRecord.tags,
1868
+ createdAt: existingRecord?.createdAt ?? sandboxRecord.createdAt,
1869
+ lastActivityAt: existingRecord?.lastActivityAt ?? sandboxRecord.lastActivityAt,
1870
+ acquiringLockId: lockId,
1871
+ acquiringLockAt: now,
1872
+ providerMetadata: {
1873
+ provider: "vercel",
1874
+ sandboxId: null,
1875
+ snapshotId: existingVercel?.snapshotId ?? initialVercel?.snapshotId ?? null
1876
+ }
1877
+ },
1878
+ LOCK_TIMEOUT_MS
1879
+ );
1880
+ if (locked instanceof Error) {
1881
+ return new SandboxError({ reason: locked.message, cause: locked });
1451
1882
  }
1452
- if (afterLock?.acquiringLockId !== lockId) {
1883
+ if (!locked) {
1453
1884
  return pollForSandboxId();
1454
1885
  }
1455
- const snapshotId = existingVercel?.snapshotId ?? initialVercel?.snapshotId ?? config.lifecycle?.snapshotId;
1886
+ const lockedRecord = locked;
1887
+ async function releaseSandboxLock() {
1888
+ await storage.sandbox.set({
1889
+ ...lockedRecord,
1890
+ acquiringLockId: null,
1891
+ acquiringLockAt: null
1892
+ }).catch(() => void 0);
1893
+ }
1894
+ const lockedVercel = lockedRecord.providerMetadata?.provider === "vercel" ? lockedRecord.providerMetadata : null;
1895
+ if (lockedVercel?.sandboxId) {
1896
+ await releaseSandboxLock();
1897
+ return lockedVercel.sandboxId;
1898
+ }
1899
+ const snapshotId = lockedVercel?.snapshotId ?? initialVercel?.snapshotId ?? config.lifecycle?.snapshotId;
1456
1900
  if (snapshotId) {
1457
1901
  const result = await createSandboxFromSnapshot(snapshotId);
1458
1902
  if (!(result instanceof Error)) {
1903
+ createdFromSnapshot = true;
1459
1904
  return result;
1460
1905
  }
1461
1906
  }
1462
- return createFreshSandbox();
1907
+ if (setup) {
1908
+ let forceRecreateSnapshot = false;
1909
+ const setupRecord = await storage.setup.get(setup.key);
1910
+ if (!(setupRecord instanceof Error) && setupRecord) {
1911
+ if (setupRecord.snapshotId) {
1912
+ debug(
1913
+ `[sandbox:setup] found setup snapshot ${setupRecord.snapshotId} for key "${setup.key}"`
1914
+ );
1915
+ const result = await createSandboxFromSnapshot(
1916
+ setupRecord.snapshotId
1917
+ );
1918
+ if (!(result instanceof Error)) {
1919
+ createdFromSnapshot = true;
1920
+ storage.setup.set({
1921
+ ...setupRecord,
1922
+ lastUsedAt: Date.now()
1923
+ }).catch(() => void 0);
1924
+ return result;
1925
+ }
1926
+ debug(
1927
+ `[sandbox:setup] snapshot ${setupRecord.snapshotId} failed (expired?), will recreate`
1928
+ );
1929
+ forceRecreateSnapshot = true;
1930
+ } else if (setupRecord.acquiringLockId && setupRecord.acquiringLockAt && Date.now() - setupRecord.acquiringLockAt < LOCK_TIMEOUT_MS) {
1931
+ debug(
1932
+ `[sandbox:setup] snapshot in progress for key "${setup.key}", waiting...`
1933
+ );
1934
+ const snapshotId2 = await pollForSetupSnapshot(setup.key);
1935
+ if (snapshotId2) {
1936
+ debug(
1937
+ `[sandbox:setup] snapshot ready: ${snapshotId2} for key "${setup.key}"`
1938
+ );
1939
+ const result = await createSandboxFromSnapshot(snapshotId2);
1940
+ if (!(result instanceof Error)) {
1941
+ createdFromSnapshot = true;
1942
+ return result;
1943
+ }
1944
+ }
1945
+ }
1946
+ }
1947
+ debug(
1948
+ `[sandbox:setup] no snapshot for key "${setup.key}", will run setup on this sandbox`
1949
+ );
1950
+ needsSetupRun = true;
1951
+ createSetupSnapshot({ force: forceRecreateSnapshot }).catch((e) => {
1952
+ console.error(
1953
+ "[sandbox:setup] failed to create background snapshot:",
1954
+ e
1955
+ );
1956
+ });
1957
+ }
1958
+ const freshResult = await createFreshSandbox();
1959
+ if (freshResult instanceof Error) {
1960
+ await releaseSandboxLock();
1961
+ }
1962
+ return freshResult;
1463
1963
  }
1464
1964
  function getOrCreateSandboxId() {
1465
1965
  const cached = createPromises.get(id);
@@ -1633,81 +2133,13 @@ var init_vercel = __esm({
1633
2133
  return sandbox2.timeout;
1634
2134
  }
1635
2135
  };
1636
- async function doExec({
1637
- command,
1638
- args,
1639
- signal
1640
- }) {
2136
+ async function doExec(opts) {
1641
2137
  const instance = await getSandbox2();
1642
2138
  if (instance instanceof Error) {
1643
2139
  return instance;
1644
2140
  }
1645
2141
  const updatePromise = updateLastActivity();
1646
- const execResult = await errore3.tryAsync({
1647
- try: async () => {
1648
- const output = await instance.runCommand({
1649
- cwd: HOME_DIR,
1650
- args,
1651
- cmd: command,
1652
- signal,
1653
- detached: true
1654
- });
1655
- let stdout = "";
1656
- let stderr = "";
1657
- const logBuffer = [];
1658
- const state = {
1659
- resolve: null,
1660
- consumed: false
1661
- };
1662
- const consumeLogs = (async () => {
1663
- try {
1664
- for await (const log of output.logs()) {
1665
- const entry = log.stream === "stdout" ? { stream: "stdout", data: log.data } : { stream: "stderr", data: log.data };
1666
- if (log.stream === "stdout") {
1667
- stdout += log.data;
1668
- } else {
1669
- stderr += log.data;
1670
- }
1671
- logBuffer.push(entry);
1672
- state.resolve?.();
1673
- }
1674
- } catch {
1675
- }
1676
- state.consumed = true;
1677
- state.resolve?.();
1678
- })();
1679
- async function* logs() {
1680
- let index = 0;
1681
- while (!state.consumed || index < logBuffer.length) {
1682
- if (index < logBuffer.length) {
1683
- yield logBuffer[index++];
1684
- } else {
1685
- await new Promise((resolve) => {
1686
- state.resolve = resolve;
1687
- });
1688
- state.resolve = null;
1689
- }
1690
- }
1691
- }
1692
- const result = consumeLogs.then(async () => {
1693
- try {
1694
- const finished = await output.wait();
1695
- return {
1696
- stdout,
1697
- stderr,
1698
- exitCode: finished.exitCode
1699
- };
1700
- } catch (e) {
1701
- if (isSandboxGoneError(e)) {
1702
- return { stdout, stderr, exitCode: 1 };
1703
- }
1704
- throw e;
1705
- }
1706
- });
1707
- return { commandId: output.cmdId, logs, result };
1708
- },
1709
- catch: (e) => new SandboxError({ reason: String(e), cause: e })
1710
- });
2142
+ const execResult = await execOnInstance(instance, opts);
1711
2143
  await updatePromise;
1712
2144
  return execResult;
1713
2145
  }
@@ -1753,8 +2185,31 @@ var init_vercel = __esm({
1753
2185
  }
1754
2186
  return void 0;
1755
2187
  },
1756
- writeFiles: (opts) => writeFiles({ sandbox, ...opts }),
2188
+ readFile: async (opts) => {
2189
+ const instance = await getSandbox2();
2190
+ if (instance instanceof Error) {
2191
+ return instance;
2192
+ }
2193
+ return readFileOnInstance(instance, opts);
2194
+ },
2195
+ writeFiles: async (opts) => {
2196
+ const instance = await getSandbox2();
2197
+ if (instance instanceof Error) {
2198
+ throw instance;
2199
+ }
2200
+ return writeFilesOnInstance(instance, opts);
2201
+ },
1757
2202
  lifecycle,
2203
+ updateNetworkPolicy: async (policy) => {
2204
+ const instance = await getSandbox2();
2205
+ if (instance instanceof Error) {
2206
+ return instance;
2207
+ }
2208
+ return errore3.tryAsync({
2209
+ try: () => instance.updateNetworkPolicy(policy),
2210
+ catch: (e) => new SandboxError({ reason: String(e), cause: e })
2211
+ });
2212
+ },
1758
2213
  tag: {
1759
2214
  list: async () => {
1760
2215
  const sandboxRecord2 = await storage.sandbox.get(id);
@@ -1792,9 +2247,36 @@ var init_vercel = __esm({
1792
2247
  }
1793
2248
  }
1794
2249
  };
2250
+ let onReadyPromise = Promise.resolve();
2251
+ let setupMetaPromise = Promise.resolve({
2252
+ needsSetupRun: false,
2253
+ createdFromSnapshot: false
2254
+ });
1795
2255
  if (config.lifecycle?.autoStart !== false) {
1796
2256
  sandboxPromise = doGetSandbox();
2257
+ setupMetaPromise = sandboxPromise.then(() => ({
2258
+ needsSetupRun,
2259
+ createdFromSnapshot
2260
+ }));
2261
+ onReadyPromise = sandboxPromise.then(async (instance) => {
2262
+ if (instance instanceof Error) {
2263
+ return;
2264
+ }
2265
+ if (needsSetupRun && setup) {
2266
+ debug(
2267
+ `[sandbox:setup] running setup.run on session sandbox (key="${setup.key}")`
2268
+ );
2269
+ await setup.run(sandbox);
2270
+ debug("[sandbox:setup] setup.run complete on session sandbox");
2271
+ }
2272
+ if (createdFromSnapshot && onRestart) {
2273
+ debug("[sandbox:setup] running onRestart (created from snapshot)");
2274
+ await onRestart(sandbox);
2275
+ }
2276
+ });
1797
2277
  }
2278
+ sandbox._onReady = onReadyPromise;
2279
+ sandbox._setupMeta = setupMetaPromise;
1798
2280
  return sandbox;
1799
2281
  };
1800
2282
  }
@@ -1805,23 +2287,54 @@ function getSandbox({
1805
2287
  sandboxRecord,
1806
2288
  storageConfig,
1807
2289
  storage,
1808
- rpc,
1809
- enableLifecycleWorkflow = true
2290
+ enableLifecycleWorkflow = true,
2291
+ setup,
2292
+ onRestart
1810
2293
  }) {
2294
+ const cached = sandboxCache.get(sandboxRecord.id);
2295
+ if (cached) {
2296
+ debug("[getSandbox] cache hit for", sandboxRecord.id);
2297
+ return cached;
2298
+ }
2299
+ const sbx = createSandbox({
2300
+ sandboxRecord,
2301
+ storageConfig,
2302
+ storage,
2303
+ enableLifecycleWorkflow,
2304
+ setup,
2305
+ onRestart
2306
+ });
2307
+ sandboxCache.set(sandboxRecord.id, sbx);
2308
+ return sbx;
2309
+ }
2310
+ function createSandbox({
2311
+ sandboxRecord,
2312
+ storageConfig,
2313
+ storage,
2314
+ enableLifecycleWorkflow = true,
2315
+ setup,
2316
+ onRestart
2317
+ }) {
2318
+ let sbx;
1811
2319
  switch (sandboxRecord.config.type) {
1812
2320
  case "local":
1813
- return localSandbox({
2321
+ sbx = localSandbox({
1814
2322
  sandboxRecord,
1815
- storage
2323
+ storage,
2324
+ setup,
2325
+ onRestart
1816
2326
  });
2327
+ break;
1817
2328
  case "vercel":
1818
- return vercelSandbox({
2329
+ sbx = vercelSandbox({
1819
2330
  sandboxRecord,
1820
2331
  storageConfig,
1821
2332
  storage,
1822
- rpc,
1823
- enableLifecycleWorkflow
2333
+ enableLifecycleWorkflow,
2334
+ setup,
2335
+ onRestart
1824
2336
  });
2337
+ break;
1825
2338
  case "custom":
1826
2339
  throw new Error("Custom sandboxes are not supported");
1827
2340
  default:
@@ -1831,12 +2344,38 @@ function getSandbox({
1831
2344
  sandboxRecord.config.type}`
1832
2345
  );
1833
2346
  }
2347
+ if (!sbx._onReady) {
2348
+ return sbx;
2349
+ }
2350
+ const onReady = sbx._onReady;
2351
+ return {
2352
+ ...sbx,
2353
+ exec: async (opts) => {
2354
+ await onReady;
2355
+ return sbx.exec(opts);
2356
+ },
2357
+ getDomain: async (port) => {
2358
+ await onReady;
2359
+ return sbx.getDomain(port);
2360
+ },
2361
+ readFile: async (opts) => {
2362
+ await onReady;
2363
+ return sbx.readFile(opts);
2364
+ },
2365
+ writeFiles: async (opts) => {
2366
+ await onReady;
2367
+ return sbx.writeFiles(opts);
2368
+ }
2369
+ };
1834
2370
  }
2371
+ var sandboxCache;
1835
2372
  var init_client2 = __esm({
1836
2373
  "src/sandbox/client.ts"() {
1837
2374
  "use strict";
2375
+ init_debug();
1838
2376
  init_local();
1839
2377
  init_vercel();
2378
+ sandboxCache = /* @__PURE__ */ new Map();
1840
2379
  }
1841
2380
  });
1842
2381
 
@@ -1866,6 +2405,7 @@ var import_workflow3 = require("workflow");
1866
2405
  var import_ai3 = require("ai");
1867
2406
  var import_ulid2 = require("ulid");
1868
2407
  var import_workflow2 = require("workflow");
2408
+ init_rpc_registry();
1869
2409
 
1870
2410
  // src/skills/parser.ts
1871
2411
  function parseSkillFrontmatter(content) {
@@ -1912,14 +2452,14 @@ function parseSimpleYaml(yaml) {
1912
2452
 
1913
2453
  // src/skills/discover.ts
1914
2454
  async function discoverSkillsInSandbox(opts) {
1915
- const { sandbox, skillsDirs, debug } = opts;
2455
+ const { sandbox, skillsDirs, debug: debug2 } = opts;
1916
2456
  const summaries = [];
1917
2457
  const seenNames = /* @__PURE__ */ new Set();
1918
2458
  for (const skillsDir of skillsDirs) {
1919
2459
  const dirSummaries = await discoverSkillsInDirectory({
1920
2460
  sandbox,
1921
2461
  skillsDir,
1922
- debug
2462
+ debug: debug2
1923
2463
  });
1924
2464
  for (const summary of dirSummaries) {
1925
2465
  if (!seenNames.has(summary.name)) {
@@ -1931,14 +2471,14 @@ async function discoverSkillsInSandbox(opts) {
1931
2471
  return summaries;
1932
2472
  }
1933
2473
  async function discoverSkillsInDirectory(opts) {
1934
- const { sandbox, skillsDir, debug } = opts;
1935
- const skillPaths = await findSkillFiles({ sandbox, skillsDir, debug });
2474
+ const { sandbox, skillsDir, debug: debug2 } = opts;
2475
+ const skillPaths = await findSkillFiles({ sandbox, skillsDir, debug: debug2 });
1936
2476
  if (skillPaths.length === 0) {
1937
2477
  return [];
1938
2478
  }
1939
2479
  const summaries = [];
1940
2480
  for (const skillMdPath of skillPaths) {
1941
- const summary = await parseSkillFile({ sandbox, skillMdPath, debug });
2481
+ const summary = await parseSkillFile({ sandbox, skillMdPath, debug: debug2 });
1942
2482
  if (summary) {
1943
2483
  summaries.push(summary);
1944
2484
  }
@@ -1946,13 +2486,13 @@ async function discoverSkillsInDirectory(opts) {
1946
2486
  return summaries;
1947
2487
  }
1948
2488
  async function findSkillFiles(opts) {
1949
- const { sandbox, skillsDir, debug } = opts;
2489
+ const { sandbox, skillsDir, debug: debug2 } = opts;
1950
2490
  const execResult = await sandbox.exec({
1951
2491
  command: "find",
1952
2492
  args: [skillsDir, "-name", "SKILL.md", "-type", "f"]
1953
2493
  });
1954
2494
  if (execResult instanceof Error) {
1955
- if (debug) {
2495
+ if (debug2) {
1956
2496
  console.warn(
1957
2497
  `[discover] Failed to scan skills directory "${skillsDir}": ${execResult.message}`
1958
2498
  );
@@ -1960,13 +2500,13 @@ async function findSkillFiles(opts) {
1960
2500
  return [];
1961
2501
  }
1962
2502
  const { stdout, stderr, exitCode } = await execResult.result;
1963
- if (debug) {
2503
+ if (debug2) {
1964
2504
  console.log(
1965
2505
  `[discover] find result: exitCode=${exitCode}, stdout="${stdout.trim()}", stderr="${stderr.trim()}"`
1966
2506
  );
1967
2507
  }
1968
2508
  if (exitCode !== 0) {
1969
- if (debug) {
2509
+ if (debug2) {
1970
2510
  console.warn(
1971
2511
  `[discover] Skills directory not found or inaccessible: ${skillsDir}`
1972
2512
  );
@@ -1974,19 +2514,19 @@ async function findSkillFiles(opts) {
1974
2514
  return [];
1975
2515
  }
1976
2516
  const paths = stdout.trim().split("\n").filter((p) => p.length > 0);
1977
- if (debug) {
2517
+ if (debug2) {
1978
2518
  console.log("[discover] Found skill paths:", paths);
1979
2519
  }
1980
2520
  return paths;
1981
2521
  }
1982
2522
  async function parseSkillFile(opts) {
1983
- const { sandbox, skillMdPath, debug } = opts;
2523
+ const { sandbox, skillMdPath, debug: debug2 } = opts;
1984
2524
  const execResult = await sandbox.exec({
1985
2525
  command: "cat",
1986
2526
  args: [skillMdPath]
1987
2527
  });
1988
2528
  if (execResult instanceof Error) {
1989
- if (debug) {
2529
+ if (debug2) {
1990
2530
  console.warn(
1991
2531
  `[discover] Failed to read skill file "${skillMdPath}": ${execResult.message}`
1992
2532
  );
@@ -1995,14 +2535,14 @@ async function parseSkillFile(opts) {
1995
2535
  }
1996
2536
  const { stdout, exitCode } = await execResult.result;
1997
2537
  if (exitCode !== 0) {
1998
- if (debug) {
2538
+ if (debug2) {
1999
2539
  console.warn(`[discover] Could not read skill file: ${skillMdPath}`);
2000
2540
  }
2001
2541
  return null;
2002
2542
  }
2003
2543
  const parsed = parseSkillFrontmatter(stdout);
2004
2544
  if (!parsed) {
2005
- if (debug) {
2545
+ if (debug2) {
2006
2546
  console.warn(
2007
2547
  `[discover] Invalid or missing frontmatter in: ${skillMdPath}`
2008
2548
  );
@@ -2113,7 +2653,7 @@ function extractJsonSchema(schema) {
2113
2653
  }
2114
2654
  }
2115
2655
  const s = schema;
2116
- if (Symbol.for("vercel.ai.schema") in s && "jsonSchema" in s) {
2656
+ if (/* @__PURE__ */ Symbol.for("vercel.ai.schema") in s && "jsonSchema" in s) {
2117
2657
  return s.jsonSchema;
2118
2658
  }
2119
2659
  if ("type" in s || "properties" in s) {
@@ -2393,6 +2933,18 @@ Return a value to pass results back. Use console.log() for debug output.`,
2393
2933
  }
2394
2934
 
2395
2935
  // src/tools/index.ts
2936
+ function formatFileSize(bytes) {
2937
+ if (bytes < 1024) {
2938
+ return `${bytes}`;
2939
+ }
2940
+ if (bytes < 1024 * 1024) {
2941
+ return `${(bytes / 1024).toFixed(1)}K`;
2942
+ }
2943
+ if (bytes < 1024 * 1024 * 1024) {
2944
+ return `${(bytes / (1024 * 1024)).toFixed(1)}M`;
2945
+ }
2946
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}G`;
2947
+ }
2396
2948
  var builtInTools = {
2397
2949
  Read: (0, import_ai2.tool)({
2398
2950
  description: "Reads a file and returns its contents with metadata. For files over 200 lines, automatically shows first 100 lines unless a specific line range is provided. Use startLine and endLine parameters to read specific portions of large files.",
@@ -2540,86 +3092,16 @@ function getTools(context) {
2540
3092
  const tools = {
2541
3093
  [builtinToolNames.Read]: (0, import_ai2.tool)({
2542
3094
  ...builtInTools.Read,
2543
- execute: async ({ path: path2, startLine, endLine }) => {
2544
- const filePath = path2;
2545
- const result = await context.sandbox.exec({
2546
- command: "bash",
2547
- args: [
2548
- "-c",
2549
- `
2550
- set -e
2551
- FILE="$1"
2552
- START_LINE="$2"
2553
- END_LINE="$3"
2554
-
2555
- # Resolve symlinks and check file exists
2556
- if [ -L "$FILE" ]; then
2557
- RESOLVED=$(readlink -f "$FILE" 2>/dev/null || echo "")
2558
- if [ -z "$RESOLVED" ] || [ ! -e "$RESOLVED" ]; then
2559
- echo "Error: Broken symlink - $FILE points to non-existent target" >&2
2560
- exit 1
2561
- fi
2562
- FILE="$RESOLVED"
2563
- elif [ ! -e "$FILE" ]; then
2564
- echo "Error: File not found - $FILE" >&2
2565
- exit 1
2566
- fi
2567
-
2568
- # Get metadata (count actual lines, not just newlines)
2569
- TOTAL_LINES=$(awk 'END{print NR}' "$FILE")
2570
- FILE_SIZE=$(ls -lh "$FILE" | awk '{print $5}')
2571
-
2572
- # Determine range
2573
- PAGE_SIZE=100
2574
- if [ -n "$START_LINE" ] && [ -n "$END_LINE" ]; then
2575
- # Both provided - use exact range
2576
- ACTUAL_START=$START_LINE
2577
- ACTUAL_END=$END_LINE
2578
- elif [ -n "$START_LINE" ]; then
2579
- # Only startLine - read PAGE_SIZE lines from there
2580
- ACTUAL_START=$START_LINE
2581
- ACTUAL_END=$((START_LINE + PAGE_SIZE - 1))
2582
- [ "$ACTUAL_END" -gt "$TOTAL_LINES" ] && ACTUAL_END=$TOTAL_LINES
2583
- elif [ -n "$END_LINE" ]; then
2584
- # Only endLine - read from beginning to endLine
2585
- ACTUAL_START=1
2586
- ACTUAL_END=$END_LINE
2587
- elif [ "$TOTAL_LINES" -gt 200 ]; then
2588
- # No range, large file - paginate
2589
- ACTUAL_START=1
2590
- ACTUAL_END=$PAGE_SIZE
2591
- else
2592
- # No range, small file - show all
2593
- ACTUAL_START=1
2594
- ACTUAL_END=$TOTAL_LINES
2595
- fi
2596
-
2597
- # Output metadata first (separated by ||| for parsing)
2598
- echo "$TOTAL_LINES|$FILE_SIZE|$ACTUAL_START|$ACTUAL_END"
2599
- echo "|||CONTENT|||"
2600
-
2601
- # Read content
2602
- if [ "$ACTUAL_START" -eq 1 ] && [ "$ACTUAL_END" -eq "$TOTAL_LINES" ]; then
2603
- cat "$FILE"
2604
- else
2605
- sed -n "\${ACTUAL_START},\${ACTUAL_END}p" "$FILE"
2606
- fi
2607
- `,
2608
- "--",
2609
- filePath,
2610
- startLine?.toString() || "",
2611
- endLine?.toString() || ""
2612
- ]
2613
- });
3095
+ execute: async ({ path: path4, startLine, endLine }) => {
3096
+ const filePath = path4;
3097
+ const result = await context.sandbox.readFile({ path: filePath });
2614
3098
  if (result instanceof Error) {
2615
3099
  console.error("[Read Tool]", result);
2616
3100
  throw result;
2617
3101
  }
2618
- const { stdout, stderr } = await result.result;
2619
- if (stderr) {
2620
- console.error(`[Read Tool] Error: ${stderr}`);
3102
+ if (result === null) {
2621
3103
  return {
2622
- content: `Error: ${stderr}`,
3104
+ content: `Error: File not found - ${filePath}`,
2623
3105
  metadata: {
2624
3106
  totalLines: 0,
2625
3107
  linesShown: 0,
@@ -2631,32 +3113,35 @@ function getTools(context) {
2631
3113
  }
2632
3114
  };
2633
3115
  }
2634
- const [metadataLine, ...rest] = stdout.split("|||CONTENT|||");
2635
- const content = rest.join("|||CONTENT|||").trimStart();
2636
- const [totalLinesStr, fileSize, actualStartStr, actualEndStr] = metadataLine.trim().split("|");
2637
- const totalLines = Number.parseInt(totalLinesStr, 10);
2638
- const actualStart = Number.parseInt(actualStartStr, 10);
2639
- const actualEnd = Number.parseInt(actualEndStr, 10);
2640
- if (Number.isNaN(totalLines) || Number.isNaN(actualStart) || Number.isNaN(actualEnd)) {
2641
- console.error(
2642
- `[Read Tool] Failed to parse metadata: ${metadataLine}`
2643
- );
2644
- return {
2645
- content: `Error: Failed to parse file metadata. Raw output: ${stdout.slice(
2646
- 0,
2647
- 500
2648
- )}`,
2649
- metadata: {
2650
- totalLines: 0,
2651
- linesShown: 0,
2652
- startLine: 0,
2653
- endLine: 0,
2654
- isPaginated: false,
2655
- fileSize: "unknown",
2656
- path: filePath
2657
- }
2658
- };
3116
+ const fullContent = result.toString("utf-8");
3117
+ const lines = fullContent.split("\n");
3118
+ if (lines.length > 0 && lines.at(-1) === "") {
3119
+ lines.pop();
2659
3120
  }
3121
+ const totalLines = lines.length;
3122
+ const fileBytes = Buffer.byteLength(fullContent);
3123
+ const fileSize = formatFileSize(fileBytes);
3124
+ const PAGE_SIZE = 100;
3125
+ let actualStart;
3126
+ let actualEnd;
3127
+ if (startLine !== void 0 && endLine !== void 0) {
3128
+ actualStart = startLine;
3129
+ actualEnd = endLine;
3130
+ } else if (startLine !== void 0) {
3131
+ actualStart = startLine;
3132
+ actualEnd = Math.min(startLine + PAGE_SIZE - 1, totalLines);
3133
+ } else if (endLine !== void 0) {
3134
+ actualStart = 1;
3135
+ actualEnd = endLine;
3136
+ } else if (totalLines > 200) {
3137
+ actualStart = 1;
3138
+ actualEnd = PAGE_SIZE;
3139
+ } else {
3140
+ actualStart = 1;
3141
+ actualEnd = totalLines;
3142
+ }
3143
+ const slicedLines = lines.slice(actualStart - 1, actualEnd);
3144
+ const content = slicedLines.join("\n");
2660
3145
  return {
2661
3146
  metadata: {
2662
3147
  totalLines,
@@ -2664,7 +3149,7 @@ function getTools(context) {
2664
3149
  startLine: actualStart,
2665
3150
  endLine: actualEnd,
2666
3151
  isPaginated: actualEnd < totalLines,
2667
- fileSize: fileSize || "unknown",
3152
+ fileSize,
2668
3153
  path: filePath
2669
3154
  },
2670
3155
  content
@@ -2675,7 +3160,7 @@ function getTools(context) {
2675
3160
  ...builtInTools.Grep,
2676
3161
  execute: async ({
2677
3162
  pattern,
2678
- path: path2,
3163
+ path: path4,
2679
3164
  fileType,
2680
3165
  glob,
2681
3166
  caseSensitive,
@@ -2683,7 +3168,7 @@ function getTools(context) {
2683
3168
  maxCount,
2684
3169
  filesWithMatches
2685
3170
  }) => {
2686
- const searchPath = path2 ?? ".";
3171
+ const searchPath = path4 ?? ".";
2687
3172
  const args = [];
2688
3173
  args.push("--line-number");
2689
3174
  args.push("--heading");
@@ -2741,8 +3226,8 @@ function getTools(context) {
2741
3226
  }),
2742
3227
  [builtinToolNames.List]: (0, import_ai2.tool)({
2743
3228
  ...builtInTools.List,
2744
- execute: async ({ path: path2, depth, includeHidden, filesOnly, pattern }) => {
2745
- const searchPath = path2 ?? ".";
3229
+ execute: async ({ path: path4, depth, includeHidden, filesOnly, pattern }) => {
3230
+ const searchPath = path4 ?? ".";
2746
3231
  const result = await context.sandbox.exec({
2747
3232
  command: "bash",
2748
3233
  args: [
@@ -2814,8 +3299,8 @@ function getTools(context) {
2814
3299
  }),
2815
3300
  [builtinToolNames.Write]: (0, import_ai2.tool)({
2816
3301
  ...builtInTools.Write,
2817
- execute: async ({ path: path2, content }) => {
2818
- const filePath = path2.startsWith("/") ? path2.slice(1) : path2;
3302
+ execute: async ({ path: path4, content }) => {
3303
+ const filePath = path4.startsWith("/") ? path4.slice(1) : path4;
2819
3304
  const dir = filePath.includes("/") ? filePath.split("/").slice(0, -1).join("/") : ".";
2820
3305
  const fileName = filePath.split("/").pop() || filePath;
2821
3306
  try {
@@ -2844,43 +3329,20 @@ function getTools(context) {
2844
3329
  }),
2845
3330
  [builtinToolNames.Edit]: (0, import_ai2.tool)({
2846
3331
  ...builtInTools.Edit,
2847
- execute: async ({ path: path2, old_string, new_string }) => {
2848
- const filePath = path2.startsWith("/") ? path2.slice(1) : path2;
2849
- const result = await context.sandbox.exec({
2850
- command: "bash",
2851
- args: [
2852
- "-c",
2853
- `
2854
- set -e
2855
- FILE="$1"
2856
-
2857
- if [ ! -f "$FILE" ]; then
2858
- echo "FILE_NOT_FOUND"
2859
- exit 0
2860
- fi
2861
-
2862
- CONTENT=$(cat "$FILE")
2863
- echo "$CONTENT"
2864
- `,
2865
- "--",
2866
- filePath
2867
- ]
2868
- });
3332
+ execute: async ({ path: path4, old_string, new_string }) => {
3333
+ const filePath = path4.startsWith("/") ? path4.slice(1) : path4;
3334
+ const result = await context.sandbox.readFile({ path: filePath });
2869
3335
  if (result instanceof Error) {
2870
3336
  return { success: false, path: filePath, error: result.message };
2871
3337
  }
2872
- const { stdout, stderr } = await result.result;
2873
- if (stderr) {
2874
- return { success: false, path: filePath, error: stderr };
2875
- }
2876
- if (stdout === "FILE_NOT_FOUND") {
3338
+ if (result === null) {
2877
3339
  return {
2878
3340
  success: false,
2879
3341
  path: filePath,
2880
3342
  error: `File not found: ${filePath}`
2881
3343
  };
2882
3344
  }
2883
- const content = stdout;
3345
+ const content = result.toString("utf-8");
2884
3346
  const occurrences = content.split(old_string).length - 1;
2885
3347
  if (occurrences === 0) {
2886
3348
  return {
@@ -2920,13 +3382,14 @@ function getTools(context) {
2920
3382
  sessionId: context.input.sessionId
2921
3383
  });
2922
3384
  await processManager.init();
2923
- return processManager.run({ command, waitUntil });
3385
+ const result = await processManager.run({ command, waitUntil });
3386
+ return result;
2924
3387
  }
2925
3388
  })
2926
3389
  };
2927
3390
  if (context.apiToolsMetadata.length > 0) {
2928
3391
  const apiTools = buildApiTools({
2929
- rpc: context.input.rpc,
3392
+ rpc: context.rpc,
2930
3393
  metadata: context.apiToolsMetadata,
2931
3394
  session: context.session,
2932
3395
  sandboxRecord: context.sandboxRecord,
@@ -3213,6 +3676,15 @@ function computeUsageSummary(steps) {
3213
3676
  }
3214
3677
 
3215
3678
  // src/agent-workflow-steps.ts
3679
+ function emitStatus({
3680
+ writer,
3681
+ status,
3682
+ rpc
3683
+ }) {
3684
+ writer?.({ type: "data-status", data: status, transient: true });
3685
+ rpc({ method: "hook.status", params: { status } }).catch(() => {
3686
+ });
3687
+ }
3216
3688
  var BASE_SYSTEM_PROMPT = "You are an AI assistant with basic tools to interact with your environment. Explore and work freely.";
3217
3689
  function joinPromptSections(...sections) {
3218
3690
  return sections.filter((s) => s?.trim()).join("\n\n");
@@ -3258,7 +3730,8 @@ async function completeMessageStep({
3258
3730
  }) {
3259
3731
  "use step";
3260
3732
  const { getStorage: getStorage2 } = await Promise.resolve().then(() => (init_client(), client_exports));
3261
- const storage = getStorage2({ config: input.storageConfig, rpc: input.rpc });
3733
+ const rpc = resolveRpc(input.storageConfig.name ?? "default");
3734
+ const storage = getStorage2({ config: input.storageConfig, rpc });
3262
3735
  const message = await storage.message.get(assistantMessageId);
3263
3736
  if (message instanceof Error) {
3264
3737
  throw message;
@@ -3331,7 +3804,8 @@ async function streamTextStep({
3331
3804
  "use step";
3332
3805
  const { getStorage: getStorage2 } = await Promise.resolve().then(() => (init_client(), client_exports));
3333
3806
  const { getSandbox: getSandbox2 } = await Promise.resolve().then(() => (init_sandbox(), sandbox_exports));
3334
- const storage = getStorage2({ config: input.storageConfig, rpc: input.rpc });
3807
+ const rpc = resolveRpc(input.storageConfig.name ?? "default");
3808
+ const storage = getStorage2({ config: input.storageConfig, rpc });
3335
3809
  const abortController = new AbortController();
3336
3810
  const pollController = new AbortController();
3337
3811
  const { firstCheck } = pollForInterrupt({
@@ -3344,7 +3818,7 @@ async function streamTextStep({
3344
3818
  ,
3345
3819
  messagesResult,
3346
3820
  partsResult,
3347
- { session, skills, sandbox, sandboxRecord },
3821
+ { session, sandbox, sandboxRecord },
3348
3822
  apiToolsMetadata
3349
3823
  ] = await Promise.all([
3350
3824
  firstCheck,
@@ -3366,18 +3840,12 @@ async function streamTextStep({
3366
3840
  const sandbox2 = getSandbox2({
3367
3841
  sandboxRecord: sandboxRecord2,
3368
3842
  storageConfig: input.storageConfig,
3369
- storage,
3370
- rpc: input.rpc
3371
- });
3372
- const skills2 = await discoverSkillsInSandbox({
3373
- sandbox: sandbox2,
3374
- skillsDirs: session2.skillsDir || [],
3375
- debug: true
3843
+ storage
3376
3844
  });
3377
- return { session: session2, skills: skills2, sandbox: sandbox2, sandboxRecord: sandboxRecord2 };
3845
+ return { session: session2, sandbox: sandbox2, sandboxRecord: sandboxRecord2 };
3378
3846
  }),
3379
3847
  fetchApiToolsMetadata({
3380
- rpc: input.rpc
3848
+ rpc
3381
3849
  })
3382
3850
  ]);
3383
3851
  if (abortController.signal.aborted) {
@@ -3417,7 +3885,7 @@ async function streamTextStep({
3417
3885
  const subToolPartIds = [];
3418
3886
  let nextPartIndex = lastPartIndex;
3419
3887
  const onSubToolCall = async (toolName, toolInput, execute) => {
3420
- const res = await input.rpc({
3888
+ const res = await rpc({
3421
3889
  method: "tools.needsApproval",
3422
3890
  params: {
3423
3891
  toolName,
@@ -3512,6 +3980,7 @@ async function streamTextStep({
3512
3980
  };
3513
3981
  const rawTools = getTools({
3514
3982
  input,
3983
+ rpc,
3515
3984
  event,
3516
3985
  sandbox,
3517
3986
  session,
@@ -3519,91 +3988,10 @@ async function streamTextStep({
3519
3988
  apiToolsMetadata,
3520
3989
  onSubToolCall
3521
3990
  });
3522
- const skillsContext = buildSkillsContext(skills);
3523
- const systemHeader = joinPromptSections(BASE_SYSTEM_PROMPT, session.system);
3524
- const systemContext = joinPromptSections(skillsContext);
3525
3991
  if (!session.model) {
3526
3992
  throw new import_workflow2.FatalError("Session model is not set");
3527
3993
  }
3528
- const systemMessages = [
3529
- ...systemHeader.trim() ? [{ role: "system", content: systemHeader }] : [],
3530
- ...systemContext.trim() ? [{ role: "system", content: systemContext }] : []
3531
- ];
3532
3994
  const allParts = partsResult.items;
3533
- const approvedParts = allParts.filter(
3534
- (p) => p.part && "state" in p.part && p.part.state === "approval-responded" && "approval" in p.part && p.part.approval?.approved === true
3535
- );
3536
- const executedApprovals = [];
3537
- if (approvedParts.length > 0) {
3538
- const preExecMessages = [
3539
- ...systemMessages,
3540
- ...await (0, import_ai3.convertToModelMessages)(
3541
- assembleUIMessages({
3542
- messages: messagesResult.items,
3543
- parts: allParts,
3544
- until: event.createdAt,
3545
- includeQueued: true,
3546
- excludeSubToolParts: true
3547
- })
3548
- )
3549
- ];
3550
- await Promise.all(
3551
- approvedParts.map(async (ap) => {
3552
- if (!ap.part.type.startsWith("tool-")) {
3553
- return;
3554
- }
3555
- const part = ap.part;
3556
- const toolName = part.type.replace("tool-", "");
3557
- const toolDef = rawTools[toolName];
3558
- if (toolDef?.execute && part.input !== void 0) {
3559
- try {
3560
- const toolOutput = await toolDef.execute(part.input, {
3561
- toolCallId: part.toolCallId,
3562
- messages: preExecMessages,
3563
- abortSignal: abortController.signal,
3564
- experimental_context: {
3565
- session,
3566
- sandbox,
3567
- storage,
3568
- context: event.context
3569
- }
3570
- });
3571
- part.state = "output-available";
3572
- part.output = toolOutput;
3573
- executedApprovals.push({
3574
- toolCallId: part.toolCallId,
3575
- output: toolOutput
3576
- });
3577
- } catch (err) {
3578
- part.state = "output-error";
3579
- part.errorText = err instanceof Error ? err.message : String(err);
3580
- executedApprovals.push({
3581
- toolCallId: part.toolCallId,
3582
- output: void 0,
3583
- error: err instanceof Error ? err.message : String(err)
3584
- });
3585
- }
3586
- await storage.part.set({ ...ap, part });
3587
- }
3588
- })
3589
- );
3590
- }
3591
- const uiMessages = assembleUIMessages({
3592
- messages: messagesResult.items,
3593
- parts: allParts,
3594
- until: event.createdAt,
3595
- includeQueued: true,
3596
- excludeSubToolParts: true
3597
- });
3598
- const modelMessages = [
3599
- ...systemMessages,
3600
- ...await (0, import_ai3.convertToModelMessages)(uiMessages)
3601
- ];
3602
- const promptCaching = applyPromptCachingToModelRequest({
3603
- model: session.model,
3604
- sessionId: input.sessionId,
3605
- messages: modelMessages
3606
- });
3607
3995
  const usageSteps = [];
3608
3996
  let internalStepIndex = 0;
3609
3997
  const tools = Object.fromEntries(
@@ -3612,7 +4000,7 @@ async function streamTextStep({
3612
4000
  {
3613
4001
  ...t,
3614
4002
  needsApproval: async (toolInput, opts) => {
3615
- const res = await input.rpc({
4003
+ const res = await rpc({
3616
4004
  method: "tools.needsApproval",
3617
4005
  params: {
3618
4006
  toolName: name,
@@ -3631,13 +4019,14 @@ async function streamTextStep({
3631
4019
  }
3632
4020
  ])
3633
4021
  );
4022
+ let skillsRef = [];
3634
4023
  const result = (0, import_ai3.streamText)({
3635
- messages: promptCaching.messages,
4024
+ // Placeholder to pass validation — prepareStep replaces messages entirely.
4025
+ messages: [{ role: "user", content: "." }],
3636
4026
  tools,
3637
4027
  model: session.model,
3638
4028
  abortSignal: abortController.signal,
3639
4029
  activeTools: session.activeTools ?? void 0,
3640
- providerOptions: promptCaching.providerOptions,
3641
4030
  stopWhen: (0, import_ai3.stepCountIs)(1),
3642
4031
  temperature: session.generation?.temperature,
3643
4032
  topK: session.generation?.topK,
@@ -3652,6 +4041,130 @@ async function streamTextStep({
3652
4041
  storage,
3653
4042
  context: event.context
3654
4043
  },
4044
+ prepareStep: async ({ model }) => {
4045
+ if (lastPartIndex === 0) {
4046
+ if (sandbox._setupMeta) {
4047
+ const meta = await sandbox._setupMeta;
4048
+ emitStatus({
4049
+ writer: streamWriterRef.current,
4050
+ status: meta.needsSetupRun ? { type: "sandbox-setup-cold" } : { type: "sandbox-setup" },
4051
+ rpc
4052
+ });
4053
+ }
4054
+ if (sandbox._onReady) {
4055
+ await sandbox._onReady;
4056
+ }
4057
+ emitStatus({
4058
+ writer: streamWriterRef.current,
4059
+ status: { type: "loading-skills" },
4060
+ rpc
4061
+ });
4062
+ const skills = await discoverSkillsInSandbox({
4063
+ sandbox,
4064
+ skillsDirs: session.skillsDir || [],
4065
+ debug: true
4066
+ });
4067
+ skillsRef = skills;
4068
+ }
4069
+ const approvedParts = allParts.filter(
4070
+ (p) => p.part && "state" in p.part && p.part.state === "approval-responded" && "approval" in p.part && p.part.approval?.approved === true
4071
+ );
4072
+ if (approvedParts.length > 0) {
4073
+ emitStatus({
4074
+ writer: streamWriterRef.current,
4075
+ status: { type: "processing-approvals" },
4076
+ rpc
4077
+ });
4078
+ const preExecMessages = await (0, import_ai3.convertToModelMessages)(
4079
+ assembleUIMessages({
4080
+ messages: messagesResult.items,
4081
+ parts: allParts,
4082
+ until: event.createdAt,
4083
+ includeQueued: true,
4084
+ excludeSubToolParts: true
4085
+ }),
4086
+ { ignoreIncompleteToolCalls: true }
4087
+ );
4088
+ await Promise.all(
4089
+ approvedParts.map(async (ap) => {
4090
+ if (!ap.part.type.startsWith("tool-")) {
4091
+ return;
4092
+ }
4093
+ const part = ap.part;
4094
+ const toolName = part.type.replace("tool-", "");
4095
+ const toolDef = rawTools[toolName];
4096
+ if (toolDef?.execute && part.input !== void 0) {
4097
+ try {
4098
+ const toolOutput = await toolDef.execute(part.input, {
4099
+ toolCallId: part.toolCallId,
4100
+ messages: preExecMessages,
4101
+ abortSignal: abortController.signal,
4102
+ experimental_context: {
4103
+ session,
4104
+ sandbox,
4105
+ storage,
4106
+ context: event.context
4107
+ }
4108
+ });
4109
+ part.state = "output-available";
4110
+ part.output = toolOutput;
4111
+ streamWriterRef.current?.({
4112
+ type: "tool-output-available",
4113
+ toolCallId: part.toolCallId,
4114
+ output: toolOutput
4115
+ });
4116
+ } catch (err) {
4117
+ part.state = "output-error";
4118
+ part.errorText = err instanceof Error ? err.message : String(err);
4119
+ streamWriterRef.current?.({
4120
+ type: "tool-output-error",
4121
+ toolCallId: part.toolCallId,
4122
+ errorText: part.errorText
4123
+ });
4124
+ }
4125
+ await storage.part.set({ ...ap, part });
4126
+ }
4127
+ })
4128
+ );
4129
+ }
4130
+ emitStatus({
4131
+ writer: streamWriterRef.current,
4132
+ status: { type: "thinking" },
4133
+ rpc
4134
+ });
4135
+ const skillsContext = buildSkillsContext(skillsRef);
4136
+ const systemHeader = joinPromptSections(
4137
+ BASE_SYSTEM_PROMPT,
4138
+ session.system
4139
+ );
4140
+ const systemContext = joinPromptSections(skillsContext);
4141
+ const systemMessages = [
4142
+ ...systemHeader.trim() ? [{ role: "system", content: systemHeader }] : [],
4143
+ ...systemContext.trim() ? [{ role: "system", content: systemContext }] : []
4144
+ ];
4145
+ const uiMessages = assembleUIMessages({
4146
+ messages: messagesResult.items,
4147
+ parts: allParts,
4148
+ until: event.createdAt,
4149
+ includeQueued: true,
4150
+ excludeSubToolParts: true
4151
+ });
4152
+ const modelMessages = [
4153
+ ...systemMessages,
4154
+ ...await (0, import_ai3.convertToModelMessages)(uiMessages, {
4155
+ ignoreIncompleteToolCalls: true
4156
+ })
4157
+ ];
4158
+ const promptCaching = applyPromptCachingToModelRequest({
4159
+ model: typeof model === "string" ? model : model.modelId,
4160
+ sessionId: input.sessionId,
4161
+ messages: modelMessages
4162
+ });
4163
+ return {
4164
+ messages: promptCaching.messages,
4165
+ providerOptions: promptCaching.providerOptions
4166
+ };
4167
+ },
3655
4168
  onStepFinish: ({ usage }) => {
3656
4169
  if (usage) {
3657
4170
  usageSteps.push({
@@ -3674,30 +4187,28 @@ async function streamTextStep({
3674
4187
  const stream = (0, import_ai3.createUIMessageStream)({
3675
4188
  execute: ({ writer }) => {
3676
4189
  streamWriterRef.current = (event2) => writer.write(event2);
3677
- for (const ea of executedApprovals) {
3678
- if (ea.error) {
3679
- writer.write({
3680
- type: "tool-output-error",
3681
- toolCallId: ea.toolCallId,
3682
- errorText: ea.error
3683
- });
3684
- } else {
3685
- writer.write({
3686
- type: "tool-output-available",
3687
- toolCallId: ea.toolCallId,
3688
- output: ea.output
3689
- });
3690
- }
3691
- }
3692
4190
  writer.merge(
3693
4191
  result.toUIMessageStream({
3694
4192
  generateMessageId: () => assistantMessageId,
3695
4193
  onFinish: ({ messages }) => {
4194
+ let hasApprovals = false;
3696
4195
  for (const m of messages) {
3697
4196
  if (m.role === "assistant") {
3698
4197
  stepParts.push(...m.parts);
4198
+ for (const p of m.parts) {
4199
+ if ("state" in p && p.state === "approval-requested") {
4200
+ hasApprovals = true;
4201
+ }
4202
+ }
3699
4203
  }
3700
4204
  }
4205
+ if (hasApprovals) {
4206
+ emitStatus({
4207
+ writer: streamWriterRef.current,
4208
+ status: { type: "needs-approval" },
4209
+ rpc
4210
+ });
4211
+ }
3701
4212
  }
3702
4213
  })
3703
4214
  );
@@ -3841,4 +4352,4 @@ async function onMessage({
3841
4352
  agentWorkflow,
3842
4353
  approvalHook
3843
4354
  });
3844
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyLnRzIiwgIi4uL3NyYy9lcnJvcnMudHMiLCAiLi4vc3JjL3N0b3JhZ2UvY2xpZW50LnRzIiwgIi4uL3NyYy9zYW5kYm94L3dyaXRlLWZpbGVzLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2xvY2FsLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL3ZlcmNlbC1zZGsudHMiLCAiLi4vc3JjL3N0b3JhZ2UvcnBjLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2hhbmRsZXIudHMiLCAiLi4vc3JjL3N0b3JhZ2UvaW5kZXgudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2xpZmVjeWNsZS13b3JrZmxvdy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy92ZXJjZWwudHMiLCAiLi4vc3JjL3NhbmRib3gvY2xpZW50LnRzIiwgIi4uL3NyYy9zYW5kYm94L2luZGV4LnRzIiwgIi4uL3NyYy9hZ2VudC13b3JrZmxvdy50cyIsICIuLi9zcmMvYWdlbnQtd29ya2Zsb3ctc3RlcHMudHMiLCAiLi4vc3JjL3NraWxscy9wYXJzZXIudHMiLCAiLi4vc3JjL3NraWxscy9kaXNjb3Zlci50cyIsICIuLi9zcmMvdG9vbHMvaW5kZXgudHMiLCAiLi4vc3JjL3Rvb2xzL2phdmFzY3JpcHQudHMiLCAiLi4vc3JjL3V0aWxzL3Byb21wdC1jYWNoZS50cyIsICIuLi9zcmMvdXRpbHMvdWkudHMiLCAiLi4vc3JjL3V0aWxzL3VzYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEJhc2hSZXN1bHQsIFNhbmRib3ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX1VOVElMID0gMjAwMDtcblxuLyoqXG4gKiBTaGVsbCBzY3JpcHQgdGhhdCBoYW5kbGVzIGFsbCBwcm9jZXNzIGV4ZWN1dGlvbiBsb2dpYy5cbiAqIEluc3RhbGxlZCB0byB+Ly5hZ2VudC9iaW4vcnVuLnNoIGR1cmluZyBpbml0KCkuXG4gKi9cbmNvbnN0IFJVTl9TQ1JJUFQgPSBgIyEvYmluL3NoXG4jIFByb2Nlc3MgcnVubmVyIGZvciBBZ2VudCBTREtcbiMgQWxsIHBhcmFtZXRlcnMgcGFzc2VkIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYXZvaWQgZXNjYXBpbmcgaXNzdWVzXG4jIE91dHB1dCBpcyBiYXNlNjQgZW5jb2RlZCB0byBhdm9pZCBKU09OIGVzY2FwaW5nIGlzc3Vlc1xuXG5BR0VOVF9ESVI9XCIkSE9NRS8uYWdlbnRcIlxuQ1dEX0ZJTEU9XCIkQUdFTlRfRElSL2N3ZC8kU0VTU0lPTl9JRFwiXG5cbiMgR2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHBlci1zZXNzaW9uKVxuaWYgWyAtZiBcIiRDV0RfRklMRVwiIF07IHRoZW5cbiAgQ1dEPSQoY2F0IFwiJENXRF9GSUxFXCIpXG5lbHNlXG4gIENXRD1cIiRIT01FXCJcbmZpXG5cbiMgRGVjb2RlIGNvbW1hbmRcbkNNRD0kKGVjaG8gXCIkQ01EX0JBU0U2NFwiIHwgYmFzZTY0IC1kKVxuXG4jIEJhY2tncm91bmQgbW9kZSAod2FpdFVudGlsID0gMClcbmlmIFsgXCIkV0FJVF9VTlRJTFwiID0gXCIwXCIgXTsgdGhlblxuICBjZCBcIiRDV0RcIiB8fCBjZCBcIiRIT01FXCJcblxuICAjIEdlbmVyYXRlIGEgc2ltcGxlIG51bWVyaWMgSUQgZm9yIG91dHB1dCBmaWxlXG4gIE9VVFBVVF9JRD1cIiQoZGF0ZSArJXMpJCRcIlxuICBPVVRQVVRfRklMRT1cIiRBR0VOVF9ESVIvb3V0cHV0cy8kT1VUUFVUX0lELmxvZ1wiXG5cbiAgIyBEb3VibGUtZm9yayB0byBmdWxseSBkZXRhY2ggdGhlIHByb2Nlc3NcbiAgKFxuICAgIChcbiAgICAgIGV2YWwgXCIkQ01EXCJcbiAgICAgIHB3ZCA+IFwiJENXRF9GSUxFXCIgMj4vZGV2L251bGxcbiAgICApID4gXCIkT1VUUFVUX0ZJTEVcIiAyPiYxIDwgL2Rldi9udWxsICZcbiAgICBlY2hvICQhID4gXCIkQUdFTlRfRElSL3BpZHMvJE9VVFBVVF9JRC5waWRcIlxuICApXG5cbiAgIyBTbWFsbCBkZWxheSB0byBlbnN1cmUgUElEIGZpbGUgaXMgd3JpdHRlblxuICBzbGVlcCAwLjA1XG5cbiAgIyBSZWFkIFBJRFxuICBpZiBbIC1mIFwiJEFHRU5UX0RJUi9waWRzLyRPVVRQVVRfSUQucGlkXCIgXTsgdGhlblxuICAgIFBJRD0kKGNhdCBcIiRBR0VOVF9ESVIvcGlkcy8kT1VUUFVUX0lELnBpZFwiKVxuICBlbHNlXG4gICAgUElEPTBcbiAgZmlcblxuICAjIE91dHB1dCBKU09OIHJlc3VsdCAobm8gb3V0cHV0IGZvciBiYWNrZ3JvdW5kLCBzbyBubyBlbmNvZGluZyBuZWVkZWQpXG4gIHByaW50ZiAne1wicGlkXCI6JWQsXCJvdXRwdXRCYXNlNjRcIjpcIlwiLFwiZXhpdENvZGVcIjotMSxcInN0YXR1c1wiOlwicnVubmluZ1wiLFwib3V0cHV0RmlsZVwiOlwiJXNcIixcImN3ZFwiOlwiJXNcIn1cXFxcbicgXFxcXFxuICAgIFwiJFBJRFwiIFwiJE9VVFBVVF9GSUxFXCIgXCIkQ1dEXCJcbiAgZXhpdCAwXG5maVxuXG4jIEZvcmVncm91bmQgbW9kZSAod2FpdFVudGlsID4gMCkgLSBydW4gZGlyZWN0bHkgYW5kIGNhcHR1cmUgb3V0cHV0XG5jZCBcIiRDV0RcIiB8fCBjZCBcIiRIT01FXCJcblxuIyBSdW4gY29tbWFuZCwgY2FwdHVyZSBvdXRwdXQgYW5kIGV4aXQgY29kZVxuT1VUUFVUPSQoZXZhbCBcIiRDTURcIiAyPiYxKVxuRVhJVF9DT0RFPSQ/XG5cbiMgVXBkYXRlIENXRCBhZnRlciBjb21tYW5kXG5ORVdfQ1dEPSQocHdkKVxuZWNobyBcIiRORVdfQ1dEXCIgPiBcIiRDV0RfRklMRVwiXG5cbiMgRGV0ZXJtaW5lIHN0YXR1c1xuaWYgWyAkRVhJVF9DT0RFIC1lcSAwIF07IHRoZW5cbiAgU1RBVFVTPVwiY29tcGxldGVkXCJcbmVsc2VcbiAgU1RBVFVTPVwiZmFpbGVkXCJcbmZpXG5cbiMgQmFzZTY0IGVuY29kZSBvdXRwdXQgdG8gYXZvaWQgQUxMIGVzY2FwaW5nIGlzc3Vlc1xuT1VUUFVUX0JBU0U2ND0kKHByaW50ZiAnJXMnIFwiJE9VVFBVVFwiIHwgYmFzZTY0IHwgdHIgLWQgJ1xcXFxuJylcblxuIyBPdXRwdXQgSlNPTiByZXN1bHQgd2l0aCBiYXNlNjQtZW5jb2RlZCBvdXRwdXRcbnByaW50ZiAne1wicGlkXCI6MCxcIm91dHB1dEJhc2U2NFwiOlwiJXNcIixcImV4aXRDb2RlXCI6JWQsXCJzdGF0dXNcIjpcIiVzXCIsXCJvdXRwdXRGaWxlXCI6XCJcIixcImN3ZFwiOlwiJXNcIn1cXFxcbicgXFxcXFxuICBcIiRPVVRQVVRfQkFTRTY0XCIgXCIkRVhJVF9DT0RFXCIgXCIkU1RBVFVTXCIgXCIkTkVXX0NXRFwiXG5gO1xuXG50eXBlIFJ1bk9wdGlvbnMgPSB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE1heCBtcyB0byB3YWl0IGZvciBjb21wbGV0aW9uLlxuICAgKiAtIDA6IEJhY2tncm91bmQgbW9kZSAtIHJldHVybiBpbW1lZGlhdGVseSB3aXRoIFBJRFxuICAgKiAtID4wOiBGb3JlZ3JvdW5kIG1vZGUgLSB3YWl0IGZvciBjb21wbGV0aW9uIChkZWZhdWx0OiAzMDAwMClcbiAgICovXG4gIHdhaXRVbnRpbD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogUHJvY2VzcyBtYW5hZ2VyIHRoYXQgdXNlcyBhIHNpbmdsZSBzaGVsbCBzY3JpcHQgdG8gaGFuZGxlIGFsbCBleGVjdXRpb24gbG9naWMuXG4gKiBSZWR1Y2VzIHJvdW5kLXRyaXBzIHRvIHRoZSBzYW5kYm94IGJ5IGRvaW5nIGV2ZXJ5dGhpbmcgaW4gb25lIGV4ZWMgY2FsbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVByb2Nlc3NNYW5hZ2VyID0gKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59KSA9PiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2Vzc2lvbklkIH0gPSBvcHRzO1xuICBsZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBjb25zdCBpbml0ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChpbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICBjb21tYW5kOiBcInNoXCIsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFwiLWNcIixcbiAgICAgICAgYG1rZGlyIC1wICRIT01FLy5hZ2VudC9iaW4gJEhPTUUvLmFnZW50L3BpZHMgJEhPTUUvLmFnZW50L291dHB1dHMgJEhPTUUvLmFnZW50L2N3ZFxuY2F0ID4gJEhPTUUvLmFnZW50L2Jpbi9ydW4uc2ggPDwgJ1NDUklQVF9FT0YnXG4ke1JVTl9TQ1JJUFR9XG5TQ1JJUFRfRU9GXG5jaG1vZCAreCAkSE9NRS8uYWdlbnQvYmluL3J1bi5zaGAsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyByZXN1bHQ7XG4gICAgfVxuICAgIGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IHJ1biA9IGFzeW5jIChvcHRzOiBSdW5PcHRpb25zKTogUHJvbWlzZTxCYXNoUmVzdWx0PiA9PiB7XG4gICAgYXdhaXQgaW5pdCgpO1xuXG4gICAgY29uc3QgeyBjb21tYW5kLCB3YWl0VW50aWwgPSBERUZBVUxUX1dBSVRfVU5USUwgfSA9IG9wdHM7XG4gICAgY29uc3QgY21kQmFzZTY0ID0gQnVmZmVyLmZyb20oY29tbWFuZCwgXCJ1dGYtOFwiKS50b1N0cmluZyhcImJhc2U2NFwiKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICBjb21tYW5kOiBcInNoXCIsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFwiLWNcIixcbiAgICAgICAgYENNRF9CQVNFNjQ9XCIke2NtZEJhc2U2NH1cIiBXQUlUX1VOVElMPVwiJHt3YWl0VW50aWx9XCIgU0VTU0lPTl9JRD1cIiR7c2Vzc2lvbklkfVwiICRIT01FLy5hZ2VudC9iaW4vcnVuLnNoYCxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0ZG91dC50cmltKCkpIGFzIHtcbiAgICAgIHBpZDogbnVtYmVyO1xuICAgICAgb3V0cHV0QmFzZTY0OiBzdHJpbmc7XG4gICAgICBleGl0Q29kZTogbnVtYmVyO1xuICAgICAgc3RhdHVzOiBcInJ1bm5pbmdcIiB8IFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiO1xuICAgICAgb3V0cHV0RmlsZTogc3RyaW5nO1xuICAgICAgY3dkOiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vIERlY29kZSBiYXNlNjQgb3V0cHV0XG4gICAgY29uc3Qgb3V0cHV0ID0gcGFyc2VkLm91dHB1dEJhc2U2NFxuICAgICAgPyBCdWZmZXIuZnJvbShwYXJzZWQub3V0cHV0QmFzZTY0LCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0Zi04XCIpXG4gICAgICA6IFwiXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGlkOiBwYXJzZWQucGlkLFxuICAgICAgb3V0cHV0LFxuICAgICAgZXhpdENvZGU6IHBhcnNlZC5leGl0Q29kZSxcbiAgICAgIHN0YXR1czogcGFyc2VkLnN0YXR1cyxcbiAgICAgIGN3ZDogcGFyc2VkLmN3ZCxcbiAgICAgIG91dHB1dEZpbGU6IHBhcnNlZC5vdXRwdXRGaWxlLFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgZ2V0Q3dkID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgYXdhaXQgaW5pdCgpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IFwic2hcIixcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgXCItY1wiLFxuICAgICAgICBgY2F0ICRIT01FLy5hZ2VudC9jd2QvJHtzZXNzaW9uSWR9IDI+L2Rldi9udWxsIHx8IGVjaG8gXCIkSE9NRVwiYCxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzLmN3ZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuICAgIHJldHVybiBzdGRvdXQudHJpbSgpIHx8IHByb2Nlc3MuY3dkKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBpbml0LFxuICAgIHJ1bixcbiAgICBnZXRDd2QsXG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcm9jZXNzTWFuYWdlciA9IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVByb2Nlc3NNYW5hZ2VyPjtcbiIsICJpbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlc3Npb25Ob3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2Vzc2lvbiAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTZXNzaW9uRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTZXNzaW9uICRpZCBmYWlsZWQ6ICRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTYW5kYm94Tm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveE5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTYW5kYm94ICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlN0b3JhZ2VFcnJvclwiLFxuICBtZXNzYWdlOiBcIiRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTYW5kYm94RXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hFcnJvclwiLFxuICBtZXNzYWdlOiBcIiRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiTWVzc2FnZU5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJNZXNzYWdlICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG4iLCAiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHtcbiAgTWVzc2FnZU5vdEZvdW5kRXJyb3IsXG4gIFNhbmRib3hOb3RGb3VuZEVycm9yLFxuICBTZXNzaW9uTm90Rm91bmRFcnJvcixcbiAgU3RvcmFnZUVycm9yLFxufSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VNZXRob2RzIH0gZnJvbSBcIi4vcnBjXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIExpc3RSZXN1bHQsXG4gIFBhcnQsXG4gIFN0b3JhZ2UsXG4gIFN0b3JhZ2VDb25maWcsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbnR5cGUgUnBjUmVzcG9uc2U8VD4gPVxuICB8IHsgcmVzdWx0OiBUIH1cbiAgfCB7IGVycm9yOiB7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0gfTtcblxuZXhwb3J0IHR5cGUgUnBjRm4gPSAocGFyYW1zOiB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXJhbXM6IHVua25vd247XG59KSA9PiBQcm9taXNlPFJwY1Jlc3BvbnNlPHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2VDbGllbnQocnBjRm46IFJwY0ZuLCBuYW1lPzogc3RyaW5nKTogU3RvcmFnZSB7XG4gIGFzeW5jIGZ1bmN0aW9uIHJwYzxNIGV4dGVuZHMga2V5b2YgU3RvcmFnZU1ldGhvZHM+KFxuICAgIG1ldGhvZDogTSxcbiAgICBwYXJhbXM6IHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJwYXJhbXNcIl0+XG4gICk6IFByb21pc2U8ei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInJlc3VsdFwiXT4+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGNGbih7IG5hbWUsIG1ldGhvZCwgcGFyYW1zIH0pO1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IHJlc3VsdC5lcnJvci5tZXNzYWdlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJyZXN1bHRcIl0+O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInNlc3Npb24uZ2V0XCIsIHsgaWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uTm90Rm91bmRFcnJvcih7IGlkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHNlc3Npb24pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5zZXRcIiwgc2Vzc2lvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAoeyBzZXNzaW9uSWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi50YWcuc2V0XCIsIHsgc2Vzc2lvbklkLCB0YWdzIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIGxpc3Q6IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwibWVzc2FnZS5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwibWVzc2FnZS5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VOb3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJtZXNzYWdlLnNldFwiLCBtZXNzYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBsaXN0QnlNZXNzYWdlOiBhc3luYyAobWVzc2FnZUlkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlNZXNzYWdlXCIsIHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlTZXNzaW9uXCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChwYXJ0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJwYXJ0LnNldFwiLCBwYXJ0KSkgYXMgUGFydDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZWxldGU6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInBhcnQuZGVsZXRlXCIsIHsgaWQgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgc2FuZGJveDoge1xuICAgICAgZ2V0OiBhc3luYyAoa2V5KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2FuZGJveC5nZXRcIiwgeyBrZXkgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBrZXkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2FuZGJveC5nZXRCeVNlc3Npb25cIiwgeyBzZXNzaW9uSWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBzZXNzaW9uSWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2FuZGJveC5zZXRcIiwgcmVjb3JkKTtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3Q6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gubGlzdFwiLCB7XG4gICAgICAgICAgICB0YWdzOiBvcHRzPy50YWdzLFxuICAgICAgICAgICAgb3JkZXI6IG9wdHM/Lm9yZGVyLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGFnOiB7XG4gICAgICAgIHNldDogYXN5bmMgKHsgc2FuZGJveElkLCB0YWdzIH0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gudGFnLnNldFwiLCB7IHNhbmRib3hJZCwgdGFncyB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb21tYW5kOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5nZXRcIiwgeyBpZCB9KSkgYXMgQ29tbWFuZCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoY29tbWFuZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5zZXRcIiwgY29tbWFuZCkpIGFzIENvbW1hbmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcImNvbW1hbmQubGlzdFwiLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBpbmNsdWRlRmluaXNoZWQ6IG9wdHM/LmluY2x1ZGVGaW5pc2hlZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxDb21tYW5kPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkFNRVNQQUNFID0gXCJkZWZhdWx0XCI7XG5leHBvcnQgY29uc3QgTE9DQUxfU1RPUkFHRV9WRVJTSU9OID0gXCJ2MVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZShvcHRzOiB7XG4gIGNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgcnBjOiBScGNGbjtcbn0pOiBTdG9yYWdlIHtcbiAgY29uc3QgbmFtZSA9IG9wdHMuY29uZmlnLm5hbWUgPz8gREVGQVVMVF9OQU1FU1BBQ0U7XG4gIHJldHVybiBnZXRTdG9yYWdlQ2xpZW50KG9wdHMucnBjLCBuYW1lKTtcbn1cbiIsICJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgVXBsb2FkYWJsZUZpbGUgfSBmcm9tIFwiLi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFdyaXRlcyBmaWxlcyB0byBhIHNhbmRib3ggYXQgdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBwYXRoLlxuICogU2hlbGwgc2NyaXB0cyAoLnNoIGZpbGVzKSBhcmUgYXV0b21hdGljYWxseSBtYWRlIGV4ZWN1dGFibGUuXG4gKlxuICogRm9yIHNtYWxsIGZpbGVzICg8MTAwS0IgdG90YWwpLCB1c2VzIHNpbmdsZSBleGVjIHdpdGggaGVyZWRvYy5cbiAqIEZvciBsYXJnZSBmaWxlcywgd3JpdGVzIGJhc2U2NCBjaHVua3MgdGhlbiBkZWNvZGVzIHRvIGF2b2lkIEFSR19NQVggbGltaXRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlcyhvcHRzOiB7XG4gIHNhbmRib3g6IFBpY2s8U2FuZGJveCwgXCJleGVjXCI+O1xuICBmaWxlczogVXBsb2FkYWJsZUZpbGVbXTtcbiAgZGVzdFBhdGg6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBmaWxlcywgZGVzdFBhdGggfSA9IG9wdHM7XG5cbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbGVQYXRocyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5wb3NpeC5qb2luKGRlc3RQYXRoLCBmaWxlLnBhdGgpKTtcbiAgY29uc3QgcGFyZW50RGlycyA9IEFycmF5LmZyb20oXG4gICAgbmV3IFNldChmaWxlUGF0aHMubWFwKChwKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocCkpKVxuICApO1xuICBjb25zdCBzaGVsbFNjcmlwdHMgPSBmaWxlUGF0aHMuZmlsdGVyKChwKSA9PiBwLmVuZHNXaXRoKFwiLnNoXCIpKTtcblxuICBjb25zdCBta2RpclJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJta2RpclwiLFxuICAgIGFyZ3M6IFtcIi1wXCIsIC4uLnBhcmVudERpcnNdLFxuICB9KTtcbiAgaWYgKG1rZGlyUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICB0aHJvdyBta2RpclJlc3VsdDtcbiAgfVxuICBhd2FpdCBta2RpclJlc3VsdC5yZXN1bHQ7XG5cbiAgY29uc3QgQ0hVTktfU0laRSA9IDUwXzAwMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gZmlsZVBhdGhzW2ldO1xuICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSB0b0Jhc2U2NChmaWxlLmNvbnRlbnQpO1xuXG4gICAgaWYgKGJhc2U2NENvbnRlbnQubGVuZ3RoIDwgQ0hVTktfU0laRSkge1xuICAgICAgY29uc3QgbWFya2VyID0gYEVPRl8ke2l9YDtcbiAgICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICBgYmFzZTY0IC1kID4gJHtxdW90ZShmdWxsUGF0aCl9IDw8ICcke21hcmtlcn0nXG4ke2Jhc2U2NENvbnRlbnR9XG4ke21hcmtlcn1gLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXhlY1Jlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBleGl0Q29kZSwgc3RkZXJyIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHdyaXRlRmlsZXMgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZXhpdENvZGV9OiAke3N0ZGVycn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlbXBCNjQgPSBgL3RtcC9jaHVuay0ke0RhdGUubm93KCl9LSR7aX0uYjY0YDtcblxuICAgICAgY29uc3QgY2xlYXJSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgYXJnczogW1wiLWNcIiwgYD4gJHtxdW90ZSh0ZW1wQjY0KX1gXSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGNsZWFyUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgY2xlYXJSZXN1bHQ7XG4gICAgICB9XG4gICAgICBhd2FpdCBjbGVhclJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBvZmZzZXQgPCBiYXNlNjRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgb2Zmc2V0ICs9IENIVU5LX1NJWkVcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjaHVuayA9IGJhc2U2NENvbnRlbnQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBDSFVOS19TSVpFKTtcbiAgICAgICAgY29uc3QgbWFya2VyID0gYENIVU5LXyR7b2Zmc2V0fWA7XG4gICAgICAgIGNvbnN0IGFwcGVuZFJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgYGNhdCA+PiAke3F1b3RlKHRlbXBCNjQpfSA8PCAnJHttYXJrZXJ9J1xuJHtjaHVua31cbiR7bWFya2VyfWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFwcGVuZFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgYXBwZW5kUmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBleGl0Q29kZSwgc3RkZXJyIH0gPSBhd2FpdCBhcHBlbmRSZXN1bHQucmVzdWx0O1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgd3JpdGVGaWxlcyBjaHVuayBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZX06ICR7c3RkZXJyfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29kZVJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgXCItY1wiLFxuICAgICAgICAgIGBiYXNlNjQgLWQgPCAke3F1b3RlKHRlbXBCNjQpfSA+ICR7cXVvdGUoZnVsbFBhdGgpfSAmJiBybSAtZiAke3F1b3RlKHRlbXBCNjQpfWAsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29kZVJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGRlY29kZVJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBleGl0Q29kZSwgc3RkZXJyIH0gPSBhd2FpdCBkZWNvZGVSZXN1bHQucmVzdWx0O1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgd3JpdGVGaWxlcyBkZWNvZGUgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZXhpdENvZGV9OiAke3N0ZGVycn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHNoZWxsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY2htb2RSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJjaG1vZFwiLFxuICAgICAgYXJnczogW1wiK3hcIiwgLi4uc2hlbGxTY3JpcHRzXSxcbiAgICB9KTtcbiAgICBpZiAoY2htb2RSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgY2htb2RSZXN1bHQ7XG4gICAgfVxuICAgIGF3YWl0IGNobW9kUmVzdWx0LnJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0Jhc2U2NChjb250ZW50OiBzdHJpbmcgfCBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG5cbmZ1bmN0aW9uIHF1b3RlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7cy5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgU2FuZGJveEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWdzU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hSZWNvcmQsIFN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBMb2dFbnRyeSwgU2FuZGJveCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgd3JpdGVGaWxlcyB9IGZyb20gXCIuLi93cml0ZS1maWxlc1wiO1xuXG5leHBvcnQgY29uc3QgbG9jYWxTYW5kYm94ID0gPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZSxcbn06IHtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZCAmIHsgY29uZmlnOiB7IHR5cGU6IFwibG9jYWxcIiB9IH07XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG59KTogU2FuZGJveDxUVGFncz4gPT4ge1xuICBjb25zdCBjb25maWcgPSBzYW5kYm94UmVjb3JkLmNvbmZpZztcbiAgY29uc3QgYmFzZVBhdGggPSBjb25maWcucGF0aCA/PyBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBwcm9jZXNzZXMgPSBuZXcgTWFwPHN0cmluZywgQ2hpbGRQcm9jZXNzPigpO1xuXG4gIGNvbnN0IHNhbmRib3g6IFNhbmRib3g8VFRhZ3M+ID0ge1xuICAgIGlkOiBzYW5kYm94UmVjb3JkLmlkLFxuICAgIGNvbmZpZzogc2FuZGJveFJlY29yZC5jb25maWcsXG4gICAgZXhlYzogKHsgY29tbWFuZCwgYXJncywgc2lnbmFsIH0pID0+IHtcbiAgICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21tYW5kSWQgPSBgY29tbWFuZF8ke3VsaWQoKX1gO1xuXG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgICAgICAgICBjd2Q6IGJhc2VQYXRoLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcHJvY2Vzc2VzLnNldChjb21tYW5kSWQsIGNoaWxkKTtcblxuICAgICAgICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgICAgICAgIGNvbnN0IGxvZ1F1ZXVlOiBMb2dFbnRyeVtdID0gW107XG4gICAgICAgICAgbGV0IGxvZ1Jlc29sdmU6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGxldCBjbG9zZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuICAgICAgICAgICAgc3Rkb3V0ICs9IHN0cjtcbiAgICAgICAgICAgIGxvZ1F1ZXVlLnB1c2goeyBzdHJlYW06IFwic3Rkb3V0XCIsIGRhdGE6IHN0ciB9KTtcbiAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICAgICAgICBzdGRlcnIgKz0gc3RyO1xuICAgICAgICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRlcnJcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgUHJvbWlzZTx7XG4gICAgICAgICAgICBzdGRvdXQ6IHN0cmluZztcbiAgICAgICAgICAgIHN0ZGVycjogc3RyaW5nO1xuICAgICAgICAgICAgZXhpdENvZGU6IG51bWJlcjtcbiAgICAgICAgICB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VzLmRlbGV0ZShjb21tYW5kSWQpO1xuICAgICAgICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2hpbGQub24oXCJjbG9zZVwiLCAoY29kZTogbnVtYmVyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICBwcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgICAgICByZXNvbHZlKHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBjb2RlID8/IDAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8TG9nRW50cnk+IHtcbiAgICAgICAgICAgIHdoaWxlICghY2xvc2VkIHx8IGxvZ1F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBsb2dRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxvZ1Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxvZ1Jlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGNvbW1hbmRJZCwgbG9ncywgcmVzdWx0IH0pO1xuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGU6IHVua25vd24pID0+XG4gICAgICAgICAgbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXREb21haW46IChwb3J0KSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKTtcbiAgICB9LFxuXG4gICAga2lsbDogYXN5bmMgKHsgY29tbWFuZElkLCBzdG9yYWdlIH0pID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkID0gcHJvY2Vzc2VzLmdldChjb21tYW5kSWQpO1xuICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgICAgcmVhc29uOiBgQ29tbWFuZCAke2NvbW1hbmRJZH0gbm90IGZvdW5kIG9yIGFscmVhZHkgZmluaXNoZWRgLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG5cbiAgICAgIGNvbnN0IGNtZCA9IGF3YWl0IHN0b3JhZ2UuY29tbWFuZC5nZXQoY29tbWFuZElkKTtcbiAgICAgIGlmIChjbWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogY21kLm1lc3NhZ2UsIGNhdXNlOiBjbWQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY21kICYmIGNtZC5zdGF0dXMgPT09IFwicnVubmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UuY29tbWFuZC5zZXQoe1xuICAgICAgICAgIC4uLmNtZCxcbiAgICAgICAgICBzdGF0dXM6IFwia2lsbGVkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogcmVzdWx0Lm1lc3NhZ2UsIGNhdXNlOiByZXN1bHQgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgd3JpdGVGaWxlczogKG9wdHMpID0+IHdyaXRlRmlsZXMoeyBzYW5kYm94LCAuLi5vcHRzIH0pLFxuXG4gICAgdGFnOiB7XG4gICAgICBsaXN0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNhbmRib3guaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzYW5kYm94UmVjb3JkLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNhbmRib3guaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQudGFncz8uW2tleSBhcyBzdHJpbmddIGFzXG4gICAgICAgICAgfCBUVGFnc1t0eXBlb2Yga2V5XVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3gudGFnLnNldCh7XG4gICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LmlkLFxuICAgICAgICAgIHRhZ3M6IHsgW2tleV06IHZhbHVlIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0TWFueTogYXN5bmMgKHRhZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guaWQsXG4gICAgICAgICAgdGFnczogdGFncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gc2FuZGJveDtcbn07XG4iLCAiZXhwb3J0IHsgU2FuZGJveCB9IGZyb20gXCJzYW5kYm94XCI7XG4iLCAiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuY29uc3QgVmVyY2VsTGlmZWN5Y2xlQ29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICBwb2xsSW50ZXJ2YWxNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzdG9wQWZ0ZXJJbmFjdGl2ZU1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHNuYXBzaG90QmVmb3JlVGltZW91dE1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHNuYXBzaG90SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgYXV0b1N0YXJ0OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTYW5kYm94Q29uZmlnU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcInZlcmNlbFwiKSxcbiAgICByZXNvdXJjZXM6IHoub2JqZWN0KHsgdmNwdXM6IHoubnVtYmVyKCkgfSkub3B0aW9uYWwoKSxcbiAgICBwb3J0czogei5hcnJheSh6Lm51bWJlcigpKS5vcHRpb25hbCgpLFxuICAgIGxpZmVjeWNsZTogVmVyY2VsTGlmZWN5Y2xlQ29uZmlnU2NoZW1hLm9wdGlvbmFsKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwibG9jYWxcIiksXG4gICAgcGF0aDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB9KSxcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcImN1c3RvbVwiKSxcbiAgICB1cmw6IHouc3RyaW5nKCksXG4gICAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgfSksXG5dKTtcblxuZXhwb3J0IHR5cGUgU2FuZGJveENvbmZpZyA9IHouaW5mZXI8dHlwZW9mIFNhbmRib3hDb25maWdTY2hlbWE+O1xuXG5jb25zdCBHZW5lcmF0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICBtYXhTdGVwczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0ZW1wZXJhdHVyZTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3BLOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvcFA6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgZnJlcXVlbmN5UGVuYWx0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBwcmVzZW5jZVBlbmFsdHk6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgbWF4T3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFNlc3Npb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIHVwZGF0ZWRBdDogei5udW1iZXIoKSxcbiAgcnVuSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgbGFzdE1lc3NhZ2VJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkubnVsbGFibGUoKSxcbiAgc3lzdGVtOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIG1vZGVsOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHNhbmRib3hJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBza2lsbHNEaXI6IHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGFibGUoKSxcbiAgaG9va1Rva2VuOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGFjdGl2ZVRvb2xzOiB6LmFycmF5KHouc3RyaW5nKCkpLm51bGxhYmxlKCksXG4gIGdlbmVyYXRpb246IEdlbmVyYXRpb25TY2hlbWEubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTdGVwVXNhZ2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHN0ZXBJbmRleDogei5udW1iZXIoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCksXG4gIGlucHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICBvdXRwdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIHRvdGFsVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVJlYWRUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlV3JpdGVUb2tlbnM6IHoubnVtYmVyKCksXG4gIHJlYXNvbmluZ1Rva2Vuczogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgVXNhZ2VTdW1tYXJ5U2NoZW1hID0gei5vYmplY3Qoe1xuICBtb2RlbDogei5zdHJpbmcoKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIG91dHB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgdG90YWxUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVXcml0ZVRva2Vuczogei5udW1iZXIoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLFxuICBzdGVwQ291bnQ6IHoubnVtYmVyKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IE1lc3NhZ2VVc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3RlcHM6IHouYXJyYXkoU3RlcFVzYWdlU2NoZW1hKSxcbiAgc3VtbWFyeTogVXNhZ2VTdW1tYXJ5U2NoZW1hLFxufSk7XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VVc2FnZSA9IHouaW5mZXI8dHlwZW9mIE1lc3NhZ2VVc2FnZVNjaGVtYT47XG5leHBvcnQgdHlwZSBVc2FnZVN1bW1hcnkgPSB6LmluZmVyPHR5cGVvZiBVc2FnZVN1bW1hcnlTY2hlbWE+O1xuZXhwb3J0IHR5cGUgU3RlcFVzYWdlID0gei5pbmZlcjx0eXBlb2YgU3RlcFVzYWdlU2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IE1lc3NhZ2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gIHJvbGU6IHouZW51bShbXCJ1c2VyXCIsIFwiYXNzaXN0YW50XCIsIFwic3lzdGVtXCJdKSxcbiAgY3JlYXRlZEF0OiB6Lm51bWJlcigpLFxuICBzdGFydGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgY29tcGxldGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgaW50ZXJydXB0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICB1c2FnZTogTWVzc2FnZVVzYWdlU2NoZW1hLm51bGxhYmxlKCksXG59KTtcblxuLyoqXG4gKiBUaGUgYHBhcnRgIGZpZWxkIGNvcnJlc3BvbmRzIHRvIGBVSU1lc3NhZ2VbXCJwYXJ0c1wiXVtudW1iZXJdYCBmcm9tIHRoZSBgYWlgIHBhY2thZ2UuXG4gKiBXZSB1c2UgYHoudW5rbm93bigpYCBiZWNhdXNlIHRoZSBleGFjdCBzaGFwZSB2YXJpZXMgYnkgcGFydCB0eXBlICh0ZXh0LCB0b29sLWNhbGwsXG4gKiB0b29sLXJlc3VsdCwgZXRjLikgYW5kIG1heSBldm9sdmUgd2l0aCB0aGUgQUkgU0RLLiBUaGUgUlBDIGxheWVyIGp1c3QgcGFzc2VzIGl0IHRocm91Z2guXG4gKi9cbmV4cG9ydCBjb25zdCBQYXJ0U2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgbWVzc2FnZUlkOiB6LnN0cmluZygpLFxuICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gIGluZGV4OiB6Lm51bWJlcigpLFxuICBwYXJ0OiB6LnVua25vd24oKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgQ29tbWFuZFJlc3VsdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3Rkb3V0OiB6LnN0cmluZygpLFxuICBzdGRlcnI6IHouc3RyaW5nKCksXG4gIGV4aXRDb2RlOiB6Lm51bWJlcigpLFxuICBjb21wbGV0ZWRBdDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2FuZGJveFJlY29yZFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIGNvbmZpZzogU2FuZGJveENvbmZpZ1NjaGVtYSxcbiAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm51bGxhYmxlKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBsYXN0QWN0aXZpdHlBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0F0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIHByb3ZpZGVyTWV0YWRhdGE6IHpcbiAgICAuZGlzY3JpbWluYXRlZFVuaW9uKFwicHJvdmlkZXJcIiwgW1xuICAgICAgei5vYmplY3Qoe1xuICAgICAgICBwcm92aWRlcjogei5saXRlcmFsKFwidmVyY2VsXCIpLFxuICAgICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgICAgc25hcHNob3RJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgfSksXG4gICAgXSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5jb25zdCBDb21tYW5kQmFzZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgY29tbWFuZDogei5zdHJpbmcoKSxcbiAgYXJnczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBzdGFydGVkQXQ6IHoubnVtYmVyKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IENvbW1hbmRTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInN0YXR1c1wiLCBbXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7IHN0YXR1czogei5saXRlcmFsKFwicnVubmluZ1wiKSB9KSxcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHtcbiAgICBzdGF0dXM6IHoubGl0ZXJhbChcImNvbXBsZXRlZFwiKSxcbiAgICByZXN1bHQ6IENvbW1hbmRSZXN1bHRTY2hlbWEsXG4gIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwia2lsbGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYS5vcHRpb25hbCgpLFxuICB9KSxcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHtcbiAgICBzdGF0dXM6IHoubGl0ZXJhbChcImZhaWxlZFwiKSxcbiAgICByZXN1bHQ6IENvbW1hbmRSZXN1bHRTY2hlbWEsXG4gIH0pLFxuXSk7XG5cbmZ1bmN0aW9uIExpc3RSZXN1bHRTY2hlbWE8VCBleHRlbmRzIHouWm9kVHlwZUFueT4oaXRlbVNjaGVtYTogVCkge1xuICByZXR1cm4gei5vYmplY3Qoe1xuICAgIGl0ZW1zOiB6LmFycmF5KGl0ZW1TY2hlbWEpLFxuICAgIG5leHRDdXJzb3I6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgfSk7XG59XG5cbmNvbnN0IG1ldGhvZHMgPSB7XG4gIFwic2Vzc2lvbi5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzZXNzaW9uLnNldFwiOiB7XG4gICAgcGFyYW1zOiBTZXNzaW9uU2NoZW1hLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYSxcbiAgfSxcbiAgXCJzZXNzaW9uLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gICAgICBvcmRlcjogelxuICAgICAgICAuZW51bShbXG4gICAgICAgICAgXCJjcmVhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJjcmVhdGVkQXRfZGVzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNlc3Npb25TY2hlbWEpLFxuICB9LFxuICBcInNlc3Npb24ubGlzdEJ5U2FuZGJveFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2Vzc2lvblNjaGVtYSksXG4gIH0sXG4gIFwic2Vzc2lvbi50YWcuc2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEsXG4gIH0sXG4gIFwibWVzc2FnZS5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IE1lc3NhZ2VTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJtZXNzYWdlLnNldFwiOiB7XG4gICAgcGFyYW1zOiBNZXNzYWdlU2NoZW1hLFxuICAgIHJlc3VsdDogTWVzc2FnZVNjaGVtYSxcbiAgfSxcbiAgXCJtZXNzYWdlLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShNZXNzYWdlU2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZUlkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0LnNldFwiOiB7XG4gICAgcGFyYW1zOiBQYXJ0U2NoZW1hLFxuICAgIHJlc3VsdDogUGFydFNjaGVtYSxcbiAgfSxcbiAgXCJwYXJ0LmRlbGV0ZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBrZXk6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBzZXNzaW9uSWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5zZXRcIjoge1xuICAgIHBhcmFtczogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNhbmRib3gubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJsYXN0QWN0aXZpdHlBdF9hc2NcIixcbiAgICAgICAgICBcImxhc3RBY3Rpdml0eUF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNhbmRib3hSZWNvcmRTY2hlbWEpLFxuICB9LFxuICBcInNhbmRib3gudGFnLnNldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLFxuICB9LFxuICBcImNvbW1hbmQuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBDb21tYW5kU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwiY29tbWFuZC5zZXRcIjoge1xuICAgIHBhcmFtczogQ29tbWFuZFNjaGVtYSxcbiAgICByZXN1bHQ6IENvbW1hbmRTY2hlbWEsXG4gIH0sXG4gIFwiY29tbWFuZC5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGluY2x1ZGVGaW5pc2hlZDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoQ29tbWFuZFNjaGVtYSksXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgeyBtZXRob2RzIH07XG5leHBvcnQgdHlwZSBTdG9yYWdlTWV0aG9kcyA9IHR5cGVvZiBtZXRob2RzO1xuZXhwb3J0IHR5cGUgTWV0aG9kTmFtZSA9IGtleW9mIFN0b3JhZ2VNZXRob2RzO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfUlBDX01FVEhPRFMgPSBPYmplY3Qua2V5cyhtZXRob2RzKSBhcyBNZXRob2ROYW1lW107XG4iLCAiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgdHlwZSBNZXRob2ROYW1lLCBtZXRob2RzLCB0eXBlIFN0b3JhZ2VNZXRob2RzIH0gZnJvbSBcIi4vcnBjXCI7XG5cbmV4cG9ydCB0eXBlIEhhbmRsZXJzID0ge1xuICBbSyBpbiBNZXRob2ROYW1lXTogKFxuICAgIHBhcmFtczogei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tLXVtcInBhcmFtc1wiXT5cbiAgKSA9PiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbS11bXCJyZXN1bHRcIl0+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1JlcXVlc3QgPSB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXJhbXM6IHVua25vd247XG59O1xuXG5leHBvcnQgdHlwZSBScGNTdWNjZXNzUmVzcG9uc2U8VCA9IHVua25vd24+ID0ge1xuICByZXN1bHQ6IFQ7XG59O1xuXG5leHBvcnQgdHlwZSBScGNFcnJvclJlc3BvbnNlID0ge1xuICBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xufTtcblxuZXhwb3J0IHR5cGUgUnBjUmVzcG9uc2U8VCA9IHVua25vd24+ID0gUnBjU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgUnBjRXJyb3JSZXNwb25zZTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVN0b3JhZ2VScGMoXG4gIGJvZHk6IFJwY1JlcXVlc3QsXG4gIGhhbmRsZXJzOiBIYW5kbGVyc1xuKTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zIH0gPSBib2R5O1xuXG4gIGlmICghKG1ldGhvZCBpbiBtZXRob2RzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogeyBjb2RlOiBcIk1FVEhPRF9OT1RfRk9VTkRcIiwgbWVzc2FnZTogYFVua25vd24gbWV0aG9kOiAke21ldGhvZH1gIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2QgYXMgTWV0aG9kTmFtZTtcbiAgY29uc3Qgc2NoZW1hID0gbWV0aG9kc1ttZXRob2ROYW1lXS5wYXJhbXM7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UocGFyYW1zKTtcblxuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IFwiSU5WQUxJRF9QQVJBTVNcIixcbiAgICAgICAgbWVzc2FnZTogcGFyc2VkLmVycm9yLmlzc3Vlc1xuICAgICAgICAgIC5tYXAoKGkpID0+IGAke2kucGF0aC5qb2luKFwiLlwiKX06ICR7aS5tZXNzYWdlfWApXG4gICAgICAgICAgLmpvaW4oXCIsIFwiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzW21ldGhvZE5hbWVdIGFzIChcbiAgICAgIHBhcmFtczogdW5rbm93blxuICAgICkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKHBhcnNlZC5kYXRhKTtcbiAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBcIklOVEVSTkFMX0VSUk9SXCIsXG4gICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwgImV4cG9ydCB7XG4gIERFRkFVTFRfTkFNRVNQQUNFLFxuICBnZXRTdG9yYWdlLFxuICBMT0NBTF9TVE9SQUdFX1ZFUlNJT04sXG4gIHR5cGUgUnBjRm4sXG59IGZyb20gXCIuL2NsaWVudFwiO1xuZXhwb3J0IHtcbiAgdHlwZSBIYW5kbGVycyxcbiAgaGFuZGxlU3RvcmFnZVJwYyxcbiAgdHlwZSBScGNFcnJvclJlc3BvbnNlLFxuICB0eXBlIFJwY1JlcXVlc3QsXG4gIHR5cGUgUnBjUmVzcG9uc2UsXG4gIHR5cGUgUnBjU3VjY2Vzc1Jlc3BvbnNlLFxufSBmcm9tIFwiLi9oYW5kbGVyXCI7XG5leHBvcnQge1xuICB0eXBlIE1lc3NhZ2VVc2FnZSxcbiAgdHlwZSBNZXRob2ROYW1lLFxuICB0eXBlIFNhbmRib3hDb25maWcsXG4gIFNUT1JBR0VfUlBDX01FVEhPRFMsXG4gIHR5cGUgU3RlcFVzYWdlLFxuICB0eXBlIFN0b3JhZ2VNZXRob2RzLFxuICB0eXBlIFVzYWdlU3VtbWFyeSxcbn0gZnJvbSBcIi4vcnBjXCI7XG5leHBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIExpc3RSZXN1bHQsXG4gIE1lc3NhZ2UsXG4gIFBhcnQsXG4gIFJlc29sdmVkU3RvcmFnZSxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbiAgU3RvcmFnZSxcbiAgU3RvcmFnZUNvbmZpZyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5jb25zdCBERUZBVUxUX1BPTExfSU5URVJWQUxfTVMgPSAyICogNjAgKiAxMDAwO1xuY29uc3QgREVGQVVMVF9JRExFX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgU05BUFNIT1RfQkVGT1JFX1RJTUVPVVRfTVMgPSAxMCAqIDYwICogMTAwMDtcblxuY29uc3QgZ2V0VGVzdENyZWRlbnRpYWxzID0gKCkgPT5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXG4gICAgPyB7XG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9UT0tFTixcbiAgICAgICAgdGVhbUlkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9URUFNX0lELFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1BST0pFQ1RfSUQsXG4gICAgICB9XG4gICAgOiB7fTtcblxuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlU3RlcFJlc3VsdCA9XG4gIHwgeyBhY3Rpb246IFwiY29udGludWVcIjsgbmV4dFBvbGxNczogbnVtYmVyIH1cbiAgfCB7XG4gICAgICBhY3Rpb246IFwiZXhpdFwiO1xuICAgICAgcmVhc29uOiBcInNhbmRib3hJZF9jaGFuZ2VkXCIgfCBcImlkbGVcIiB8IFwidGltZW91dFwiIHwgXCJub3RfZm91bmRcIjtcbiAgICB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRTbmFwc2hvdFN0ZXAoXG4gIGlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXRcbik6IFByb21pc2U8RXJyb3IgfCBMaWZlY3ljbGVTdGVwUmVzdWx0PiB7XG4gIFwidXNlIHN0ZXBcIjtcblxuICBjb25zdCB7IFNhbmRib3g6IFZlcmNlbFNhbmRib3hTREsgfSA9IGF3YWl0IGltcG9ydChcIi4vdmVyY2VsLXNka1wiKTtcbiAgY29uc3QgeyBnZXRTdG9yYWdlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi9zdG9yYWdlXCIpO1xuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7XG4gICAgY29uZmlnOiBpbnB1dC5zdG9yYWdlQ29uZmlnLFxuICAgIHJwYzogaW5wdXQucnBjLFxuICB9KTtcbiAgY29uc3QgcmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpbnB1dC5pZCk7XG4gIGlmIChyZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgY3VycmVudFNhbmRib3hJZCA9XG4gICAgcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICA/IHJlY29yZC5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgOiBudWxsO1xuXG4gIGlmIChjdXJyZW50U2FuZGJveElkICE9PSBpbnB1dC52ZXJjZWxTYW5kYm94SWQpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwic2FuZGJveElkX2NoYW5nZWRcIiB9O1xuICB9XG5cbiAgaWYgKCFjdXJyZW50U2FuZGJveElkKSB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBjb25maWcgPSByZWNvcmQuY29uZmlnO1xuICBpZiAoY29uZmlnLnR5cGUgIT09IFwidmVyY2VsXCIpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHBvbGxJbnRlcnZhbE1zID1cbiAgICBjb25maWcubGlmZWN5Y2xlPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGlkbGVUaW1lb3V0TXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnN0b3BBZnRlckluYWN0aXZlTXMgPz8gREVGQVVMVF9JRExFX1RJTUVPVVRfTVM7XG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlVGltZW91dE1zID1cbiAgICBjb25maWcubGlmZWN5Y2xlPy5zbmFwc2hvdEJlZm9yZVRpbWVvdXRNcyA/PyBTTkFQU0hPVF9CRUZPUkVfVElNRU9VVF9NUztcblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBsYXN0QWN0aXZpdHkgPSByZWNvcmQubGFzdEFjdGl2aXR5QXQgPz8gcmVjb3JkLmNyZWF0ZWRBdCA/PyBub3c7XG4gIGNvbnN0IGlkbGVEdXJhdGlvbiA9IG5vdyAtIGxhc3RBY3Rpdml0eTtcbiAgY29uc3Qgc2hvdWxkU25hcHNob3REdWVUb0lkbGUgPSBpZGxlRHVyYXRpb24gPiBpZGxlVGltZW91dE1zO1xuXG4gIGxldCBzaG91bGRTbmFwc2hvdER1ZVRvVGltZW91dCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICBzYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICB9KTtcbiAgICBpZiAoc2FuZGJveC50aW1lb3V0IDwgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMpIHtcbiAgICAgIHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgaWYgKHNob3VsZFNuYXBzaG90RHVlVG9JZGxlIHx8IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc2FuZGJveC5zbmFwc2hvdCgpO1xuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgIC4uLnJlY29yZCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlIDogbmV3IEVycm9yKFN0cmluZyhlKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZXhpdFwiLFxuICAgICAgcmVhc29uOiBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA/IFwiaWRsZVwiIDogXCJ0aW1lb3V0XCIsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGFjdGlvbjogXCJjb250aW51ZVwiLCBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyB9O1xufVxuIiwgImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgY2hlY2tBbmRTbmFwc2hvdFN0ZXAgfSBmcm9tIFwiLi9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHNcIjtcblxuZXhwb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfTtcblxuY29uc3QgREVGQVVMVF9QT0xMX01TID0gMiAqIDYwICogMTAwMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyh7XG4gIGlucHV0LFxufToge1xuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0O1xufSkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuXG4gIGxldCBuZXh0UG9sbE1zID0gREVGQVVMVF9QT0xMX01TO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgYXdhaXQgc2xlZXAobmV4dFBvbGxNcyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja0FuZFNuYXBzaG90U3RlcChpbnB1dCk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IgfHwgcmVzdWx0LmFjdGlvbiA9PT0gXCJleGl0XCIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5leHRQb2xsTXMgPSByZXN1bHQubmV4dFBvbGxNcztcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgeyBTYW5kYm94IGFzIFZlcmNlbFNhbmRib3hTREsgfSBmcm9tIFwic2FuZGJveFwiO1xuaW1wb3J0IHsgc3RhcnQgfSBmcm9tIFwid29ya2Zsb3cvYXBpXCI7XG5pbXBvcnQgeyBTYW5kYm94RXJyb3IsIFNhbmRib3hOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWdzU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7XG4gIFJwY0ZuLFxuICBTYW5kYm94UmVjb3JkLFxuICBTdG9yYWdlLFxuICBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi4vLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUge1xuICBMb2dFbnRyeSxcbiAgU2FuZGJveCxcbiAgU2FuZGJveExpZmVjeWNsZSxcbiAgU2FuZGJveExpZmVjeWNsZUlucHV0LFxuICBTYW5kYm94U3RhdHVzLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHdyaXRlRmlsZXMgfSBmcm9tIFwiLi4vd3JpdGUtZmlsZXNcIjtcbmltcG9ydCB7IHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyB9IGZyb20gXCIuL2xpZmVjeWNsZS13b3JrZmxvd1wiO1xuXG5leHBvcnQgdHlwZSBWZXJjZWxTYW5kYm94Q3JlYXRlT3B0aW9ucyA9IEV4dHJhY3Q8XG4gIFBhcmFtZXRlcnM8dHlwZW9mIFZlcmNlbFNhbmRib3hTREsuY3JlYXRlPlswXSxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiAuXG4gIHt9XG4+O1xuXG5leHBvcnQgY29uc3QgVkVSQ0VMX01BWF9USU1FT1VUX01TID0gNSAqIDYwICogNjAgKiAxMDAwOyAvLyA1IGhvdXJzXG5jb25zdCBMT0NLX1RJTUVPVVRfTVMgPSAyICogNjAgKiAxMDAwOyAvLyAyIG1pbnV0ZXMgLSBpZiBsb2NrIG9sZGVyIHRoYW4gdGhpcywgY29uc2lkZXIgaXQgc3RhbGVcbmNvbnN0IExPQ0tfUE9MTF9JTlRFUlZBTF9NUyA9IDIwMDtcblxuY29uc3QgZ2V0VGVzdENyZWRlbnRpYWxzID0gKCkgPT5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXG4gICAgPyB7XG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9UT0tFTixcbiAgICAgICAgdGVhbUlkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9URUFNX0lELFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1BST0pFQ1RfSUQsXG4gICAgICB9XG4gICAgOiB7fTtcblxuLyoqXG4gKiBNb2R1bGUtbGV2ZWwgY2FjaGUgZm9yIGluLWZsaWdodCBzYW5kYm94IGNyZWF0aW9uIHByb21pc2VzLlxuICogUHJldmVudHMgcGFyYWxsZWwgcmVxdWVzdHMgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MgZnJvbSBjcmVhdGluZyBkdXBsaWNhdGUgc2FuZGJveGVzLlxuICovXG5jb25zdCBjcmVhdGVQcm9taXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4+KCk7XG5cbmNvbnN0IEFDVElWSVRZX1RIUk9UVExFX01TID0gMTBfMDAwO1xuY29uc3QgbGFzdEFjdGl2aXR5U2VudCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbmNvbnN0IERFRkFVTFRfVkNQVVMgPSAyO1xuXG5mdW5jdGlvbiBpc1NhbmRib3hHb25lRXJyb3IoZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXJyb3JXaXRoUmVzcG9uc2UgPSBlIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH07XG4gIGNvbnN0IGVycm9yV2l0aENhdXNlID0gZSBhcyB7IGNhdXNlPzogeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSB9O1xuXG4gIGNvbnN0IHN0YXR1cyA9XG4gICAgZXJyb3JXaXRoUmVzcG9uc2UucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgIGVycm9yV2l0aENhdXNlLmNhdXNlPy5yZXNwb25zZT8uc3RhdHVzO1xuXG4gIGlmIChzdGF0dXMgPT09IDQxMCB8fCBzdGF0dXMgPT09IDQyMikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGUubWVzc2FnZSB8fCBTdHJpbmcoZSk7XG4gIGlmIChcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiRXhwZWN0ZWQgYSBzdHJlYW0gb2YgY29tbWFuZCBkYXRhXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIkV4cGVjdGVkIGEgc3RyZWFtIG9mIGxvZ3NcIilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCB2ZXJjZWxTYW5kYm94ID0gPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZUNvbmZpZyxcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3csXG4gIHN0b3JhZ2UsXG4gIHJwYyxcbn06IHtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZCAmIHsgY29uZmlnOiB7IHR5cGU6IFwidmVyY2VsXCIgfSB9O1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdzogYm9vbGVhbjtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgcnBjOiBScGNGbjtcbn0pOiBTYW5kYm94PFRUYWdzPiA9PiB7XG4gIGNvbnN0IHsgaWQsIGNvbmZpZyB9ID0gc2FuZGJveFJlY29yZDtcbiAgY29uc3QgdmNwdXMgPSBjb25maWcucmVzb3VyY2VzPy52Y3B1cyA/PyBERUZBVUxUX1ZDUFVTO1xuICBjb25zdCBwb3J0cyA9IGNvbmZpZy5wb3J0cztcbiAgY29uc3QgaW5pdGlhbFZlcmNlbCA9XG4gICAgc2FuZGJveFJlY29yZC5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgPyBzYW5kYm94UmVjb3JkLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgIDogbnVsbDtcblxuICB0eXBlIFNhbmRib3hJbnN0YW5jZSA9IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgVmVyY2VsU2FuZGJveFNESy5nZXQ+PjtcbiAgbGV0IHNhbmRib3hQcm9taXNlOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IFNhbmRib3hJbnN0YW5jZT4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHJlY292ZXJlZEZyb21TdGFsZSA9IGZhbHNlO1xuICBjb25zdCBIT01FX0RJUiA9IFwiL2hvbWUvdmVyY2VsLXNhbmRib3hcIjtcblxuICBhc3luYyBmdW5jdGlvbiBwb2xsRm9yU2FuZGJveElkKCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgTE9DS19USU1FT1VUX01TO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIExPQ0tfUE9MTF9JTlRFUlZBTF9NUykpO1xuICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICBpZiAocmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IHJlY29yZC5tZXNzYWdlLCBjYXVzZTogcmVjb3JkIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdmVyY2VsU2FuZGJveElkID1cbiAgICAgICAgcmVjb3JkPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICAgID8gcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKHZlcmNlbFNhbmRib3hJZCkge1xuICAgICAgICByZXR1cm4gdmVyY2VsU2FuZGJveElkO1xuICAgICAgfVxuICAgICAgaWYgKCFyZWNvcmQ/LmFjcXVpcmluZ0xvY2tBdCkge1xuICAgICAgICBjb25zdCBmaW5hbENoZWNrID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgIGlmIChmaW5hbENoZWNrIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgICAgICByZWFzb246IGZpbmFsQ2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgIGNhdXNlOiBmaW5hbENoZWNrLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmFsVmVyY2VsU2FuZGJveElkID1cbiAgICAgICAgICBmaW5hbENoZWNrPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICAgICAgPyBmaW5hbENoZWNrLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChmaW5hbFZlcmNlbFNhbmRib3hJZCkge1xuICAgICAgICAgIHJldHVybiBmaW5hbFZlcmNlbFNhbmRib3hJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9HZXRPckNyZWF0ZVNhbmRib3hJZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICByZWFzb246IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNhbmRib3ggY3JlYXRpb24gYnkgYW5vdGhlciBwcm9jZXNzXCIsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdGFydExpZmVjeWNsZVdvcmtmbG93KFxuICAgIHZlcmNlbFNhbmRib3hJZDogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGlmZWN5Y2xlSW5wdXQ6IFNhbmRib3hMaWZlY3ljbGVJbnB1dCA9IHtcbiAgICAgIGlkLFxuICAgICAgdmVyY2VsU2FuZGJveElkLFxuICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgIHJwYyxcbiAgICB9O1xuICAgIGF3YWl0IHN0YXJ0KHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdywgW3sgaW5wdXQ6IGxpZmVjeWNsZUlucHV0IH1dKS5jYXRjaChcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FbXB0eUJsb2NrU3RhdGVtZW50czogaW50ZW50aW9uYWxseSBpZ25vcmVkIC0gd29ya2Zsb3cgc3RhcnQgaXMgZmlyZS1hbmQtZm9yZ2V0XG4gICAgICAoKSA9PiB7fVxuICAgICk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVTYW5kYm94RnJvbVNuYXBzaG90KFxuICAgIHNuYXBzaG90SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZSh7XG4gICAgICAgICAgc291cmNlOiB7IHR5cGU6IFwic25hcHNob3RcIiwgc25hcHNob3RJZCB9LFxuICAgICAgICAgIHJlc291cmNlczogeyB2Y3B1cyB9LFxuICAgICAgICAgIHRpbWVvdXQ6IFZFUkNFTF9NQVhfVElNRU9VVF9NUyxcbiAgICAgICAgICBwb3J0cyxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICB0YWdzOiBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LnNhbmRib3hJZCxcbiAgICAgICAgICAgIHNuYXBzaG90SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHN0YXJ0TGlmZWN5Y2xlV29ya2Zsb3coc2FuZGJveC5zYW5kYm94SWQpO1xuICAgICAgICByZXR1cm4gc2FuZGJveC5zYW5kYm94SWQ7XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRnJlc2hTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuY3JlYXRlKHtcbiAgICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgICB0aW1lb3V0OiBWRVJDRUxfTUFYX1RJTUVPVVRfTVMsXG4gICAgICAgICAgcG9ydHMsXG4gICAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgdGFnczogc2FuZGJveFJlY29yZC50YWdzLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgIGxhc3RBY3Rpdml0eUF0OiBub3csXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICAgIHNhbmRib3hJZDogc2FuZGJveC5zYW5kYm94SWQsXG4gICAgICAgICAgICBzbmFwc2hvdElkOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzdGFydExpZmVjeWNsZVdvcmtmbG93KHNhbmRib3guc2FuZGJveElkKTtcbiAgICAgICAgcmV0dXJuIHNhbmRib3guc2FuZGJveElkO1xuICAgICAgfSxcbiAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVTYW5kYm94SWQoKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICBpZiAoaW5pdGlhbFZlcmNlbD8uc2FuZGJveElkICYmICFyZWNvdmVyZWRGcm9tU3RhbGUpIHtcbiAgICAgIHJldHVybiBpbml0aWFsVmVyY2VsLnNhbmRib3hJZDtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBTYW5kYm94Tm90Rm91bmRFcnJvcikge1xuICAgICAgICAvLyBTYW5kYm94IGRvZXNuJ3QgZXhpc3QgeWV0LCBjb250aW51ZSB3aXRoIGNyZWF0aW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogZXhpc3RpbmcubWVzc2FnZSwgY2F1c2U6IGV4aXN0aW5nIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID1cbiAgICAgIGV4aXN0aW5nIGluc3RhbmNlb2YgU2FuZGJveE5vdEZvdW5kRXJyb3IgPyBudWxsIDogZXhpc3Rpbmc7XG4gICAgY29uc3QgZXhpc3RpbmdWZXJjZWwgPVxuICAgICAgZXhpc3RpbmdSZWNvcmQ/LnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmdSZWNvcmQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG5cbiAgICBpZiAoZXhpc3RpbmdWZXJjZWw/LnNhbmRib3hJZCkge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nVmVyY2VsLnNhbmRib3hJZDtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNBY3RpdmVMb2NrID1cbiAgICAgIGV4aXN0aW5nUmVjb3JkPy5hY3F1aXJpbmdMb2NrSWQgJiZcbiAgICAgIGV4aXN0aW5nUmVjb3JkLmFjcXVpcmluZ0xvY2tBdCAmJlxuICAgICAgRGF0ZS5ub3coKSAtIGV4aXN0aW5nUmVjb3JkLmFjcXVpcmluZ0xvY2tBdCA8IExPQ0tfVElNRU9VVF9NUztcblxuICAgIGlmIChoYXNBY3RpdmVMb2NrKSB7XG4gICAgICByZXR1cm4gcG9sbEZvclNhbmRib3hJZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2tJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgIGlkLFxuICAgICAgY29uZmlnLFxuICAgICAgdGFnczogZXhpc3RpbmdSZWNvcmQ/LnRhZ3MgPz8gc2FuZGJveFJlY29yZC50YWdzLFxuICAgICAgY3JlYXRlZEF0OiBleGlzdGluZ1JlY29yZD8uY3JlYXRlZEF0ID8/IHNhbmRib3hSZWNvcmQuY3JlYXRlZEF0LFxuICAgICAgbGFzdEFjdGl2aXR5QXQ6XG4gICAgICAgIGV4aXN0aW5nUmVjb3JkPy5sYXN0QWN0aXZpdHlBdCA/PyBzYW5kYm94UmVjb3JkLmxhc3RBY3Rpdml0eUF0LFxuICAgICAgYWNxdWlyaW5nTG9ja0lkOiBsb2NrSWQsXG4gICAgICBhY3F1aXJpbmdMb2NrQXQ6IG5vdyxcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgc25hcHNob3RJZDpcbiAgICAgICAgICBleGlzdGluZ1ZlcmNlbD8uc25hcHNob3RJZCA/PyBpbml0aWFsVmVyY2VsPy5zbmFwc2hvdElkID8/IG51bGwsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWZ0ZXJMb2NrID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgaWYgKGFmdGVyTG9jayBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogYWZ0ZXJMb2NrLm1lc3NhZ2UsIGNhdXNlOiBhZnRlckxvY2sgfSk7XG4gICAgfVxuICAgIGlmIChhZnRlckxvY2s/LmFjcXVpcmluZ0xvY2tJZCAhPT0gbG9ja0lkKSB7XG4gICAgICByZXR1cm4gcG9sbEZvclNhbmRib3hJZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHNuYXBzaG90SWQgPVxuICAgICAgZXhpc3RpbmdWZXJjZWw/LnNuYXBzaG90SWQgPz9cbiAgICAgIGluaXRpYWxWZXJjZWw/LnNuYXBzaG90SWQgPz9cbiAgICAgIGNvbmZpZy5saWZlY3ljbGU/LnNuYXBzaG90SWQ7XG4gICAgaWYgKHNuYXBzaG90SWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3Qoc25hcHNob3RJZCk7XG4gICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJlc2hTYW5kYm94KCk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRPckNyZWF0ZVNhbmRib3hJZCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IGNyZWF0ZVByb21pc2VzLmdldChpZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gZG9HZXRPckNyZWF0ZVNhbmRib3hJZCgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgY3JlYXRlUHJvbWlzZXMuZGVsZXRlKGlkKTtcbiAgICB9KTtcbiAgICBjcmVhdGVQcm9taXNlcy5zZXQoaWQsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZG9HZXRTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB7XG4gICAgY29uc3QgdmVyY2VsU2FuZGJveElkID0gYXdhaXQgZ2V0T3JDcmVhdGVTYW5kYm94SWQoKTtcbiAgICBpZiAodmVyY2VsU2FuZGJveElkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiB2ZXJjZWxTYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6ICgpID0+XG4gICAgICAgIFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHZlcmNlbFNhbmRib3hJZCxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSksXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB7XG4gICAgaWYgKCFzYW5kYm94UHJvbWlzZSkge1xuICAgICAgc2FuZGJveFByb21pc2UgPSBkb0dldFNhbmRib3goKTtcbiAgICB9XG4gICAgcmV0dXJuIHNhbmRib3hQcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlckZyb21TdGFsZVNhbmRib3goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc2FuZGJveFByb21pc2UgPSBudWxsO1xuICAgIHJlY292ZXJlZEZyb21TdGFsZSA9IHRydWU7XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yIHx8ICFleGlzdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG5cbiAgICBpZiAoZXhpc3RpbmdWZXJjZWw/LnNhbmRib3hJZCkge1xuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgIGlkOiBleGlzdGluZy5pZCxcbiAgICAgICAgY29uZmlnOiBleGlzdGluZy5jb25maWcsXG4gICAgICAgIHRhZ3M6IGV4aXN0aW5nLnRhZ3MsXG4gICAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmcuY3JlYXRlZEF0LFxuICAgICAgICBsYXN0QWN0aXZpdHlBdDogZXhpc3RpbmcubGFzdEFjdGl2aXR5QXQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgIHNuYXBzaG90SWQ6IGV4aXN0aW5nVmVyY2VsLnNuYXBzaG90SWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVMYXN0QWN0aXZpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsYXN0U2VudCA9IGxhc3RBY3Rpdml0eVNlbnQuZ2V0KGlkKTtcbiAgICBpZiAobGFzdFNlbnQgJiYgbm93IC0gbGFzdFNlbnQgPCBBQ1RJVklUWV9USFJPVFRMRV9NUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0QWN0aXZpdHlTZW50LnNldChpZCwgbm93KTtcblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgfHwgIWV4aXN0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG4gICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICBpZDogZXhpc3RpbmcuaWQsXG4gICAgICBjb25maWc6IGV4aXN0aW5nLmNvbmZpZyxcbiAgICAgIHRhZ3M6IGV4aXN0aW5nLnRhZ3MsXG4gICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nLmNyZWF0ZWRBdCxcbiAgICAgIGxhc3RBY3Rpdml0eUF0OiBub3csXG4gICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICBwcm92aWRlck1ldGFkYXRhOiBleGlzdGluZ1ZlcmNlbCA/PyB7XG4gICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbGlmZWN5Y2xlOiBTYW5kYm94TGlmZWN5Y2xlID0ge1xuICAgIHN0YXJ0OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHVwZGF0ZUxhc3RBY3Rpdml0eSgpO1xuICAgICAgcmV0dXJuIHNhbmRib3guc3RhdHVzIGFzIFNhbmRib3hTdGF0dXM7XG4gICAgfSxcblxuICAgIHNuYXBzaG90OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBzYW5kYm94LnNuYXBzaG90KCk7XG4gICAgICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHRhZ3M6IGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgPyBudWxsIDogKGV4aXN0aW5nPy50YWdzID8/IG51bGwpLFxuICAgICAgICAgICAgY3JlYXRlZEF0OlxuICAgICAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yID8gbnVsbCA6IChleGlzdGluZz8uY3JlYXRlZEF0ID8/IG51bGwpLFxuICAgICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6XG4gICAgICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IChleGlzdGluZz8ubGFzdEFjdGl2aXR5QXQgPz8gbnVsbCksXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgICAgIHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7IHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHN0b3A6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgc2FuZGJveC5zdG9wKCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciB8fCAhZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgICAgaWQ6IGV4aXN0aW5nLmlkLFxuICAgICAgICAgICAgY29uZmlnOiBleGlzdGluZy5jb25maWcsXG4gICAgICAgICAgICB0YWdzOiBleGlzdGluZy50YWdzLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBleGlzdGluZy5jcmVhdGVkQXQsXG4gICAgICAgICAgICBsYXN0QWN0aXZpdHlBdDogZXhpc3RpbmcubGFzdEFjdGl2aXR5QXQsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXRTdGF0dXM6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3guc3RhdHVzIGFzIFNhbmRib3hTdGF0dXM7XG4gICAgfSxcblxuICAgIGdldENyZWF0ZWRBdDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2FuZGJveC5jcmVhdGVkQXQ7XG4gICAgfSxcblxuICAgIGdldFJlbWFpbmluZ1RpbWVvdXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3gudGltZW91dDtcbiAgICB9LFxuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvRXhlYyh7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHNpZ25hbCxcbiAgfToge1xuICAgIGNvbW1hbmQ6IHN0cmluZztcbiAgICBhcmdzPzogc3RyaW5nW107XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPFxuICAgIHwgU2FuZGJveEVycm9yXG4gICAgfCB7XG4gICAgICAgIGNvbW1hbmRJZDogc3RyaW5nO1xuICAgICAgICBsb2dzOiAoKSA9PiBBc3luY0l0ZXJhYmxlPExvZ0VudHJ5PjtcbiAgICAgICAgcmVzdWx0OiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0+O1xuICAgICAgfVxuICA+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZVByb21pc2UgPSB1cGRhdGVMYXN0QWN0aXZpdHkoKTtcblxuICAgIC8qKlxuICAgICAqIGRldGFjaGVkOiB0cnVlIG1ha2VzIHJ1bkNvbW1hbmQgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGggYSBDb21tYW5kIGhhbmRsZVxuICAgICAqIGluc3RlYWQgb2YgYmxvY2tpbmcgdW50aWwgdGhlIHByb2Nlc3MgZXhpdHMuIFRoaXMgaXMgY3JpdGljYWwgZm9yXG4gICAgICogbG9uZy1ydW5uaW5nIGNvbW1hbmRzIHdoZXJlIHRoZSBjYWxsZXIgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgcHJvY2Vzc1xuICAgICAqIChlLmcuIHJlYWRpbmcgbG9ncyBhbmQgd3JpdGluZyBmaWxlcykgd2hpbGUgaXQncyBzdGlsbCBydW5uaW5nLlxuICAgICAqL1xuICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGluc3RhbmNlLnJ1bkNvbW1hbmQoe1xuICAgICAgICAgIGN3ZDogSE9NRV9ESVIsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgICBjbWQ6IGNvbW1hbmQsXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgICAgICAgbGV0IHN0ZGVyciA9IFwiXCI7XG4gICAgICAgIGNvbnN0IGxvZ0J1ZmZlcjogTG9nRW50cnlbXSA9IFtdO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgICAgICByZXNvbHZlOiBudWxsIGFzICgoKSA9PiB2b2lkKSB8IG51bGwsXG4gICAgICAgICAgY29uc3VtZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbnN1bWVMb2dzID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsb2cgb2Ygb3V0cHV0LmxvZ3MoKSkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeTogTG9nRW50cnkgPVxuICAgICAgICAgICAgICAgIGxvZy5zdHJlYW0gPT09IFwic3Rkb3V0XCJcbiAgICAgICAgICAgICAgICAgID8geyBzdHJlYW06IFwic3Rkb3V0XCIsIGRhdGE6IGxvZy5kYXRhIH1cbiAgICAgICAgICAgICAgICAgIDogeyBzdHJlYW06IFwic3RkZXJyXCIsIGRhdGE6IGxvZy5kYXRhIH07XG5cbiAgICAgICAgICAgICAgaWYgKGxvZy5zdHJlYW0gPT09IFwic3Rkb3V0XCIpIHtcbiAgICAgICAgICAgICAgICBzdGRvdXQgKz0gbG9nLmRhdGE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RkZXJyICs9IGxvZy5kYXRhO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbG9nQnVmZmVyLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICBzdGF0ZS5yZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFNhbmRib3ggbWF5IGhhdmUgYmVlbiBzdG9wcGVkIC0gbG9ncyBlbmRwb2ludCByZXR1cm5zIDQyMlxuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5jb25zdW1lZCA9IHRydWU7XG4gICAgICAgICAgc3RhdGUucmVzb2x2ZT8uKCk7XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24qIGxvZ3MoKTogQXN5bmNJdGVyYWJsZTxMb2dFbnRyeT4ge1xuICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgd2hpbGUgKCFzdGF0ZS5jb25zdW1lZCB8fCBpbmRleCA8IGxvZ0J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IGxvZ0J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgeWllbGQgbG9nQnVmZmVyW2luZGV4KytdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnN1bWVMb2dzLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaW5pc2hlZCA9IGF3YWl0IG91dHB1dC53YWl0KCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgICAgZXhpdENvZGU6IGZpbmlzaGVkLmV4aXRDb2RlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoaXNTYW5kYm94R29uZUVycm9yKGUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZTogMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7IGNvbW1hbmRJZDogb3V0cHV0LmNtZElkLCBsb2dzLCByZXN1bHQgfTtcbiAgICAgIH0sXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG5cbiAgICBhd2FpdCB1cGRhdGVQcm9taXNlO1xuICAgIHJldHVybiBleGVjUmVzdWx0O1xuICB9XG5cbiAgY29uc3Qgc2FuZGJveDogU2FuZGJveDxUVGFncz4gPSB7XG4gICAgaWQsXG4gICAgY29uZmlnLFxuICAgIGV4ZWM6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkb0V4ZWMob3B0cyk7XG5cbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBTYW5kYm94RXJyb3IgJiYgaXNTYW5kYm94R29uZUVycm9yKHJlc3VsdC5jYXVzZSkpIHtcbiAgICAgICAgYXdhaXQgcmVjb3ZlckZyb21TdGFsZVNhbmRib3goKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRvRXhlYyhvcHRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgZ2V0RG9tYWluOiBhc3luYyAocG9ydCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94LmRvbWFpbihwb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGtpbGw6IGFzeW5jICh7IGNvbW1hbmRJZCwgc3RvcmFnZTogY21kU3RvcmFnZSB9KSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY21kID0gYXdhaXQgY21kU3RvcmFnZS5jb21tYW5kLmdldChjb21tYW5kSWQpO1xuICAgICAgaWYgKGNtZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBjbWQubWVzc2FnZSwgY2F1c2U6IGNtZCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbWQgJiYgY21kLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY21kU3RvcmFnZS5jb21tYW5kLnNldCh7XG4gICAgICAgICAgLi4uY21kLFxuICAgICAgICAgIHN0YXR1czogXCJraWxsZWRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiByZXN1bHQubWVzc2FnZSwgY2F1c2U6IHJlc3VsdCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaWxlczogKG9wdHMpID0+IHdyaXRlRmlsZXMoeyBzYW5kYm94LCAuLi5vcHRzIH0pLFxuXG4gICAgbGlmZWN5Y2xlLFxuXG4gICAgdGFnOiB7XG4gICAgICBsaXN0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoc2FuZGJveFJlY29yZC50YWdzID8/IHt9KSBhcyBUVGFncztcbiAgICAgIH0sXG4gICAgICBnZXQ6IGFzeW5jIChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZC50YWdzPy5ba2V5IGFzIHN0cmluZ10gYXNcbiAgICAgICAgICB8IFRUYWdzW3R5cGVvZiBrZXldXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IGlkLFxuICAgICAgICAgIHRhZ3M6IHsgW2tleV06IHZhbHVlIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0TWFueTogYXN5bmMgKHRhZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IGlkLFxuICAgICAgICAgIHRhZ3M6IHRhZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5saWZlY3ljbGU/LmF1dG9TdGFydCAhPT0gZmFsc2UpIHtcbiAgICBzYW5kYm94UHJvbWlzZSA9IGRvR2V0U2FuZGJveCgpO1xuICB9XG5cbiAgcmV0dXJuIHNhbmRib3g7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHR5cGUgeyBScGNGbiwgU2FuZGJveFJlY29yZCwgU3RvcmFnZSwgU3RvcmFnZUNvbmZpZyB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBsb2NhbFNhbmRib3ggfSBmcm9tIFwiLi9iaW5kaW5ncy9sb2NhbFwiO1xuaW1wb3J0IHsgdmVyY2VsU2FuZGJveCB9IGZyb20gXCIuL2JpbmRpbmdzL3ZlcmNlbFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbmRib3g8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlQ29uZmlnLFxuICBzdG9yYWdlLFxuICBycGMsXG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93ID0gdHJ1ZSxcbn06IHtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgcnBjOiBScGNGbjtcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3c/OiBib29sZWFuO1xufSk6IFNhbmRib3g8VFRhZ3M+IHtcbiAgc3dpdGNoIChzYW5kYm94UmVjb3JkLmNvbmZpZy50eXBlKSB7XG4gICAgY2FzZSBcImxvY2FsXCI6XG4gICAgICByZXR1cm4gbG9jYWxTYW5kYm94PFRUYWdzPih7XG4gICAgICAgIHNhbmRib3hSZWNvcmQ6IHNhbmRib3hSZWNvcmQgYXMgU2FuZGJveFJlY29yZCAmIHtcbiAgICAgICAgICBjb25maWc6IHsgdHlwZTogXCJsb2NhbFwiIH07XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICB9KTtcbiAgICBjYXNlIFwidmVyY2VsXCI6XG4gICAgICByZXR1cm4gdmVyY2VsU2FuZGJveDxUVGFncz4oe1xuICAgICAgICBzYW5kYm94UmVjb3JkOiBzYW5kYm94UmVjb3JkIGFzIFNhbmRib3hSZWNvcmQgJiB7XG4gICAgICAgICAgY29uZmlnOiB7IHR5cGU6IFwidmVyY2VsXCIgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgcnBjLFxuICAgICAgICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdyxcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJjdXN0b21cIjpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkN1c3RvbSBzYW5kYm94ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHNhbmRib3hSZWNvcmQuY29uZmlnIHNhdGlzZmllcyBuZXZlcjtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gc2FuZGJveCB0eXBlOiAke1xuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogLlxuICAgICAgICAgIChzYW5kYm94UmVjb3JkLmNvbmZpZyBhcyBhbnkpLnR5cGVcbiAgICAgICAgfWBcbiAgICAgICk7XG4gIH1cbn1cbiIsICJleHBvcnQgeyBnZXRTYW5kYm94IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5leHBvcnQgdHlwZSB7XG4gIEV4ZWNSZXN1bHQsXG4gIExvZ0VudHJ5LFxuICBTYW5kYm94LFxuICBTYW5kYm94TGlmZWN5Y2xlLFxuICBTYW5kYm94TGlmZWN5Y2xlSW5wdXQsXG4gIFNhbmRib3hTdGF0dXMsXG4gIFRlcm1pbmFsLFxuICBUZXJtaW5hbE1ldGFkYXRhLFxuICBWZXJjZWxTYW5kYm94TGlmZWN5Y2xlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuIiwgImltcG9ydCB0eXBlIHsgRmluaXNoUmVhc29uIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBkZWZpbmVIb29rLCBGYXRhbEVycm9yLCBnZXRXcml0YWJsZSB9IGZyb20gXCJ3b3JrZmxvd1wiO1xuaW1wb3J0IHsgY29tcGxldGVNZXNzYWdlU3RlcCwgc3RyZWFtVGV4dFN0ZXAgfSBmcm9tIFwiLi9hZ2VudC13b3JrZmxvdy1zdGVwc1wiO1xuaW1wb3J0IHR5cGUgeyBScGNQYXlsb2FkLCBScGNSZXN1bHQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIHsgU3RlcFVzYWdlIH0gZnJvbSBcIi4vdXRpbHMvdXNhZ2VcIjtcblxuZXhwb3J0IHR5cGUgQWdlbnRJbnB1dCA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHN0b3JhZ2VDb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHJwYzogKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQWdlbnRNZXNzYWdlSW5wdXQgPSB7XG4gIGFzc2lzdGFudE1lc3NhZ2VJZDogc3RyaW5nO1xuICBob29rVG9rZW46IHN0cmluZztcbiAgY3JlYXRlZEF0OiBudW1iZXI7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgQXBwcm92YWxSZXNwb25zZSA9IHtcbiAgYXBwcm92ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBhZ2VudE1lc3NhZ2VIb29rID0gZGVmaW5lSG9vazxBZ2VudE1lc3NhZ2VJbnB1dD4oKTtcbmV4cG9ydCBjb25zdCBhcHByb3ZhbEhvb2sgPSBkZWZpbmVIb29rPEFwcHJvdmFsUmVzcG9uc2U+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZ2VudFdvcmtmbG93KHtcbiAgaW5wdXQsXG4gIGV2ZW50LFxufToge1xuICBpbnB1dDogQWdlbnRJbnB1dDtcbiAgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0O1xufSkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuXG4gIGNvbnN0IG1lc3NhZ2VIb29rID0gYWdlbnRNZXNzYWdlSG9vay5jcmVhdGUoeyB0b2tlbjogaW5wdXQuc2Vzc2lvbklkIH0pO1xuICBjb25zdCBpdGVyYXRvciA9IG1lc3NhZ2VIb29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICBsZXQgcGVuZGluZ05leHQgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgYXdhaXQgb25NZXNzYWdlKHsgZXZlbnQsIGlucHV0IH0pLmNhdGNoKChlKSA9PiB7XG4gICAgaWYgKEZhdGFsRXJyb3IuaXMoZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJNZXNzYWdlIHByb2Nlc3NpbmcgZmFpbGVkIHBlcm1hbmVudGx5OlwiLCBlLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9KTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBlbmRpbmdOZXh0O1xuXG4gICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVW5leHBlY3RlZDogbWVzc2FnZSBob29rIGl0ZXJhdG9yIGRvbmVcIik7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhd2FpdCBvbk1lc3NhZ2UoeyBldmVudDogcmVzdWx0LnZhbHVlLCBpbnB1dCB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgaWYgKEZhdGFsRXJyb3IuaXMoZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIk1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsZWQgcGVybWFuZW50bHk6XCIsIGUubWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gICAgcGVuZGluZ05leHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gb25NZXNzYWdlKHtcbiAgZXZlbnQsXG4gIGlucHV0LFxufToge1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG4gIGlucHV0OiBBZ2VudElucHV0O1xufSkge1xuICBjb25zdCB3cml0YWJsZSA9IGdldFdyaXRhYmxlKHsgbmFtZXNwYWNlOiBldmVudC5hc3Npc3RhbnRNZXNzYWdlSWQgfSk7XG5cbiAgbGV0IGZpbmlzaFJlYXNvbjogRmluaXNoUmVhc29uIHwgdW5kZWZpbmVkO1xuICBsZXQgbGFzdFBhcnRJbmRleCA9IDA7XG4gIGNvbnN0IHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdID0gW107XG5cbiAgd2hpbGUgKGZpbmlzaFJlYXNvbiAhPT0gXCJzdG9wXCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyZWFtVGV4dFN0ZXAoe1xuICAgICAgICBhc3Npc3RhbnRNZXNzYWdlSWQ6IGV2ZW50LmFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgd3JpdGFibGUsXG4gICAgICAgIGlucHV0LFxuICAgICAgICBldmVudCxcbiAgICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgICAgc3RlcEluZGV4T2Zmc2V0OiB1c2FnZVN0ZXBzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgICAgZmluaXNoUmVhc29uID0gcmVzdWx0LmZpbmlzaFJlYXNvbjtcbiAgICAgIGxhc3RQYXJ0SW5kZXggPSByZXN1bHQubGFzdFBhcnRJbmRleDtcbiAgICAgIHVzYWdlU3RlcHMucHVzaCguLi5yZXN1bHQudXNhZ2VTdGVwcyk7XG5cbiAgICAgIGlmIChyZXN1bHQubWF4U3RlcHMgIT0gbnVsbCAmJiB1c2FnZVN0ZXBzLmxlbmd0aCA+PSByZXN1bHQubWF4U3RlcHMpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRvb2xzIG5lZWQgYXBwcm92YWwsIHN1c3BlbmQgd29ya2Zsb3cgdW50aWwgYWxsIGFyZSByZXNvbHZlZFxuICAgICAgaWYgKHJlc3VsdC5wZW5kaW5nQXBwcm92YWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubWFwKChwZW5kaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBob29rID0gYXBwcm92YWxIb29rLmNyZWF0ZSh7IHRva2VuOiBwZW5kaW5nLmFwcHJvdmFsSWQgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVyID0gaG9va1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICAvLyBBbGwgaG9va3MgcmVzb2x2ZWQgXHUyMDE0IGFwcHJvdmFsIHJlc3BvbnNlcyBhcmUgbm93IGluIHN0b3JhZ2UuXG4gICAgICAgIC8vIExvb3AgY29udGludWVzIFx1MjE5MiBuZXh0IHN0cmVhbVRleHRTdGVwIHJlYWRzIHVwZGF0ZWQgcGFydHMuXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgY29tcGxldGVNZXNzYWdlU3RlcCh7XG4gICAgYXNzaXN0YW50TWVzc2FnZUlkOiBldmVudC5hc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgaW5wdXQsXG4gICAgd3JpdGFibGUsXG4gICAgdXNhZ2VTdGVwcyxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHtcbiAgY29udmVydFRvTW9kZWxNZXNzYWdlcyxcbiAgY3JlYXRlVUlNZXNzYWdlU3RyZWFtLFxuICB0eXBlIEZpbmlzaFJlYXNvbixcbiAgc3RlcENvdW50SXMsXG4gIHN0cmVhbVRleHQsXG4gIHR5cGUgVUlNZXNzYWdlLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgRmF0YWxFcnJvciB9IGZyb20gXCJ3b3JrZmxvd1wiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudElucHV0LCBBZ2VudE1lc3NhZ2VJbnB1dCB9IGZyb20gXCIuL2FnZW50LXdvcmtmbG93XCI7XG5pbXBvcnQgeyBkaXNjb3ZlclNraWxsc0luU2FuZGJveCB9IGZyb20gXCIuL3NraWxscy9kaXNjb3ZlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveFJlY29yZCwgU3RvcmFnZSB9IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGZldGNoQXBpVG9vbHNNZXRhZGF0YSwgZ2V0VG9vbHMgfSBmcm9tIFwiLi90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBPblN1YlRvb2xDYWxsIH0gZnJvbSBcIi4vdG9vbHMvamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgYXBwbHlQcm9tcHRDYWNoaW5nVG9Nb2RlbFJlcXVlc3QgfSBmcm9tIFwiLi91dGlscy9wcm9tcHQtY2FjaGVcIjtcbmltcG9ydCB7IGFzc2VtYmxlVUlNZXNzYWdlcyB9IGZyb20gXCIuL3V0aWxzL3VpXCI7XG5pbXBvcnQgeyBjb21wdXRlVXNhZ2VTdW1tYXJ5LCB0eXBlIFN0ZXBVc2FnZSB9IGZyb20gXCIuL3V0aWxzL3VzYWdlXCI7XG5cbmNvbnN0IEJBU0VfU1lTVEVNX1BST01QVCA9XG4gIFwiWW91IGFyZSBhbiBBSSBhc3Npc3RhbnQgd2l0aCBiYXNpYyB0b29scyB0byBpbnRlcmFjdCB3aXRoIHlvdXIgZW52aXJvbm1lbnQuIEV4cGxvcmUgYW5kIHdvcmsgZnJlZWx5LlwiO1xuXG5mdW5jdGlvbiBqb2luUHJvbXB0U2VjdGlvbnMoXG4gIC4uLnNlY3Rpb25zOiAoc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbClbXVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zLmZpbHRlcigocykgPT4gcz8udHJpbSgpKS5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG5jb25zdCBiYWNrZ3JvdW5kUHJvY2Vzc1Byb21wdCA9IGAjIyBCYWNrZ3JvdW5kIFByb2Nlc3Nlc1xuVGhlc2UgYmFja2dyb3VuZCBwcm9jZXNzIGluc3RydWN0aW9ucyBhcmUgZm9yIHlvdSB0byBtYW5pcHVsYXRlIHRoZSBwcm9jZXNzZXMsIGRvIG5vdCBiZSB0byB2ZXJib3NlIHRvIHRoZSB1c2VyIGFib3V0IHRoZSByZXNwb25zZSBkZXRhaWxzIGxpa2UgXCJob3cgdG8gZGVidWcgdGhlIHByb2Nlc3Mgb3V0cHV0XCIgdGhlIHVzZXIgd2lsbCBoYXZlIGFuIFVJLlxuXG5Vc2UgXFxgd2FpdFVudGlsOiAwXFxgIGZvciBkZXYgc2VydmVycyB0aGF0IHNob3VsZCBydW4gaW5kZWZpbml0ZWx5LlxuSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGNoZWNrIHRoZSBvdXRwdXQgbG9nIGFmdGVyIHJ1bm5pbmcgcHJvY2Vzc2VzIGxpa2UgZGV2IHNlcnZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgc3RhcnRlZCBjb3JyZWN0bHkuXG5cblRvIHJ1biBhIGJhY2tncm91bmQgcHJvY2VzczpcbkJhc2goeyBjb21tYW5kOiBcIm5wbSBydW4gZGV2XCIsIHdhaXRVbnRpbDogMCB9KVxuUmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIFxcYHBpZFxcYCBhbmQgXFxgb3V0cHV0RmlsZVxcYCBwYXRoLlxuXG5UbyBjaGVjayBhIHByb2Nlc3MncyBvdXRwdXQ6XG5CYXNoKHsgY29tbWFuZDogXCJ0YWlsIC0xMDAge291dHB1dEZpbGV9XCIgfSlcblxuVG8ga2lsbCBhIHByb2Nlc3M6XG5CYXNoKHsgY29tbWFuZDogXCJraWxsIHtwaWR9XCIgfSkgICAgICAgLy8gR3JhY2VmdWxcbkJhc2goeyBjb21tYW5kOiBcImtpbGwgLTkge3BpZH1cIiB9KSAgICAvLyBGb3JjZVxuXG5UbyBsaXN0IGFsbCBwcm9jZXNzZXM6XG5CYXNoKHsgY29tbWFuZDogXCJwcyBhdXggfCBncmVwIG5vZGVcIiB9KVxuYDtcblxuZnVuY3Rpb24gYnVpbGRTa2lsbHNDb250ZXh0KHNraWxsczogU2tpbGxTdW1tYXJ5W10pOiBzdHJpbmcge1xuICBpZiAoc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3Qgc2tpbGxMaW5lcyA9IHNraWxsc1xuICAgIC5tYXAoKHMpID0+IGAtICR7cy5uYW1lfTogJHtzLmRlc2NyaXB0aW9ufVxcbiAgUGF0aDogJHtzLnNraWxsTWRQYXRofWApXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgcmV0dXJuIGAjIyBBdmFpbGFibGUgU2tpbGxzXG4ke3NraWxsTGluZXN9XG5cbiR7YmFja2dyb3VuZFByb2Nlc3NQcm9tcHR9XG5cbllvdSBjYW4gdXNlIHRoZSBSZWFkIHRvb2wgdG8gcmVhZCBhbnkgc2tpbGwncyBTS0lMTC5tZCBmaWxlIHRvIGxlYXJuIG1vcmUgYWJvdXQgaXQuYDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlTWVzc2FnZVN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGlucHV0LFxuICB3cml0YWJsZSxcbiAgdXNhZ2VTdGVwcyxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW07XG4gIHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdO1xufSkge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgeyBnZXRTdG9yYWdlIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3N0b3JhZ2UvY2xpZW50XCIpO1xuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7IGNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZywgcnBjOiBpbnB1dC5ycGMgfSk7XG5cbiAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQoYXNzaXN0YW50TWVzc2FnZUlkKTtcbiAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1lc3NhZ2U7XG4gIH1cbiAgaWYgKCFtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlICR7YXNzaXN0YW50TWVzc2FnZUlkfSBub3QgZm91bmRgKTtcbiAgfVxuXG4gIGNvbnN0IHVzYWdlID1cbiAgICB1c2FnZVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgID8ge1xuICAgICAgICAgIHN0ZXBzOiB1c2FnZVN0ZXBzLFxuICAgICAgICAgIHN1bW1hcnk6IGNvbXB1dGVVc2FnZVN1bW1hcnkodXNhZ2VTdGVwcyksXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLm1lc3NhZ2Uuc2V0KHtcbiAgICAuLi5tZXNzYWdlLFxuICAgIGNvbXBsZXRlZEF0OiBEYXRlLm5vdygpLFxuICAgIHVzYWdlLFxuICB9KTtcbiAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcmVzdWx0O1xuICB9XG5cbiAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTtcbn1cblxuY29uc3QgSU5URVJSVVBUX1BPTExfSU5URVJWQUxfTVMgPSA1MDA7XG5cbmZ1bmN0aW9uIHBvbGxGb3JJbnRlcnJ1cHQoe1xuICBzdG9yYWdlLFxuICBtZXNzYWdlSWQsXG4gIHNpZ25hbCxcbiAgYWJvcnRDb250cm9sbGVyLFxufToge1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG59KTogeyBmaXJzdENoZWNrOiBQcm9taXNlPHZvaWQ+IH0ge1xuICBsZXQgcmVzb2x2ZUZpcnN0Q2hlY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0IGZpcnN0Q2hlY2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmVGaXJzdENoZWNrID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgY29uc3QgcG9sbCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQobWVzc2FnZUlkKTtcbiAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICByZXNvbHZlRmlyc3RDaGVjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmludGVycnVwdGVkQXQgIT09IG51bGwpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBJTlRFUlJVUFRfUE9MTF9JTlRFUlZBTF9NUylcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHBvbGwoKTtcbiAgcmV0dXJuIHsgZmlyc3RDaGVjayB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RyZWFtVGV4dFN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGlucHV0LFxuICBldmVudCxcbiAgd3JpdGFibGUsXG4gIGxhc3RQYXJ0SW5kZXgsXG4gIHN0ZXBJbmRleE9mZnNldCxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbTtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICBzdGVwSW5kZXhPZmZzZXQ6IG51bWJlcjtcbn0pOiBQcm9taXNlPHtcbiAgZmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb247XG4gIGxhc3RQYXJ0SW5kZXg6IG51bWJlcjtcbiAgdXNhZ2VTdGVwczogU3RlcFVzYWdlW107XG4gIHBlbmRpbmdBcHByb3ZhbHM6IHsgYXBwcm92YWxJZDogc3RyaW5nOyB0b29sTmFtZTogc3RyaW5nIH1bXTtcbiAgbWF4U3RlcHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbn0+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9zdG9yYWdlL2NsaWVudFwiKTtcbiAgY29uc3QgeyBnZXRTYW5kYm94IH0gPSBhd2FpdCBpbXBvcnQoXCIuL3NhbmRib3hcIik7XG5cbiAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JhZ2UoeyBjb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsIHJwYzogaW5wdXQucnBjIH0pO1xuXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgcG9sbENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgY29uc3QgeyBmaXJzdENoZWNrIH0gPSBwb2xsRm9ySW50ZXJydXB0KHtcbiAgICBzdG9yYWdlLFxuICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIHNpZ25hbDogcG9sbENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGFib3J0Q29udHJvbGxlcixcbiAgfSk7XG5cbiAgY29uc3QgW1xuICAgICxcbiAgICBtZXNzYWdlc1Jlc3VsdCxcbiAgICBwYXJ0c1Jlc3VsdCxcbiAgICB7IHNlc3Npb24sIHNraWxscywgc2FuZGJveCwgc2FuZGJveFJlY29yZCB9LFxuICAgIGFwaVRvb2xzTWV0YWRhdGEsXG4gIF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZmlyc3RDaGVjayxcbiAgICBzdG9yYWdlLm1lc3NhZ2UubGlzdChpbnB1dC5zZXNzaW9uSWQpLFxuICAgIHN0b3JhZ2UucGFydC5saXN0QnlTZXNzaW9uKGlucHV0LnNlc3Npb25JZCksXG4gICAgc3RvcmFnZS5zZXNzaW9uLmdldChpbnB1dC5zZXNzaW9uSWQpLnRoZW4oYXN5bmMgKHNlc3Npb24pID0+IHtcbiAgICAgIGlmIChzZXNzaW9uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgc2Vzc2lvbjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBzZXNzaW9uLnNhbmRib3hJZFxuICAgICAgICA/IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoc2Vzc2lvbi5zYW5kYm94SWQpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgc2FuZGJveFJlY29yZDtcbiAgICAgIH1cbiAgICAgIGlmICghc2FuZGJveFJlY29yZCkge1xuICAgICAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgICBgU2FuZGJveCBub3QgZm91bmQgZm9yIHNlc3Npb24gJHtpbnB1dC5zZXNzaW9uSWR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2FuZGJveCA9IGdldFNhbmRib3goe1xuICAgICAgICBzYW5kYm94UmVjb3JkLFxuICAgICAgICBzdG9yYWdlQ29uZmlnOiBpbnB1dC5zdG9yYWdlQ29uZmlnLFxuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBycGM6IGlucHV0LnJwYyxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJblNhbmRib3goe1xuICAgICAgICBzYW5kYm94LFxuICAgICAgICBza2lsbHNEaXJzOiBzZXNzaW9uLnNraWxsc0RpciB8fCBbXSxcbiAgICAgICAgZGVidWc6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHNlc3Npb24sIHNraWxscywgc2FuZGJveCwgc2FuZGJveFJlY29yZCB9O1xuICAgIH0pLFxuICAgIGZldGNoQXBpVG9vbHNNZXRhZGF0YSh7XG4gICAgICBycGM6IGlucHV0LnJwYyxcbiAgICB9KSxcbiAgXSk7XG5cbiAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHBvbGxDb250cm9sbGVyLmFib3J0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIgYXMgRmluaXNoUmVhc29uLFxuICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgIHVzYWdlU3RlcHM6IFtdLFxuICAgICAgcGVuZGluZ0FwcHJvdmFsczogW10sXG4gICAgICBtYXhTdGVwczogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0O1xuICB9XG4gIGlmIChwYXJ0c1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcGFydHNSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgaXRlcmF0aW9uLCBtYXJrIGFsbCBtZXNzYWdlcyBpbiB0aGlzIGJhdGNoIGFzIHN0YXJ0ZWQuXG4gICAqIFVzZXIgbWVzc2FnZXMgYXJlIGFsc28gbWFya2VkIGFzIGNvbXBsZXRlZCAodGhleSdyZSBkb25lKS5cbiAgICogVGhlIGFzc2lzdGFudCBtZXNzYWdlIGlzIG9ubHkgbWFya2VkIGFzIHN0YXJ0ZWQgKHN0cmVhbWluZyBpbiBwcm9ncmVzcykuXG4gICAqL1xuICBjb25zdCBzZXRTdGFydGVkUHJvbWlzZSA9XG4gICAgbGFzdFBhcnRJbmRleCA9PT0gMFxuICAgICAgPyAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgcGVuZGluZ01lc3NhZ2VzID0gbWVzc2FnZXNSZXN1bHQuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKG0pID0+IG0uY3JlYXRlZEF0IDw9IGV2ZW50LmNyZWF0ZWRBdCAmJiBtLnN0YXJ0ZWRBdCA9PT0gbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBlbmRpbmdNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIHBlbmRpbmdNZXNzYWdlcy5tYXAoKG0pID0+XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5tZXNzYWdlLnNldCh7XG4gICAgICAgICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbS5yb2xlID09PSBcImFzc2lzdGFudFwiID8gbnVsbCA6IG5vdyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBudWxsO1xuXG4gIC8vIE11dGFibGUgcmVmIHNvIG9uU3ViVG9vbENhbGwgY2FuIHdyaXRlIHRvIHRoZSBzdHJlYW0gb25jZSBhdmFpbGFibGVcbiAgY29uc3Qgc3RyZWFtV3JpdGVyUmVmOiB7XG4gICAgY3VycmVudDogKChldmVudDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsO1xuICB9ID0geyBjdXJyZW50OiBudWxsIH07XG5cbiAgY29uc3Qgc3ViVG9vbFBhcnRJZHM6IHN0cmluZ1tdID0gW107XG4gIC8vIFNoYXJlZCBjb3VudGVyIGZvciBwYXJ0IGluZGljZXMgXHUyMDE0IHN1Yi10b29sIHBhcnRzIGluY3JlbWVudCB0aGlzIGR1cmluZ1xuICAvLyB0aGUgc3RyZWFtLCB0aGVuIHN0ZXBQYXJ0cyBjb250aW51ZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLlxuICBsZXQgbmV4dFBhcnRJbmRleCA9IGxhc3RQYXJ0SW5kZXg7XG5cbiAgY29uc3Qgb25TdWJUb29sQ2FsbDogT25TdWJUb29sQ2FsbCA9IGFzeW5jICh0b29sTmFtZSwgdG9vbElucHV0LCBleGVjdXRlKSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyB0b29sIG5lZWRzIGFwcHJvdmFsIHZpYSBSUENcbiAgICBjb25zdCByZXMgPSBhd2FpdCBpbnB1dC5ycGMoe1xuICAgICAgbWV0aG9kOiBcInRvb2xzLm5lZWRzQXBwcm92YWxcIixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiByZXMgfHwgcmVzLnJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gTm8gYXBwcm92YWwgbmVlZGVkIFx1MjAxNCBqdXN0IGV4ZWN1dGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcHJvdmFsIG5lZWRlZCBcdTIwMTQgc3VyZmFjZSB0byB1c2VyIHZpYSBzdHJlYW0gZXZlbnRzXG4gICAgY29uc3QgYXBwcm92YWxJZCA9IGBqc19hcHByb3ZhbF8ke3VsaWQoKX1gO1xuICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBganNfdGNfJHt1bGlkKCl9YDtcbiAgICBjb25zdCBwYXJ0SWQgPSBgcGFydF8ke3VsaWQoKX1gO1xuICAgIHN1YlRvb2xQYXJ0SWRzLnB1c2gocGFydElkKTtcblxuICAgIC8vIFN0b3JlIGFwcHJvdmFsLXJlcXVlc3QgcGFydFxuICAgIGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoe1xuICAgICAgaWQ6IHBhcnRJZCxcbiAgICAgIGluZGV4OiBuZXh0UGFydEluZGV4KyssXG4gICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgcGFydDoge1xuICAgICAgICB0eXBlOiBgdG9vbC0ke3Rvb2xOYW1lfWAsXG4gICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgIHN0YXRlOiBcImFwcHJvdmFsLXJlcXVlc3RlZFwiLFxuICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICBhcHByb3ZhbDogeyBpZDogYXBwcm92YWxJZCB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgfSk7XG5cbiAgICAvLyBXcml0ZSBzdHJlYW0gZXZlbnRzIGZvciB0aGUgVUlcbiAgICAvLyB0b29sLWlucHV0LXN0YXJ0IGlzIHJlcXVpcmVkIFx1MjAxNCB0aGUgQUkgU0RLIGNsaWVudCBjcmVhdGVzIHRoZSB0b29sIHBhcnRcbiAgICAvLyB3aGVuIGl0IHNlZXMgdGhpcyBldmVudC4gV2l0aG91dCBpdCwgc3Vic2VxdWVudCBldmVudHMgYXJlIGlnbm9yZWQuXG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICB9KTtcbiAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgfSk7XG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgYXBwcm92YWxJZCxcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgfSk7XG5cbiAgICAvLyBQb2xsIHN0b3JhZ2UgZm9yIGFwcHJvdmFsIHJlc3BvbnNlXG4gICAgY29uc3QgUE9MTF9NUyA9IDUwMDtcbiAgICBjb25zdCBUSU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgVElNRU9VVF9NUykge1xuICAgICAgY29uc3QgcGFydHMgPSBhd2FpdCBzdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihpbnB1dC5zZXNzaW9uSWQpO1xuICAgICAgaWYgKCEocGFydHMgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IHBhcnRzLml0ZW1zLmZpbmQoXG4gICAgICAgICAgKHApID0+XG4gICAgICAgICAgICBwLmlkID09PSBwYXJ0SWQgJiZcbiAgICAgICAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgY29uc3QgYXBwcm92YWwgPSAoXG4gICAgICAgICAgICB1cGRhdGVkLnBhcnQgYXMge1xuICAgICAgICAgICAgICBhcHByb3ZhbD86IHsgYXBwcm92ZWQ/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLmFwcHJvdmFsO1xuICAgICAgICAgIGlmIChhcHByb3ZhbD8uYXBwcm92ZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIG91dHB1dDogcmVzdWx0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIGVycm9yVGV4dDogZXJyb3IsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEZW5pZWRcbiAgICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjogYFRvb2wgXCIke3Rvb2xOYW1lfVwiIGRlbmllZDogJHthcHByb3ZhbD8ucmVhc29uIHx8IFwidXNlciBkZW5pZWRcIn1gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFBPTExfTVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBlcnJvcjogXCJBcHByb3ZhbCB0aW1lZCBvdXRcIiB9O1xuICB9O1xuXG4gIGNvbnN0IHJhd1Rvb2xzID0gZ2V0VG9vbHMoe1xuICAgIGlucHV0LFxuICAgIGV2ZW50LFxuICAgIHNhbmRib3gsXG4gICAgc2Vzc2lvbixcbiAgICBzYW5kYm94UmVjb3JkOiBzYW5kYm94UmVjb3JkIGFzIFNhbmRib3hSZWNvcmQsXG4gICAgYXBpVG9vbHNNZXRhZGF0YSxcbiAgICBvblN1YlRvb2xDYWxsLFxuICB9KTtcblxuICBjb25zdCBza2lsbHNDb250ZXh0ID0gYnVpbGRTa2lsbHNDb250ZXh0KHNraWxscyk7XG4gIGNvbnN0IHN5c3RlbUhlYWRlciA9IGpvaW5Qcm9tcHRTZWN0aW9ucyhCQVNFX1NZU1RFTV9QUk9NUFQsIHNlc3Npb24uc3lzdGVtKTtcbiAgY29uc3Qgc3lzdGVtQ29udGV4dCA9IGpvaW5Qcm9tcHRTZWN0aW9ucyhza2lsbHNDb250ZXh0KTtcblxuICBpZiAoIXNlc3Npb24ubW9kZWwpIHtcbiAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcIlNlc3Npb24gbW9kZWwgaXMgbm90IHNldFwiKTtcbiAgfVxuXG4gIGNvbnN0IHN5c3RlbU1lc3NhZ2VzID0gW1xuICAgIC4uLihzeXN0ZW1IZWFkZXIudHJpbSgpXG4gICAgICA/IFt7IHJvbGU6IFwic3lzdGVtXCIgYXMgY29uc3QsIGNvbnRlbnQ6IHN5c3RlbUhlYWRlciB9XVxuICAgICAgOiBbXSksXG4gICAgLi4uKHN5c3RlbUNvbnRleHQudHJpbSgpXG4gICAgICA/IFt7IHJvbGU6IFwic3lzdGVtXCIgYXMgY29uc3QsIGNvbnRlbnQ6IHN5c3RlbUNvbnRleHQgfV1cbiAgICAgIDogW10pLFxuICBdO1xuXG4gIC8vIEV4ZWN1dGUgYXBwcm92ZWQgdG9vbHMgYmVmb3JlIGJ1aWxkaW5nIGZpbmFsIG1lc3NhZ2VzIGZvciBzdHJlYW1UZXh0LlxuICAvLyBUaGlzIGVuc3VyZXMgdGhlIG1vZGVsIHNlZXMgY29tcGxldGUgdG9vbCBjYWxsICsgcmVzdWx0IHBhaXJzLFxuICAvLyBhbmQgdG9VSU1lc3NhZ2VTdHJlYW0gd29uJ3QgZW5jb3VudGVyIG9ycGhhbmVkIHRvb2wgcmVzdWx0cy5cbiAgY29uc3QgYWxsUGFydHMgPSBwYXJ0c1Jlc3VsdC5pdGVtcztcbiAgY29uc3QgYXBwcm92ZWRQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAocCkgPT5cbiAgICAgIHAucGFydCAmJlxuICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgKHAucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVzcG9uZGVkXCIgJiZcbiAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnQgJiZcbiAgICAgIChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgYXBwcm92ZWQ/OiBib29sZWFuIH0gfSkuYXBwcm92YWw/LmFwcHJvdmVkID09PVxuICAgICAgICB0cnVlXG4gICk7XG5cbiAgY29uc3QgZXhlY3V0ZWRBcHByb3ZhbHM6IHtcbiAgICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gICAgb3V0cHV0OiB1bmtub3duO1xuICAgIGVycm9yPzogc3RyaW5nO1xuICB9W10gPSBbXTtcblxuICBpZiAoYXBwcm92ZWRQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgLy8gQnVpbGQgbW9kZWwgbWVzc2FnZXMgcHJlLWV4ZWN1dGlvbiBmb3IgdGhlIHRvb2wgZXhlY3V0ZSBjb250ZXh0XG4gICAgY29uc3QgcHJlRXhlY01lc3NhZ2VzID0gW1xuICAgICAgLi4uc3lzdGVtTWVzc2FnZXMsXG4gICAgICAuLi4oYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyhcbiAgICAgICAgYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICAgICAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQuaXRlbXMsXG4gICAgICAgICAgcGFydHM6IGFsbFBhcnRzLFxuICAgICAgICAgIHVudGlsOiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICAgICAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKSksXG4gICAgXTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXBwcm92ZWRQYXJ0cy5tYXAoYXN5bmMgKGFwKSA9PiB7XG4gICAgICAgIGlmICghYXAucGFydC50eXBlLnN0YXJ0c1dpdGgoXCJ0b29sLVwiKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJ0ID0gYXAucGFydCBhcyBFeHRyYWN0PFxuICAgICAgICAgIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgICAgICAgeyB0eXBlOiBgdG9vbC0ke3N0cmluZ31gIH1cbiAgICAgICAgPjtcbiAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBwYXJ0LnR5cGUucmVwbGFjZShcInRvb2wtXCIsIFwiXCIpO1xuICAgICAgICBjb25zdCB0b29sRGVmID0gcmF3VG9vbHNbdG9vbE5hbWVdO1xuXG4gICAgICAgIGlmICh0b29sRGVmPy5leGVjdXRlICYmIHBhcnQuaW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0b29sT3V0cHV0ID0gYXdhaXQgdG9vbERlZi5leGVjdXRlKHBhcnQuaW5wdXQsIHtcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBtZXNzYWdlczogcHJlRXhlY01lc3NhZ2VzLFxuICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBldmVudC5jb250ZXh0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYXJ0LnN0YXRlID0gXCJvdXRwdXQtYXZhaWxhYmxlXCI7XG4gICAgICAgICAgICBwYXJ0Lm91dHB1dCA9IHRvb2xPdXRwdXQ7XG4gICAgICAgICAgICBleGVjdXRlZEFwcHJvdmFscy5wdXNoKHtcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHRvb2xPdXRwdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBcIm91dHB1dC1lcnJvclwiO1xuICAgICAgICAgICAgcGFydC5lcnJvclRleHQgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICBleGVjdXRlZEFwcHJvdmFscy5wdXNoKHtcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzdG9yYWdlLnBhcnQuc2V0KHsgLi4uYXAsIHBhcnQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHVpTWVzc2FnZXMgPSBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICBwYXJ0czogYWxsUGFydHMsXG4gICAgdW50aWw6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICBpbmNsdWRlUXVldWVkOiB0cnVlLFxuICAgIGV4Y2x1ZGVTdWJUb29sUGFydHM6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IG1vZGVsTWVzc2FnZXMgPSBbXG4gICAgLi4uc3lzdGVtTWVzc2FnZXMsXG4gICAgLi4uKGF3YWl0IGNvbnZlcnRUb01vZGVsTWVzc2FnZXModWlNZXNzYWdlcykpLFxuICBdO1xuXG4gIGNvbnN0IHByb21wdENhY2hpbmcgPSBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdCh7XG4gICAgbW9kZWw6IHNlc3Npb24ubW9kZWwsXG4gICAgc2Vzc2lvbklkOiBpbnB1dC5zZXNzaW9uSWQsXG4gICAgbWVzc2FnZXM6IG1vZGVsTWVzc2FnZXMsXG4gIH0pO1xuXG4gIGNvbnN0IHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdID0gW107XG4gIGxldCBpbnRlcm5hbFN0ZXBJbmRleCA9IDA7XG5cbiAgLy8gSW5qZWN0IG5lZWRzQXBwcm92YWwgb24gZXZlcnkgdG9vbCBcdTIwMTQgZGVsZWdhdGVzIHRvIHRoZSBhZ2VudCBjbGllbnQgdmlhIFJQQ1xuICBjb25zdCB0b29scyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhyYXdUb29scykubWFwKChbbmFtZSwgdF0pID0+IFtcbiAgICAgIG5hbWUsXG4gICAgICB7XG4gICAgICAgIC4uLnQsXG4gICAgICAgIG5lZWRzQXBwcm92YWw6IGFzeW5jIChcbiAgICAgICAgICB0b29sSW5wdXQ6IHVua25vd24sXG4gICAgICAgICAgb3B0czogeyB0b29sQ2FsbElkOiBzdHJpbmc7IG1lc3NhZ2VzOiB1bmtub3duW10gfVxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBpbnB1dC5ycGMoe1xuICAgICAgICAgICAgbWV0aG9kOiBcInRvb2xzLm5lZWRzQXBwcm92YWxcIixcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICB0b29sTmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogb3B0cy50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBtZXNzYWdlczogb3B0cy5tZXNzYWdlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiByZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYHRvb2xzLm5lZWRzQXBwcm92YWwgUlBDIGZhaWxlZCBmb3IgJHtuYW1lfTogJHtyZXMuZXJyb3IubWVzc2FnZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzLnJlc3VsdCBhcyBib29sZWFuO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKVxuICApO1xuXG4gIGNvbnN0IHJlc3VsdCA9IHN0cmVhbVRleHQoe1xuICAgIG1lc3NhZ2VzOiBwcm9tcHRDYWNoaW5nLm1lc3NhZ2VzLFxuICAgIHRvb2xzLFxuICAgIG1vZGVsOiBzZXNzaW9uLm1vZGVsLFxuICAgIGFib3J0U2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGFjdGl2ZVRvb2xzOiBzZXNzaW9uLmFjdGl2ZVRvb2xzID8/IHVuZGVmaW5lZCxcbiAgICBwcm92aWRlck9wdGlvbnM6IHByb21wdENhY2hpbmcucHJvdmlkZXJPcHRpb25zLFxuICAgIHN0b3BXaGVuOiBzdGVwQ291bnRJcygxKSxcbiAgICB0ZW1wZXJhdHVyZTogc2Vzc2lvbi5nZW5lcmF0aW9uPy50ZW1wZXJhdHVyZSxcbiAgICB0b3BLOiBzZXNzaW9uLmdlbmVyYXRpb24/LnRvcEssXG4gICAgdG9wUDogc2Vzc2lvbi5nZW5lcmF0aW9uPy50b3BQLFxuICAgIGZyZXF1ZW5jeVBlbmFsdHk6IHNlc3Npb24uZ2VuZXJhdGlvbj8uZnJlcXVlbmN5UGVuYWx0eSxcbiAgICBwcmVzZW5jZVBlbmFsdHk6IHNlc3Npb24uZ2VuZXJhdGlvbj8ucHJlc2VuY2VQZW5hbHR5LFxuICAgIG1heE91dHB1dFRva2Vuczogc2Vzc2lvbi5nZW5lcmF0aW9uPy5tYXhPdXRwdXRUb2tlbnMsXG4gICAgaGVhZGVyczogc2Vzc2lvbi5nZW5lcmF0aW9uPy5oZWFkZXJzLFxuICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB7XG4gICAgICBzZXNzaW9uLFxuICAgICAgc2FuZGJveCxcbiAgICAgIHN0b3JhZ2UsXG4gICAgICBjb250ZXh0OiBldmVudC5jb250ZXh0LFxuICAgIH0sXG4gICAgb25TdGVwRmluaXNoOiAoeyB1c2FnZSB9KSA9PiB7XG4gICAgICBpZiAodXNhZ2UpIHtcbiAgICAgICAgdXNhZ2VTdGVwcy5wdXNoKHtcbiAgICAgICAgICBzdGVwSW5kZXg6IHN0ZXBJbmRleE9mZnNldCArIGludGVybmFsU3RlcEluZGV4LFxuICAgICAgICAgIG1vZGVsOiBzZXNzaW9uLm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgdG90YWxUb2tlbnM6IHVzYWdlLnRvdGFsVG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVSZWFkVG9rZW5zOiB1c2FnZS5pbnB1dFRva2VuRGV0YWlscz8uY2FjaGVSZWFkVG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVXcml0ZVRva2VuczogdXNhZ2UuaW5wdXRUb2tlbkRldGFpbHM/LmNhY2hlV3JpdGVUb2tlbnMgPz8gMCxcbiAgICAgICAgICByZWFzb25pbmdUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VuRGV0YWlscz8ucmVhc29uaW5nVG9rZW5zID8/IDAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaW50ZXJuYWxTdGVwSW5kZXgrKztcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBzdGVwUGFydHM6IFVJTWVzc2FnZVtcInBhcnRzXCJdID0gW107XG4gIGxldCB3YXNBYm9ydGVkID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdHJlYW0gPSBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0oe1xuICAgICAgZXhlY3V0ZTogKHsgd3JpdGVyIH0pID0+IHtcbiAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQgPSAoZXZlbnQ6IHVua25vd24pID0+XG4gICAgICAgICAgd3JpdGVyLndyaXRlKGV2ZW50IGFzIFBhcmFtZXRlcnM8dHlwZW9mIHdyaXRlci53cml0ZT5bMF0pO1xuXG4gICAgICAgIC8vIFN0cmVhbSB0b29sIGV4ZWN1dGlvbiByZXN1bHRzIGZyb20gYXBwcm92ZWQgdG9vbHNcbiAgICAgICAgZm9yIChjb25zdCBlYSBvZiBleGVjdXRlZEFwcHJvdmFscykge1xuICAgICAgICAgIGlmIChlYS5lcnJvcikge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBlYS50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBlcnJvclRleHQ6IGVhLmVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGVhLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG91dHB1dDogZWEub3V0cHV0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2UgdGhlIHN0cmVhbVRleHQgY29udGludWF0aW9uXG4gICAgICAgIHdyaXRlci5tZXJnZShcbiAgICAgICAgICByZXN1bHQudG9VSU1lc3NhZ2VTdHJlYW0oe1xuICAgICAgICAgICAgZ2VuZXJhdGVNZXNzYWdlSWQ6ICgpID0+IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgIG9uRmluaXNoOiAoeyBtZXNzYWdlcyB9KSA9PiB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBtZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIGlmIChtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBQYXJ0cy5wdXNoKC4uLm0ucGFydHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHN0cmVhbS5waXBlVG8od3JpdGFibGUsIHsgcHJldmVudENsb3NlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihcIltzdHJlYW1UZXh0U3RlcF0gc3RyZWFtIGVycm9yOlwiLCBlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBwb2xsQ29udHJvbGxlci5hYm9ydCgpO1xuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgc3RlcFBhcnRzLm1hcChhc3luYyAodWlQYXJ0KSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnBhcnQuc2V0KHtcbiAgICAgICAgaWQ6IGBwYXJ0XyR7dWxpZCgpfWAsXG4gICAgICAgIGluZGV4OiBuZXh0UGFydEluZGV4KyssXG4gICAgICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICBzZXNzaW9uSWQ6IGlucHV0LnNlc3Npb25JZCxcbiAgICAgICAgcGFydDogdWlQYXJ0LFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KVxuICApO1xuXG4gIGlmIChzZXRTdGFydGVkUHJvbWlzZSkge1xuICAgIGNvbnN0IHNldFN0YXJ0ZWRSZXN1bHQgPSBhd2FpdCBzZXRTdGFydGVkUHJvbWlzZTtcbiAgICBpZiAoc2V0U3RhcnRlZFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBzZXRTdGFydGVkUmVzdWx0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG0gb2Ygc2V0U3RhcnRlZFJlc3VsdCA/PyBbXSkge1xuICAgICAgaWYgKG0gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBtO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmdBcHByb3ZhbHMgPSBzdGVwUGFydHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHApOiBwIGlzIHR5cGVvZiBwICYgeyBhcHByb3ZhbDogeyBpZDogc3RyaW5nIH0gfSA9PlxuICAgICAgICBcInN0YXRlXCIgaW4gcCAmJlxuICAgICAgICBwLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiICYmXG4gICAgICAgIFwiYXBwcm92YWxcIiBpbiBwICYmXG4gICAgICAgICEhKHAgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pLmFwcHJvdmFsPy5pZFxuICAgIClcbiAgICAubWFwKChwKSA9PiAoe1xuICAgICAgYXBwcm92YWxJZDogcC5hcHByb3ZhbC5pZCxcbiAgICAgIHRvb2xOYW1lOiBcInR5cGVcIiBpbiBwID8gU3RyaW5nKHAudHlwZSkucmVwbGFjZShcInRvb2wtXCIsIFwiXCIpIDogXCJ1bmtub3duXCIsXG4gICAgfSkpO1xuXG4gIGNvbnN0IGZpbmFsRmluaXNoUmVhc29uID0gd2FzQWJvcnRlZFxuICAgID8gKFwic3RvcFwiIGFzIEZpbmlzaFJlYXNvbilcbiAgICA6IGF3YWl0IHJlc3VsdC5maW5pc2hSZWFzb247XG5cbiAgcmV0dXJuIHtcbiAgICBmaW5pc2hSZWFzb246IGZpbmFsRmluaXNoUmVhc29uLFxuICAgIGxhc3RQYXJ0SW5kZXg6IG5leHRQYXJ0SW5kZXgsXG4gICAgdXNhZ2VTdGVwcyxcbiAgICBwZW5kaW5nQXBwcm92YWxzLFxuICAgIG1heFN0ZXBzOiBzZXNzaW9uLmdlbmVyYXRpb24/Lm1heFN0ZXBzLFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2tpbGxzRGlyIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBQYXJzZWQgZnJvbnRtYXR0ZXIgZnJvbSBhIFNLSUxMLm1kIGZpbGUuXG4gKi9cbmV4cG9ydCB0eXBlIFNraWxsRnJvbnRtYXR0ZXIgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn07XG5cbi8qKlxuICogUGFyc2VzIFlBTUwgZnJvbnRtYXR0ZXIgZnJvbSBhIFNLSUxMLm1kIGZpbGUgY29udGVudC5cbiAqIEZyb250bWF0dGVyIG11c3QgYmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBkZWxpbWl0ZWQgYnkgYC0tLWAgbWFya2Vycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgbWFya2Rvd25cbiAqIC0tLVxuICogbmFtZTogY3N2XG4gKiBkZXNjcmlwdGlvbjogQW5hbHl6ZSBDU1YgZGF0YVxuICogLS0tXG4gKiAjIENTViBTa2lsbFxuICogLi4uXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyBQYXJzZWQgbmFtZSBhbmQgZGVzY3JpcHRpb24sIG9yIG51bGwgaWYgZnJvbnRtYXR0ZXIgaXMgbWlzc2luZy9pbnZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNraWxsRnJvbnRtYXR0ZXIoXG4gIGNvbnRlbnQ6IHN0cmluZ1xuKTogU2tpbGxGcm9udG1hdHRlciB8IG51bGwge1xuICBjb25zdCB0cmltbWVkID0gY29udGVudC50cmltKCk7XG5cbiAgaWYgKCF0cmltbWVkLnN0YXJ0c1dpdGgoXCItLS1cIikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGVuZE1hcmtlckluZGV4ID0gdHJpbW1lZC5pbmRleE9mKFwiLS0tXCIsIDMpO1xuICBpZiAoZW5kTWFya2VySW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmcm9udG1hdHRlckJsb2NrID0gdHJpbW1lZC5zbGljZSgzLCBlbmRNYXJrZXJJbmRleCkudHJpbSgpO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVNpbXBsZVlhbWwoZnJvbnRtYXR0ZXJCbG9jayk7XG5cbiAgaWYgKCEocGFyc2VkLm5hbWUgJiYgcGFyc2VkLmRlc2NyaXB0aW9uKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBTdHJpbmcocGFyc2VkLm5hbWUpLFxuICAgIGRlc2NyaXB0aW9uOiBTdHJpbmcocGFyc2VkLmRlc2NyaXB0aW9uKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgc2ltcGxlIFlBTUwga2V5LXZhbHVlIHBhaXJzIChzaW5nbGUtbGluZSB2YWx1ZXMgb25seSkuXG4gKiBUaGlzIGF2b2lkcyBhZGRpbmcgYSBmdWxsIFlBTUwgcGFyc2VyIGRlcGVuZGVuY3kgZm9yIGJhc2ljIGZyb250bWF0dGVyLlxuICovXG5mdW5jdGlvbiBwYXJzZVNpbXBsZVlhbWwoeWFtbDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiB5YW1sLnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWRMaW5lIHx8IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvbkluZGV4ID0gdHJpbW1lZExpbmUuaW5kZXhPZihcIjpcIik7XG4gICAgaWYgKGNvbG9uSW5kZXggPT09IC0xKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSB0cmltbWVkTGluZS5zbGljZSgwLCBjb2xvbkluZGV4KS50cmltKCk7XG4gICAgbGV0IHZhbHVlID0gdHJpbW1lZExpbmUuc2xpY2UoY29sb25JbmRleCArIDEpLnRyaW0oKTtcblxuICAgIC8vIFJlbW92ZSBzdXJyb3VuZGluZyBxdW90ZXMgaWYgcHJlc2VudFxuICAgIGlmIChcbiAgICAgICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKSB8fFxuICAgICAgKHZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIHZhbHVlLmVuZHNXaXRoKFwiJ1wiKSlcbiAgICApIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgIH1cblxuICAgIGlmIChrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHNraWxsc0RpciB0byBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2tpbGxzRGlycyhza2lsbHNEaXI/OiBTa2lsbHNEaXIpOiBzdHJpbmdbXSB7XG4gIGlmICghc2tpbGxzRGlyKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHNraWxsc0RpcikgPyBza2lsbHNEaXIgOiBbc2tpbGxzRGlyXTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3ggfSBmcm9tIFwiLi4vc2FuZGJveFwiO1xuaW1wb3J0IHsgcGFyc2VTa2lsbEZyb250bWF0dGVyIH0gZnJvbSBcIi4vcGFyc2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsU3VtbWFyeSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogRGlzY292ZXJzIHNraWxscyBmcm9tIGRpcmVjdG9yaWVzIGluc2lkZSB0aGUgc2FuZGJveCBieSBmaW5kaW5nIGFuZCBwYXJzaW5nIFNLSUxMLm1kIGZpbGVzLlxuICogU2NhbnMgZWFjaCBkaXJlY3RvcnkgZm9yIHN1YmRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgU0tJTEwubWQsIGV4dHJhY3RzIGZyb250bWF0dGVyIG1ldGFkYXRhLFxuICogYW5kIHJldHVybnMgc3VtbWFyaWVzIGZvciB1c2UgaW4gdGhlIHN5c3RlbSBwcm9tcHQuXG4gKlxuICogQHJldHVybnMgQXJyYXkgb2Ygc2tpbGwgc3VtbWFyaWVzIChkZWR1cGxpY2F0ZWQgYnkgbmFtZSwgZmlyc3Qgb2NjdXJyZW5jZSB3aW5zKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJTa2lsbHNJblNhbmRib3gob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBza2lsbHNEaXJzOiBzdHJpbmdbXTtcbiAgZGVidWc/OiBib29sZWFuO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5W10+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbHNEaXJzLCBkZWJ1ZyB9ID0gb3B0cztcblxuICBjb25zdCBzdW1tYXJpZXM6IFNraWxsU3VtbWFyeVtdID0gW107XG4gIGNvbnN0IHNlZW5OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3Qgc2tpbGxzRGlyIG9mIHNraWxsc0RpcnMpIHtcbiAgICBjb25zdCBkaXJTdW1tYXJpZXMgPSBhd2FpdCBkaXNjb3ZlclNraWxsc0luRGlyZWN0b3J5KHtcbiAgICAgIHNhbmRib3gsXG4gICAgICBza2lsbHNEaXIsXG4gICAgICBkZWJ1ZyxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBkaXJTdW1tYXJpZXMpIHtcbiAgICAgIGlmICghc2Vlbk5hbWVzLmhhcyhzdW1tYXJ5Lm5hbWUpKSB7XG4gICAgICAgIHNlZW5OYW1lcy5hZGQoc3VtbWFyeS5uYW1lKTtcbiAgICAgICAgc3VtbWFyaWVzLnB1c2goc3VtbWFyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1bW1hcmllcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJTa2lsbHNJbkRpcmVjdG9yeShvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNraWxsc0Rpcjogc3RyaW5nO1xuICBkZWJ1Zz86IGJvb2xlYW47XG59KTogUHJvbWlzZTxTa2lsbFN1bW1hcnlbXT4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNraWxsc0RpciwgZGVidWcgfSA9IG9wdHM7XG4gIGNvbnN0IHNraWxsUGF0aHMgPSBhd2FpdCBmaW5kU2tpbGxGaWxlcyh7IHNhbmRib3gsIHNraWxsc0RpciwgZGVidWcgfSk7XG5cbiAgaWYgKHNraWxsUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3Qgc3VtbWFyaWVzOiBTa2lsbFN1bW1hcnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qgc2tpbGxNZFBhdGggb2Ygc2tpbGxQYXRocykge1xuICAgIGNvbnN0IHN1bW1hcnkgPSBhd2FpdCBwYXJzZVNraWxsRmlsZSh7IHNhbmRib3gsIHNraWxsTWRQYXRoLCBkZWJ1ZyB9KTtcbiAgICBpZiAoc3VtbWFyeSkge1xuICAgICAgc3VtbWFyaWVzLnB1c2goc3VtbWFyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1bW1hcmllcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFNraWxsRmlsZXMob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBza2lsbHNEaXI6IHN0cmluZztcbiAgZGVidWc/OiBib29sZWFuO1xufSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbHNEaXIsIGRlYnVnIH0gPSBvcHRzO1xuXG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwiZmluZFwiLFxuICAgIGFyZ3M6IFtza2lsbHNEaXIsIFwiLW5hbWVcIiwgXCJTS0lMTC5tZFwiLCBcIi10eXBlXCIsIFwiZlwiXSxcbiAgfSk7XG5cbiAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Rpc2NvdmVyXSBGYWlsZWQgdG8gc2NhbiBza2lsbHMgZGlyZWN0b3J5IFwiJHtza2lsbHNEaXJ9XCI6ICR7ZXhlY1Jlc3VsdC5tZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcbiAgaWYgKGRlYnVnKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgW2Rpc2NvdmVyXSBmaW5kIHJlc3VsdDogZXhpdENvZGU9JHtleGl0Q29kZX0sIHN0ZG91dD1cIiR7c3Rkb3V0LnRyaW0oKX1cIiwgc3RkZXJyPVwiJHtzdGRlcnIudHJpbSgpfVwiYFxuICAgICk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtkaXNjb3Zlcl0gU2tpbGxzIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgaW5hY2Nlc3NpYmxlOiAke3NraWxsc0Rpcn1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwYXRocyA9IHN0ZG91dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAuZmlsdGVyKChwKSA9PiBwLmxlbmd0aCA+IDApO1xuICBpZiAoZGVidWcpIHtcbiAgICBjb25zb2xlLmxvZyhcIltkaXNjb3Zlcl0gRm91bmQgc2tpbGwgcGF0aHM6XCIsIHBhdGhzKTtcbiAgfVxuICByZXR1cm4gcGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlU2tpbGxGaWxlKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2tpbGxNZFBhdGg6IHN0cmluZztcbiAgZGVidWc/OiBib29sZWFuO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5IHwgbnVsbD4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNraWxsTWRQYXRoLCBkZWJ1ZyB9ID0gb3B0cztcbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJjYXRcIixcbiAgICBhcmdzOiBbc2tpbGxNZFBhdGhdLFxuICB9KTtcblxuICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZGlzY292ZXJdIEZhaWxlZCB0byByZWFkIHNraWxsIGZpbGUgXCIke3NraWxsTWRQYXRofVwiOiAke2V4ZWNSZXN1bHQubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtkaXNjb3Zlcl0gQ291bGQgbm90IHJlYWQgc2tpbGwgZmlsZTogJHtza2lsbE1kUGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBwYXJzZVNraWxsRnJvbnRtYXR0ZXIoc3Rkb3V0KTtcblxuICBpZiAoIXBhcnNlZCkge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Rpc2NvdmVyXSBJbnZhbGlkIG9yIG1pc3NpbmcgZnJvbnRtYXR0ZXIgaW46ICR7c2tpbGxNZFBhdGh9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6IHBhcnNlZC5uYW1lLFxuICAgIGRlc2NyaXB0aW9uOiBwYXJzZWQuZGVzY3JpcHRpb24sXG4gICAgc2tpbGxNZFBhdGgsXG4gIH07XG59XG4iLCAiaW1wb3J0IHsganNvblNjaGVtYSwgdHlwZSBUb29sU2V0LCB0b29sIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudElucHV0LCBBZ2VudE1lc3NhZ2VJbnB1dCB9IGZyb20gXCIuLi9hZ2VudC13b3JrZmxvd1wiO1xuaW1wb3J0IHR5cGUgeyBScGNQYXlsb2FkLCBScGNSZXN1bHQgfSBmcm9tIFwiLi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3ggfSBmcm9tIFwiLi4vc2FuZGJveFwiO1xuaW1wb3J0IHsgREVGQVVMVF9XQUlUX1VOVElMIH0gZnJvbSBcIi4uL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hSZWNvcmQsIFNlc3Npb24sIFN0b3JhZ2UgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgY3JlYXRlSmF2YVNjcmlwdFRvb2wsIHR5cGUgT25TdWJUb29sQ2FsbCB9IGZyb20gXCIuL2phdmFzY3JpcHRcIjtcblxuY29uc3QgQUdFTlRfUFJPVE9DT0xfVkVSU0lPTiA9IFwidjFcIjtcblxudHlwZSBJbnRlcm5hbFRvb2xDb250ZXh0ID0ge1xuICBpbnB1dDogQWdlbnRJbnB1dDtcbiAgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0O1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkO1xuICBhcGlUb29sc01ldGFkYXRhOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIGlucHV0U2NoZW1hPzogdW5rbm93bjtcbiAgfVtdO1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFRvb2xDb250ZXh0PFRDb250ZXh0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBjb250ZXh0OiBUQ29udGV4dDtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsdEluVG9vbHMgPSB7XG4gIFJlYWQ6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZWFkcyBhIGZpbGUgYW5kIHJldHVybnMgaXRzIGNvbnRlbnRzIHdpdGggbWV0YWRhdGEuIEZvciBmaWxlcyBvdmVyIDIwMCBsaW5lcywgYXV0b21hdGljYWxseSBzaG93cyBmaXJzdCAxMDAgbGluZXMgdW5sZXNzIGEgc3BlY2lmaWMgbGluZSByYW5nZSBpcyBwcm92aWRlZC4gVXNlIHN0YXJ0TGluZSBhbmQgZW5kTGluZSBwYXJhbWV0ZXJzIHRvIHJlYWQgc3BlY2lmaWMgcG9ydGlvbnMgb2YgbGFyZ2UgZmlsZXMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290XCIpLFxuICAgICAgc3RhcnRMaW5lOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTdGFydGluZyBsaW5lIG51bWJlciAoMS1pbmRleGVkKS4gSWYgcHJvdmlkZWQgd2l0aCBlbmRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgICAgZW5kTGluZTogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRW5kaW5nIGxpbmUgbnVtYmVyICgxLWluZGV4ZWQsIGluY2x1c2l2ZSkuIElmIHByb3ZpZGVkIHdpdGggc3RhcnRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkZpbGUgY29udGVudFwiKSxcbiAgICAgIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgICAgIHRvdGFsTGluZXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGVcIiksXG4gICAgICAgIGxpbmVzU2hvd246IHpcbiAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJOdW1iZXIgb2YgbGluZXMgaW5jbHVkZWQgaW4gdGhpcyByZXNwb25zZVwiKSxcbiAgICAgICAgc3RhcnRMaW5lOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRmlyc3QgbGluZSBudW1iZXIgc2hvd24gKDEtaW5kZXhlZClcIiksXG4gICAgICAgIGVuZExpbmU6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJMYXN0IGxpbmUgbnVtYmVyIHNob3duICgxLWluZGV4ZWQpXCIpLFxuICAgICAgICBpc1BhZ2luYXRlZDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJXaGV0aGVyIHRoaXMgaXMgYSBwYXJ0aWFsIHZpZXcgb2YgdGhlIGZpbGVcIiksXG4gICAgICAgIGZpbGVTaXplOiB6XG4gICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiSHVtYW4tcmVhZGFibGUgZmlsZSBzaXplIChlLmcuLCAnMi41SycsICcxLjJNJylcIiksXG4gICAgICAgIHBhdGg6IHpcbiAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290XCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBHcmVwOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VhcmNoIGZvciBwYXR0ZXJucyBpbiBmaWxlcyB1c2luZyByaXBncmVwLiBVc2UgdGhpcyB0byBmaW5kIGNvZGUgcGF0dGVybnMsIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBpbXBvcnRzLCBldGMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdHRlcm46IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIlJlZ2V4IHBhdHRlcm4gdG8gc2VhcmNoIGZvciAocmlwZ3JlcCBzeW50YXgpXCIpLFxuICAgICAgcGF0aDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiUGF0aCB0byBzZWFyY2ggaW4gKGRlZmF1bHRzIHRvIHdvcmtzcGFjZSByb290KS4gQ2FuIGJlIGEgZmlsZSBvciBkaXJlY3RvcnkuXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVUeXBlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJGaWxlIHR5cGUgdG8gZmlsdGVyIGJ5IChlLmcuLCAndHMnLCAnanMnLCAncHknLCAnbWQnKS4gVXNlcyByaXBncmVwJ3MgYnVpbHQtaW4gdHlwZSBmaWx0ZXJzLlwiXG4gICAgICAgICksXG4gICAgICBnbG9iOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJHbG9iIHBhdHRlcm4gdG8gZmlsdGVyIGZpbGVzIChlLmcuLCAnKi50c3gnLCAnc3JjLyoqLyoudHMnKVwiXG4gICAgICAgICksXG4gICAgICBjYXNlU2Vuc2l0aXZlOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgLmRlc2NyaWJlKFwiV2hldGhlciBzZWFyY2ggaXMgY2FzZS1zZW5zaXRpdmUgKGRlZmF1bHQ6IHRydWUpXCIpLFxuICAgICAgY29udGV4dExpbmVzOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJOdW1iZXIgb2YgY29udGV4dCBsaW5lcyB0byBzaG93IGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBtYXRjaFwiXG4gICAgICAgICksXG4gICAgICBtYXhDb3VudDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4aW11bSBudW1iZXIgb2YgbWF0Y2hlcyBwZXIgZmlsZSAodXNlZnVsIGZvciBsaW1pdGluZyBvdXRwdXQpXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVzV2l0aE1hdGNoZXM6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiT25seSBzaG93IGZpbGUgcGF0aHMgdGhhdCBjb250YWluIG1hdGNoZXMsIG5vdCB0aGUgbWF0Y2hpbmcgbGluZXMgdGhlbXNlbHZlc1wiXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBtYXRjaGVzOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTZWFyY2ggcmVzdWx0cyB3aXRoIGZpbGUgcGF0aHMsIGxpbmUgbnVtYmVycywgYW5kIG1hdGNoaW5nIGNvbnRlbnRcIlxuICAgICAgICApLFxuICAgICAgc3VtbWFyeTogei5vYmplY3Qoe1xuICAgICAgICBtYXRjaENvdW50OiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIG1hdGNoZXMgZm91bmRcIiksXG4gICAgICAgIGZpbGVDb3VudDogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBmaWxlcyBjb250YWluaW5nIG1hdGNoZXNcIiksXG4gICAgICAgIHNlYXJjaFBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRoYXQgd2FzIHNlYXJjaGVkXCIpLFxuICAgICAgICBwYXR0ZXJuOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0dGVybiB0aGF0IHdhcyBzZWFyY2hlZCBmb3JcIiksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIExpc3Q6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZWN1cnNpdmVseSBsaXN0IGRpcmVjdG9yeSBjb250ZW50cy4gVXNlIHRoaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29kZWJhc2Ugc3RydWN0dXJlLCBmaW5kIGZpbGVzLCBvciBleHBsb3JlIGRpcmVjdG9yaWVzLiBDb250cm9sIGRlcHRoIHRvIGJhbGFuY2UgZGV0YWlsIHZzLiBvdmVydmlldy4gRGVwdGggMSBzaG93cyBpbW1lZGlhdGUgY2hpbGRyZW4sIGRlcHRoIDIgaW5jbHVkZXMgc3ViZGlyZWN0b3JpZXMsIGV0Yy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgcGF0aDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiUGF0aCB0byBsaXN0IChkZWZhdWx0cyB0byB3b3Jrc3BhY2Ugcm9vdClcIiksXG4gICAgICBkZXB0aDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4aW11bSBkZXB0aCB0byB0cmF2ZXJzZS4gQ2hvb3NlIGJhc2VkIG9uIGNvbnRleHQ6IDEtMiBmb3IgcXVpY2sgb3ZlcnZpZXcsIDMtNCBmb3IgZGV0YWlsZWQgZXhwbG9yYXRpb24sIDUrIGZvciBjb21wcmVoZW5zaXZlIG1hcHBpbmdcIlxuICAgICAgICApLFxuICAgICAgaW5jbHVkZUhpZGRlbjogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJJbmNsdWRlIGhpZGRlbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKHRob3NlIHN0YXJ0aW5nIHdpdGggJy4nKVwiXG4gICAgICAgICksXG4gICAgICBmaWxlc09ubHk6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFwiT25seSBzaG93IGZpbGVzLCBub3QgZGlyZWN0b3JpZXNcIiksXG4gICAgICBwYXR0ZXJuOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJHbG9iIHBhdHRlcm4gdG8gZmlsdGVyIHJlc3VsdHMgKGUuZy4sICcqLnRzJywgJyp0ZXN0KicpXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGlzdGluZzogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRGlyZWN0b3J5IHRyZWUgbGlzdGluZyBzaG93aW5nIHBhdGhzIHJlbGF0aXZlIHRvIHNlYXJjaCByb290XCJcbiAgICAgICAgKSxcbiAgICAgIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICAgICAgdG90YWxJdGVtczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBpdGVtcyBmb3VuZFwiKSxcbiAgICAgICAgdG90YWxGaWxlczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBmaWxlcyBmb3VuZFwiKSxcbiAgICAgICAgdG90YWxEaXJzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGZvdW5kXCIpLFxuICAgICAgICBzZWFyY2hQYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0aGF0IHdhcyBsaXN0ZWRcIiksXG4gICAgICAgIGRlcHRoOiB6XG4gICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJNYXhpbXVtIGRlcHRoIHVzZWQgKGlmIHNwZWNpZmllZClcIiksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIFdyaXRlOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiV3JpdGUgY29udGVudCB0byBhIGZpbGUuIENyZWF0ZXMgcGFyZW50IGRpcmVjdG9yaWVzIGF1dG9tYXRpY2FsbHkuIE92ZXJ3cml0ZXMgZXhpc3RpbmcgZmlsZXMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290XCIpLFxuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkNvbnRlbnQgdG8gd3JpdGUgdG8gdGhlIGZpbGVcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdWNjZXNzOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgdGhlIHdyaXRlIHN1Y2NlZWRlZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSB3cml0dGVuIGZpbGVcIiksXG4gICAgICBieXRlc1dyaXR0ZW46IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlblwiKSxcbiAgICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBtZXNzYWdlIGlmIHdyaXRlIGZhaWxlZFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEVkaXQ6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFZGl0IGEgZmlsZSBieSByZXBsYWNpbmcgYW4gZXhhY3Qgc3RyaW5nLiBGYWlscyBpZiBvbGRfc3RyaW5nIGlzIG5vdCBmb3VuZCBvciBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIChub3QgdW5pcXVlKS4gRm9yIG11bHRpcGxlIHJlcGxhY2VtZW50cywgY2FsbCB0aGlzIHRvb2wgbXVsdGlwbGUgdGltZXMgd2l0aCB1bmlxdWUgY29udGV4dC5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gd29ya3NwYWNlIHJvb3RcIiksXG4gICAgICBvbGRfc3RyaW5nOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJFeGFjdCBzdHJpbmcgdG8gZmluZCBhbmQgcmVwbGFjZSAobXVzdCBiZSB1bmlxdWUgaW4gZmlsZSlcIiksXG4gICAgICBuZXdfc3RyaW5nOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU3RyaW5nIHRvIHJlcGxhY2Ugb2xkX3N0cmluZyB3aXRoXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3VjY2Vzczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJXaGV0aGVyIHRoZSBlZGl0IHN1Y2NlZWRlZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBlZGl0ZWQgZmlsZVwiKSxcbiAgICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBtZXNzYWdlIGlmIGVkaXQgZmFpbGVkXCIpLFxuICAgIH0pLFxuICB9KSxcbiAgQmFzaDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkV4ZWN1dGVzIGEgYmFzaCBjb21tYW5kIGluc2lkZSB0aGUgd29ya3NwYWNlLiBDV0QgcGVyc2lzdHMgYmV0d2VlbiBjb21tYW5kcyB3aXRoaW4gYSBzZXNzaW9uLiBVc2Ugd2FpdFVudGlsOjAgZm9yIGJhY2tncm91bmQgcHJvY2Vzc2VzIChkZXYgc2VydmVycykuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbW1hbmQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJUaGUgc2hlbGwgY29tbWFuZCB0byBleGVjdXRlXCIpLFxuICAgICAgd2FpdFVudGlsOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgYE1heCBtcyB0byB3YWl0IGZvciBjb21wbGV0aW9uIChkZWZhdWx0OiAke0RFRkFVTFRfV0FJVF9VTlRJTH0pLiBVc2UgMCB0byBydW4gaW4gYmFja2dyb3VuZCBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LmBcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBpZDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU3lzdGVtIFBJRCAoMCBmb3IgZm9yZWdyb3VuZCwgPjAgZm9yIGJhY2tncm91bmQgLSB1c2UgdG8ga2lsbClcIlxuICAgICAgICApLFxuICAgICAgb3V0cHV0OiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJDb21tYW5kIHN0ZG91dCtzdGRlcnIgY29tYmluZWQgKGVtcHR5IGZvciBiYWNrZ3JvdW5kKVwiKSxcbiAgICAgIGV4aXRDb2RlOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRXhpdCBjb2RlICgtMSBmb3IgYmFja2dyb3VuZC9ydW5uaW5nKVwiKSxcbiAgICAgIHN0YXR1czogelxuICAgICAgICAuZW51bShbXCJydW5uaW5nXCIsIFwiY29tcGxldGVkXCIsIFwiZmFpbGVkXCJdKVxuICAgICAgICAuZGVzY3JpYmUoXCJQcm9jZXNzIHN0YXR1c1wiKSxcbiAgICAgIGN3ZDogei5zdHJpbmcoKS5kZXNjcmliZShcIkN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYWZ0ZXIgY29tbWFuZFwiKSxcbiAgICAgIG91dHB1dEZpbGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIlBhdGggdG8gb3V0cHV0IGxvZyAoZm9yIGJhY2tncm91bmQgcHJvY2Vzc2VzKVwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEphdmFTY3JpcHQ6IHRvb2woe1xuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb2RlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJKYXZhU2NyaXB0IGFzeW5jIGZ1bmN0aW9uIGJvZHkuIGBjdHhgIGlzIGluIHNjb3BlLiBNdXN0IHVzZSBgcmV0dXJuYCB0byBwcm9kdWNlIG91dHB1dC5cIlxuICAgICAgICApLFxuICAgIH0pLFxuICB9KSxcbn0gc2F0aXNmaWVzIFRvb2xTZXQ7XG5cbmV4cG9ydCB0eXBlIEJ1aWx0SW5Ub29sTmFtZSA9IGtleW9mIHR5cGVvZiBidWlsdEluVG9vbHM7XG5leHBvcnQgY29uc3QgYnVpbHRpblRvb2xOYW1lcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgT2JqZWN0LmVudHJpZXMoYnVpbHRJblRvb2xzKS5tYXAoKFtuYW1lXSkgPT4gW25hbWUsIG5hbWVdKVxuKSBhcyB7IFtLIGluIEJ1aWx0SW5Ub29sTmFtZV06IEsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2xzKGNvbnRleHQ6IEludGVybmFsVG9vbENvbnRleHQpIHtcbiAgY29uc3QgdG9vbHM6IFRvb2xTZXQgPSB7XG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuUmVhZF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLlJlYWQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBzdGFydExpbmUsIGVuZExpbmUgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGg7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LmV4ZWMoe1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHNldCAtZVxuICAgICAgICAgICAgRklMRT1cIiQxXCJcbiAgICAgICAgICAgIFNUQVJUX0xJTkU9XCIkMlwiXG4gICAgICAgICAgICBFTkRfTElORT1cIiQzXCJcblxuICAgICAgICAgICAgIyBSZXNvbHZlIHN5bWxpbmtzIGFuZCBjaGVjayBmaWxlIGV4aXN0c1xuICAgICAgICAgICAgaWYgWyAtTCBcIiRGSUxFXCIgXTsgdGhlblxuICAgICAgICAgICAgICBSRVNPTFZFRD0kKHJlYWRsaW5rIC1mIFwiJEZJTEVcIiAyPi9kZXYvbnVsbCB8fCBlY2hvIFwiXCIpXG4gICAgICAgICAgICAgIGlmIFsgLXogXCIkUkVTT0xWRURcIiBdIHx8IFsgISAtZSBcIiRSRVNPTFZFRFwiIF07IHRoZW5cbiAgICAgICAgICAgICAgICBlY2hvIFwiRXJyb3I6IEJyb2tlbiBzeW1saW5rIC0gJEZJTEUgcG9pbnRzIHRvIG5vbi1leGlzdGVudCB0YXJnZXRcIiA+JjJcbiAgICAgICAgICAgICAgICBleGl0IDFcbiAgICAgICAgICAgICAgZmlcbiAgICAgICAgICAgICAgRklMRT1cIiRSRVNPTFZFRFwiXG4gICAgICAgICAgICBlbGlmIFsgISAtZSBcIiRGSUxFXCIgXTsgdGhlblxuICAgICAgICAgICAgICBlY2hvIFwiRXJyb3I6IEZpbGUgbm90IGZvdW5kIC0gJEZJTEVcIiA+JjJcbiAgICAgICAgICAgICAgZXhpdCAxXG4gICAgICAgICAgICBmaVxuXG4gICAgICAgICAgICAjIEdldCBtZXRhZGF0YSAoY291bnQgYWN0dWFsIGxpbmVzLCBub3QganVzdCBuZXdsaW5lcylcbiAgICAgICAgICAgIFRPVEFMX0xJTkVTPSQoYXdrICdFTkR7cHJpbnQgTlJ9JyBcIiRGSUxFXCIpXG4gICAgICAgICAgICBGSUxFX1NJWkU9JChscyAtbGggXCIkRklMRVwiIHwgYXdrICd7cHJpbnQgJDV9JylcblxuICAgICAgICAgICAgIyBEZXRlcm1pbmUgcmFuZ2VcbiAgICAgICAgICAgIFBBR0VfU0laRT0xMDBcbiAgICAgICAgICAgIGlmIFsgLW4gXCIkU1RBUlRfTElORVwiIF0gJiYgWyAtbiBcIiRFTkRfTElORVwiIF07IHRoZW5cbiAgICAgICAgICAgICAgIyBCb3RoIHByb3ZpZGVkIC0gdXNlIGV4YWN0IHJhbmdlXG4gICAgICAgICAgICAgIEFDVFVBTF9TVEFSVD0kU1RBUlRfTElORVxuICAgICAgICAgICAgICBBQ1RVQUxfRU5EPSRFTkRfTElORVxuICAgICAgICAgICAgZWxpZiBbIC1uIFwiJFNUQVJUX0xJTkVcIiBdOyB0aGVuXG4gICAgICAgICAgICAgICMgT25seSBzdGFydExpbmUgLSByZWFkIFBBR0VfU0laRSBsaW5lcyBmcm9tIHRoZXJlXG4gICAgICAgICAgICAgIEFDVFVBTF9TVEFSVD0kU1RBUlRfTElORVxuICAgICAgICAgICAgICBBQ1RVQUxfRU5EPSQoKFNUQVJUX0xJTkUgKyBQQUdFX1NJWkUgLSAxKSlcbiAgICAgICAgICAgICAgWyBcIiRBQ1RVQUxfRU5EXCIgLWd0IFwiJFRPVEFMX0xJTkVTXCIgXSAmJiBBQ1RVQUxfRU5EPSRUT1RBTF9MSU5FU1xuICAgICAgICAgICAgZWxpZiBbIC1uIFwiJEVORF9MSU5FXCIgXTsgdGhlblxuICAgICAgICAgICAgICAjIE9ubHkgZW5kTGluZSAtIHJlYWQgZnJvbSBiZWdpbm5pbmcgdG8gZW5kTGluZVxuICAgICAgICAgICAgICBBQ1RVQUxfU1RBUlQ9MVxuICAgICAgICAgICAgICBBQ1RVQUxfRU5EPSRFTkRfTElORVxuICAgICAgICAgICAgZWxpZiBbIFwiJFRPVEFMX0xJTkVTXCIgLWd0IDIwMCBdOyB0aGVuXG4gICAgICAgICAgICAgICMgTm8gcmFuZ2UsIGxhcmdlIGZpbGUgLSBwYWdpbmF0ZVxuICAgICAgICAgICAgICBBQ1RVQUxfU1RBUlQ9MVxuICAgICAgICAgICAgICBBQ1RVQUxfRU5EPSRQQUdFX1NJWkVcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgIyBObyByYW5nZSwgc21hbGwgZmlsZSAtIHNob3cgYWxsXG4gICAgICAgICAgICAgIEFDVFVBTF9TVEFSVD0xXG4gICAgICAgICAgICAgIEFDVFVBTF9FTkQ9JFRPVEFMX0xJTkVTXG4gICAgICAgICAgICBmaVxuXG4gICAgICAgICAgICAjIE91dHB1dCBtZXRhZGF0YSBmaXJzdCAoc2VwYXJhdGVkIGJ5IHx8fCBmb3IgcGFyc2luZylcbiAgICAgICAgICAgIGVjaG8gXCIkVE9UQUxfTElORVN8JEZJTEVfU0laRXwkQUNUVUFMX1NUQVJUfCRBQ1RVQUxfRU5EXCJcbiAgICAgICAgICAgIGVjaG8gXCJ8fHxDT05URU5UfHx8XCJcblxuICAgICAgICAgICAgIyBSZWFkIGNvbnRlbnRcbiAgICAgICAgICAgIGlmIFsgXCIkQUNUVUFMX1NUQVJUXCIgLWVxIDEgXSAmJiBbIFwiJEFDVFVBTF9FTkRcIiAtZXEgXCIkVE9UQUxfTElORVNcIiBdOyB0aGVuXG4gICAgICAgICAgICAgIGNhdCBcIiRGSUxFXCJcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgc2VkIC1uIFwiXFwke0FDVFVBTF9TVEFSVH0sXFwke0FDVFVBTF9FTkR9cFwiIFwiJEZJTEVcIlxuICAgICAgICAgICAgZmlcbiAgICAgICAgICBgLFxuICAgICAgICAgICAgXCItLVwiLFxuICAgICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgICBzdGFydExpbmU/LnRvU3RyaW5nKCkgfHwgXCJcIixcbiAgICAgICAgICAgIGVuZExpbmU/LnRvU3RyaW5nKCkgfHwgXCJcIixcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW1JlYWQgVG9vbF1cIiwgcmVzdWx0KTtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbUmVhZCBUb29sXSBFcnJvcjogJHtzdGRlcnJ9YCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBFcnJvcjogJHtzdGRlcnJ9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHRvdGFsTGluZXM6IDAsXG4gICAgICAgICAgICAgIGxpbmVzU2hvd246IDAsXG4gICAgICAgICAgICAgIHN0YXJ0TGluZTogMCxcbiAgICAgICAgICAgICAgZW5kTGluZTogMCxcbiAgICAgICAgICAgICAgaXNQYWdpbmF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBmaWxlU2l6ZTogXCIwXCIsXG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW21ldGFkYXRhTGluZSwgLi4ucmVzdF0gPSBzdGRvdXQuc3BsaXQoXCJ8fHxDT05URU5UfHx8XCIpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gcmVzdC5qb2luKFwifHx8Q09OVEVOVHx8fFwiKS50cmltU3RhcnQoKTtcbiAgICAgICAgY29uc3QgW3RvdGFsTGluZXNTdHIsIGZpbGVTaXplLCBhY3R1YWxTdGFydFN0ciwgYWN0dWFsRW5kU3RyXSA9XG4gICAgICAgICAgbWV0YWRhdGFMaW5lLnRyaW0oKS5zcGxpdChcInxcIik7XG5cbiAgICAgICAgY29uc3QgdG90YWxMaW5lcyA9IE51bWJlci5wYXJzZUludCh0b3RhbExpbmVzU3RyLCAxMCk7XG4gICAgICAgIGNvbnN0IGFjdHVhbFN0YXJ0ID0gTnVtYmVyLnBhcnNlSW50KGFjdHVhbFN0YXJ0U3RyLCAxMCk7XG4gICAgICAgIGNvbnN0IGFjdHVhbEVuZCA9IE51bWJlci5wYXJzZUludChhY3R1YWxFbmRTdHIsIDEwKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgTnVtYmVyLmlzTmFOKHRvdGFsTGluZXMpIHx8XG4gICAgICAgICAgTnVtYmVyLmlzTmFOKGFjdHVhbFN0YXJ0KSB8fFxuICAgICAgICAgIE51bWJlci5pc05hTihhY3R1YWxFbmQpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW1JlYWQgVG9vbF0gRmFpbGVkIHRvIHBhcnNlIG1ldGFkYXRhOiAke21ldGFkYXRhTGluZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogYEVycm9yOiBGYWlsZWQgdG8gcGFyc2UgZmlsZSBtZXRhZGF0YS4gUmF3IG91dHB1dDogJHtzdGRvdXQuc2xpY2UoXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIDUwMFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgdG90YWxMaW5lczogMCxcbiAgICAgICAgICAgICAgbGluZXNTaG93bjogMCxcbiAgICAgICAgICAgICAgc3RhcnRMaW5lOiAwLFxuICAgICAgICAgICAgICBlbmRMaW5lOiAwLFxuICAgICAgICAgICAgICBpc1BhZ2luYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgIGZpbGVTaXplOiBcInVua25vd25cIixcbiAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0b3RhbExpbmVzLFxuICAgICAgICAgICAgbGluZXNTaG93bjogTWF0aC5tYXgoMCwgYWN0dWFsRW5kIC0gYWN0dWFsU3RhcnQgKyAxKSxcbiAgICAgICAgICAgIHN0YXJ0TGluZTogYWN0dWFsU3RhcnQsXG4gICAgICAgICAgICBlbmRMaW5lOiBhY3R1YWxFbmQsXG4gICAgICAgICAgICBpc1BhZ2luYXRlZDogYWN0dWFsRW5kIDwgdG90YWxMaW5lcyxcbiAgICAgICAgICAgIGZpbGVTaXplOiBmaWxlU2l6ZSB8fCBcInVua25vd25cIixcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuR3JlcF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkdyZXAsXG4gICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICBwYXR0ZXJuLFxuICAgICAgICBwYXRoLFxuICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgZ2xvYixcbiAgICAgICAgY2FzZVNlbnNpdGl2ZSxcbiAgICAgICAgY29udGV4dExpbmVzLFxuICAgICAgICBtYXhDb3VudCxcbiAgICAgICAgZmlsZXNXaXRoTWF0Y2hlcyxcbiAgICAgIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGF0aCA9IHBhdGggPz8gXCIuXCI7XG5cbiAgICAgICAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBhcmdzLnB1c2goXCItLWxpbmUtbnVtYmVyXCIpO1xuICAgICAgICBhcmdzLnB1c2goXCItLWhlYWRpbmdcIik7XG4gICAgICAgIGFyZ3MucHVzaChcIi0tY29sb3JcIiwgXCJuZXZlclwiKTtcblxuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItaVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlVHlwZSkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi0tdHlwZVwiLCBmaWxlVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2xvYikge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi0tZ2xvYlwiLCBnbG9iKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0TGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi1DXCIsIFN0cmluZyhjb250ZXh0TGluZXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXhDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1tYXgtY291bnRcIiwgU3RyaW5nKG1heENvdW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNXaXRoTWF0Y2hlcykge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi0tZmlsZXMtd2l0aC1tYXRjaGVzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncy5wdXNoKFwiLS1cIiwgcGF0dGVybiwgc2VhcmNoUGF0aCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LmV4ZWMoeyBjb21tYW5kOiBcInJnXCIsIGFyZ3MgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIltHcmVwIFRvb2xdXCIsIHJlc3VsdCk7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcblxuICAgICAgICBpZiAoc3RkZXJyICYmICFzdGRlcnIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcIm5vIG1hdGNoZXNcIikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbR3JlcCBUb29sXSBXYXJuaW5nOiAke3N0ZGVycn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRydW5jYXRlIG91dHB1dCB0byBwcmV2ZW50IFwiaW5wdXQgdG9vIGxvbmdcIiBlcnJvcnMgKDUwayBjaGFycyBcdTIyNDggMTIuNWsgdG9rZW5zKVxuICAgICAgICBjb25zdCBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMgPSA1MF8wMDA7XG4gICAgICAgIGxldCBmaW5hbE91dHB1dCA9IHN0ZG91dDtcbiAgICAgICAgbGV0IHdhc1RydW5jYXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZmluYWxPdXRwdXQubGVuZ3RoID4gTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSB7XG4gICAgICAgICAgZmluYWxPdXRwdXQgPVxuICAgICAgICAgICAgZmluYWxPdXRwdXQuc2xpY2UoMCwgTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSArXG4gICAgICAgICAgICBcIlxcblxcbltPdXRwdXQgdHJ1bmNhdGVkIC0gdXNlIG1vcmUgc3BlY2lmaWMgcGF0dGVybiBvciBwYXRoXVwiO1xuICAgICAgICAgIHdhc1RydW5jYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lcyA9IGZpbmFsT3V0cHV0XG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgIC5maWx0ZXIoKGwpID0+IGwubGVuZ3RoID4gMCk7XG4gICAgICAgIGNvbnN0IGZpbGVDb3VudCA9IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICA/IGxpbmVzLmxlbmd0aFxuICAgICAgICAgIDogbmV3IFNldChcbiAgICAgICAgICAgICAgbGluZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChsKSA9PiAhbC5zdGFydHNXaXRoKFwiIFwiKSAmJiBsLmluY2x1ZGVzKFwiOlwiKSlcbiAgICAgICAgICAgICAgICAubWFwKChsKSA9PiBsLnNwbGl0KFwiOlwiKVswXSlcbiAgICAgICAgICAgICkuc2l6ZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIG1hdGNoQ291bnQ6IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogbGluZXMuZmlsdGVyKChsKSA9PiBsLmluY2x1ZGVzKFwiOlwiKSkubGVuZ3RoLFxuICAgICAgICAgICAgZmlsZUNvdW50LFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIHBhdHRlcm4sXG4gICAgICAgICAgICB3YXNUcnVuY2F0ZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXRjaGVzOiBmaW5hbE91dHB1dCB8fCBcIihubyBtYXRjaGVzIGZvdW5kKVwiLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5MaXN0XTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuTGlzdCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIGRlcHRoLCBpbmNsdWRlSGlkZGVuLCBmaWxlc09ubHksIHBhdHRlcm4gfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250ZXh0LnNhbmRib3guZXhlYyh7XG4gICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgYFxuICAgICAgICAgICAgc2V0IC1lXG4gICAgICAgICAgICBTRUFSQ0hfUEFUSD1cIiQxXCJcbiAgICAgICAgICAgIERFUFRIPVwiJDJcIlxuICAgICAgICAgICAgSU5DTFVERV9ISURERU49XCIkM1wiXG4gICAgICAgICAgICBGSUxFU19PTkxZPVwiJDRcIlxuICAgICAgICAgICAgUEFUVEVSTj1cIiQ1XCJcblxuICAgICAgICAgICAgIyBCdWlsZCBmaW5kIGNvbW1hbmQgYXJndW1lbnRzXG4gICAgICAgICAgICBGSU5EX0FSR1M9XCJcIlxuICAgICAgICAgICAgWyAtbiBcIiRERVBUSFwiIF0gJiYgRklORF9BUkdTPVwiJEZJTkRfQVJHUyAtbWF4ZGVwdGggJERFUFRIXCJcbiAgICAgICAgICAgIFsgXCIkSU5DTFVERV9ISURERU5cIiAhPSBcInRydWVcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgISAtcGF0aCAnKi8uKidcIlxuICAgICAgICAgICAgWyBcIiRGSUxFU19PTkxZXCIgPSBcInRydWVcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLXR5cGUgZlwiXG4gICAgICAgICAgICBbIC1uIFwiJFBBVFRFUk5cIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLW5hbWUgJyRQQVRURVJOJ1wiXG5cbiAgICAgICAgICAgICMgR2V0IGxpc3RpbmdcbiAgICAgICAgICAgIExJU1RJTkc9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkRklORF9BUkdTXCIgMj4vZGV2L251bGwgfCBzb3J0KVxuXG4gICAgICAgICAgICAjIEdldCBjb3VudHNcbiAgICAgICAgICAgIENPVU5UX0FSR1M9XCJcIlxuICAgICAgICAgICAgWyAtbiBcIiRERVBUSFwiIF0gJiYgQ09VTlRfQVJHUz1cIiRDT1VOVF9BUkdTIC1tYXhkZXB0aCAkREVQVEhcIlxuICAgICAgICAgICAgWyBcIiRJTkNMVURFX0hJRERFTlwiICE9IFwidHJ1ZVwiIF0gJiYgQ09VTlRfQVJHUz1cIiRDT1VOVF9BUkdTICEgLXBhdGggJyovLionXCJcblxuICAgICAgICAgICAgRklMRV9DT1VOVD0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRDT1VOVF9BUkdTIC10eXBlIGZcIiAyPi9kZXYvbnVsbCB8IHdjIC1sKVxuICAgICAgICAgICAgRElSX0NPVU5UPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJENPVU5UX0FSR1MgLXR5cGUgZFwiIDI+L2Rldi9udWxsIHwgd2MgLWwpXG5cbiAgICAgICAgICAgICMgT3V0cHV0OiBjb3VudHMgZmlyc3QsIHRoZW4gbGlzdGluZ1xuICAgICAgICAgICAgZWNobyBcIiRGSUxFX0NPVU5UfCRESVJfQ09VTlRcIlxuICAgICAgICAgICAgZWNobyBcInx8fExJU1RJTkd8fHxcIlxuICAgICAgICAgICAgZWNobyBcIiRMSVNUSU5HXCIgfCBzZWQgXCJzfF4kU0VBUkNIX1BBVEh8LnxcIlxuICAgICAgICAgIGAsXG4gICAgICAgICAgICBcIi0tXCIsXG4gICAgICAgICAgICBzZWFyY2hQYXRoLFxuICAgICAgICAgICAgZGVwdGg/LnRvU3RyaW5nKCkgfHwgXCJcIixcbiAgICAgICAgICAgIGluY2x1ZGVIaWRkZW4gPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIGZpbGVzT25seSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiLFxuICAgICAgICAgICAgcGF0dGVybiB8fCBcIlwiLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbTGlzdCBUb29sXVwiLCByZXN1bHQpO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW0xpc3QgVG9vbF0gc3RkZXJyOiAke3N0ZGVycn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtjb3VudHNMaW5lLCAuLi5yZXN0XSA9IHN0ZG91dC5zcGxpdChcInx8fExJU1RJTkd8fHxcIik7XG4gICAgICAgIGNvbnN0IGxpc3RpbmcgPSByZXN0LmpvaW4oXCJ8fHxMSVNUSU5HfHx8XCIpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgW2ZpbGVDb3VudFN0ciwgZGlyQ291bnRTdHJdID0gY291bnRzTGluZS50cmltKCkuc3BsaXQoXCJ8XCIpO1xuXG4gICAgICAgIGNvbnN0IHRvdGFsRmlsZXMgPSBOdW1iZXIucGFyc2VJbnQoZmlsZUNvdW50U3RyLCAxMCkgfHwgMDtcbiAgICAgICAgY29uc3QgdG90YWxEaXJzID0gTnVtYmVyLnBhcnNlSW50KGRpckNvdW50U3RyLCAxMCkgfHwgMDtcbiAgICAgICAgY29uc3QgbGluZXMgPSBsaXN0aW5nLnNwbGl0KFwiXFxuXCIpLmZpbHRlcigobCkgPT4gbC5sZW5ndGggPiAwKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIHRvdGFsSXRlbXM6IGxpbmVzLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsRmlsZXMsXG4gICAgICAgICAgICB0b3RhbERpcnMsXG4gICAgICAgICAgICBzZWFyY2hQYXRoLFxuICAgICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsaXN0aW5nLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5Xcml0ZV06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLldyaXRlLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgY29udGVudCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGguc2xpY2UoMSkgOiBwYXRoO1xuICAgICAgICBjb25zdCBkaXIgPSBmaWxlUGF0aC5pbmNsdWRlcyhcIi9cIilcbiAgICAgICAgICA/IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIilcbiAgICAgICAgICA6IFwiLlwiO1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKSB8fCBmaWxlUGF0aDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChkaXIgIT09IFwiLlwiKSB7XG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LnNhbmRib3guZXhlYyh7IGNvbW1hbmQ6IFwibWtkaXJcIiwgYXJnczogW1wiLXBcIiwgZGlyXSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCBjb250ZXh0LnNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgICAgICAgICBmaWxlczogW3sgcGF0aDogZmlsZU5hbWUsIGNvbnRlbnQgfV0sXG4gICAgICAgICAgICBkZXN0UGF0aDogZGlyLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGJ5dGVzV3JpdHRlbjogQnVmZmVyLmJ5dGVMZW5ndGgoY29udGVudCwgXCJ1dGY4XCIpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgYnl0ZXNXcml0dGVuOiAwLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yTXNnLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuRWRpdF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkVkaXQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBvbGRfc3RyaW5nLCBuZXdfc3RyaW5nIH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aC5zbGljZSgxKSA6IHBhdGg7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LmV4ZWMoe1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHNldCAtZVxuICAgICAgICAgICAgRklMRT1cIiQxXCJcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgWyAhIC1mIFwiJEZJTEVcIiBdOyB0aGVuXG4gICAgICAgICAgICAgIGVjaG8gXCJGSUxFX05PVF9GT1VORFwiXG4gICAgICAgICAgICAgIGV4aXQgMFxuICAgICAgICAgICAgZmlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQ09OVEVOVD0kKGNhdCBcIiRGSUxFXCIpXG4gICAgICAgICAgICBlY2hvIFwiJENPTlRFTlRcIlxuICAgICAgICAgIGAsXG4gICAgICAgICAgICBcIi0tXCIsXG4gICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcGF0aDogZmlsZVBhdGgsIGVycm9yOiByZXN1bHQubWVzc2FnZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcblxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHBhdGg6IGZpbGVQYXRoLCBlcnJvcjogc3RkZXJyIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3Rkb3V0ID09PSBcIkZJTEVfTk9UX0ZPVU5EXCIpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHN0ZG91dDtcbiAgICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250ZW50LnNwbGl0KG9sZF9zdHJpbmcpLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgaWYgKG9jY3VycmVuY2VzID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBlcnJvcjogXCJvbGRfc3RyaW5nIG5vdCBmb3VuZCBpbiBmaWxlXCIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvY2N1cnJlbmNlcyA+IDEpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBgb2xkX3N0cmluZyBhcHBlYXJzICR7b2NjdXJyZW5jZXN9IHRpbWVzIGluIGZpbGUgKG11c3QgYmUgdW5pcXVlKS4gSW5jbHVkZSBtb3JlIHN1cnJvdW5kaW5nIGNvbnRleHQgdG8gbWFrZSB0aGUgbWF0Y2ggdW5pcXVlLmAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob2xkX3N0cmluZywgbmV3X3N0cmluZyk7XG4gICAgICAgIGNvbnN0IGRpciA9IGZpbGVQYXRoLmluY2x1ZGVzKFwiL1wiKVxuICAgICAgICAgID8gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKVxuICAgICAgICAgIDogXCIuXCI7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnBvcCgpIHx8IGZpbGVQYXRoO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY29udGV4dC5zYW5kYm94LndyaXRlRmlsZXMoe1xuICAgICAgICAgICAgZmlsZXM6IFt7IHBhdGg6IGZpbGVOYW1lLCBjb250ZW50OiBuZXdDb250ZW50IH1dLFxuICAgICAgICAgICAgZGVzdFBhdGg6IGRpcixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHBhdGg6IGZpbGVQYXRoIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBwYXRoOiBmaWxlUGF0aCwgZXJyb3I6IGVycm9yTXNnIH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuQmFzaF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkJhc2gsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBjb21tYW5kLCB3YWl0VW50aWwgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNyZWF0ZVByb2Nlc3NNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgXCIuLi9zYW5kYm94L3Byb2Nlc3MtbWFuYWdlclwiXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc01hbmFnZXIgPSBjcmVhdGVQcm9jZXNzTWFuYWdlcih7XG4gICAgICAgICAgc2FuZGJveDogY29udGV4dC5zYW5kYm94LFxuICAgICAgICAgIHNlc3Npb25JZDogY29udGV4dC5pbnB1dC5zZXNzaW9uSWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHByb2Nlc3NNYW5hZ2VyLmluaXQoKTtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NNYW5hZ2VyLnJ1bih7IGNvbW1hbmQsIHdhaXRVbnRpbCB9KTtcbiAgICAgIH0sXG4gICAgfSksXG4gIH07XG5cbiAgaWYgKGNvbnRleHQuYXBpVG9vbHNNZXRhZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgYXBpVG9vbHMgPSBidWlsZEFwaVRvb2xzKHtcbiAgICAgIHJwYzogY29udGV4dC5pbnB1dC5ycGMsXG4gICAgICBtZXRhZGF0YTogY29udGV4dC5hcGlUb29sc01ldGFkYXRhLFxuICAgICAgc2Vzc2lvbjogY29udGV4dC5zZXNzaW9uLFxuICAgICAgc2FuZGJveFJlY29yZDogY29udGV4dC5zYW5kYm94UmVjb3JkLFxuICAgICAgY29udGV4dDogY29udGV4dC5ldmVudC5jb250ZXh0LFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24odG9vbHMsIGFwaVRvb2xzKTtcbiAgfVxuXG4gIHRvb2xzW2J1aWx0aW5Ub29sTmFtZXMuSmF2YVNjcmlwdF0gPSBjcmVhdGVKYXZhU2NyaXB0VG9vbCh7XG4gICAgdG9vbHMsXG4gICAgc2Vzc2lvbjogY29udGV4dC5zZXNzaW9uLFxuICAgIHNhbmRib3g6IGNvbnRleHQuc2FuZGJveCxcbiAgICBvblN1YlRvb2xDYWxsOiBjb250ZXh0Lm9uU3ViVG9vbENhbGwsXG4gIH0pO1xuXG4gIHJldHVybiB0b29scztcbn1cblxudHlwZSBBcGlUb29sTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlucHV0U2NoZW1hPzogdW5rbm93bjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEFwaVRvb2xzTWV0YWRhdGEob3B0czoge1xuICBycGM6IChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0Pjtcbn0pOiBQcm9taXNlPEFwaVRvb2xNZXRhZGF0YVtdPiB7XG4gIGNvbnN0IHsgcnBjIH0gPSBvcHRzO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyh7IG1ldGhvZDogXCJ0b29scy5saXN0XCIsIHBhcmFtczoge30gfSk7XG5cbiAgaWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW2FnZW50XSBGYWlsZWQgdG8gZmV0Y2ggdG9vbHM6XCIsIHJlc3VsdC5lcnJvcj8ubWVzc2FnZSk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIChyZXN1bHQucmVzdWx0IGFzIEFwaVRvb2xNZXRhZGF0YVtdKSA/PyBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXBpVG9vbHMob3B0czoge1xuICBycGM6IChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0PjtcbiAgbWV0YWRhdGE6IEFwaVRvb2xNZXRhZGF0YVtdO1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkO1xuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn0pOiBUb29sU2V0IHtcbiAgY29uc3QgeyBycGMsIG1ldGFkYXRhLCBzZXNzaW9uLCBzYW5kYm94UmVjb3JkLCBjb250ZXh0IH0gPSBvcHRzO1xuICBjb25zdCB0b29sczogVG9vbFNldCA9IHt9O1xuXG4gIGZvciAoY29uc3QgbWV0YSBvZiBtZXRhZGF0YSkge1xuICAgIHRvb2xzW21ldGEubmFtZV0gPSB0b29sKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhLmRlc2NyaXB0aW9uID8/IGBDdXN0b20gdG9vbDogJHttZXRhLm5hbWV9YCxcbiAgICAgIGlucHV0U2NoZW1hOiBtZXRhLmlucHV0U2NoZW1hXG4gICAgICAgID8ganNvblNjaGVtYShtZXRhLmlucHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGpzb25TY2hlbWE+WzBdKVxuICAgICAgICA6IHoub2JqZWN0KHt9KSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoe1xuICAgICAgICAgIG1ldGhvZDogXCJ0b29scy5leGVjdXRlXCIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBuYW1lOiBtZXRhLm5hbWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgICBzYW5kYm94UmVjb3JkLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoXCJlcnJvclwiIGluIHJlc3VsdCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVG9vbCBleGVjdXRpb24gZmFpbGVkOiAke3Jlc3VsdC5lcnJvcj8ubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0b29scztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBcGlVcmwob3B0czogeyBhcGk6IHN0cmluZyB8IHVuZGVmaW5lZCB9KTogc3RyaW5nIHtcbiAgbGV0IG9yaWdpbiA9IFwiXCI7XG4gIGxldCBwYXRoID0gYC8ud2VsbC1rbm93bi9hZ2VudC8ke0FHRU5UX1BST1RPQ09MX1ZFUlNJT059YDtcblxuICBpZiAob3B0cy5hcGkpIHtcbiAgICBpZiAob3B0cy5hcGkuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIHBhdGggPSBvcHRzLmFwaTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2VlIGlmIGl0J3MgZnVsbFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRzLmFwaSk7XG4gICAgICAgIG9yaWdpbiA9IHVybC5vcmlnaW47XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaCArIHVybC5oYXNoO1xuICAgICAgICBpZiAoZnVsbFBhdGguc3RhcnRzV2l0aChcIi9cIikgJiYgZnVsbFBhdGggIT09IFwiL1wiKSB7XG4gICAgICAgICAgcGF0aCA9IGZ1bGxQYXRoO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghb3JpZ2luKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIG9yaWdpbiA9IGBodHRwOi8vbG9jYWxob3N0OiR7XG4gICAgICAgIHByb2Nlc3MuZW52LlBPUlQgPz8gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfUE9SVCA/PyAzMDAwXG4gICAgICB9YDtcbiAgICB9XG4gICAgY29uc3QgdmVyY2VsVXJsID1cbiAgICAgIHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgPz8gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfVkVSQ0VMX1VSTDtcbiAgICBpZiAodmVyY2VsVXJsKSB7XG4gICAgICBvcmlnaW4gPSBgaHR0cHM6Ly8ke3ZlcmNlbFVybH1gO1xuICAgIH1cbiAgfVxuXG4gIGlmICghb3JpZ2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJbYWdlbnRdIENvdWxkbid0IGRldGVybWluZSBBUEkgb3JpZ2luIChubyBvcmlnaW4gZGV0ZWN0ZWQgaW4gYGFwaWAgb3B0aW9uIGFuZCBubyBWRVJDRUxfVVJMIHNldClcIlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gYCR7b3JpZ2lufSR7cGF0aH1gO1xufVxuIiwgImltcG9ydCB7IHR5cGUgVG9vbFNldCwgdG9vbCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuLi9zYW5kYm94XCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb24gfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgYnVpbHRJblRvb2xzIH0gZnJvbSBcIi5cIjtcblxuZXhwb3J0IGNvbnN0IEpBVkFTQ1JJUFRfVE9PTF9OQU1FID0gXCJKYXZhU2NyaXB0XCI7XG5cbmV4cG9ydCB0eXBlIFN1YlRvb2xDYWxsUmVzdWx0ID0geyByZXN1bHQ/OiB1bmtub3duOyBlcnJvcj86IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgT25TdWJUb29sQ2FsbCA9IChcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgaW5wdXQ6IHVua25vd24sXG4gIGV4ZWN1dGU6ICgpID0+IFByb21pc2U8dW5rbm93bj5cbikgPT4gUHJvbWlzZTxTdWJUb29sQ2FsbFJlc3VsdD47XG5cbmNvbnN0IFJFUVVFU1RfTUFSS0VSX1NUQVJUID0gXCJfX1RPT0xfUkVRVUVTVF9fXCI7XG5jb25zdCBSRVFVRVNUX01BUktFUl9FTkQgPSBcIl9fVE9PTF9SRVFVRVNUX0VORF9fXCI7XG5jb25zdCBFWEVDVVRJT05fVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogVGhlIHJ1bm5lciBzY3JpcHQgaXMgd3JpdHRlbiB0byB0aGUgc2FuZGJveCBhbmQgZXhlY3V0ZWQgdmlhIE5vZGUuanMuXG4gKiBJdCByZWFkcyB0aGUgbW9kZWwncyBjb2RlIGZyb20gY29kZS5qcywgc2V0cyB1cCBjdHgudG9vbHMgYXMgUlBDIHByb3hpZXNcbiAqIChyZXF1ZXN0cyBzZW50IHZpYSBzdGRlcnIgbWFya2VycywgcmVzcG9uc2VzIHBvbGxlZCBmcm9tIGZpbGVzKSwgZXhlY3V0ZXNcbiAqIHRoZSBjb2RlLCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8gc3Rkb3V0IGFzIEpTT04uXG4gKi9cbmNvbnN0IFJVTk5FUl9TQ1JJUFQgPSBgXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMsIHVubGlua1N5bmMsIG1rZGlyU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5jb25zdCBTQ1JJUFRfRElSID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuY29uc3QgVE9PTF9DQUxMX1RJTUVPVVRfTVMgPSAzMDBfMDAwO1xuXG5sZXQgcmVxQ291bnRlciA9IDA7XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxUb29sKG5hbWUsIGlucHV0KSB7XG4gIGNvbnN0IGlkID0gJ3JlcV8nICsgKCsrcmVxQ291bnRlcikgKyAnXycgKyBEYXRlLm5vdygpO1xuICBjb25zdCByZXNwb25zZUZpbGUgPSBqb2luKFNDUklQVF9ESVIsIGlkICsgJy5yZXNwb25zZS5qc29uJyk7XG5cbiAgY29uc3QgcmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHsgaWQsIHRvb2w6IG5hbWUsIGlucHV0IH0pO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnJHtSRVFVRVNUX01BUktFUl9TVEFSVH0nICsgcmVxdWVzdCArICcke1JFUVVFU1RfTUFSS0VSX0VORH0nICsgJ1xcXFxuJyk7XG5cbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICB3aGlsZSAoIWV4aXN0c1N5bmMocmVzcG9uc2VGaWxlKSkge1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiBUT09MX0NBTExfVElNRU9VVF9NUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb29sIGNhbGwgJyArIG5hbWUgKyAnIHRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNwb25zZScpO1xuICAgIH1cbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMzApKTtcbiAgfVxuXG4gIGxldCByYXc7XG4gIHRyeSB7XG4gICAgcmF3ID0gcmVhZEZpbGVTeW5jKHJlc3BvbnNlRmlsZSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XG4gICAgcmF3ID0gcmVhZEZpbGVTeW5jKHJlc3BvbnNlRmlsZSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyYXcpO1xuICB0cnkgeyB1bmxpbmtTeW5jKHJlc3BvbnNlRmlsZSk7IH0gY2F0Y2gge31cblxuICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3IpO1xuICB9XG4gIHJldHVybiByZXNwb25zZS5yZXN1bHQ7XG59XG5cbmNvbnN0IGNvZGUgPSByZWFkRmlsZVN5bmMoam9pbihTQ1JJUFRfRElSLCAnY29kZS5qcycpLCAndXRmOCcpO1xuY29uc3QgdG9vbE5hbWVzID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoam9pbihTQ1JJUFRfRElSLCAndG9vbHMuanNvbicpLCAndXRmOCcpKTtcblxuY29uc3QgY3R4ID0geyB0b29sczoge30gfTtcbmZvciAoY29uc3QgbmFtZSBvZiB0b29sTmFtZXMpIHtcbiAgY3R4LnRvb2xzW25hbWVdID0gKGlucHV0KSA9PiBjYWxsVG9vbChuYW1lLCBpbnB1dCk7XG59XG5cbmNvbnN0IGxvZ3MgPSBbXTtcbmNvbnN0IGN1c3RvbUNvbnNvbGUgPSB7XG4gIGxvZzogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaChhcmdzLm1hcChhID0+IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBKU09OLnN0cmluZ2lmeShhKSkuam9pbignICcpKSxcbiAgZXJyb3I6ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goJ1tlcnJvcl0gJyArIGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxuICB3YXJuOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKCdbd2Fybl0gJyArIGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxufTtcblxudHJ5IHtcbiAgY29uc3QgQXN5bmNGdW5jdGlvbiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihhc3luYyBmdW5jdGlvbigpIHt9KS5jb25zdHJ1Y3RvcjtcbiAgY29uc3QgZm4gPSBuZXcgQXN5bmNGdW5jdGlvbignY3R4JywgJ2NvbnNvbGUnLCBjb2RlKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oY3R4LCBjdXN0b21Db25zb2xlKTtcblxuICBjb25zdCBvdXRwdXQgPSB7IHN1Y2Nlc3M6IHRydWUsIHJlc3VsdDogcmVzdWx0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQgOiBudWxsIH07XG4gIGlmIChsb2dzLmxlbmd0aCA+IDApIG91dHB1dC5sb2dzID0gbG9ncztcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkob3V0cHV0KSk7XG59IGNhdGNoIChlcnIpIHtcbiAgY29uc3Qgb3V0cHV0ID0ge1xuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlICsgJ1xcXFxuJyArIGVyci5zdGFjayA6IFN0cmluZyhlcnIpLFxuICB9O1xuICBpZiAobG9ncy5sZW5ndGggPiAwKSBvdXRwdXQubG9ncyA9IGxvZ3M7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KG91dHB1dCkpO1xufVxuYDtcblxuLyoqXG4gKiBFeHRyYWN0cyBhIHBsYWluIEpTT04gU2NoZW1hIGZyb20gd2hhdGV2ZXIgZm9ybWF0IHRoZSBBSSBTREsgdG9vbCB1c2VzXG4gKiAoWm9kIHNjaGVtYSwgQUkgU0RLIHdyYXBwZWQgc2NoZW1hLCBvciByYXcgSlNPTiBTY2hlbWEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEpzb25TY2hlbWEoXG4gIHNjaGVtYTogdW5rbm93blxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgaWYgKCFzY2hlbWEgfHwgdHlwZW9mIHNjaGVtYSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKFxuICAgIFwiX2RlZlwiIGluIHNjaGVtYSAmJlxuICAgIHR5cGVvZiAoc2NoZW1hIGFzIHsgX2RlZjogdW5rbm93biB9KS5fZGVmID09PSBcIm9iamVjdFwiXG4gICkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gei50b0pTT05TY2hlbWEoc2NoZW1hIGFzIHouWm9kVHlwZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzID0gc2NoZW1hIGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuICBpZiAoU3ltYm9sLmZvcihcInZlcmNlbC5haS5zY2hlbWFcIikgaW4gcyAmJiBcImpzb25TY2hlbWFcIiBpbiBzKSB7XG4gICAgcmV0dXJuIHMuanNvblNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBzIHx8IFwicHJvcGVydGllc1wiIGluIHMpIHtcbiAgICByZXR1cm4gcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvblNjaGVtYVRvVHMoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGluZGVudCA9IDBcbik6IHN0cmluZyB7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5lbnVtICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5lbnVtLm1hcCgodikgPT4gSlNPTi5zdHJpbmdpZnkodikpLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAoc2NoZW1hLmFueU9mICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgIHJldHVybiBzY2hlbWEuYW55T2ZcbiAgICAgIC5tYXAoKHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBqc29uU2NoZW1hVG9UcyhzLCBpbmRlbnQpKVxuICAgICAgLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgaWYgKHNjaGVtYS5vbmVPZiAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5vbmVPZikpIHtcbiAgICByZXR1cm4gc2NoZW1hLm9uZU9mXG4gICAgICAubWFwKChzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ganNvblNjaGVtYVRvVHMocywgaW5kZW50KSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IHNjaGVtYS50eXBlIGFzIHN0cmluZztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIFwiYXJyYXlcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBzY2hlbWEuaXRlbXNcbiAgICAgICAgPyBqc29uU2NoZW1hVG9UcyhzY2hlbWEuaXRlbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGluZGVudClcbiAgICAgICAgOiBcInVua25vd25cIjtcbiAgICAgIHJldHVybiBgQXJyYXk8JHtpdGVtc30+YDtcbiAgICB9XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hLnByb3BlcnRpZXMgYXNcbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgdW5rbm93bj5cIjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gbmV3IFNldCgoc2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gICAgICBjb25zdCBwYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuICAgICAgY29uc3QgY2xvc2VQYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wiO1xuICAgICAgICByZXR1cm4gYCR7cGFkfSR7a2V5fSR7b3B0fTogJHtqc29uU2NoZW1hVG9Ucyh2YWx1ZSwgaW5kZW50ICsgMSl9YDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGB7XFxuJHtwcm9wcy5qb2luKFwiO1xcblwiKX07XFxuJHtjbG9zZVBhZH19YDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDb250ZXh0VHlwZVN0cmluZyh0b29sczogVG9vbFNldCk6IHN0cmluZyB7XG4gIGNvbnN0IHNpZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdF0gb2YgT2JqZWN0LmVudHJpZXModG9vbHMpKSB7XG4gICAgY29uc3QgcmF3ID0gdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBpbnB1dFNjaGVtYSA9IGV4dHJhY3RKc29uU2NoZW1hKHJhdy5pbnB1dFNjaGVtYSA/PyByYXcucGFyYW1ldGVycyk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gZXh0cmFjdEpzb25TY2hlbWEocmF3Lm91dHB1dFNjaGVtYSk7XG5cbiAgICBjb25zdCBpbnB1dFR5cGUgPSBpbnB1dFNjaGVtYSA/IGpzb25TY2hlbWFUb1RzKGlucHV0U2NoZW1hLCAyKSA6IFwie31cIjtcbiAgICBjb25zdCBvdXRwdXRUeXBlID0gb3V0cHV0U2NoZW1hXG4gICAgICA/IGpzb25TY2hlbWFUb1RzKG91dHB1dFNjaGVtYSwgMilcbiAgICAgIDogXCJ1bmtub3duXCI7XG5cbiAgICBzaWdzLnB1c2goYCAgICAke25hbWV9KGlucHV0OiAke2lucHV0VHlwZX0pOiBQcm9taXNlPCR7b3V0cHV0VHlwZX0+YCk7XG4gIH1cblxuICByZXR1cm4gYHR5cGUgQ29udGV4dCA9IHtcXG4gIHRvb2xzOiB7XFxuJHtzaWdzLmpvaW4oXCI7XFxuXCIpfTtcXG4gIH1cXG59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUluU2FuZGJveCh7XG4gIGNvZGUsXG4gIHJwY0RpcixcbiAgYWJvcnRDb250cm9sbGVyLFxuICBzYW5kYm94LFxuICBhdmFpbGFibGVUb29scyxcbiAgb25TdWJUb29sQ2FsbCxcbn06IHtcbiAgY29kZTogc3RyaW5nO1xuICBycGNEaXI6IHN0cmluZztcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn0pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IG1rZGlyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm1rZGlyXCIsXG4gICAgYXJnczogW1wiLXBcIiwgcnBjRGlyXSxcbiAgfSk7XG4gIGlmIChta2RpclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBta2RpclJlc3VsdC5tZXNzYWdlIH07XG4gIH1cbiAgYXdhaXQgbWtkaXJSZXN1bHQucmVzdWx0O1xuXG4gIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgZmlsZXM6IFtcbiAgICAgIHsgcGF0aDogXCJydW5uZXIubWpzXCIsIGNvbnRlbnQ6IFJVTk5FUl9TQ1JJUFQgfSxcbiAgICAgIHsgcGF0aDogXCJjb2RlLmpzXCIsIGNvbnRlbnQ6IGNvZGUgfSxcbiAgICAgIHtcbiAgICAgICAgcGF0aDogXCJ0b29scy5qc29uXCIsXG4gICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGF2YWlsYWJsZVRvb2xzKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgfSk7XG5cbiAgY29uc3Qgbm9kZU1ham9yID0gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdChcIi5cIilbMF0sIDEwKTtcbiAgY29uc3QgcGVybWlzc2lvbkZsYWcgPVxuICAgIG5vZGVNYWpvciA+PSAyMiA/IFwiLS1wZXJtaXNzaW9uXCIgOiBcIi0tZXhwZXJpbWVudGFsLXBlcm1pc3Npb25cIjtcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm5vZGVcIixcbiAgICBhcmdzOiBbXG4gICAgICBwZXJtaXNzaW9uRmxhZyxcbiAgICAgIGAtLWFsbG93LWZzLXJlYWQ9JHtycGNEaXJ9YCxcbiAgICAgIGAtLWFsbG93LWZzLXdyaXRlPSR7cnBjRGlyfWAsXG4gICAgICBgJHtycGNEaXJ9L3J1bm5lci5tanNgLFxuICAgIF0sXG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICB9KTtcblxuICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBleGVjUmVzdWx0Lm1lc3NhZ2UgfTtcbiAgfVxuXG4gIGNvbnN0IGZhdGFsOiB7IGVycm9yOiBFcnJvciB8IG51bGwgfSA9IHsgZXJyb3I6IG51bGwgfTtcblxuICBjb25zdCBhYm9ydCA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBpZiAoIWZhdGFsLmVycm9yKSB7XG4gICAgICBmYXRhbC5lcnJvciA9IGVycm9yO1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVRvb2xSZXF1ZXN0ID0gYXN5bmMgKHJlcXVlc3RKc29uOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgcGFyc2VkOiB7IGlkOiBzdHJpbmc7IHRvb2w6IHN0cmluZzsgaW5wdXQ6IHVua25vd24gfTtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXF1ZXN0SnNvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBpZCwgdG9vbDogdG9vbE5hbWUsIGlucHV0IH0gPSBwYXJzZWQ7XG5cbiAgICBsZXQgcmVzcG9uc2U6IHsgcmVzdWx0PzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdCA9IGF2YWlsYWJsZVRvb2xzW3Rvb2xOYW1lXTtcbiAgICAgIGlmICghdD8uZXhlY3V0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRvb2wgJHt0b29sTmFtZX0gbm90IGZvdW5kIG9yIGhhcyBubyBleGVjdXRlIGZ1bmN0aW9uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhlYyA9IHQuZXhlY3V0ZS5iaW5kKHQpO1xuICAgICAgaWYgKG9uU3ViVG9vbENhbGwpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBvblN1YlRvb2xDYWxsKHRvb2xOYW1lLCBpbnB1dCwgKCkgPT5cbiAgICAgICAgICBleGVjKGlucHV0LCB7XG4gICAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoaW5wdXQsIHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzcG9uc2UgPSB7IHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgcmVzcG9uc2UgPSB7IGVycm9yOiBtc2cgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgZmlsZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBgJHtpZH0ucmVzcG9uc2UuanNvbmAsXG4gICAgICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShyZXNwb25zZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiB3cml0aW5nIHRoZSByZXNwb25zZSBmaWxlIGZhaWxzLCB0aGUgcnVubmVyIHdpbGwgcG9sbCBmb3JldmVyXG4gICAgICAgKiB3YWl0aW5nIGZvciBpdC4gQWJvcnQgdGhlIHJ1bm5lciBwcm9jZXNzIHNvIHdlIGRvbid0IGRlYWRsb2NrLlxuICAgICAgICovXG4gICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBhYm9ydChuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSBSUEMgcmVzcG9uc2UgZm9yICR7dG9vbE5hbWV9OiAke21zZ31gKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHRvb2xDYWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBsZXQgc3RkZXJyQnVmZmVyID0gXCJcIjtcbiAgbGV0IG5vbk1hcmtlclN0ZGVyciA9IFwiXCI7XG5cbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGFib3J0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgSmF2YVNjcmlwdCBleGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7RVhFQ1VUSU9OX1RJTUVPVVRfTVMgLyAxMDAwfXNgXG4gICAgICApXG4gICAgKTtcbiAgfSwgRVhFQ1VUSU9OX1RJTUVPVVRfTVMpO1xuXG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBleGVjUmVzdWx0LmxvZ3MoKSkge1xuICAgICAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkuc3RyZWFtID09PSBcInN0ZGVyclwiKSB7XG4gICAgICAgIHN0ZGVyckJ1ZmZlciArPSBlbnRyeS5kYXRhO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9TVEFSVCk7XG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlTWFya2VyID0gc3RkZXJyQnVmZmVyLnNsaWNlKDAsIHN0YXJ0SWR4KTtcbiAgICAgICAgICBpZiAoYmVmb3JlTWFya2VyLnRyaW0oKSkge1xuICAgICAgICAgICAgbm9uTWFya2VyU3RkZXJyICs9IGJlZm9yZU1hcmtlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50U3RhcnQgPSBzdGFydElkeCArIFJFUVVFU1RfTUFSS0VSX1NUQVJULmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9FTkQsIGNvbnRlbnRTdGFydCk7XG4gICAgICAgICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RKc29uID0gc3RkZXJyQnVmZmVyLnNsaWNlKGNvbnRlbnRTdGFydCwgZW5kSWR4KTtcbiAgICAgICAgICBzdGRlcnJCdWZmZXIgPSBzdGRlcnJCdWZmZXIuc2xpY2UoZW5kSWR4ICsgUkVRVUVTVF9NQVJLRVJfRU5ELmxlbmd0aCk7XG5cbiAgICAgICAgICB0b29sQ2FsbFByb21pc2VzLnB1c2goaGFuZGxlVG9vbFJlcXVlc3QocmVxdWVzdEpzb24pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cblxuICBpZiAoc3RkZXJyQnVmZmVyLnRyaW0oKSkge1xuICAgIG5vbk1hcmtlclN0ZGVyciArPSBzdGRlcnJCdWZmZXI7XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodG9vbENhbGxQcm9taXNlcyk7XG5cbiAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgZXhlY1Jlc3VsdC5yZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogZmF0YWwuZXJyb3IubWVzc2FnZSxcbiAgICAgIC4uLihub25NYXJrZXJTdGRlcnIgPyB7IHN0ZGVycjogbm9uTWFya2VyU3RkZXJyLnNsaWNlKDAsIDIwMDApIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBgUnVubmVyIGZhaWxlZCAoZXhpdCAke2V4aXRDb2RlfSkuYCxcbiAgICAgIHN0ZGVycjogKG5vbk1hcmtlclN0ZGVyciArIHN0ZGVycikuc2xpY2UoMCwgMjAwMCksXG4gICAgICBzdGRvdXQ6IHN0ZG91dC5zbGljZSgwLCAxMDAwKSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKYXZhU2NyaXB0VG9vbChvcHRzOiB7XG4gIHRvb2xzOiBUb29sU2V0O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn0pIHtcbiAgY29uc3QgeyBzZXNzaW9uLCBzYW5kYm94LCBvblN1YlRvb2xDYWxsIH0gPSBvcHRzO1xuICBjb25zdCBhY3RpdmVTZXQgPSBzZXNzaW9uLmFjdGl2ZVRvb2xzID8gbmV3IFNldChzZXNzaW9uLmFjdGl2ZVRvb2xzKSA6IG51bGw7XG4gIGNvbnN0IGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMudG9vbHMpKSB7XG4gICAgaWYgKCFhY3RpdmVTZXQgfHwgYWN0aXZlU2V0LmhhcyhuYW1lKSkge1xuICAgICAgYXZhaWxhYmxlVG9vbHNbbmFtZV0gPSB0O1xuICAgIH1cbiAgfVxuICBjb25zdCBjb250ZXh0VHlwZSA9IGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcoYXZhaWxhYmxlVG9vbHMpO1xuXG4gIHJldHVybiB0b29sKHtcbiAgICAuLi5idWlsdEluVG9vbHMuSmF2YVNjcmlwdCxcbiAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGUgSmF2YVNjcmlwdCB0byBvcmNoZXN0cmF0ZSBtdWx0aXBsZSB0b29sIGNhbGxzIGluIGEgc2luZ2xlIHN0ZXAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gcnVuIHNldmVyYWwgdG9vbHMgaW4gc2VxdWVuY2UsIHRyYW5zZm9ybSBpbnRlcm1lZGlhdGUgcmVzdWx0cywgb3IgcGFyYWxsZWxpemUgaW5kZXBlbmRlbnQgb3BlcmF0aW9ucyB3aXRoIFByb21pc2UuYWxsLlxuXG5UaGUgY29kZSBydW5zIGFzIGFuIGFzeW5jIGZ1bmN0aW9uIGJvZHkgd2l0aCBcXGBjdHhcXGAgaW4gc2NvcGU6XG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbiR7Y29udGV4dFR5cGV9XG5cXGBcXGBcXGBcblxuRXhhbXBsZXM6XG4tIFNlcXVlbnRpYWw6IFxcYGNvbnN0IGZpbGUgPSBhd2FpdCBjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwicGFja2FnZS5qc29uXCIgfSk7IHJldHVybiBKU09OLnBhcnNlKGZpbGUuY29udGVudCk7XFxgXG4tIFBhcmFsbGVsOiBcXGBjb25zdCBbYSwgYl0gPSBhd2FpdCBQcm9taXNlLmFsbChbY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImEudHNcIiB9KSwgY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImIudHNcIiB9KV0pOyByZXR1cm4geyBhOiBhLmNvbnRlbnQsIGI6IGIuY29udGVudCB9O1xcYFxuLSBUcmFuc2Zvcm06IFxcYGNvbnN0IGdyZXAgPSBhd2FpdCBjdHgudG9vbHMuR3JlcCh7IHBhdHRlcm46IFwiVE9ET1wiIH0pOyByZXR1cm4gZ3JlcC5tYXRjaGVzLnNwbGl0KFwiXFxcXG5cIikubGVuZ3RoO1xcYFxuXG5SZXR1cm4gYSB2YWx1ZSB0byBwYXNzIHJlc3VsdHMgYmFjay4gVXNlIGNvbnNvbGUubG9nKCkgZm9yIGRlYnVnIG91dHB1dC5gLFxuICAgIGV4ZWN1dGU6ICh7IGNvZGUgfSkgPT4ge1xuICAgICAgY29uc3QgcnVuSWQgPSBgcnVuXyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpXG4gICAgICAgIC50b1N0cmluZygzNilcbiAgICAgICAgLnNsaWNlKDIsIDgpfWA7XG4gICAgICBjb25zdCBycGNEaXIgPSBgLmFnZW50L2pzLXJwYy8ke3J1bklkfWA7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAgIHJldHVybiBleGVjdXRlSW5TYW5kYm94KHtcbiAgICAgICAgY29kZSxcbiAgICAgICAgcnBjRGlyLFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIGF2YWlsYWJsZVRvb2xzLFxuICAgICAgICBvblN1YlRvb2xDYWxsLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBKU09OVmFsdWUsIE1vZGVsTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuXG50eXBlIFByb3ZpZGVyT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEpTT05WYWx1ZT4+O1xuXG5jb25zdCBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUID0gNDtcblxuY29uc3QgQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMgPSBbXCJjbGF1ZGVcIiwgXCJhbnRocm9waWNcIl07XG5cbmNvbnN0IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TOiBQcm92aWRlck9wdGlvbnMgPSB7XG4gIGFudGhyb3BpYzoge1xuICAgIGNhY2hlQ29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIG9wZW5yb3V0ZXI6IHtcbiAgICBjYWNoZUNvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBiZWRyb2NrOiB7XG4gICAgY2FjaGVQb2ludDogeyB0eXBlOiBcImRlZmF1bHRcIiB9LFxuICB9LFxuICBvcGVuYWlDb21wYXRpYmxlOiB7XG4gICAgY2FjaGVfY29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIGNvcGlsb3Q6IHtcbiAgICBjb3BpbG90X2NhY2hlX2NvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0R2F0ZXdheVByb3ZpZGVyKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgc2xhc2hJbmRleCA9IG1vZGVsLmluZGV4T2YoXCIvXCIpO1xuICBpZiAoc2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbW9kZWwuc2xpY2UoMCwgc2xhc2hJbmRleCk7XG59XG5cbmZ1bmN0aW9uIGNvdW50QW50aHJvcGljQ2FjaGVCcmVha3BvaW50cyhtZXNzYWdlczogTW9kZWxNZXNzYWdlW10pOiBudW1iZXIge1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICBjb25zdCBwcm92aWRlck9wdGlvbnMgPSAobWVzc2FnZSBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9KVxuICAgICAgLnByb3ZpZGVyT3B0aW9ucztcbiAgICBpZiAocHJvdmlkZXJPcHRpb25zPy5hbnRocm9waWM/LmNhY2hlQ29udHJvbCkge1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICBjb25zdCBwYXJ0UHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICApLnByb3ZpZGVyT3B0aW9ucztcbiAgICAgICAgaWYgKHBhcnRQcm92aWRlck9wdGlvbnM/LmFudGhyb3BpYz8uY2FjaGVDb250cm9sKSB7XG4gICAgICAgICAgY291bnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY291bnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2xhdWRlTGlrZU1vZGVsKG1vZGVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbG93ZXIgPSBtb2RlbC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMuc29tZSgobSkgPT4gbG93ZXIuaW5jbHVkZXMobSkpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVByb3ZpZGVyT3B0aW9ucyhvcHRzOiB7XG4gIGN1cnJlbnQ6IFByb3ZpZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgcGF0Y2g6IFByb3ZpZGVyT3B0aW9ucztcbn0pOiBQcm92aWRlck9wdGlvbnMge1xuICBjb25zdCBuZXh0OiBQcm92aWRlck9wdGlvbnMgPSB7IC4uLihvcHRzLmN1cnJlbnQgPz8ge30pIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMucGF0Y2gpKSB7XG4gICAgbmV4dFtrZXldID0geyAuLi4obmV4dFtrZXldID8/IHt9KSwgLi4udmFsdWUgfTtcbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KHBhcnQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFwYXJ0IHx8IHR5cGVvZiBwYXJ0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFwidHlwZVwiIGluIHBhcnQgJiYgKHBhcnQgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlID09PSBcInRleHRcIikge1xuICAgIGNvbnN0IHRleHQgPSAocGFydCBhcyB7IHRleHQ/OiB1bmtub3duIH0pLnRleHQ7XG4gICAgaWYgKHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGV4dC50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcGFydCkge1xuICAgIGNvbnN0IHR5cGUgPSAocGFydCBhcyB7IHR5cGU/OiB1bmtub3duIH0pLnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IFwidGhpbmtpbmdcIiB8fCB0eXBlID09PSBcInJlYXNvbmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZTogTW9kZWxNZXNzYWdlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudC50cmltKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50LnNvbWUoKHBhcnQpID0+IGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChwYXJ0KSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q2FjaGVhYmxlUGFydEluZGV4KGNvbnRlbnQ6IHVua25vd25bXSk6IG51bWJlciB8IG51bGwge1xuICBmb3IgKGxldCBpID0gY29udGVudC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGlmIChpc0NhY2hlYWJsZUNsYXVkZVBhcnQoY29udGVudFtpXSkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0Q2xhdWRlQ2FjaGluZ1RhcmdldHMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogbnVtYmVyW10ge1xuICBjb25zdCBzeXN0ZW1JbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBmaW5hbEluZGljZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGggJiYgc3lzdGVtSW5kaWNlcy5sZW5ndGggPCAyOyBpICs9IDEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbaV07XG4gICAgaWYgKG1lc3NhZ2Uucm9sZSA9PT0gXCJzeXN0ZW1cIiAmJiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2UpKSB7XG4gICAgICBzeXN0ZW1JbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IG1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiBmaW5hbEluZGljZXMubGVuZ3RoIDwgMjsgaSAtPSAxKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmIChtZXNzYWdlLnJvbGUgIT09IFwic3lzdGVtXCIgJiYgaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlKSkge1xuICAgICAgZmluYWxJbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZmluYWxJbmRpY2VzLnJldmVyc2UoKTtcblxuICByZXR1cm4gWy4uLnN5c3RlbUluZGljZXMsIC4uLmZpbmFsSW5kaWNlc107XG59XG5cbmZ1bmN0aW9uIGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyhvcHRzOiB7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgcHJvdmlkZXJJZDogc3RyaW5nIHwgbnVsbDtcbiAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0OiBudW1iZXI7XG59KTogTW9kZWxNZXNzYWdlW10ge1xuICBjb25zdCBleGlzdGluZ0JyZWFrcG9pbnRzID0gY291bnRBbnRocm9waWNDYWNoZUJyZWFrcG9pbnRzKG9wdHMubWVzc2FnZXMpO1xuICBjb25zdCByZW1haW5pbmdCdWRnZXQgPSBNYXRoLm1heChcbiAgICAwLFxuICAgIG9wdHMubWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0IC0gZXhpc3RpbmdCcmVha3BvaW50c1xuICApO1xuXG4gIGlmIChyZW1haW5pbmdCdWRnZXQgPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEluZGljZXMgPSBzZWxlY3RDbGF1ZGVDYWNoaW5nVGFyZ2V0cyhvcHRzLm1lc3NhZ2VzKS5zbGljZShcbiAgICAwLFxuICAgIHJlbWFpbmluZ0J1ZGdldFxuICApO1xuICBpZiAodGFyZ2V0SW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgPVxuICAgIG9wdHMucHJvdmlkZXJJZCA9PT0gXCJhbnRocm9waWNcIiB8fFxuICAgIEJvb2xlYW4ob3B0cy5wcm92aWRlcklkPy5pbmNsdWRlcyhcImJlZHJvY2tcIikpO1xuXG4gIGNvbnN0IG5leHRNZXNzYWdlcyA9IG9wdHMubWVzc2FnZXMuc2xpY2UoKTtcblxuICBmb3IgKGNvbnN0IG1lc3NhZ2VJbmRleCBvZiB0YXJnZXRJbmRpY2VzKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdO1xuXG4gICAgY29uc3Qgc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgPVxuICAgICAgIXVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSAmJlxuICAgICAgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBwYXJ0SW5kZXggPSBmaW5kTGFzdENhY2hlYWJsZVBhcnRJbmRleChtZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgaWYgKHBhcnRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwYXJ0ID0gbWVzc2FnZS5jb250ZW50W3BhcnRJbmRleF07XG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgcGFydFByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICAgICkucHJvdmlkZXJPcHRpb25zO1xuXG4gICAgICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSBtZXNzYWdlLmNvbnRlbnQuc2xpY2UoKTtcbiAgICAgICAgICBuZXh0Q29udGVudFtwYXJ0SW5kZXhdID0ge1xuICAgICAgICAgICAgLi4uKHBhcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBtZXJnZVByb3ZpZGVyT3B0aW9ucyh7XG4gICAgICAgICAgICAgIGN1cnJlbnQ6IHBhcnRQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgIHBhdGNoOiBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0gYXMgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQpW251bWJlcl07XG5cbiAgICAgICAgICBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb250ZW50OiBuZXh0Q29udGVudCxcbiAgICAgICAgICB9IGFzIE1vZGVsTWVzc2FnZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2VQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICBtZXNzYWdlIGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICApLnByb3ZpZGVyT3B0aW9ucztcblxuICAgIG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdID0ge1xuICAgICAgLi4ubWVzc2FnZSxcbiAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVyZ2VQcm92aWRlck9wdGlvbnMoe1xuICAgICAgICBjdXJyZW50OiBtZXNzYWdlUHJvdmlkZXJPcHRpb25zLFxuICAgICAgICBwYXRjaDogQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5leHRNZXNzYWdlcztcbn1cblxuZXhwb3J0IHR5cGUgUHJvbXB0Q2FjaGluZ1Jlc3VsdCA9IHtcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBwcm92aWRlck9wdGlvbnM6IFByb3ZpZGVyT3B0aW9ucztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdChvcHRzOiB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIGFudGhyb3BpYz86IHsgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0PzogbnVtYmVyIH07XG4gIG9wZW5haT86IHsgc2V0UHJvbXB0Q2FjaGVLZXk/OiBib29sZWFuIH07XG59KTogUHJvbXB0Q2FjaGluZ1Jlc3VsdCB7XG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0R2F0ZXdheVByb3ZpZGVyKG9wdHMubW9kZWwpO1xuXG4gIGNvbnN0IHByb3ZpZGVyT3B0aW9uczogUHJvdmlkZXJPcHRpb25zID0ge307XG5cbiAgaWYgKFxuICAgIChwcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBwcm92aWRlciA9PT0gXCJhenVyZVwiKSAmJlxuICAgIG9wdHMub3BlbmFpPy5zZXRQcm9tcHRDYWNoZUtleSAhPT0gZmFsc2VcbiAgKSB7XG4gICAgcHJvdmlkZXJPcHRpb25zLm9wZW5haSA9IHsgcHJvbXB0Q2FjaGVLZXk6IG9wdHMuc2Vzc2lvbklkIH07XG4gIH1cblxuICBjb25zdCBtYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPVxuICAgIG9wdHMuYW50aHJvcGljPy5tYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPz9cbiAgICBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUO1xuXG4gIGNvbnN0IGNhY2hlZE1lc3NhZ2VzID0gaXNDbGF1ZGVMaWtlTW9kZWwob3B0cy5tb2RlbClcbiAgICA/IGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyh7XG4gICAgICAgIG1lc3NhZ2VzOiBvcHRzLm1lc3NhZ2VzLFxuICAgICAgICBwcm92aWRlcklkOiBwcm92aWRlcixcbiAgICAgICAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0LFxuICAgICAgfSlcbiAgICA6IG9wdHMubWVzc2FnZXM7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlczogY2FjaGVkTWVzc2FnZXMsXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgVUlNZXNzYWdlIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuXG4vKiogU3ViLXRvb2wgcGFydHMgKGZyb20gSmF2YVNjcmlwdCBtZXRhLXRvb2wpIHVzZSB0aGlzIHRvb2xDYWxsSWQgcHJlZml4LiAqL1xuZnVuY3Rpb24gaXNTdWJUb29sUGFydChwYXJ0OiBQYXJ0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSBwYXJ0LnBhcnQgYXMgeyB0b29sQ2FsbElkPzogc3RyaW5nIH07XG4gIHJldHVybiB0eXBlb2YgcD8udG9vbENhbGxJZCA9PT0gXCJzdHJpbmdcIiAmJiBwLnRvb2xDYWxsSWQuc3RhcnRzV2l0aChcImpzX3RjX1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlVUlNZXNzYWdlcyhvcHRzOiB7XG4gIG1lc3NhZ2VzOiBNZXNzYWdlW107XG4gIHBhcnRzOiBQYXJ0W107XG4gIHVudGlsPzogbnVtYmVyO1xuICBpbmNsdWRlUXVldWVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgZmlsdGVycyBvdXQgc3ViLXRvb2wgcGFydHMgc28gdGhlIExMTSBkb2Vzbid0IHNlZSB0aGVtLiAqL1xuICBleGNsdWRlU3ViVG9vbFBhcnRzPzogYm9vbGVhbjtcbn0pOiBVSU1lc3NhZ2VbXSB7XG4gIGxldCBmaWx0ZXJlZCA9IG9wdHMubWVzc2FnZXM7XG5cbiAgaWYgKG9wdHMudW50aWwgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHVudGlsID0gb3B0cy51bnRpbDtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5jcmVhdGVkQXQgPD0gdW50aWwpO1xuICB9XG5cbiAgaWYgKCFvcHRzLmluY2x1ZGVRdWV1ZWQpIHtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5zdGFydGVkQXQgIT09IG51bGwpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBvcHRzLmV4Y2x1ZGVTdWJUb29sUGFydHNcbiAgICA/IG9wdHMucGFydHMuZmlsdGVyKChwKSA9PiAhaXNTdWJUb29sUGFydChwKSlcbiAgICA6IG9wdHMucGFydHM7XG5cbiAgY29uc3QgcGFydHNCeU1lc3NhZ2UgPSBuZXcgTWFwPHN0cmluZywgUGFydFtdPigpO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHBhcnRzQnlNZXNzYWdlLmdldChwYXJ0Lm1lc3NhZ2VJZCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaChwYXJ0KTtcbiAgICBwYXJ0c0J5TWVzc2FnZS5zZXQocGFydC5tZXNzYWdlSWQsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIHJldHVybiBmaWx0ZXJlZFxuICAgIC5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IHBhcnRzQnlNZXNzYWdlLmdldChtLmlkKSA/PyBbXTtcbiAgICAgIG1lc3NhZ2VQYXJ0cy5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogbS5pZCxcbiAgICAgICAgcm9sZTogbS5yb2xlLFxuICAgICAgICBwYXJ0czogbWVzc2FnZVBhcnRzLm1hcCgocCkgPT4gcC5wYXJ0KSxcbiAgICAgIH0gc2F0aXNmaWVzIFVJTWVzc2FnZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKG0pID0+IG0ucGFydHMubGVuZ3RoID4gMCk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGVwVXNhZ2UsIFVzYWdlU3VtbWFyeSB9IGZyb20gXCIuLi9zdG9yYWdlL3JwY1wiO1xuXG5leHBvcnQgdHlwZSB7IFN0ZXBVc2FnZSwgVXNhZ2VTdW1tYXJ5IH07XG5cbmZ1bmN0aW9uIHN1bShpdGVtczogU3RlcFVzYWdlW10sIGtleToga2V5b2YgU3RlcFVzYWdlKTogbnVtYmVyIHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBpdGVtW2tleV07XG4gICAgcmV0dXJuIGFjYyArICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IDApO1xuICB9LCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVVc2FnZVN1bW1hcnkoc3RlcHM6IFN0ZXBVc2FnZVtdKTogVXNhZ2VTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBtb2RlbDogc3RlcHNbMF0/Lm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgIGlucHV0VG9rZW5zOiBzdW0oc3RlcHMsIFwiaW5wdXRUb2tlbnNcIiksXG4gICAgb3V0cHV0VG9rZW5zOiBzdW0oc3RlcHMsIFwib3V0cHV0VG9rZW5zXCIpLFxuICAgIHRvdGFsVG9rZW5zOiBzdW0oc3RlcHMsIFwidG90YWxUb2tlbnNcIiksXG4gICAgY2FjaGVSZWFkVG9rZW5zOiBzdW0oc3RlcHMsIFwiY2FjaGVSZWFkVG9rZW5zXCIpLFxuICAgIGNhY2hlV3JpdGVUb2tlbnM6IHN1bShzdGVwcywgXCJjYWNoZVdyaXRlVG9rZW5zXCIpLFxuICAgIHJlYXNvbmluZ1Rva2Vuczogc3VtKHN0ZXBzLCBcInJlYXNvbmluZ1Rva2Vuc1wiKSxcbiAgICBzdGVwQ291bnQ6IHN0ZXBzLmxlbmd0aCxcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgU2Vzc2lvblVzYWdlID0ge1xuICB0b3RhbDogVXNhZ2VTdW1tYXJ5ICYgeyBtZXNzYWdlQ291bnQ6IG51bWJlciB9O1xuICBieU1lc3NhZ2VJZDogUmVjb3JkPHN0cmluZywgVXNhZ2VTdW1tYXJ5IHwgbnVsbD47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNlc3Npb25Vc2FnZShcbiAgbWVzc2FnZXM6IEFycmF5PHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVzYWdlOiB7IHN0ZXBzOiBTdGVwVXNhZ2VbXTsgc3VtbWFyeTogVXNhZ2VTdW1tYXJ5IH0gfCBudWxsO1xuICB9PlxuKTogU2Vzc2lvblVzYWdlIHtcbiAgY29uc3QgYnlNZXNzYWdlSWQ6IFJlY29yZDxzdHJpbmcsIFVzYWdlU3VtbWFyeSB8IG51bGw+ID0ge307XG4gIGZvciAoY29uc3QgbSBvZiBtZXNzYWdlcykge1xuICAgIGJ5TWVzc2FnZUlkW20uaWRdID0gbS51c2FnZT8uc3VtbWFyeSA/PyBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3VtbWFyaWVzID0gbWVzc2FnZXNcbiAgICAubWFwKChtKSA9PiBtLnVzYWdlPy5zdW1tYXJ5KVxuICAgIC5maWx0ZXIoKHMpOiBzIGlzIFVzYWdlU3VtbWFyeSA9PiBzICE9PSB1bmRlZmluZWQpO1xuXG4gIGNvbnN0IHRvdGFsID0ge1xuICAgIG1vZGVsOiBzdW1tYXJpZXNbMF0/Lm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgIGlucHV0VG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuaW5wdXRUb2tlbnMsIDApLFxuICAgIG91dHB1dFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLm91dHB1dFRva2VucywgMCksXG4gICAgdG90YWxUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy50b3RhbFRva2VucywgMCksXG4gICAgY2FjaGVSZWFkVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuY2FjaGVSZWFkVG9rZW5zLCAwKSxcbiAgICBjYWNoZVdyaXRlVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuY2FjaGVXcml0ZVRva2VucywgMCksXG4gICAgcmVhc29uaW5nVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMucmVhc29uaW5nVG9rZW5zLCAwKSxcbiAgICBzdGVwQ291bnQ6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5zdGVwQ291bnQsIDApLFxuICAgIG1lc3NhZ2VDb3VudDogc3VtbWFyaWVzLmxlbmd0aCxcbiAgfTtcblxuICByZXR1cm4geyB0b3RhbCwgYnlNZXNzYWdlSWQgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUVhLG9CQU1QLFlBMkZPO0FBbkdiO0FBQUE7QUFBQTtBQUVPLElBQU0scUJBQXFCO0FBTWxDLElBQU0sYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTJGWixJQUFNLHVCQUF1QixDQUFDLFNBRy9CO0FBQ0osWUFBTSxFQUFFLFNBQVMsVUFBVSxJQUFJO0FBQy9CLFVBQUksY0FBYztBQUVsQixZQUFNLE9BQU8sWUFBMkI7QUFDdEMsWUFBSSxhQUFhO0FBQ2Y7QUFBQSxRQUNGO0FBRUEsY0FBTSxTQUFTLE1BQU0sUUFBUSxLQUFLO0FBQUEsVUFDaEMsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0o7QUFBQSxZQUNBO0FBQUE7QUFBQSxFQUVOLFVBQVU7QUFBQTtBQUFBO0FBQUEsVUFHTjtBQUFBLFFBQ0YsQ0FBQztBQUVELFlBQUks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QUM5RCxrQkFBTSxPQUFPLEtBQUssT0FBTyxhQUFhLEVBQUU7QUFDeEMsbUJBQU8sS0FBSyxLQUFLO0FBQUEsVUFDbkIsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUdGO0FBQUEsSUFDRixTQUFTLEtBQUs7QUFDWixjQUFRLE1BQU0sR0FBRztBQUNqQixZQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLG9CQUFvQjtBQUFBLElBQ3hCLG9CQUFvQixNQUFNO0FBQUEsSUFDMUI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJvcHRzIiwgImV4aXRDb2RlIiwgInN0ZGVyciIsICJlcnJvcmUiLCAic3RvcmFnZSIsICJzYW5kYm94UmVjb3JkIiwgImltcG9ydF96b2QiLCAiVmVyY2VsU2FuZGJveFNESyIsICJnZXRTdG9yYWdlIiwgImVycm9yZSIsICJpbXBvcnRfc2FuZGJveCIsICJnZXRUZXN0Q3JlZGVudGlhbHMiLCAic2FuZGJveCIsICJWZXJjZWxTYW5kYm94U0RLIiwgImdldFNhbmRib3giLCAic2FuZGJveFJlY29yZCIsICJpbml0X2NsaWVudCIsICJpbml0X2NsaWVudCIsICJpbXBvcnRfd29ya2Zsb3ciLCAiaW1wb3J0X2FpIiwgImltcG9ydF91bGlkIiwgImltcG9ydF93b3JrZmxvdyIsICJpbXBvcnRfYWkiLCAiaW1wb3J0X3pvZCIsICJwYXRoIiwgImNyZWF0ZVByb2Nlc3NNYW5hZ2VyIiwgImdldFN0b3JhZ2UiLCAiZ2V0U2FuZGJveCIsICJzZXNzaW9uIiwgInNhbmRib3hSZWNvcmQiLCAic2FuZGJveCIsICJza2lsbHMiLCAicmVzdWx0IiwgInN0YXJ0IiwgImV2ZW50Il0KfQo=
4355
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JwYy1yZWdpc3RyeS50cyIsICIuLi9zcmMvc2FuZGJveC9wcm9jZXNzLW1hbmFnZXIudHMiLCAiLi4vc3JjL2Vycm9ycy50cyIsICIuLi9zcmMvc3RvcmFnZS9jbGllbnQudHMiLCAiLi4vc3JjL3V0aWxzL2RlYnVnLnRzIiwgIi4uL3NyYy9zYW5kYm94L3dyaXRlLWZpbGVzLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2xvY2FsLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL3ZlcmNlbC1zZGsudHMiLCAiLi4vc3JjL3N0b3JhZ2UvcnBjLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2hhbmRsZXIudHMiLCAiLi4vc3JjL3N0b3JhZ2UvaW5kZXgudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2xpZmVjeWNsZS13b3JrZmxvdy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy92ZXJjZWwudHMiLCAiLi4vc3JjL3NhbmRib3gvY2xpZW50LnRzIiwgIi4uL3NyYy9zYW5kYm94L2luZGV4LnRzIiwgIi4uL3NyYy9hZ2VudC13b3JrZmxvdy50cyIsICIuLi9zcmMvYWdlbnQtd29ya2Zsb3ctc3RlcHMudHMiLCAiLi4vc3JjL3NraWxscy9wYXJzZXIudHMiLCAiLi4vc3JjL3NraWxscy9kaXNjb3Zlci50cyIsICIuLi9zcmMvdG9vbHMvaW5kZXgudHMiLCAiLi4vc3JjL3Rvb2xzL2phdmFzY3JpcHQudHMiLCAiLi4vc3JjL3V0aWxzL3Byb21wdC1jYWNoZS50cyIsICIuLi9zcmMvdXRpbHMvdWkudHMiLCAiLi4vc3JjL3V0aWxzL3VzYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIE1vZHVsZS1sZXZlbCByZWdpc3RyeSBmb3IgYWdlbnQgUlBDIGZ1bmN0aW9ucy5cbiAqXG4gKiBSUEMgZnVuY3Rpb25zIGFyZSBhc3luYyBzdGVwIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgYnkgdGhlIE5leHQuanMgbG9hZGVyXG4gKiAoaW4gc3RlcHMuanMpLiBUaGV5IGNhbm5vdCBiZSBzZXJpYWxpemVkIGJ5IGRldmFsdWUsIHNvIHRoZXkgbXVzdCBub3RcbiAqIGFwcGVhciBpbiB3b3JrZmxvdyBhcmd1bWVudHMuIEluc3RlYWQsIHRoZSBsb2FkZXIgaW5pdCByZWdpc3RlcnMgZWFjaFxuICogYWdlbnQncyBSUEMgaGVyZSwgYW5kIHdvcmtmbG93IHN0ZXAgZnVuY3Rpb25zIGxvb2sgaXQgdXAgYnkgYWdlbnQgbmFtZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJwY1BheWxvYWQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuL2NsaWVudFwiO1xuXG50eXBlIFJwY0ZuID0gKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+O1xuXG5jb25zdCByZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBScGNGbj4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUnBjKG5hbWU6IHN0cmluZywgZm46IFJwY0ZuKTogdm9pZCB7XG4gIHJlZ2lzdHJ5LnNldChuYW1lLCBmbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUnBjKG5hbWU6IHN0cmluZyk6IFJwY0ZuIHtcbiAgY29uc3QgZm4gPSByZWdpc3RyeS5nZXQobmFtZSk7XG4gIGlmICghZm4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gUlBDIHJlZ2lzdGVyZWQgZm9yIGFnZW50IFwiJHtuYW1lfVwiLiBFbnN1cmUgd2l0aEFnZW50IGlzIHNldCB1cCBpbiBuZXh0LmNvbmZpZy50cy5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZm47XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNoUmVzdWx0LCBTYW5kYm94IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0FJVF9VTlRJTCA9IDIwMDA7XG5cbi8qKlxuICogU2hlbGwgc2NyaXB0IHRoYXQgaGFuZGxlcyBhbGwgcHJvY2VzcyBleGVjdXRpb24gbG9naWMuXG4gKiBJbnN0YWxsZWQgdG8gfi8uYWdlbnQvYmluL3J1bi5zaCBkdXJpbmcgaW5pdCgpLlxuICovXG5jb25zdCBSVU5fU0NSSVBUID0gYCMhL2Jpbi9zaFxuIyBQcm9jZXNzIHJ1bm5lciBmb3IgQWdlbnQgU0RLXG4jIEFsbCBwYXJhbWV0ZXJzIHBhc3NlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGF2b2lkIGVzY2FwaW5nIGlzc3Vlc1xuIyBPdXRwdXQgaXMgYmFzZTY0IGVuY29kZWQgdG8gYXZvaWQgSlNPTiBlc2NhcGluZyBpc3N1ZXNcblxuQUdFTlRfRElSPVwiJEhPTUUvLmFnZW50XCJcbkNXRF9GSUxFPVwiJEFHRU5UX0RJUi9jd2QvJFNFU1NJT05fSURcIlxuXG4jIEdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChwZXItc2Vzc2lvbilcbmlmIFsgLWYgXCIkQ1dEX0ZJTEVcIiBdOyB0aGVuXG4gIENXRD0kKGNhdCBcIiRDV0RfRklMRVwiKVxuZWxzZVxuICBDV0Q9XCIkSE9NRVwiXG5maVxuXG4jIERlY29kZSBjb21tYW5kXG5DTUQ9JChlY2hvIFwiJENNRF9CQVNFNjRcIiB8IGJhc2U2NCAtZClcblxuIyBCYWNrZ3JvdW5kIG1vZGUgKHdhaXRVbnRpbCA9IDApXG5pZiBbIFwiJFdBSVRfVU5USUxcIiA9IFwiMFwiIF07IHRoZW5cbiAgY2QgXCIkQ1dEXCIgfHwgY2QgXCIkSE9NRVwiXG5cbiAgIyBHZW5lcmF0ZSBhIHNpbXBsZSBudW1lcmljIElEIGZvciBvdXRwdXQgZmlsZVxuICBPVVRQVVRfSUQ9XCIkKGRhdGUgKyVzKSQkXCJcbiAgT1VUUFVUX0ZJTEU9XCIkQUdFTlRfRElSL291dHB1dHMvJE9VVFBVVF9JRC5sb2dcIlxuXG4gICMgRG91YmxlLWZvcmsgdG8gZnVsbHkgZGV0YWNoIHRoZSBwcm9jZXNzXG4gIChcbiAgICAoXG4gICAgICBldmFsIFwiJENNRFwiXG4gICAgICBwd2QgPiBcIiRDV0RfRklMRVwiIDI+L2Rldi9udWxsXG4gICAgKSA+IFwiJE9VVFBVVF9GSUxFXCIgMj4mMSA8IC9kZXYvbnVsbCAmXG4gICAgZWNobyAkISA+IFwiJEFHRU5UX0RJUi9waWRzLyRPVVRQVVRfSUQucGlkXCJcbiAgKVxuXG4gICMgU21hbGwgZGVsYXkgdG8gZW5zdXJlIFBJRCBmaWxlIGlzIHdyaXR0ZW5cbiAgc2xlZXAgMC4wNVxuXG4gICMgUmVhZCBQSURcbiAgaWYgWyAtZiBcIiRBR0VOVF9ESVIvcGlkcy8kT1VUUFVUX0lELnBpZFwiIF07IHRoZW5cbiAgICBQSUQ9JChjYXQgXCIkQUdFTlRfRElSL3BpZHMvJE9VVFBVVF9JRC5waWRcIilcbiAgZWxzZVxuICAgIFBJRD0wXG4gIGZpXG5cbiAgIyBPdXRwdXQgSlNPTiByZXN1bHQgKG5vIG91dHB1dCBmb3IgYmFja2dyb3VuZCwgc28gbm8gZW5jb2RpbmcgbmVlZGVkKVxuICBwcmludGYgJ3tcInBpZFwiOiVkLFwib3V0cHV0QmFzZTY0XCI6XCJcIixcImV4aXRDb2RlXCI6LTEsXCJzdGF0dXNcIjpcInJ1bm5pbmdcIixcIm91dHB1dEZpbGVcIjpcIiVzXCIsXCJjd2RcIjpcIiVzXCJ9XFxcXG4nIFxcXFxcbiAgICBcIiRQSURcIiBcIiRPVVRQVVRfRklMRVwiIFwiJENXRFwiXG4gIGV4aXQgMFxuZmlcblxuIyBGb3JlZ3JvdW5kIG1vZGUgKHdhaXRVbnRpbCA+IDApIC0gcnVuIGRpcmVjdGx5IGFuZCBjYXB0dXJlIG91dHB1dFxuY2QgXCIkQ1dEXCIgfHwgY2QgXCIkSE9NRVwiXG5cbiMgUnVuIGNvbW1hbmQsIGNhcHR1cmUgb3V0cHV0IGFuZCBleGl0IGNvZGVcbk9VVFBVVD0kKGV2YWwgXCIkQ01EXCIgMj4mMSlcbkVYSVRfQ09ERT0kP1xuXG4jIFVwZGF0ZSBDV0QgYWZ0ZXIgY29tbWFuZFxuTkVXX0NXRD0kKHB3ZClcbmVjaG8gXCIkTkVXX0NXRFwiID4gXCIkQ1dEX0ZJTEVcIlxuXG4jIERldGVybWluZSBzdGF0dXNcbmlmIFsgJEVYSVRfQ09ERSAtZXEgMCBdOyB0aGVuXG4gIFNUQVRVUz1cImNvbXBsZXRlZFwiXG5lbHNlXG4gIFNUQVRVUz1cImZhaWxlZFwiXG5maVxuXG4jIEJhc2U2NCBlbmNvZGUgb3V0cHV0IHRvIGF2b2lkIEFMTCBlc2NhcGluZyBpc3N1ZXNcbk9VVFBVVF9CQVNFNjQ9JChwcmludGYgJyVzJyBcIiRPVVRQVVRcIiB8IGJhc2U2NCB8IHRyIC1kICdcXFxcbicpXG5cbiMgT3V0cHV0IEpTT04gcmVzdWx0IHdpdGggYmFzZTY0LWVuY29kZWQgb3V0cHV0XG5wcmludGYgJ3tcInBpZFwiOjAsXCJvdXRwdXRCYXNlNjRcIjpcIiVzXCIsXCJleGl0Q29kZVwiOiVkLFwic3RhdHVzXCI6XCIlc1wiLFwib3V0cHV0RmlsZVwiOlwiXCIsXCJjd2RcIjpcIiVzXCJ9XFxcXG4nIFxcXFxcbiAgXCIkT1VUUFVUX0JBU0U2NFwiIFwiJEVYSVRfQ09ERVwiIFwiJFNUQVRVU1wiIFwiJE5FV19DV0RcIlxuYDtcblxudHlwZSBSdW5PcHRpb25zID0ge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYXggbXMgdG8gd2FpdCBmb3IgY29tcGxldGlvbi5cbiAgICogLSAwOiBCYWNrZ3JvdW5kIG1vZGUgLSByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCBQSURcbiAgICogLSA+MDogRm9yZWdyb3VuZCBtb2RlIC0gd2FpdCBmb3IgY29tcGxldGlvbiAoZGVmYXVsdDogMzAwMDApXG4gICAqL1xuICB3YWl0VW50aWw/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgbWFuYWdlciB0aGF0IHVzZXMgYSBzaW5nbGUgc2hlbGwgc2NyaXB0IHRvIGhhbmRsZSBhbGwgZXhlY3V0aW9uIGxvZ2ljLlxuICogUmVkdWNlcyByb3VuZC10cmlwcyB0byB0aGUgc2FuZGJveCBieSBkb2luZyBldmVyeXRoaW5nIGluIG9uZSBleGVjIGNhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQcm9jZXNzTWFuYWdlciA9IChvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNlc3Npb25JZCB9ID0gb3B0cztcbiAgbGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgY29uc3QgaW5pdCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1xuICAgICAgICBcIi1jXCIsXG4gICAgICAgIGBta2RpciAtcCAkSE9NRS8uYWdlbnQvYmluICRIT01FLy5hZ2VudC9waWRzICRIT01FLy5hZ2VudC9vdXRwdXRzICRIT01FLy5hZ2VudC9jd2RcbmNhdCA+ICRIT01FLy5hZ2VudC9iaW4vcnVuLnNoIDw8ICdTQ1JJUFRfRU9GJ1xuJHtSVU5fU0NSSVBUfVxuU0NSSVBUX0VPRlxuY2htb2QgK3ggJEhPTUUvLmFnZW50L2Jpbi9ydW4uc2hgLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgcmVzdWx0O1xuICAgIH1cbiAgICBhd2FpdCByZXN1bHQucmVzdWx0O1xuICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBydW4gPSBhc3luYyAob3B0czogUnVuT3B0aW9ucyk6IFByb21pc2U8QmFzaFJlc3VsdD4gPT4ge1xuICAgIGF3YWl0IGluaXQoKTtcblxuICAgIGNvbnN0IHsgY29tbWFuZCwgd2FpdFVudGlsID0gREVGQVVMVF9XQUlUX1VOVElMIH0gPSBvcHRzO1xuICAgIGNvbnN0IGNtZEJhc2U2NCA9IEJ1ZmZlci5mcm9tKGNvbW1hbmQsIFwidXRmLThcIikudG9TdHJpbmcoXCJiYXNlNjRcIik7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1xuICAgICAgICBcIi1jXCIsXG4gICAgICAgIGBDTURfQkFTRTY0PVwiJHtjbWRCYXNlNjR9XCIgV0FJVF9VTlRJTD1cIiR7d2FpdFVudGlsfVwiIFNFU1NJT05fSUQ9XCIke3Nlc3Npb25JZH1cIiAkSE9NRS8uYWdlbnQvYmluL3J1bi5zaGAsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQudHJpbSgpKSBhcyB7XG4gICAgICBwaWQ6IG51bWJlcjtcbiAgICAgIG91dHB1dEJhc2U2NDogc3RyaW5nO1xuICAgICAgZXhpdENvZGU6IG51bWJlcjtcbiAgICAgIHN0YXR1czogXCJydW5uaW5nXCIgfCBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIjtcbiAgICAgIG91dHB1dEZpbGU6IHN0cmluZztcbiAgICAgIGN3ZDogc3RyaW5nO1xuICAgIH07XG5cbiAgICAvLyBEZWNvZGUgYmFzZTY0IG91dHB1dFxuICAgIGNvbnN0IG91dHB1dCA9IHBhcnNlZC5vdXRwdXRCYXNlNjRcbiAgICAgID8gQnVmZmVyLmZyb20ocGFyc2VkLm91dHB1dEJhc2U2NCwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGYtOFwiKVxuICAgICAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBpZDogcGFyc2VkLnBpZCxcbiAgICAgIG91dHB1dCxcbiAgICAgIGV4aXRDb2RlOiBwYXJzZWQuZXhpdENvZGUsXG4gICAgICBzdGF0dXM6IHBhcnNlZC5zdGF0dXMsXG4gICAgICBjd2Q6IHBhcnNlZC5jd2QsXG4gICAgICBvdXRwdXRGaWxlOiBwYXJzZWQub3V0cHV0RmlsZSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGdldEN3ZCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGF3YWl0IGluaXQoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICBjb21tYW5kOiBcInNoXCIsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFwiLWNcIixcbiAgICAgICAgYGNhdCAkSE9NRS8uYWdlbnQvY3dkLyR7c2Vzc2lvbklkfSAyPi9kZXYvbnVsbCB8fCBlY2hvIFwiJEhPTUVcImAsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzcy5jd2QoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcbiAgICByZXR1cm4gc3Rkb3V0LnRyaW0oKSB8fCBwcm9jZXNzLmN3ZCgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaW5pdCxcbiAgICBydW4sXG4gICAgZ2V0Q3dkLFxuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgUHJvY2Vzc01hbmFnZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVQcm9jZXNzTWFuYWdlcj47XG4iLCAiaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTZXNzaW9uTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNlc3Npb25FcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbkVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2Vzc2lvbiAkaWQgZmFpbGVkOiAkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2FuZGJveE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2FuZGJveCAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTdG9yYWdlRXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2FuZGJveEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTYW5kYm94RXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgTWVzc2FnZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIk1lc3NhZ2VOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiTWVzc2FnZSAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuIiwgImltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7XG4gIE1lc3NhZ2VOb3RGb3VuZEVycm9yLFxuICBTYW5kYm94Tm90Rm91bmRFcnJvcixcbiAgU2Vzc2lvbk5vdEZvdW5kRXJyb3IsXG4gIFN0b3JhZ2VFcnJvcixcbn0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWV0aG9kcyB9IGZyb20gXCIuL3JwY1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBMaXN0UmVzdWx0LFxuICBQYXJ0LFxuICBTZXR1cFNuYXBzaG90LFxuICBTdG9yYWdlLFxuICBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG50eXBlIFJwY1Jlc3BvbnNlPFQ+ID1cbiAgfCB7IHJlc3VsdDogVCB9XG4gIHwgeyBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9IH07XG5cbmV4cG9ydCB0eXBlIFJwY0ZuID0gKHBhcmFtczoge1xuICBuYW1lPzogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGFyYW1zOiB1bmtub3duO1xufSkgPT4gUHJvbWlzZTxScGNSZXNwb25zZTx1bmtub3duPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlQ2xpZW50KHJwY0ZuOiBScGNGbiwgbmFtZT86IHN0cmluZyk6IFN0b3JhZ2Uge1xuICBhc3luYyBmdW5jdGlvbiBycGM8TSBleHRlbmRzIGtleW9mIFN0b3JhZ2VNZXRob2RzPihcbiAgICBtZXRob2Q6IE0sXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicGFyYW1zXCJdPlxuICApOiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJyZXN1bHRcIl0+PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjRm4oeyBuYW1lLCBtZXRob2QsIHBhcmFtcyB9KTtcblxuICAgIGlmIChcImVycm9yXCIgaW4gcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiByZXN1bHQuZXJyb3IubWVzc2FnZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicmVzdWx0XCJdPjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbjoge1xuICAgICAgZ2V0OiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzZXNzaW9uLmdldFwiLCB7IGlkIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbk5vdEZvdW5kRXJyb3IoeyBpZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNlc3Npb24uc2V0XCIsIHNlc3Npb24pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3Q6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNlc3Npb24ubGlzdFwiLCB7XG4gICAgICAgICAgICB0YWdzOiBvcHRzPy50YWdzLFxuICAgICAgICAgICAgb3JkZXI6IG9wdHM/Lm9yZGVyLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGFnOiB7XG4gICAgICAgIHNldDogYXN5bmMgKHsgc2Vzc2lvbklkLCB0YWdzIH0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNlc3Npb24udGFnLnNldFwiLCB7IHNlc3Npb25JZCwgdGFncyB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBtZXNzYWdlOiB7XG4gICAgICBsaXN0OiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcIm1lc3NhZ2UubGlzdFwiLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcIm1lc3NhZ2UuZ2V0XCIsIHsgaWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlTm90Rm91bmRFcnJvcih7IGlkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwibWVzc2FnZS5zZXRcIiwgbWVzc2FnZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgcGFydDoge1xuICAgICAgbGlzdEJ5TWVzc2FnZTogYXN5bmMgKG1lc3NhZ2VJZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInBhcnQubGlzdEJ5TWVzc2FnZVwiLCB7XG4gICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0IGFzIExpc3RSZXN1bHQ8UGFydD47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInBhcnQubGlzdEJ5U2Vzc2lvblwiLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0IGFzIExpc3RSZXN1bHQ8UGFydD47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAocGFydCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwicGFydC5zZXRcIiwgcGFydCkpIGFzIFBhcnQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVsZXRlOiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJwYXJ0LmRlbGV0ZVwiLCB7IGlkIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbmRib3g6IHtcbiAgICAgIGdldDogYXN5bmMgKGtleSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInNhbmRib3guZ2V0XCIsIHsga2V5IH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveE5vdEZvdW5kRXJyb3IoeyBpZDoga2V5IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldEJ5U2Vzc2lvbjogYXN5bmMgKHNlc3Npb25JZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInNhbmRib3guZ2V0QnlTZXNzaW9uXCIsIHsgc2Vzc2lvbklkIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveE5vdEZvdW5kRXJyb3IoeyBpZDogc2Vzc2lvbklkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInNhbmRib3guc2V0XCIsIHJlY29yZCk7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0OiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzYW5kYm94Lmxpc3RcIiwge1xuICAgICAgICAgICAgdGFnczogb3B0cz8udGFncyxcbiAgICAgICAgICAgIG9yZGVyOiBvcHRzPy5vcmRlcixcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRhZzoge1xuICAgICAgICBzZXQ6IGFzeW5jICh7IHNhbmRib3hJZCwgdGFncyB9KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzYW5kYm94LnRhZy5zZXRcIiwgeyBzYW5kYm94SWQsIHRhZ3MgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWNxdWlyZUxvY2s6IGFzeW5jIChyZWNvcmQsIGxvY2tUaW1lb3V0TXMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInNhbmRib3guYWNxdWlyZUxvY2tcIiwge1xuICAgICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgICAgbG9ja1RpbWVvdXRNcyxcbiAgICAgICAgICB9KSkgYXMgaW1wb3J0KFwiLi90eXBlc1wiKS5TYW5kYm94UmVjb3JkIHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXR1cDoge1xuICAgICAgZ2V0OiBhc3luYyAoa2V5KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJzZXR1cC5nZXRcIiwgeyBrZXkgfSkpIGFzIFNldHVwU25hcHNob3QgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHNuYXBzaG90KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2V0dXAuc2V0XCIsIHNuYXBzaG90KTtcbiAgICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYWNxdWlyZUxvY2s6IGFzeW5jIChrZXksIGxvY2tJZCwgbG9ja1RpbWVvdXRNcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwic2V0dXAuYWNxdWlyZUxvY2tcIiwge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbG9ja0lkLFxuICAgICAgICAgICAgbG9ja1RpbWVvdXRNcyxcbiAgICAgICAgICB9KSkgYXMgU2V0dXBTbmFwc2hvdCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tbWFuZDoge1xuICAgICAgZ2V0OiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcImNvbW1hbmQuZ2V0XCIsIHsgaWQgfSkpIGFzIENvbW1hbmQgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKGNvbW1hbmQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcImNvbW1hbmQuc2V0XCIsIGNvbW1hbmQpKSBhcyBDb21tYW5kO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3Q6IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJjb21tYW5kLmxpc3RcIiwge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgaW5jbHVkZUZpbmlzaGVkOiBvcHRzPy5pbmNsdWRlRmluaXNoZWQsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0IGFzIExpc3RSZXN1bHQ8Q29tbWFuZD47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05BTUVTUEFDRSA9IFwiZGVmYXVsdFwiO1xuZXhwb3J0IGNvbnN0IExPQ0FMX1NUT1JBR0VfVkVSU0lPTiA9IFwidjFcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2Uob3B0czoge1xuICBjb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHJwYzogUnBjRm47XG59KTogU3RvcmFnZSB7XG4gIGNvbnN0IG5hbWUgPSBvcHRzLmNvbmZpZy5uYW1lID8/IERFRkFVTFRfTkFNRVNQQUNFO1xuICByZXR1cm4gZ2V0U3RvcmFnZUNsaWVudChvcHRzLnJwYywgbmFtZSk7XG59XG4iLCAiY29uc3QgZW5hYmxlZCA9XG4gIHByb2Nlc3MuZW52LkFHRU5UX0RFQlVHID09PSBcIjFcIiB8fCBwcm9jZXNzLmVudi5BR0VOVF9ERUJVRyA9PT0gXCJ0cnVlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgaWYgKGVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBVcGxvYWRhYmxlRmlsZSB9IGZyb20gXCIuLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IE1BWF9SRVRSSUVTID0gMjtcbmNvbnN0IFJFVFJZX0JBU0VfTVMgPSA1MDA7XG5cbi8qKlxuICogRXhlYyBhIGNvbW1hbmQgYW5kIGFzc2VydCBleGl0IGNvZGUgMC4gUmV0cmllcyBvbiB0cmFuc2llbnQgZmFpbHVyZXNcbiAqIChleGl0IGNvZGUgMjU1IHdpdGggZW1wdHkgc3RkZXJyIFx1MjAxNCB0eXBpY2FsbHkgYSBzYW5kYm94IHByb2Nlc3Mga2lsbGVkXG4gKiBiZWZvcmUgaXQgY291bGQgcHJvZHVjZSBvdXRwdXQpLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjQ2hlY2tlZChcbiAgc2FuZGJveDogUGljazxTYW5kYm94LCBcImV4ZWNcIj4sXG4gIG9wdHM6IHsgY29tbWFuZDogc3RyaW5nOyBhcmdzPzogc3RyaW5nW10gfSxcbiAgZXJyb3JMYWJlbDogc3RyaW5nXG4pOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyhvcHRzKTtcbiAgICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBleGVjUmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IGlzVHJhbnNpZW50ID0gcmVzdWx0LmV4aXRDb2RlID09PSAyNTUgJiYgIXJlc3VsdC5zdGRlcnIudHJpbSgpO1xuICAgIGlmIChpc1RyYW5zaWVudCAmJiBhdHRlbXB0IDwgTUFYX1JFVFJJRVMpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFJFVFJZX0JBU0VfTVMgKiAoYXR0ZW1wdCArIDEpKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtlcnJvckxhYmVsfSB3aXRoIGV4aXQgY29kZSAke3Jlc3VsdC5leGl0Q29kZX06ICR7cmVzdWx0LnN0ZGVycn1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyBmaWxlcyB0byBhIHNhbmRib3ggYXQgdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBwYXRoLlxuICogU2hlbGwgc2NyaXB0cyAoLnNoIGZpbGVzKSBhcmUgYXV0b21hdGljYWxseSBtYWRlIGV4ZWN1dGFibGUuXG4gKlxuICogRm9yIHNtYWxsIGZpbGVzICg8MTAwS0IgdG90YWwpLCB1c2VzIHNpbmdsZSBleGVjIHdpdGggaGVyZWRvYy5cbiAqIEZvciBsYXJnZSBmaWxlcywgd3JpdGVzIGJhc2U2NCBjaHVua3MgdGhlbiBkZWNvZGVzIHRvIGF2b2lkIEFSR19NQVggbGltaXRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlcyhvcHRzOiB7XG4gIHNhbmRib3g6IFBpY2s8U2FuZGJveCwgXCJleGVjXCI+O1xuICBmaWxlczogVXBsb2FkYWJsZUZpbGVbXTtcbiAgZGVzdFBhdGg6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBmaWxlcywgZGVzdFBhdGggfSA9IG9wdHM7XG5cbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbGVQYXRocyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5wb3NpeC5qb2luKGRlc3RQYXRoLCBmaWxlLnBhdGgpKTtcbiAgY29uc3QgcGFyZW50RGlycyA9IEFycmF5LmZyb20oXG4gICAgbmV3IFNldChmaWxlUGF0aHMubWFwKChwKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocCkpKVxuICApO1xuICBjb25zdCBzaGVsbFNjcmlwdHMgPSBmaWxlUGF0aHMuZmlsdGVyKChwKSA9PiBwLmVuZHNXaXRoKFwiLnNoXCIpKTtcblxuICBjb25zdCBta2RpclJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJta2RpclwiLFxuICAgIGFyZ3M6IFtcIi1wXCIsIC4uLnBhcmVudERpcnNdLFxuICB9KTtcbiAgaWYgKG1rZGlyUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICB0aHJvdyBta2RpclJlc3VsdDtcbiAgfVxuICBhd2FpdCBta2RpclJlc3VsdC5yZXN1bHQ7XG5cbiAgY29uc3QgQ0hVTktfU0laRSA9IDUwXzAwMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gZmlsZVBhdGhzW2ldO1xuICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSB0b0Jhc2U2NChmaWxlLmNvbnRlbnQpO1xuXG4gICAgaWYgKGJhc2U2NENvbnRlbnQubGVuZ3RoIDwgQ0hVTktfU0laRSkge1xuICAgICAgY29uc3QgbWFya2VyID0gYEVPRl8ke2l9YDtcbiAgICAgIGF3YWl0IGV4ZWNDaGVja2VkKFxuICAgICAgICBzYW5kYm94LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgYGJhc2U2NCAtZCA+ICR7cXVvdGUoZnVsbFBhdGgpfSA8PCAnJHttYXJrZXJ9J1xuJHtiYXNlNjRDb250ZW50fVxuJHttYXJrZXJ9YCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBcIndyaXRlRmlsZXMgZmFpbGVkXCJcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlbXBCNjQgPSBgL3RtcC9jaHVuay0ke0RhdGUubm93KCl9LSR7aX0uYjY0YDtcblxuICAgICAgY29uc3QgY2xlYXJSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgYXJnczogW1wiLWNcIiwgYD4gJHtxdW90ZSh0ZW1wQjY0KX1gXSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGNsZWFyUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgY2xlYXJSZXN1bHQ7XG4gICAgICB9XG4gICAgICBhd2FpdCBjbGVhclJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBvZmZzZXQgPCBiYXNlNjRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgb2Zmc2V0ICs9IENIVU5LX1NJWkVcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjaHVuayA9IGJhc2U2NENvbnRlbnQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBDSFVOS19TSVpFKTtcbiAgICAgICAgY29uc3QgbWFya2VyID0gYENIVU5LXyR7b2Zmc2V0fWA7XG4gICAgICAgIGF3YWl0IGV4ZWNDaGVja2VkKFxuICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgICAgYGNhdCA+PiAke3F1b3RlKHRlbXBCNjQpfSA8PCAnJHttYXJrZXJ9J1xuJHtjaHVua31cbiR7bWFya2VyfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ3cml0ZUZpbGVzIGNodW5rIGZhaWxlZFwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGV4ZWNDaGVja2VkKFxuICAgICAgICBzYW5kYm94LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgYGJhc2U2NCAtZCA8ICR7cXVvdGUodGVtcEI2NCl9ID4gJHtxdW90ZShmdWxsUGF0aCl9ICYmIHJtIC1mICR7cXVvdGUodGVtcEI2NCl9YCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBcIndyaXRlRmlsZXMgZGVjb2RlIGZhaWxlZFwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaGVsbFNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNobW9kUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IFwiY2htb2RcIixcbiAgICAgIGFyZ3M6IFtcIit4XCIsIC4uLnNoZWxsU2NyaXB0c10sXG4gICAgfSk7XG4gICAgaWYgKGNobW9kUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGNobW9kUmVzdWx0O1xuICAgIH1cbiAgICBhd2FpdCBjaG1vZFJlc3VsdC5yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9CYXNlNjQoY29udGVudDogc3RyaW5nIHwgQnVmZmVyKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNvbnRlbnQpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICB9XG4gIHJldHVybiBjb250ZW50LnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xufVxuXG5mdW5jdGlvbiBxdW90ZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke3MucmVwbGFjZSgvJy9nLCBcIidcXFxcJydcIil9J2A7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB7IFNhbmRib3hFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94UmVjb3JkLCBTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RlYnVnXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hTZXR1cE1ldGEgfSBmcm9tIFwiLi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IExvZ0VudHJ5LCBPblJlc3RhcnQsIFNhbmRib3gsIFNhbmRib3hTZXR1cCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgd3JpdGVGaWxlcyB9IGZyb20gXCIuLi93cml0ZS1maWxlc1wiO1xuXG5leHBvcnQgY29uc3QgbG9jYWxTYW5kYm94ID0gPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZSxcbiAgc2V0dXAsXG4gIG9uUmVzdGFydCxcbn06IHtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZCAmIHsgY29uZmlnOiB7IHR5cGU6IFwibG9jYWxcIiB9IH07XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHNldHVwPzogU2FuZGJveFNldHVwO1xuICBvblJlc3RhcnQ/OiBPblJlc3RhcnQ7XG59KTogU2FuZGJveDxUVGFncz4gJiB7XG4gIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgX3NldHVwTWV0YT86IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT47XG59ID0+IHtcbiAgY29uc3QgY29uZmlnID0gc2FuZGJveFJlY29yZC5jb25maWc7XG4gIGNvbnN0IGJhc2VQYXRoID0gY29uZmlnLnBhdGggPz8gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcHJvY2Vzc2VzID0gbmV3IE1hcDxzdHJpbmcsIENoaWxkUHJvY2Vzcz4oKTtcblxuICBjb25zdCBzYW5kYm94OiBTYW5kYm94PFRUYWdzPiA9IHtcbiAgICBpZDogc2FuZGJveFJlY29yZC5pZCxcbiAgICBjb25maWc6IHNhbmRib3hSZWNvcmQuY29uZmlnLFxuICAgIGV4ZWM6ICh7IGNvbW1hbmQsIGFyZ3MsIHNpZ25hbCB9KSA9PiB7XG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tbWFuZElkID0gYGNvbW1hbmRfJHt1bGlkKCl9YDtcblxuICAgICAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oY29tbWFuZCwgYXJncywge1xuICAgICAgICAgICAgY3dkOiBiYXNlUGF0aCxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHByb2Nlc3Nlcy5zZXQoY29tbWFuZElkLCBjaGlsZCk7XG5cbiAgICAgICAgICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgICAgICAgICBsZXQgc3RkZXJyID0gXCJcIjtcbiAgICAgICAgICBjb25zdCBsb2dRdWV1ZTogTG9nRW50cnlbXSA9IFtdO1xuICAgICAgICAgIGxldCBsb2dSZXNvbHZlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBsZXQgY2xvc2VkID0gZmFsc2U7XG5cbiAgICAgICAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcgfCBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhkYXRhKTtcbiAgICAgICAgICAgIHN0ZG91dCArPSBzdHI7XG4gICAgICAgICAgICBsb2dRdWV1ZS5wdXNoKHsgc3RyZWFtOiBcInN0ZG91dFwiLCBkYXRhOiBzdHIgfSk7XG4gICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuICAgICAgICAgICAgc3RkZXJyICs9IHN0cjtcbiAgICAgICAgICAgIGxvZ1F1ZXVlLnB1c2goeyBzdHJlYW06IFwic3RkZXJyXCIsIGRhdGE6IHN0ciB9KTtcbiAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFByb21pc2U8e1xuICAgICAgICAgICAgc3Rkb3V0OiBzdHJpbmc7XG4gICAgICAgICAgICBzdGRlcnI6IHN0cmluZztcbiAgICAgICAgICAgIGV4aXRDb2RlOiBudW1iZXI7XG4gICAgICAgICAgfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY2hpbGQub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHByb2Nlc3Nlcy5kZWxldGUoY29tbWFuZElkKTtcbiAgICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGU6IG51bWJlciB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VzLmRlbGV0ZShjb21tYW5kSWQpO1xuICAgICAgICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZTogY29kZSA/PyAwIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhc3luYyBmdW5jdGlvbiogbG9ncygpOiBBc3luY0l0ZXJhYmxlPExvZ0VudHJ5PiB7XG4gICAgICAgICAgICB3aGlsZSAoIWNsb3NlZCB8fCBsb2dRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gbG9nUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgeWllbGQgZW50cnk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNsb3NlZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBsb2dSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsb2dSZXNvbHZlID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBjb21tYW5kSWQsIGxvZ3MsIHJlc3VsdCB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY2F0Y2g6IChlOiB1bmtub3duKSA9PlxuICAgICAgICAgIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0RG9tYWluOiAocG9ydCkgPT4ge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YCk7XG4gICAgfSxcblxuICAgIGtpbGw6IGFzeW5jICh7IGNvbW1hbmRJZCwgc3RvcmFnZSB9KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZCA9IHByb2Nlc3Nlcy5nZXQoY29tbWFuZElkKTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgICAgIHJlYXNvbjogYENvbW1hbmQgJHtjb21tYW5kSWR9IG5vdCBmb3VuZCBvciBhbHJlYWR5IGZpbmlzaGVkYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkLmtpbGwoXCJTSUdURVJNXCIpO1xuXG4gICAgICBjb25zdCBjbWQgPSBhd2FpdCBzdG9yYWdlLmNvbW1hbmQuZ2V0KGNvbW1hbmRJZCk7XG4gICAgICBpZiAoY21kIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGNtZC5tZXNzYWdlLCBjYXVzZTogY21kIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNtZCAmJiBjbWQuc3RhdHVzID09PSBcInJ1bm5pbmdcIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLmNvbW1hbmQuc2V0KHtcbiAgICAgICAgICAuLi5jbWQsXG4gICAgICAgICAgc3RhdHVzOiBcImtpbGxlZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IHJlc3VsdC5tZXNzYWdlLCBjYXVzZTogcmVzdWx0IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlYWRGaWxlOiBhc3luYyAoeyBwYXRoOiBmaWxlUGF0aCB9KSA9PiB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgZmlsZVBhdGgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKGZ1bGxQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGUgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAgIFwiY29kZVwiIGluIGUgJiZcbiAgICAgICAgICAoZSBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09IFwiRU5PRU5UXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHdyaXRlRmlsZXM6IChvcHRzKSA9PiB3cml0ZUZpbGVzKHsgc2FuZGJveCwgLi4ub3B0cyB9KSxcblxuICAgIHVwZGF0ZU5ldHdvcmtQb2xpY3k6ICgpID0+XG4gICAgICBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgICAgIHJlYXNvbjogXCJ1cGRhdGVOZXR3b3JrUG9saWN5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBWZXJjZWwgc2FuZGJveGVzXCIsXG4gICAgICAgIH0pXG4gICAgICApLFxuXG4gICAgdGFnOiB7XG4gICAgICBsaXN0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNhbmRib3guaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzYW5kYm94UmVjb3JkLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNhbmRib3guaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQudGFncz8uW2tleSBhcyBzdHJpbmddIGFzXG4gICAgICAgICAgfCBUVGFnc1t0eXBlb2Yga2V5XVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3gudGFnLnNldCh7XG4gICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LmlkLFxuICAgICAgICAgIHRhZ3M6IHsgW2tleV06IHZhbHVlIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0TWFueTogYXN5bmMgKHRhZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guaWQsXG4gICAgICAgICAgdGFnczogdGFncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCByZXN1bHQ6IFNhbmRib3g8VFRhZ3M+ICYge1xuICAgIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgICBfc2V0dXBNZXRhPzogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPjtcbiAgfSA9IHNhbmRib3g7XG5cbiAgaWYgKHNldHVwIHx8IG9uUmVzdGFydCkge1xuICAgIGxldCByZXNvbHZlU2V0dXBNZXRhITogKG1ldGE6IFNhbmRib3hTZXR1cE1ldGEpID0+IHZvaWQ7XG4gICAgcmVzdWx0Ll9zZXR1cE1ldGEgPSBuZXcgUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPigocikgPT4ge1xuICAgICAgcmVzb2x2ZVNldHVwTWV0YSA9IHI7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuX29uUmVhZHkgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IG5lZWRzU2V0dXBSdW4gPSAhIXNldHVwO1xuICAgICAgaWYgKHNldHVwKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zZXR1cC5nZXQoc2V0dXAua2V5KTtcbiAgICAgICAgaWYgKCEoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvcikgJiYgZXhpc3RpbmcpIHtcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc2V0dXAgYWxyZWFkeSBjb21wbGV0ZSBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCIsIHNraXBwaW5nYFxuICAgICAgICAgICk7XG4gICAgICAgICAgbmVlZHNTZXR1cFJ1biA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgc2V0dXAgbWV0YWRhdGEgYmVmb3JlIHJ1bm5pbmcgc2V0dXAgc28gdGhlIHdvcmtmbG93XG4gICAgICAvLyBjYW4gZW1pdCB0aGUgY29ycmVjdCBzdGF0dXMgaW5kaWNhdG9yIHdoaWxlIHNldHVwIHJ1bnMuXG4gICAgICByZXNvbHZlU2V0dXBNZXRhKHtcbiAgICAgICAgbmVlZHNTZXR1cFJ1bixcbiAgICAgICAgY3JlYXRlZEZyb21TbmFwc2hvdDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG5lZWRzU2V0dXBSdW4gJiYgc2V0dXApIHtcbiAgICAgICAgZGVidWcoYFtzYW5kYm94OnNldHVwXSBydW5uaW5nIHNldHVwLnJ1biAobG9jYWwsIGtleT1cIiR7c2V0dXAua2V5fVwiKWApO1xuICAgICAgICBhd2FpdCBzZXR1cC5ydW4oc2FuZGJveCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0dXAuc2V0KHtcbiAgICAgICAgICBrZXk6IHNldHVwLmtleSxcbiAgICAgICAgICBzbmFwc2hvdElkOiBudWxsLFxuICAgICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICBsYXN0VXNlZEF0OiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNldHVwIGNvbXBsZXRlLCBzdG9yZWQgcmVjb3JkIChrZXk9XCIke3NldHVwLmtleX1cIilgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAob25SZXN0YXJ0KSB7XG4gICAgICAgIGRlYnVnKFwiW3NhbmRib3g6c2V0dXBdIHJ1bm5pbmcgb25SZXN0YXJ0IChsb2NhbClcIik7XG4gICAgICAgIGF3YWl0IG9uUmVzdGFydChzYW5kYm94KTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiZXhwb3J0IHsgU2FuZGJveCB9IGZyb20gXCJAdmVyY2VsL3NhbmRib3hcIjtcbiIsICJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBWZXJjZWxMaWZlY3ljbGVDb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHBvbGxJbnRlcnZhbE1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHN0b3BBZnRlckluYWN0aXZlTXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc25hcHNob3RCZWZvcmVUaW1lb3V0TXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc25hcHNob3RJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBhdXRvU3RhcnQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgTmV0d29ya1BvbGljeVNjaGVtYSA9IHpcbiAgLnVuaW9uKFtcbiAgICB6LmxpdGVyYWwoXCJhbGxvdy1hbGxcIiksXG4gICAgei5saXRlcmFsKFwiZGVueS1hbGxcIiksXG4gICAgei5vYmplY3Qoe1xuICAgICAgYWxsb3c6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHN1Ym5ldHM6IHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgYWxsb3c6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgICAgICBkZW55OiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgIH0pLFxuICBdKVxuICAub3B0aW9uYWwoKTtcblxuZXhwb3J0IHR5cGUgTmV0d29ya1BvbGljeSA9IHouaW5mZXI8dHlwZW9mIE5ldHdvcmtQb2xpY3lTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgU2FuZGJveENvbmZpZ1NjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJ2ZXJjZWxcIiksXG4gICAgcmVzb3VyY2VzOiB6Lm9iamVjdCh7IHZjcHVzOiB6Lm51bWJlcigpIH0pLm9wdGlvbmFsKCksXG4gICAgcG9ydHM6IHouYXJyYXkoei5udW1iZXIoKSkub3B0aW9uYWwoKSxcbiAgICBsaWZlY3ljbGU6IFZlcmNlbExpZmVjeWNsZUNvbmZpZ1NjaGVtYS5vcHRpb25hbCgpLFxuICAgIG5ldHdvcmtQb2xpY3k6IE5ldHdvcmtQb2xpY3lTY2hlbWEsXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwibG9jYWxcIiksXG4gICAgcGF0aDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB9KSxcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcImN1c3RvbVwiKSxcbiAgICB1cmw6IHouc3RyaW5nKCksXG4gICAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgfSksXG5dKTtcblxuZXhwb3J0IHR5cGUgU2FuZGJveENvbmZpZyA9IHouaW5mZXI8dHlwZW9mIFNhbmRib3hDb25maWdTY2hlbWE+O1xuXG5jb25zdCBHZW5lcmF0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICBtYXhTdGVwczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0ZW1wZXJhdHVyZTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3BLOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvcFA6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgZnJlcXVlbmN5UGVuYWx0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBwcmVzZW5jZVBlbmFsdHk6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgbWF4T3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFNlc3Npb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIHVwZGF0ZWRBdDogei5udW1iZXIoKSxcbiAgcnVuSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgbGFzdE1lc3NhZ2VJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkubnVsbGFibGUoKSxcbiAgc3lzdGVtOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIG1vZGVsOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHNhbmRib3hJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBza2lsbHNEaXI6IHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGFibGUoKSxcbiAgaG9va1Rva2VuOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGFjdGl2ZVRvb2xzOiB6LmFycmF5KHouc3RyaW5nKCkpLm51bGxhYmxlKCksXG4gIGdlbmVyYXRpb246IEdlbmVyYXRpb25TY2hlbWEubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTdGVwVXNhZ2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHN0ZXBJbmRleDogei5udW1iZXIoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCksXG4gIGlucHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICBvdXRwdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIHRvdGFsVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVJlYWRUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlV3JpdGVUb2tlbnM6IHoubnVtYmVyKCksXG4gIHJlYXNvbmluZ1Rva2Vuczogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgVXNhZ2VTdW1tYXJ5U2NoZW1hID0gei5vYmplY3Qoe1xuICBtb2RlbDogei5zdHJpbmcoKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIG91dHB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgdG90YWxUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVXcml0ZVRva2Vuczogei5udW1iZXIoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLFxuICBzdGVwQ291bnQ6IHoubnVtYmVyKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IE1lc3NhZ2VVc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3RlcHM6IHouYXJyYXkoU3RlcFVzYWdlU2NoZW1hKSxcbiAgc3VtbWFyeTogVXNhZ2VTdW1tYXJ5U2NoZW1hLFxufSk7XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VVc2FnZSA9IHouaW5mZXI8dHlwZW9mIE1lc3NhZ2VVc2FnZVNjaGVtYT47XG5leHBvcnQgdHlwZSBVc2FnZVN1bW1hcnkgPSB6LmluZmVyPHR5cGVvZiBVc2FnZVN1bW1hcnlTY2hlbWE+O1xuZXhwb3J0IHR5cGUgU3RlcFVzYWdlID0gei5pbmZlcjx0eXBlb2YgU3RlcFVzYWdlU2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IE1lc3NhZ2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gIHJvbGU6IHouZW51bShbXCJ1c2VyXCIsIFwiYXNzaXN0YW50XCIsIFwic3lzdGVtXCJdKSxcbiAgY3JlYXRlZEF0OiB6Lm51bWJlcigpLFxuICBzdGFydGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgY29tcGxldGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgaW50ZXJydXB0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICB1c2FnZTogTWVzc2FnZVVzYWdlU2NoZW1hLm51bGxhYmxlKCksXG59KTtcblxuLyoqXG4gKiBUaGUgYHBhcnRgIGZpZWxkIGNvcnJlc3BvbmRzIHRvIGBVSU1lc3NhZ2VbXCJwYXJ0c1wiXVtudW1iZXJdYCBmcm9tIHRoZSBgYWlgIHBhY2thZ2UuXG4gKiBXZSB1c2UgYHoudW5rbm93bigpYCBiZWNhdXNlIHRoZSBleGFjdCBzaGFwZSB2YXJpZXMgYnkgcGFydCB0eXBlICh0ZXh0LCB0b29sLWNhbGwsXG4gKiB0b29sLXJlc3VsdCwgZXRjLikgYW5kIG1heSBldm9sdmUgd2l0aCB0aGUgQUkgU0RLLiBUaGUgUlBDIGxheWVyIGp1c3QgcGFzc2VzIGl0IHRocm91Z2guXG4gKi9cbmV4cG9ydCBjb25zdCBQYXJ0U2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgbWVzc2FnZUlkOiB6LnN0cmluZygpLFxuICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gIGluZGV4OiB6Lm51bWJlcigpLFxuICBwYXJ0OiB6LnVua25vd24oKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgQ29tbWFuZFJlc3VsdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3Rkb3V0OiB6LnN0cmluZygpLFxuICBzdGRlcnI6IHouc3RyaW5nKCksXG4gIGV4aXRDb2RlOiB6Lm51bWJlcigpLFxuICBjb21wbGV0ZWRBdDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2FuZGJveFJlY29yZFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIGNvbmZpZzogU2FuZGJveENvbmZpZ1NjaGVtYSxcbiAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm51bGxhYmxlKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBsYXN0QWN0aXZpdHlBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0F0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIHByb3ZpZGVyTWV0YWRhdGE6IHpcbiAgICAuZGlzY3JpbWluYXRlZFVuaW9uKFwicHJvdmlkZXJcIiwgW1xuICAgICAgei5vYmplY3Qoe1xuICAgICAgICBwcm92aWRlcjogei5saXRlcmFsKFwidmVyY2VsXCIpLFxuICAgICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgICAgc25hcHNob3RJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgfSksXG4gICAgXSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5jb25zdCBDb21tYW5kQmFzZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgY29tbWFuZDogei5zdHJpbmcoKSxcbiAgYXJnczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBzdGFydGVkQXQ6IHoubnVtYmVyKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IENvbW1hbmRTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInN0YXR1c1wiLCBbXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7IHN0YXR1czogei5saXRlcmFsKFwicnVubmluZ1wiKSB9KSxcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHtcbiAgICBzdGF0dXM6IHoubGl0ZXJhbChcImNvbXBsZXRlZFwiKSxcbiAgICByZXN1bHQ6IENvbW1hbmRSZXN1bHRTY2hlbWEsXG4gIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwia2lsbGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYS5vcHRpb25hbCgpLFxuICB9KSxcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHtcbiAgICBzdGF0dXM6IHoubGl0ZXJhbChcImZhaWxlZFwiKSxcbiAgICByZXN1bHQ6IENvbW1hbmRSZXN1bHRTY2hlbWEsXG4gIH0pLFxuXSk7XG5cbmZ1bmN0aW9uIExpc3RSZXN1bHRTY2hlbWE8VCBleHRlbmRzIHouWm9kVHlwZUFueT4oaXRlbVNjaGVtYTogVCkge1xuICByZXR1cm4gei5vYmplY3Qoe1xuICAgIGl0ZW1zOiB6LmFycmF5KGl0ZW1TY2hlbWEpLFxuICAgIG5leHRDdXJzb3I6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBTZXR1cFNuYXBzaG90U2NoZW1hID0gei5vYmplY3Qoe1xuICBrZXk6IHouc3RyaW5nKCksXG4gIHNuYXBzaG90SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgY3JlYXRlZEF0OiB6Lm51bWJlcigpLFxuICBsYXN0VXNlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbn0pO1xuXG5jb25zdCBtZXRob2RzID0ge1xuICBcInNlc3Npb24uZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2Vzc2lvbi5zZXRcIjoge1xuICAgIHBhcmFtczogU2Vzc2lvblNjaGVtYSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEsXG4gIH0sXG4gIFwic2Vzc2lvbi5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuICAgICAgb3JkZXI6IHpcbiAgICAgICAgLmVudW0oW1xuICAgICAgICAgIFwiY3JlYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwiY3JlYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTZXNzaW9uU2NoZW1hKSxcbiAgfSxcbiAgXCJzZXNzaW9uLmxpc3RCeVNhbmRib3hcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2FuZGJveElkOiB6LnN0cmluZygpLFxuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gICAgICBvcmRlcjogelxuICAgICAgICAuZW51bShbXG4gICAgICAgICAgXCJjcmVhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJjcmVhdGVkQXRfZGVzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNlc3Npb25TY2hlbWEpLFxuICB9LFxuICBcInNlc3Npb24udGFnLnNldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcIm1lc3NhZ2UuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBNZXNzYWdlU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwibWVzc2FnZS5zZXRcIjoge1xuICAgIHBhcmFtczogTWVzc2FnZVNjaGVtYSxcbiAgICByZXN1bHQ6IE1lc3NhZ2VTY2hlbWEsXG4gIH0sXG4gIFwibWVzc2FnZS5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoTWVzc2FnZVNjaGVtYSksXG4gIH0sXG4gIFwicGFydC5saXN0QnlNZXNzYWdlXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIG1lc3NhZ2VJZDogei5zdHJpbmcoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoUGFydFNjaGVtYSksXG4gIH0sXG4gIFwicGFydC5saXN0QnlTZXNzaW9uXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoUGFydFNjaGVtYSksXG4gIH0sXG4gIFwicGFydC5zZXRcIjoge1xuICAgIHBhcmFtczogUGFydFNjaGVtYSxcbiAgICByZXN1bHQ6IFBhcnRTY2hlbWEsXG4gIH0sXG4gIFwicGFydC5kZWxldGVcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNhbmRib3guZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsga2V5OiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNhbmRib3guZ2V0QnlTZXNzaW9uXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgc2Vzc2lvbklkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNhbmRib3guc2V0XCI6IHtcbiAgICBwYXJhbXM6IFNhbmRib3hSZWNvcmRTY2hlbWEsXG4gICAgcmVzdWx0OiB6LnZvaWQoKSxcbiAgfSxcbiAgXCJzYW5kYm94Lmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gICAgICBvcmRlcjogelxuICAgICAgICAuZW51bShbXG4gICAgICAgICAgXCJjcmVhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJjcmVhdGVkQXRfZGVzY1wiLFxuICAgICAgICAgIFwibGFzdEFjdGl2aXR5QXRfYXNjXCIsXG4gICAgICAgICAgXCJsYXN0QWN0aXZpdHlBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTYW5kYm94UmVjb3JkU2NoZW1hKSxcbiAgfSxcbiAgXCJzYW5kYm94LnRhZy5zZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2FuZGJveElkOiB6LnN0cmluZygpLFxuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgfSxcbiAgXCJjb21tYW5kLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogQ29tbWFuZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcImNvbW1hbmQuc2V0XCI6IHtcbiAgICBwYXJhbXM6IENvbW1hbmRTY2hlbWEsXG4gICAgcmVzdWx0OiBDb21tYW5kU2NoZW1hLFxuICB9LFxuICBcImNvbW1hbmQubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICBpbmNsdWRlRmluaXNoZWQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKENvbW1hbmRTY2hlbWEpLFxuICB9LFxuICBcInNldHVwLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGtleTogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IFNldHVwU25hcHNob3RTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzZXR1cC5zZXRcIjoge1xuICAgIHBhcmFtczogU2V0dXBTbmFwc2hvdFNjaGVtYSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNldHVwLmFjcXVpcmVMb2NrXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIGtleTogei5zdHJpbmcoKSxcbiAgICAgIGxvY2tJZDogei5zdHJpbmcoKSxcbiAgICAgIGxvY2tUaW1lb3V0TXM6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTZXR1cFNuYXBzaG90U2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5hY3F1aXJlTG9ja1wiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICByZWNvcmQ6IFNhbmRib3hSZWNvcmRTY2hlbWEsXG4gICAgICBsb2NrVGltZW91dE1zOiB6Lm51bWJlcigpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHsgbWV0aG9kcyB9O1xuZXhwb3J0IHR5cGUgU3RvcmFnZU1ldGhvZHMgPSB0eXBlb2YgbWV0aG9kcztcbmV4cG9ydCB0eXBlIE1ldGhvZE5hbWUgPSBrZXlvZiBTdG9yYWdlTWV0aG9kcztcbmV4cG9ydCBjb25zdCBTVE9SQUdFX1JQQ19NRVRIT0RTID0gT2JqZWN0LmtleXMobWV0aG9kcykgYXMgTWV0aG9kTmFtZVtdO1xuIiwgImltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHR5cGUgTWV0aG9kTmFtZSwgbWV0aG9kcywgdHlwZSBTdG9yYWdlTWV0aG9kcyB9IGZyb20gXCIuL3JwY1wiO1xuXG5leHBvcnQgdHlwZSBIYW5kbGVycyA9IHtcbiAgW0sgaW4gTWV0aG9kTmFtZV06IChcbiAgICBwYXJhbXM6IHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbS11bXCJwYXJhbXNcIl0+XG4gICkgPT4gUHJvbWlzZTx6LmluZmVyPFN0b3JhZ2VNZXRob2RzW0tdW1wicmVzdWx0XCJdPj47XG59O1xuXG5leHBvcnQgdHlwZSBScGNSZXF1ZXN0ID0ge1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGFyYW1zOiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgUnBjU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiA9IHtcbiAgcmVzdWx0OiBUO1xufTtcblxuZXhwb3J0IHR5cGUgUnBjRXJyb3JSZXNwb25zZSA9IHtcbiAgZXJyb3I6IHsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1Jlc3BvbnNlPFQgPSB1bmtub3duPiA9IFJwY1N1Y2Nlc3NSZXNwb25zZTxUPiB8IFJwY0Vycm9yUmVzcG9uc2U7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVTdG9yYWdlUnBjKFxuICBib2R5OiBScGNSZXF1ZXN0LFxuICBoYW5kbGVyczogSGFuZGxlcnNcbik6IFByb21pc2U8UnBjUmVzcG9uc2U+IHtcbiAgY29uc3QgeyBtZXRob2QsIHBhcmFtcyB9ID0gYm9keTtcblxuICBpZiAoIShtZXRob2QgaW4gbWV0aG9kcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHsgY29kZTogXCJNRVRIT0RfTk9UX0ZPVU5EXCIsIG1lc3NhZ2U6IGBVbmtub3duIG1ldGhvZDogJHttZXRob2R9YCB9LFxuICAgIH07XG4gIH1cblxuICBjb25zdCBtZXRob2ROYW1lID0gbWV0aG9kIGFzIE1ldGhvZE5hbWU7XG4gIGNvbnN0IHNjaGVtYSA9IG1ldGhvZHNbbWV0aG9kTmFtZV0ucGFyYW1zO1xuICBjb25zdCBwYXJzZWQgPSBzY2hlbWEuc2FmZVBhcnNlKHBhcmFtcyk7XG5cbiAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBcIklOVkFMSURfUEFSQU1TXCIsXG4gICAgICAgIG1lc3NhZ2U6IHBhcnNlZC5lcnJvci5pc3N1ZXNcbiAgICAgICAgICAubWFwKChpKSA9PiBgJHtpLnBhdGguam9pbihcIi5cIil9OiAke2kubWVzc2FnZX1gKVxuICAgICAgICAgIC5qb2luKFwiLCBcIiksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1ttZXRob2ROYW1lXSBhcyAoXG4gICAgICBwYXJhbXM6IHVua25vd25cbiAgICApID0+IFByb21pc2U8dW5rbm93bj47XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihwYXJzZWQuZGF0YSk7XG4gICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJJTlRFUk5BTF9FUlJPUlwiLFxuICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsICJleHBvcnQge1xuICBERUZBVUxUX05BTUVTUEFDRSxcbiAgZ2V0U3RvcmFnZSxcbiAgTE9DQUxfU1RPUkFHRV9WRVJTSU9OLFxuICB0eXBlIFJwY0ZuLFxufSBmcm9tIFwiLi9jbGllbnRcIjtcbmV4cG9ydCB7XG4gIHR5cGUgSGFuZGxlcnMsXG4gIGhhbmRsZVN0b3JhZ2VScGMsXG4gIHR5cGUgUnBjRXJyb3JSZXNwb25zZSxcbiAgdHlwZSBScGNSZXF1ZXN0LFxuICB0eXBlIFJwY1Jlc3BvbnNlLFxuICB0eXBlIFJwY1N1Y2Nlc3NSZXNwb25zZSxcbn0gZnJvbSBcIi4vaGFuZGxlclwiO1xuZXhwb3J0IHtcbiAgdHlwZSBNZXNzYWdlVXNhZ2UsXG4gIHR5cGUgTWV0aG9kTmFtZSxcbiAgdHlwZSBTYW5kYm94Q29uZmlnLFxuICBTVE9SQUdFX1JQQ19NRVRIT0RTLFxuICB0eXBlIFN0ZXBVc2FnZSxcbiAgdHlwZSBTdG9yYWdlTWV0aG9kcyxcbiAgdHlwZSBVc2FnZVN1bW1hcnksXG59IGZyb20gXCIuL3JwY1wiO1xuZXhwb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBMaXN0UmVzdWx0LFxuICBNZXNzYWdlLFxuICBQYXJ0LFxuICBSZXNvbHZlZFN0b3JhZ2UsXG4gIFNhbmRib3hSZWNvcmQsXG4gIFNlc3Npb24sXG4gIFNldHVwU25hcHNob3QsXG4gIFN0b3JhZ2UsXG4gIFN0b3JhZ2VDb25maWcsXG4gIFR5cGVkU2Vzc2lvbixcbiAgVHlwZWRTdG9yYWdlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuIiwgImltcG9ydCB7IHJlc29sdmVScGMgfSBmcm9tIFwiLi4vLi4vcnBjLXJlZ2lzdHJ5XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5jb25zdCBERUZBVUxUX1BPTExfSU5URVJWQUxfTVMgPSAyICogNjAgKiAxMDAwO1xuY29uc3QgREVGQVVMVF9JRExFX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgU05BUFNIT1RfQkVGT1JFX1RJTUVPVVRfTVMgPSAxMCAqIDYwICogMTAwMDtcblxuY29uc3QgZ2V0VGVzdENyZWRlbnRpYWxzID0gKCkgPT5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXG4gICAgPyB7XG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9UT0tFTixcbiAgICAgICAgdGVhbUlkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9URUFNX0lELFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1BST0pFQ1RfSUQsXG4gICAgICB9XG4gICAgOiB7fTtcblxuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlU3RlcFJlc3VsdCA9XG4gIHwgeyBhY3Rpb246IFwiY29udGludWVcIjsgbmV4dFBvbGxNczogbnVtYmVyIH1cbiAgfCB7XG4gICAgICBhY3Rpb246IFwiZXhpdFwiO1xuICAgICAgcmVhc29uOiBcInNhbmRib3hJZF9jaGFuZ2VkXCIgfCBcImlkbGVcIiB8IFwidGltZW91dFwiIHwgXCJub3RfZm91bmRcIjtcbiAgICB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRTbmFwc2hvdFN0ZXAoXG4gIGlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXRcbik6IFByb21pc2U8RXJyb3IgfCBMaWZlY3ljbGVTdGVwUmVzdWx0PiB7XG4gIFwidXNlIHN0ZXBcIjtcblxuICBjb25zdCB7IFNhbmRib3g6IFZlcmNlbFNhbmRib3hTREsgfSA9IGF3YWl0IGltcG9ydChcIi4vdmVyY2VsLXNka1wiKTtcbiAgY29uc3QgeyBnZXRTdG9yYWdlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi9zdG9yYWdlXCIpO1xuICBjb25zdCBycGMgPSByZXNvbHZlUnBjKGlucHV0LnN0b3JhZ2VDb25maWcubmFtZSA/PyBcImRlZmF1bHRcIik7XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHtcbiAgICBjb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsXG4gICAgcnBjLFxuICB9KTtcbiAgY29uc3QgcmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpbnB1dC5pZCk7XG4gIGlmIChyZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgY3VycmVudFNhbmRib3hJZCA9XG4gICAgcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICA/IHJlY29yZC5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgOiBudWxsO1xuXG4gIGlmIChjdXJyZW50U2FuZGJveElkICE9PSBpbnB1dC52ZXJjZWxTYW5kYm94SWQpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwic2FuZGJveElkX2NoYW5nZWRcIiB9O1xuICB9XG5cbiAgaWYgKCFjdXJyZW50U2FuZGJveElkKSB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBjb25maWcgPSByZWNvcmQuY29uZmlnO1xuICBpZiAoY29uZmlnLnR5cGUgIT09IFwidmVyY2VsXCIpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHBvbGxJbnRlcnZhbE1zID1cbiAgICBjb25maWcubGlmZWN5Y2xlPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGlkbGVUaW1lb3V0TXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnN0b3BBZnRlckluYWN0aXZlTXMgPz8gREVGQVVMVF9JRExFX1RJTUVPVVRfTVM7XG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlVGltZW91dE1zID1cbiAgICBjb25maWcubGlmZWN5Y2xlPy5zbmFwc2hvdEJlZm9yZVRpbWVvdXRNcyA/PyBTTkFQU0hPVF9CRUZPUkVfVElNRU9VVF9NUztcblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBsYXN0QWN0aXZpdHkgPSByZWNvcmQubGFzdEFjdGl2aXR5QXQgPz8gcmVjb3JkLmNyZWF0ZWRBdCA/PyBub3c7XG4gIGNvbnN0IGlkbGVEdXJhdGlvbiA9IG5vdyAtIGxhc3RBY3Rpdml0eTtcbiAgY29uc3Qgc2hvdWxkU25hcHNob3REdWVUb0lkbGUgPSBpZGxlRHVyYXRpb24gPiBpZGxlVGltZW91dE1zO1xuXG4gIGxldCBzaG91bGRTbmFwc2hvdER1ZVRvVGltZW91dCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICBzYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICB9KTtcbiAgICBpZiAoc2FuZGJveC50aW1lb3V0IDwgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMpIHtcbiAgICAgIHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgaWYgKHNob3VsZFNuYXBzaG90RHVlVG9JZGxlIHx8IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc2FuZGJveC5zbmFwc2hvdCgpO1xuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgIC4uLnJlY29yZCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlIDogbmV3IEVycm9yKFN0cmluZyhlKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZXhpdFwiLFxuICAgICAgcmVhc29uOiBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA/IFwiaWRsZVwiIDogXCJ0aW1lb3V0XCIsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGFjdGlvbjogXCJjb250aW51ZVwiLCBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyB9O1xufVxuIiwgImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgY2hlY2tBbmRTbmFwc2hvdFN0ZXAgfSBmcm9tIFwiLi9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHNcIjtcblxuZXhwb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfTtcblxuY29uc3QgREVGQVVMVF9QT0xMX01TID0gMiAqIDYwICogMTAwMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyh7XG4gIGlucHV0LFxufToge1xuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0O1xufSkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuXG4gIGxldCBuZXh0UG9sbE1zID0gREVGQVVMVF9QT0xMX01TO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgYXdhaXQgc2xlZXAobmV4dFBvbGxNcyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja0FuZFNuYXBzaG90U3RlcChpbnB1dCk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IgfHwgcmVzdWx0LmFjdGlvbiA9PT0gXCJleGl0XCIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5leHRQb2xsTXMgPSByZXN1bHQubmV4dFBvbGxNcztcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgU2FuZGJveCBhcyBWZXJjZWxTYW5kYm94U0RLIH0gZnJvbSBcIkB2ZXJjZWwvc2FuZGJveFwiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSBcIndvcmtmbG93L2FwaVwiO1xuaW1wb3J0IHsgU2FuZGJveEVycm9yLCBTYW5kYm94Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94UmVjb3JkLCBTdG9yYWdlLCBTdG9yYWdlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RlYnVnXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hTZXR1cE1ldGEgfSBmcm9tIFwiLi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIExvZ0VudHJ5LFxuICBPblJlc3RhcnQsXG4gIFNhbmRib3gsXG4gIFNhbmRib3hMaWZlY3ljbGUsXG4gIFNhbmRib3hMaWZlY3ljbGVJbnB1dCxcbiAgU2FuZGJveFNldHVwLFxuICBTYW5kYm94U3RhdHVzLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyB9IGZyb20gXCIuL2xpZmVjeWNsZS13b3JrZmxvd1wiO1xuXG5leHBvcnQgdHlwZSBWZXJjZWxTYW5kYm94Q3JlYXRlT3B0aW9ucyA9IEV4dHJhY3Q8XG4gIFBhcmFtZXRlcnM8dHlwZW9mIFZlcmNlbFNhbmRib3hTREsuY3JlYXRlPlswXSxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiAuXG4gIHt9XG4+O1xuXG5leHBvcnQgY29uc3QgVkVSQ0VMX01BWF9USU1FT1VUX01TID0gNSAqIDYwICogNjAgKiAxMDAwOyAvLyA1IGhvdXJzXG5jb25zdCBMT0NLX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXMgLSBpZiBsb2NrIG9sZGVyIHRoYW4gdGhpcywgY29uc2lkZXIgaXQgc3RhbGVcbmNvbnN0IExPQ0tfUE9MTF9JTlRFUlZBTF9NUyA9IDIwMDtcblxuY29uc3QgZ2V0VGVzdENyZWRlbnRpYWxzID0gKCkgPT5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXG4gICAgPyB7XG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9UT0tFTixcbiAgICAgICAgdGVhbUlkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9URUFNX0lELFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1BST0pFQ1RfSUQsXG4gICAgICB9XG4gICAgOiB7fTtcblxuLyoqXG4gKiBNb2R1bGUtbGV2ZWwgY2FjaGUgZm9yIGluLWZsaWdodCBzYW5kYm94IGNyZWF0aW9uIHByb21pc2VzLlxuICogUHJldmVudHMgcGFyYWxsZWwgcmVxdWVzdHMgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MgZnJvbSBjcmVhdGluZyBkdXBsaWNhdGUgc2FuZGJveGVzLlxuICovXG5jb25zdCBjcmVhdGVQcm9taXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4+KCk7XG5cbmNvbnN0IEFDVElWSVRZX1RIUk9UVExFX01TID0gMTBfMDAwO1xuY29uc3QgbGFzdEFjdGl2aXR5U2VudCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbmNvbnN0IERFRkFVTFRfVkNQVVMgPSAyO1xuXG5mdW5jdGlvbiBpc1NhbmRib3hHb25lRXJyb3IoZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXJyb3JXaXRoUmVzcG9uc2UgPSBlIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH07XG4gIGNvbnN0IGVycm9yV2l0aENhdXNlID0gZSBhcyB7IGNhdXNlPzogeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSB9O1xuXG4gIGNvbnN0IHN0YXR1cyA9XG4gICAgZXJyb3JXaXRoUmVzcG9uc2UucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgIGVycm9yV2l0aENhdXNlLmNhdXNlPy5yZXNwb25zZT8uc3RhdHVzO1xuXG4gIGlmIChzdGF0dXMgPT09IDQxMCB8fCBzdGF0dXMgPT09IDQyMikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGUubWVzc2FnZSB8fCBTdHJpbmcoZSk7XG4gIGlmIChcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiRXhwZWN0ZWQgYSBzdHJlYW0gb2YgY29tbWFuZCBkYXRhXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIkV4cGVjdGVkIGEgc3RyZWFtIG9mIGxvZ3NcIilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCB2ZXJjZWxTYW5kYm94ID0gPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZUNvbmZpZyxcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3csXG4gIHN0b3JhZ2UsXG4gIHNldHVwLFxuICBvblJlc3RhcnQsXG59OiB7XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQgJiB7IGNvbmZpZzogeyB0eXBlOiBcInZlcmNlbFwiIH0gfTtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3c6IGJvb2xlYW47XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHNldHVwPzogU2FuZGJveFNldHVwO1xuICBvblJlc3RhcnQ/OiBPblJlc3RhcnQ7XG59KTogU2FuZGJveDxUVGFncz4gJiB7XG4gIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgX3NldHVwTWV0YT86IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT47XG59ID0+IHtcbiAgY29uc3QgeyBpZCwgY29uZmlnIH0gPSBzYW5kYm94UmVjb3JkO1xuICBjb25zdCB2Y3B1cyA9IGNvbmZpZy5yZXNvdXJjZXM/LnZjcHVzID8/IERFRkFVTFRfVkNQVVM7XG4gIGNvbnN0IHBvcnRzID0gY29uZmlnLnBvcnRzO1xuICBjb25zdCBuZXR3b3JrUG9saWN5ID0gY29uZmlnLm5ldHdvcmtQb2xpY3k7XG4gIGNvbnN0IGluaXRpYWxWZXJjZWwgPVxuICAgIHNhbmRib3hSZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgID8gc2FuZGJveFJlY29yZC5wcm92aWRlck1ldGFkYXRhXG4gICAgICA6IG51bGw7XG5cbiAgdHlwZSBTYW5kYm94SW5zdGFuY2UgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIFZlcmNlbFNhbmRib3hTREsuZ2V0Pj47XG4gIGxldCBzYW5kYm94UHJvbWlzZTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBTYW5kYm94SW5zdGFuY2U+IHwgbnVsbCA9IG51bGw7XG4gIGxldCByZWNvdmVyZWRGcm9tU3RhbGUgPSBmYWxzZTtcbiAgbGV0IGNyZWF0ZWRGcm9tU25hcHNob3QgPSBmYWxzZTtcbiAgbGV0IG5lZWRzU2V0dXBSdW4gPSBmYWxzZTtcbiAgY29uc3QgSE9NRV9ESVIgPSBcIi9ob21lL3ZlcmNlbC1zYW5kYm94XCI7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcG9sbEZvclNhbmRib3hJZCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIExPQ0tfVElNRU9VVF9NUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBMT0NLX1BPTExfSU5URVJWQUxfTVMpKTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiByZWNvcmQubWVzc2FnZSwgY2F1c2U6IHJlY29yZCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZlcmNlbFNhbmRib3hJZCA9XG4gICAgICAgIHJlY29yZD8ucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgICA/IHJlY29yZC5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIGlmICh2ZXJjZWxTYW5kYm94SWQpIHtcbiAgICAgICAgcmV0dXJuIHZlcmNlbFNhbmRib3hJZDtcbiAgICAgIH1cbiAgICAgIGlmICghcmVjb3JkPy5hY3F1aXJpbmdMb2NrQXQpIHtcbiAgICAgICAgY29uc3QgZmluYWxDaGVjayA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICBpZiAoZmluYWxDaGVjayBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgICAgICAgcmVhc29uOiBmaW5hbENoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICBjYXVzZTogZmluYWxDaGVjayxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaW5hbFZlcmNlbFNhbmRib3hJZCA9XG4gICAgICAgICAgZmluYWxDaGVjaz8ucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgICAgID8gZmluYWxDaGVjay5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAoZmluYWxWZXJjZWxTYW5kYm94SWQpIHtcbiAgICAgICAgICByZXR1cm4gZmluYWxWZXJjZWxTYW5kYm94SWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvR2V0T3JDcmVhdGVTYW5kYm94SWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgcmVhc29uOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBzYW5kYm94IGNyZWF0aW9uIGJ5IGFub3RoZXIgcHJvY2Vzc1wiLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnRMaWZlY3ljbGVXb3JrZmxvdyhcbiAgICB2ZXJjZWxTYW5kYm94SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWVuYWJsZUxpZmVjeWNsZVdvcmtmbG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxpZmVjeWNsZUlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgPSB7XG4gICAgICBpZCxcbiAgICAgIHZlcmNlbFNhbmRib3hJZCxcbiAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgfTtcbiAgICBhd2FpdCBzdGFydChzYW5kYm94TGlmZWN5Y2xlV29ya2Zsb3csIFt7IGlucHV0OiBsaWZlY3ljbGVJbnB1dCB9XSkuY2F0Y2goXG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRW1wdHlCbG9ja1N0YXRlbWVudHM6IGludGVudGlvbmFsbHkgaWdub3JlZCAtIHdvcmtmbG93IHN0YXJ0IGlzIGZpcmUtYW5kLWZvcmdldFxuICAgICAgKCkgPT4ge31cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2FuZGJveEZyb21TbmFwc2hvdChcbiAgICBzbmFwc2hvdElkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgVmVyY2VsU2FuZGJveFNESy5jcmVhdGUoe1xuICAgICAgICAgIHNvdXJjZTogeyB0eXBlOiBcInNuYXBzaG90XCIsIHNuYXBzaG90SWQgfSxcbiAgICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgICB0aW1lb3V0OiBWRVJDRUxfTUFYX1RJTUVPVVRfTVMsXG4gICAgICAgICAgcG9ydHMsXG4gICAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICB0YWdzOiBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LnNhbmRib3hJZCxcbiAgICAgICAgICAgIHNuYXBzaG90SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHN0YXJ0TGlmZWN5Y2xlV29ya2Zsb3coc2FuZGJveC5zYW5kYm94SWQpO1xuICAgICAgICByZXR1cm4gc2FuZGJveC5zYW5kYm94SWQ7XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRnJlc2hTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuY3JlYXRlKHtcbiAgICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgICB0aW1lb3V0OiBWRVJDRUxfTUFYX1RJTUVPVVRfTVMsXG4gICAgICAgICAgcG9ydHMsXG4gICAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICB0YWdzOiBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LnNhbmRib3hJZCxcbiAgICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHN0YXJ0TGlmZWN5Y2xlV29ya2Zsb3coc2FuZGJveC5zYW5kYm94SWQpO1xuICAgICAgICByZXR1cm4gc2FuZGJveC5zYW5kYm94SWQ7XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcmUgZXhlYyBsb2dpYyBhZ2FpbnN0IGEgcmF3IFZlcmNlbCBTREsgaW5zdGFuY2UuXG4gICAqIFNoYXJlZCBiZXR3ZWVuIHRoZSBtYWluIHNhbmRib3ggd3JhcHBlciBhbmQgdGVtcG9yYXJ5IHNldHVwIHNhbmRib3hlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGV4ZWNPbkluc3RhbmNlKFxuICAgIGluc3RhbmNlOiBTYW5kYm94SW5zdGFuY2UsXG4gICAge1xuICAgICAgY29tbWFuZCxcbiAgICAgIGFyZ3MsXG4gICAgICBzaWduYWwsXG4gICAgfTogeyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M/OiBzdHJpbmdbXTsgc2lnbmFsPzogQWJvcnRTaWduYWwgfVxuICApOiBQcm9taXNlPFxuICAgIHwgU2FuZGJveEVycm9yXG4gICAgfCB7XG4gICAgICAgIGNvbW1hbmRJZDogc3RyaW5nO1xuICAgICAgICBsb2dzOiAoKSA9PiBBc3luY0l0ZXJhYmxlPExvZ0VudHJ5PjtcbiAgICAgICAgcmVzdWx0OiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0+O1xuICAgICAgfVxuICA+IHtcbiAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBpbnN0YW5jZS5ydW5Db21tYW5kKHtcbiAgICAgICAgICBjd2Q6IEhPTUVfRElSLFxuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgY21kOiBjb21tYW5kLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHN0ZG91dCA9IFwiXCI7XG4gICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgICAgICBjb25zdCBsb2dCdWZmZXI6IExvZ0VudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgcmVzb2x2ZTogbnVsbCBhcyAoKCkgPT4gdm9pZCkgfCBudWxsLFxuICAgICAgICAgIGNvbnN1bWVkOiBmYWxzZSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjb25zdW1lTG9ncyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbG9nIG9mIG91dHB1dC5sb2dzKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID1cbiAgICAgICAgICAgICAgICBsb2cuc3RyZWFtID09PSBcInN0ZG91dFwiXG4gICAgICAgICAgICAgICAgICA/IHsgc3RyZWFtOiBcInN0ZG91dFwiLCBkYXRhOiBsb2cuZGF0YSB9XG4gICAgICAgICAgICAgICAgICA6IHsgc3RyZWFtOiBcInN0ZGVyclwiLCBkYXRhOiBsb2cuZGF0YSB9O1xuXG4gICAgICAgICAgICAgIGlmIChsb2cuc3RyZWFtID09PSBcInN0ZG91dFwiKSB7XG4gICAgICAgICAgICAgICAgc3Rkb3V0ICs9IGxvZy5kYXRhO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0ZGVyciArPSBsb2cuZGF0YTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxvZ0J1ZmZlci5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgc3RhdGUucmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBTYW5kYm94IG1heSBoYXZlIGJlZW4gc3RvcHBlZCAtIGxvZ3MgZW5kcG9pbnQgcmV0dXJucyA0MjJcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUuY29uc3VtZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmU/LigpO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8TG9nRW50cnk+IHtcbiAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICghc3RhdGUuY29uc3VtZWQgfHwgaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHlpZWxkIGxvZ0J1ZmZlcltpbmRleCsrXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdGUucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb25zdW1lTG9ncy50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmluaXNoZWQgPSBhd2FpdCBvdXRwdXQud2FpdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICAgIGV4aXRDb2RlOiBmaW5pc2hlZC5leGl0Q29kZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGlzU2FuZGJveEdvbmVFcnJvcihlKSkge1xuICAgICAgICAgICAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IDEgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBjb21tYW5kSWQ6IG91dHB1dC5jbWRJZCwgbG9ncywgcmVzdWx0IH07XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEZpbGVPbkluc3RhbmNlKFxuICAgIGluc3RhbmNlOiBTYW5kYm94SW5zdGFuY2UsXG4gICAgeyBwYXRoIH06IHsgcGF0aDogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBCdWZmZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6ICgpID0+IGluc3RhbmNlLnJlYWRGaWxlVG9CdWZmZXIoeyBwYXRoLCBjd2Q6IEhPTUVfRElSIH0pLFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlc09uSW5zdGFuY2UoXG4gICAgaW5zdGFuY2U6IFNhbmRib3hJbnN0YW5jZSxcbiAgICBvcHRzOiB7XG4gICAgICBmaWxlczogeyBwYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB8IEJ1ZmZlciB9W107XG4gICAgICBkZXN0UGF0aDogc3RyaW5nO1xuICAgIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmaWxlcywgZGVzdFBhdGggfSA9IG9wdHM7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5hdGl2ZUZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucG9zaXguam9pbihkZXN0UGF0aCwgZmlsZS5wYXRoKTtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucG9zaXguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgICAgPyBmaWxlUGF0aFxuICAgICAgICA6IHBhdGgucG9zaXguam9pbihIT01FX0RJUiwgZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgICBjb250ZW50OlxuICAgICAgICAgIHR5cGVvZiBmaWxlLmNvbnRlbnQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gQnVmZmVyLmZyb20oZmlsZS5jb250ZW50KVxuICAgICAgICAgICAgOiBmaWxlLmNvbnRlbnQsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgaW5zdGFuY2Uud3JpdGVGaWxlcyhuYXRpdmVGaWxlcyk7XG5cbiAgICBjb25zdCBzaGVsbFNjcmlwdHMgPSBuYXRpdmVGaWxlcy5maWx0ZXIoKGYpID0+IGYucGF0aC5lbmRzV2l0aChcIi5zaFwiKSk7XG4gICAgaWYgKHNoZWxsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaG1vZFJlc3VsdCA9IGF3YWl0IGV4ZWNPbkluc3RhbmNlKGluc3RhbmNlLCB7XG4gICAgICAgIGNvbW1hbmQ6IFwiY2htb2RcIixcbiAgICAgICAgYXJnczogW1wiK3hcIiwgLi4uc2hlbGxTY3JpcHRzLm1hcCgoZikgPT4gZi5wYXRoKV0sXG4gICAgICB9KTtcbiAgICAgIGlmIChjaG1vZFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGNobW9kUmVzdWx0O1xuICAgICAgfVxuICAgICAgYXdhaXQgY2htb2RSZXN1bHQucmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbWluaW1hbCBTYW5kYm94IHdyYXBwZXIgYXJvdW5kIGEgcmF3IFZlcmNlbCBTREsgaW5zdGFuY2UuXG4gICAqIFVzZWQgZm9yIHJ1bm5pbmcgc2V0dXAucnVuKCkgb24gYSB0ZW1wb3Jhcnkgc2FuZGJveCBmb3Igc25hcHNob3QgY3JlYXRpb24uXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVUZW1wU2FuZGJveChpbnN0YW5jZTogU2FuZGJveEluc3RhbmNlKTogU2FuZGJveCB7XG4gICAgY29uc3QgdGVtcFNhbmRib3g6IFNhbmRib3ggPSB7XG4gICAgICBpZDogYF9fc2V0dXBfdGVtcF8ke0RhdGUubm93KCl9YCxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGV4ZWM6IChvcHRzKSA9PiBleGVjT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyksXG4gICAgICByZWFkRmlsZTogKG9wdHMpID0+IHJlYWRGaWxlT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyksXG4gICAgICBnZXREb21haW46ICgpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBcIm5vdCBhdmFpbGFibGUgZHVyaW5nIHNldHVwXCIgfSlcbiAgICAgICAgKSxcbiAgICAgIGtpbGw6ICgpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBcIm5vdCBhdmFpbGFibGUgZHVyaW5nIHNldHVwXCIgfSlcbiAgICAgICAgKSxcbiAgICAgIHdyaXRlRmlsZXM6IChvcHRzKSA9PiB3cml0ZUZpbGVzT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyksXG4gICAgICB1cGRhdGVOZXR3b3JrUG9saWN5OiAocG9saWN5KSA9PlxuICAgICAgICBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICAgIHRyeTogKCkgPT4gaW5zdGFuY2UudXBkYXRlTmV0d29ya1BvbGljeShwb2xpY3kpLFxuICAgICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgICAgfSksXG4gICAgICB0YWc6IHtcbiAgICAgICAgbGlzdDogYXN5bmMgKCkgPT4gKHt9KSBhcyBUVGFncyxcbiAgICAgICAgZ2V0OiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIHNldDogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICBzZXRNYW55OiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHRlbXBTYW5kYm94O1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIGZvciBhIHNldHVwIHNuYXBzaG90IHRvIGJlY29tZSBhdmFpbGFibGUuIFJldHVybnMgdGhlIHNuYXBzaG90SWRcbiAgICogaWYgb25lIGFwcGVhcnMgYmVmb3JlIHRoZSBsb2NrIHRpbWVzIG91dCwgb3IgbnVsbCBpZiBpdCBkb2Vzbid0LlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gcG9sbEZvclNldHVwU25hcHNob3Qoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBMT0NLX1RJTUVPVVRfTVM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgTE9DS19QT0xMX0lOVEVSVkFMX01TKSk7XG4gICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChrZXkpO1xuICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHJlY29yZD8uc25hcHNob3RJZCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkLnNuYXBzaG90SWQ7XG4gICAgICB9XG4gICAgICAvLyBMb2NrIHJlbGVhc2VkIGJ1dCBubyBzbmFwc2hvdCBcdTIwMTQgY3JlYXRpb24gZmFpbGVkXG4gICAgICBpZiAoIXJlY29yZD8uYWNxdWlyaW5nTG9ja0lkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYmFja2dyb3VuZCBzYW5kYm94LCBydW5zIHNldHVwLCBzbmFwc2hvdHMgaXQsIGFuZCBzdG9yZXMgdGhlXG4gICAqIHNuYXBzaG90IElELiBVc2VzIGF0b21pYyBsb2NraW5nIHRvIGVuc3VyZSBvbmx5IG9uZSBwcm9jZXNzIGNyZWF0ZXMgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JjZSAtIFNraXAgdGhlIFwic25hcHNob3QgYWxyZWFkeSBleGlzdHNcIiBlYXJseSBleGl0LiBVc2VkIHdoZW5cbiAgICogICB0aGUgY2FsbGVyIGtub3dzIHRoZSBleGlzdGluZyBzbmFwc2hvdCBpcyBzdGFsZS9leHBpcmVkLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2V0dXBTbmFwc2hvdChvcHRzPzoge1xuICAgIGZvcmNlPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc2V0dXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2V0dXBLZXkgPSBzZXR1cC5rZXk7XG5cbiAgICAvLyBDaGVjayBpZiBzbmFwc2hvdCBhbHJlYWR5IGV4aXN0cyAoZmFzdCBwYXRoIFx1MjAxNCBhdm9pZHMgbG9jayBhdHRlbXB0KVxuICAgIGlmICghb3B0cz8uZm9yY2UpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zZXR1cC5nZXQoc2V0dXBLZXkpO1xuICAgICAgaWYgKCEoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvcikgJiYgZXhpc3Rpbmc/LnNuYXBzaG90SWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF0b21pY2FsbHkgYWNxdWlyZSBsb2NrIChoYW5kbGVzIGFjdGl2ZS1sb2NrIGRldGVjdGlvbiBpbnRlcm5hbGx5KVxuICAgIGRlYnVnKGBbc2FuZGJveDpzZXR1cF0gYWNxdWlyaW5nIGxvY2sgZm9yIHNldHVwIGtleSBcIiR7c2V0dXBLZXl9XCJgKTtcbiAgICBjb25zdCBsb2NrSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IGxvY2tlZCA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuYWNxdWlyZUxvY2soXG4gICAgICBzZXR1cEtleSxcbiAgICAgIGxvY2tJZCxcbiAgICAgIExPQ0tfVElNRU9VVF9NU1xuICAgICk7XG4gICAgaWYgKGxvY2tlZCBpbnN0YW5jZW9mIEVycm9yIHx8ICFsb2NrZWQpIHtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIGxvY2sgbm90IGFjcXVpcmVkIGZvciBrZXkgXCIke3NldHVwS2V5fVwiIChhbm90aGVyIHByb2Nlc3MgaG9sZHMgaXQpYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZS1jaGVjazogYW5vdGhlciB3b3JrZXIgbWF5IGhhdmUgY3JlYXRlZCB0aGUgc25hcHNob3QgYmV0d2VlbiBvdXJcbiAgICAvLyBwcmUtY2hlY2sgYW5kIGxvY2sgYWNxdWlzaXRpb24uIElmIHNvLCBza2lwIHVubGVzcyBmb3JjZSAoc3RhbGUgc25hcHNob3QpLlxuICAgIGlmICghb3B0cz8uZm9yY2UgJiYgbG9ja2VkLnNuYXBzaG90SWQpIHtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNuYXBzaG90IGFscmVhZHkgZXhpc3RzIGFmdGVyIGxvY2sgZm9yIGtleSBcIiR7c2V0dXBLZXl9XCIsIHNraXBwaW5nYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGVtcEluc3RhbmNlOiBBd2FpdGVkPFxuICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgVmVyY2VsU2FuZGJveFNESy5jcmVhdGU+XG4gICAgPiB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSB0ZW1wb3Jhcnkgc2FuZGJveCBmb3Igc25hcHNob3R0aW5nLlxuICAgICAgZGVidWcoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gY3JlYXRpbmcgdGVtcCBzYW5kYm94IGZvciBzbmFwc2hvdCAoa2V5PVwiJHtzZXR1cEtleX1cIilgXG4gICAgICApO1xuICAgICAgdGVtcEluc3RhbmNlID0gYXdhaXQgVmVyY2VsU2FuZGJveFNESy5jcmVhdGUoe1xuICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgdGltZW91dDogVkVSQ0VMX01BWF9USU1FT1VUX01TLFxuICAgICAgICBwb3J0cyxcbiAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcFNhbmRib3ggPSBjcmVhdGVUZW1wU2FuZGJveChcbiAgICAgICAgdGVtcEluc3RhbmNlIGFzIHVua25vd24gYXMgU2FuZGJveEluc3RhbmNlXG4gICAgICApO1xuICAgICAgYXdhaXQgc2V0dXAucnVuKHRlbXBTYW5kYm94KTtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNldHVwLnJ1biBjb21wbGV0ZSwgc25hcHNob3R0aW5nIChrZXk9XCIke3NldHVwS2V5fVwiKWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRlbXBJbnN0YW5jZS5zbmFwc2hvdCgpO1xuXG4gICAgICBhd2FpdCBzdG9yYWdlLnNldHVwLnNldCh7XG4gICAgICAgIGtleTogc2V0dXBLZXksXG4gICAgICAgIHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQsXG4gICAgICAgIGNyZWF0ZWRBdDogbG9ja2VkLmNyZWF0ZWRBdCxcbiAgICAgICAgbGFzdFVzZWRBdDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICB9KTtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNuYXBzaG90IHN0b3JlZDogJHtzbmFwc2hvdC5zbmFwc2hvdElkfSAoa2V5PVwiJHtzZXR1cEtleX1cIilgXG4gICAgICApO1xuXG4gICAgICAvLyBTdG9wIHRoZSB0ZW1wIHNhbmRib3ggXHUyMDE0IG5vIGxvbmdlciBuZWVkZWQgYWZ0ZXIgc25hcHNob3R0aW5nXG4gICAgICBhd2FpdCB0ZW1wSW5zdGFuY2Uuc3RvcCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBmYWlsZWQgdG8gY3JlYXRlIHNldHVwIHNuYXBzaG90IChrZXk9XCIke3NldHVwS2V5fVwiKTpgLFxuICAgICAgICBlXG4gICAgICApO1xuICAgICAgLy8gU3RvcCB0aGUgdGVtcCBzYW5kYm94IG9uIGZhaWx1cmVcbiAgICAgIGlmICh0ZW1wSW5zdGFuY2UpIHtcbiAgICAgICAgYXdhaXQgdGVtcEluc3RhbmNlLnN0b3AoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gdXAgbG9jayBvbiBmYWlsdXJlXG4gICAgICBhd2FpdCBzdG9yYWdlLnNldHVwXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGtleTogc2V0dXBLZXksXG4gICAgICAgICAgc25hcHNob3RJZDogbnVsbCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGxvY2tlZC5jcmVhdGVkQXQsXG4gICAgICAgICAgbGFzdFVzZWRBdDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkb0dldE9yQ3JlYXRlU2FuZGJveElkKCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgaWYgKGluaXRpYWxWZXJjZWw/LnNhbmRib3hJZCAmJiAhcmVjb3ZlcmVkRnJvbVN0YWxlKSB7XG4gICAgICByZXR1cm4gaW5pdGlhbFZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgU2FuZGJveE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgLy8gU2FuZGJveCBkb2Vzbid0IGV4aXN0IHlldCwgY29udGludWUgd2l0aCBjcmVhdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGV4aXN0aW5nLm1lc3NhZ2UsIGNhdXNlOiBleGlzdGluZyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9XG4gICAgICBleGlzdGluZyBpbnN0YW5jZW9mIFNhbmRib3hOb3RGb3VuZEVycm9yID8gbnVsbCA6IGV4aXN0aW5nO1xuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nUmVjb3JkPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGV4aXN0aW5nUmVjb3JkLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGV4aXN0aW5nVmVyY2VsPy5zYW5kYm94SWQpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ1ZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQWN0aXZlTG9jayA9XG4gICAgICBleGlzdGluZ1JlY29yZD8uYWNxdWlyaW5nTG9ja0lkICYmXG4gICAgICBleGlzdGluZ1JlY29yZC5hY3F1aXJpbmdMb2NrQXQgJiZcbiAgICAgIERhdGUubm93KCkgLSBleGlzdGluZ1JlY29yZC5hY3F1aXJpbmdMb2NrQXQgPCBMT0NLX1RJTUVPVVRfTVM7XG5cbiAgICBpZiAoaGFzQWN0aXZlTG9jaykge1xuICAgICAgcmV0dXJuIHBvbGxGb3JTYW5kYm94SWQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NrSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgbG9ja2VkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmFjcXVpcmVMb2NrKFxuICAgICAge1xuICAgICAgICBpZCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB0YWdzOiBleGlzdGluZ1JlY29yZD8udGFncyA/PyBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmdSZWNvcmQ/LmNyZWF0ZWRBdCA/PyBzYW5kYm94UmVjb3JkLmNyZWF0ZWRBdCxcbiAgICAgICAgbGFzdEFjdGl2aXR5QXQ6XG4gICAgICAgICAgZXhpc3RpbmdSZWNvcmQ/Lmxhc3RBY3Rpdml0eUF0ID8/IHNhbmRib3hSZWNvcmQubGFzdEFjdGl2aXR5QXQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbG9ja0lkLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG5vdyxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICBzbmFwc2hvdElkOlxuICAgICAgICAgICAgZXhpc3RpbmdWZXJjZWw/LnNuYXBzaG90SWQgPz8gaW5pdGlhbFZlcmNlbD8uc25hcHNob3RJZCA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIExPQ0tfVElNRU9VVF9NU1xuICAgICk7XG5cbiAgICBpZiAobG9ja2VkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBsb2NrZWQubWVzc2FnZSwgY2F1c2U6IGxvY2tlZCB9KTtcbiAgICB9XG4gICAgaWYgKCFsb2NrZWQpIHtcbiAgICAgIHJldHVybiBwb2xsRm9yU2FuZGJveElkKCk7XG4gICAgfVxuXG4gICAgLy8gQ2FwdHVyZSB0aGUgbG9ja2VkIHJlY29yZCBmb3IgdXNlIGluIHRoZSByZWxlYXNlIGhlbHBlci5cbiAgICAvLyBUUyBjYW4ndCBuYXJyb3cgYGxvY2tlZGAgaW5zaWRlIG5lc3RlZCBmdW5jdGlvbnMsIHNvIHdlIGJpbmQgaXQgaGVyZS5cbiAgICBjb25zdCBsb2NrZWRSZWNvcmQgPSBsb2NrZWQ7XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBzYW5kYm94IGxvY2sgc28gb3RoZXIgd29ya2VycyBjYW4gcmV0cnkgcXVpY2tseVxuICAgIC8vIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgbG9jayB0aW1lb3V0LlxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VTYW5kYm94TG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveFxuICAgICAgICAuc2V0KHtcbiAgICAgICAgICAuLi5sb2NrZWRSZWNvcmQsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLy8gUmUtY2hlY2sgYWZ0ZXIgbG9jazogYW5vdGhlciB3b3JrZXIgbWF5IGhhdmUgY3JlYXRlZCB0aGUgc2FuZGJveFxuICAgIC8vIGJldHdlZW4gb3VyIGluaXRpYWwgY2hlY2sgYW5kIGxvY2sgYWNxdWlzaXRpb24uXG4gICAgY29uc3QgbG9ja2VkVmVyY2VsID1cbiAgICAgIGxvY2tlZFJlY29yZC5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGxvY2tlZFJlY29yZC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAobG9ja2VkVmVyY2VsPy5zYW5kYm94SWQpIHtcbiAgICAgIGF3YWl0IHJlbGVhc2VTYW5kYm94TG9jaygpO1xuICAgICAgcmV0dXJuIGxvY2tlZFZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc25hcHNob3RJZCA9XG4gICAgICBsb2NrZWRWZXJjZWw/LnNuYXBzaG90SWQgPz9cbiAgICAgIGluaXRpYWxWZXJjZWw/LnNuYXBzaG90SWQgPz9cbiAgICAgIGNvbmZpZy5saWZlY3ljbGU/LnNuYXBzaG90SWQ7XG4gICAgaWYgKHNuYXBzaG90SWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3Qoc25hcHNob3RJZCk7XG4gICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgY3JlYXRlZEZyb21TbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHNldHVwIHNuYXBzaG90XG4gICAgaWYgKHNldHVwKSB7XG4gICAgICBsZXQgZm9yY2VSZWNyZWF0ZVNuYXBzaG90ID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR1cFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuZ2V0KHNldHVwLmtleSk7XG4gICAgICBpZiAoIShzZXR1cFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSAmJiBzZXR1cFJlY29yZCkge1xuICAgICAgICBpZiAoc2V0dXBSZWNvcmQuc25hcHNob3RJZCkge1xuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBmb3VuZCBzZXR1cCBzbmFwc2hvdCAke3NldHVwUmVjb3JkLnNuYXBzaG90SWR9IGZvciBrZXkgXCIke3NldHVwLmtleX1cImBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3QoXG4gICAgICAgICAgICBzZXR1cFJlY29yZC5zbmFwc2hvdElkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgIGNyZWF0ZWRGcm9tU25hcHNob3QgPSB0cnVlO1xuICAgICAgICAgICAgLy8gVXBkYXRlIGxhc3RVc2VkQXQgKGZpcmUtYW5kLWZvcmdldClcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0dXBcbiAgICAgICAgICAgICAgLnNldCh7XG4gICAgICAgICAgICAgICAgLi4uc2V0dXBSZWNvcmQsXG4gICAgICAgICAgICAgICAgbGFzdFVzZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTbmFwc2hvdCBpcyBzdGFsZS9leHBpcmVkIFx1MjAxNCBmb3JjZSBiYWNrZ3JvdW5kIHRvIG92ZXJ3cml0ZSBpdFxuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCAke3NldHVwUmVjb3JkLnNuYXBzaG90SWR9IGZhaWxlZCAoZXhwaXJlZD8pLCB3aWxsIHJlY3JlYXRlYFxuICAgICAgICAgICk7XG4gICAgICAgICAgZm9yY2VSZWNyZWF0ZVNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBzZXR1cFJlY29yZC5hY3F1aXJpbmdMb2NrSWQgJiZcbiAgICAgICAgICBzZXR1cFJlY29yZC5hY3F1aXJpbmdMb2NrQXQgJiZcbiAgICAgICAgICBEYXRlLm5vdygpIC0gc2V0dXBSZWNvcmQuYWNxdWlyaW5nTG9ja0F0IDwgTE9DS19USU1FT1VUX01TXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEFub3RoZXIgcHJvY2VzcyBpcyBjcmVhdGluZyB0aGUgc2V0dXAgc25hcHNob3QgXHUyMDE0IHdhaXQgZm9yIGl0XG4gICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNuYXBzaG90IGluIHByb2dyZXNzIGZvciBrZXkgXCIke3NldHVwLmtleX1cIiwgd2FpdGluZy4uLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNuYXBzaG90SWQgPSBhd2FpdCBwb2xsRm9yU2V0dXBTbmFwc2hvdChzZXR1cC5rZXkpO1xuICAgICAgICAgIGlmIChzbmFwc2hvdElkKSB7XG4gICAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCByZWFkeTogJHtzbmFwc2hvdElkfSBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlU2FuZGJveEZyb21TbmFwc2hvdChzbmFwc2hvdElkKTtcbiAgICAgICAgICAgIGlmICghKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgICAgICBjcmVhdGVkRnJvbVNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUG9sbCBmYWlsZWQgb3Igc25hcHNob3QgY3JlYXRpb24gZmFpbGVkIFx1MjAxNCBmYWxsIHRocm91Z2ggdG8gY29sZCBwYXRoXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE5vIHNldHVwIHNuYXBzaG90IGF2YWlsYWJsZSBcdTIwMTQgY3JlYXRlIGZyZXNoIGFuZCBydW4gc2V0dXAgbGF0ZXIuXG4gICAgICAvLyBLaWNrIG9mZiBiYWNrZ3JvdW5kIHNuYXBzaG90IGltbWVkaWF0ZWx5IHNvIGl0IHJ1bnMgaW4gcGFyYWxsZWxcbiAgICAgIC8vIHdpdGggc2V0dXAucnVuIG9uIHRoZSBzZXNzaW9uIHNhbmRib3guXG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBubyBzbmFwc2hvdCBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCIsIHdpbGwgcnVuIHNldHVwIG9uIHRoaXMgc2FuZGJveGBcbiAgICAgICk7XG4gICAgICBuZWVkc1NldHVwUnVuID0gdHJ1ZTtcbiAgICAgIGNyZWF0ZVNldHVwU25hcHNob3QoeyBmb3JjZTogZm9yY2VSZWNyZWF0ZVNuYXBzaG90IH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJbc2FuZGJveDpzZXR1cF0gZmFpbGVkIHRvIGNyZWF0ZSBiYWNrZ3JvdW5kIHNuYXBzaG90OlwiLFxuICAgICAgICAgIGVcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZyZXNoUmVzdWx0ID0gYXdhaXQgY3JlYXRlRnJlc2hTYW5kYm94KCk7XG4gICAgaWYgKGZyZXNoUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGF3YWl0IHJlbGVhc2VTYW5kYm94TG9jaygpO1xuICAgIH1cbiAgICByZXR1cm4gZnJlc2hSZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRPckNyZWF0ZVNhbmRib3hJZCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IGNyZWF0ZVByb21pc2VzLmdldChpZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gZG9HZXRPckNyZWF0ZVNhbmRib3hJZCgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgY3JlYXRlUHJvbWlzZXMuZGVsZXRlKGlkKTtcbiAgICB9KTtcbiAgICBjcmVhdGVQcm9taXNlcy5zZXQoaWQsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZG9HZXRTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB7XG4gICAgY29uc3QgdmVyY2VsU2FuZGJveElkID0gYXdhaXQgZ2V0T3JDcmVhdGVTYW5kYm94SWQoKTtcbiAgICBpZiAodmVyY2VsU2FuZGJveElkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiB2ZXJjZWxTYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6ICgpID0+XG4gICAgICAgIFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHZlcmNlbFNhbmRib3hJZCxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSksXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB7XG4gICAgaWYgKCFzYW5kYm94UHJvbWlzZSkge1xuICAgICAgc2FuZGJveFByb21pc2UgPSBkb0dldFNhbmRib3goKTtcbiAgICB9XG4gICAgcmV0dXJuIHNhbmRib3hQcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlckZyb21TdGFsZVNhbmRib3goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc2FuZGJveFByb21pc2UgPSBudWxsO1xuICAgIHJlY292ZXJlZEZyb21TdGFsZSA9IHRydWU7XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yIHx8ICFleGlzdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG5cbiAgICBpZiAoZXhpc3RpbmdWZXJjZWw/LnNhbmRib3hJZCkge1xuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgIGlkOiBleGlzdGluZy5pZCxcbiAgICAgICAgY29uZmlnOiBleGlzdGluZy5jb25maWcsXG4gICAgICAgIHRhZ3M6IGV4aXN0aW5nLnRhZ3MsXG4gICAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmcuY3JlYXRlZEF0LFxuICAgICAgICBsYXN0QWN0aXZpdHlBdDogZXhpc3RpbmcubGFzdEFjdGl2aXR5QXQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgIHNuYXBzaG90SWQ6IGV4aXN0aW5nVmVyY2VsLnNuYXBzaG90SWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVMYXN0QWN0aXZpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsYXN0U2VudCA9IGxhc3RBY3Rpdml0eVNlbnQuZ2V0KGlkKTtcbiAgICBpZiAobGFzdFNlbnQgJiYgbm93IC0gbGFzdFNlbnQgPCBBQ1RJVklUWV9USFJPVFRMRV9NUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0QWN0aXZpdHlTZW50LnNldChpZCwgbm93KTtcblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgfHwgIWV4aXN0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG4gICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICBpZDogZXhpc3RpbmcuaWQsXG4gICAgICBjb25maWc6IGV4aXN0aW5nLmNvbmZpZyxcbiAgICAgIHRhZ3M6IGV4aXN0aW5nLnRhZ3MsXG4gICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nLmNyZWF0ZWRBdCxcbiAgICAgIGxhc3RBY3Rpdml0eUF0OiBub3csXG4gICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICBwcm92aWRlck1ldGFkYXRhOiBleGlzdGluZ1ZlcmNlbCA/PyB7XG4gICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbGlmZWN5Y2xlOiBTYW5kYm94TGlmZWN5Y2xlID0ge1xuICAgIHN0YXJ0OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHVwZGF0ZUxhc3RBY3Rpdml0eSgpO1xuICAgICAgcmV0dXJuIHNhbmRib3guc3RhdHVzIGFzIFNhbmRib3hTdGF0dXM7XG4gICAgfSxcblxuICAgIHNuYXBzaG90OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBzYW5kYm94LnNuYXBzaG90KCk7XG4gICAgICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHRhZ3M6IGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgPyBudWxsIDogKGV4aXN0aW5nPy50YWdzID8/IG51bGwpLFxuICAgICAgICAgICAgY3JlYXRlZEF0OlxuICAgICAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yID8gbnVsbCA6IChleGlzdGluZz8uY3JlYXRlZEF0ID8/IG51bGwpLFxuICAgICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6XG4gICAgICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IChleGlzdGluZz8ubGFzdEFjdGl2aXR5QXQgPz8gbnVsbCksXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgICAgIHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7IHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHN0b3A6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgc2FuZGJveC5zdG9wKCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciB8fCAhZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgICAgaWQ6IGV4aXN0aW5nLmlkLFxuICAgICAgICAgICAgY29uZmlnOiBleGlzdGluZy5jb25maWcsXG4gICAgICAgICAgICB0YWdzOiBleGlzdGluZy50YWdzLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBleGlzdGluZy5jcmVhdGVkQXQsXG4gICAgICAgICAgICBsYXN0QWN0aXZpdHlBdDogZXhpc3RpbmcubGFzdEFjdGl2aXR5QXQsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXRTdGF0dXM6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3guc3RhdHVzIGFzIFNhbmRib3hTdGF0dXM7XG4gICAgfSxcblxuICAgIGdldENyZWF0ZWRBdDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2FuZGJveC5jcmVhdGVkQXQ7XG4gICAgfSxcblxuICAgIGdldFJlbWFpbmluZ1RpbWVvdXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3gudGltZW91dDtcbiAgICB9LFxuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvRXhlYyhvcHRzOiB7XG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIGFyZ3M/OiBzdHJpbmdbXTtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlUHJvbWlzZSA9IHVwZGF0ZUxhc3RBY3Rpdml0eSgpO1xuICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBleGVjT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyk7XG4gICAgYXdhaXQgdXBkYXRlUHJvbWlzZTtcbiAgICByZXR1cm4gZXhlY1Jlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IHNhbmRib3g6IFNhbmRib3g8VFRhZ3M+ICYge1xuICAgIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgICBfc2V0dXBNZXRhPzogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPjtcbiAgfSA9IHtcbiAgICBpZCxcbiAgICBjb25maWcsXG4gICAgZXhlYzogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRvRXhlYyhvcHRzKTtcblxuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFNhbmRib3hFcnJvciAmJiBpc1NhbmRib3hHb25lRXJyb3IocmVzdWx0LmNhdXNlKSkge1xuICAgICAgICBhd2FpdCByZWNvdmVyRnJvbVN0YWxlU2FuZGJveCgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgZG9FeGVjKG9wdHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXREb21haW46IGFzeW5jIChwb3J0KSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3guZG9tYWluKHBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAga2lsbDogYXN5bmMgKHsgY29tbWFuZElkLCBzdG9yYWdlOiBjbWRTdG9yYWdlIH0pID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbWQgPSBhd2FpdCBjbWRTdG9yYWdlLmNvbW1hbmQuZ2V0KGNvbW1hbmRJZCk7XG4gICAgICBpZiAoY21kIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGNtZC5tZXNzYWdlLCBjYXVzZTogY21kIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNtZCAmJiBjbWQuc3RhdHVzID09PSBcInJ1bm5pbmdcIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbWRTdG9yYWdlLmNvbW1hbmQuc2V0KHtcbiAgICAgICAgICAuLi5jbWQsXG4gICAgICAgICAgc3RhdHVzOiBcImtpbGxlZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IHJlc3VsdC5tZXNzYWdlLCBjYXVzZTogcmVzdWx0IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICByZWFkRmlsZTogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlYWRGaWxlT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyk7XG4gICAgfSxcblxuICAgIHdyaXRlRmlsZXM6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGluc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyaXRlRmlsZXNPbkluc3RhbmNlKGluc3RhbmNlLCBvcHRzKTtcbiAgICB9LFxuXG4gICAgbGlmZWN5Y2xlLFxuXG4gICAgdXBkYXRlTmV0d29ya1BvbGljeTogYXN5bmMgKHBvbGljeSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiAoKSA9PiBpbnN0YW5jZS51cGRhdGVOZXR3b3JrUG9saWN5KHBvbGljeSksXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB0YWc6IHtcbiAgICAgIGxpc3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzYW5kYm94UmVjb3JkLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkLnRhZ3M/LltrZXkgYXMgc3RyaW5nXSBhc1xuICAgICAgICAgIHwgVFRhZ3NbdHlwZW9mIGtleV1cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogaWQsXG4gICAgICAgICAgdGFnczogeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogaWQsXG4gICAgICAgICAgdGFnczogdGFncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICBsZXQgb25SZWFkeVByb21pc2U6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgbGV0IHNldHVwTWV0YVByb21pc2U6IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT4gPSBQcm9taXNlLnJlc29sdmUoe1xuICAgIG5lZWRzU2V0dXBSdW46IGZhbHNlLFxuICAgIGNyZWF0ZWRGcm9tU25hcHNob3Q6IGZhbHNlLFxuICB9KTtcblxuICBpZiAoY29uZmlnLmxpZmVjeWNsZT8uYXV0b1N0YXJ0ICE9PSBmYWxzZSkge1xuICAgIHNhbmRib3hQcm9taXNlID0gZG9HZXRTYW5kYm94KCk7XG5cbiAgICAvLyBSZXNvbHZlIHNldHVwIG1ldGFkYXRhIGFzIHNvb24gYXMgdGhlIHNhbmRib3ggaW5zdGFuY2UgaXMgcmVhZHlcbiAgICAvLyAoYmVmb3JlIF9vblJlYWR5IHJ1bnMgc2V0dXApLiBUaGUgd29ya2Zsb3cgcmVhZHMgdGhpcyB0byBjaG9vc2UgdGhlIHN0YXR1cyBpbmRpY2F0b3IuXG4gICAgc2V0dXBNZXRhUHJvbWlzZSA9IHNhbmRib3hQcm9taXNlLnRoZW4oKCkgPT4gKHtcbiAgICAgIG5lZWRzU2V0dXBSdW4sXG4gICAgICBjcmVhdGVkRnJvbVNuYXBzaG90LFxuICAgIH0pKTtcblxuICAgIC8vIEFmdGVyIHNhbmRib3ggaW5zdGFuY2UgaXMgcmVhZHksIHJ1biBzZXR1cCBhbmQvb3Igb25SZXN0YXJ0LlxuICAgIC8vIHNhbmRib3hQcm9taXNlIGlzIGFscmVhZHkgcmVzb2x2ZWQgYnkgdGhlIHRpbWUgLnRoZW4oKSBydW5zLFxuICAgIC8vIHNvIHNldHVwLnJ1biAvIG9uUmVzdGFydCBjYWxsaW5nIHNhbmRib3guZXhlYygpIHdvbid0IGRlYWRsb2NrLlxuICAgIG9uUmVhZHlQcm9taXNlID0gc2FuZGJveFByb21pc2UudGhlbihhc3luYyAoaW5zdGFuY2UpID0+IHtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5lZWRzU2V0dXBSdW4gJiYgc2V0dXApIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBydW5uaW5nIHNldHVwLnJ1biBvbiBzZXNzaW9uIHNhbmRib3ggKGtleT1cIiR7c2V0dXAua2V5fVwiKWBcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2V0dXAucnVuKHNhbmRib3gpO1xuICAgICAgICBkZWJ1ZyhcIltzYW5kYm94OnNldHVwXSBzZXR1cC5ydW4gY29tcGxldGUgb24gc2Vzc2lvbiBzYW5kYm94XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3JlYXRlZEZyb21TbmFwc2hvdCAmJiBvblJlc3RhcnQpIHtcbiAgICAgICAgZGVidWcoXCJbc2FuZGJveDpzZXR1cF0gcnVubmluZyBvblJlc3RhcnQgKGNyZWF0ZWQgZnJvbSBzbmFwc2hvdClcIik7XG4gICAgICAgIGF3YWl0IG9uUmVzdGFydChzYW5kYm94KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNhbmRib3guX29uUmVhZHkgPSBvblJlYWR5UHJvbWlzZTtcbiAgc2FuZGJveC5fc2V0dXBNZXRhID0gc2V0dXBNZXRhUHJvbWlzZTtcbiAgcmV0dXJuIHNhbmRib3g7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94UmVjb3JkLCBTdG9yYWdlLCBTdG9yYWdlQ29uZmlnIH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcIi4uL3V0aWxzL2RlYnVnXCI7XG5pbXBvcnQgeyBsb2NhbFNhbmRib3ggfSBmcm9tIFwiLi9iaW5kaW5ncy9sb2NhbFwiO1xuaW1wb3J0IHsgdmVyY2VsU2FuZGJveCB9IGZyb20gXCIuL2JpbmRpbmdzL3ZlcmNlbFwiO1xuaW1wb3J0IHR5cGUgeyBPblJlc3RhcnQsIFNhbmRib3gsIFNhbmRib3hTZXR1cCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgaG93IHRoZSBzYW5kYm94IHdhcyBzZXQgdXAuXG4gKiBVc2VkIGJ5IHRoZSB3b3JrZmxvdyB0byBlbWl0IHRoZSBjb3JyZWN0IHN0YXR1cyBpbmRpY2F0b3IuXG4gKiBSZXR1cm5lZCBhcyBhIHByb21pc2UgYmVjYXVzZSB0aGUgbWV0YWRhdGEgaXMgZGV0ZXJtaW5lZCBhc3luY2hyb25vdXNseVxuICogZHVyaW5nIHNhbmRib3ggY3JlYXRpb24sIGJlZm9yZSBfb25SZWFkeSBydW5zIHNldHVwLlxuICovXG5leHBvcnQgdHlwZSBTYW5kYm94U2V0dXBNZXRhID0ge1xuICAvKiogV2hldGhlciBzZXR1cC5ydW4oKSBuZWVkcyB0byBleGVjdXRlIChjb2xkIHN0YXJ0LCBubyBzbmFwc2hvdCkuICovXG4gIG5lZWRzU2V0dXBSdW46IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBzYW5kYm94IHdhcyBjcmVhdGVkIGZyb20gYSBzbmFwc2hvdC4gKi9cbiAgY3JlYXRlZEZyb21TbmFwc2hvdDogYm9vbGVhbjtcbn07XG5cbnR5cGUgU2FuZGJveFdpdGhNZXRhPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+ID0gU2FuZGJveDxUVGFncz4gJiB7XG4gIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgX3NldHVwTWV0YT86IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT47XG59O1xuXG4vKipcbiAqIE1vZHVsZS1sZXZlbCBjYWNoZSBmb3Igc2FuZGJveCBpbnN0YW5jZXMga2V5ZWQgYnkgc2FuZGJveCByZWNvcmQgSUQuXG4gKlxuICogQ2FjaGVzIGFsbCBzYW5kYm94IGluc3RhbmNlcyBzbyB0aGF0IHRoZSB3b3JrZmxvdyAod2hpY2ggY2FsbHMgZ2V0U2FuZGJveFxuICogd2l0aG91dCBzZXR1cC9vblJlc3RhcnQpIHJldXNlcyB0aGUgc2FtZSBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXNzaW9uKCksXG4gKiBpbmNsdWRpbmcgaXRzIF9vblJlYWR5IHByb21pc2UgYW5kIHNldHVwIG1ldGFkYXRhLlxuICovXG5jb25zdCBzYW5kYm94Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgU2FuZGJveFdpdGhNZXRhPigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FuZGJveDxUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hPih7XG4gIHNhbmRib3hSZWNvcmQsXG4gIHN0b3JhZ2VDb25maWcsXG4gIHN0b3JhZ2UsXG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93ID0gdHJ1ZSxcbiAgc2V0dXAsXG4gIG9uUmVzdGFydCxcbn06IHtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3c/OiBib29sZWFuO1xuICBzZXR1cD86IFNhbmRib3hTZXR1cDtcbiAgb25SZXN0YXJ0PzogT25SZXN0YXJ0O1xufSk6IFNhbmRib3hXaXRoTWV0YTxUVGFncz4ge1xuICBjb25zdCBjYWNoZWQgPSBzYW5kYm94Q2FjaGUuZ2V0KHNhbmRib3hSZWNvcmQuaWQpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgZGVidWcoXCJbZ2V0U2FuZGJveF0gY2FjaGUgaGl0IGZvclwiLCBzYW5kYm94UmVjb3JkLmlkKTtcbiAgICByZXR1cm4gY2FjaGVkIGFzIFNhbmRib3hXaXRoTWV0YTxUVGFncz47XG4gIH1cblxuICBjb25zdCBzYnggPSBjcmVhdGVTYW5kYm94PFRUYWdzPih7XG4gICAgc2FuZGJveFJlY29yZCxcbiAgICBzdG9yYWdlQ29uZmlnLFxuICAgIHN0b3JhZ2UsXG4gICAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3csXG4gICAgc2V0dXAsXG4gICAgb25SZXN0YXJ0LFxuICB9KTtcblxuICBzYW5kYm94Q2FjaGUuc2V0KHNhbmRib3hSZWNvcmQuaWQsIHNieCBhcyBTYW5kYm94V2l0aE1ldGEpO1xuXG4gIHJldHVybiBzYng7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNhbmRib3g8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlQ29uZmlnLFxuICBzdG9yYWdlLFxuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdyA9IHRydWUsXG4gIHNldHVwLFxuICBvblJlc3RhcnQsXG59OiB7XG4gIHN0b3JhZ2VDb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQ7XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93PzogYm9vbGVhbjtcbiAgc2V0dXA/OiBTYW5kYm94U2V0dXA7XG4gIG9uUmVzdGFydD86IE9uUmVzdGFydDtcbn0pOiBTYW5kYm94V2l0aE1ldGE8VFRhZ3M+IHtcbiAgbGV0IHNieDogU2FuZGJveFdpdGhNZXRhPFRUYWdzPjtcblxuICBzd2l0Y2ggKHNhbmRib3hSZWNvcmQuY29uZmlnLnR5cGUpIHtcbiAgICBjYXNlIFwibG9jYWxcIjpcbiAgICAgIHNieCA9IGxvY2FsU2FuZGJveDxUVGFncz4oe1xuICAgICAgICBzYW5kYm94UmVjb3JkOiBzYW5kYm94UmVjb3JkIGFzIFNhbmRib3hSZWNvcmQgJiB7XG4gICAgICAgICAgY29uZmlnOiB7IHR5cGU6IFwibG9jYWxcIiB9O1xuICAgICAgICB9LFxuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBzZXR1cCxcbiAgICAgICAgb25SZXN0YXJ0LFxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidmVyY2VsXCI6XG4gICAgICBzYnggPSB2ZXJjZWxTYW5kYm94PFRUYWdzPih7XG4gICAgICAgIHNhbmRib3hSZWNvcmQ6IHNhbmRib3hSZWNvcmQgYXMgU2FuZGJveFJlY29yZCAmIHtcbiAgICAgICAgICBjb25maWc6IHsgdHlwZTogXCJ2ZXJjZWxcIiB9O1xuICAgICAgICB9LFxuICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdyxcbiAgICAgICAgc2V0dXAsXG4gICAgICAgIG9uUmVzdGFydCxcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImN1c3RvbVwiOlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3VzdG9tIHNhbmRib3hlcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICBkZWZhdWx0OlxuICAgICAgc2FuZGJveFJlY29yZC5jb25maWcgc2F0aXNmaWVzIG5ldmVyO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5rbm93biBzYW5kYm94IHR5cGU6ICR7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiAuXG4gICAgICAgICAgKHNhbmRib3hSZWNvcmQuY29uZmlnIGFzIGFueSkudHlwZVxuICAgICAgICB9YFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIERvbid0IGF3YWl0IF9vblJlYWR5IGhlcmUgXHUyMDE0IGxldCB0aGUgd29ya2Zsb3cgYXdhaXQgaXQgc28gaXQgY2FuIGVtaXRcbiAgLy8gc3RhdHVzIGluZGljYXRvcnMgb3ZlciB0aGUgc3RyZWFtIHdoaWxlIHNldHVwIHJ1bnMuXG4gIC8vIEluc3RlYWQsIHdyYXAgc2FuZGJveCBtZXRob2RzIHNvIGFueSBvcGVyYXRpb24gb24gdGhlIHNhbmRib3ggaW1wbGljaXRseVxuICAvLyB3YWl0cyBmb3Igc2V0dXAgdG8gY29tcGxldGUuIFdlIHJldHVybiBhIE5FVyBvYmplY3Qgc28gdGhhdCBzZXR1cC5ydW4oKSxcbiAgLy8gd2hpY2ggaG9sZHMgdGhlIG9yaWdpbmFsIGBzYnhgIHZpYSBjbG9zdXJlLCBjYWxscyB1bndyYXBwZWQgbWV0aG9kcyBhbmRcbiAgLy8gYXZvaWRzIGEgZGVhZGxvY2suXG4gIGlmICghc2J4Ll9vblJlYWR5KSB7XG4gICAgcmV0dXJuIHNieDtcbiAgfVxuXG4gIGNvbnN0IG9uUmVhZHkgPSBzYnguX29uUmVhZHk7XG4gIHJldHVybiB7XG4gICAgLi4uc2J4LFxuICAgIGV4ZWM6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICBhd2FpdCBvblJlYWR5O1xuICAgICAgcmV0dXJuIHNieC5leGVjKG9wdHMpO1xuICAgIH0sXG4gICAgZ2V0RG9tYWluOiBhc3luYyAocG9ydCkgPT4ge1xuICAgICAgYXdhaXQgb25SZWFkeTtcbiAgICAgIHJldHVybiBzYnguZ2V0RG9tYWluKHBvcnQpO1xuICAgIH0sXG4gICAgcmVhZEZpbGU6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICBhd2FpdCBvblJlYWR5O1xuICAgICAgcmV0dXJuIHNieC5yZWFkRmlsZShvcHRzKTtcbiAgICB9LFxuICAgIHdyaXRlRmlsZXM6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICBhd2FpdCBvblJlYWR5O1xuICAgICAgcmV0dXJuIHNieC53cml0ZUZpbGVzKG9wdHMpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiZXhwb3J0IHR5cGUgeyBTYW5kYm94U2V0dXBNZXRhIH0gZnJvbSBcIi4vY2xpZW50XCI7XG5leHBvcnQgeyBnZXRTYW5kYm94IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5leHBvcnQgdHlwZSB7XG4gIEV4ZWNSZXN1bHQsXG4gIExvZ0VudHJ5LFxuICBPblJlc3RhcnQsXG4gIFNhbmRib3gsXG4gIFNhbmRib3hMaWZlY3ljbGUsXG4gIFNhbmRib3hMaWZlY3ljbGVJbnB1dCxcbiAgU2FuZGJveFNldHVwLFxuICBTYW5kYm94U3RhdHVzLFxuICBUZXJtaW5hbCxcbiAgVGVybWluYWxNZXRhZGF0YSxcbiAgVmVyY2VsU2FuZGJveExpZmVjeWNsZUNvbmZpZyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbiIsICJpbXBvcnQgdHlwZSB7IEZpbmlzaFJlYXNvbiB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgZGVmaW5lSG9vaywgRmF0YWxFcnJvciwgZ2V0V3JpdGFibGUgfSBmcm9tIFwid29ya2Zsb3dcIjtcbmltcG9ydCB7IGNvbXBsZXRlTWVzc2FnZVN0ZXAsIHN0cmVhbVRleHRTdGVwIH0gZnJvbSBcIi4vYWdlbnQtd29ya2Zsb3ctc3RlcHNcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIHsgU3RlcFVzYWdlIH0gZnJvbSBcIi4vdXRpbHMvdXNhZ2VcIjtcblxuZXhwb3J0IHR5cGUgQWdlbnRJbnB1dCA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHN0b3JhZ2VDb25maWc6IFN0b3JhZ2VDb25maWc7XG59O1xuXG5leHBvcnQgdHlwZSBBZ2VudE1lc3NhZ2VJbnB1dCA9IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGhvb2tUb2tlbjogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG5leHBvcnQgdHlwZSBBcHByb3ZhbFJlc3BvbnNlID0ge1xuICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IGFnZW50TWVzc2FnZUhvb2sgPSBkZWZpbmVIb29rPEFnZW50TWVzc2FnZUlucHV0PigpO1xuZXhwb3J0IGNvbnN0IGFwcHJvdmFsSG9vayA9IGRlZmluZUhvb2s8QXBwcm92YWxSZXNwb25zZT4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFnZW50V29ya2Zsb3coe1xuICBpbnB1dCxcbiAgZXZlbnQsXG59OiB7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG59KSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG5cbiAgY29uc3QgbWVzc2FnZUhvb2sgPSBhZ2VudE1lc3NhZ2VIb29rLmNyZWF0ZSh7IHRva2VuOiBpbnB1dC5zZXNzaW9uSWQgfSk7XG4gIGNvbnN0IGl0ZXJhdG9yID0gbWVzc2FnZUhvb2tbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gIGxldCBwZW5kaW5nTmV4dCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICBhd2FpdCBvbk1lc3NhZ2UoeyBldmVudCwgaW5wdXQgfSkuY2F0Y2goKGUpID0+IHtcbiAgICBpZiAoRmF0YWxFcnJvci5pcyhlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIk1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsZWQgcGVybWFuZW50bHk6XCIsIGUubWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH0pO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVuZGluZ05leHQ7XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkOiBtZXNzYWdlIGhvb2sgaXRlcmF0b3IgZG9uZVwiKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IG9uTWVzc2FnZSh7IGV2ZW50OiByZXN1bHQudmFsdWUsIGlucHV0IH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICBpZiAoRmF0YWxFcnJvci5pcyhlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiTWVzc2FnZSBwcm9jZXNzaW5nIGZhaWxlZCBwZXJtYW5lbnRseTpcIiwgZS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgICBwZW5kaW5nTmV4dCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbk1lc3NhZ2Uoe1xuICBldmVudCxcbiAgaW5wdXQsXG59OiB7XG4gIGV2ZW50OiBBZ2VudE1lc3NhZ2VJbnB1dDtcbiAgaW5wdXQ6IEFnZW50SW5wdXQ7XG59KSB7XG4gIGNvbnN0IHdyaXRhYmxlID0gZ2V0V3JpdGFibGUoeyBuYW1lc3BhY2U6IGV2ZW50LmFzc2lzdGFudE1lc3NhZ2VJZCB9KTtcblxuICBsZXQgZmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb24gfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0UGFydEluZGV4ID0gMDtcbiAgY29uc3QgdXNhZ2VTdGVwczogU3RlcFVzYWdlW10gPSBbXTtcblxuICB3aGlsZSAoZmluaXNoUmVhc29uICE9PSBcInN0b3BcIikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJlYW1UZXh0U3RlcCh7XG4gICAgICAgIGFzc2lzdGFudE1lc3NhZ2VJZDogZXZlbnQuYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICB3cml0YWJsZSxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBsYXN0UGFydEluZGV4LFxuICAgICAgICBzdGVwSW5kZXhPZmZzZXQ6IHVzYWdlU3RlcHMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgICBmaW5pc2hSZWFzb24gPSByZXN1bHQuZmluaXNoUmVhc29uO1xuICAgICAgbGFzdFBhcnRJbmRleCA9IHJlc3VsdC5sYXN0UGFydEluZGV4O1xuICAgICAgdXNhZ2VTdGVwcy5wdXNoKC4uLnJlc3VsdC51c2FnZVN0ZXBzKTtcblxuICAgICAgaWYgKHJlc3VsdC5tYXhTdGVwcyAhPSBudWxsICYmIHVzYWdlU3RlcHMubGVuZ3RoID49IHJlc3VsdC5tYXhTdGVwcykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdG9vbHMgbmVlZCBhcHByb3ZhbCwgc3VzcGVuZCB3b3JrZmxvdyB1bnRpbCBhbGwgYXJlIHJlc29sdmVkXG4gICAgICBpZiAocmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByZXN1bHQucGVuZGluZ0FwcHJvdmFscy5tYXAoKHBlbmRpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSBhcHByb3ZhbEhvb2suY3JlYXRlKHsgdG9rZW46IHBlbmRpbmcuYXBwcm92YWxJZCB9KTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXIgPSBob29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIC8vIEFsbCBob29rcyByZXNvbHZlZCBcdTIwMTQgYXBwcm92YWwgcmVzcG9uc2VzIGFyZSBub3cgaW4gc3RvcmFnZS5cbiAgICAgICAgLy8gTG9vcCBjb250aW51ZXMgXHUyMTkyIG5leHQgc3RyZWFtVGV4dFN0ZXAgcmVhZHMgdXBkYXRlZCBwYXJ0cy5cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBjb21wbGV0ZU1lc3NhZ2VTdGVwKHtcbiAgICBhc3Npc3RhbnRNZXNzYWdlSWQ6IGV2ZW50LmFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICBpbnB1dCxcbiAgICB3cml0YWJsZSxcbiAgICB1c2FnZVN0ZXBzLFxuICB9KTtcbn1cbiIsICJpbXBvcnQge1xuICBjb252ZXJ0VG9Nb2RlbE1lc3NhZ2VzLFxuICBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0sXG4gIHR5cGUgRmluaXNoUmVhc29uLFxuICBzdGVwQ291bnRJcyxcbiAgc3RyZWFtVGV4dCxcbiAgdHlwZSBVSU1lc3NhZ2UsXG59IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgeyBGYXRhbEVycm9yIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50SW5wdXQsIEFnZW50TWVzc2FnZUlucHV0IH0gZnJvbSBcIi4vYWdlbnQtd29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRTdGF0dXMsIFJwY1BheWxvYWQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHsgcmVzb2x2ZVJwYyB9IGZyb20gXCIuL3JwYy1yZWdpc3RyeVwiO1xuaW1wb3J0IHsgZGlzY292ZXJTa2lsbHNJblNhbmRib3ggfSBmcm9tIFwiLi9za2lsbHMvZGlzY292ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hSZWNvcmQsIFN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBmZXRjaEFwaVRvb2xzTWV0YWRhdGEsIGdldFRvb2xzIH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgT25TdWJUb29sQ2FsbCB9IGZyb20gXCIuL3Rvb2xzL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IGFwcGx5UHJvbXB0Q2FjaGluZ1RvTW9kZWxSZXF1ZXN0IH0gZnJvbSBcIi4vdXRpbHMvcHJvbXB0LWNhY2hlXCI7XG5pbXBvcnQgeyBhc3NlbWJsZVVJTWVzc2FnZXMgfSBmcm9tIFwiLi91dGlscy91aVwiO1xuaW1wb3J0IHsgY29tcHV0ZVVzYWdlU3VtbWFyeSwgdHlwZSBTdGVwVXNhZ2UgfSBmcm9tIFwiLi91dGlscy91c2FnZVwiO1xuXG4vKipcbiAqIEZpcmUtYW5kLWZvcmdldCBzdGF0dXMgZW1pc3Npb24uIFdyaXRlcyBhIHRyYW5zaWVudCBgZGF0YS1zdGF0dXNgIGNodW5rXG4gKiB0byB0aGUgc3RyZWFtIGFuZCBjYWxscyB0aGUgYGhvb2suc3RhdHVzYCBSUEMuIE5laXRoZXIgYmxvY2tzIHRoZSBjYWxsZXIuXG4gKi9cbmZ1bmN0aW9uIGVtaXRTdGF0dXMoe1xuICB3cml0ZXIsXG4gIHN0YXR1cyxcbiAgcnBjLFxufToge1xuICB3cml0ZXI6ICgoZXZlbnQ6IHVua25vd24pID0+IHZvaWQpIHwgbnVsbDtcbiAgc3RhdHVzOiBBZ2VudFN0YXR1cztcbiAgcnBjOiAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD47XG59KSB7XG4gIHdyaXRlcj8uKHsgdHlwZTogXCJkYXRhLXN0YXR1c1wiLCBkYXRhOiBzdGF0dXMsIHRyYW5zaWVudDogdHJ1ZSB9KTtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0VtcHR5QmxvY2tTdGF0ZW1lbnRzOiBmaXJlLWFuZC1mb3JnZXRcbiAgcnBjKHsgbWV0aG9kOiBcImhvb2suc3RhdHVzXCIsIHBhcmFtczogeyBzdGF0dXMgfSB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbmNvbnN0IEJBU0VfU1lTVEVNX1BST01QVCA9XG4gIFwiWW91IGFyZSBhbiBBSSBhc3Npc3RhbnQgd2l0aCBiYXNpYyB0b29scyB0byBpbnRlcmFjdCB3aXRoIHlvdXIgZW52aXJvbm1lbnQuIEV4cGxvcmUgYW5kIHdvcmsgZnJlZWx5LlwiO1xuXG5mdW5jdGlvbiBqb2luUHJvbXB0U2VjdGlvbnMoXG4gIC4uLnNlY3Rpb25zOiAoc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbClbXVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zLmZpbHRlcigocykgPT4gcz8udHJpbSgpKS5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG5jb25zdCBiYWNrZ3JvdW5kUHJvY2Vzc1Byb21wdCA9IGAjIyBCYWNrZ3JvdW5kIFByb2Nlc3Nlc1xuVGhlc2UgYmFja2dyb3VuZCBwcm9jZXNzIGluc3RydWN0aW9ucyBhcmUgZm9yIHlvdSB0byBtYW5pcHVsYXRlIHRoZSBwcm9jZXNzZXMsIGRvIG5vdCBiZSB0byB2ZXJib3NlIHRvIHRoZSB1c2VyIGFib3V0IHRoZSByZXNwb25zZSBkZXRhaWxzIGxpa2UgXCJob3cgdG8gZGVidWcgdGhlIHByb2Nlc3Mgb3V0cHV0XCIgdGhlIHVzZXIgd2lsbCBoYXZlIGFuIFVJLlxuXG5Vc2UgXFxgd2FpdFVudGlsOiAwXFxgIGZvciBkZXYgc2VydmVycyB0aGF0IHNob3VsZCBydW4gaW5kZWZpbml0ZWx5LlxuSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGNoZWNrIHRoZSBvdXRwdXQgbG9nIGFmdGVyIHJ1bm5pbmcgcHJvY2Vzc2VzIGxpa2UgZGV2IHNlcnZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgc3RhcnRlZCBjb3JyZWN0bHkuXG5cblRvIHJ1biBhIGJhY2tncm91bmQgcHJvY2VzczpcbkJhc2goeyBjb21tYW5kOiBcIm5wbSBydW4gZGV2XCIsIHdhaXRVbnRpbDogMCB9KVxuUmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIFxcYHBpZFxcYCBhbmQgXFxgb3V0cHV0RmlsZVxcYCBwYXRoLlxuXG5UbyBjaGVjayBhIHByb2Nlc3MncyBvdXRwdXQ6XG5CYXNoKHsgY29tbWFuZDogXCJ0YWlsIC0xMDAge291dHB1dEZpbGV9XCIgfSlcblxuVG8ga2lsbCBhIHByb2Nlc3M6XG5CYXNoKHsgY29tbWFuZDogXCJraWxsIHtwaWR9XCIgfSkgICAgICAgLy8gR3JhY2VmdWxcbkJhc2goeyBjb21tYW5kOiBcImtpbGwgLTkge3BpZH1cIiB9KSAgICAvLyBGb3JjZVxuXG5UbyBsaXN0IGFsbCBwcm9jZXNzZXM6XG5CYXNoKHsgY29tbWFuZDogXCJwcyBhdXggfCBncmVwIG5vZGVcIiB9KVxuYDtcblxuZnVuY3Rpb24gYnVpbGRTa2lsbHNDb250ZXh0KHNraWxsczogU2tpbGxTdW1tYXJ5W10pOiBzdHJpbmcge1xuICBpZiAoc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3Qgc2tpbGxMaW5lcyA9IHNraWxsc1xuICAgIC5tYXAoKHMpID0+IGAtICR7cy5uYW1lfTogJHtzLmRlc2NyaXB0aW9ufVxcbiAgUGF0aDogJHtzLnNraWxsTWRQYXRofWApXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgcmV0dXJuIGAjIyBBdmFpbGFibGUgU2tpbGxzXG4ke3NraWxsTGluZXN9XG5cbiR7YmFja2dyb3VuZFByb2Nlc3NQcm9tcHR9XG5cbllvdSBjYW4gdXNlIHRoZSBSZWFkIHRvb2wgdG8gcmVhZCBhbnkgc2tpbGwncyBTS0lMTC5tZCBmaWxlIHRvIGxlYXJuIG1vcmUgYWJvdXQgaXQuYDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlTWVzc2FnZVN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGlucHV0LFxuICB3cml0YWJsZSxcbiAgdXNhZ2VTdGVwcyxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW07XG4gIHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdO1xufSkge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgeyBnZXRTdG9yYWdlIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3N0b3JhZ2UvY2xpZW50XCIpO1xuICBjb25zdCBycGMgPSByZXNvbHZlUnBjKGlucHV0LnN0b3JhZ2VDb25maWcubmFtZSA/PyBcImRlZmF1bHRcIik7XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHsgY29uZmlnOiBpbnB1dC5zdG9yYWdlQ29uZmlnLCBycGMgfSk7XG5cbiAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQoYXNzaXN0YW50TWVzc2FnZUlkKTtcbiAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1lc3NhZ2U7XG4gIH1cbiAgaWYgKCFtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlICR7YXNzaXN0YW50TWVzc2FnZUlkfSBub3QgZm91bmRgKTtcbiAgfVxuXG4gIGNvbnN0IHVzYWdlID1cbiAgICB1c2FnZVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgID8ge1xuICAgICAgICAgIHN0ZXBzOiB1c2FnZVN0ZXBzLFxuICAgICAgICAgIHN1bW1hcnk6IGNvbXB1dGVVc2FnZVN1bW1hcnkodXNhZ2VTdGVwcyksXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLm1lc3NhZ2Uuc2V0KHtcbiAgICAuLi5tZXNzYWdlLFxuICAgIGNvbXBsZXRlZEF0OiBEYXRlLm5vdygpLFxuICAgIHVzYWdlLFxuICB9KTtcbiAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcmVzdWx0O1xuICB9XG5cbiAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTtcbn1cblxuY29uc3QgSU5URVJSVVBUX1BPTExfSU5URVJWQUxfTVMgPSA1MDA7XG5cbmZ1bmN0aW9uIHBvbGxGb3JJbnRlcnJ1cHQoe1xuICBzdG9yYWdlLFxuICBtZXNzYWdlSWQsXG4gIHNpZ25hbCxcbiAgYWJvcnRDb250cm9sbGVyLFxufToge1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG59KTogeyBmaXJzdENoZWNrOiBQcm9taXNlPHZvaWQ+IH0ge1xuICBsZXQgcmVzb2x2ZUZpcnN0Q2hlY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0IGZpcnN0Q2hlY2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmVGaXJzdENoZWNrID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgY29uc3QgcG9sbCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQobWVzc2FnZUlkKTtcbiAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICByZXNvbHZlRmlyc3RDaGVjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmludGVycnVwdGVkQXQgIT09IG51bGwpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBJTlRFUlJVUFRfUE9MTF9JTlRFUlZBTF9NUylcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHBvbGwoKTtcbiAgcmV0dXJuIHsgZmlyc3RDaGVjayB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RyZWFtVGV4dFN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGlucHV0LFxuICBldmVudCxcbiAgd3JpdGFibGUsXG4gIGxhc3RQYXJ0SW5kZXgsXG4gIHN0ZXBJbmRleE9mZnNldCxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbTtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICBzdGVwSW5kZXhPZmZzZXQ6IG51bWJlcjtcbn0pOiBQcm9taXNlPHtcbiAgZmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb247XG4gIGxhc3RQYXJ0SW5kZXg6IG51bWJlcjtcbiAgdXNhZ2VTdGVwczogU3RlcFVzYWdlW107XG4gIHBlbmRpbmdBcHByb3ZhbHM6IHsgYXBwcm92YWxJZDogc3RyaW5nOyB0b29sTmFtZTogc3RyaW5nIH1bXTtcbiAgbWF4U3RlcHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbn0+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9zdG9yYWdlL2NsaWVudFwiKTtcbiAgY29uc3QgeyBnZXRTYW5kYm94IH0gPSBhd2FpdCBpbXBvcnQoXCIuL3NhbmRib3hcIik7XG5cbiAgY29uc3QgcnBjID0gcmVzb2x2ZVJwYyhpbnB1dC5zdG9yYWdlQ29uZmlnLm5hbWUgPz8gXCJkZWZhdWx0XCIpO1xuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7IGNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZywgcnBjIH0pO1xuXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgcG9sbENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgY29uc3QgeyBmaXJzdENoZWNrIH0gPSBwb2xsRm9ySW50ZXJydXB0KHtcbiAgICBzdG9yYWdlLFxuICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIHNpZ25hbDogcG9sbENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGFib3J0Q29udHJvbGxlcixcbiAgfSk7XG5cbiAgY29uc3QgW1xuICAgICxcbiAgICBtZXNzYWdlc1Jlc3VsdCxcbiAgICBwYXJ0c1Jlc3VsdCxcbiAgICB7IHNlc3Npb24sIHNhbmRib3gsIHNhbmRib3hSZWNvcmQgfSxcbiAgICBhcGlUb29sc01ldGFkYXRhLFxuICBdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZpcnN0Q2hlY2ssXG4gICAgc3RvcmFnZS5tZXNzYWdlLmxpc3QoaW5wdXQuc2Vzc2lvbklkKSxcbiAgICBzdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihpbnB1dC5zZXNzaW9uSWQpLFxuICAgIHN0b3JhZ2Uuc2Vzc2lvbi5nZXQoaW5wdXQuc2Vzc2lvbklkKS50aGVuKGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNlc3Npb247XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gc2Vzc2lvbi5zYW5kYm94SWRcbiAgICAgICAgPyBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNlc3Npb24uc2FuZGJveElkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNhbmRib3hSZWNvcmQ7XG4gICAgICB9XG4gICAgICBpZiAoIXNhbmRib3hSZWNvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgYFNhbmRib3ggbm90IGZvdW5kIGZvciBzZXNzaW9uICR7aW5wdXQuc2Vzc2lvbklkfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhbmRib3ggPSBnZXRTYW5kYm94KHtcbiAgICAgICAgc2FuZGJveFJlY29yZCxcbiAgICAgICAgc3RvcmFnZUNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgc3RvcmFnZSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyBzZXNzaW9uLCBzYW5kYm94LCBzYW5kYm94UmVjb3JkIH07XG4gICAgfSksXG4gICAgZmV0Y2hBcGlUb29sc01ldGFkYXRhKHtcbiAgICAgIHJwYyxcbiAgICB9KSxcbiAgXSk7XG5cbiAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHBvbGxDb250cm9sbGVyLmFib3J0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIgYXMgRmluaXNoUmVhc29uLFxuICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgIHVzYWdlU3RlcHM6IFtdLFxuICAgICAgcGVuZGluZ0FwcHJvdmFsczogW10sXG4gICAgICBtYXhTdGVwczogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0O1xuICB9XG4gIGlmIChwYXJ0c1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcGFydHNSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgaXRlcmF0aW9uLCBtYXJrIGFsbCBtZXNzYWdlcyBpbiB0aGlzIGJhdGNoIGFzIHN0YXJ0ZWQuXG4gICAqIFVzZXIgbWVzc2FnZXMgYXJlIGFsc28gbWFya2VkIGFzIGNvbXBsZXRlZCAodGhleSdyZSBkb25lKS5cbiAgICogVGhlIGFzc2lzdGFudCBtZXNzYWdlIGlzIG9ubHkgbWFya2VkIGFzIHN0YXJ0ZWQgKHN0cmVhbWluZyBpbiBwcm9ncmVzcykuXG4gICAqL1xuICBjb25zdCBzZXRTdGFydGVkUHJvbWlzZSA9XG4gICAgbGFzdFBhcnRJbmRleCA9PT0gMFxuICAgICAgPyAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgcGVuZGluZ01lc3NhZ2VzID0gbWVzc2FnZXNSZXN1bHQuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKG0pID0+IG0uY3JlYXRlZEF0IDw9IGV2ZW50LmNyZWF0ZWRBdCAmJiBtLnN0YXJ0ZWRBdCA9PT0gbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBlbmRpbmdNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIHBlbmRpbmdNZXNzYWdlcy5tYXAoKG0pID0+XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5tZXNzYWdlLnNldCh7XG4gICAgICAgICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbS5yb2xlID09PSBcImFzc2lzdGFudFwiID8gbnVsbCA6IG5vdyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBudWxsO1xuXG4gIC8vIE11dGFibGUgcmVmIHNvIG9uU3ViVG9vbENhbGwgY2FuIHdyaXRlIHRvIHRoZSBzdHJlYW0gb25jZSBhdmFpbGFibGVcbiAgY29uc3Qgc3RyZWFtV3JpdGVyUmVmOiB7XG4gICAgY3VycmVudDogKChldmVudDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsO1xuICB9ID0geyBjdXJyZW50OiBudWxsIH07XG5cbiAgY29uc3Qgc3ViVG9vbFBhcnRJZHM6IHN0cmluZ1tdID0gW107XG4gIC8vIFNoYXJlZCBjb3VudGVyIGZvciBwYXJ0IGluZGljZXMgXHUyMDE0IHN1Yi10b29sIHBhcnRzIGluY3JlbWVudCB0aGlzIGR1cmluZ1xuICAvLyB0aGUgc3RyZWFtLCB0aGVuIHN0ZXBQYXJ0cyBjb250aW51ZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLlxuICBsZXQgbmV4dFBhcnRJbmRleCA9IGxhc3RQYXJ0SW5kZXg7XG5cbiAgY29uc3Qgb25TdWJUb29sQ2FsbDogT25TdWJUb29sQ2FsbCA9IGFzeW5jICh0b29sTmFtZSwgdG9vbElucHV0LCBleGVjdXRlKSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyB0b29sIG5lZWRzIGFwcHJvdmFsIHZpYSBSUENcbiAgICBjb25zdCByZXMgPSBhd2FpdCBycGMoe1xuICAgICAgbWV0aG9kOiBcInRvb2xzLm5lZWRzQXBwcm92YWxcIixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiByZXMgfHwgcmVzLnJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gTm8gYXBwcm92YWwgbmVlZGVkIFx1MjAxNCBqdXN0IGV4ZWN1dGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcHJvdmFsIG5lZWRlZCBcdTIwMTQgc3VyZmFjZSB0byB1c2VyIHZpYSBzdHJlYW0gZXZlbnRzXG4gICAgY29uc3QgYXBwcm92YWxJZCA9IGBqc19hcHByb3ZhbF8ke3VsaWQoKX1gO1xuICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBganNfdGNfJHt1bGlkKCl9YDtcbiAgICBjb25zdCBwYXJ0SWQgPSBgcGFydF8ke3VsaWQoKX1gO1xuICAgIHN1YlRvb2xQYXJ0SWRzLnB1c2gocGFydElkKTtcblxuICAgIC8vIFN0b3JlIGFwcHJvdmFsLXJlcXVlc3QgcGFydFxuICAgIGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoe1xuICAgICAgaWQ6IHBhcnRJZCxcbiAgICAgIGluZGV4OiBuZXh0UGFydEluZGV4KyssXG4gICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgcGFydDoge1xuICAgICAgICB0eXBlOiBgdG9vbC0ke3Rvb2xOYW1lfWAsXG4gICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgIHN0YXRlOiBcImFwcHJvdmFsLXJlcXVlc3RlZFwiLFxuICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICBhcHByb3ZhbDogeyBpZDogYXBwcm92YWxJZCB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgfSk7XG5cbiAgICAvLyBXcml0ZSBzdHJlYW0gZXZlbnRzIGZvciB0aGUgVUlcbiAgICAvLyB0b29sLWlucHV0LXN0YXJ0IGlzIHJlcXVpcmVkIFx1MjAxNCB0aGUgQUkgU0RLIGNsaWVudCBjcmVhdGVzIHRoZSB0b29sIHBhcnRcbiAgICAvLyB3aGVuIGl0IHNlZXMgdGhpcyBldmVudC4gV2l0aG91dCBpdCwgc3Vic2VxdWVudCBldmVudHMgYXJlIGlnbm9yZWQuXG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICB9KTtcbiAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgfSk7XG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgYXBwcm92YWxJZCxcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgfSk7XG5cbiAgICAvLyBQb2xsIHN0b3JhZ2UgZm9yIGFwcHJvdmFsIHJlc3BvbnNlXG4gICAgY29uc3QgUE9MTF9NUyA9IDUwMDtcbiAgICBjb25zdCBUSU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgVElNRU9VVF9NUykge1xuICAgICAgY29uc3QgcGFydHMgPSBhd2FpdCBzdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihpbnB1dC5zZXNzaW9uSWQpO1xuICAgICAgaWYgKCEocGFydHMgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IHBhcnRzLml0ZW1zLmZpbmQoXG4gICAgICAgICAgKHApID0+XG4gICAgICAgICAgICBwLmlkID09PSBwYXJ0SWQgJiZcbiAgICAgICAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgY29uc3QgYXBwcm92YWwgPSAoXG4gICAgICAgICAgICB1cGRhdGVkLnBhcnQgYXMge1xuICAgICAgICAgICAgICBhcHByb3ZhbD86IHsgYXBwcm92ZWQ/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLmFwcHJvdmFsO1xuICAgICAgICAgIGlmIChhcHByb3ZhbD8uYXBwcm92ZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIG91dHB1dDogcmVzdWx0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIGVycm9yVGV4dDogZXJyb3IsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEZW5pZWRcbiAgICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjogYFRvb2wgXCIke3Rvb2xOYW1lfVwiIGRlbmllZDogJHthcHByb3ZhbD8ucmVhc29uIHx8IFwidXNlciBkZW5pZWRcIn1gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFBPTExfTVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBlcnJvcjogXCJBcHByb3ZhbCB0aW1lZCBvdXRcIiB9O1xuICB9O1xuXG4gIGNvbnN0IHJhd1Rvb2xzID0gZ2V0VG9vbHMoe1xuICAgIGlucHV0LFxuICAgIHJwYyxcbiAgICBldmVudCxcbiAgICBzYW5kYm94LFxuICAgIHNlc3Npb24sXG4gICAgc2FuZGJveFJlY29yZDogc2FuZGJveFJlY29yZCBhcyBTYW5kYm94UmVjb3JkLFxuICAgIGFwaVRvb2xzTWV0YWRhdGEsXG4gICAgb25TdWJUb29sQ2FsbCxcbiAgfSk7XG5cbiAgaWYgKCFzZXNzaW9uLm1vZGVsKSB7XG4gICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoXCJTZXNzaW9uIG1vZGVsIGlzIG5vdCBzZXRcIik7XG4gIH1cblxuICBjb25zdCBhbGxQYXJ0cyA9IHBhcnRzUmVzdWx0Lml0ZW1zO1xuICBjb25zdCB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXSA9IFtdO1xuICBsZXQgaW50ZXJuYWxTdGVwSW5kZXggPSAwO1xuXG4gIGNvbnN0IHRvb2xzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHJhd1Rvb2xzKS5tYXAoKFtuYW1lLCB0XSkgPT4gW1xuICAgICAgbmFtZSxcbiAgICAgIHtcbiAgICAgICAgLi4udCxcbiAgICAgICAgbmVlZHNBcHByb3ZhbDogYXN5bmMgKFxuICAgICAgICAgIHRvb2xJbnB1dDogdW5rbm93bixcbiAgICAgICAgICBvcHRzOiB7IHRvb2xDYWxsSWQ6IHN0cmluZzsgbWVzc2FnZXM6IHVua25vd25bXSB9XG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJwYyh7XG4gICAgICAgICAgICBtZXRob2Q6IFwidG9vbHMubmVlZHNBcHByb3ZhbFwiLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIHRvb2xOYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBvcHRzLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBvcHRzLm1lc3NhZ2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoXCJlcnJvclwiIGluIHJlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgdG9vbHMubmVlZHNBcHByb3ZhbCBSUEMgZmFpbGVkIGZvciAke25hbWV9OiAke3Jlcy5lcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXMucmVzdWx0IGFzIGJvb2xlYW47XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pXG4gICk7XG5cbiAgbGV0IHNraWxsc1JlZjogU2tpbGxTdW1tYXJ5W10gPSBbXTtcblxuICBjb25zdCByZXN1bHQgPSBzdHJlYW1UZXh0KHtcbiAgICAvLyBQbGFjZWhvbGRlciB0byBwYXNzIHZhbGlkYXRpb24gXHUyMDE0IHByZXBhcmVTdGVwIHJlcGxhY2VzIG1lc3NhZ2VzIGVudGlyZWx5LlxuICAgIG1lc3NhZ2VzOiBbeyByb2xlOiBcInVzZXJcIiBhcyBjb25zdCwgY29udGVudDogXCIuXCIgfV0sXG4gICAgdG9vbHMsXG4gICAgbW9kZWw6IHNlc3Npb24ubW9kZWwsXG4gICAgYWJvcnRTaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgYWN0aXZlVG9vbHM6IHNlc3Npb24uYWN0aXZlVG9vbHMgPz8gdW5kZWZpbmVkLFxuICAgIHN0b3BXaGVuOiBzdGVwQ291bnRJcygxKSxcbiAgICB0ZW1wZXJhdHVyZTogc2Vzc2lvbi5nZW5lcmF0aW9uPy50ZW1wZXJhdHVyZSxcbiAgICB0b3BLOiBzZXNzaW9uLmdlbmVyYXRpb24/LnRvcEssXG4gICAgdG9wUDogc2Vzc2lvbi5nZW5lcmF0aW9uPy50b3BQLFxuICAgIGZyZXF1ZW5jeVBlbmFsdHk6IHNlc3Npb24uZ2VuZXJhdGlvbj8uZnJlcXVlbmN5UGVuYWx0eSxcbiAgICBwcmVzZW5jZVBlbmFsdHk6IHNlc3Npb24uZ2VuZXJhdGlvbj8ucHJlc2VuY2VQZW5hbHR5LFxuICAgIG1heE91dHB1dFRva2Vuczogc2Vzc2lvbi5nZW5lcmF0aW9uPy5tYXhPdXRwdXRUb2tlbnMsXG4gICAgaGVhZGVyczogc2Vzc2lvbi5nZW5lcmF0aW9uPy5oZWFkZXJzLFxuICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB7XG4gICAgICBzZXNzaW9uLFxuICAgICAgc2FuZGJveCxcbiAgICAgIHN0b3JhZ2UsXG4gICAgICBjb250ZXh0OiBldmVudC5jb250ZXh0LFxuICAgIH0sXG4gICAgcHJlcGFyZVN0ZXA6IGFzeW5jICh7IG1vZGVsIH0pID0+IHtcbiAgICAgIC8vIE9uIHRoZSBmaXJzdCBzdGVwLCBlbWl0IHNhbmRib3ggc3RhdHVzLCBhd2FpdCBzZXR1cCwgYW5kIGxvYWQgc2tpbGxzLlxuICAgICAgLy8gc3RyZWFtV3JpdGVyUmVmIGlzIHNldCBieSB0aGUgY3JlYXRlVUlNZXNzYWdlU3RyZWFtIGV4ZWN1dG9yXG4gICAgICAvLyB3aGljaCBydW5zIGJlZm9yZSBwcmVwYXJlU3RlcCAoYWZ0ZXIgYHN0YXJ0YCBpcyB3cml0dGVuKS5cbiAgICAgIGlmIChsYXN0UGFydEluZGV4ID09PSAwKSB7XG4gICAgICAgIGlmIChzYW5kYm94Ll9zZXR1cE1ldGEpIHtcbiAgICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgc2FuZGJveC5fc2V0dXBNZXRhO1xuICAgICAgICAgIGVtaXRTdGF0dXMoe1xuICAgICAgICAgICAgd3JpdGVyOiBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCxcbiAgICAgICAgICAgIHN0YXR1czogbWV0YS5uZWVkc1NldHVwUnVuXG4gICAgICAgICAgICAgID8geyB0eXBlOiBcInNhbmRib3gtc2V0dXAtY29sZFwiIH1cbiAgICAgICAgICAgICAgOiB7IHR5cGU6IFwic2FuZGJveC1zZXR1cFwiIH0sXG4gICAgICAgICAgICBycGMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhbmRib3guX29uUmVhZHkpIHtcbiAgICAgICAgICBhd2FpdCBzYW5kYm94Ll9vblJlYWR5O1xuICAgICAgICB9XG5cbiAgICAgICAgZW1pdFN0YXR1cyh7XG4gICAgICAgICAgd3JpdGVyOiBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCxcbiAgICAgICAgICBzdGF0dXM6IHsgdHlwZTogXCJsb2FkaW5nLXNraWxsc1wiIH0sXG4gICAgICAgICAgcnBjLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJblNhbmRib3goe1xuICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgc2tpbGxzRGlyczogc2Vzc2lvbi5za2lsbHNEaXIgfHwgW10sXG4gICAgICAgICAgZGVidWc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBza2lsbHNSZWYgPSBza2lsbHM7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4ZWN1dGUgYXBwcm92ZWQgdG9vbHMgc28gdGhlIG1vZGVsIHNlZXMgY29tcGxldGUgdG9vbCBjYWxsICsgcmVzdWx0XG4gICAgICAvLyBwYWlycy4gVGhpcyBydW5zIG91dHNpZGUgdGhlIGxhc3RQYXJ0SW5kZXggPT09IDAgZ2F0ZSBiZWNhdXNlXG4gICAgICAvLyBhcHByb3ZhbHMgYXJyaXZlIG9uIHN1YnNlcXVlbnQgbWVzc2FnZXMgKGxhc3RQYXJ0SW5kZXggPiAwKS5cbiAgICAgIGNvbnN0IGFwcHJvdmVkUGFydHMgPSBhbGxQYXJ0cy5maWx0ZXIoXG4gICAgICAgIChwKSA9PlxuICAgICAgICAgIHAucGFydCAmJlxuICAgICAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgICAgICAocC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXNwb25kZWRcIiAmJlxuICAgICAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnQgJiZcbiAgICAgICAgICAocC5wYXJ0IGFzIHsgYXBwcm92YWw/OiB7IGFwcHJvdmVkPzogYm9vbGVhbiB9IH0pLmFwcHJvdmFsXG4gICAgICAgICAgICA/LmFwcHJvdmVkID09PSB0cnVlXG4gICAgICApO1xuXG4gICAgICBpZiAoYXBwcm92ZWRQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVtaXRTdGF0dXMoe1xuICAgICAgICAgIHdyaXRlcjogc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgc3RhdHVzOiB7IHR5cGU6IFwicHJvY2Vzc2luZy1hcHByb3ZhbHNcIiB9LFxuICAgICAgICAgIHJwYyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQnVpbGQgY29udGV4dCBtZXNzYWdlcyBmb3IgdG9vbCBleGVjdXRlIChpbmNvbXBsZXRlIGNhbGxzIGZpbHRlcmVkIG91dCkuXG4gICAgICAgIGNvbnN0IHByZUV4ZWNNZXNzYWdlcyA9IGF3YWl0IGNvbnZlcnRUb01vZGVsTWVzc2FnZXMoXG4gICAgICAgICAgYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICAgIHBhcnRzOiBhbGxQYXJ0cyxcbiAgICAgICAgICAgIHVudGlsOiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgICAgICBpbmNsdWRlUXVldWVkOiB0cnVlLFxuICAgICAgICAgICAgZXhjbHVkZVN1YlRvb2xQYXJ0czogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB7IGlnbm9yZUluY29tcGxldGVUb29sQ2FsbHM6IHRydWUgfVxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGFwcHJvdmVkUGFydHMubWFwKGFzeW5jIChhcCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFhcC5wYXJ0LnR5cGUuc3RhcnRzV2l0aChcInRvb2wtXCIpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBhcC5wYXJ0IGFzIEV4dHJhY3Q8XG4gICAgICAgICAgICAgIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgICAgICAgICAgIHsgdHlwZTogYHRvb2wtJHtzdHJpbmd9YCB9XG4gICAgICAgICAgICA+O1xuICAgICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBwYXJ0LnR5cGUucmVwbGFjZShcInRvb2wtXCIsIFwiXCIpO1xuICAgICAgICAgICAgY29uc3QgdG9vbERlZiA9IHJhd1Rvb2xzW3Rvb2xOYW1lXTtcblxuICAgICAgICAgICAgaWYgKHRvb2xEZWY/LmV4ZWN1dGUgJiYgcGFydC5pbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbE91dHB1dCA9IGF3YWl0IHRvb2xEZWYuZXhlY3V0ZShwYXJ0LmlucHV0LCB7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlczogcHJlRXhlY01lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBldmVudC5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJ0LnN0YXRlID0gXCJvdXRwdXQtYXZhaWxhYmxlXCI7XG4gICAgICAgICAgICAgICAgcGFydC5vdXRwdXQgPSB0b29sT3V0cHV0O1xuICAgICAgICAgICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIG91dHB1dDogdG9vbE91dHB1dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcGFydC5zdGF0ZSA9IFwib3V0cHV0LWVycm9yXCI7XG4gICAgICAgICAgICAgICAgcGFydC5lcnJvclRleHQgPVxuICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgZXJyb3JUZXh0OiBwYXJ0LmVycm9yVGV4dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhd2FpdCBzdG9yYWdlLnBhcnQuc2V0KHsgLi4uYXAsIHBhcnQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgZW1pdFN0YXR1cyh7XG4gICAgICAgIHdyaXRlcjogc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQsXG4gICAgICAgIHN0YXR1czogeyB0eXBlOiBcInRoaW5raW5nXCIgfSxcbiAgICAgICAgcnBjLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNraWxsc0NvbnRleHQgPSBidWlsZFNraWxsc0NvbnRleHQoc2tpbGxzUmVmKTtcbiAgICAgIGNvbnN0IHN5c3RlbUhlYWRlciA9IGpvaW5Qcm9tcHRTZWN0aW9ucyhcbiAgICAgICAgQkFTRV9TWVNURU1fUFJPTVBULFxuICAgICAgICBzZXNzaW9uLnN5c3RlbVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN5c3RlbUNvbnRleHQgPSBqb2luUHJvbXB0U2VjdGlvbnMoc2tpbGxzQ29udGV4dCk7XG4gICAgICBjb25zdCBzeXN0ZW1NZXNzYWdlcyA9IFtcbiAgICAgICAgLi4uKHN5c3RlbUhlYWRlci50cmltKClcbiAgICAgICAgICA/IFt7IHJvbGU6IFwic3lzdGVtXCIgYXMgY29uc3QsIGNvbnRlbnQ6IHN5c3RlbUhlYWRlciB9XVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4oc3lzdGVtQ29udGV4dC50cmltKClcbiAgICAgICAgICA/IFt7IHJvbGU6IFwic3lzdGVtXCIgYXMgY29uc3QsIGNvbnRlbnQ6IHN5c3RlbUNvbnRleHQgfV1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHVpTWVzc2FnZXMgPSBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQuaXRlbXMsXG4gICAgICAgIHBhcnRzOiBhbGxQYXJ0cyxcbiAgICAgICAgdW50aWw6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICAgICAgZXhjbHVkZVN1YlRvb2xQYXJ0czogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtb2RlbE1lc3NhZ2VzID0gW1xuICAgICAgICAuLi5zeXN0ZW1NZXNzYWdlcyxcbiAgICAgICAgLi4uKGF3YWl0IGNvbnZlcnRUb01vZGVsTWVzc2FnZXModWlNZXNzYWdlcywge1xuICAgICAgICAgIGlnbm9yZUluY29tcGxldGVUb29sQ2FsbHM6IHRydWUsXG4gICAgICAgIH0pKSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHByb21wdENhY2hpbmcgPSBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdCh7XG4gICAgICAgIG1vZGVsOiB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBtb2RlbCA6IG1vZGVsLm1vZGVsSWQsXG4gICAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgICBtZXNzYWdlczogbW9kZWxNZXNzYWdlcyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXNzYWdlczogcHJvbXB0Q2FjaGluZy5tZXNzYWdlcyxcbiAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBwcm9tcHRDYWNoaW5nLnByb3ZpZGVyT3B0aW9ucyxcbiAgICAgIH07XG4gICAgfSxcbiAgICBvblN0ZXBGaW5pc2g6ICh7IHVzYWdlIH0pID0+IHtcbiAgICAgIGlmICh1c2FnZSkge1xuICAgICAgICB1c2FnZVN0ZXBzLnB1c2goe1xuICAgICAgICAgIHN0ZXBJbmRleDogc3RlcEluZGV4T2Zmc2V0ICsgaW50ZXJuYWxTdGVwSW5kZXgsXG4gICAgICAgICAgbW9kZWw6IHNlc3Npb24ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICB0b3RhbFRva2VuczogdXNhZ2UudG90YWxUb2tlbnMgPz8gMCxcbiAgICAgICAgICBjYWNoZVJlYWRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5EZXRhaWxzPy5jYWNoZVJlYWRUb2tlbnMgPz8gMCxcbiAgICAgICAgICBjYWNoZVdyaXRlVG9rZW5zOiB1c2FnZS5pbnB1dFRva2VuRGV0YWlscz8uY2FjaGVXcml0ZVRva2VucyA/PyAwLFxuICAgICAgICAgIHJlYXNvbmluZ1Rva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzPy5yZWFzb25pbmdUb2tlbnMgPz8gMCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpbnRlcm5hbFN0ZXBJbmRleCsrO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IHN0ZXBQYXJ0czogVUlNZXNzYWdlW1wicGFydHNcIl0gPSBbXTtcbiAgbGV0IHdhc0Fib3J0ZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSh7XG4gICAgICBleGVjdXRlOiAoeyB3cml0ZXIgfSkgPT4ge1xuICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCA9IChldmVudDogdW5rbm93bikgPT5cbiAgICAgICAgICB3cml0ZXIud3JpdGUoZXZlbnQgYXMgUGFyYW1ldGVyczx0eXBlb2Ygd3JpdGVyLndyaXRlPlswXSk7XG5cbiAgICAgICAgLy8gTWVyZ2UgdGhlIHN0cmVhbVRleHQgc3RyZWFtLiBwcmVwYXJlU3RlcCBoYW5kbGVzIHNhbmRib3ggc2V0dXAsXG4gICAgICAgIC8vIHNraWxscyBsb2FkaW5nLCBhcHByb3ZhbCBleGVjdXRpb24sIGFuZCBzdGF0dXMgZW1pc3Npb24gYmVmb3JlXG4gICAgICAgIC8vIHRoZSBtb2RlbCBzdGFydHMgZ2VuZXJhdGluZy5cbiAgICAgICAgd3JpdGVyLm1lcmdlKFxuICAgICAgICAgIHJlc3VsdC50b1VJTWVzc2FnZVN0cmVhbSh7XG4gICAgICAgICAgICBnZW5lcmF0ZU1lc3NhZ2VJZDogKCkgPT4gYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgb25GaW5pc2g6ICh7IG1lc3NhZ2VzIH0pID0+IHtcbiAgICAgICAgICAgICAgbGV0IGhhc0FwcHJvdmFscyA9IGZhbHNlO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgbWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobS5yb2xlID09PSBcImFzc2lzdGFudFwiKSB7XG4gICAgICAgICAgICAgICAgICBzdGVwUGFydHMucHVzaCguLi5tLnBhcnRzKTtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBtLnBhcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcInN0YXRlXCIgaW4gcCAmJiBwLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaGFzQXBwcm92YWxzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaGFzQXBwcm92YWxzKSB7XG4gICAgICAgICAgICAgICAgZW1pdFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgICB3cml0ZXI6IHN0cmVhbVdyaXRlclJlZi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiB7IHR5cGU6IFwibmVlZHMtYXBwcm92YWxcIiB9LFxuICAgICAgICAgICAgICAgICAgcnBjLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgc3RyZWFtLnBpcGVUbyh3cml0YWJsZSwgeyBwcmV2ZW50Q2xvc2U6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHdhc0Fib3J0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW3N0cmVhbVRleHRTdGVwXSBzdHJlYW0gZXJyb3I6XCIsIGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHBvbGxDb250cm9sbGVyLmFib3J0KCk7XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBzdGVwUGFydHMubWFwKGFzeW5jICh1aVBhcnQpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoe1xuICAgICAgICBpZDogYHBhcnRfJHt1bGlkKCl9YCxcbiAgICAgICAgaW5kZXg6IG5leHRQYXJ0SW5kZXgrKyxcbiAgICAgICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgICBwYXJ0OiB1aVBhcnQsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pXG4gICk7XG5cbiAgaWYgKHNldFN0YXJ0ZWRQcm9taXNlKSB7XG4gICAgY29uc3Qgc2V0U3RhcnRlZFJlc3VsdCA9IGF3YWl0IHNldFN0YXJ0ZWRQcm9taXNlO1xuICAgIGlmIChzZXRTdGFydGVkUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IHNldFN0YXJ0ZWRSZXN1bHQ7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbSBvZiBzZXRTdGFydGVkUmVzdWx0ID8/IFtdKSB7XG4gICAgICBpZiAobSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IG07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGVuZGluZ0FwcHJvdmFscyA9IHN0ZXBQYXJ0c1xuICAgIC5maWx0ZXIoXG4gICAgICAocCk6IHAgaXMgdHlwZW9mIHAgJiB7IGFwcHJvdmFsOiB7IGlkOiBzdHJpbmcgfSB9ID0+XG4gICAgICAgIFwic3RhdGVcIiBpbiBwICYmXG4gICAgICAgIHAuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVxdWVzdGVkXCIgJiZcbiAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAgJiZcbiAgICAgICAgISEocCBhcyB7IGFwcHJvdmFsPzogeyBpZDogc3RyaW5nIH0gfSkuYXBwcm92YWw/LmlkXG4gICAgKVxuICAgIC5tYXAoKHApID0+ICh7XG4gICAgICBhcHByb3ZhbElkOiBwLmFwcHJvdmFsLmlkLFxuICAgICAgdG9vbE5hbWU6IFwidHlwZVwiIGluIHAgPyBTdHJpbmcocC50eXBlKS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIikgOiBcInVua25vd25cIixcbiAgICB9KSk7XG5cbiAgY29uc3QgZmluYWxGaW5pc2hSZWFzb24gPSB3YXNBYm9ydGVkXG4gICAgPyAoXCJzdG9wXCIgYXMgRmluaXNoUmVhc29uKVxuICAgIDogYXdhaXQgcmVzdWx0LmZpbmlzaFJlYXNvbjtcblxuICByZXR1cm4ge1xuICAgIGZpbmlzaFJlYXNvbjogZmluYWxGaW5pc2hSZWFzb24sXG4gICAgbGFzdFBhcnRJbmRleDogbmV4dFBhcnRJbmRleCxcbiAgICB1c2FnZVN0ZXBzLFxuICAgIHBlbmRpbmdBcHByb3ZhbHMsXG4gICAgbWF4U3RlcHM6IHNlc3Npb24uZ2VuZXJhdGlvbj8ubWF4U3RlcHMsXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTa2lsbHNEaXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFBhcnNlZCBmcm9udG1hdHRlciBmcm9tIGEgU0tJTEwubWQgZmlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2tpbGxGcm9udG1hdHRlciA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBQYXJzZXMgWUFNTCBmcm9udG1hdHRlciBmcm9tIGEgU0tJTEwubWQgZmlsZSBjb250ZW50LlxuICogRnJvbnRtYXR0ZXIgbXVzdCBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIGRlbGltaXRlZCBieSBgLS0tYCBtYXJrZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBtYXJrZG93blxuICogLS0tXG4gKiBuYW1lOiBjc3ZcbiAqIGRlc2NyaXB0aW9uOiBBbmFseXplIENTViBkYXRhXG4gKiAtLS1cbiAqICMgQ1NWIFNraWxsXG4gKiAuLi5cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIFBhcnNlZCBuYW1lIGFuZCBkZXNjcmlwdGlvbiwgb3IgbnVsbCBpZiBmcm9udG1hdHRlciBpcyBtaXNzaW5nL2ludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2tpbGxGcm9udG1hdHRlcihcbiAgY29udGVudDogc3RyaW5nXG4pOiBTa2lsbEZyb250bWF0dGVyIHwgbnVsbCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBjb250ZW50LnRyaW0oKTtcblxuICBpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aChcIi0tLVwiKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZW5kTWFya2VySW5kZXggPSB0cmltbWVkLmluZGV4T2YoXCItLS1cIiwgMyk7XG4gIGlmIChlbmRNYXJrZXJJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZyb250bWF0dGVyQmxvY2sgPSB0cmltbWVkLnNsaWNlKDMsIGVuZE1hcmtlckluZGV4KS50cmltKCk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlU2ltcGxlWWFtbChmcm9udG1hdHRlckJsb2NrKTtcblxuICBpZiAoIShwYXJzZWQubmFtZSAmJiBwYXJzZWQuZGVzY3JpcHRpb24pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6IFN0cmluZyhwYXJzZWQubmFtZSksXG4gICAgZGVzY3JpcHRpb246IFN0cmluZyhwYXJzZWQuZGVzY3JpcHRpb24pLFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBzaW1wbGUgWUFNTCBrZXktdmFsdWUgcGFpcnMgKHNpbmdsZS1saW5lIHZhbHVlcyBvbmx5KS5cbiAqIFRoaXMgYXZvaWRzIGFkZGluZyBhIGZ1bGwgWUFNTCBwYXJzZXIgZGVwZW5kZW5jeSBmb3IgYmFzaWMgZnJvbnRtYXR0ZXIuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2ltcGxlWWFtbCh5YW1sOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIHlhbWwuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9uSW5kZXggPSB0cmltbWVkTGluZS5pbmRleE9mKFwiOlwiKTtcbiAgICBpZiAoY29sb25JbmRleCA9PT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRyaW1tZWRMaW5lLnNsaWNlKDAsIGNvbG9uSW5kZXgpLnRyaW0oKTtcbiAgICBsZXQgdmFsdWUgPSB0cmltbWVkTGluZS5zbGljZShjb2xvbkluZGV4ICsgMSkudHJpbSgpO1xuXG4gICAgLy8gUmVtb3ZlIHN1cnJvdW5kaW5nIHF1b3RlcyBpZiBwcmVzZW50XG4gICAgaWYgKFxuICAgICAgKHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdmFsdWUuZW5kc1dpdGgoJ1wiJykpIHx8XG4gICAgICAodmFsdWUuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsdWUuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgfVxuXG4gICAgaWYgKGtleSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgc2tpbGxzRGlyIHRvIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTa2lsbHNEaXJzKHNraWxsc0Rpcj86IFNraWxsc0Rpcik6IHN0cmluZ1tdIHtcbiAgaWYgKCFza2lsbHNEaXIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc2tpbGxzRGlyKSA/IHNraWxsc0RpciA6IFtza2lsbHNEaXJdO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuLi9zYW5kYm94XCI7XG5pbXBvcnQgeyBwYXJzZVNraWxsRnJvbnRtYXR0ZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBEaXNjb3ZlcnMgc2tpbGxzIGZyb20gZGlyZWN0b3JpZXMgaW5zaWRlIHRoZSBzYW5kYm94IGJ5IGZpbmRpbmcgYW5kIHBhcnNpbmcgU0tJTEwubWQgZmlsZXMuXG4gKiBTY2FucyBlYWNoIGRpcmVjdG9yeSBmb3Igc3ViZGlyZWN0b3JpZXMgY29udGFpbmluZyBTS0lMTC5tZCwgZXh0cmFjdHMgZnJvbnRtYXR0ZXIgbWV0YWRhdGEsXG4gKiBhbmQgcmV0dXJucyBzdW1tYXJpZXMgZm9yIHVzZSBpbiB0aGUgc3lzdGVtIHByb21wdC5cbiAqXG4gKiBAcmV0dXJucyBBcnJheSBvZiBza2lsbCBzdW1tYXJpZXMgKGRlZHVwbGljYXRlZCBieSBuYW1lLCBmaXJzdCBvY2N1cnJlbmNlIHdpbnMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlclNraWxsc0luU2FuZGJveChvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNraWxsc0RpcnM6IHN0cmluZ1tdO1xuICBkZWJ1Zz86IGJvb2xlYW47XG59KTogUHJvbWlzZTxTa2lsbFN1bW1hcnlbXT4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNraWxsc0RpcnMsIGRlYnVnIH0gPSBvcHRzO1xuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcbiAgY29uc3Qgc2Vlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBza2lsbHNEaXIgb2Ygc2tpbGxzRGlycykge1xuICAgIGNvbnN0IGRpclN1bW1hcmllcyA9IGF3YWl0IGRpc2NvdmVyU2tpbGxzSW5EaXJlY3Rvcnkoe1xuICAgICAgc2FuZGJveCxcbiAgICAgIHNraWxsc0RpcixcbiAgICAgIGRlYnVnLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIGRpclN1bW1hcmllcykge1xuICAgICAgaWYgKCFzZWVuTmFtZXMuaGFzKHN1bW1hcnkubmFtZSkpIHtcbiAgICAgICAgc2Vlbk5hbWVzLmFkZChzdW1tYXJ5Lm5hbWUpO1xuICAgICAgICBzdW1tYXJpZXMucHVzaChzdW1tYXJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VtbWFyaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNjb3ZlclNraWxsc0luRGlyZWN0b3J5KG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeVtdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlyLCBkZWJ1ZyB9ID0gb3B0cztcbiAgY29uc3Qgc2tpbGxQYXRocyA9IGF3YWl0IGZpbmRTa2lsbEZpbGVzKHsgc2FuZGJveCwgc2tpbGxzRGlyLCBkZWJ1ZyB9KTtcblxuICBpZiAoc2tpbGxQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBzdW1tYXJpZXM6IFNraWxsU3VtbWFyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBza2lsbE1kUGF0aCBvZiBza2lsbFBhdGhzKSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGF3YWl0IHBhcnNlU2tpbGxGaWxlKHsgc2FuZGJveCwgc2tpbGxNZFBhdGgsIGRlYnVnIH0pO1xuICAgIGlmIChzdW1tYXJ5KSB7XG4gICAgICBzdW1tYXJpZXMucHVzaChzdW1tYXJ5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VtbWFyaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kU2tpbGxGaWxlcyhvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNraWxsc0Rpcjogc3RyaW5nO1xuICBkZWJ1Zz86IGJvb2xlYW47XG59KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNraWxsc0RpciwgZGVidWcgfSA9IG9wdHM7XG5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJmaW5kXCIsXG4gICAgYXJnczogW3NraWxsc0RpciwgXCItbmFtZVwiLCBcIlNLSUxMLm1kXCIsIFwiLXR5cGVcIiwgXCJmXCJdLFxuICB9KTtcblxuICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZGlzY292ZXJdIEZhaWxlZCB0byBzY2FuIHNraWxscyBkaXJlY3RvcnkgXCIke3NraWxsc0Rpcn1cIjogJHtleGVjUmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGUgfSA9IGF3YWl0IGV4ZWNSZXN1bHQucmVzdWx0O1xuICBpZiAoZGVidWcpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbZGlzY292ZXJdIGZpbmQgcmVzdWx0OiBleGl0Q29kZT0ke2V4aXRDb2RlfSwgc3Rkb3V0PVwiJHtzdGRvdXQudHJpbSgpfVwiLCBzdGRlcnI9XCIke3N0ZGVyci50cmltKCl9XCJgXG4gICAgKTtcbiAgfVxuXG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Rpc2NvdmVyXSBTa2lsbHMgZGlyZWN0b3J5IG5vdCBmb3VuZCBvciBpbmFjY2Vzc2libGU6ICR7c2tpbGxzRGlyfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHBhdGhzID0gc3Rkb3V0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC5maWx0ZXIoKHApID0+IHAubGVuZ3RoID4gMCk7XG4gIGlmIChkZWJ1Zykge1xuICAgIGNvbnNvbGUubG9nKFwiW2Rpc2NvdmVyXSBGb3VuZCBza2lsbCBwYXRoczpcIiwgcGF0aHMpO1xuICB9XG4gIHJldHVybiBwYXRocztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VTa2lsbEZpbGUob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBza2lsbE1kUGF0aDogc3RyaW5nO1xuICBkZWJ1Zz86IGJvb2xlYW47XG59KTogUHJvbWlzZTxTa2lsbFN1bW1hcnkgfCBudWxsPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxNZFBhdGgsIGRlYnVnIH0gPSBvcHRzO1xuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImNhdFwiLFxuICAgIGFyZ3M6IFtza2lsbE1kUGF0aF0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtkaXNjb3Zlcl0gRmFpbGVkIHRvIHJlYWQgc2tpbGwgZmlsZSBcIiR7c2tpbGxNZFBhdGh9XCI6ICR7ZXhlY1Jlc3VsdC5tZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGRvdXQsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2Rpc2NvdmVyXSBDb3VsZCBub3QgcmVhZCBza2lsbCBmaWxlOiAke3NraWxsTWRQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlU2tpbGxGcm9udG1hdHRlcihzdGRvdXQpO1xuXG4gIGlmICghcGFyc2VkKSB7XG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZGlzY292ZXJdIEludmFsaWQgb3IgbWlzc2luZyBmcm9udG1hdHRlciBpbjogJHtza2lsbE1kUGF0aH1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgZGVzY3JpcHRpb246IHBhcnNlZC5kZXNjcmlwdGlvbixcbiAgICBza2lsbE1kUGF0aCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBqc29uU2NoZW1hLCB0eXBlIFRvb2xTZXQsIHRvb2wgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50SW5wdXQsIEFnZW50TWVzc2FnZUlucHV0IH0gZnJvbSBcIi4uL2FnZW50LXdvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IFJwY1BheWxvYWQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuLi9zYW5kYm94XCI7XG5pbXBvcnQgeyBERUZBVUxUX1dBSVRfVU5USUwgfSBmcm9tIFwiLi4vc2FuZGJveC9wcm9jZXNzLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveFJlY29yZCwgU2Vzc2lvbiwgU3RvcmFnZSB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBjcmVhdGVKYXZhU2NyaXB0VG9vbCwgdHlwZSBPblN1YlRvb2xDYWxsIH0gZnJvbSBcIi4vamF2YXNjcmlwdFwiO1xuXG5jb25zdCBBR0VOVF9QUk9UT0NPTF9WRVJTSU9OID0gXCJ2MVwiO1xuXG5mdW5jdGlvbiBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGJ5dGVzIDwgMTAyNCkge1xuICAgIHJldHVybiBgJHtieXRlc31gO1xuICB9XG4gIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSB7XG4gICAgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9S2A7XG4gIH1cbiAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgcmV0dXJuIGAkeyhieXRlcyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSl9TWA7XG4gIH1cbiAgcmV0dXJuIGAkeyhieXRlcyAvICgxMDI0ICogMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpfUdgO1xufVxuXG50eXBlIEludGVybmFsVG9vbENvbnRleHQgPSB7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBycGM6IChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0PjtcbiAgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0O1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkO1xuICBhcGlUb29sc01ldGFkYXRhOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIGlucHV0U2NoZW1hPzogdW5rbm93bjtcbiAgfVtdO1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFRvb2xDb250ZXh0PFRDb250ZXh0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBjb250ZXh0OiBUQ29udGV4dDtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsdEluVG9vbHMgPSB7XG4gIFJlYWQ6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZWFkcyBhIGZpbGUgYW5kIHJldHVybnMgaXRzIGNvbnRlbnRzIHdpdGggbWV0YWRhdGEuIEZvciBmaWxlcyBvdmVyIDIwMCBsaW5lcywgYXV0b21hdGljYWxseSBzaG93cyBmaXJzdCAxMDAgbGluZXMgdW5sZXNzIGEgc3BlY2lmaWMgbGluZSByYW5nZSBpcyBwcm92aWRlZC4gVXNlIHN0YXJ0TGluZSBhbmQgZW5kTGluZSBwYXJhbWV0ZXJzIHRvIHJlYWQgc3BlY2lmaWMgcG9ydGlvbnMgb2YgbGFyZ2UgZmlsZXMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290XCIpLFxuICAgICAgc3RhcnRMaW5lOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTdGFydGluZyBsaW5lIG51bWJlciAoMS1pbmRleGVkKS4gSWYgcHJvdmlkZWQgd2l0aCBlbmRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgICAgZW5kTGluZTogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRW5kaW5nIGxpbmUgbnVtYmVyICgxLWluZGV4ZWQsIGluY2x1c2l2ZSkuIElmIHByb3ZpZGVkIHdpdGggc3RhcnRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkZpbGUgY29udGVudFwiKSxcbiAgICAgIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgICAgIHRvdGFsTGluZXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGVcIiksXG4gICAgICAgIGxpbmVzU2hvd246IHpcbiAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJOdW1iZXIgb2YgbGluZXMgaW5jbHVkZWQgaW4gdGhpcyByZXNwb25zZVwiKSxcbiAgICAgICAgc3RhcnRMaW5lOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRmlyc3QgbGluZSBudW1iZXIgc2hvd24gKDEtaW5kZXhlZClcIiksXG4gICAgICAgIGVuZExpbmU6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJMYXN0IGxpbmUgbnVtYmVyIHNob3duICgxLWluZGV4ZWQpXCIpLFxuICAgICAgICBpc1BhZ2luYXRlZDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJXaGV0aGVyIHRoaXMgaXMgYSBwYXJ0aWFsIHZpZXcgb2YgdGhlIGZpbGVcIiksXG4gICAgICAgIGZpbGVTaXplOiB6XG4gICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiSHVtYW4tcmVhZGFibGUgZmlsZSBzaXplIChlLmcuLCAnMi41SycsICcxLjJNJylcIiksXG4gICAgICAgIHBhdGg6IHpcbiAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290XCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBHcmVwOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VhcmNoIGZvciBwYXR0ZXJucyBpbiBmaWxlcyB1c2luZyByaXBncmVwLiBVc2UgdGhpcyB0byBmaW5kIGNvZGUgcGF0dGVybnMsIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBpbXBvcnRzLCBldGMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdHRlcm46IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIlJlZ2V4IHBhdHRlcm4gdG8gc2VhcmNoIGZvciAocmlwZ3JlcCBzeW50YXgpXCIpLFxuICAgICAgcGF0aDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiUGF0aCB0byBzZWFyY2ggaW4gKGRlZmF1bHRzIHRvIHdvcmtzcGFjZSByb290KS4gQ2FuIGJlIGEgZmlsZSBvciBkaXJlY3RvcnkuXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVUeXBlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJGaWxlIHR5cGUgdG8gZmlsdGVyIGJ5IChlLmcuLCAndHMnLCAnanMnLCAncHknLCAnbWQnKS4gVXNlcyByaXBncmVwJ3MgYnVpbHQtaW4gdHlwZSBmaWx0ZXJzLlwiXG4gICAgICAgICksXG4gICAgICBnbG9iOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJHbG9iIHBhdHRlcm4gdG8gZmlsdGVyIGZpbGVzIChlLmcuLCAnKi50c3gnLCAnc3JjLyoqLyoudHMnKVwiXG4gICAgICAgICksXG4gICAgICBjYXNlU2Vuc2l0aXZlOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgLmRlc2NyaWJlKFwiV2hldGhlciBzZWFyY2ggaXMgY2FzZS1zZW5zaXRpdmUgKGRlZmF1bHQ6IHRydWUpXCIpLFxuICAgICAgY29udGV4dExpbmVzOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJOdW1iZXIgb2YgY29udGV4dCBsaW5lcyB0byBzaG93IGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBtYXRjaFwiXG4gICAgICAgICksXG4gICAgICBtYXhDb3VudDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4aW11bSBudW1iZXIgb2YgbWF0Y2hlcyBwZXIgZmlsZSAodXNlZnVsIGZvciBsaW1pdGluZyBvdXRwdXQpXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVzV2l0aE1hdGNoZXM6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiT25seSBzaG93IGZpbGUgcGF0aHMgdGhhdCBjb250YWluIG1hdGNoZXMsIG5vdCB0aGUgbWF0Y2hpbmcgbGluZXMgdGhlbXNlbHZlc1wiXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBtYXRjaGVzOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTZWFyY2ggcmVzdWx0cyB3aXRoIGZpbGUgcGF0aHMsIGxpbmUgbnVtYmVycywgYW5kIG1hdGNoaW5nIGNvbnRlbnRcIlxuICAgICAgICApLFxuICAgICAgc3VtbWFyeTogei5vYmplY3Qoe1xuICAgICAgICBtYXRjaENvdW50OiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIG1hdGNoZXMgZm91bmRcIiksXG4gICAgICAgIGZpbGVDb3VudDogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBmaWxlcyBjb250YWluaW5nIG1hdGNoZXNcIiksXG4gICAgICAgIHNlYXJjaFBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRoYXQgd2FzIHNlYXJjaGVkXCIpLFxuICAgICAgICBwYXR0ZXJuOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0dGVybiB0aGF0IHdhcyBzZWFyY2hlZCBmb3JcIiksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIExpc3Q6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZWN1cnNpdmVseSBsaXN0IGRpcmVjdG9yeSBjb250ZW50cy4gVXNlIHRoaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29kZWJhc2Ugc3RydWN0dXJlLCBmaW5kIGZpbGVzLCBvciBleHBsb3JlIGRpcmVjdG9yaWVzLiBDb250cm9sIGRlcHRoIHRvIGJhbGFuY2UgZGV0YWlsIHZzLiBvdmVydmlldy4gRGVwdGggMSBzaG93cyBpbW1lZGlhdGUgY2hpbGRyZW4sIGRlcHRoIDIgaW5jbHVkZXMgc3ViZGlyZWN0b3JpZXMsIGV0Yy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgcGF0aDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiUGF0aCB0byBsaXN0IChkZWZhdWx0cyB0byB3b3Jrc3BhY2Ugcm9vdClcIiksXG4gICAgICBkZXB0aDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4aW11bSBkZXB0aCB0byB0cmF2ZXJzZS4gQ2hvb3NlIGJhc2VkIG9uIGNvbnRleHQ6IDEtMiBmb3IgcXVpY2sgb3ZlcnZpZXcsIDMtNCBmb3IgZGV0YWlsZWQgZXhwbG9yYXRpb24sIDUrIGZvciBjb21wcmVoZW5zaXZlIG1hcHBpbmdcIlxuICAgICAgICApLFxuICAgICAgaW5jbHVkZUhpZGRlbjogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJJbmNsdWRlIGhpZGRlbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKHRob3NlIHN0YXJ0aW5nIHdpdGggJy4nKVwiXG4gICAgICAgICksXG4gICAgICBmaWxlc09ubHk6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFwiT25seSBzaG93IGZpbGVzLCBub3QgZGlyZWN0b3JpZXNcIiksXG4gICAgICBwYXR0ZXJuOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJHbG9iIHBhdHRlcm4gdG8gZmlsdGVyIHJlc3VsdHMgKGUuZy4sICcqLnRzJywgJyp0ZXN0KicpXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGlzdGluZzogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRGlyZWN0b3J5IHRyZWUgbGlzdGluZyBzaG93aW5nIHBhdGhzIHJlbGF0aXZlIHRvIHNlYXJjaCByb290XCJcbiAgICAgICAgKSxcbiAgICAgIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICAgICAgdG90YWxJdGVtczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBpdGVtcyBmb3VuZFwiKSxcbiAgICAgICAgdG90YWxGaWxlczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBmaWxlcyBmb3VuZFwiKSxcbiAgICAgICAgdG90YWxEaXJzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGZvdW5kXCIpLFxuICAgICAgICBzZWFyY2hQYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0aGF0IHdhcyBsaXN0ZWRcIiksXG4gICAgICAgIGRlcHRoOiB6XG4gICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJNYXhpbXVtIGRlcHRoIHVzZWQgKGlmIHNwZWNpZmllZClcIiksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIFdyaXRlOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiV3JpdGUgY29udGVudCB0byBhIGZpbGUuIENyZWF0ZXMgcGFyZW50IGRpcmVjdG9yaWVzIGF1dG9tYXRpY2FsbHkuIE92ZXJ3cml0ZXMgZXhpc3RpbmcgZmlsZXMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290XCIpLFxuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkNvbnRlbnQgdG8gd3JpdGUgdG8gdGhlIGZpbGVcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdWNjZXNzOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgdGhlIHdyaXRlIHN1Y2NlZWRlZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSB3cml0dGVuIGZpbGVcIiksXG4gICAgICBieXRlc1dyaXR0ZW46IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlblwiKSxcbiAgICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBtZXNzYWdlIGlmIHdyaXRlIGZhaWxlZFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEVkaXQ6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFZGl0IGEgZmlsZSBieSByZXBsYWNpbmcgYW4gZXhhY3Qgc3RyaW5nLiBGYWlscyBpZiBvbGRfc3RyaW5nIGlzIG5vdCBmb3VuZCBvciBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIChub3QgdW5pcXVlKS4gRm9yIG11bHRpcGxlIHJlcGxhY2VtZW50cywgY2FsbCB0aGlzIHRvb2wgbXVsdGlwbGUgdGltZXMgd2l0aCB1bmlxdWUgY29udGV4dC5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gd29ya3NwYWNlIHJvb3RcIiksXG4gICAgICBvbGRfc3RyaW5nOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJFeGFjdCBzdHJpbmcgdG8gZmluZCBhbmQgcmVwbGFjZSAobXVzdCBiZSB1bmlxdWUgaW4gZmlsZSlcIiksXG4gICAgICBuZXdfc3RyaW5nOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU3RyaW5nIHRvIHJlcGxhY2Ugb2xkX3N0cmluZyB3aXRoXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3VjY2Vzczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJXaGV0aGVyIHRoZSBlZGl0IHN1Y2NlZWRlZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBlZGl0ZWQgZmlsZVwiKSxcbiAgICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBtZXNzYWdlIGlmIGVkaXQgZmFpbGVkXCIpLFxuICAgIH0pLFxuICB9KSxcbiAgQmFzaDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkV4ZWN1dGVzIGEgYmFzaCBjb21tYW5kIGluc2lkZSB0aGUgd29ya3NwYWNlLiBDV0QgcGVyc2lzdHMgYmV0d2VlbiBjb21tYW5kcyB3aXRoaW4gYSBzZXNzaW9uLiBVc2Ugd2FpdFVudGlsOjAgZm9yIGJhY2tncm91bmQgcHJvY2Vzc2VzIChkZXYgc2VydmVycykuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbW1hbmQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJUaGUgc2hlbGwgY29tbWFuZCB0byBleGVjdXRlXCIpLFxuICAgICAgd2FpdFVudGlsOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgYE1heCBtcyB0byB3YWl0IGZvciBjb21wbGV0aW9uIChkZWZhdWx0OiAke0RFRkFVTFRfV0FJVF9VTlRJTH0pLiBVc2UgMCB0byBydW4gaW4gYmFja2dyb3VuZCBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LmBcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBpZDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU3lzdGVtIFBJRCAoMCBmb3IgZm9yZWdyb3VuZCwgPjAgZm9yIGJhY2tncm91bmQgLSB1c2UgdG8ga2lsbClcIlxuICAgICAgICApLFxuICAgICAgb3V0cHV0OiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJDb21tYW5kIHN0ZG91dCtzdGRlcnIgY29tYmluZWQgKGVtcHR5IGZvciBiYWNrZ3JvdW5kKVwiKSxcbiAgICAgIGV4aXRDb2RlOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRXhpdCBjb2RlICgtMSBmb3IgYmFja2dyb3VuZC9ydW5uaW5nKVwiKSxcbiAgICAgIHN0YXR1czogelxuICAgICAgICAuZW51bShbXCJydW5uaW5nXCIsIFwiY29tcGxldGVkXCIsIFwiZmFpbGVkXCJdKVxuICAgICAgICAuZGVzY3JpYmUoXCJQcm9jZXNzIHN0YXR1c1wiKSxcbiAgICAgIGN3ZDogei5zdHJpbmcoKS5kZXNjcmliZShcIkN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYWZ0ZXIgY29tbWFuZFwiKSxcbiAgICAgIG91dHB1dEZpbGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIlBhdGggdG8gb3V0cHV0IGxvZyAoZm9yIGJhY2tncm91bmQgcHJvY2Vzc2VzKVwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEphdmFTY3JpcHQ6IHRvb2woe1xuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb2RlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJKYXZhU2NyaXB0IGFzeW5jIGZ1bmN0aW9uIGJvZHkuIGBjdHhgIGlzIGluIHNjb3BlLiBNdXN0IHVzZSBgcmV0dXJuYCB0byBwcm9kdWNlIG91dHB1dC5cIlxuICAgICAgICApLFxuICAgIH0pLFxuICB9KSxcbn0gc2F0aXNmaWVzIFRvb2xTZXQ7XG5cbmV4cG9ydCB0eXBlIEJ1aWx0SW5Ub29sTmFtZSA9IGtleW9mIHR5cGVvZiBidWlsdEluVG9vbHM7XG5leHBvcnQgY29uc3QgYnVpbHRpblRvb2xOYW1lcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgT2JqZWN0LmVudHJpZXMoYnVpbHRJblRvb2xzKS5tYXAoKFtuYW1lXSkgPT4gW25hbWUsIG5hbWVdKVxuKSBhcyB7IFtLIGluIEJ1aWx0SW5Ub29sTmFtZV06IEsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2xzKGNvbnRleHQ6IEludGVybmFsVG9vbENvbnRleHQpIHtcbiAgY29uc3QgdG9vbHM6IFRvb2xTZXQgPSB7XG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuUmVhZF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLlJlYWQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBzdGFydExpbmUsIGVuZExpbmUgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGg7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LnJlYWRGaWxlKHsgcGF0aDogZmlsZVBhdGggfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIltSZWFkIFRvb2xdXCIsIHJlc3VsdCk7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBgRXJyb3I6IEZpbGUgbm90IGZvdW5kIC0gJHtmaWxlUGF0aH1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgdG90YWxMaW5lczogMCxcbiAgICAgICAgICAgICAgbGluZXNTaG93bjogMCxcbiAgICAgICAgICAgICAgc3RhcnRMaW5lOiAwLFxuICAgICAgICAgICAgICBlbmRMaW5lOiAwLFxuICAgICAgICAgICAgICBpc1BhZ2luYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgIGZpbGVTaXplOiBcIjBcIixcbiAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmdWxsQ29udGVudCA9IHJlc3VsdC50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGZ1bGxDb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAvLyBBIHRyYWlsaW5nIG5ld2xpbmUgcHJvZHVjZXMgYW4gZW1wdHkgbGFzdCBlbGVtZW50IFx1MjAxNCByZW1vdmUgaXRcbiAgICAgICAgLy8gc28gbGluZSBjb3VudCBtYXRjaGVzIGB3YyAtbGAgLyBgYXdrICdFTkR7cHJpbnQgTlJ9J2AgYmVoYXZpb3IuXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzLmF0KC0xKSA9PT0gXCJcIikge1xuICAgICAgICAgIGxpbmVzLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsTGluZXMgPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZpbGVCeXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGZ1bGxDb250ZW50KTtcbiAgICAgICAgY29uc3QgZmlsZVNpemUgPSBmb3JtYXRGaWxlU2l6ZShmaWxlQnl0ZXMpO1xuXG4gICAgICAgIC8vIERldGVybWluZSByYW5nZVxuICAgICAgICBjb25zdCBQQUdFX1NJWkUgPSAxMDA7XG4gICAgICAgIGxldCBhY3R1YWxTdGFydDogbnVtYmVyO1xuICAgICAgICBsZXQgYWN0dWFsRW5kOiBudW1iZXI7XG5cbiAgICAgICAgaWYgKHN0YXJ0TGluZSAhPT0gdW5kZWZpbmVkICYmIGVuZExpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gc3RhcnRMaW5lO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IGVuZExpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhcnRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IHN0YXJ0TGluZTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBNYXRoLm1pbihzdGFydExpbmUgKyBQQUdFX1NJWkUgLSAxLCB0b3RhbExpbmVzKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbmRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IDE7XG4gICAgICAgICAgYWN0dWFsRW5kID0gZW5kTGluZTtcbiAgICAgICAgfSBlbHNlIGlmICh0b3RhbExpbmVzID4gMjAwKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IFBBR0VfU0laRTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IDE7XG4gICAgICAgICAgYWN0dWFsRW5kID0gdG90YWxMaW5lcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGxpbmUgcmFuZ2UgKDEtaW5kZXhlZClcbiAgICAgICAgY29uc3Qgc2xpY2VkTGluZXMgPSBsaW5lcy5zbGljZShhY3R1YWxTdGFydCAtIDEsIGFjdHVhbEVuZCk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzbGljZWRMaW5lcy5qb2luKFwiXFxuXCIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHRvdGFsTGluZXMsXG4gICAgICAgICAgICBsaW5lc1Nob3duOiBNYXRoLm1heCgwLCBhY3R1YWxFbmQgLSBhY3R1YWxTdGFydCArIDEpLFxuICAgICAgICAgICAgc3RhcnRMaW5lOiBhY3R1YWxTdGFydCxcbiAgICAgICAgICAgIGVuZExpbmU6IGFjdHVhbEVuZCxcbiAgICAgICAgICAgIGlzUGFnaW5hdGVkOiBhY3R1YWxFbmQgPCB0b3RhbExpbmVzLFxuICAgICAgICAgICAgZmlsZVNpemUsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkdyZXBdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5HcmVwLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHtcbiAgICAgICAgcGF0dGVybixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIGdsb2IsXG4gICAgICAgIGNhc2VTZW5zaXRpdmUsXG4gICAgICAgIGNvbnRleHRMaW5lcyxcbiAgICAgICAgbWF4Q291bnQsXG4gICAgICAgIGZpbGVzV2l0aE1hdGNoZXMsXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhdGggPSBwYXRoID8/IFwiLlwiO1xuXG4gICAgICAgIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgYXJncy5wdXNoKFwiLS1saW5lLW51bWJlclwiKTtcbiAgICAgICAgYXJncy5wdXNoKFwiLS1oZWFkaW5nXCIpO1xuICAgICAgICBhcmdzLnB1c2goXCItLWNvbG9yXCIsIFwibmV2ZXJcIik7XG5cbiAgICAgICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLWlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLXR5cGVcIiwgZmlsZVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdsb2IpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLWdsb2JcIiwgZ2xvYik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItQ1wiLCBTdHJpbmcoY29udGV4dExpbmVzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi0tbWF4LWNvdW50XCIsIFN0cmluZyhtYXhDb3VudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVzV2l0aE1hdGNoZXMpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLWZpbGVzLXdpdGgtbWF0Y2hlc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3MucHVzaChcIi0tXCIsIHBhdHRlcm4sIHNlYXJjaFBhdGgpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJyZ1wiLCBhcmdzIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbR3JlcCBUb29sXVwiLCByZXN1bHQpO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0ZGVyciAmJiAhc3RkZXJyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJubyBtYXRjaGVzXCIpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW0dyZXAgVG9vbF0gV2FybmluZzogJHtzdGRlcnJ9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnVuY2F0ZSBvdXRwdXQgdG8gcHJldmVudCBcImlucHV0IHRvbyBsb25nXCIgZXJyb3JzICg1MGsgY2hhcnMgXHUyMjQ4IDEyLjVrIHRva2VucylcbiAgICAgICAgY29uc3QgTUFYX0dSRVBfT1VUUFVUX0NIQVJTID0gNTBfMDAwO1xuICAgICAgICBsZXQgZmluYWxPdXRwdXQgPSBzdGRvdXQ7XG4gICAgICAgIGxldCB3YXNUcnVuY2F0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGZpbmFsT3V0cHV0Lmxlbmd0aCA+IE1BWF9HUkVQX09VVFBVVF9DSEFSUykge1xuICAgICAgICAgIGZpbmFsT3V0cHV0ID1cbiAgICAgICAgICAgIGZpbmFsT3V0cHV0LnNsaWNlKDAsIE1BWF9HUkVQX09VVFBVVF9DSEFSUykgK1xuICAgICAgICAgICAgXCJcXG5cXG5bT3V0cHV0IHRydW5jYXRlZCAtIHVzZSBtb3JlIHNwZWNpZmljIHBhdHRlcm4gb3IgcGF0aF1cIjtcbiAgICAgICAgICB3YXNUcnVuY2F0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZXMgPSBmaW5hbE91dHB1dFxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAuZmlsdGVyKChsKSA9PiBsLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBmaWxlQ291bnQgPSBmaWxlc1dpdGhNYXRjaGVzXG4gICAgICAgICAgPyBsaW5lcy5sZW5ndGhcbiAgICAgICAgICA6IG5ldyBTZXQoXG4gICAgICAgICAgICAgIGxpbmVzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigobCkgPT4gIWwuc3RhcnRzV2l0aChcIiBcIikgJiYgbC5pbmNsdWRlcyhcIjpcIikpXG4gICAgICAgICAgICAgICAgLm1hcCgobCkgPT4gbC5zcGxpdChcIjpcIilbMF0pXG4gICAgICAgICAgICApLnNpemU7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgICBtYXRjaENvdW50OiBmaWxlc1dpdGhNYXRjaGVzXG4gICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICA6IGxpbmVzLmZpbHRlcigobCkgPT4gbC5pbmNsdWRlcyhcIjpcIikpLmxlbmd0aCxcbiAgICAgICAgICAgIGZpbGVDb3VudCxcbiAgICAgICAgICAgIHNlYXJjaFBhdGgsXG4gICAgICAgICAgICBwYXR0ZXJuLFxuICAgICAgICAgICAgd2FzVHJ1bmNhdGVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF0Y2hlczogZmluYWxPdXRwdXQgfHwgXCIobm8gbWF0Y2hlcyBmb3VuZClcIixcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuTGlzdF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkxpc3QsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBkZXB0aCwgaW5jbHVkZUhpZGRlbiwgZmlsZXNPbmx5LCBwYXR0ZXJuIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGF0aCA9IHBhdGggPz8gXCIuXCI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LmV4ZWMoe1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHNldCAtZVxuICAgICAgICAgICAgU0VBUkNIX1BBVEg9XCIkMVwiXG4gICAgICAgICAgICBERVBUSD1cIiQyXCJcbiAgICAgICAgICAgIElOQ0xVREVfSElEREVOPVwiJDNcIlxuICAgICAgICAgICAgRklMRVNfT05MWT1cIiQ0XCJcbiAgICAgICAgICAgIFBBVFRFUk49XCIkNVwiXG5cbiAgICAgICAgICAgICMgQnVpbGQgZmluZCBjb21tYW5kIGFyZ3VtZW50c1xuICAgICAgICAgICAgRklORF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLW1heGRlcHRoICRERVBUSFwiXG4gICAgICAgICAgICBbIFwiJElOQ0xVREVfSElEREVOXCIgIT0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTICEgLXBhdGggJyovLionXCJcbiAgICAgICAgICAgIFsgXCIkRklMRVNfT05MWVwiID0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC10eXBlIGZcIlxuICAgICAgICAgICAgWyAtbiBcIiRQQVRURVJOXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC1uYW1lICckUEFUVEVSTidcIlxuXG4gICAgICAgICAgICAjIEdldCBsaXN0aW5nXG4gICAgICAgICAgICBMSVNUSU5HPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJEZJTkRfQVJHU1wiIDI+L2Rldi9udWxsIHwgc29ydClcblxuICAgICAgICAgICAgIyBHZXQgY291bnRzXG4gICAgICAgICAgICBDT1VOVF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAtbWF4ZGVwdGggJERFUFRIXCJcbiAgICAgICAgICAgIFsgXCIkSU5DTFVERV9ISURERU5cIiAhPSBcInRydWVcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAhIC1wYXRoICcqLy4qJ1wiXG5cbiAgICAgICAgICAgIEZJTEVfQ09VTlQ9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkQ09VTlRfQVJHUyAtdHlwZSBmXCIgMj4vZGV2L251bGwgfCB3YyAtbClcbiAgICAgICAgICAgIERJUl9DT1VOVD0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRDT1VOVF9BUkdTIC10eXBlIGRcIiAyPi9kZXYvbnVsbCB8IHdjIC1sKVxuXG4gICAgICAgICAgICAjIE91dHB1dDogY291bnRzIGZpcnN0LCB0aGVuIGxpc3RpbmdcbiAgICAgICAgICAgIGVjaG8gXCIkRklMRV9DT1VOVHwkRElSX0NPVU5UXCJcbiAgICAgICAgICAgIGVjaG8gXCJ8fHxMSVNUSU5HfHx8XCJcbiAgICAgICAgICAgIGVjaG8gXCIkTElTVElOR1wiIHwgc2VkIFwic3xeJFNFQVJDSF9QQVRIfC58XCJcbiAgICAgICAgICBgLFxuICAgICAgICAgICAgXCItLVwiLFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIGRlcHRoPy50b1N0cmluZygpIHx8IFwiXCIsXG4gICAgICAgICAgICBpbmNsdWRlSGlkZGVuID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBmaWxlc09ubHkgPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIHBhdHRlcm4gfHwgXCJcIixcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0xpc3QgVG9vbF1cIiwgcmVzdWx0KTtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtMaXN0IFRvb2xdIHN0ZGVycjogJHtzdGRlcnJ9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbY291bnRzTGluZSwgLi4ucmVzdF0gPSBzdGRvdXQuc3BsaXQoXCJ8fHxMSVNUSU5HfHx8XCIpO1xuICAgICAgICBjb25zdCBsaXN0aW5nID0gcmVzdC5qb2luKFwifHx8TElTVElOR3x8fFwiKS50cmltKCk7XG4gICAgICAgIGNvbnN0IFtmaWxlQ291bnRTdHIsIGRpckNvdW50U3RyXSA9IGNvdW50c0xpbmUudHJpbSgpLnNwbGl0KFwifFwiKTtcblxuICAgICAgICBjb25zdCB0b3RhbEZpbGVzID0gTnVtYmVyLnBhcnNlSW50KGZpbGVDb3VudFN0ciwgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IHRvdGFsRGlycyA9IE51bWJlci5wYXJzZUludChkaXJDb3VudFN0ciwgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gbGlzdGluZy5zcGxpdChcIlxcblwiKS5maWx0ZXIoKGwpID0+IGwubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiBsaW5lcy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbEZpbGVzLFxuICAgICAgICAgICAgdG90YWxEaXJzLFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGlzdGluZyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuV3JpdGVdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5Xcml0ZSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoLnNsaWNlKDEpIDogcGF0aDtcbiAgICAgICAgY29uc3QgZGlyID0gZmlsZVBhdGguaW5jbHVkZXMoXCIvXCIpXG4gICAgICAgICAgPyBmaWxlUGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpXG4gICAgICAgICAgOiBcIi5cIjtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5zcGxpdChcIi9cIikucG9wKCkgfHwgZmlsZVBhdGg7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoZGlyICE9PSBcIi5cIikge1xuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5zYW5kYm94LmV4ZWMoeyBjb21tYW5kOiBcIm1rZGlyXCIsIGFyZ3M6IFtcIi1wXCIsIGRpcl0gfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgY29udGV4dC5zYW5kYm94LndyaXRlRmlsZXMoe1xuICAgICAgICAgICAgZmlsZXM6IFt7IHBhdGg6IGZpbGVOYW1lLCBjb250ZW50IH1dLFxuICAgICAgICAgICAgZGVzdFBhdGg6IGRpcixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBieXRlc1dyaXR0ZW46IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbnRlbnQsIFwidXRmOFwiKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGJ5dGVzV3JpdHRlbjogMCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1zZyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkVkaXRdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5FZGl0LFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgb2xkX3N0cmluZywgbmV3X3N0cmluZyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGguc2xpY2UoMSkgOiBwYXRoO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc2FuZGJveC5yZWFkRmlsZSh7IHBhdGg6IGZpbGVQYXRoIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBwYXRoOiBmaWxlUGF0aCwgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBlcnJvcjogYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVQYXRofWAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSByZXN1bHQudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250ZW50LnNwbGl0KG9sZF9zdHJpbmcpLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgaWYgKG9jY3VycmVuY2VzID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBlcnJvcjogXCJvbGRfc3RyaW5nIG5vdCBmb3VuZCBpbiBmaWxlXCIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvY2N1cnJlbmNlcyA+IDEpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBgb2xkX3N0cmluZyBhcHBlYXJzICR7b2NjdXJyZW5jZXN9IHRpbWVzIGluIGZpbGUgKG11c3QgYmUgdW5pcXVlKS4gSW5jbHVkZSBtb3JlIHN1cnJvdW5kaW5nIGNvbnRleHQgdG8gbWFrZSB0aGUgbWF0Y2ggdW5pcXVlLmAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob2xkX3N0cmluZywgbmV3X3N0cmluZyk7XG4gICAgICAgIGNvbnN0IGRpciA9IGZpbGVQYXRoLmluY2x1ZGVzKFwiL1wiKVxuICAgICAgICAgID8gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKVxuICAgICAgICAgIDogXCIuXCI7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnBvcCgpIHx8IGZpbGVQYXRoO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY29udGV4dC5zYW5kYm94LndyaXRlRmlsZXMoe1xuICAgICAgICAgICAgZmlsZXM6IFt7IHBhdGg6IGZpbGVOYW1lLCBjb250ZW50OiBuZXdDb250ZW50IH1dLFxuICAgICAgICAgICAgZGVzdFBhdGg6IGRpcixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHBhdGg6IGZpbGVQYXRoIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBwYXRoOiBmaWxlUGF0aCwgZXJyb3I6IGVycm9yTXNnIH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuQmFzaF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkJhc2gsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBjb21tYW5kLCB3YWl0VW50aWwgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNyZWF0ZVByb2Nlc3NNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgXCIuLi9zYW5kYm94L3Byb2Nlc3MtbWFuYWdlclwiXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc01hbmFnZXIgPSBjcmVhdGVQcm9jZXNzTWFuYWdlcih7XG4gICAgICAgICAgc2FuZGJveDogY29udGV4dC5zYW5kYm94LFxuICAgICAgICAgIHNlc3Npb25JZDogY29udGV4dC5pbnB1dC5zZXNzaW9uSWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHByb2Nlc3NNYW5hZ2VyLmluaXQoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc01hbmFnZXIucnVuKHsgY29tbWFuZCwgd2FpdFVudGlsIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICB9KSxcbiAgfTtcblxuICBpZiAoY29udGV4dC5hcGlUb29sc01ldGFkYXRhLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBhcGlUb29scyA9IGJ1aWxkQXBpVG9vbHMoe1xuICAgICAgcnBjOiBjb250ZXh0LnJwYyxcbiAgICAgIG1ldGFkYXRhOiBjb250ZXh0LmFwaVRvb2xzTWV0YWRhdGEsXG4gICAgICBzZXNzaW9uOiBjb250ZXh0LnNlc3Npb24sXG4gICAgICBzYW5kYm94UmVjb3JkOiBjb250ZXh0LnNhbmRib3hSZWNvcmQsXG4gICAgICBjb250ZXh0OiBjb250ZXh0LmV2ZW50LmNvbnRleHQsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbih0b29scywgYXBpVG9vbHMpO1xuICB9XG5cbiAgdG9vbHNbYnVpbHRpblRvb2xOYW1lcy5KYXZhU2NyaXB0XSA9IGNyZWF0ZUphdmFTY3JpcHRUb29sKHtcbiAgICB0b29scyxcbiAgICBzZXNzaW9uOiBjb250ZXh0LnNlc3Npb24sXG4gICAgc2FuZGJveDogY29udGV4dC5zYW5kYm94LFxuICAgIG9uU3ViVG9vbENhbGw6IGNvbnRleHQub25TdWJUb29sQ2FsbCxcbiAgfSk7XG5cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG50eXBlIEFwaVRvb2xNZXRhZGF0YSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaW5wdXRTY2hlbWE/OiB1bmtub3duO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQXBpVG9vbHNNZXRhZGF0YShvcHRzOiB7XG4gIHJwYzogKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+O1xufSk6IFByb21pc2U8QXBpVG9vbE1ldGFkYXRhW10+IHtcbiAgY29uc3QgeyBycGMgfSA9IG9wdHM7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKHsgbWV0aG9kOiBcInRvb2xzLmxpc3RcIiwgcGFyYW1zOiB7fSB9KTtcblxuICBpZiAoXCJlcnJvclwiIGluIHJlc3VsdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbYWdlbnRdIEZhaWxlZCB0byBmZXRjaCB0b29sczpcIiwgcmVzdWx0LmVycm9yPy5tZXNzYWdlKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gKHJlc3VsdC5yZXN1bHQgYXMgQXBpVG9vbE1ldGFkYXRhW10pID8/IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcGlUb29scyhvcHRzOiB7XG4gIHJwYzogKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+O1xuICBtZXRhZGF0YTogQXBpVG9vbE1ldGFkYXRhW107XG4gIHNlc3Npb246IFNlc3Npb247XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQ7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufSk6IFRvb2xTZXQge1xuICBjb25zdCB7IHJwYywgbWV0YWRhdGEsIHNlc3Npb24sIHNhbmRib3hSZWNvcmQsIGNvbnRleHQgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xzOiBUb29sU2V0ID0ge307XG5cbiAgZm9yIChjb25zdCBtZXRhIG9mIG1ldGFkYXRhKSB7XG4gICAgdG9vbHNbbWV0YS5uYW1lXSA9IHRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IG1ldGEuZGVzY3JpcHRpb24gPz8gYEN1c3RvbSB0b29sOiAke21ldGEubmFtZX1gLFxuICAgICAgaW5wdXRTY2hlbWE6IG1ldGEuaW5wdXRTY2hlbWFcbiAgICAgICAgPyBqc29uU2NoZW1hKG1ldGEuaW5wdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2YganNvblNjaGVtYT5bMF0pXG4gICAgICAgIDogei5vYmplY3Qoe30pLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyh7XG4gICAgICAgICAgbWV0aG9kOiBcInRvb2xzLmV4ZWN1dGVcIixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG5hbWU6IG1ldGEubmFtZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgICAgIHNhbmRib3hSZWNvcmQsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb29sIGV4ZWN1dGlvbiBmYWlsZWQ6ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFwaVVybChvcHRzOiB7IGFwaTogc3RyaW5nIHwgdW5kZWZpbmVkIH0pOiBzdHJpbmcge1xuICBsZXQgb3JpZ2luID0gXCJcIjtcbiAgbGV0IHBhdGggPSBgLy53ZWxsLWtub3duL2FnZW50LyR7QUdFTlRfUFJPVE9DT0xfVkVSU0lPTn1gO1xuXG4gIGlmIChvcHRzLmFwaSkge1xuICAgIGlmIChvcHRzLmFwaS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgcGF0aCA9IG9wdHMuYXBpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZWUgaWYgaXQncyBmdWxsXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdHMuYXBpKTtcbiAgICAgICAgb3JpZ2luID0gdXJsLm9yaWdpbjtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoICsgdXJsLmhhc2g7XG4gICAgICAgIGlmIChmdWxsUGF0aC5zdGFydHNXaXRoKFwiL1wiKSAmJiBmdWxsUGF0aCAhPT0gXCIvXCIpIHtcbiAgICAgICAgICBwYXRoID0gZnVsbFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBub29wXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcmlnaW4pIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgb3JpZ2luID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuUE9SVCA/PyBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19QT1JUID8/IDMwMDBcbiAgICAgIH1gO1xuICAgIH1cbiAgICBjb25zdCB2ZXJjZWxVcmwgPVxuICAgICAgcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCA/PyBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19WRVJDRUxfVVJMO1xuICAgIGlmICh2ZXJjZWxVcmwpIHtcbiAgICAgIG9yaWdpbiA9IGBodHRwczovLyR7dmVyY2VsVXJsfWA7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcmlnaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlthZ2VudF0gQ291bGRuJ3QgZGV0ZXJtaW5lIEFQSSBvcmlnaW4gKG5vIG9yaWdpbiBkZXRlY3RlZCBpbiBgYXBpYCBvcHRpb24gYW5kIG5vIFZFUkNFTF9VUkwgc2V0KVwiXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBgJHtvcmlnaW59JHtwYXRofWA7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBUb29sU2V0LCB0b29sIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4uL3NhbmRib3hcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbiB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBidWlsdEluVG9vbHMgfSBmcm9tIFwiLlwiO1xuXG5leHBvcnQgY29uc3QgSkFWQVNDUklQVF9UT09MX05BTUUgPSBcIkphdmFTY3JpcHRcIjtcblxuZXhwb3J0IHR5cGUgU3ViVG9vbENhbGxSZXN1bHQgPSB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBPblN1YlRvb2xDYWxsID0gKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogdW5rbm93bixcbiAgZXhlY3V0ZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxuKSA9PiBQcm9taXNlPFN1YlRvb2xDYWxsUmVzdWx0PjtcblxuY29uc3QgUkVRVUVTVF9NQVJLRVJfU1RBUlQgPSBcIl9fVE9PTF9SRVFVRVNUX19cIjtcbmNvbnN0IFJFUVVFU1RfTUFSS0VSX0VORCA9IFwiX19UT09MX1JFUVVFU1RfRU5EX19cIjtcbmNvbnN0IEVYRUNVVElPTl9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBUaGUgcnVubmVyIHNjcmlwdCBpcyB3cml0dGVuIHRvIHRoZSBzYW5kYm94IGFuZCBleGVjdXRlZCB2aWEgTm9kZS5qcy5cbiAqIEl0IHJlYWRzIHRoZSBtb2RlbCdzIGNvZGUgZnJvbSBjb2RlLmpzLCBzZXRzIHVwIGN0eC50b29scyBhcyBSUEMgcHJveGllc1xuICogKHJlcXVlc3RzIHNlbnQgdmlhIHN0ZGVyciBtYXJrZXJzLCByZXNwb25zZXMgcG9sbGVkIGZyb20gZmlsZXMpLCBleGVjdXRlc1xuICogdGhlIGNvZGUsIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byBzdGRvdXQgYXMgSlNPTi5cbiAqL1xuY29uc3QgUlVOTkVSX1NDUklQVCA9IGBcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgZXhpc3RzU3luYywgdW5saW5rU3luYywgbWtkaXJTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmNvbnN0IFNDUklQVF9ESVIgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5jb25zdCBUT09MX0NBTExfVElNRU9VVF9NUyA9IDMwMF8wMDA7XG5cbmxldCByZXFDb3VudGVyID0gMDtcblxuYXN5bmMgZnVuY3Rpb24gY2FsbFRvb2wobmFtZSwgaW5wdXQpIHtcbiAgY29uc3QgaWQgPSAncmVxXycgKyAoKytyZXFDb3VudGVyKSArICdfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHJlc3BvbnNlRmlsZSA9IGpvaW4oU0NSSVBUX0RJUiwgaWQgKyAnLnJlc3BvbnNlLmpzb24nKTtcblxuICBjb25zdCByZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoeyBpZCwgdG9vbDogbmFtZSwgaW5wdXQgfSk7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcke1JFUVVFU1RfTUFSS0VSX1NUQVJUfScgKyByZXF1ZXN0ICsgJyR7UkVRVUVTVF9NQVJLRVJfRU5EfScgKyAnXFxcXG4nKTtcblxuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIHdoaWxlICghZXhpc3RzU3luYyhyZXNwb25zZUZpbGUpKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGFydCA+IFRPT0xfQ0FMTF9USU1FT1VUX01TKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rvb2wgY2FsbCAnICsgbmFtZSArICcgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAzMCkpO1xuICB9XG5cbiAgbGV0IHJhdztcbiAgdHJ5IHtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJhdyk7XG4gIHRyeSB7IHVubGlua1N5bmMocmVzcG9uc2VGaWxlKTsgfSBjYXRjaCB7fVxuXG4gIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdDtcbn1cblxuY29uc3QgY29kZSA9IHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICdjb2RlLmpzJyksICd1dGY4Jyk7XG5jb25zdCB0b29sTmFtZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICd0b29scy5qc29uJyksICd1dGY4JykpO1xuXG5jb25zdCBjdHggPSB7IHRvb2xzOiB7fSB9O1xuZm9yIChjb25zdCBuYW1lIG9mIHRvb2xOYW1lcykge1xuICBjdHgudG9vbHNbbmFtZV0gPSAoaW5wdXQpID0+IGNhbGxUb29sKG5hbWUsIGlucHV0KTtcbn1cblxuY29uc3QgbG9ncyA9IFtdO1xuY29uc3QgY3VzdG9tQ29uc29sZSA9IHtcbiAgbG9nOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxuICBlcnJvcjogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaCgnW2Vycm9yXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG4gIHdhcm46ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goJ1t3YXJuXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG59O1xuXG50cnkge1xuICBjb25zdCBBc3luY0Z1bmN0aW9uID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGFzeW5jIGZ1bmN0aW9uKCkge30pLmNvbnN0cnVjdG9yO1xuICBjb25zdCBmbiA9IG5ldyBBc3luY0Z1bmN0aW9uKCdjdHgnLCAnY29uc29sZScsIGNvZGUpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihjdHgsIGN1c3RvbUNvbnNvbGUpO1xuXG4gIGNvbnN0IG91dHB1dCA9IHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiByZXN1bHQgIT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IG51bGwgfTtcbiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgb3V0cHV0LmxvZ3MgPSBsb2dzO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKTtcbn0gY2F0Y2ggKGVycikge1xuICBjb25zdCBvdXRwdXQgPSB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgKyAnXFxcXG4nICsgZXJyLnN0YWNrIDogU3RyaW5nKGVyciksXG4gIH07XG4gIGlmIChsb2dzLmxlbmd0aCA+IDApIG91dHB1dC5sb2dzID0gbG9ncztcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkob3V0cHV0KSk7XG59XG5gO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgcGxhaW4gSlNPTiBTY2hlbWEgZnJvbSB3aGF0ZXZlciBmb3JtYXQgdGhlIEFJIFNESyB0b29sIHVzZXNcbiAqIChab2Qgc2NoZW1hLCBBSSBTREsgd3JhcHBlZCBzY2hlbWEsIG9yIHJhdyBKU09OIFNjaGVtYSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SnNvblNjaGVtYShcbiAgc2NoZW1hOiB1bmtub3duXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwge1xuICBpZiAoIXNjaGVtYSB8fCB0eXBlb2Ygc2NoZW1hICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoXG4gICAgXCJfZGVmXCIgaW4gc2NoZW1hICYmXG4gICAgdHlwZW9mIChzY2hlbWEgYXMgeyBfZGVmOiB1bmtub3duIH0pLl9kZWYgPT09IFwib2JqZWN0XCJcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB6LnRvSlNPTlNjaGVtYShzY2hlbWEgYXMgei5ab2RUeXBlKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHMgPSBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj47XG4gIGlmIChTeW1ib2wuZm9yKFwidmVyY2VsLmFpLnNjaGVtYVwiKSBpbiBzICYmIFwianNvblNjaGVtYVwiIGluIHMpIHtcbiAgICByZXR1cm4gcy5qc29uU2NoZW1hIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgaWYgKFwidHlwZVwiIGluIHMgfHwgXCJwcm9wZXJ0aWVzXCIgaW4gcykge1xuICAgIHJldHVybiBzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqc29uU2NoZW1hVG9UcyhcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5kZW50ID0gMFxuKTogc3RyaW5nIHtcbiAgaWYgKCFzY2hlbWEpIHtcbiAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cblxuICBpZiAoc2NoZW1hLmVudW0gJiYgQXJyYXkuaXNBcnJheShzY2hlbWEuZW51bSkpIHtcbiAgICByZXR1cm4gc2NoZW1hLmVudW0ubWFwKCh2KSA9PiBKU09OLnN0cmluZ2lmeSh2KSkuam9pbihcIiB8IFwiKTtcbiAgfVxuXG4gIGlmIChzY2hlbWEuYW55T2YgJiYgQXJyYXkuaXNBcnJheShzY2hlbWEuYW55T2YpKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5hbnlPZlxuICAgICAgLm1hcCgoczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGpzb25TY2hlbWFUb1RzKHMsIGluZGVudCkpXG4gICAgICAuam9pbihcIiB8IFwiKTtcbiAgfVxuICBpZiAoc2NoZW1hLm9uZU9mICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLm9uZU9mKSkge1xuICAgIHJldHVybiBzY2hlbWEub25lT2ZcbiAgICAgIC5tYXAoKHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBqc29uU2NoZW1hVG9UcyhzLCBpbmRlbnQpKVxuICAgICAgLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGUgYXMgc3RyaW5nO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgIGNhc2UgXCJhcnJheVwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IHNjaGVtYS5pdGVtc1xuICAgICAgICA/IGpzb25TY2hlbWFUb1RzKHNjaGVtYS5pdGVtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgaW5kZW50KVxuICAgICAgICA6IFwidW5rbm93blwiO1xuICAgICAgcmV0dXJuIGBBcnJheTwke2l0ZW1zfT5gO1xuICAgIH1cbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBzY2hlbWEucHJvcGVydGllcyBhc1xuICAgICAgICB8IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghcHJvcGVydGllcykge1xuICAgICAgICByZXR1cm4gXCJSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlwiO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVxdWlyZWQgPSBuZXcgU2V0KChzY2hlbWEucmVxdWlyZWQgYXMgc3RyaW5nW10pIHx8IFtdKTtcbiAgICAgIGNvbnN0IHBhZCA9IFwiICBcIi5yZXBlYXQoaW5kZW50ICsgMSk7XG4gICAgICBjb25zdCBjbG9zZVBhZCA9IFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3Qgb3B0ID0gcmVxdWlyZWQuaGFzKGtleSkgPyBcIlwiIDogXCI/XCI7XG4gICAgICAgIHJldHVybiBgJHtwYWR9JHtrZXl9JHtvcHR9OiAke2pzb25TY2hlbWFUb1RzKHZhbHVlLCBpbmRlbnQgKyAxKX1gO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYHtcXG4ke3Byb3BzLmpvaW4oXCI7XFxuXCIpfTtcXG4ke2Nsb3NlUGFkfX1gO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNvbnRleHRUeXBlU3RyaW5nKHRvb2xzOiBUb29sU2V0KTogc3RyaW5nIHtcbiAgY29uc3Qgc2lnczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCB0XSBvZiBPYmplY3QuZW50cmllcyh0b29scykpIHtcbiAgICBjb25zdCByYXcgPSB0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IGlucHV0U2NoZW1hID0gZXh0cmFjdEpzb25TY2hlbWEocmF3LmlucHV0U2NoZW1hID8/IHJhdy5wYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBleHRyYWN0SnNvblNjaGVtYShyYXcub3V0cHV0U2NoZW1hKTtcblxuICAgIGNvbnN0IGlucHV0VHlwZSA9IGlucHV0U2NoZW1hID8ganNvblNjaGVtYVRvVHMoaW5wdXRTY2hlbWEsIDIpIDogXCJ7fVwiO1xuICAgIGNvbnN0IG91dHB1dFR5cGUgPSBvdXRwdXRTY2hlbWFcbiAgICAgID8ganNvblNjaGVtYVRvVHMob3V0cHV0U2NoZW1hLCAyKVxuICAgICAgOiBcInVua25vd25cIjtcblxuICAgIHNpZ3MucHVzaChgICAgICR7bmFtZX0oaW5wdXQ6ICR7aW5wdXRUeXBlfSk6IFByb21pc2U8JHtvdXRwdXRUeXBlfT5gKTtcbiAgfVxuXG4gIHJldHVybiBgdHlwZSBDb250ZXh0ID0ge1xcbiAgdG9vbHM6IHtcXG4ke3NpZ3Muam9pbihcIjtcXG5cIil9O1xcbiAgfVxcbn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlSW5TYW5kYm94KHtcbiAgY29kZSxcbiAgcnBjRGlyLFxuICBhYm9ydENvbnRyb2xsZXIsXG4gIHNhbmRib3gsXG4gIGF2YWlsYWJsZVRvb2xzLFxuICBvblN1YlRvb2xDYWxsLFxufToge1xuICBjb2RlOiBzdHJpbmc7XG4gIHJwY0Rpcjogc3RyaW5nO1xuICBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgYXZhaWxhYmxlVG9vbHM6IFRvb2xTZXQ7XG4gIG9uU3ViVG9vbENhbGw/OiBPblN1YlRvb2xDYWxsO1xufSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgbWtkaXJSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwibWtkaXJcIixcbiAgICBhcmdzOiBbXCItcFwiLCBycGNEaXJdLFxuICB9KTtcbiAgaWYgKG1rZGlyUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1rZGlyUmVzdWx0Lm1lc3NhZ2UgfTtcbiAgfVxuICBhd2FpdCBta2RpclJlc3VsdC5yZXN1bHQ7XG5cbiAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICBmaWxlczogW1xuICAgICAgeyBwYXRoOiBcInJ1bm5lci5tanNcIiwgY29udGVudDogUlVOTkVSX1NDUklQVCB9LFxuICAgICAgeyBwYXRoOiBcImNvZGUuanNcIiwgY29udGVudDogY29kZSB9LFxuICAgICAge1xuICAgICAgICBwYXRoOiBcInRvb2xzLmpzb25cIixcbiAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoYXZhaWxhYmxlVG9vbHMpKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBkZXN0UGF0aDogcnBjRGlyLFxuICB9KTtcblxuICBjb25zdCBub2RlTWFqb3IgPSBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KFwiLlwiKVswXSwgMTApO1xuICBjb25zdCBwZXJtaXNzaW9uRmxhZyA9XG4gICAgbm9kZU1ham9yID49IDIyID8gXCItLXBlcm1pc3Npb25cIiA6IFwiLS1leHBlcmltZW50YWwtcGVybWlzc2lvblwiO1xuXG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwibm9kZVwiLFxuICAgIGFyZ3M6IFtcbiAgICAgIHBlcm1pc3Npb25GbGFnLFxuICAgICAgYC0tYWxsb3ctZnMtcmVhZD0ke3JwY0Rpcn1gLFxuICAgICAgYC0tYWxsb3ctZnMtd3JpdGU9JHtycGNEaXJ9YCxcbiAgICAgIGAke3JwY0Rpcn0vcnVubmVyLm1qc2AsXG4gICAgXSxcbiAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGV4ZWNSZXN1bHQubWVzc2FnZSB9O1xuICB9XG5cbiAgY29uc3QgZmF0YWw6IHsgZXJyb3I6IEVycm9yIHwgbnVsbCB9ID0geyBlcnJvcjogbnVsbCB9O1xuXG4gIGNvbnN0IGFib3J0ID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgIGlmICghZmF0YWwuZXJyb3IpIHtcbiAgICAgIGZhdGFsLmVycm9yID0gZXJyb3I7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlVG9vbFJlcXVlc3QgPSBhc3luYyAocmVxdWVzdEpzb246IHN0cmluZykgPT4ge1xuICAgIGxldCBwYXJzZWQ6IHsgaWQ6IHN0cmluZzsgdG9vbDogc3RyaW5nOyBpbnB1dDogdW5rbm93biB9O1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlcXVlc3RKc29uKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGlkLCB0b29sOiB0b29sTmFtZSwgaW5wdXQgfSA9IHBhcnNlZDtcblxuICAgIGxldCByZXNwb25zZTogeyByZXN1bHQ/OiB1bmtub3duOyBlcnJvcj86IHN0cmluZyB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ID0gYXZhaWxhYmxlVG9vbHNbdG9vbE5hbWVdO1xuICAgICAgaWYgKCF0Py5leGVjdXRlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVG9vbCAke3Rvb2xOYW1lfSBub3QgZm91bmQgb3IgaGFzIG5vIGV4ZWN1dGUgZnVuY3Rpb25gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBleGVjID0gdC5leGVjdXRlLmJpbmQodCk7XG4gICAgICBpZiAob25TdWJUb29sQ2FsbCkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IG9uU3ViVG9vbENhbGwodG9vbE5hbWUsIGlucHV0LCAoKSA9PlxuICAgICAgICAgIGV4ZWMoaW5wdXQsIHtcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGBqc18ke3Rvb2xOYW1lfV8ke0RhdGUubm93KCl9YCxcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYyhpbnB1dCwge1xuICAgICAgICAgIHRvb2xDYWxsSWQ6IGBqc18ke3Rvb2xOYW1lfV8ke0RhdGUubm93KCl9YCxcbiAgICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICByZXNwb25zZSA9IHsgcmVzdWx0IH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICByZXNwb25zZSA9IHsgZXJyb3I6IG1zZyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzYW5kYm94LndyaXRlRmlsZXMoe1xuICAgICAgICBmaWxlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhdGg6IGAke2lkfS5yZXNwb25zZS5qc29uYCxcbiAgICAgICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBkZXN0UGF0aDogcnBjRGlyLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvKipcbiAgICAgICAqIElmIHdyaXRpbmcgdGhlIHJlc3BvbnNlIGZpbGUgZmFpbHMsIHRoZSBydW5uZXIgd2lsbCBwb2xsIGZvcmV2ZXJcbiAgICAgICAqIHdhaXRpbmcgZm9yIGl0LiBBYm9ydCB0aGUgcnVubmVyIHByb2Nlc3Mgc28gd2UgZG9uJ3QgZGVhZGxvY2suXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgIGFib3J0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlIFJQQyByZXNwb25zZSBmb3IgJHt0b29sTmFtZX06ICR7bXNnfWApKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdG9vbENhbGxQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGxldCBzdGRlcnJCdWZmZXIgPSBcIlwiO1xuICBsZXQgbm9uTWFya2VyU3RkZXJyID0gXCJcIjtcblxuICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgYWJvcnQoXG4gICAgICBuZXcgRXJyb3IoXG4gICAgICAgIGBKYXZhU2NyaXB0IGV4ZWN1dGlvbiB0aW1lZCBvdXQgYWZ0ZXIgJHtFWEVDVVRJT05fVElNRU9VVF9NUyAvIDEwMDB9c2BcbiAgICAgIClcbiAgICApO1xuICB9LCBFWEVDVVRJT05fVElNRU9VVF9NUyk7XG5cbiAgdHJ5IHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIGV4ZWNSZXN1bHQubG9ncygpKSB7XG4gICAgICBpZiAoZmF0YWwuZXJyb3IpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnRyeS5zdHJlYW0gPT09IFwic3RkZXJyXCIpIHtcbiAgICAgICAgc3RkZXJyQnVmZmVyICs9IGVudHJ5LmRhdGE7XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IHN0ZGVyckJ1ZmZlci5pbmRleE9mKFJFUVVFU1RfTUFSS0VSX1NUQVJUKTtcbiAgICAgICAgICBpZiAoc3RhcnRJZHggPT09IC0xKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVNYXJrZXIgPSBzdGRlcnJCdWZmZXIuc2xpY2UoMCwgc3RhcnRJZHgpO1xuICAgICAgICAgIGlmIChiZWZvcmVNYXJrZXIudHJpbSgpKSB7XG4gICAgICAgICAgICBub25NYXJrZXJTdGRlcnIgKz0gYmVmb3JlTWFya2VyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRTdGFydCA9IHN0YXJ0SWR4ICsgUkVRVUVTVF9NQVJLRVJfU1RBUlQubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IHN0ZGVyckJ1ZmZlci5pbmRleE9mKFJFUVVFU1RfTUFSS0VSX0VORCwgY29udGVudFN0YXJ0KTtcbiAgICAgICAgICBpZiAoZW5kSWR4ID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVxdWVzdEpzb24gPSBzdGRlcnJCdWZmZXIuc2xpY2UoY29udGVudFN0YXJ0LCBlbmRJZHgpO1xuICAgICAgICAgIHN0ZGVyckJ1ZmZlciA9IHN0ZGVyckJ1ZmZlci5zbGljZShlbmRJZHggKyBSRVFVRVNUX01BUktFUl9FTkQubGVuZ3RoKTtcblxuICAgICAgICAgIHRvb2xDYWxsUHJvbWlzZXMucHVzaChoYW5kbGVUb29sUmVxdWVzdChyZXF1ZXN0SnNvbikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgfVxuXG4gIGlmIChzdGRlcnJCdWZmZXIudHJpbSgpKSB7XG4gICAgbm9uTWFya2VyU3RkZXJyICs9IHN0ZGVyckJ1ZmZlcjtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh0b29sQ2FsbFByb21pc2VzKTtcblxuICBpZiAoZmF0YWwuZXJyb3IpIHtcbiAgICBleGVjUmVzdWx0LnJlc3VsdC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBmYXRhbC5lcnJvci5tZXNzYWdlLFxuICAgICAgLi4uKG5vbk1hcmtlclN0ZGVyciA/IHsgc3RkZXJyOiBub25NYXJrZXJTdGRlcnIuc2xpY2UoMCwgMjAwMCkgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGUgfSA9IGF3YWl0IGV4ZWNSZXN1bHQucmVzdWx0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3Rkb3V0KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IGBSdW5uZXIgZmFpbGVkIChleGl0ICR7ZXhpdENvZGV9KS5gLFxuICAgICAgc3RkZXJyOiAobm9uTWFya2VyU3RkZXJyICsgc3RkZXJyKS5zbGljZSgwLCAyMDAwKSxcbiAgICAgIHN0ZG91dDogc3Rkb3V0LnNsaWNlKDAsIDEwMDApLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUphdmFTY3JpcHRUb29sKG9wdHM6IHtcbiAgdG9vbHM6IFRvb2xTZXQ7XG4gIHNlc3Npb246IFNlc3Npb247XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIG9uU3ViVG9vbENhbGw/OiBPblN1YlRvb2xDYWxsO1xufSkge1xuICBjb25zdCB7IHNlc3Npb24sIHNhbmRib3gsIG9uU3ViVG9vbENhbGwgfSA9IG9wdHM7XG4gIGNvbnN0IGFjdGl2ZVNldCA9IHNlc3Npb24uYWN0aXZlVG9vbHMgPyBuZXcgU2V0KHNlc3Npb24uYWN0aXZlVG9vbHMpIDogbnVsbDtcbiAgY29uc3QgYXZhaWxhYmxlVG9vbHM6IFRvb2xTZXQgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdF0gb2YgT2JqZWN0LmVudHJpZXMob3B0cy50b29scykpIHtcbiAgICBpZiAoIWFjdGl2ZVNldCB8fCBhY3RpdmVTZXQuaGFzKG5hbWUpKSB7XG4gICAgICBhdmFpbGFibGVUb29sc1tuYW1lXSA9IHQ7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbnRleHRUeXBlID0gZ2VuZXJhdGVDb250ZXh0VHlwZVN0cmluZyhhdmFpbGFibGVUb29scyk7XG5cbiAgcmV0dXJuIHRvb2woe1xuICAgIC4uLmJ1aWx0SW5Ub29scy5KYXZhU2NyaXB0LFxuICAgIGRlc2NyaXB0aW9uOiBgRXhlY3V0ZSBKYXZhU2NyaXB0IHRvIG9yY2hlc3RyYXRlIG11bHRpcGxlIHRvb2wgY2FsbHMgaW4gYSBzaW5nbGUgc3RlcC4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCB0byBydW4gc2V2ZXJhbCB0b29scyBpbiBzZXF1ZW5jZSwgdHJhbnNmb3JtIGludGVybWVkaWF0ZSByZXN1bHRzLCBvciBwYXJhbGxlbGl6ZSBpbmRlcGVuZGVudCBvcGVyYXRpb25zIHdpdGggUHJvbWlzZS5hbGwuXG5cblRoZSBjb2RlIHJ1bnMgYXMgYW4gYXN5bmMgZnVuY3Rpb24gYm9keSB3aXRoIFxcYGN0eFxcYCBpbiBzY29wZTpcblxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuJHtjb250ZXh0VHlwZX1cblxcYFxcYFxcYFxuXG5FeGFtcGxlczpcbi0gU2VxdWVudGlhbDogXFxgY29uc3QgZmlsZSA9IGF3YWl0IGN0eC50b29scy5SZWFkKHsgcGF0aDogXCJwYWNrYWdlLmpzb25cIiB9KTsgcmV0dXJuIEpTT04ucGFyc2UoZmlsZS5jb250ZW50KTtcXGBcbi0gUGFyYWxsZWw6IFxcYGNvbnN0IFthLCBiXSA9IGF3YWl0IFByb21pc2UuYWxsKFtjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwiYS50c1wiIH0pLCBjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwiYi50c1wiIH0pXSk7IHJldHVybiB7IGE6IGEuY29udGVudCwgYjogYi5jb250ZW50IH07XFxgXG4tIFRyYW5zZm9ybTogXFxgY29uc3QgZ3JlcCA9IGF3YWl0IGN0eC50b29scy5HcmVwKHsgcGF0dGVybjogXCJUT0RPXCIgfSk7IHJldHVybiBncmVwLm1hdGNoZXMuc3BsaXQoXCJcXFxcblwiKS5sZW5ndGg7XFxgXG5cblJldHVybiBhIHZhbHVlIHRvIHBhc3MgcmVzdWx0cyBiYWNrLiBVc2UgY29uc29sZS5sb2coKSBmb3IgZGVidWcgb3V0cHV0LmAsXG4gICAgZXhlY3V0ZTogKHsgY29kZSB9KSA9PiB7XG4gICAgICBjb25zdCBydW5JZCA9IGBydW5fJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKClcbiAgICAgICAgLnRvU3RyaW5nKDM2KVxuICAgICAgICAuc2xpY2UoMiwgOCl9YDtcbiAgICAgIGNvbnN0IHJwY0RpciA9IGAuYWdlbnQvanMtcnBjLyR7cnVuSWR9YDtcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgICAgcmV0dXJuIGV4ZWN1dGVJblNhbmRib3goe1xuICAgICAgICBjb2RlLFxuICAgICAgICBycGNEaXIsXG4gICAgICAgIGFib3J0Q29udHJvbGxlcixcbiAgICAgICAgc2FuZGJveCxcbiAgICAgICAgYXZhaWxhYmxlVG9vbHMsXG4gICAgICAgIG9uU3ViVG9vbENhbGwsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEpTT05WYWx1ZSwgTW9kZWxNZXNzYWdlIH0gZnJvbSBcImFpXCI7XG5cbnR5cGUgUHJvdmlkZXJPcHRpb25zID0gUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgSlNPTlZhbHVlPj47XG5cbmNvbnN0IEFOVEhST1BJQ19NQVhfQ0FDSEVfQlJFQUtQT0lOVFNfUEVSX1JFUVVFU1QgPSA0O1xuXG5jb25zdCBDTEFVREVfTElLRV9NT0RFTF9NQVRDSEVSUyA9IFtcImNsYXVkZVwiLCBcImFudGhyb3BpY1wiXTtcblxuY29uc3QgQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlM6IFByb3ZpZGVyT3B0aW9ucyA9IHtcbiAgYW50aHJvcGljOiB7XG4gICAgY2FjaGVDb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbiAgb3BlbnJvdXRlcjoge1xuICAgIGNhY2hlQ29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIGJlZHJvY2s6IHtcbiAgICBjYWNoZVBvaW50OiB7IHR5cGU6IFwiZGVmYXVsdFwiIH0sXG4gIH0sXG4gIG9wZW5haUNvbXBhdGlibGU6IHtcbiAgICBjYWNoZV9jb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbiAgY29waWxvdDoge1xuICAgIGNvcGlsb3RfY2FjaGVfY29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRHYXRld2F5UHJvdmlkZXIobW9kZWw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBzbGFzaEluZGV4ID0gbW9kZWwuaW5kZXhPZihcIi9cIik7XG4gIGlmIChzbGFzaEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtb2RlbC5zbGljZSgwLCBzbGFzaEluZGV4KTtcbn1cblxuZnVuY3Rpb24gY291bnRBbnRocm9waWNDYWNoZUJyZWFrcG9pbnRzKG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSk6IG51bWJlciB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIGNvbnN0IHByb3ZpZGVyT3B0aW9ucyA9IChtZXNzYWdlIGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH0pXG4gICAgICAucHJvdmlkZXJPcHRpb25zO1xuICAgIGlmIChwcm92aWRlck9wdGlvbnM/LmFudGhyb3BpYz8uY2FjaGVDb250cm9sKSB7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHBhcnRQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICAgICAgcGFydCBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9XG4gICAgICAgICkucHJvdmlkZXJPcHRpb25zO1xuICAgICAgICBpZiAocGFydFByb3ZpZGVyT3B0aW9ucz8uYW50aHJvcGljPy5jYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgICBjb3VudCArPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjb3VudDtcbn1cblxuZnVuY3Rpb24gaXNDbGF1ZGVMaWtlTW9kZWwobW9kZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBsb3dlciA9IG1vZGVsLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBDTEFVREVfTElLRV9NT0RFTF9NQVRDSEVSUy5zb21lKChtKSA9PiBsb3dlci5pbmNsdWRlcyhtKSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUHJvdmlkZXJPcHRpb25zKG9wdHM6IHtcbiAgY3VycmVudDogUHJvdmlkZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBwYXRjaDogUHJvdmlkZXJPcHRpb25zO1xufSk6IFByb3ZpZGVyT3B0aW9ucyB7XG4gIGNvbnN0IG5leHQ6IFByb3ZpZGVyT3B0aW9ucyA9IHsgLi4uKG9wdHMuY3VycmVudCA/PyB7fSkgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3B0cy5wYXRjaCkpIHtcbiAgICBuZXh0W2tleV0gPSB7IC4uLihuZXh0W2tleV0gPz8ge30pLCAuLi52YWx1ZSB9O1xuICB9XG4gIHJldHVybiBuZXh0O1xufVxuXG5mdW5jdGlvbiBpc0NhY2hlYWJsZUNsYXVkZVBhcnQocGFydDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXBhcnQgfHwgdHlwZW9mIHBhcnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcGFydCAmJiAocGFydCBhcyB7IHR5cGU/OiB1bmtub3duIH0pLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgY29uc3QgdGV4dCA9IChwYXJ0IGFzIHsgdGV4dD86IHVua25vd24gfSkudGV4dDtcbiAgICBpZiAodHlwZW9mIHRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBwYXJ0KSB7XG4gICAgY29uc3QgdHlwZSA9IChwYXJ0IGFzIHsgdHlwZT86IHVua25vd24gfSkudHlwZTtcbiAgICBpZiAodHlwZSA9PT0gXCJ0aGlua2luZ1wiIHx8IHR5cGUgPT09IFwicmVhc29uaW5nXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlOiBNb2RlbE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50LnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgIHJldHVybiBtZXNzYWdlLmNvbnRlbnQuc29tZSgocGFydCkgPT4gaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KHBhcnQpKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZmluZExhc3RDYWNoZWFibGVQYXJ0SW5kZXgoY29udGVudDogdW5rbm93bltdKTogbnVtYmVyIHwgbnVsbCB7XG4gIGZvciAobGV0IGkgPSBjb250ZW50Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgaWYgKGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChjb250ZW50W2ldKSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RDbGF1ZGVDYWNoaW5nVGFyZ2V0cyhtZXNzYWdlczogTW9kZWxNZXNzYWdlW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHN5c3RlbUluZGljZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGZpbmFsSW5kaWNlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aCAmJiBzeXN0ZW1JbmRpY2VzLmxlbmd0aCA8IDI7IGkgKz0gMSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTtcbiAgICBpZiAobWVzc2FnZS5yb2xlID09PSBcInN5c3RlbVwiICYmIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZSkpIHtcbiAgICAgIHN5c3RlbUluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gbWVzc2FnZXMubGVuZ3RoIC0gMTsgaSA+PSAwICYmIGZpbmFsSW5kaWNlcy5sZW5ndGggPCAyOyBpIC09IDEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbaV07XG4gICAgaWYgKG1lc3NhZ2Uucm9sZSAhPT0gXCJzeXN0ZW1cIiAmJiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2UpKSB7XG4gICAgICBmaW5hbEluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICBmaW5hbEluZGljZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBbLi4uc3lzdGVtSW5kaWNlcywgLi4uZmluYWxJbmRpY2VzXTtcbn1cblxuZnVuY3Rpb24gYXBwbHlDbGF1ZGVQcm9tcHRDYWNoaW5nKG9wdHM6IHtcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBwcm92aWRlcklkOiBzdHJpbmcgfCBudWxsO1xuICBtYXhCcmVha3BvaW50c1BlclJlcXVlc3Q6IG51bWJlcjtcbn0pOiBNb2RlbE1lc3NhZ2VbXSB7XG4gIGNvbnN0IGV4aXN0aW5nQnJlYWtwb2ludHMgPSBjb3VudEFudGhyb3BpY0NhY2hlQnJlYWtwb2ludHMob3B0cy5tZXNzYWdlcyk7XG4gIGNvbnN0IHJlbWFpbmluZ0J1ZGdldCA9IE1hdGgubWF4KFxuICAgIDAsXG4gICAgb3B0cy5tYXhCcmVha3BvaW50c1BlclJlcXVlc3QgLSBleGlzdGluZ0JyZWFrcG9pbnRzXG4gICk7XG5cbiAgaWYgKHJlbWFpbmluZ0J1ZGdldCA9PT0gMCkge1xuICAgIHJldHVybiBvcHRzLm1lc3NhZ2VzO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0SW5kaWNlcyA9IHNlbGVjdENsYXVkZUNhY2hpbmdUYXJnZXRzKG9wdHMubWVzc2FnZXMpLnNsaWNlKFxuICAgIDAsXG4gICAgcmVtYWluaW5nQnVkZ2V0XG4gICk7XG4gIGlmICh0YXJnZXRJbmRpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvcHRzLm1lc3NhZ2VzO1xuICB9XG5cbiAgY29uc3QgdXNlTWVzc2FnZUxldmVsT3B0aW9ucyA9XG4gICAgb3B0cy5wcm92aWRlcklkID09PSBcImFudGhyb3BpY1wiIHx8XG4gICAgQm9vbGVhbihvcHRzLnByb3ZpZGVySWQ/LmluY2x1ZGVzKFwiYmVkcm9ja1wiKSk7XG5cbiAgY29uc3QgbmV4dE1lc3NhZ2VzID0gb3B0cy5tZXNzYWdlcy5zbGljZSgpO1xuXG4gIGZvciAoY29uc3QgbWVzc2FnZUluZGV4IG9mIHRhcmdldEluZGljZXMpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbmV4dE1lc3NhZ2VzW21lc3NhZ2VJbmRleF07XG5cbiAgICBjb25zdCBzaG91bGRVc2VDb250ZW50T3B0aW9ucyA9XG4gICAgICAhdXNlTWVzc2FnZUxldmVsT3B0aW9ucyAmJlxuICAgICAgQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpICYmXG4gICAgICBtZXNzYWdlLmNvbnRlbnQubGVuZ3RoID4gMDtcblxuICAgIGlmIChzaG91bGRVc2VDb250ZW50T3B0aW9ucyAmJiBBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnRJbmRleCA9IGZpbmRMYXN0Q2FjaGVhYmxlUGFydEluZGV4KG1lc3NhZ2UuY29udGVudCk7XG4gICAgICBpZiAocGFydEluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBtZXNzYWdlLmNvbnRlbnRbcGFydEluZGV4XTtcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0UHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgICAgICAgcGFydCBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9XG4gICAgICAgICAgKS5wcm92aWRlck9wdGlvbnM7XG5cbiAgICAgICAgICBjb25zdCBuZXh0Q29udGVudCA9IG1lc3NhZ2UuY29udGVudC5zbGljZSgpO1xuICAgICAgICAgIG5leHRDb250ZW50W3BhcnRJbmRleF0gPSB7XG4gICAgICAgICAgICAuLi4ocGFydCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IG1lcmdlUHJvdmlkZXJPcHRpb25zKHtcbiAgICAgICAgICAgICAgY3VycmVudDogcGFydFByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgcGF0Y2g6IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSBhcyAodHlwZW9mIG1lc3NhZ2UuY29udGVudClbbnVtYmVyXTtcblxuICAgICAgICAgIG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdID0ge1xuICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG5leHRDb250ZW50LFxuICAgICAgICAgIH0gYXMgTW9kZWxNZXNzYWdlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZVByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgIG1lc3NhZ2UgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICkucHJvdmlkZXJPcHRpb25zO1xuXG4gICAgbmV4dE1lc3NhZ2VzW21lc3NhZ2VJbmRleF0gPSB7XG4gICAgICAuLi5tZXNzYWdlLFxuICAgICAgcHJvdmlkZXJPcHRpb25zOiBtZXJnZVByb3ZpZGVyT3B0aW9ucyh7XG4gICAgICAgIGN1cnJlbnQ6IG1lc3NhZ2VQcm92aWRlck9wdGlvbnMsXG4gICAgICAgIHBhdGNoOiBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUyxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbmV4dE1lc3NhZ2VzO1xufVxuXG5leHBvcnQgdHlwZSBQcm9tcHRDYWNoaW5nUmVzdWx0ID0ge1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIHByb3ZpZGVyT3B0aW9uczogUHJvdmlkZXJPcHRpb25zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UHJvbXB0Q2FjaGluZ1RvTW9kZWxSZXF1ZXN0KG9wdHM6IHtcbiAgbW9kZWw6IHN0cmluZztcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgYW50aHJvcGljPzogeyBtYXhCcmVha3BvaW50c1BlclJlcXVlc3Q/OiBudW1iZXIgfTtcbiAgb3BlbmFpPzogeyBzZXRQcm9tcHRDYWNoZUtleT86IGJvb2xlYW4gfTtcbn0pOiBQcm9tcHRDYWNoaW5nUmVzdWx0IHtcbiAgY29uc3QgcHJvdmlkZXIgPSBnZXRHYXRld2F5UHJvdmlkZXIob3B0cy5tb2RlbCk7XG5cbiAgY29uc3QgcHJvdmlkZXJPcHRpb25zOiBQcm92aWRlck9wdGlvbnMgPSB7fTtcblxuICBpZiAoXG4gICAgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiIHx8IHByb3ZpZGVyID09PSBcImF6dXJlXCIpICYmXG4gICAgb3B0cy5vcGVuYWk/LnNldFByb21wdENhY2hlS2V5ICE9PSBmYWxzZVxuICApIHtcbiAgICBwcm92aWRlck9wdGlvbnMub3BlbmFpID0geyBwcm9tcHRDYWNoZUtleTogb3B0cy5zZXNzaW9uSWQgfTtcbiAgfVxuXG4gIGNvbnN0IG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCA9XG4gICAgb3B0cy5hbnRocm9waWM/Lm1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCA/P1xuICAgIEFOVEhST1BJQ19NQVhfQ0FDSEVfQlJFQUtQT0lOVFNfUEVSX1JFUVVFU1Q7XG5cbiAgY29uc3QgY2FjaGVkTWVzc2FnZXMgPSBpc0NsYXVkZUxpa2VNb2RlbChvcHRzLm1vZGVsKVxuICAgID8gYXBwbHlDbGF1ZGVQcm9tcHRDYWNoaW5nKHtcbiAgICAgICAgbWVzc2FnZXM6IG9wdHMubWVzc2FnZXMsXG4gICAgICAgIHByb3ZpZGVySWQ6IHByb3ZpZGVyLFxuICAgICAgICBtYXhCcmVha3BvaW50c1BlclJlcXVlc3QsXG4gICAgICB9KVxuICAgIDogb3B0cy5tZXNzYWdlcztcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzOiBjYWNoZWRNZXNzYWdlcyxcbiAgICBwcm92aWRlck9wdGlvbnMsXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBVSU1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbi8qKiBTdWItdG9vbCBwYXJ0cyAoZnJvbSBKYXZhU2NyaXB0IG1ldGEtdG9vbCkgdXNlIHRoaXMgdG9vbENhbGxJZCBwcmVmaXguICovXG5mdW5jdGlvbiBpc1N1YlRvb2xQYXJ0KHBhcnQ6IFBhcnQpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBhcnQucGFydCBhcyB7IHRvb2xDYWxsSWQ/OiBzdHJpbmcgfTtcbiAgcmV0dXJuIHR5cGVvZiBwPy50b29sQ2FsbElkID09PSBcInN0cmluZ1wiICYmIHAudG9vbENhbGxJZC5zdGFydHNXaXRoKFwianNfdGNfXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVVSU1lc3NhZ2VzKG9wdHM6IHtcbiAgbWVzc2FnZXM6IE1lc3NhZ2VbXTtcbiAgcGFydHM6IFBhcnRbXTtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGluY2x1ZGVRdWV1ZWQ/OiBib29sZWFuO1xuICAvKiogV2hlbiB0cnVlLCBmaWx0ZXJzIG91dCBzdWItdG9vbCBwYXJ0cyBzbyB0aGUgTExNIGRvZXNuJ3Qgc2VlIHRoZW0uICovXG4gIGV4Y2x1ZGVTdWJUb29sUGFydHM/OiBib29sZWFuO1xufSk6IFVJTWVzc2FnZVtdIHtcbiAgbGV0IGZpbHRlcmVkID0gb3B0cy5tZXNzYWdlcztcblxuICBpZiAob3B0cy51bnRpbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgdW50aWwgPSBvcHRzLnVudGlsO1xuICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChtKSA9PiBtLmNyZWF0ZWRBdCA8PSB1bnRpbCk7XG4gIH1cblxuICBpZiAoIW9wdHMuaW5jbHVkZVF1ZXVlZCkge1xuICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChtKSA9PiBtLnN0YXJ0ZWRBdCAhPT0gbnVsbCk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IG9wdHMuZXhjbHVkZVN1YlRvb2xQYXJ0c1xuICAgID8gb3B0cy5wYXJ0cy5maWx0ZXIoKHApID0+ICFpc1N1YlRvb2xQYXJ0KHApKVxuICAgIDogb3B0cy5wYXJ0cztcblxuICBjb25zdCBwYXJ0c0J5TWVzc2FnZSA9IG5ldyBNYXA8c3RyaW5nLCBQYXJ0W10+KCk7XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcGFydHNCeU1lc3NhZ2UuZ2V0KHBhcnQubWVzc2FnZUlkKSA/PyBbXTtcbiAgICBleGlzdGluZy5wdXNoKHBhcnQpO1xuICAgIHBhcnRzQnlNZXNzYWdlLnNldChwYXJ0Lm1lc3NhZ2VJZCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgcmV0dXJuIGZpbHRlcmVkXG4gICAgLm1hcCgobSkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZVBhcnRzID0gcGFydHNCeU1lc3NhZ2UuZ2V0KG0uaWQpID8/IFtdO1xuICAgICAgbWVzc2FnZVBhcnRzLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBtLmlkLFxuICAgICAgICByb2xlOiBtLnJvbGUsXG4gICAgICAgIHBhcnRzOiBtZXNzYWdlUGFydHMubWFwKChwKSA9PiBwLnBhcnQpLFxuICAgICAgfSBzYXRpc2ZpZXMgVUlNZXNzYWdlO1xuICAgIH0pXG4gICAgLmZpbHRlcigobSkgPT4gbS5wYXJ0cy5sZW5ndGggPiAwKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFN0ZXBVc2FnZSwgVXNhZ2VTdW1tYXJ5IH0gZnJvbSBcIi4uL3N0b3JhZ2UvcnBjXCI7XG5cbmV4cG9ydCB0eXBlIHsgU3RlcFVzYWdlLCBVc2FnZVN1bW1hcnkgfTtcblxuZnVuY3Rpb24gc3VtKGl0ZW1zOiBTdGVwVXNhZ2VbXSwga2V5OiBrZXlvZiBTdGVwVXNhZ2UpOiBudW1iZXIge1xuICByZXR1cm4gaXRlbXMucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGl0ZW1ba2V5XTtcbiAgICByZXR1cm4gYWNjICsgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/IHZhbHVlIDogMCk7XG4gIH0sIDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVVzYWdlU3VtbWFyeShzdGVwczogU3RlcFVzYWdlW10pOiBVc2FnZVN1bW1hcnkge1xuICByZXR1cm4ge1xuICAgIG1vZGVsOiBzdGVwc1swXT8ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgaW5wdXRUb2tlbnM6IHN1bShzdGVwcywgXCJpbnB1dFRva2Vuc1wiKSxcbiAgICBvdXRwdXRUb2tlbnM6IHN1bShzdGVwcywgXCJvdXRwdXRUb2tlbnNcIiksXG4gICAgdG90YWxUb2tlbnM6IHN1bShzdGVwcywgXCJ0b3RhbFRva2Vuc1wiKSxcbiAgICBjYWNoZVJlYWRUb2tlbnM6IHN1bShzdGVwcywgXCJjYWNoZVJlYWRUb2tlbnNcIiksXG4gICAgY2FjaGVXcml0ZVRva2Vuczogc3VtKHN0ZXBzLCBcImNhY2hlV3JpdGVUb2tlbnNcIiksXG4gICAgcmVhc29uaW5nVG9rZW5zOiBzdW0oc3RlcHMsIFwicmVhc29uaW5nVG9rZW5zXCIpLFxuICAgIHN0ZXBDb3VudDogc3RlcHMubGVuZ3RoLFxuICB9O1xufVxuXG5leHBvcnQgdHlwZSBTZXNzaW9uVXNhZ2UgPSB7XG4gIHRvdGFsOiBVc2FnZVN1bW1hcnkgJiB7IG1lc3NhZ2VDb3VudDogbnVtYmVyIH07XG4gIGJ5TWVzc2FnZUlkOiBSZWNvcmQ8c3RyaW5nLCBVc2FnZVN1bW1hcnkgfCBudWxsPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2Vzc2lvblVzYWdlKFxuICBtZXNzYWdlczogQXJyYXk8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNhZ2U6IHsgc3RlcHM6IFN0ZXBVc2FnZVtdOyBzdW1tYXJ5OiBVc2FnZVN1bW1hcnkgfSB8IG51bGw7XG4gIH0+XG4pOiBTZXNzaW9uVXNhZ2Uge1xuICBjb25zdCBieU1lc3NhZ2VJZDogUmVjb3JkPHN0cmluZywgVXNhZ2VTdW1tYXJ5IHwgbnVsbD4gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSB7XG4gICAgYnlNZXNzYWdlSWRbbS5pZF0gPSBtLnVzYWdlPy5zdW1tYXJ5ID8/IG51bGw7XG4gIH1cblxuICBjb25zdCBzdW1tYXJpZXMgPSBtZXNzYWdlc1xuICAgIC5tYXAoKG0pID0+IG0udXNhZ2U/LnN1bW1hcnkpXG4gICAgLmZpbHRlcigocyk6IHMgaXMgVXNhZ2VTdW1tYXJ5ID0+IHMgIT09IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdG90YWwgPSB7XG4gICAgbW9kZWw6IHN1bW1hcmllc1swXT8ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgaW5wdXRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5pbnB1dFRva2VucywgMCksXG4gICAgb3V0cHV0VG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMub3V0cHV0VG9rZW5zLCAwKSxcbiAgICB0b3RhbFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnRvdGFsVG9rZW5zLCAwKSxcbiAgICBjYWNoZVJlYWRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVJlYWRUb2tlbnMsIDApLFxuICAgIGNhY2hlV3JpdGVUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVdyaXRlVG9rZW5zLCAwKSxcbiAgICByZWFzb25pbmdUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5yZWFzb25pbmdUb2tlbnMsIDApLFxuICAgIHN0ZXBDb3VudDogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnN0ZXBDb3VudCwgMCksXG4gICAgbWVzc2FnZUNvdW50OiBzdW1tYXJpZXMubGVuZ3RoLFxuICB9O1xuXG4gIHJldHVybiB7IHRvdGFsLCBieU1lc3NhZ2VJZCB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJPLFNBQVMsV0FBVyxNQUFxQjtBQUM5QyxRQUFNLEtBQUssU0FBUyxJQUFJLElBQUk7QUFDNUIsTUFBSSxDQUFDLElBQUk7QUFDUCxVQUFNLElBQUk7QUFBQSxNQUNSLGdDQUFnQyxJQUFJO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBM0JBLElBYU07QUFiTjtBQUFBO0FBQUE7QUFhQSxJQUFNLFdBQVcsb0JBQUksSUFBbUI7QUFBQTtBQUFBOzs7QUNieEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBRWEsb0JBTVAsWUEyRk87QUFuR2I7QUFBQTtBQUFBO0FBRU8sSUFBTSxxQkFBcUI7QUFNbEMsSUFBTSxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMkZaLElBQU0sdUJBQXVCLENBQUMsU0FHL0I7QUFDSixZQUFNLEVBQUUsU0FBUyxVQUFVLElB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T0FBTyxpQkFBaUIsU0FBUyxHQUFHO0FBQ3RDLGNBQU0sUUFBUTtBQUFBLFVBQ1osT0FBTyxpQkFBaUIsSUFBSSxDQUFDLFlBQVk7QUFDdkMsa0JBQU0sT0FBTyxhQUFhLE9BQU8sRUFBRSxPQUFPLFFBQVEsV0FBVyxDQUFDO0FBQzlELGtCQUFNLE9BQU8sS0FBSyxPQUFPLGFBQWEsRUFBRTtBQUN4QyxtQkFBTyxLQUFLLEtBQUs7QUFBQSxVQUNuQixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BR0Y7QUFBQSxJQUNGLFNBQVMsS0FBSztBQUNaLGNBQVEsTUFBTSxHQUFHO0FBQ2pCLFlBQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUVBLFFBQU0sb0JBQW9CO0FBQUEsSUFDeEIsb0JBQW9CLE1BQU07QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbIm9wdHMiLCAicGF0aCIsICJlcnJvcmUiLCAicmVzdWx0IiwgInN0b3JhZ2UiLCAic2FuZGJveFJlY29yZCIsICJpbXBvcnRfem9kIiwgIlZlcmNlbFNhbmRib3hTREsiLCAiZ2V0U3RvcmFnZSIsICJwYXRoIiwgImltcG9ydF9zYW5kYm94IiwgImVycm9yZSIsICJnZXRUZXN0Q3JlZGVudGlhbHMiLCAic2FuZGJveCIsICJWZXJjZWxTYW5kYm94U0RLIiwgInNuYXBzaG90SWQiLCAiZ2V0U2FuZGJveCIsICJzYW5kYm94UmVjb3JkIiwgImluaXRfY2xpZW50IiwgImluaXRfY2xpZW50IiwgImltcG9ydF93b3JrZmxvdyIsICJpbXBvcnRfYWkiLCAiaW1wb3J0X3VsaWQiLCAiaW1wb3J0X3dvcmtmbG93IiwgImRlYnVnIiwgImltcG9ydF9haSIsICJpbXBvcnRfem9kIiwgInBhdGgiLCAiY3JlYXRlUHJvY2Vzc01hbmFnZXIiLCAiZ2V0U3RvcmFnZSIsICJnZXRTYW5kYm94IiwgInNlc3Npb24iLCAic2FuZGJveFJlY29yZCIsICJzYW5kYm94IiwgInJlc3VsdCIsICJzdGFydCIsICJldmVudCJdCn0K