cdk-nextjs 0.7.11 → 0.7.13

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/.jsii +310 -100
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +211 -3
  4. package/README.md +116 -101
  5. package/docs/breaking-changes.md +36 -2
  6. package/docs/development-guide.md +10 -0
  7. package/docs/next-build-output-guide.md +1 -1
  8. package/lib/adapter/adapter.mjs +4 -1
  9. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +21 -0
  10. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  11. package/lib/nextjs-api.js +1 -1
  12. package/lib/nextjs-build/nextjs-build.js +1 -1
  13. package/lib/nextjs-cache.js +1 -1
  14. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  15. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  16. package/lib/nextjs-distribution.d.ts +71 -2
  17. package/lib/nextjs-distribution.js +156 -107
  18. package/lib/nextjs-distribution.test.js +361 -12
  19. package/lib/nextjs-post-deploy.js +1 -1
  20. package/lib/nextjs-static-assets.d.ts +74 -5
  21. package/lib/nextjs-static-assets.js +276 -41
  22. package/lib/nextjs-static-assets.test.js +298 -1
  23. package/lib/root-constructs/nextjs-base-construct.d.ts +5 -4
  24. package/lib/root-constructs/nextjs-base-construct.js +17 -8
  25. package/lib/root-constructs/nextjs-global-containers.d.ts +16 -1
  26. package/lib/root-constructs/nextjs-global-containers.js +4 -2
  27. package/lib/root-constructs/nextjs-global-functions.d.ts +16 -1
  28. package/lib/root-constructs/nextjs-global-functions.js +4 -2
  29. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  30. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  31. package/lib/runtime/image-utils.d.ts +1 -0
  32. package/lib/runtime/image-utils.js +2 -1
  33. package/lib/runtime/image-utils.test.js +17 -1
  34. package/lib/runtime/image.js +5 -2
  35. package/lib/runtime/image.test.js +21 -1
  36. package/lib/runtime/lambda.mjs +9 -2
  37. package/lib/runtime/server.mjs +9 -2
  38. package/lib/utils/viewer-request-functions.d.ts +53 -0
  39. package/lib/utils/viewer-request-functions.js +172 -0
  40. package/lib/utils/viewer-request-functions.test.d.ts +1 -0
  41. package/lib/utils/viewer-request-functions.test.js +43 -0
  42. package/package.json +4 -1
  43. package/scripts/e2e-harness/app.js +7 -2
  44. package/scripts/render-diagrams.mjs +121 -0
@@ -4,6 +4,9 @@ const node_vm_1 = require("node:vm");
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const assertions_1 = require("aws-cdk-lib/assertions");
6
6
  const aws_cloudfront_1 = require("aws-cdk-lib/aws-cloudfront");
7
+ const aws_cloudfront_origins_1 = require("aws-cdk-lib/aws-cloudfront-origins");
8
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
9
+ const aws_elasticloadbalancingv2_1 = require("aws-cdk-lib/aws-elasticloadbalancingv2");
7
10
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
8
11
  const aws_s3_1 = require("aws-cdk-lib/aws-s3");
9
12
  const function_groups_1 = require("./adapter/function-groups");
@@ -313,7 +316,7 @@ describe("NextjsDistribution function group behaviors", () => {
313
316
  ],
314
317
  },
315
318
  },
316
- })).toThrow(/already associates a CloudFront function with viewer-request/);
319
+ })).toThrow(/associates a CloudFront function with viewer-request, but serving `assetPrefix`/);
317
320
  });
318
321
  const userFn = (stack, eventType) => ({
319
322
  eventType,
@@ -650,38 +653,38 @@ describe("the viewer-request CloudFront Function", () => {
650
653
  ["/foo//bar", "/foo/bar"],
651
654
  ["/basepath//to-sv", "/basepath/to-sv"],
652
655
  ["/a\\b", "/a/b"],
653
- ])("redirects %s to %s with a 308", (uri, location) => {
654
- expect(redirect(send(uri))).toEqual({ statusCode: 308, location });
656
+ ])("redirects %s to %s with a 308", async (uri, location) => {
657
+ expect(redirect(await send(uri))).toEqual({ statusCode: 308, location });
655
658
  });
656
- it("keeps the query on the redirect, including repeated keys", () => {
659
+ it("keeps the query on the redirect, including repeated keys", async () => {
657
660
  // CloudFront's shape for a repeated key: `multiValue` holds every value,
658
661
  // the first included, and `value` repeats that first one.
659
- const result = send("/x//y", {
662
+ const result = await send("/x//y", {
660
663
  json: { value: "true" },
661
664
  a: { value: "1", multiValue: [{ value: "1" }, { value: "2" }] },
662
665
  flag: { value: "" },
663
666
  });
664
667
  expect(redirect(result).location).toBe("/x/y?json=true&a=1&a=2&flag");
665
668
  });
666
- it("passes percent-encoded query values through without re-encoding", () => {
669
+ it("passes percent-encoded query values through without re-encoding", async () => {
667
670
  // CloudFront hands the function the values still encoded, as sent.
668
- const result = send("/x//y", {
671
+ const result = await send("/x//y", {
669
672
  a: { value: "%20b%26c" },
670
673
  p: { value: "1+2" },
671
674
  });
672
675
  expect(redirect(result).location).toBe("/x/y?a=%20b%26c&p=1+2");
673
676
  });
674
- it("passes an ordinary path through with x-forwarded-host set", () => {
675
- const result = send("/a/b");
677
+ it("passes an ordinary path through with x-forwarded-host set", async () => {
678
+ const result = (await send("/a/b"));
676
679
  expect(result.uri).toBe("/a/b");
677
680
  // CloudFront rewrites `host` to the origin domain, so the app would otherwise
678
681
  // build every absolute URL against the Function URL's hostname.
679
682
  expect(result.headers["x-forwarded-host"].value).toBe("a.test");
680
683
  });
681
- it("overwrites a client-supplied x-forwarded-host", () => {
684
+ it("overwrites a client-supplied x-forwarded-host", async () => {
682
685
  // The runtime trusts this header behind the Function URL, so a viewer's
683
686
  // own value must not survive to build redirects or origin checks.
684
- const result = handler({
687
+ const result = (await handler({
685
688
  request: {
686
689
  uri: "/a",
687
690
  querystring: {},
@@ -690,8 +693,354 @@ describe("the viewer-request CloudFront Function", () => {
690
693
  "x-forwarded-host": { value: "evil.test" },
691
694
  },
692
695
  },
696
+ }));
697
+ expect(result.headers["x-forwarded-host"].value).toBe("a.test");
698
+ });
699
+ });
700
+ /**
701
+ * `viewerRequestFunctionCode`, run as CloudFront would run it on each behavior,
702
+ * for the same reason as the suite above.
703
+ */
704
+ describe("viewerRequestFunctionCode", () => {
705
+ const BASIC_AUTH = `
706
+ function viewerRequest(event) {
707
+ var auth = event.request.headers.authorization;
708
+ if (auth && auth.value === "Basic dXNlcjpwYXNz") return;
709
+ return {
710
+ statusCode: 401,
711
+ statusDescription: "Unauthorized",
712
+ headers: { "www-authenticate": { value: 'Basic realm="preview"' } },
713
+ };
714
+ }
715
+ `;
716
+ const AUTHORIZED = { authorization: "Basic dXNlcjpwYXNz" };
717
+ /** What `viewerRequestKeyValueStore` holds, as `cf.kvs()` would read it. */
718
+ const fakeCloudFrontModule = (values) => ({
719
+ kvs: () => ({
720
+ get: async (key) => {
721
+ if (!(key in values))
722
+ throw new Error(`key not found: ${key}`);
723
+ return values[key];
724
+ },
725
+ }),
726
+ });
727
+ const synth = (props = {}) => {
728
+ const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), "TestStack");
729
+ const keyValueStore = props.keyValueStore
730
+ ? new aws_cloudfront_1.KeyValueStore(stack, "Kvs")
731
+ : undefined;
732
+ const compute = props.nextjsType === constants_1.NextjsType.GLOBAL_CONTAINERS
733
+ ? {
734
+ loadBalancer: new aws_elasticloadbalancingv2_1.ApplicationLoadBalancer(stack, "Alb", {
735
+ vpc: new aws_ec2_1.Vpc(stack, "Vpc"),
736
+ }),
737
+ }
738
+ : {
739
+ functionUrl: new aws_lambda_1.FunctionUrl(stack, "Url", {
740
+ function: new aws_lambda_1.Function(stack, "Fn", {
741
+ code: aws_lambda_1.Code.fromInline("exports.handler = () => {};"),
742
+ handler: "index.handler",
743
+ runtime: aws_lambda_1.Runtime.NODEJS_22_X,
744
+ }),
745
+ authType: aws_lambda_1.FunctionUrlAuthType.AWS_IAM,
746
+ }),
747
+ };
748
+ new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", {
749
+ ...compute,
750
+ assetsBucket: new aws_s3_1.Bucket(stack, "Assets"),
751
+ assetPrefix: props.assetPrefix,
752
+ basePath: props.basePath,
753
+ nextjsType: props.nextjsType ?? constants_1.NextjsType.GLOBAL_FUNCTIONS,
754
+ overrides: props.overrides?.(stack),
755
+ publicDirEntries: [{ name: "favicon.ico", isDirectory: false }],
756
+ viewerRequestFunctionCode: props.code === undefined
757
+ ? undefined
758
+ : aws_cloudfront_1.FunctionCode.fromInline(props.code),
759
+ viewerRequestKeyValueStore: keyValueStore,
693
760
  });
761
+ const template = assertions_1.Template.fromStack(stack);
762
+ const functions = template.findResources("AWS::CloudFront::Function");
763
+ const config = Object.values(template.findResources("AWS::CloudFront::Distribution"))[0].Properties.DistributionConfig;
764
+ const behaviors = [
765
+ { PathPattern: "*", ...config.DefaultCacheBehavior },
766
+ ...config.CacheBehaviors,
767
+ ];
768
+ /** The viewer-request function on the behavior for `pathPattern`. */
769
+ const functionFor = (pathPattern) => {
770
+ const behavior = behaviors.find((it) => it.PathPattern === pathPattern);
771
+ const association = behavior.FunctionAssociations.find((it) => it.EventType === "viewer-request");
772
+ return functions[association.FunctionARN["Fn::GetAtt"][0]].Properties;
773
+ };
774
+ /**
775
+ * That function's handler, runnable. `node:vm` scripts can't `import`, so
776
+ * the `cloudfront` module is handed in as the binding the import makes.
777
+ */
778
+ const handlerFor = (pathPattern, kvsValues = {}) => {
779
+ const code = functionFor(pathPattern).FunctionCode.replace(/^\s*import cf from "cloudfront";/, "");
780
+ return (0, node_vm_1.runInNewContext)(`${code}\nhandler`, {
781
+ cf: fakeCloudFrontModule(kvsValues),
782
+ });
783
+ };
784
+ return { behaviors, functions, functionFor, handlerFor, stack };
785
+ };
786
+ const request = (uri, headers = {}) => ({
787
+ request: {
788
+ uri,
789
+ querystring: {},
790
+ headers: Object.fromEntries(Object.entries({ host: "a.test", ...headers }).map(([name, value]) => [
791
+ name,
792
+ { value },
793
+ ])),
794
+ },
795
+ });
796
+ const status = (result) => result.statusCode;
797
+ it.each([constants_1.NextjsType.GLOBAL_FUNCTIONS, constants_1.NextjsType.GLOBAL_CONTAINERS])("gates every behavior on %s, static assets included", async (nextjsType) => {
798
+ const { behaviors, handlerFor } = synth({ code: BASIC_AUTH, nextjsType });
799
+ expect(behaviors.map((it) => it.PathPattern).sort()).toEqual([
800
+ "*",
801
+ "_next/image*",
802
+ "_next/static*",
803
+ "favicon.ico",
804
+ ]);
805
+ for (const { PathPattern } of behaviors) {
806
+ const handler = handlerFor(PathPattern);
807
+ expect(status(await handler(request("/x")))).toBe(401);
808
+ const passed = (await handler(request("/x", AUTHORIZED)));
809
+ expect(passed.uri).toBe("/x");
810
+ }
811
+ });
812
+ it("shares one pass-through function between dynamic and static on Global Containers", () => {
813
+ const { behaviors, functions } = synth({
814
+ code: BASIC_AUTH,
815
+ nextjsType: constants_1.NextjsType.GLOBAL_CONTAINERS,
816
+ });
817
+ const [logicalId, ...rest] = Object.keys(functions);
818
+ expect(rest).toHaveLength(0);
819
+ expect(behaviors.map((it) => it.PathPattern).sort()).toEqual([
820
+ "*",
821
+ "_next/image*",
822
+ "_next/static*",
823
+ "favicon.ico",
824
+ ]);
825
+ for (const { FunctionAssociations } of behaviors) {
826
+ expect(FunctionAssociations).toEqual([
827
+ {
828
+ EventType: "viewer-request",
829
+ FunctionARN: { "Fn::GetAtt": [logicalId, "FunctionARN"] },
830
+ },
831
+ ]);
832
+ }
833
+ });
834
+ it("accepts viewerRequest declared after another variable", async () => {
835
+ const handler = synth({
836
+ code: `var x = 1, viewerRequest = (event) => ({ statusCode: 401 });`,
837
+ }).handlerFor("_next/static*");
838
+ expect(status(await handler(request("/x")))).toBe(401);
839
+ });
840
+ it("accepts viewerRequest defined as a const arrow function", async () => {
841
+ const handler = synth({
842
+ code: `const viewerRequest = async (event) => ({ statusCode: 401 });`,
843
+ }).handlerFor("_next/static*");
844
+ expect(status(await handler(request("/x")))).toBe(401);
845
+ });
846
+ it("runs before the repeated-slash redirect", async () => {
847
+ // Otherwise `/a//b` would answer 308 to a viewer who never authenticated.
848
+ const handler = synth({ code: BASIC_AUTH }).handlerFor("*");
849
+ expect(status(await handler(request("/a//b")))).toBe(401);
850
+ expect(status(await handler(request("/a//b", AUTHORIZED)))).toBe(308);
851
+ });
852
+ it("associates the store with every function it runs in", () => {
853
+ const { behaviors, functionFor, functions } = synth({
854
+ code: BASIC_AUTH,
855
+ keyValueStore: true,
856
+ assetPrefix: "/cdn",
857
+ });
858
+ expect(Object.keys(functions)).toHaveLength(3);
859
+ for (const { PathPattern } of behaviors) {
860
+ const { FunctionConfig } = functionFor(PathPattern);
861
+ expect(FunctionConfig.Runtime).toBe("cloudfront-js-2.0");
862
+ expect(FunctionConfig.KeyValueStoreAssociations).toEqual([
863
+ { KeyValueStoreARN: { "Fn::GetAtt": [expect.any(String), "Arn"] } },
864
+ ]);
865
+ }
866
+ });
867
+ it("reads credentials from the KeyValueStore", async () => {
868
+ const handler = synth({
869
+ keyValueStore: true,
870
+ code: `import cf from "cloudfront";
871
+ const kvs = cf.kvs();
872
+ async function viewerRequest(event) {
873
+ const auth = event.request.headers.authorization;
874
+ if (auth && auth.value === "Basic " + (await kvs.get("basic-auth"))) {
875
+ return;
876
+ }
877
+ return { statusCode: 401, statusDescription: "Unauthorized" };
878
+ }
879
+ `,
880
+ }).handlerFor("_next/static*", { "basic-auth": "dXNlcjpwYXNz" });
881
+ expect(status(await handler(request("/x")))).toBe(401);
882
+ expect((await handler(request("/x", AUTHORIZED))).uri).toBe("/x");
883
+ });
884
+ it("refuses a KeyValueStore without code to read it", () => {
885
+ expect(() => synth({ keyValueStore: true })).toThrow(/`viewerRequestKeyValueStore` .* needs `viewerRequestFunctionCode`/);
886
+ });
887
+ it("can't keep a viewer's x-forwarded-host past cdk-nextjs's overwrite", async () => {
888
+ const handler = synth({
889
+ code: `
890
+ function viewerRequest(event) {
891
+ event.request.headers["x-forwarded-host"] = { value: "evil.test" };
892
+ return event.request;
893
+ }
894
+ `,
895
+ }).handlerFor("*");
896
+ const result = (await handler(request("/x")));
694
897
  expect(result.headers["x-forwarded-host"].value).toBe("a.test");
695
898
  });
899
+ it("carries on with a request it returns as a new object", async () => {
900
+ const handler = synth({
901
+ code: `
902
+ function viewerRequest(event) {
903
+ return { uri: "/y", querystring: {}, headers: event.request.headers };
904
+ }
905
+ `,
906
+ }).handlerFor("_next/static*");
907
+ expect((await handler(request("/x"))).uri).toBe("/y");
908
+ });
909
+ it("runs inside the assetPrefix rewrite, in place of the static function", async () => {
910
+ const { behaviors, handlerFor } = synth({
911
+ code: BASIC_AUTH,
912
+ assetPrefix: "/cdn",
913
+ });
914
+ const prefixed = behaviors.find((it) => it.PathPattern === "/cdn/_next/static*");
915
+ // One viewer-request function per behavior, or CloudFront rejects it.
916
+ expect(prefixed.FunctionAssociations.filter((it) => it.EventType === "viewer-request")).toHaveLength(1);
917
+ const handler = handlerFor("/cdn/_next/static*");
918
+ expect(status(await handler(request("/cdn/_next/static/a.js")))).toBe(401);
919
+ const passed = (await handler(request("/cdn/_next/static/a.js", AUTHORIZED)));
920
+ expect(passed.uri).toBe("/_next/static/a.js");
921
+ });
922
+ it("adds no functions when unset", () => {
923
+ const { behaviors, functions } = synth();
924
+ const staticBehavior = behaviors.find((it) => it.PathPattern === "_next/static*");
925
+ expect(staticBehavior.FunctionAssociations).toBeUndefined();
926
+ const [fn, ...rest] = Object.values(functions).map((it) => it.Properties);
927
+ expect(rest).toHaveLength(0);
928
+ // The marker is dropped, not left in the deployed function.
929
+ expect(fn.FunctionCode).toMatch(/^\s*async function handler\(event\) \{\n\s*const request/);
930
+ expect(fn.FunctionConfig.KeyValueStoreAssociations).toBeUndefined();
931
+ });
932
+ it.each([false, true])("runs every cdk-nextjs function on cloudfront-js-2.0 (hook set: %s)", (hooked) => {
933
+ const { functions } = synth({
934
+ code: hooked ? BASIC_AUTH : undefined,
935
+ assetPrefix: "/cdn",
936
+ });
937
+ const runtimes = Object.values(functions).map((it) => it.Properties.FunctionConfig.Runtime);
938
+ expect(runtimes).toHaveLength(hooked ? 3 : 2);
939
+ expect(new Set(runtimes)).toEqual(new Set(["cloudfront-js-2.0"]));
940
+ });
941
+ it.each(["dynamicBehaviorOptions", "imageBehaviorOptions"])("refuses a %s override that claims viewer-request on Global Containers", (overrideName) => {
942
+ expect(() => synth({
943
+ code: BASIC_AUTH,
944
+ nextjsType: constants_1.NextjsType.GLOBAL_CONTAINERS,
945
+ overrides: (stack) => ({
946
+ [overrideName]: {
947
+ functionAssociations: [
948
+ {
949
+ eventType: aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST,
950
+ function: new aws_cloudfront_1.Function(stack, "UserFn", {
951
+ code: aws_cloudfront_1.FunctionCode.fromInline("function handler(event) { return event.request; }"),
952
+ }),
953
+ },
954
+ ],
955
+ },
956
+ }),
957
+ })).toThrow(new RegExp(`overrides\\.${overrideName}\\.functionAssociations.*viewerRequestFunctionCode`));
958
+ });
959
+ it("refuses a distributionProps.defaultBehavior override", () => {
960
+ expect(() => synth({
961
+ code: BASIC_AUTH,
962
+ overrides: () => ({
963
+ distributionProps: {
964
+ defaultBehavior: {
965
+ origin: new aws_cloudfront_origins_1.HttpOrigin("example.com"),
966
+ },
967
+ },
968
+ }),
969
+ })).toThrow(/overrides\.distributionProps\.defaultBehavior/);
970
+ });
971
+ it("lets a basePath app replace the default behavior", () => {
972
+ expect(() => synth({
973
+ code: BASIC_AUTH,
974
+ basePath: "/app",
975
+ overrides: () => ({
976
+ distributionProps: {
977
+ defaultBehavior: { origin: new aws_cloudfront_origins_1.HttpOrigin("example.com") },
978
+ },
979
+ }),
980
+ })).not.toThrow();
981
+ });
982
+ it("keeps cdk-nextjs's code out of the deployed indentation", () => {
983
+ const { functionFor } = synth({ code: BASIC_AUTH });
984
+ const code = functionFor("*").FunctionCode;
985
+ const own = code.slice(code.indexOf("async function handler"));
986
+ expect(own).not.toMatch(/^[ \t]/m);
987
+ });
988
+ it("warns, rather than measures, when the code contains a token", () => {
989
+ const { stack } = synth({
990
+ code: `function viewerRequest(event) { return ${aws_cdk_lib_1.Lazy.string({ produce: () => '"x"' })}; }`,
991
+ });
992
+ assertions_1.Annotations.fromStack(stack).hasWarning("*", assertions_1.Match.stringLikeRegexp("contains a CDK token"));
993
+ });
994
+ it("refuses a static override that already claims viewer-request", () => {
995
+ expect(() => synth({
996
+ code: BASIC_AUTH,
997
+ overrides: (stack) => ({
998
+ staticBehaviorOptions: {
999
+ functionAssociations: [
1000
+ {
1001
+ eventType: aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST,
1002
+ function: new aws_cloudfront_1.Function(stack, "UserFn", {
1003
+ code: aws_cloudfront_1.FunctionCode.fromInline("function handler(event) { return event.request; }"),
1004
+ }),
1005
+ },
1006
+ ],
1007
+ },
1008
+ }),
1009
+ })).toThrow(/overrides\.staticBehaviorOptions\.functionAssociations/);
1010
+ });
1011
+ it.each([
1012
+ ["no viewerRequest", "var x = 1;", /must define `viewerRequest\(event\)`/],
1013
+ ...[
1014
+ "function handler(event) {}",
1015
+ "function* handler(event) {}",
1016
+ "const handler = (event) => event.request;",
1017
+ "let a = 1, handler = 2;",
1018
+ "var handler = (event) => event.request;",
1019
+ "var { handler } = { handler: (event) => event.request };",
1020
+ 'globalThis["handler"] = (event) => event.request;',
1021
+ "var cdkNextjsHandler; handler = cdkNextjsHandler;",
1022
+ ].map((declaration) => [
1023
+ `handler in \`${declaration}\``,
1024
+ `${declaration}\nfunction viewerRequest(event) {}`,
1025
+ /uses the name `handler`/,
1026
+ ]),
1027
+ [
1028
+ "viewerRequest only compared, never declared",
1029
+ 'const ok = typeof viewerRequest === "function";',
1030
+ /must define `viewerRequest\(event\)`/,
1031
+ ],
1032
+ [
1033
+ "viewerRequest only assigned as a property",
1034
+ "const cfg = {}; cfg.viewerRequest = function (event) {};",
1035
+ /must define `viewerRequest\(event\)`/,
1036
+ ],
1037
+ [
1038
+ "more than fits in a CloudFront Function",
1039
+ `function viewerRequest(event) {} /* ${"x".repeat(10 * 1024)} */`,
1040
+ /over CloudFront's limit of 10240/,
1041
+ ],
1042
+ ])("refuses code with %s", (_name, code, error) => {
1043
+ expect(() => synth({ code })).toThrow(error);
1044
+ });
696
1045
  });
697
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1kaXN0cmlidXRpb24udGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUEwQztBQUMxQyw2Q0FBbUQ7QUFDbkQsdURBQXNFO0FBQ3RFLCtEQUlvQztBQUNwQyx1REFNZ0M7QUFDaEMsK0NBQTRDO0FBQzVDLCtEQUE0RDtBQUM1RCwyQ0FBeUM7QUFDekMsK0RBRytCO0FBRS9COzs7OztHQUtHO0FBQ0gsUUFBUSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtJQUMzRCxNQUFNLEtBQUssR0FBRyxDQUNaLFVBQW9CLEVBQ3BCLFFBS0ksRUFBRSxFQUNOLEVBQUU7UUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxjQUFjLEdBQXNDLFVBQVUsQ0FBQyxHQUFHLENBQ3RFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDUCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUU7Z0JBQ2hELElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQztnQkFDcEQsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxJQUFJO2dCQUNKLFdBQVcsRUFBRSxJQUFJLHdCQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUU7b0JBQ2hELFFBQVEsRUFBRSxFQUFFO29CQUNaLFFBQVEsRUFBRSxnQ0FBbUIsQ0FBQyxPQUFPO2lCQUN0QyxDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBQ0YsdUVBQXVFO1FBQ3ZFLE1BQU0sc0JBQXNCLEdB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QUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcnVuSW5OZXdDb250ZXh0IH0gZnJvbSBcIm5vZGU6dm1cIjtcbmltcG9ydCB7IEFwcCwgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgTWF0Y2gsIFRlbXBsYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2Fzc2VydGlvbnNcIjtcbmltcG9ydCB7XG4gIEZ1bmN0aW9uIGFzIENsb3VkRnJvbnRGdW5jdGlvbixcbiAgRnVuY3Rpb25Db2RlLFxuICBGdW5jdGlvbkV2ZW50VHlwZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQge1xuICBDb2RlLFxuICBGdW5jdGlvbiBhcyBMYW1iZGFGdW5jdGlvbixcbiAgRnVuY3Rpb25VcmwsXG4gIEZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gIFJ1bnRpbWUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBwYXRoUGF0dGVybnNGb3IgfSBmcm9tIFwiLi9hZGFwdGVyL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgTmV4dGpzVHlwZSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzRGlzdHJpYnV0aW9uLFxuICBOZXh0anNEaXN0cmlidXRpb25GdW5jdGlvbkdyb3VwLFxufSBmcm9tIFwiLi9uZXh0anMtZGlzdHJpYnV0aW9uXCI7XG5cbi8qKlxuICogYGZ1bmN0aW9uR3JvdXBzYCByb3V0aW5nIGF0IHRoZSBlZGdlLiBgTmV4dGpzQnVpbGRgIGlzIGRlbGliZXJhdGVseSBub3RcbiAqIGludm9sdmVkOiB3aGljaCBiZWhhdmlvcnMgYSBncm91cCBnZXRzLCBhbmQgaW4gd2hhdCBvcmRlciwgaXMgdGhlIGFkYXB0ZXInc1xuICogZGVjaXNpb24gKGBmdW5jdGlvbi1ncm91cHMudGVzdC50c2ApLCBzbyB0aGVzZSBwYXNzIHRoZSBiZWhhdmlvcnMgaW4gZGlyZWN0bHlcbiAqIGFuZCBhc3NlcnQgb24gd2hhdCB0aGUgZGlzdHJpYnV0aW9uIGRvZXMgd2l0aCB0aGVtLlxuICovXG5kZXNjcmliZShcIk5leHRqc0Rpc3RyaWJ1dGlvbiBmdW5jdGlvbiBncm91cCBiZWhhdmlvcnNcIiwgKCkgPT4ge1xuICBjb25zdCBzZXR1cCA9IChcbiAgICBncm91cE5hbWVzOiBzdHJpbmdbXSxcbiAgICBwcm9wczoge1xuICAgICAgcm91dGVzRm9yPzogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nW107XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzPzogc3RyaW5nW107XG4gICAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAgIHRyYWlsaW5nU2xhc2g/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlRlc3RTdGFja1wiKTtcbiAgICBjb25zdCBmdW5jdGlvbkdyb3VwczogTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cFtdID0gZ3JvdXBOYW1lcy5tYXAoXG4gICAgICAobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBmbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgYEZuJHtuYW1lfWAsIHtcbiAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBmdW5jdGlvblVybDogbmV3IEZ1bmN0aW9uVXJsKHN0YWNrLCBgVXJsJHtuYW1lfWAsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBmbixcbiAgICAgICAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICk7XG4gICAgLy8gSW4gdGhlIG9yZGVyIGdpdmVuOiB0aGUgYnVpbGQncyBsaXN0IGlzIGFscmVhZHkgbW9zdCBzcGVjaWZpYyBmaXJzdC5cbiAgICBjb25zdCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzID0gZ3JvdXBOYW1lcy5mbGF0TWFwKChncm91cCkgPT5cbiAgICAgIChwcm9wcy5yb3V0ZXNGb3I/Lihncm91cCkgPz8gW2AvJHtncm91cH0vKipgXSkuZmxhdE1hcCgocm91dGUpID0+XG4gICAgICAgIHBhdGhQYXR0ZXJuc0Zvcihyb3V0ZSwge1xuICAgICAgICAgIGhhc0RhdGFSb3V0ZXM6IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nU2xhc2g6IHByb3BzLnRyYWlsaW5nU2xhc2gsXG4gICAgICAgIH0pLm1hcCgocGF0dGVybikgPT4gKHsgZ3JvdXAsIHJvdXRlLCBwYXR0ZXJuIH0pKSxcbiAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBkZWZhdWx0Rm4gPSBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiRm5EZWZhdWx0XCIsIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9ICgpID0+IHt9O1wiKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhY2ssXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICBkaXN0cmlidXRpb25Qcm9wczoge1xuICAgICAgICBhc3NldHNCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssIFwiQXNzZXRzXCIpLFxuICAgICAgICBiYXNlUGF0aDogcHJvcHMuYmFzZVBhdGgsXG4gICAgICAgIGZ1bmN0aW9uVXJsOiBuZXcgRnVuY3Rpb25Vcmwoc3RhY2ssIFwiVXJsRGVmYXVsdFwiLCB7XG4gICAgICAgICAgZnVuY3Rpb246IGRlZmF1bHRGbixcbiAgICAgICAgICBhdXRoVHlwZTogRnVuY3Rpb25VcmxBdXRoVHlwZS5BV1NfSUFNLFxuICAgICAgICB9KSxcbiAgICAgICAgbmV4dGpzVHlwZTogTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiAocHJvcHMucHVibGljRGlyRW50cmllcyA/PyBbXSkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaXNEaXJlY3Rvcnk6IGZhbHNlLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgcGF0aFBhdHRlcm5zID0gKHN0YWNrOiBTdGFjaykgPT4ge1xuICAgIGNvbnN0IGRpc3RyaWJ1dGlvbnMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBjb25maWcgPVxuICAgICAgT2JqZWN0LnZhbHVlcyhkaXN0cmlidXRpb25zKVswXS5Qcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZztcbiAgICByZXR1cm4gKGNvbmZpZy5DYWNoZUJlaGF2aW9ycyBhcyBBcnJheTx7IFBhdGhQYXR0ZXJuOiBzdHJpbmcgfT4pLm1hcChcbiAgICAgIChiZWhhdmlvcikgPT4gYmVoYXZpb3IuUGF0aFBhdHRlcm4sXG4gICAgKTtcbiAgfTtcblxuICBpdChcImFkZHMgbm90aGluZyBleHRyYSB3aGVuIHRoZXJlIGFyZSBubyBncm91cHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFtcIl9uZXh0L3N0YXRpYypcIiwgXCJfbmV4dC9pbWFnZSpcIl0pO1xuICB9KTtcblxuICBpdChcImxldHMgdGhlIE9BQyBwcmluY2lwYWwgbGlzdCB0aGUgYnVja2V0IHNvIGEgbWlzc2luZyBhc3NldCBpcyBhIDQwNFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCBkaXN0cmlidXRpb25Qcm9wcyk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OlMzOjpCdWNrZXRQb2xpY3lcIiwge1xuICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgQWN0aW9uOiBbXCJzMzpHZXRPYmplY3RcIiwgXCJzMzpMaXN0QnVja2V0XCJdLFxuICAgICAgICAgICAgUHJpbmNpcGFsOiB7IFNlcnZpY2U6IFwiY2xvdWRmcm9udC5hbWF6b25hd3MuY29tXCIgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImFkZHMgZ3JvdXAgYmVoYXZpb3JzIGluIHRoZSBidWlsZCdzIG9yZGVyLCBhZnRlciB0aGUgaW1hZ2UgYmVoYXZpb3JcIiwgKCkgPT4ge1xuICAgIC8vIENsb3VkRnJvbnQgc3RvcHMgYXQgdGhlIGZpcnN0IG1hdGNoaW5nIGJlaGF2aW9yLCBzbyBgYXBpLypgIGFoZWFkIG9mXG4gICAgLy8gYGFwaS9yZXBvcnRzLypgIHdvdWxkIHNlbmQgZXZlcnkgcmVwb3J0IHJlcXVlc3QgdG8gdGhlIHdyb25nIGZ1bmN0aW9uLlxuICAgIC8vIFRoZSBidWlsZCBzb3J0ZWQgdGhlbSB3aGVuIGl0IGNoZWNrZWQgdGhlbTsgcmUtc29ydGluZyBoZXJlIGNvdWxkIG9ubHlcbiAgICAvLyBkaXNhZ3JlZSB3aXRoIHRoYXQuXG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wicmVwb3J0c1wiLCBcImFwaVwiXSwge1xuICAgICAgICByb3V0ZXNGb3I6IChuYW1lKSA9PlxuICAgICAgICAgIG5hbWUgPT09IFwiYXBpXCIgPyBbXCIvYXBpLyoqXCJdIDogW1wiL2FwaS9yZXBvcnRzLyoqXCJdLFxuICAgICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvRXF1YWwoW1xuICAgICAgXCJfbmV4dC9zdGF0aWMqXCIsXG4gICAgICBcIl9uZXh0L2ltYWdlKlwiLFxuICAgICAgXCJhcGkvcmVwb3J0cy8qXCIsXG4gICAgICBcImFwaS8qXCIsXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgdGhlIHR3byBzbGFzaCB2YXJpYW50cyBkaXN0aW5jdCB1bmRlciBhIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAvLyBgZ2V0UGF0aFBhdHRlcm5gIHVzZWQgdG8gam9pbiB0aHJvdWdoIGEgaGVscGVyIHRoYXQgc3RyaXBzIHRyYWlsaW5nXG4gICAgLy8gc2xhc2hlcywgc28gYHByaWNpbmdgIGFuZCBgcHJpY2luZy9gIGJvdGggYmVjYW1lIGAvYmFzZS9wcmljaW5nYDogdHdvXG4gICAgLy8gYmVoYXZpb3JzIHdpdGggdGhlIHNhbWUgcGF0aCBwYXR0ZXJuLCB3aGljaCBDbG91ZEZyb250IHJlamVjdHMgYXQgZGVwbG95XG4gICAgLy8gd2l0aCBubyBoaW50IHRoYXQgYHRyYWlsaW5nU2xhc2hgIGlzIHdoYXQgcHJvZHVjZWQgdGhlIGR1cGxpY2F0ZS5cbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJta3RcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvcHJpY2luZ1wiXSxcbiAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgICAgdHJhaWxpbmdTbGFzaDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gcGF0aFBhdHRlcm5zKHN0YWNrKTtcbiAgICBleHBlY3QocGF0dGVybnMpLnRvQ29udGFpbihcIi9iYXNlL3ByaWNpbmdcIik7XG4gICAgZXhwZWN0KHBhdHRlcm5zKS50b0NvbnRhaW4oXCIvYmFzZS9wcmljaW5nL1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJjb3VudHMgdGhlIGJhc2VQYXRoIGJlaGF2aW9ycyBhZ2FpbnN0IHRoZSBidWRnZXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDIxIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgfSk7XG4gICAgLy8gMyBmaXhlZCArIHRoZSAyIGEgYmFzZVBhdGggYWRkcyB0byBzdGFuZCBpbiBmb3IgdGhlIGRlZmF1bHQgYmVoYXZpb3IgKyAyMVxuICAgIC8vIHB1YmxpYyA9IDI2LiBDb3VudGluZyBvbmx5IHRoZSAzIHJlcG9ydGVkIDI0IGFuZCBsZXQgdGhlIHN5bnRoIHRocm91Z2gsIHNvXG4gICAgLy8gdGhlIGxpbWl0IGFycml2ZWQgYXMgYSBDbG91ZEZyb250IGRlcGxveSBmYWlsdXJlLlxuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBtYXhDYWNoZUJlaGF2aW9yczogMjUsXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvMjYgQ2xvdWRGcm9udCBjYWNoZSBiZWhhdmlvcnMuKjUgdXNlZCBieSBjZGstbmV4dGpzIGl0c2VsZi9zKTtcbiAgfSk7XG5cbiAgaXQoXCJkZWZhdWx0cyB0aGUgYnVkZ2V0IHRvIENsb3VkRnJvbnQncyBxdW90YSBvZiA3NVwiLCAoKSA9PiB7XG4gICAgLy8gVGhlIGhhcmQtY29kZWQgMjUgcHJlZGF0ZWQgdGhlIHF1b3RhJ3MgaW5jcmVhc2UgdG8gNzUuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA3MiB9LCAoXywgaSkgPT4gYGZpbGUke2l9LnR4dGApLFxuICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+IG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIGRpc3RyaWJ1dGlvblByb3BzKSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gICAgY29uc3QgeyBzdGFjazogb3ZlciwgZGlzdHJpYnV0aW9uUHJvcHM6IG92ZXJQcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDczIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT4gbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihvdmVyLCBcIkRpc3RyaWJ1dGlvblwiLCBvdmVyUHJvcHMpLFxuICAgICkudG9UaHJvdyhcbiAgICAgIC83NiBDbG91ZEZyb250IGNhY2hlIGJlaGF2aW9ycywgb3ZlciB0aGUgbGltaXQgb2YgNzUuKnNldCBgbWF4Q2FjaGVCZWhhdmlvcnNgL3MsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJob25vcnMgYSByYWlzZWQgbWF4Q2FjaGVCZWhhdmlvcnNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogOTcgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgbWF4Q2FjaGVCZWhhdmlvcnM6IDEwMCxcbiAgICAgICAgfSksXG4gICAgKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGNvdW50IGJhc2VQYXRoIGJlaGF2aW9ycyBmb3IgYSBiYXNlUGF0aCBvZiAvXCIsICgpID0+IHtcbiAgICAvLyBgYmFzZVBhdGg6IFwiL1wiYCBub3JtYWxpemVzIHRvIG5vIGJhc2VQYXRoIGFuZCBhZGRzIG5vIGJlaGF2aW9ycywgc29cbiAgICAvLyBjb3VudGluZyAyIGZvciBpdCBjb3VsZCByZWplY3QgYW4gYXBwIHRoYXQgaXMgdW5kZXIgdGhlIGxpbWl0LlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgYmFzZVBhdGg6IFwiL1wiLFxuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMjIgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgbWF4Q2FjaGVCZWhhdmlvcnM6IDI1LFxuICAgICAgICB9KSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0KFwicmVqZWN0cyBhIGJlaGF2aW9yIGZvciBhIGdyb3VwIGl0IHdhcyBub3QgZ2l2ZW5cIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXCJhcGlcIl0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coXG4gICAgICAvcm91dGVzIHRvIGZ1bmN0aW9uIGdyb3VwIFwiYXBpXCIsIHdoaWNoIGlzIG5vdCBpbiBgZnVuY3Rpb25Hcm91cHNgLyxcbiAgICApO1xuICB9KTtcblxuICBpdChcInBvaW50cyBlYWNoIGdyb3VwJ3MgYmVoYXZpb3JzIGF0IHRoYXQgZ3JvdXAncyBvd24gb3JpZ2luXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJhcGlcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvYXBpLyoqXCIsIFwiL2hlYWx0aFwiXSxcbiAgICAgIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgIH0pO1xuICAgIGNvbnN0IGRpc3RyaWJ1dGlvbnMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBjb25maWcgPVxuICAgICAgT2JqZWN0LnZhbHVlcyhkaXN0cmlidXRpb25zKVswXS5Qcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZztcbiAgICBjb25zdCBiZWhhdmlvcnMgPSBjb25maWcuQ2FjaGVCZWhhdmlvcnMgYXMgQXJyYXk8e1xuICAgICAgUGF0aFBhdHRlcm46IHN0cmluZztcbiAgICAgIFRhcmdldE9yaWdpbklkOiBzdHJpbmc7XG4gICAgfT47XG4gICAgY29uc3QgZ3JvdXBPcmlnaW5zID0gbmV3IFNldChcbiAgICAgIGJlaGF2aW9yc1xuICAgICAgICAuZmlsdGVyKChiZWhhdmlvcikgPT5cbiAgICAgICAgICBbXCJhcGkvKlwiLCBcImhlYWx0aFwiXS5pbmNsdWRlcyhiZWhhdmlvci5QYXRoUGF0dGVybiksXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoYmVoYXZpb3IpID0+IGJlaGF2aW9yLlRhcmdldE9yaWdpbklkKSxcbiAgICApO1xuICAgIC8vIE9uZSBvcmlnaW4sIHNoYXJlZCBieSBib3RoIG9mIHRoZSBncm91cCdzIHBhdHRlcm5zLCBhbmQgbm90IHRoZSBkZWZhdWx0J3MuXG4gICAgZXhwZWN0KGdyb3VwT3JpZ2lucy5zaXplKS50b0JlKDEpO1xuICAgIGV4cGVjdChncm91cE9yaWdpbnMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBjb25maWcuRGVmYXVsdENhY2hlQmVoYXZpb3IuVGFyZ2V0T3JpZ2luSWQsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJwcmVmaXhlcyBncm91cCBwYXR0ZXJucyB3aXRoIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJhcGlcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvYXBpLyoqXCJdLFxuICAgICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvQ29udGFpbihcIi9iYXNlL2FwaS8qXCIpO1xuICB9KTtcblxuICBpdChcIm5hbWVzIGV2ZXJ5IGNsYWltIG9uIHRoZSBiZWhhdmlvciBidWRnZXQgd2hlbiBpdCBpcyBleGNlZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wiYXBpXCJdLCB7XG4gICAgICAgIHJvdXRlc0ZvcjogKCkgPT4gW1wiL2FwaS8qKlwiXSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMjIgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgICAgIG1heENhY2hlQmVoYXZpb3JzOiAyNSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KFxuICAgICAgLzI2IENsb3VkRnJvbnQgY2FjaGUgYmVoYXZpb3JzLioxIGZvciBgZnVuY3Rpb25Hcm91cHNgIHBhdHRlcm5zL3MsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWplY3RzIGEgZ3JvdXAgcGF0dGVybiB0aGF0IGR1cGxpY2F0ZXMgYSBwdWJsaWMvIGRpcmVjdG9yeSdzXCIsICgpID0+IHtcbiAgICAvLyBgcHVibGljL2RvY3MvYCBhbmQgYC9kb2NzLyoqYCBib3RoIGRlcGxveSBhcyBgZG9jcy8qYDogdGhlIHN5bnRoXG4gICAgLy8gc3VjY2VlZGVkIGFuZCBDbG91ZEZyb250IHJlamVjdGVkIHRoZSBkZXBsb3kuXG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wiZG9jc1wiXSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJkb2NzXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH1dLFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coXG4gICAgICAvcGF0dGVybiBcIlxcL2RvY3NcXC9cXCpcXCpcIiBcXChncm91cCBcImRvY3NcIlxcKSBkZXBsb3lzIGFzIHRoZSBwYXRoIHBhdHRlcm4gXCJkb2NzXFwvXFwqXCIsIHdoaWNoIGEgdG9wLWxldmVsIHB1YmxpY1xcLyBlbnRyeSBhbHJlYWR5IHVzZXMvLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicmVqZWN0cyBhIGdyb3VwIHBhdHRlcm4gYSBwdWJsaWMvIGRpcmVjdG9yeSdzIGJlaGF2aW9yIHdvdWxkIHNoYWRvd1wiLCAoKSA9PiB7XG4gICAgLy8gYGRvY3MvKmAgaXMgYWRkZWQgZmlyc3QsIHNvIGBkb2NzL2d1aWRlLypgIG5ldmVyIG1hdGNoZXMuXG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wiZ3VpZGVcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvZG9jcy9ndWlkZS8qKlwiXSxcbiAgICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFt7IG5hbWU6IFwiZG9jc1wiLCBpc0RpcmVjdG9yeTogdHJ1ZSB9XSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9wdWJsaWNcXC8gZW50cnkgYmVoaW5kIFwiZG9jc1xcL1xcKlwiIGlzIG1hdGNoZWQgZmlyc3QvKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWplY3RzIGFuIGV4YWN0IGdyb3VwIHBhdHRlcm4gZXF1YWwgdG8gYSBwdWJsaWMvIGZpbGUncywgYmFzZVBhdGggaW5jbHVkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcIm1rdFwiXSwge1xuICAgICAgICByb3V0ZXNGb3I6ICgpID0+IFtcIi9yb2JvdHMudHh0XCJdLFxuICAgICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJyb2JvdHMudHh0XCIsIGlzRGlyZWN0b3J5OiBmYWxzZSB9XSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9kZXBsb3lzIGFzIHRoZSBwYXRoIHBhdHRlcm4gXCJcXC9iYXNlXFwvcm9ib3RzXFwudHh0XCIvKTtcbiAgfSk7XG5cbiAgaXQoXCJhbGxvd3MgYSBncm91cCBwYXR0ZXJuIGJlc2lkZSBhIHB1YmxpYy8gZW50cnkgaXQgZG9lcyBub3Qgb3ZlcmxhcFwiLCAoKSA9PiB7XG4gICAgLy8gYC9kb2NzYCBleGFjdCBpcyBub3QgdW5kZXIgYGRvY3MvKmAsIGFuZCBgZG9jcy8qYCBkb2VzIG5vdCBtYXRjaCBgL2RvY3NgLlxuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcImRvY3NcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvZG9jc1wiXSxcbiAgICAgIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJkb2NzXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH1dLFxuICAgIH0pO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFxuICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXCJkb2NzLypcIiwgXCJkb2NzXCJdKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcInNlcnZlcyBidW5kbGVzIHVuZGVyIGEgcGF0aC1zdHlsZSBhc3NldFByZWZpeCwgcmV3cml0aW5nIHRoZSBwcmVmaXggYXdheVwiLCAoKSA9PiB7XG4gICAgLy8gTmV4dC5qcyBlbWl0cyBgPGFzc2V0UHJlZml4Pi9fbmV4dC9zdGF0aWMvLi4uYCBmb3IgZXZlcnkgYnVuZGxlIHdoaWxlIHRoZVxuICAgIC8vIG9iamVjdHMga2VlcCB0aGVpciB1bnByZWZpeGVkIFMzIGtleXMsIHNvIHdpdGhvdXQgYSBiZWhhdmlvciBvZiBpdHMgb3duIHRoZVxuICAgIC8vIHJlcXVlc3QgZmFsbHMgdGhyb3VnaCB0byB0aGUgY29tcHV0ZSBvcmlnaW4gYW5kIDQwNHMg4oCUIHRoZSBkZXBsb3ltZW50XG4gICAgLy8gcGFja2FnZSBjYXJyaWVzIG5vIGAubmV4dC9zdGF0aWNgLiBNZWFzdXJlZCBhZ2FpbnN0XG4gICAgLy8gYHRlc3QvZTJlL2FwcC1kaXIvYXNzZXQtcHJlZml4YCwgd2hlcmUgMiBvZiA3IGNhc2VzIGZhaWxlZCBvbiBleGFjdGx5IHRoYXQuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGFzc2V0UHJlZml4OiBcIi9jdXN0b20tYXNzZXQtcHJlZml4XCIsXG4gICAgfSk7XG4gICAgLy8gQWhlYWQgb2YgdGhlIGJhcmUgYF9uZXh0L3N0YXRpYypgIGluIG5vdGhpbmcgYnV0IGxpc3QgcG9zaXRpb247IHRoZSB0d29cbiAgICAvLyBwYXR0ZXJucyBjYW5ub3QgYm90aCBtYXRjaCBvbmUgcmVxdWVzdCwgc28gb3JkZXIgZG9lcyBub3QgbWF0dGVyIGhlcmUuXG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvRXF1YWwoW1xuICAgICAgXCJfbmV4dC9zdGF0aWMqXCIsXG4gICAgICBcIi9jdXN0b20tYXNzZXQtcHJlZml4L19uZXh0L3N0YXRpYypcIixcbiAgICAgIFwiX25leHQvaW1hZ2UqXCIsXG4gICAgXSk7XG4gICAgY29uc3QgZm5zID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkZ1bmN0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBjb2RlID0gT2JqZWN0LnZhbHVlcyhmbnMpXG4gICAgICAubWFwKChmbikgPT4gZm4uUHJvcGVydGllcy5GdW5jdGlvbkNvZGUgYXMgc3RyaW5nKVxuICAgICAgLmZpbmQoKGl0KSA9PiBpdC5pbmNsdWRlcyhcInJlcXVlc3QudXJpLnNsaWNlXCIpKTtcbiAgICAvLyBgXCIvY3VzdG9tLWFzc2V0LXByZWZpeFwiLmxlbmd0aGAsIHNvIGAvY3VzdG9tLWFzc2V0LXByZWZpeC9fbmV4dC9zdGF0aWMveGBcbiAgICAvLyByZWFjaGVzIFMzIGFzIGBfbmV4dC9zdGF0aWMveGAuXG4gICAgZXhwZWN0KGNvZGUpLnRvQ29udGFpbignXCJcIiArIHJlcXVlc3QudXJpLnNsaWNlKDIwKScpO1xuICB9KTtcblxuICBpdChcInJlZnVzZXMgYW4gYXNzZXRQcmVmaXggd2hlbiBhbiBvdmVycmlkZSBhbHJlYWR5IGNsYWltcyBWSUVXRVJfUkVRVUVTVFwiLCAoKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCBwZXJtaXRzIG9uZSBmdW5jdGlvbiBwZXIgZXZlbnQgdHlwZSBwZXIgYmVoYXZpb3IsIHNvIHRoZVxuICAgIC8vIHJld3JpdGUgYW5kIHRoZSBvdmVycmlkZSBjYW5ub3QgY29leGlzdDogdGhlIHN0YWNrIHN5bnRoZWQgY2xlYW5seSBhbmQgd2FzXG4gICAgLy8gcmVqZWN0ZWQgYXQgZGVwbG95LCBuYW1pbmcgbmVpdGhlciB0aGUgb3ZlcnJpZGUgbm9yIGBhc3NldFByZWZpeGAuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgYXNzZXRQcmVmaXg6IFwiL2NkblwiLFxuICAgICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgICAgc3RhdGljQmVoYXZpb3JPcHRpb25zOiB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHN0YWNrLCBcIlVzZXJGblwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKFxuICAgICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb24gaGFuZGxlcihldmVudCkgeyByZXR1cm4gZXZlbnQucmVxdWVzdDsgfVwiLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9hbHJlYWR5IGFzc29jaWF0ZXMgYSBDbG91ZEZyb250IGZ1bmN0aW9uIHdpdGggdmlld2VyLXJlcXVlc3QvKTtcbiAgfSk7XG5cbiAgY29uc3QgdXNlckZuID0gKHN0YWNrOiBTdGFjaywgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZSkgPT4gKHtcbiAgICBldmVudFR5cGUsXG4gICAgZnVuY3Rpb246IG5ldyBDbG91ZEZyb250RnVuY3Rpb24oc3RhY2ssIGBVc2VyRm4ke2V2ZW50VHlwZX1gLCB7XG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShcbiAgICAgICAgXCJmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7IHJldHVybiBldmVudC5yZXF1ZXN0IHx8IGV2ZW50LnJlc3BvbnNlOyB9XCIsXG4gICAgICApLFxuICAgIH0pLFxuICB9KTtcblxuICBpdC5lYWNoKFtcImR5bmFtaWNCZWhhdmlvck9wdGlvbnNcIiwgXCJpbWFnZUJlaGF2aW9yT3B0aW9uc1wiXSBhcyBjb25zdCkoXG4gICAgXCJyZWZ1c2VzIGEgJXMgb3ZlcnJpZGUgdGhhdCB3b3VsZCByZXBsYWNlIHRoZSB4LWZvcndhcmRlZC1ob3N0IGZ1bmN0aW9uXCIsXG4gICAgKG92ZXJyaWRlTmFtZSkgPT4ge1xuICAgICAgLy8gVGhlIHJ1bnRpbWUgdHJ1c3RzIGB4LWZvcndhcmRlZC1ob3N0YCBvbiBGdW5jdGlvbiBVUkwgZXZlbnRzIGJlY2F1c2VcbiAgICAgIC8vIHRoaXMgZnVuY3Rpb24gb3ZlcndyaXRlcyBpdDsgcmVwbGFjZWQsIGEgdmlld2VyJ3Mgb3duIGhlYWRlciByZWFjaGVzIGl0LlxuICAgICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgICAgICBbb3ZlcnJpZGVOYW1lXToge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgICAgICAgICB1c2VyRm4oc3RhY2ssIEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNUKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICkudG9UaHJvdyhcbiAgICAgICAgbmV3IFJlZ0V4cChgb3ZlcnJpZGVzXFxcXC4ke292ZXJyaWRlTmFtZX1cXFxcLmZ1bmN0aW9uQXNzb2NpYXRpb25zYCksXG4gICAgICApO1xuICAgIH0sXG4gICk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgeC1mb3J3YXJkZWQtaG9zdCBmdW5jdGlvbiBuZXh0IHRvIGFuIG92ZXJyaWRlJ3Mgb3RoZXIgYXNzb2NpYXRpb25zXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgIGR5bmFtaWNCZWhhdmlvck9wdGlvbnM6IHtcbiAgICAgICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW1xuICAgICAgICAgICAgdXNlckZuKHN0YWNrLCBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVTUE9OU0UpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblwiKSxcbiAgICApWzBdLlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnO1xuICAgIGNvbnN0IGV2ZW50VHlwZXMgPSAoXG4gICAgICBjb25maWcuRGVmYXVsdENhY2hlQmVoYXZpb3IuRnVuY3Rpb25Bc3NvY2lhdGlvbnMgYXMgQXJyYXk8e1xuICAgICAgICBFdmVudFR5cGU6IHN0cmluZztcbiAgICAgIH0+XG4gICAgKS5tYXAoKGFzc29jaWF0aW9uKSA9PiBhc3NvY2lhdGlvbi5FdmVudFR5cGUpO1xuICAgIGV4cGVjdChldmVudFR5cGVzLnNvcnQoKSkudG9FcXVhbChbXCJ2aWV3ZXItcmVxdWVzdFwiLCBcInZpZXdlci1yZXNwb25zZVwiXSk7XG4gIH0pO1xuXG4gIGl0KFwicmV3cml0ZXMgYW4gYXNzZXRQcmVmaXggYmFjayBvbnRvIHRoZSBiYXNlUGF0aCBTMyBrZXlzXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHsgYmFzZVBhdGg6IFwiL2Jhc2VcIiB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG5cIixcbiAgICB9KTtcbiAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9Db250YWluKFwiL2Nkbi9fbmV4dC9zdGF0aWMqXCIpO1xuICAgIGNvbnN0IGZucyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiLFxuICAgICk7XG4gICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoZm5zKVxuICAgICAgLm1hcCgoZm4pID0+IGZuLlByb3BlcnRpZXMuRnVuY3Rpb25Db2RlIGFzIHN0cmluZylcbiAgICAgIC5maW5kKChpdCkgPT4gaXQuaW5jbHVkZXMoXCJyZXF1ZXN0LnVyaS5zbGljZVwiKSk7XG4gICAgLy8gVGhlIG9iamVjdHMgYXJlIGF0IGBiYXNlL19uZXh0L3N0YXRpYy8uLi5gOiBgYXNzZXRQcmVmaXhgIHJlcGxhY2VzIHRoZVxuICAgIC8vIGBiYXNlUGF0aGAgcHJlZml4IGluIHRoZSBVUkwsIHNvIHRoZSByZXdyaXRlIGhhcyB0byBwdXQgaXQgYmFjay5cbiAgICBleHBlY3QoY29kZSkudG9Db250YWluKCdcIi9iYXNlXCIgKyByZXF1ZXN0LnVyaS5zbGljZSg0KScpO1xuICB9KTtcblxuICBpdChcInNlcnZlcyBidW5kbGVzIHVuZGVyIHRoZSBwYXRoIGFuIGFic29sdXRlIGFzc2V0UHJlZml4IGNhcnJpZXNcIiwgKCkgPT4ge1xuICAgIC8vIGBuZXh0IGJ1aWxkYCBjb21waWxlcyBhIGAvY3VzdG9tLWFzc2V0LXByZWZpeC9fbmV4dC86cGF0aCsg4oaSIC9fbmV4dC86cGF0aCtgXG4gICAgLy8gcmV3cml0ZSBvZiBpdHMgb3duIGZvciBhbiBhYnNvbHV0ZSBwcmVmaXggd2l0aCBhIHBhdGgsIHNvIGBuZXh0IHN0YXJ0YCBzZXJ2ZXNcbiAgICAvLyBldmVyeSBidW5kbGUgdW5kZXIgdGhhdCBwYXRoIGFzIHdlbGwuIEEgQ0ROIGZyb250aW5nIHRoaXMgZGlzdHJpYnV0aW9uIHRoZXJlXG4gICAgLy8gZ2V0cyB0aGUgc2FtZSByZXF1ZXN0LCBhbmQgd2l0aG91dCBhIGJlaGF2aW9yIGl0IHJlYWNoZXMgdGhlIGNvbXB1dGUgb3JpZ2luXG4gICAgLy8gYW5kIDQwNHMuIE1lYXN1cmVkIGFnYWluc3QgYHRlc3QvZTJlL2FwcC1kaXIvYXNzZXQtcHJlZml4LWFic29sdXRlYCwgd2hvc2VcbiAgICAvLyBvbmUgY2FzZSBmYWlsZWQgb24gZXhhY3RseSB0aGF0LlxuICAgIGZvciAoY29uc3QgYXNzZXRQcmVmaXggb2YgW1xuICAgICAgXCJodHRwczovL2V4YW1wbGUudmVyY2VsLnNoL2N1c3RvbS1hc3NldC1wcmVmaXhcIixcbiAgICAgIFwiLy9leGFtcGxlLnZlcmNlbC5zaC9jdXN0b20tYXNzZXQtcHJlZml4L1wiLFxuICAgIF0pIHtcbiAgICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICBhc3NldFByZWZpeCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvQ29udGFpbihcbiAgICAgICAgXCIvY3VzdG9tLWFzc2V0LXByZWZpeC9fbmV4dC9zdGF0aWMqXCIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkFXUzo6Q2xvdWRGcm9udDo6RnVuY3Rpb25cIiksXG4gICAgICApXG4gICAgICAgIC5tYXAoKGZuKSA9PiBmbi5Qcm9wZXJ0aWVzLkZ1bmN0aW9uQ29kZSBhcyBzdHJpbmcpXG4gICAgICAgIC5maW5kKChpdCkgPT4gaXQuaW5jbHVkZXMoXCJyZXF1ZXN0LnVyaS5zbGljZVwiKSk7XG4gICAgICBleHBlY3QoY29kZSkudG9Db250YWluKCdcIlwiICsgcmVxdWVzdC51cmkuc2xpY2UoMjApJyk7XG4gICAgfVxuICB9KTtcblxuICBpdChcImFkZHMgbm8gYmVoYXZpb3IgZm9yIGFuIGFzc2V0UHJlZml4IHRoYXQgbmVlZHMgbm9uZVwiLCAoKSA9PiB7XG4gICAgLy8gQW4gYWJzb2x1dGUgcHJlZml4IHdpdGggbm8gcGF0aCBvZiBpdHMgb3duIG5hbWVzIGFuIG9yaWdpbiB0aGlzIGRpc3RyaWJ1dGlvblxuICAgIC8vIGRvZXMgbm90IHNlcnZlLCBhbmQgYSBwcmVmaXggZXF1YWwgdG8gdGhlIGJhc2VQYXRoIG9uZSBpcyB3aGF0IE5leHQuanNcbiAgICAvLyBkZWZhdWx0cyB0byB3aGVuIGBiYXNlUGF0aGAgaXMgc2V0IOKAlCBgX25leHQvc3RhdGljKmAgYWxyZWFkeSByZXNvbHZlcyB1bmRlclxuICAgIC8vIGl0LCBhbmQgYSBkdXBsaWNhdGUgcGF0dGVybiB3b3VsZCBtYWtlIENsb3VkRnJvbnQgcmVqZWN0IHRoZSBkaXN0cmlidXRpb24uXG4gICAgZm9yIChjb25zdCBbYXNzZXRQcmVmaXgsIGJhc2VQYXRoXSBvZiBbXG4gICAgICBbXCJodHRwczovL2Nkbi5leGFtcGxlLmNvbVwiLCB1bmRlZmluZWRdLFxuICAgICAgW1wiaHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vXCIsIHVuZGVmaW5lZF0sXG4gICAgICBbXCIvL2Nkbi5leGFtcGxlLmNvbVwiLCB1bmRlZmluZWRdLFxuICAgICAgW1wiL2Jhc2VcIiwgXCIvYmFzZVwiXSxcbiAgICAgIFtcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2Jhc2VcIiwgXCIvYmFzZVwiXSxcbiAgICAgIFtcIlwiLCB1bmRlZmluZWRdLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwgeyBiYXNlUGF0aCB9KTtcbiAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgIGFzc2V0UHJlZml4LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHBhdGhQYXR0ZXJucyhzdGFjayk7XG4gICAgICBleHBlY3QocGF0dGVybnMuZmlsdGVyKChwKSA9PiBwLmluY2x1ZGVzKFwiX25leHQvc3RhdGljXCIpKSkudG9IYXZlTGVuZ3RoKFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIC8vIFRoZSB4LWZvcndhcmRlZC1ob3N0IGZ1bmN0aW9uIGlzIGFsd2F5cyB0aGVyZSBvbiBmdW5jdGlvbiBjb21wdXRlOyB0aGVcbiAgICAgIC8vIHJld3JpdGUgb25lIHNob3VsZCBub3QgYmUuXG4gICAgICBjb25zdCBjb2RlcyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkFXUzo6Q2xvdWRGcm9udDo6RnVuY3Rpb25cIiksXG4gICAgICApLm1hcCgoZm4pID0+IGZuLlByb3BlcnRpZXMuRnVuY3Rpb25Db2RlIGFzIHN0cmluZyk7XG4gICAgICBleHBlY3QoY29kZXMuc29tZSgoaXQpID0+IGl0LmluY2x1ZGVzKFwicmVxdWVzdC51cmkuc2xpY2VcIikpKS50b0JlKGZhbHNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiY291bnRzIHRoZSBhc3NldFByZWZpeCBiZWhhdmlvciBhZ2FpbnN0IHRoZSBidWRnZXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMjIgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICAvLyAzIGZpeGVkICsgMjIgcHVibGljID0gMjUsIGV4YWN0bHkgdGhlIGxpbWl0OyB0aGUgYXNzZXRQcmVmaXggb25lIGlzIHRoZVxuICAgIC8vIDI2dGgsIGFuZCBhIGxpbWl0IGVycm9yIHRoYXQgZGlkIG5vdCBjb3VudCBpdCB3b3VsZCBjb21lIGFzIGEgZGVwbG95XG4gICAgLy8gZmFpbHVyZSBpbnN0ZWFkLlxuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBhc3NldFByZWZpeDogXCIvY2RuXCIsXG4gICAgICAgICAgbWF4Q2FjaGVCZWhhdmlvcnM6IDI1LFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coLzI2IENsb3VkRnJvbnQgY2FjaGUgYmVoYXZpb3JzLio0IHVzZWQgYnkgY2RrLW5leHRqcyBpdHNlbGYvcyk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgY2FjaGUgYSBkeW5hbWljIHJlc3BvbnNlIHRoYXQgc2VuZHMgbm8gQ2FjaGUtQ29udHJvbFwiLCAoKSA9PiB7XG4gICAgLy8gQ0RLJ3MgYENhY2hlUG9saWN5YCBkZWZhdWx0IGlzIGEgZGF5LCB3aGljaCBjYWNoZWQgZXZlcnkgcm91dGUgaGFuZGxlclxuICAgIC8vIHdpdGhvdXQgYSBgQ2FjaGUtQ29udHJvbGAgLSBgL2FwaS9lY2hvYCBpbiBhcHAtcGxheWdyb3VuZCAtIGZvciAyNCBob3Vycy5cbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIGRpc3RyaWJ1dGlvblByb3BzKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpDYWNoZVBvbGljeVwiLFxuICAgICAge1xuICAgICAgICBDYWNoZVBvbGljeUNvbmZpZzogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgQ29tbWVudDogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcIkR5bmFtaWNcIiksXG4gICAgICAgICAgRGVmYXVsdFRUTDogMCxcbiAgICAgICAgICBNaW5UVEw6IDAsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBpdChcIndpbGRjYXJkcyBhIHB1YmxpYy8gbmFtZSBDbG91ZEZyb250IGNhbm5vdCBzcGVsbFwiLCAoKSA9PiB7XG4gICAgLy8gYHB1YmxpYy9oZWxsbyB3b3JsZC5qcGdgIGlzIGEgdmFsaWQgTmV4dC5qcyBhc3NldCwgYnV0IGEgc3BhY2UgY2Fubm90IGFwcGVhclxuICAgIC8vIGluIGEgcGF0aCBwYXR0ZXJuLCBzbyBjZGstbmV4dGpzIHRocmV3IGF0IHN5bnRoIGFuZCB0aGUgYXBwIGNvdWxkIG5vdCBiZVxuICAgIC8vIGRlcGxveWVkIGF0IGFsbC4gQ2xvdWRGcm9udCBtYXRjaGVzIHRoZSAqZGVjb2RlZCogcGF0aCwgYW5kIGA/YCBtYXRjaGVzIG9uZVxuICAgIC8vIGJ5dGUgb2YgaXQsIHNvIG9uZSBgP2AgcGVyIFVURi04IGJ5dGUgaXMgdGhlIG5hcnJvd2VzdCBwYXR0ZXJuIHRoYXRcbiAgICAvLyBtYXRjaGVzLiBOb3Qgb25lIHBlciBwZXJjZW50LWVuY29kZWQgY2hhcmFjdGVyOiBgaGVsbG8/Pz93b3JsZC5qcGdgXG4gICAgLy8gZGVwbG95cyBhbmQgdGhlbiBuZXZlciBtYXRjaGVzLCB3aGljaCBpcyBhIDQwNCByYXRoZXIgdGhhbiBhIHN5bnRoIGVycm9yLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogW1wiaGVsbG8gd29ybGQuanBnXCIsIFwiw6TDtsO8xaHEjcWZw60ucG5nXCIsIFwiZmF2aWNvbi5pY29cIl0sXG4gICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFxuICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgIFwiaGVsbG8/d29ybGQuanBnXCIsXG4gICAgICAgIC8vIDcgY2hhcmFjdGVycywgMiBVVEYtOCBieXRlcyBlYWNoLlxuICAgICAgICBgJHtcIj9cIi5yZXBlYXQoMTQpfS5wbmdgLFxuICAgICAgICBcImZhdmljb24uaWNvXCIsXG4gICAgICBdKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcIndpbGRjYXJkcyBhIHB1YmxpYy8gZGlyZWN0b3J5IG5hbWUgdGhlIHNhbWUgd2F5XCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJteSBpbWFnZXNcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfV0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvQ29udGFpbihcIm15P2ltYWdlcy8qXCIpO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgYSBwdWJsaWMvIG5hbWUgdG9vIGxvbmcgdG8gZXhwcmVzcyBhcyBhIHBhdGggcGF0dGVyblwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbYCR7XCLDpFwiLnJlcGVhdCgxMzApfS5wbmdgXSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PiBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCBkaXN0cmlidXRpb25Qcm9wcyksXG4gICAgKS50b1Rocm93KC9uZWVkcyBhIDI2NC1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4vKTtcbiAgfSk7XG5cbiAgaXQoXCJza2lwcyBhIHB1YmxpYy8gZW50cnkgd2hvc2UgcGF0dGVybiB3b3VsZCBiZSB3aWxkY2FyZHMgYWxvbmVcIiwgKCkgPT4ge1xuICAgIC8vIGDRhNC+0YLQvi9gIGlzIGA/Pz8/Pz8/Py8qYCwgd2hpY2ggbWF0Y2hlcyBhbnkgOC1ieXRlIGZpcnN0IHNlZ21lbnQuIFB1YmxpY1xuICAgIC8vIGJlaGF2aW9ycyBhcmUgYWRkZWQgYWhlYWQgb2YgdGhlIGNvbXB1dGUgb25lcywgc28gYC9wcm9kdWN0cy80MmAgd291bGQgZ29cbiAgICAvLyB0byBTMyBhbmQgNDAzLiBUaGUgZW50cnkgZ2V0cyBubyBiZWhhdmlvciBhbmQgYSB3YXJuaW5nIGluc3RlYWQuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtcbiAgICAgICAgeyBuYW1lOiBcItGE0L7RgtC+XCIsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICAgIHsgbmFtZTogXCLlm75cIiwgaXNEaXJlY3Rvcnk6IGZhbHNlIH0sXG4gICAgICAgIHsgbmFtZTogXCLRhNC+0YLQvi0xXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gcGF0aFBhdHRlcm5zKHN0YWNrKTtcbiAgICBleHBlY3QocGF0dGVybnMpLm5vdC50b0NvbnRhaW4oYCR7XCI/XCIucmVwZWF0KDgpfS8qYCk7XG4gICAgZXhwZWN0KHBhdHRlcm5zKS5ub3QudG9Db250YWluKFwiPz8/XCIpO1xuICAgIC8vIE9uZSBsaXRlcmFsIGNoYXJhY3RlciBrZWVwcyBhIHBhdHRlcm4gbmFycm93IGVub3VnaCB0byBrZWVwLlxuICAgIGV4cGVjdChwYXR0ZXJucykudG9Db250YWluKGAke1wiP1wiLnJlcGVhdCg4KX0tMS8qYCk7XG4gICAgQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5oYXNXYXJuaW5nKFxuICAgICAgXCIqXCIsXG4gICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdcItGE0L7RgtC+XCIsIFwi5Zu+XCInKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGNvdW50IGEgc2tpcHBlZCBwdWJsaWMvIGVudHJ5IGFnYWluc3QgdGhlIGJ1ZGdldFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDIyIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgICAgIFwi5Zu+XCIsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIC8vIDMgZml4ZWQgKyAyMiA9IDI1LCBleGFjdGx5IHRoZSBsaW1pdDsgdGhlIHNraXBwZWQgZW50cnkgYWRkcyBub3RoaW5nLlxuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBtYXhDYWNoZUJlaGF2aW9yczogMjUsXG4gICAgICAgIH0pLFxuICAgICkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoXCJjaGVja3MgdGhlIGxlbmd0aCBvZiB0aGUgZmluYWwgcGF0dGVybiwgYmFzZVBhdGggYW5kIC8qIGluY2x1ZGVkXCIsICgpID0+IHtcbiAgICAvLyA4MyB0aHJlZS1ieXRlIGNoYXJhY3RlcnMgKyBcIi5wZGZcIiBpcyBhIDI1My1jaGFyYWN0ZXIgcGF0dGVybiBvbiBpdHMgb3duLFxuICAgIC8vIHVuZGVyIHRoZSBsaW1pdDsgYC9kb2NzL2AgaW4gZnJvbnQgdGFrZXMgaXQgdG8gMjU5LCB3aGljaCBDbG91ZEZyb250XG4gICAgLy8gcmVqZWN0cyBhdCBkZXBsb3kuXG4gICAgY29uc3QgbmFtZSA9IGAke1wi5Zu+XCIucmVwZWF0KDgzKX0ucGRmYDtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtuYW1lXSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgYmFzZVBhdGg6IFwiL2RvY3NcIixcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9uZWVkcyBhIDI1OS1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4vKTtcblxuICAgIGNvbnN0IHsgc3RhY2s6IGRpclN0YWNrLCBkaXN0cmlidXRpb25Qcm9wczogZGlyUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKGRpclN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlyUHJvcHMsXG4gICAgICAgICAgLy8gMjU0IGNoYXJhY3RlcnMsIHVuZGVyIHRoZSBsaW1pdCB1bnRpbCB0aGUgYC8qYC5cbiAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXG4gICAgICAgICAgICB7IG5hbWU6IGBhYiR7XCLlm75cIi5yZXBlYXQoODQpfWAsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9uZWVkcyBhIDI1Ni1jaGFyYWN0ZXIvKTtcbiAgfSk7XG5cbiAgaXQoXCJkcm9wcyB0aGUgY2FjaGUga2V5IHdoZW4gYW4gb3ZlcnJpZGUgZGlzYWJsZXMgZHluYW1pYyBjYWNoaW5nXCIsICgpID0+IHtcbiAgICAvLyBDbG91ZEZyb250IHJlamVjdHMgYSBwb2xpY3kgdGhhdCBjYWNoZXMgbm90aGluZyBidXQga2V5cyBvbiBoZWFkZXJzLiBDREtcbiAgICAvLyB1c2VkIHRvIHJhaXNlIGBtYXhUdGw6IDBgIHRvIHRoZSBkYXktbG9uZyBkZWZhdWx0LCBzbyB0aGUgb3ZlcnJpZGVcbiAgICAvLyBkZXBsb3llZDsgd2l0aCBhIGRlZmF1bHQgb2YgMCBpdCBpcyBob25vcmVkLCBhbmQgbXVzdCBzdGF5IGRlcGxveWFibGUuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICBkeW5hbWljQ2FjaGVQb2xpY3lQcm9wczogeyBtYXhUdGw6IER1cmF0aW9uLnNlY29uZHMoMCkgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6Q2FjaGVQb2xpY3lcIixcbiAgICAgIHtcbiAgICAgICAgQ2FjaGVQb2xpY3lDb25maWc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIENvbW1lbnQ6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJEeW5hbWljXCIpLFxuICAgICAgICAgIERlZmF1bHRUVEw6IDAsXG4gICAgICAgICAgTWF4VFRMOiAwLFxuICAgICAgICAgIE1pblRUTDogMCxcbiAgICAgICAgICBQYXJhbWV0ZXJzSW5DYWNoZUtleUFuZEZvcndhcmRlZFRvT3JpZ2luOiB7XG4gICAgICAgICAgICBDb29raWVzQ29uZmlnOiB7IENvb2tpZUJlaGF2aW9yOiBcIm5vbmVcIiB9LFxuICAgICAgICAgICAgRW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IGZhbHNlLFxuICAgICAgICAgICAgRW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBmYWxzZSxcbiAgICAgICAgICAgIEhlYWRlcnNDb25maWc6IHsgSGVhZGVyQmVoYXZpb3I6IFwibm9uZVwiIH0sXG4gICAgICAgICAgICBRdWVyeVN0cmluZ3NDb25maWc6IHsgUXVlcnlTdHJpbmdCZWhhdmlvcjogXCJub25lXCIgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgY2FjaGUga2V5IHdoZW4gYSB6ZXJvIG1heFR0bCBpcyByYWlzZWQgYnkgYW5vdGhlciBUVExcIiwgKCkgPT4ge1xuICAgIC8vIENESyByYWlzZXMgYG1heFR0bGAgdG8gYGRlZmF1bHRUdGxgLCBzbyB0aGlzIHBvbGljeSBjYWNoZXMgZm9yIGFuIGhvdXIuXG4gICAgLy8gRHJvcHBpbmcgdGhlIGtleSBmb3IgaXQgd291bGQgc2VydmUgb25lIHZpZXdlcidzIHBhZ2UgdG8gZXZlcnkgdmlld2VyLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgZHluYW1pY0NhY2hlUG9saWN5UHJvcHM6IHtcbiAgICAgICAgICBtYXhUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uaG91cnMoMSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkNhY2hlUG9saWN5XCIsXG4gICAgICB7XG4gICAgICAgIENhY2hlUG9saWN5Q29uZmlnOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBDb21tZW50OiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiRHluYW1pY1wiKSxcbiAgICAgICAgICBNYXhUVEw6IDM2MDAsXG4gICAgICAgICAgUGFyYW1ldGVyc0luQ2FjaGVLZXlBbmRGb3J3YXJkZWRUb09yaWdpbjogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBDb29raWVzQ29uZmlnOiB7IENvb2tpZUJlaGF2aW9yOiBcImFsbFwiIH0sXG4gICAgICAgICAgICBRdWVyeVN0cmluZ3NDb25maWc6IHsgUXVlcnlTdHJpbmdCZWhhdmlvcjogXCJhbGxcIiB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJrZXlzIHRoZSBkeW5hbWljIGNhY2hlIG9ubHkgb24gaGVhZGVycyB0aGUgb3JpZ2luIHJlYWRzXCIsICgpID0+IHtcbiAgICAvLyBgeC1tYXRjaGVkLXBhdGhgIGlzIHN0cmlwcGVkIGJ5IHRoZSBydW50aW1lIGFuZCBgeC1uZXh0LWNhY2hlLXRhZ3NgIGlzXG4gICAgLy8gbmV2ZXIgc2VudCBieSB2aWV3ZXJzOiBrZXlpbmcgb24gZWl0aGVyIHNwZW5kcyBhIGhlYWRlciBzbG90IGFuZCBsZXRzIGFcbiAgICAvLyBjbGllbnQgZnJhZ21lbnQgdGhlIGNhY2hlIGZvciBub3RoaW5nLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIGNvbnN0IHBvbGljaWVzID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkNhY2hlUG9saWN5XCIsXG4gICAgICB7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBDYWNoZVBvbGljeUNvbmZpZzogeyBDb21tZW50OiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiRHluYW1pY1wiKSB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IFtwb2xpY3ldID0gT2JqZWN0LnZhbHVlcyhwb2xpY2llcyk7XG4gICAgY29uc3QgaGVhZGVyczogc3RyaW5nW10gPVxuICAgICAgcG9saWN5LlByb3BlcnRpZXMuQ2FjaGVQb2xpY3lDb25maWdcbiAgICAgICAgLlBhcmFtZXRlcnNJbkNhY2hlS2V5QW5kRm9yd2FyZGVkVG9PcmlnaW4uSGVhZGVyc0NvbmZpZy5IZWFkZXJzO1xuICAgIGV4cGVjdChoZWFkZXJzKS5ub3QudG9Db250YWluKFwieC1tYXRjaGVkLXBhdGhcIik7XG4gICAgZXhwZWN0KGhlYWRlcnMpLm5vdC50b0NvbnRhaW4oXCJ4LW5leHQtY2FjaGUtdGFnc1wiKTtcbiAgICBleHBlY3QoaGVhZGVycykudG9Db250YWluKFwicnNjXCIpO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgc3BsaXR0aW5nIG9uIGEgZGVwbG95bWVudCB0eXBlIHRoYXQgY2Fubm90IHJvdXRlIGl0XCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJhcGlcIl0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBuZXh0anNUeXBlOiBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTLFxuICAgICAgICAgIGxvYWRCYWxhbmNlcjogdW5kZWZpbmVkLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvb25seSBzdXBwb3J0ZWQgYnkgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLyk7XG4gIH0pO1xufSk7XG5cbi8qKlxuICogVGhlIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uLCBydW4gYXMgQ2xvdWRGcm9udCB3b3VsZCBydW4gaXQuXG4gKlxuICogSXQgaXMgYXV0aG9yZWQgYXMgYSBzdHJpbmcgaW5zaWRlIGEgVHlwZVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLCBzbyBldmVyeVxuICogYmFja3NsYXNoIGluIGl0IGlzIGVzY2FwZWQgdHdpY2UgLSBhbmQgYSByZWdleCB0aGF0IGNvbGxhcHNlcyBzbGFzaGVzIGlzIG5vdGhpbmdcbiAqIGJ1dCBiYWNrc2xhc2hlcy4gQXNzZXJ0aW5nIG9uIGJlaGF2aW9yIHJhdGhlciB0aGFuIG9uIHRoZSB0ZXh0IGlzIHdoYXQgY2F0Y2hlcyBhblxuICogZXNjYXBpbmcgbWlzdGFrZSwgd2hpY2ggYSBzbmFwc2hvdCB3b3VsZCBoYXBwaWx5IHJlY29yZC5cbiAqL1xuZGVzY3JpYmUoXCJ0aGUgdmlld2VyLXJlcXVlc3QgQ2xvdWRGcm9udCBGdW5jdGlvblwiLCAoKSA9PiB7XG4gIGludGVyZmFjZSBRdWVyeVZhbHVlIHtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIG11bHRpVmFsdWU/OiBBcnJheTx7IHZhbHVlOiBzdHJpbmcgfT47XG4gIH1cbiAgaW50ZXJmYWNlIEZ1bmN0aW9uUmVxdWVzdCB7XG4gICAgdXJpOiBzdHJpbmc7XG4gICAgcXVlcnlzdHJpbmc6IFJlY29yZDxzdHJpbmcsIFF1ZXJ5VmFsdWU+O1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PjtcbiAgfVxuICB0eXBlIEZ1bmN0aW9uUmVzdWx0ID1cbiAgICB8IEZ1bmN0aW9uUmVxdWVzdFxuICAgIHwgeyBzdGF0dXNDb2RlOiBudW1iZXI7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PiB9O1xuXG4gIGNvbnN0IGhhbmRsZXIgPSAoKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgXCJGblN0YWNrXCIpO1xuICAgIGNvbnN0IGZuID0gbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkZuXCIsIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9ICgpID0+IHt9O1wiKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBhc3NldHNCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssIFwiQXNzZXRzXCIpLFxuICAgICAgZnVuY3Rpb25Vcmw6IG5ldyBGdW5jdGlvblVybChzdGFjaywgXCJVcmxcIiwge1xuICAgICAgICBmdW5jdGlvbjogZm4sXG4gICAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICB9KSxcbiAgICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUyxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IGZ1bmN0aW9ucyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiLFxuICAgICk7XG4gICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoZnVuY3Rpb25zKVswXS5Qcm9wZXJ0aWVzLkZ1bmN0aW9uQ29kZSBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIHJ1bkluTmV3Q29udGV4dChgJHtjb2RlfVxcbmhhbmRsZXJgKSBhcyAoZXZlbnQ6IHtcbiAgICAgIHJlcXVlc3Q6IEZ1bmN0aW9uUmVxdWVzdDtcbiAgICB9KSA9PiBGdW5jdGlvblJlc3VsdDtcbiAgfSkoKTtcblxuICBjb25zdCBzZW5kID0gKFxuICAgIHVyaTogc3RyaW5nLFxuICAgIHF1ZXJ5c3RyaW5nOiBSZWNvcmQ8c3RyaW5nLCBRdWVyeVZhbHVlPiA9IHt9LFxuICApOiBGdW5jdGlvblJlc3VsdCA9PlxuICAgIGhhbmRsZXIoe1xuICAgICAgcmVxdWVzdDogeyB1cmksIHF1ZXJ5c3RyaW5nLCBoZWFkZXJzOiB7IGhvc3Q6IHsgdmFsdWU6IFwiYS50ZXN0XCIgfSB9IH0sXG4gICAgfSk7XG5cbiAgY29uc3QgcmVkaXJlY3QgPSAocmVzdWx0OiBGdW5jdGlvblJlc3VsdCkgPT4gKHtcbiAgICBzdGF0dXNDb2RlOiAocmVzdWx0IGFzIHsgc3RhdHVzQ29kZTogbnVtYmVyIH0pLnN0YXR1c0NvZGUsXG4gICAgbG9jYXRpb246IHJlc3VsdC5oZWFkZXJzLmxvY2F0aW9uPy52YWx1ZSxcbiAgfSk7XG5cbiAgaXQuZWFjaChbXG4gICAgW1wiLy9cIiwgXCIvXCJdLFxuICAgIFtcIi8vL1wiLCBcIi9cIl0sXG4gICAgW1wiL2Zvby8vYmFyXCIsIFwiL2Zvby9iYXJcIl0sXG4gICAgW1wiL2Jhc2VwYXRoLy90by1zdlwiLCBcIi9iYXNlcGF0aC90by1zdlwiXSxcbiAgICBbXCIvYVxcXFxiXCIsIFwiL2EvYlwiXSxcbiAgXSkoXCJyZWRpcmVjdHMgJXMgdG8gJXMgd2l0aCBhIDMwOFwiLCAodXJpLCBsb2NhdGlvbikgPT4ge1xuICAgIGV4cGVjdChyZWRpcmVjdChzZW5kKHVyaSkpKS50b0VxdWFsKHsgc3RhdHVzQ29kZTogMzA4LCBsb2NhdGlvbiB9KTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgcXVlcnkgb24gdGhlIHJlZGlyZWN0LCBpbmNsdWRpbmcgcmVwZWF0ZWQga2V5c1wiLCAoKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCdzIHNoYXBlIGZvciBhIHJlcGVhdGVkIGtleTogYG11bHRpVmFsdWVgIGhvbGRzIGV2ZXJ5IHZhbHVlLFxuICAgIC8vIHRoZSBmaXJzdCBpbmNsdWRlZCwgYW5kIGB2YWx1ZWAgcmVwZWF0cyB0aGF0IGZpcnN0IG9uZS5cbiAgICBjb25zdCByZXN1bHQgPSBzZW5kKFwiL3gvL3lcIiwge1xuICAgICAganNvbjogeyB2YWx1ZTogXCJ0cnVlXCIgfSxcbiAgICAgIGE6IHsgdmFsdWU6IFwiMVwiLCBtdWx0aVZhbHVlOiBbeyB2YWx1ZTogXCIxXCIgfSwgeyB2YWx1ZTogXCIyXCIgfV0gfSxcbiAgICAgIGZsYWc6IHsgdmFsdWU6IFwiXCIgfSxcbiAgICB9KTtcbiAgICBleHBlY3QocmVkaXJlY3QocmVzdWx0KS5sb2NhdGlvbikudG9CZShcIi94L3k/anNvbj10cnVlJmE9MSZhPTImZmxhZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJwYXNzZXMgcGVyY2VudC1lbmNvZGVkIHF1ZXJ5IHZhbHVlcyB0aHJvdWdoIHdpdGhvdXQgcmUtZW5jb2RpbmdcIiwgKCkgPT4ge1xuICAgIC8vIENsb3VkRnJvbnQgaGFuZHMgdGhlIGZ1bmN0aW9uIHRoZSB2YWx1ZXMgc3RpbGwgZW5jb2RlZCwgYXMgc2VudC5cbiAgICBjb25zdCByZXN1bHQgPSBzZW5kKFwiL3gvL3lcIiwge1xuICAgICAgYTogeyB2YWx1ZTogXCIlMjBiJTI2Y1wiIH0sXG4gICAgICBwOiB7IHZhbHVlOiBcIjErMlwiIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHJlZGlyZWN0KHJlc3VsdCkubG9jYXRpb24pLnRvQmUoXCIveC95P2E9JTIwYiUyNmMmcD0xKzJcIik7XG4gIH0pO1xuXG4gIGl0KFwicGFzc2VzIGFuIG9yZGluYXJ5IHBhdGggdGhyb3VnaCB3aXRoIHgtZm9yd2FyZGVkLWhvc3Qgc2V0XCIsICgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBzZW5kKFwiL2EvYlwiKSBhcyBGdW5jdGlvblJlcXVlc3Q7XG4gICAgZXhwZWN0KHJlc3VsdC51cmkpLnRvQmUoXCIvYS9iXCIpO1xuICAgIC8vIENsb3VkRnJvbnQgcmV3cml0ZXMgYGhvc3RgIHRvIHRoZSBvcmlnaW4gZG9tYWluLCBzbyB0aGUgYXBwIHdvdWxkIG90aGVyd2lzZVxuICAgIC8vIGJ1aWxkIGV2ZXJ5IGFic29sdXRlIFVSTCBhZ2FpbnN0IHRoZSBGdW5jdGlvbiBVUkwncyBob3N0bmFtZS5cbiAgICBleHBlY3QocmVzdWx0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdLnZhbHVlKS50b0JlKFwiYS50ZXN0XCIpO1xuICB9KTtcblxuICBpdChcIm92ZXJ3cml0ZXMgYSBjbGllbnQtc3VwcGxpZWQgeC1mb3J3YXJkZWQtaG9zdFwiLCAoKSA9PiB7XG4gICAgLy8gVGhlIHJ1bnRpbWUgdHJ1c3RzIHRoaXMgaGVhZGVyIGJlaGluZCB0aGUgRnVuY3Rpb24gVVJMLCBzbyBhIHZpZXdlcidzXG4gICAgLy8gb3duIHZhbHVlIG11c3Qgbm90IHN1cnZpdmUgdG8gYnVpbGQgcmVkaXJlY3RzIG9yIG9yaWdpbiBjaGVja3MuXG4gICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlcih7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIHVyaTogXCIvYVwiLFxuICAgICAgICBxdWVyeXN0cmluZzoge30sXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBob3N0OiB7IHZhbHVlOiBcImEudGVzdFwiIH0sXG4gICAgICAgICAgXCJ4LWZvcndhcmRlZC1ob3N0XCI6IHsgdmFsdWU6IFwiZXZpbC50ZXN0XCIgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkgYXMgRnVuY3Rpb25SZXF1ZXN0O1xuICAgIGV4cGVjdChyZXN1bHQuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl0udmFsdWUpLnRvQmUoXCJhLnRlc3RcIik7XG4gIH0pO1xufSk7XG4iXX0=
1046
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1kaXN0cmlidXRpb24udGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUEwQztBQUMxQyw2Q0FBeUQ7QUFDekQsdURBQXNFO0FBQ3RFLCtEQUtvQztBQUNwQywrRUFBZ0U7QUFDaEUsaURBQTBDO0FBQzFDLHVGQUFpRjtBQUNqRix1REFNZ0M7QUFDaEMsK0NBQTRDO0FBQzVDLCtEQUE0RDtBQUM1RCwyQ0FBeUM7QUFDekMsK0RBSStCO0FBRS9COzs7OztHQUtHO0FBQ0gsUUFBUSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtJQUMzRCxNQUFNLEtBQUssR0FBRyxDQUNaLFVBQW9CLEVBQ3BCLFFBS0ksRUFBRSxFQUNOLEVBQUU7UUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxjQUFjLEdBQXNDLFVBQVUsQ0FBQyxHQUFHLENBQ3RFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDUCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUU7Z0JBQ2hELElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQztnQkFDcEQsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxJQUFJO2dCQUNKLFdBQVcsRUFBRSxJQUFJLHdCQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUU7b0JBQ2hELFFBQVEsRUFBRSxFQUFFO29CQUNaLFFBQVEsRUFBRSxnQ0FBbUIsQ0FBQyxPQUFPO2lCQUN0QyxDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUMsQ0FD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VUFBVSxDQUMzQixtREFBbUQsQ0FDcEQ7NkJBQ0YsQ0FBQzt5QkFDSDtxQkFDRjtpQkFDRjthQUNGLENBQUM7U0FDSCxDQUFDLENBQ0gsQ0FBQyxPQUFPLENBQUMsd0RBQXdELENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDTixDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxzQ0FBc0MsQ0FBQztRQUMxRSxHQUFHO1lBQ0QsNEJBQTRCO1lBQzVCLDZCQUE2QjtZQUM3QiwyQ0FBMkM7WUFDM0MseUJBQXlCO1lBQ3pCLHlDQUF5QztZQUN6QywwREFBMEQ7WUFDMUQsbURBQW1EO1lBQ25ELG1EQUFtRDtTQUNwRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBNEIsRUFBRSxDQUFDO1lBQy9DLGdCQUFnQixXQUFXLElBQUk7WUFDL0IsR0FBRyxXQUFXLG9DQUFvQztZQUNsRCx5QkFBeUI7U0FDMUIsQ0FBQztRQUNGO1lBQ0UsNkNBQTZDO1lBQzdDLGlEQUFpRDtZQUNqRCxzQ0FBc0M7U0FDdkM7UUFDRDtZQUNFLDJDQUEyQztZQUMzQywwREFBMEQ7WUFDMUQsc0NBQXNDO1NBQ3ZDO1FBQ0Q7WUFDRSx5Q0FBeUM7WUFDekMsdUNBQXVDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLO1lBQ2pFLGtDQUFrQztTQUNuQztLQUNGLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDaEQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJ1bkluTmV3Q29udGV4dCB9IGZyb20gXCJub2RlOnZtXCI7XG5pbXBvcnQgeyBBcHAsIER1cmF0aW9uLCBMYXp5LCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMsIE1hdGNoLCBUZW1wbGF0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hc3NlcnRpb25zXCI7XG5pbXBvcnQge1xuICBGdW5jdGlvbiBhcyBDbG91ZEZyb250RnVuY3Rpb24sXG4gIEZ1bmN0aW9uQ29kZSxcbiAgRnVuY3Rpb25FdmVudFR5cGUsXG4gIEtleVZhbHVlU3RvcmUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHsgSHR0cE9yaWdpbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQgeyBWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7XG4gIENvZGUsXG4gIEZ1bmN0aW9uIGFzIExhbWJkYUZ1bmN0aW9uLFxuICBGdW5jdGlvblVybCxcbiAgRnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgUnVudGltZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IHBhdGhQYXR0ZXJuc0ZvciB9IGZyb20gXCIuL2FkYXB0ZXIvZnVuY3Rpb24tZ3JvdXBzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBOZXh0anNEaXN0cmlidXRpb24sXG4gIE5leHRqc0Rpc3RyaWJ1dGlvbkZ1bmN0aW9uR3JvdXAsXG4gIE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcyxcbn0gZnJvbSBcIi4vbmV4dGpzLWRpc3RyaWJ1dGlvblwiO1xuXG4vKipcbiAqIGBmdW5jdGlvbkdyb3Vwc2Agcm91dGluZyBhdCB0aGUgZWRnZS4gYE5leHRqc0J1aWxkYCBpcyBkZWxpYmVyYXRlbHkgbm90XG4gKiBpbnZvbHZlZDogd2hpY2ggYmVoYXZpb3JzIGEgZ3JvdXAgZ2V0cywgYW5kIGluIHdoYXQgb3JkZXIsIGlzIHRoZSBhZGFwdGVyJ3NcbiAqIGRlY2lzaW9uIChgZnVuY3Rpb24tZ3JvdXBzLnRlc3QudHNgKSwgc28gdGhlc2UgcGFzcyB0aGUgYmVoYXZpb3JzIGluIGRpcmVjdGx5XG4gKiBhbmQgYXNzZXJ0IG9uIHdoYXQgdGhlIGRpc3RyaWJ1dGlvbiBkb2VzIHdpdGggdGhlbS5cbiAqL1xuZGVzY3JpYmUoXCJOZXh0anNEaXN0cmlidXRpb24gZnVuY3Rpb24gZ3JvdXAgYmVoYXZpb3JzXCIsICgpID0+IHtcbiAgY29uc3Qgc2V0dXAgPSAoXG4gICAgZ3JvdXBOYW1lczogc3RyaW5nW10sXG4gICAgcHJvcHM6IHtcbiAgICAgIHJvdXRlc0Zvcj86IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZ1tdO1xuICAgICAgcHVibGljRGlyRW50cmllcz86IHN0cmluZ1tdO1xuICAgICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgICB0cmFpbGluZ1NsYXNoPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgXCJUZXN0U3RhY2tcIik7XG4gICAgY29uc3QgZnVuY3Rpb25Hcm91cHM6IE5leHRqc0Rpc3RyaWJ1dGlvbkZ1bmN0aW9uR3JvdXBbXSA9IGdyb3VwTmFtZXMubWFwKFxuICAgICAgKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgZm4gPSBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIGBGbiR7bmFtZX1gLCB7XG4gICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gKCkgPT4ge307XCIpLFxuICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZnVuY3Rpb25Vcmw6IG5ldyBGdW5jdGlvblVybChzdGFjaywgYFVybCR7bmFtZX1gLCB7XG4gICAgICAgICAgICBmdW5jdGlvbjogZm4sXG4gICAgICAgICAgICBhdXRoVHlwZTogRnVuY3Rpb25VcmxBdXRoVHlwZS5BV1NfSUFNLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApO1xuICAgIC8vIEluIHRoZSBvcmRlciBnaXZlbjogdGhlIGJ1aWxkJ3MgbGlzdCBpcyBhbHJlYWR5IG1vc3Qgc3BlY2lmaWMgZmlyc3QuXG4gICAgY29uc3QgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyA9IGdyb3VwTmFtZXMuZmxhdE1hcCgoZ3JvdXApID0+XG4gICAgICAocHJvcHMucm91dGVzRm9yPy4oZ3JvdXApID8/IFtgLyR7Z3JvdXB9LyoqYF0pLmZsYXRNYXAoKHJvdXRlKSA9PlxuICAgICAgICBwYXRoUGF0dGVybnNGb3Iocm91dGUsIHtcbiAgICAgICAgICBoYXNEYXRhUm91dGVzOiBmYWxzZSxcbiAgICAgICAgICB0cmFpbGluZ1NsYXNoOiBwcm9wcy50cmFpbGluZ1NsYXNoLFxuICAgICAgICB9KS5tYXAoKHBhdHRlcm4pID0+ICh7IGdyb3VwLCByb3V0ZSwgcGF0dGVybiB9KSksXG4gICAgICApLFxuICAgICk7XG4gICAgY29uc3QgZGVmYXVsdEZuID0gbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkZuRGVmYXVsdFwiLCB7XG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSAoKSA9PiB7fTtcIiksXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YWNrLFxuICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgZGlzdHJpYnV0aW9uUHJvcHM6IHtcbiAgICAgICAgYXNzZXRzQnVja2V0OiBuZXcgQnVja2V0KHN0YWNrLCBcIkFzc2V0c1wiKSxcbiAgICAgICAgYmFzZVBhdGg6IHByb3BzLmJhc2VQYXRoLFxuICAgICAgICBmdW5jdGlvblVybDogbmV3IEZ1bmN0aW9uVXJsKHN0YWNrLCBcIlVybERlZmF1bHRcIiwge1xuICAgICAgICAgIGZ1bmN0aW9uOiBkZWZhdWx0Rm4sXG4gICAgICAgICAgYXV0aFR5cGU6IEZ1bmN0aW9uVXJsQXV0aFR5cGUuQVdTX0lBTSxcbiAgICAgICAgfSksXG4gICAgICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUyxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogKHByb3BzLnB1YmxpY0RpckVudHJpZXMgPz8gW10pLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGlzRGlyZWN0b3J5OiBmYWxzZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IHBhdGhQYXR0ZXJucyA9IChzdGFjazogU3RhY2spID0+IHtcbiAgICBjb25zdCBkaXN0cmlidXRpb25zID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblwiLFxuICAgICk7XG4gICAgY29uc3QgY29uZmlnID1cbiAgICAgIE9iamVjdC52YWx1ZXMoZGlzdHJpYnV0aW9ucylbMF0uUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWc7XG4gICAgcmV0dXJuIChjb25maWcuQ2FjaGVCZWhhdmlvcnMgYXMgQXJyYXk8eyBQYXRoUGF0dGVybjogc3RyaW5nIH0+KS5tYXAoXG4gICAgICAoYmVoYXZpb3IpID0+IGJlaGF2aW9yLlBhdGhQYXR0ZXJuLFxuICAgICk7XG4gIH07XG5cbiAgaXQoXCJhZGRzIG5vdGhpbmcgZXh0cmEgd2hlbiB0aGVyZSBhcmUgbm8gZ3JvdXBzXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIGRpc3RyaWJ1dGlvblByb3BzKTtcbiAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9FcXVhbChbXCJfbmV4dC9zdGF0aWMqXCIsIFwiX25leHQvaW1hZ2UqXCJdKTtcbiAgfSk7XG5cbiAgaXQoXCJsZXRzIHRoZSBPQUMgcHJpbmNpcGFsIGxpc3QgdGhlIGJ1Y2tldCBzbyBhIG1pc3NpbmcgYXNzZXQgaXMgYSA0MDRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFwiQVdTOjpTMzo6QnVja2V0UG9saWN5XCIsIHtcbiAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgIFN0YXRlbWVudDogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgIEFjdGlvbjogW1wiczM6R2V0T2JqZWN0XCIsIFwiczM6TGlzdEJ1Y2tldFwiXSxcbiAgICAgICAgICAgIFByaW5jaXBhbDogeyBTZXJ2aWNlOiBcImNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbVwiIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIGdyb3VwIGJlaGF2aW9ycyBpbiB0aGUgYnVpbGQncyBvcmRlciwgYWZ0ZXIgdGhlIGltYWdlIGJlaGF2aW9yXCIsICgpID0+IHtcbiAgICAvLyBDbG91ZEZyb250IHN0b3BzIGF0IHRoZSBmaXJzdCBtYXRjaGluZyBiZWhhdmlvciwgc28gYGFwaS8qYCBhaGVhZCBvZlxuICAgIC8vIGBhcGkvcmVwb3J0cy8qYCB3b3VsZCBzZW5kIGV2ZXJ5IHJlcG9ydCByZXF1ZXN0IHRvIHRoZSB3cm9uZyBmdW5jdGlvbi5cbiAgICAvLyBUaGUgYnVpbGQgc29ydGVkIHRoZW0gd2hlbiBpdCBjaGVja2VkIHRoZW07IHJlLXNvcnRpbmcgaGVyZSBjb3VsZCBvbmx5XG4gICAgLy8gZGlzYWdyZWUgd2l0aCB0aGF0LlxuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcInJlcG9ydHNcIiwgXCJhcGlcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAobmFtZSkgPT5cbiAgICAgICAgICBuYW1lID09PSBcImFwaVwiID8gW1wiL2FwaS8qKlwiXSA6IFtcIi9hcGkvcmVwb3J0cy8qKlwiXSxcbiAgICAgIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgIH0pO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFtcbiAgICAgIFwiX25leHQvc3RhdGljKlwiLFxuICAgICAgXCJfbmV4dC9pbWFnZSpcIixcbiAgICAgIFwiYXBpL3JlcG9ydHMvKlwiLFxuICAgICAgXCJhcGkvKlwiLFxuICAgIF0pO1xuICB9KTtcblxuICBpdChcImtlZXBzIHRoZSB0d28gc2xhc2ggdmFyaWFudHMgZGlzdGluY3QgdW5kZXIgYSBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgLy8gYGdldFBhdGhQYXR0ZXJuYCB1c2VkIHRvIGpvaW4gdGhyb3VnaCBhIGhlbHBlciB0aGF0IHN0cmlwcyB0cmFpbGluZ1xuICAgIC8vIHNsYXNoZXMsIHNvIGBwcmljaW5nYCBhbmQgYHByaWNpbmcvYCBib3RoIGJlY2FtZSBgL2Jhc2UvcHJpY2luZ2A6IHR3b1xuICAgIC8vIGJlaGF2aW9ycyB3aXRoIHRoZSBzYW1lIHBhdGggcGF0dGVybiwgd2hpY2ggQ2xvdWRGcm9udCByZWplY3RzIGF0IGRlcGxveVxuICAgIC8vIHdpdGggbm8gaGludCB0aGF0IGB0cmFpbGluZ1NsYXNoYCBpcyB3aGF0IHByb2R1Y2VkIHRoZSBkdXBsaWNhdGUuXG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wibWt0XCJdLCB7XG4gICAgICAgIHJvdXRlc0ZvcjogKCkgPT4gW1wiL3ByaWNpbmdcIl0sXG4gICAgICAgIGJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICAgIHRyYWlsaW5nU2xhc2g6IHRydWUsXG4gICAgICB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICB9KTtcbiAgICBjb25zdCBwYXR0ZXJucyA9IHBhdGhQYXR0ZXJucyhzdGFjayk7XG4gICAgZXhwZWN0KHBhdHRlcm5zKS50b0NvbnRhaW4oXCIvYmFzZS9wcmljaW5nXCIpO1xuICAgIGV4cGVjdChwYXR0ZXJucykudG9Db250YWluKFwiL2Jhc2UvcHJpY2luZy9cIik7XG4gIH0pO1xuXG4gIGl0KFwiY291bnRzIHRoZSBiYXNlUGF0aCBiZWhhdmlvcnMgYWdhaW5zdCB0aGUgYnVkZ2V0XCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIGJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyMSB9LCAoXywgaSkgPT4gYGZpbGUke2l9LnR4dGApLFxuICAgIH0pO1xuICAgIC8vIDMgZml4ZWQgKyB0aGUgMiBhIGJhc2VQYXRoIGFkZHMgdG8gc3RhbmQgaW4gZm9yIHRoZSBkZWZhdWx0IGJlaGF2aW9yICsgMjFcbiAgICAvLyBwdWJsaWMgPSAyNi4gQ291bnRpbmcgb25seSB0aGUgMyByZXBvcnRlZCAyNCBhbmQgbGV0IHRoZSBzeW50aCB0aHJvdWdoLCBzb1xuICAgIC8vIHRoZSBsaW1pdCBhcnJpdmVkIGFzIGEgQ2xvdWRGcm9udCBkZXBsb3kgZmFpbHVyZS5cbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgbWF4Q2FjaGVCZWhhdmlvcnM6IDI1LFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coLzI2IENsb3VkRnJvbnQgY2FjaGUgYmVoYXZpb3JzLio1IHVzZWQgYnkgY2RrLW5leHRqcyBpdHNlbGYvcyk7XG4gIH0pO1xuXG4gIGl0KFwiZGVmYXVsdHMgdGhlIGJ1ZGdldCB0byBDbG91ZEZyb250J3MgcXVvdGEgb2YgNzVcIiwgKCkgPT4ge1xuICAgIC8vIFRoZSBoYXJkLWNvZGVkIDI1IHByZWRhdGVkIHRoZSBxdW90YSdzIGluY3JlYXNlIHRvIDc1LlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogNzIgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PiBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCBkaXN0cmlidXRpb25Qcm9wcyksXG4gICAgKS5ub3QudG9UaHJvdygpO1xuICAgIGNvbnN0IHsgc3RhY2s6IG92ZXIsIGRpc3RyaWJ1dGlvblByb3BzOiBvdmVyUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA3MyB9LCAoXywgaSkgPT4gYGZpbGUke2l9LnR4dGApLFxuICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+IG5ldyBOZXh0anNEaXN0cmlidXRpb24ob3ZlciwgXCJEaXN0cmlidXRpb25cIiwgb3ZlclByb3BzKSxcbiAgICApLnRvVGhyb3coXG4gICAgICAvNzYgQ2xvdWRGcm9udCBjYWNoZSBiZWhhdmlvcnMsIG92ZXIgdGhlIGxpbWl0IG9mIDc1LipzZXQgYG1heENhY2hlQmVoYXZpb3JzYC9zLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiaG9ub3JzIGEgcmFpc2VkIG1heENhY2hlQmVoYXZpb3JzXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDk3IH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIG1heENhY2hlQmVoYXZpb3JzOiAxMDAsXG4gICAgICAgIH0pLFxuICAgICkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2VzIG5vdCBjb3VudCBiYXNlUGF0aCBiZWhhdmlvcnMgZm9yIGEgYmFzZVBhdGggb2YgL1wiLCAoKSA9PiB7XG4gICAgLy8gYGJhc2VQYXRoOiBcIi9cImAgbm9ybWFsaXplcyB0byBubyBiYXNlUGF0aCBhbmQgYWRkcyBubyBiZWhhdmlvcnMsIHNvXG4gICAgLy8gY291bnRpbmcgMiBmb3IgaXQgY291bGQgcmVqZWN0IGFuIGFwcCB0aGF0IGlzIHVuZGVyIHRoZSBsaW1pdC5cbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIGJhc2VQYXRoOiBcIi9cIixcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDIyIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIG1heENhY2hlQmVoYXZpb3JzOiAyNSxcbiAgICAgICAgfSksXG4gICAgKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgYSBiZWhhdmlvciBmb3IgYSBncm91cCBpdCB3YXMgbm90IGdpdmVuXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW1wiYXBpXCJdKTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KFxuICAgICAgL3JvdXRlcyB0byBmdW5jdGlvbiBncm91cCBcImFwaVwiLCB3aGljaCBpcyBub3QgaW4gYGZ1bmN0aW9uR3JvdXBzYC8sXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJwb2ludHMgZWFjaCBncm91cCdzIGJlaGF2aW9ycyBhdCB0aGF0IGdyb3VwJ3Mgb3duIG9yaWdpblwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wiYXBpXCJdLCB7XG4gICAgICAgIHJvdXRlc0ZvcjogKCkgPT4gW1wiL2FwaS8qKlwiLCBcIi9oZWFsdGhcIl0sXG4gICAgICB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICB9KTtcbiAgICBjb25zdCBkaXN0cmlidXRpb25zID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblwiLFxuICAgICk7XG4gICAgY29uc3QgY29uZmlnID1cbiAgICAgIE9iamVjdC52YWx1ZXMoZGlzdHJpYnV0aW9ucylbMF0uUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWc7XG4gICAgY29uc3QgYmVoYXZpb3JzID0gY29uZmlnLkNhY2hlQmVoYXZpb3JzIGFzIEFycmF5PHtcbiAgICAgIFBhdGhQYXR0ZXJuOiBzdHJpbmc7XG4gICAgICBUYXJnZXRPcmlnaW5JZDogc3RyaW5nO1xuICAgIH0+O1xuICAgIGNvbnN0IGdyb3VwT3JpZ2lucyA9IG5ldyBTZXQoXG4gICAgICBiZWhhdmlvcnNcbiAgICAgICAgLmZpbHRlcigoYmVoYXZpb3IpID0+XG4gICAgICAgICAgW1wiYXBpLypcIiwgXCJoZWFsdGhcIl0uaW5jbHVkZXMoYmVoYXZpb3IuUGF0aFBhdHRlcm4pLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGJlaGF2aW9yKSA9PiBiZWhhdmlvci5UYXJnZXRPcmlnaW5JZCksXG4gICAgKTtcbiAgICAvLyBPbmUgb3JpZ2luLCBzaGFyZWQgYnkgYm90aCBvZiB0aGUgZ3JvdXAncyBwYXR0ZXJucywgYW5kIG5vdCB0aGUgZGVmYXVsdCdzLlxuICAgIGV4cGVjdChncm91cE9yaWdpbnMuc2l6ZSkudG9CZSgxKTtcbiAgICBleHBlY3QoZ3JvdXBPcmlnaW5zKS5ub3QudG9Db250YWluKFxuICAgICAgY29uZmlnLkRlZmF1bHRDYWNoZUJlaGF2aW9yLlRhcmdldE9yaWdpbklkLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicHJlZml4ZXMgZ3JvdXAgcGF0dGVybnMgd2l0aCBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wiYXBpXCJdLCB7XG4gICAgICAgIHJvdXRlc0ZvcjogKCkgPT4gW1wiL2FwaS8qKlwiXSxcbiAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgIH0pO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0NvbnRhaW4oXCIvYmFzZS9hcGkvKlwiKTtcbiAgfSk7XG5cbiAgaXQoXCJuYW1lcyBldmVyeSBjbGFpbSBvbiB0aGUgYmVoYXZpb3IgYnVkZ2V0IHdoZW4gaXQgaXMgZXhjZWVkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcImFwaVwiXSwge1xuICAgICAgICByb3V0ZXNGb3I6ICgpID0+IFtcIi9hcGkvKipcIl0sXG4gICAgICAgIHB1YmxpY0RpckVudHJpZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDIyIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICAgICAgICBtYXhDYWNoZUJlaGF2aW9yczogMjUsXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdyhcbiAgICAgIC8yNiBDbG91ZEZyb250IGNhY2hlIGJlaGF2aW9ycy4qMSBmb3IgYGZ1bmN0aW9uR3JvdXBzYCBwYXR0ZXJucy9zLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicmVqZWN0cyBhIGdyb3VwIHBhdHRlcm4gdGhhdCBkdXBsaWNhdGVzIGEgcHVibGljLyBkaXJlY3Rvcnknc1wiLCAoKSA9PiB7XG4gICAgLy8gYHB1YmxpYy9kb2NzL2AgYW5kIGAvZG9jcy8qKmAgYm90aCBkZXBsb3kgYXMgYGRvY3MvKmA6IHRoZSBzeW50aFxuICAgIC8vIHN1Y2NlZWRlZCBhbmQgQ2xvdWRGcm9udCByZWplY3RlZCB0aGUgZGVwbG95LlxuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcImRvY3NcIl0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFt7IG5hbWU6IFwiZG9jc1wiLCBpc0RpcmVjdG9yeTogdHJ1ZSB9XSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KFxuICAgICAgL3BhdHRlcm4gXCJcXC9kb2NzXFwvXFwqXFwqXCIgXFwoZ3JvdXAgXCJkb2NzXCJcXCkgZGVwbG95cyBhcyB0aGUgcGF0aCBwYXR0ZXJuIFwiZG9jc1xcL1xcKlwiLCB3aGljaCBhIHRvcC1sZXZlbCBwdWJsaWNcXC8gZW50cnkgYWxyZWFkeSB1c2VzLyxcbiAgICApO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgYSBncm91cCBwYXR0ZXJuIGEgcHVibGljLyBkaXJlY3RvcnkncyBiZWhhdmlvciB3b3VsZCBzaGFkb3dcIiwgKCkgPT4ge1xuICAgIC8vIGBkb2NzLypgIGlzIGFkZGVkIGZpcnN0LCBzbyBgZG9jcy9ndWlkZS8qYCBuZXZlciBtYXRjaGVzLlxuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcImd1aWRlXCJdLCB7XG4gICAgICAgIHJvdXRlc0ZvcjogKCkgPT4gW1wiL2RvY3MvZ3VpZGUvKipcIl0sXG4gICAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbeyBuYW1lOiBcImRvY3NcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfV0sXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvcHVibGljXFwvIGVudHJ5IGJlaGluZCBcImRvY3NcXC9cXCpcIiBpcyBtYXRjaGVkIGZpcnN0Lyk7XG4gIH0pO1xuXG4gIGl0KFwicmVqZWN0cyBhbiBleGFjdCBncm91cCBwYXR0ZXJuIGVxdWFsIHRvIGEgcHVibGljLyBmaWxlJ3MsIGJhc2VQYXRoIGluY2x1ZGVkXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJta3RcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvcm9ib3RzLnR4dFwiXSxcbiAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFt7IG5hbWU6IFwicm9ib3RzLnR4dFwiLCBpc0RpcmVjdG9yeTogZmFsc2UgfV0sXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvZGVwbG95cyBhcyB0aGUgcGF0aCBwYXR0ZXJuIFwiXFwvYmFzZVxcL3JvYm90c1xcLnR4dFwiLyk7XG4gIH0pO1xuXG4gIGl0KFwiYWxsb3dzIGEgZ3JvdXAgcGF0dGVybiBiZXNpZGUgYSBwdWJsaWMvIGVudHJ5IGl0IGRvZXMgbm90IG92ZXJsYXBcIiwgKCkgPT4ge1xuICAgIC8vIGAvZG9jc2AgZXhhY3QgaXMgbm90IHVuZGVyIGBkb2NzLypgLCBhbmQgYGRvY3MvKmAgZG9lcyBub3QgbWF0Y2ggYC9kb2NzYC5cbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJkb2NzXCJdLCB7XG4gICAgICAgIHJvdXRlc0ZvcjogKCkgPT4gW1wiL2RvY3NcIl0sXG4gICAgICB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFt7IG5hbWU6IFwiZG9jc1wiLCBpc0RpcmVjdG9yeTogdHJ1ZSB9XSxcbiAgICB9KTtcbiAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9FcXVhbChcbiAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1wiZG9jcy8qXCIsIFwiZG9jc1wiXSksXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzZXJ2ZXMgYnVuZGxlcyB1bmRlciBhIHBhdGgtc3R5bGUgYXNzZXRQcmVmaXgsIHJld3JpdGluZyB0aGUgcHJlZml4IGF3YXlcIiwgKCkgPT4ge1xuICAgIC8vIE5leHQuanMgZW1pdHMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLy4uLmAgZm9yIGV2ZXJ5IGJ1bmRsZSB3aGlsZSB0aGVcbiAgICAvLyBvYmplY3RzIGtlZXAgdGhlaXIgdW5wcmVmaXhlZCBTMyBrZXlzLCBzbyB3aXRob3V0IGEgYmVoYXZpb3Igb2YgaXRzIG93biB0aGVcbiAgICAvLyByZXF1ZXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGNvbXB1dGUgb3JpZ2luIGFuZCA0MDRzIOKAlCB0aGUgZGVwbG95bWVudFxuICAgIC8vIHBhY2thZ2UgY2FycmllcyBubyBgLm5leHQvc3RhdGljYC4gTWVhc3VyZWQgYWdhaW5zdFxuICAgIC8vIGB0ZXN0L2UyZS9hcHAtZGlyL2Fzc2V0LXByZWZpeGAsIHdoZXJlIDIgb2YgNyBjYXNlcyBmYWlsZWQgb24gZXhhY3RseSB0aGF0LlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBhc3NldFByZWZpeDogXCIvY3VzdG9tLWFzc2V0LXByZWZpeFwiLFxuICAgIH0pO1xuICAgIC8vIEFoZWFkIG9mIHRoZSBiYXJlIGBfbmV4dC9zdGF0aWMqYCBpbiBub3RoaW5nIGJ1dCBsaXN0IHBvc2l0aW9uOyB0aGUgdHdvXG4gICAgLy8gcGF0dGVybnMgY2Fubm90IGJvdGggbWF0Y2ggb25lIHJlcXVlc3QsIHNvIG9yZGVyIGRvZXMgbm90IG1hdHRlciBoZXJlLlxuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFtcbiAgICAgIFwiX25leHQvc3RhdGljKlwiLFxuICAgICAgXCIvY3VzdG9tLWFzc2V0LXByZWZpeC9fbmV4dC9zdGF0aWMqXCIsXG4gICAgICBcIl9uZXh0L2ltYWdlKlwiLFxuICAgIF0pO1xuICAgIGNvbnN0IGZucyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiLFxuICAgICk7XG4gICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoZm5zKVxuICAgICAgLm1hcCgoZm4pID0+IGZuLlByb3BlcnRpZXMuRnVuY3Rpb25Db2RlIGFzIHN0cmluZylcbiAgICAgIC5maW5kKChpdCkgPT4gaXQuaW5jbHVkZXMoXCJyZXF1ZXN0LnVyaS5zbGljZVwiKSk7XG4gICAgLy8gYFwiL2N1c3RvbS1hc3NldC1wcmVmaXhcIi5sZW5ndGhgLCBzbyBgL2N1c3RvbS1hc3NldC1wcmVmaXgvX25leHQvc3RhdGljL3hgXG4gICAgLy8gcmVhY2hlcyBTMyBhcyBgX25leHQvc3RhdGljL3hgLlxuICAgIGV4cGVjdChjb2RlKS50b0NvbnRhaW4oJ1wiXCIgKyByZXF1ZXN0LnVyaS5zbGljZSgyMCknKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWZ1c2VzIGFuIGFzc2V0UHJlZml4IHdoZW4gYW4gb3ZlcnJpZGUgYWxyZWFkeSBjbGFpbXMgVklFV0VSX1JFUVVFU1RcIiwgKCkgPT4ge1xuICAgIC8vIENsb3VkRnJvbnQgcGVybWl0cyBvbmUgZnVuY3Rpb24gcGVyIGV2ZW50IHR5cGUgcGVyIGJlaGF2aW9yLCBzbyB0aGVcbiAgICAvLyByZXdyaXRlIGFuZCB0aGUgb3ZlcnJpZGUgY2Fubm90IGNvZXhpc3Q6IHRoZSBzdGFjayBzeW50aGVkIGNsZWFubHkgYW5kIHdhc1xuICAgIC8vIHJlamVjdGVkIGF0IGRlcGxveSwgbmFtaW5nIG5laXRoZXIgdGhlIG92ZXJyaWRlIG5vciBgYXNzZXRQcmVmaXhgLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG5cIixcbiAgICAgICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgICAgIHN0YXRpY0JlaGF2aW9yT3B0aW9uczoge1xuICAgICAgICAgICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbjogbmV3IENsb3VkRnJvbnRGdW5jdGlvbihzdGFjaywgXCJVc2VyRm5cIiwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShcbiAgICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHsgcmV0dXJuIGV2ZW50LnJlcXVlc3Q7IH1cIixcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdyhcbiAgICAgIC9hc3NvY2lhdGVzIGEgQ2xvdWRGcm9udCBmdW5jdGlvbiB3aXRoIHZpZXdlci1yZXF1ZXN0LCBidXQgc2VydmluZyBgYXNzZXRQcmVmaXhgLyxcbiAgICApO1xuICB9KTtcblxuICBjb25zdCB1c2VyRm4gPSAoc3RhY2s6IFN0YWNrLCBldmVudFR5cGU6IEZ1bmN0aW9uRXZlbnRUeXBlKSA9PiAoe1xuICAgIGV2ZW50VHlwZSxcbiAgICBmdW5jdGlvbjogbmV3IENsb3VkRnJvbnRGdW5jdGlvbihzdGFjaywgYFVzZXJGbiR7ZXZlbnRUeXBlfWAsIHtcbiAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKFxuICAgICAgICBcImZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHsgcmV0dXJuIGV2ZW50LnJlcXVlc3QgfHwgZXZlbnQucmVzcG9uc2U7IH1cIixcbiAgICAgICksXG4gICAgfSksXG4gIH0pO1xuXG4gIGl0LmVhY2goW1wiZHluYW1pY0JlaGF2aW9yT3B0aW9uc1wiLCBcImltYWdlQmVoYXZpb3JPcHRpb25zXCJdIGFzIGNvbnN0KShcbiAgICBcInJlZnVzZXMgYSAlcyBvdmVycmlkZSB0aGF0IHdvdWxkIHJlcGxhY2UgdGhlIHgtZm9yd2FyZGVkLWhvc3QgZnVuY3Rpb25cIixcbiAgICAob3ZlcnJpZGVOYW1lKSA9PiB7XG4gICAgICAvLyBUaGUgcnVudGltZSB0cnVzdHMgYHgtZm9yd2FyZGVkLWhvc3RgIG9uIEZ1bmN0aW9uIFVSTCBldmVudHMgYmVjYXVzZVxuICAgICAgLy8gdGhpcyBmdW5jdGlvbiBvdmVyd3JpdGVzIGl0OyByZXBsYWNlZCwgYSB2aWV3ZXIncyBvd24gaGVhZGVyIHJlYWNoZXMgaXQuXG4gICAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgICAgZXhwZWN0KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICAgIFtvdmVycmlkZU5hbWVdOiB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgIHVzZXJGbihzdGFjaywgRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QpLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgKS50b1Rocm93KFxuICAgICAgICBuZXcgUmVnRXhwKGBvdmVycmlkZXNcXFxcLiR7b3ZlcnJpZGVOYW1lfVxcXFwuZnVuY3Rpb25Bc3NvY2lhdGlvbnNgKSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcblxuICBpdChcImtlZXBzIHRoZSB4LWZvcndhcmRlZC1ob3N0IGZ1bmN0aW9uIG5leHQgdG8gYW4gb3ZlcnJpZGUncyBvdGhlciBhc3NvY2lhdGlvbnNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgZHluYW1pY0JlaGF2aW9yT3B0aW9uczoge1xuICAgICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgICB1c2VyRm4oc3RhY2ssIEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVNQT05TRSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgY29uZmlnID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCIpLFxuICAgIClbMF0uUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWc7XG4gICAgY29uc3QgZXZlbnRUeXBlcyA9IChcbiAgICAgIGNvbmZpZy5EZWZhdWx0Q2FjaGVCZWhhdmlvci5GdW5jdGlvbkFzc29jaWF0aW9ucyBhcyBBcnJheTx7XG4gICAgICAgIEV2ZW50VHlwZTogc3RyaW5nO1xuICAgICAgfT5cbiAgICApLm1hcCgoYXNzb2NpYXRpb24pID0+IGFzc29jaWF0aW9uLkV2ZW50VHlwZSk7XG4gICAgZXhwZWN0KGV2ZW50VHlwZXMuc29ydCgpKS50b0VxdWFsKFtcInZpZXdlci1yZXF1ZXN0XCIsIFwidmlld2VyLXJlc3BvbnNlXCJdKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXdyaXRlcyBhbiBhc3NldFByZWZpeCBiYWNrIG9udG8gdGhlIGJhc2VQYXRoIFMzIGtleXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwgeyBiYXNlUGF0aDogXCIvYmFzZVwiIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgYXNzZXRQcmVmaXg6IFwiL2NkblwiLFxuICAgIH0pO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0NvbnRhaW4oXCIvY2RuL19uZXh0L3N0YXRpYypcIik7XG4gICAgY29uc3QgZm5zID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkZ1bmN0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBjb2RlID0gT2JqZWN0LnZhbHVlcyhmbnMpXG4gICAgICAubWFwKChmbikgPT4gZm4uUHJvcGVydGllcy5GdW5jdGlvbkNvZGUgYXMgc3RyaW5nKVxuICAgICAgLmZpbmQoKGl0KSA9PiBpdC5pbmNsdWRlcyhcInJlcXVlc3QudXJpLnNsaWNlXCIpKTtcbiAgICAvLyBUaGUgb2JqZWN0cyBhcmUgYXQgYGJhc2UvX25leHQvc3RhdGljLy4uLmA6IGBhc3NldFByZWZpeGAgcmVwbGFjZXMgdGhlXG4gICAgLy8gYGJhc2VQYXRoYCBwcmVmaXggaW4gdGhlIFVSTCwgc28gdGhlIHJld3JpdGUgaGFzIHRvIHB1dCBpdCBiYWNrLlxuICAgIGV4cGVjdChjb2RlKS50b0NvbnRhaW4oJ1wiL2Jhc2VcIiArIHJlcXVlc3QudXJpLnNsaWNlKDQpJyk7XG4gIH0pO1xuXG4gIGl0KFwic2VydmVzIGJ1bmRsZXMgdW5kZXIgdGhlIHBhdGggYW4gYWJzb2x1dGUgYXNzZXRQcmVmaXggY2Fycmllc1wiLCAoKSA9PiB7XG4gICAgLy8gYG5leHQgYnVpbGRgIGNvbXBpbGVzIGEgYC9jdXN0b20tYXNzZXQtcHJlZml4L19uZXh0LzpwYXRoKyDihpIgL19uZXh0LzpwYXRoK2BcbiAgICAvLyByZXdyaXRlIG9mIGl0cyBvd24gZm9yIGFuIGFic29sdXRlIHByZWZpeCB3aXRoIGEgcGF0aCwgc28gYG5leHQgc3RhcnRgIHNlcnZlc1xuICAgIC8vIGV2ZXJ5IGJ1bmRsZSB1bmRlciB0aGF0IHBhdGggYXMgd2VsbC4gQSBDRE4gZnJvbnRpbmcgdGhpcyBkaXN0cmlidXRpb24gdGhlcmVcbiAgICAvLyBnZXRzIHRoZSBzYW1lIHJlcXVlc3QsIGFuZCB3aXRob3V0IGEgYmVoYXZpb3IgaXQgcmVhY2hlcyB0aGUgY29tcHV0ZSBvcmlnaW5cbiAgICAvLyBhbmQgNDA0cy4gTWVhc3VyZWQgYWdhaW5zdCBgdGVzdC9lMmUvYXBwLWRpci9hc3NldC1wcmVmaXgtYWJzb2x1dGVgLCB3aG9zZVxuICAgIC8vIG9uZSBjYXNlIGZhaWxlZCBvbiBleGFjdGx5IHRoYXQuXG4gICAgZm9yIChjb25zdCBhc3NldFByZWZpeCBvZiBbXG4gICAgICBcImh0dHBzOi8vZXhhbXBsZS52ZXJjZWwuc2gvY3VzdG9tLWFzc2V0LXByZWZpeFwiLFxuICAgICAgXCIvL2V4YW1wbGUudmVyY2VsLnNoL2N1c3RvbS1hc3NldC1wcmVmaXgvXCIsXG4gICAgXSkge1xuICAgICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgIGFzc2V0UHJlZml4LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9Db250YWluKFxuICAgICAgICBcIi9jdXN0b20tYXNzZXQtcHJlZml4L19uZXh0L3N0YXRpYypcIixcbiAgICAgICk7XG4gICAgICBjb25zdCBjb2RlID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiKSxcbiAgICAgIClcbiAgICAgICAgLm1hcCgoZm4pID0+IGZuLlByb3BlcnRpZXMuRnVuY3Rpb25Db2RlIGFzIHN0cmluZylcbiAgICAgICAgLmZpbmQoKGl0KSA9PiBpdC5pbmNsdWRlcyhcInJlcXVlc3QudXJpLnNsaWNlXCIpKTtcbiAgICAgIGV4cGVjdChjb2RlKS50b0NvbnRhaW4oJ1wiXCIgKyByZXF1ZXN0LnVyaS5zbGljZSgyMCknKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiYWRkcyBubyBiZWhhdmlvciBmb3IgYW4gYXNzZXRQcmVmaXggdGhhdCBuZWVkcyBub25lXCIsICgpID0+IHtcbiAgICAvLyBBbiBhYnNvbHV0ZSBwcmVmaXggd2l0aCBubyBwYXRoIG9mIGl0cyBvd24gbmFtZXMgYW4gb3JpZ2luIHRoaXMgZGlzdHJpYnV0aW9uXG4gICAgLy8gZG9lcyBub3Qgc2VydmUsIGFuZCBhIHByZWZpeCBlcXVhbCB0byB0aGUgYmFzZVBhdGggb25lIGlzIHdoYXQgTmV4dC5qc1xuICAgIC8vIGRlZmF1bHRzIHRvIHdoZW4gYGJhc2VQYXRoYCBpcyBzZXQg4oCUIGBfbmV4dC9zdGF0aWMqYCBhbHJlYWR5IHJlc29sdmVzIHVuZGVyXG4gICAgLy8gaXQsIGFuZCBhIGR1cGxpY2F0ZSBwYXR0ZXJuIHdvdWxkIG1ha2UgQ2xvdWRGcm9udCByZWplY3QgdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICBmb3IgKGNvbnN0IFthc3NldFByZWZpeCwgYmFzZVBhdGhdIG9mIFtcbiAgICAgIFtcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIsIHVuZGVmaW5lZF0sXG4gICAgICBbXCJodHRwczovL2Nkbi5leGFtcGxlLmNvbS9cIiwgdW5kZWZpbmVkXSxcbiAgICAgIFtcIi8vY2RuLmV4YW1wbGUuY29tXCIsIHVuZGVmaW5lZF0sXG4gICAgICBbXCIvYmFzZVwiLCBcIi9iYXNlXCJdLFxuICAgICAgW1wiaHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vYmFzZVwiLCBcIi9iYXNlXCJdLFxuICAgICAgW1wiXCIsIHVuZGVmaW5lZF0sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7IGJhc2VQYXRoIH0pO1xuICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgYXNzZXRQcmVmaXgsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gcGF0aFBhdHRlcm5zKHN0YWNrKTtcbiAgICAgIGV4cGVjdChwYXR0ZXJucy5maWx0ZXIoKHApID0+IHAuaW5jbHVkZXMoXCJfbmV4dC9zdGF0aWNcIikpKS50b0hhdmVMZW5ndGgoXG4gICAgICAgIDEsXG4gICAgICApO1xuICAgICAgLy8gVGhlIHgtZm9yd2FyZGVkLWhvc3QgZnVuY3Rpb24gaXMgYWx3YXlzIHRoZXJlIG9uIGZ1bmN0aW9uIGNvbXB1dGU7IHRoZVxuICAgICAgLy8gcmV3cml0ZSBvbmUgc2hvdWxkIG5vdCBiZS5cbiAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiKSxcbiAgICAgICkubWFwKChmbikgPT4gZm4uUHJvcGVydGllcy5GdW5jdGlvbkNvZGUgYXMgc3RyaW5nKTtcbiAgICAgIGV4cGVjdChjb2Rlcy5zb21lKChpdCkgPT4gaXQuaW5jbHVkZXMoXCJyZXF1ZXN0LnVyaS5zbGljZVwiKSkpLnRvQmUoZmFsc2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoXCJjb3VudHMgdGhlIGFzc2V0UHJlZml4IGJlaGF2aW9yIGFnYWluc3QgdGhlIGJ1ZGdldFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyMiB9LCAoXywgaSkgPT4gYGZpbGUke2l9LnR4dGApLFxuICAgIH0pO1xuICAgIC8vIDMgZml4ZWQgKyAyMiBwdWJsaWMgPSAyNSwgZXhhY3RseSB0aGUgbGltaXQ7IHRoZSBhc3NldFByZWZpeCBvbmUgaXMgdGhlXG4gICAgLy8gMjZ0aCwgYW5kIGEgbGltaXQgZXJyb3IgdGhhdCBkaWQgbm90IGNvdW50IGl0IHdvdWxkIGNvbWUgYXMgYSBkZXBsb3lcbiAgICAvLyBmYWlsdXJlIGluc3RlYWQuXG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG5cIixcbiAgICAgICAgICBtYXhDYWNoZUJlaGF2aW9yczogMjUsXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvMjYgQ2xvdWRGcm9udCBjYWNoZSBiZWhhdmlvcnMuKjQgdXNlZCBieSBjZGstbmV4dGpzIGl0c2VsZi9zKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2VzIG5vdCBjYWNoZSBhIGR5bmFtaWMgcmVzcG9uc2UgdGhhdCBzZW5kcyBubyBDYWNoZS1Db250cm9sXCIsICgpID0+IHtcbiAgICAvLyBDREsncyBgQ2FjaGVQb2xpY3lgIGRlZmF1bHQgaXMgYSBkYXksIHdoaWNoIGNhY2hlZCBldmVyeSByb3V0ZSBoYW5kbGVyXG4gICAgLy8gd2l0aG91dCBhIGBDYWNoZS1Db250cm9sYCAtIGAvYXBpL2VjaG9gIGluIGFwcC1wbGF5Z3JvdW5kIC0gZm9yIDI0IGhvdXJzLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkNhY2hlUG9saWN5XCIsXG4gICAgICB7XG4gICAgICAgIENhY2hlUG9saWN5Q29uZmlnOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBDb21tZW50OiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiRHluYW1pY1wiKSxcbiAgICAgICAgICBEZWZhdWx0VFRMOiAwLFxuICAgICAgICAgIE1pblRUTDogMCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwid2lsZGNhcmRzIGEgcHVibGljLyBuYW1lIENsb3VkRnJvbnQgY2Fubm90IHNwZWxsXCIsICgpID0+IHtcbiAgICAvLyBgcHVibGljL2hlbGxvIHdvcmxkLmpwZ2AgaXMgYSB2YWxpZCBOZXh0LmpzIGFzc2V0LCBidXQgYSBzcGFjZSBjYW5ub3QgYXBwZWFyXG4gICAgLy8gaW4gYSBwYXRoIHBhdHRlcm4sIHNvIGNkay1uZXh0anMgdGhyZXcgYXQgc3ludGggYW5kIHRoZSBhcHAgY291bGQgbm90IGJlXG4gICAgLy8gZGVwbG95ZWQgYXQgYWxsLiBDbG91ZEZyb250IG1hdGNoZXMgdGhlICpkZWNvZGVkKiBwYXRoLCBhbmQgYD9gIG1hdGNoZXMgb25lXG4gICAgLy8gYnl0ZSBvZiBpdCwgc28gb25lIGA/YCBwZXIgVVRGLTggYnl0ZSBpcyB0aGUgbmFycm93ZXN0IHBhdHRlcm4gdGhhdFxuICAgIC8vIG1hdGNoZXMuIE5vdCBvbmUgcGVyIHBlcmNlbnQtZW5jb2RlZCBjaGFyYWN0ZXI6IGBoZWxsbz8/P3dvcmxkLmpwZ2BcbiAgICAvLyBkZXBsb3lzIGFuZCB0aGVuIG5ldmVyIG1hdGNoZXMsIHdoaWNoIGlzIGEgNDA0IHJhdGhlciB0aGFuIGEgc3ludGggZXJyb3IuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXCJoZWxsbyB3b3JsZC5qcGdcIiwgXCLDpMO2w7zFocSNxZnDrS5wbmdcIiwgXCJmYXZpY29uLmljb1wiXSxcbiAgICB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCBkaXN0cmlidXRpb25Qcm9wcyk7XG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvRXF1YWwoXG4gICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgXCJoZWxsbz93b3JsZC5qcGdcIixcbiAgICAgICAgLy8gNyBjaGFyYWN0ZXJzLCAyIFVURi04IGJ5dGVzIGVhY2guXG4gICAgICAgIGAke1wiP1wiLnJlcGVhdCgxNCl9LnBuZ2AsXG4gICAgICAgIFwiZmF2aWNvbi5pY29cIixcbiAgICAgIF0pLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwid2lsZGNhcmRzIGEgcHVibGljLyBkaXJlY3RvcnkgbmFtZSB0aGUgc2FtZSB3YXlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbeyBuYW1lOiBcIm15IGltYWdlc1wiLCBpc0RpcmVjdG9yeTogdHJ1ZSB9XSxcbiAgICB9KTtcbiAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9Db250YWluKFwibXk/aW1hZ2VzLypcIik7XG4gIH0pO1xuXG4gIGl0KFwicmVqZWN0cyBhIHB1YmxpYy8gbmFtZSB0b28gbG9uZyB0byBleHByZXNzIGFzIGEgcGF0aCBwYXR0ZXJuXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtgJHtcIsOkXCIucmVwZWF0KDEzMCl9LnBuZ2BdLFxuICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+IG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIGRpc3RyaWJ1dGlvblByb3BzKSxcbiAgICApLnRvVGhyb3coL25lZWRzIGEgMjY0LWNoYXJhY3RlciBDbG91ZEZyb250IHBhdGggcGF0dGVybi8pO1xuICB9KTtcblxuICBpdChcInNraXBzIGEgcHVibGljLyBlbnRyeSB3aG9zZSBwYXR0ZXJuIHdvdWxkIGJlIHdpbGRjYXJkcyBhbG9uZVwiLCAoKSA9PiB7XG4gICAgLy8gYNGE0L7RgtC+L2AgaXMgYD8/Pz8/Pz8/LypgLCB3aGljaCBtYXRjaGVzIGFueSA4LWJ5dGUgZmlyc3Qgc2VnbWVudC4gUHVibGljXG4gICAgLy8gYmVoYXZpb3JzIGFyZSBhZGRlZCBhaGVhZCBvZiB0aGUgY29tcHV0ZSBvbmVzLCBzbyBgL3Byb2R1Y3RzLzQyYCB3b3VsZCBnb1xuICAgIC8vIHRvIFMzIGFuZCA0MDMuIFRoZSBlbnRyeSBnZXRzIG5vIGJlaGF2aW9yIGFuZCBhIHdhcm5pbmcgaW5zdGVhZC5cbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgcHVibGljRGlyRW50cmllczogW1xuICAgICAgICB7IG5hbWU6IFwi0YTQvtGC0L5cIiwgaXNEaXJlY3Rvcnk6IHRydWUgfSxcbiAgICAgICAgeyBuYW1lOiBcIuWbvlwiLCBpc0RpcmVjdG9yeTogZmFsc2UgfSxcbiAgICAgICAgeyBuYW1lOiBcItGE0L7RgtC+LTFcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgY29uc3QgcGF0dGVybnMgPSBwYXRoUGF0dGVybnMoc3RhY2spO1xuICAgIGV4cGVjdChwYXR0ZXJucykubm90LnRvQ29udGFpbihgJHtcIj9cIi5yZXBlYXQoOCl9LypgKTtcbiAgICBleHBlY3QocGF0dGVybnMpLm5vdC50b0NvbnRhaW4oXCI/Pz9cIik7XG4gICAgLy8gT25lIGxpdGVyYWwgY2hhcmFjdGVyIGtlZXBzIGEgcGF0dGVybiBuYXJyb3cgZW5vdWdoIHRvIGtlZXAuXG4gICAgZXhwZWN0KHBhdHRlcm5zKS50b0NvbnRhaW4oYCR7XCI/XCIucmVwZWF0KDgpfS0xLypgKTtcbiAgICBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spLmhhc1dhcm5pbmcoXG4gICAgICBcIipcIixcbiAgICAgIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ1wi0YTQvtGC0L5cIiwgXCLlm75cIicpLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgY291bnQgYSBza2lwcGVkIHB1YmxpYy8gZW50cnkgYWdhaW5zdCB0aGUgYnVkZ2V0XCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtcbiAgICAgICAgLi4uQXJyYXkuZnJvbSh7IGxlbmd0aDogMjIgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICAgICAgXCLlm75cIixcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgLy8gMyBmaXhlZCArIDIyID0gMjUsIGV4YWN0bHkgdGhlIGxpbWl0OyB0aGUgc2tpcHBlZCBlbnRyeSBhZGRzIG5vdGhpbmcuXG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIG1heENhY2hlQmVoYXZpb3JzOiAyNSxcbiAgICAgICAgfSksXG4gICAgKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICBpdChcImNoZWNrcyB0aGUgbGVuZ3RoIG9mIHRoZSBmaW5hbCBwYXR0ZXJuLCBiYXNlUGF0aCBhbmQgLyogaW5jbHVkZWRcIiwgKCkgPT4ge1xuICAgIC8vIDgzIHRocmVlLWJ5dGUgY2hhcmFjdGVycyArIFwiLnBkZlwiIGlzIGEgMjUzLWNoYXJhY3RlciBwYXR0ZXJuIG9uIGl0cyBvd24sXG4gICAgLy8gdW5kZXIgdGhlIGxpbWl0OyBgL2RvY3MvYCBpbiBmcm9udCB0YWtlcyBpdCB0byAyNTksIHdoaWNoIENsb3VkRnJvbnRcbiAgICAvLyByZWplY3RzIGF0IGRlcGxveS5cbiAgICBjb25zdCBuYW1lID0gYCR7XCLlm75cIi5yZXBlYXQoODMpfS5wZGZgO1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogW25hbWVdLFxuICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBiYXNlUGF0aDogXCIvZG9jc1wiLFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coL25lZWRzIGEgMjU5LWNoYXJhY3RlciBDbG91ZEZyb250IHBhdGggcGF0dGVybi8pO1xuXG4gICAgY29uc3QgeyBzdGFjazogZGlyU3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzOiBkaXJQcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oZGlyU3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXJQcm9wcyxcbiAgICAgICAgICAvLyAyNTQgY2hhcmFjdGVycywgdW5kZXIgdGhlIGxpbWl0IHVudGlsIHRoZSBgLypgLlxuICAgICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtcbiAgICAgICAgICAgIHsgbmFtZTogYGFiJHtcIuWbvlwiLnJlcGVhdCg4NCl9YCwgaXNEaXJlY3Rvcnk6IHRydWUgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coL25lZWRzIGEgMjU2LWNoYXJhY3Rlci8pO1xuICB9KTtcblxuICBpdChcImRyb3BzIHRoZSBjYWNoZSBrZXkgd2hlbiBhbiBvdmVycmlkZSBkaXNhYmxlcyBkeW5hbWljIGNhY2hpbmdcIiwgKCkgPT4ge1xuICAgIC8vIENsb3VkRnJvbnQgcmVqZWN0cyBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nIGJ1dCBrZXlzIG9uIGhlYWRlcnMuIENES1xuICAgIC8vIHVzZWQgdG8gcmFpc2UgYG1heFR0bDogMGAgdG8gdGhlIGRheS1sb25nIGRlZmF1bHQsIHNvIHRoZSBvdmVycmlkZVxuICAgIC8vIGRlcGxveWVkOyB3aXRoIGEgZGVmYXVsdCBvZiAwIGl0IGlzIGhvbm9yZWQsIGFuZCBtdXN0IHN0YXkgZGVwbG95YWJsZS5cbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgIGR5bmFtaWNDYWNoZVBvbGljeVByb3BzOiB7IG1heFR0bDogRHVyYXRpb24uc2Vjb25kcygwKSB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpDYWNoZVBvbGljeVwiLFxuICAgICAge1xuICAgICAgICBDYWNoZVBvbGljeUNvbmZpZzogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgQ29tbWVudDogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcIkR5bmFtaWNcIiksXG4gICAgICAgICAgRGVmYXVsdFRUTDogMCxcbiAgICAgICAgICBNYXhUVEw6IDAsXG4gICAgICAgICAgTWluVFRMOiAwLFxuICAgICAgICAgIFBhcmFtZXRlcnNJbkNhY2hlS2V5QW5kRm9yd2FyZGVkVG9PcmlnaW46IHtcbiAgICAgICAgICAgIENvb2tpZXNDb25maWc6IHsgQ29va2llQmVoYXZpb3I6IFwibm9uZVwiIH0sXG4gICAgICAgICAgICBFbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogZmFsc2UsXG4gICAgICAgICAgICBFbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IGZhbHNlLFxuICAgICAgICAgICAgSGVhZGVyc0NvbmZpZzogeyBIZWFkZXJCZWhhdmlvcjogXCJub25lXCIgfSxcbiAgICAgICAgICAgIFF1ZXJ5U3RyaW5nc0NvbmZpZzogeyBRdWVyeVN0cmluZ0JlaGF2aW9yOiBcIm5vbmVcIiB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBpdChcImtlZXBzIHRoZSBjYWNoZSBrZXkgd2hlbiBhIHplcm8gbWF4VHRsIGlzIHJhaXNlZCBieSBhbm90aGVyIFRUTFwiLCAoKSA9PiB7XG4gICAgLy8gQ0RLIHJhaXNlcyBgbWF4VHRsYCB0byBgZGVmYXVsdFR0bGAsIHNvIHRoaXMgcG9saWN5IGNhY2hlcyBmb3IgYW4gaG91ci5cbiAgICAvLyBEcm9wcGluZyB0aGUga2V5IGZvciBpdCB3b3VsZCBzZXJ2ZSBvbmUgdmlld2VyJ3MgcGFnZSB0byBldmVyeSB2aWV3ZXIuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICBkeW5hbWljQ2FjaGVQb2xpY3lQcm9wczoge1xuICAgICAgICAgIG1heFR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgICAgICBkZWZhdWx0VHRsOiBEdXJhdGlvbi5ob3VycygxKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6Q2FjaGVQb2xpY3lcIixcbiAgICAgIHtcbiAgICAgICAgQ2FjaGVQb2xpY3lDb25maWc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIENvbW1lbnQ6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJEeW5hbWljXCIpLFxuICAgICAgICAgIE1heFRUTDogMzYwMCxcbiAgICAgICAgICBQYXJhbWV0ZXJzSW5DYWNoZUtleUFuZEZvcndhcmRlZFRvT3JpZ2luOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgIENvb2tpZXNDb25maWc6IHsgQ29va2llQmVoYXZpb3I6IFwiYWxsXCIgfSxcbiAgICAgICAgICAgIFF1ZXJ5U3RyaW5nc0NvbmZpZzogeyBRdWVyeVN0cmluZ0JlaGF2aW9yOiBcImFsbFwiIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBpdChcImtleXMgdGhlIGR5bmFtaWMgY2FjaGUgb25seSBvbiBoZWFkZXJzIHRoZSBvcmlnaW4gcmVhZHNcIiwgKCkgPT4ge1xuICAgIC8vIGB4LW1hdGNoZWQtcGF0aGAgaXMgc3RyaXBwZWQgYnkgdGhlIHJ1bnRpbWUgYW5kIGB4LW5leHQtY2FjaGUtdGFnc2AgaXNcbiAgICAvLyBuZXZlciBzZW50IGJ5IHZpZXdlcnM6IGtleWluZyBvbiBlaXRoZXIgc3BlbmRzIGEgaGVhZGVyIHNsb3QgYW5kIGxldHMgYVxuICAgIC8vIGNsaWVudCBmcmFnbWVudCB0aGUgY2FjaGUgZm9yIG5vdGhpbmcuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCBkaXN0cmlidXRpb25Qcm9wcyk7XG4gICAgY29uc3QgcG9saWNpZXMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6Q2FjaGVQb2xpY3lcIixcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIENhY2hlUG9saWN5Q29uZmlnOiB7IENvbW1lbnQ6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJEeW5hbWljXCIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgY29uc3QgW3BvbGljeV0gPSBPYmplY3QudmFsdWVzKHBvbGljaWVzKTtcbiAgICBjb25zdCBoZWFkZXJzOiBzdHJpbmdbXSA9XG4gICAgICBwb2xpY3kuUHJvcGVydGllcy5DYWNoZVBvbGljeUNvbmZpZ1xuICAgICAgICAuUGFyYW1ldGVyc0luQ2FjaGVLZXlBbmRGb3J3YXJkZWRUb09yaWdpbi5IZWFkZXJzQ29uZmlnLkhlYWRlcnM7XG4gICAgZXhwZWN0KGhlYWRlcnMpLm5vdC50b0NvbnRhaW4oXCJ4LW1hdGNoZWQtcGF0aFwiKTtcbiAgICBleHBlY3QoaGVhZGVycykubm90LnRvQ29udGFpbihcIngtbmV4dC1jYWNoZS10YWdzXCIpO1xuICAgIGV4cGVjdChoZWFkZXJzKS50b0NvbnRhaW4oXCJyc2NcIik7XG4gIH0pO1xuXG4gIGl0KFwicmVqZWN0cyBzcGxpdHRpbmcgb24gYSBkZXBsb3ltZW50IHR5cGUgdGhhdCBjYW5ub3Qgcm91dGUgaXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcImFwaVwiXSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlMsXG4gICAgICAgICAgbG9hZEJhbGFuY2VyOiB1bmRlZmluZWQsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9vbmx5IHN1cHBvcnRlZCBieSBOZXh0anNHbG9iYWxGdW5jdGlvbnMvKTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBUaGUgdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24sIHJ1biBhcyBDbG91ZEZyb250IHdvdWxkIHJ1biBpdC5cbiAqXG4gKiBJdCBpcyBhdXRob3JlZCBhcyBhIHN0cmluZyBpbnNpZGUgYSBUeXBlU2NyaXB0IHRlbXBsYXRlIGxpdGVyYWwsIHNvIGV2ZXJ5XG4gKiBiYWNrc2xhc2ggaW4gaXQgaXMgZXNjYXBlZCB0d2ljZSAtIGFuZCBhIHJlZ2V4IHRoYXQgY29sbGFwc2VzIHNsYXNoZXMgaXMgbm90aGluZ1xuICogYnV0IGJhY2tzbGFzaGVzLiBBc3NlcnRpbmcgb24gYmVoYXZpb3IgcmF0aGVyIHRoYW4gb24gdGhlIHRleHQgaXMgd2hhdCBjYXRjaGVzIGFuXG4gKiBlc2NhcGluZyBtaXN0YWtlLCB3aGljaCBhIHNuYXBzaG90IHdvdWxkIGhhcHBpbHkgcmVjb3JkLlxuICovXG5kZXNjcmliZShcInRoZSB2aWV3ZXItcmVxdWVzdCBDbG91ZEZyb250IEZ1bmN0aW9uXCIsICgpID0+IHtcbiAgaW50ZXJmYWNlIFF1ZXJ5VmFsdWUge1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgbXVsdGlWYWx1ZT86IEFycmF5PHsgdmFsdWU6IHN0cmluZyB9PjtcbiAgfVxuICBpbnRlcmZhY2UgRnVuY3Rpb25SZXF1ZXN0IHtcbiAgICB1cmk6IHN0cmluZztcbiAgICBxdWVyeXN0cmluZzogUmVjb3JkPHN0cmluZywgUXVlcnlWYWx1ZT47XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nIH0+O1xuICB9XG4gIHR5cGUgRnVuY3Rpb25SZXN1bHQgPVxuICAgIHwgRnVuY3Rpb25SZXF1ZXN0XG4gICAgfCB7IHN0YXR1c0NvZGU6IG51bWJlcjsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nIH0+IH07XG5cbiAgY29uc3QgaGFuZGxlciA9ICgoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIkZuU3RhY2tcIik7XG4gICAgY29uc3QgZm4gPSBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiRm5cIiwge1xuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gKCkgPT4ge307XCIpLFxuICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIGFzc2V0c0J1Y2tldDogbmV3IEJ1Y2tldChzdGFjaywgXCJBc3NldHNcIiksXG4gICAgICBmdW5jdGlvblVybDogbmV3IEZ1bmN0aW9uVXJsKHN0YWNrLCBcIlVybFwiLCB7XG4gICAgICAgIGZ1bmN0aW9uOiBmbixcbiAgICAgICAgYXV0aFR5cGU6IEZ1bmN0aW9uVXJsQXV0aFR5cGUuQVdTX0lBTSxcbiAgICAgIH0pLFxuICAgICAgbmV4dGpzVHlwZTogTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TLFxuICAgICAgcHVibGljRGlyRW50cmllczogW10sXG4gICAgfSk7XG4gICAgY29uc3QgZnVuY3Rpb25zID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkZ1bmN0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBjb2RlID0gT2JqZWN0LnZhbHVlcyhmdW5jdGlvbnMpWzBdLlByb3BlcnRpZXMuRnVuY3Rpb25Db2RlIGFzIHN0cmluZztcbiAgICByZXR1cm4gcnVuSW5OZXdDb250ZXh0KGAke2NvZGV9XFxuaGFuZGxlcmApIGFzIChldmVudDoge1xuICAgICAgcmVxdWVzdDogRnVuY3Rpb25SZXF1ZXN0O1xuICAgIH0pID0+IFByb21pc2U8RnVuY3Rpb25SZXN1bHQ+O1xuICB9KSgpO1xuXG4gIGNvbnN0IHNlbmQgPSAoXG4gICAgdXJpOiBzdHJpbmcsXG4gICAgcXVlcnlzdHJpbmc6IFJlY29yZDxzdHJpbmcsIFF1ZXJ5VmFsdWU+ID0ge30sXG4gICk6IFByb21pc2U8RnVuY3Rpb25SZXN1bHQ+ID0+XG4gICAgaGFuZGxlcih7XG4gICAgICByZXF1ZXN0OiB7IHVyaSwgcXVlcnlzdHJpbmcsIGhlYWRlcnM6IHsgaG9zdDogeyB2YWx1ZTogXCJhLnRlc3RcIiB9IH0gfSxcbiAgICB9KTtcblxuICBjb25zdCByZWRpcmVjdCA9IChyZXN1bHQ6IEZ1bmN0aW9uUmVzdWx0KSA9PiAoe1xuICAgIHN0YXR1c0NvZGU6IChyZXN1bHQgYXMgeyBzdGF0dXNDb2RlOiBudW1iZXIgfSkuc3RhdHVzQ29kZSxcbiAgICBsb2NhdGlvbjogcmVzdWx0LmhlYWRlcnMubG9jYXRpb24/LnZhbHVlLFxuICB9KTtcblxuICBpdC5lYWNoKFtcbiAgICBbXCIvL1wiLCBcIi9cIl0sXG4gICAgW1wiLy8vXCIsIFwiL1wiXSxcbiAgICBbXCIvZm9vLy9iYXJcIiwgXCIvZm9vL2JhclwiXSxcbiAgICBbXCIvYmFzZXBhdGgvL3RvLXN2XCIsIFwiL2Jhc2VwYXRoL3RvLXN2XCJdLFxuICAgIFtcIi9hXFxcXGJcIiwgXCIvYS9iXCJdLFxuICBdKShcInJlZGlyZWN0cyAlcyB0byAlcyB3aXRoIGEgMzA4XCIsIGFzeW5jICh1cmksIGxvY2F0aW9uKSA9PiB7XG4gICAgZXhwZWN0KHJlZGlyZWN0KGF3YWl0IHNlbmQodXJpKSkpLnRvRXF1YWwoeyBzdGF0dXNDb2RlOiAzMDgsIGxvY2F0aW9uIH0pO1xuICB9KTtcblxuICBpdChcImtlZXBzIHRoZSBxdWVyeSBvbiB0aGUgcmVkaXJlY3QsIGluY2x1ZGluZyByZXBlYXRlZCBrZXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBDbG91ZEZyb250J3Mgc2hhcGUgZm9yIGEgcmVwZWF0ZWQga2V5OiBgbXVsdGlWYWx1ZWAgaG9sZHMgZXZlcnkgdmFsdWUsXG4gICAgLy8gdGhlIGZpcnN0IGluY2x1ZGVkLCBhbmQgYHZhbHVlYCByZXBlYXRzIHRoYXQgZmlyc3Qgb25lLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlbmQoXCIveC8veVwiLCB7XG4gICAgICBqc29uOiB7IHZhbHVlOiBcInRydWVcIiB9LFxuICAgICAgYTogeyB2YWx1ZTogXCIxXCIsIG11bHRpVmFsdWU6IFt7IHZhbHVlOiBcIjFcIiB9LCB7IHZhbHVlOiBcIjJcIiB9XSB9LFxuICAgICAgZmxhZzogeyB2YWx1ZTogXCJcIiB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChyZWRpcmVjdChyZXN1bHQpLmxvY2F0aW9uKS50b0JlKFwiL3gveT9qc29uPXRydWUmYT0xJmE9MiZmbGFnXCIpO1xuICB9KTtcblxuICBpdChcInBhc3NlcyBwZXJjZW50LWVuY29kZWQgcXVlcnkgdmFsdWVzIHRocm91Z2ggd2l0aG91dCByZS1lbmNvZGluZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCBoYW5kcyB0aGUgZnVuY3Rpb24gdGhlIHZhbHVlcyBzdGlsbCBlbmNvZGVkLCBhcyBzZW50LlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlbmQoXCIveC8veVwiLCB7XG4gICAgICBhOiB7IHZhbHVlOiBcIiUyMGIlMjZjXCIgfSxcbiAgICAgIHA6IHsgdmFsdWU6IFwiMSsyXCIgfSxcbiAgICB9KTtcbiAgICBleHBlY3QocmVkaXJlY3QocmVzdWx0KS5sb2NhdGlvbikudG9CZShcIi94L3k/YT0lMjBiJTI2YyZwPTErMlwiKTtcbiAgfSk7XG5cbiAgaXQoXCJwYXNzZXMgYW4gb3JkaW5hcnkgcGF0aCB0aHJvdWdoIHdpdGggeC1mb3J3YXJkZWQtaG9zdCBzZXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCBzZW5kKFwiL2EvYlwiKSkgYXMgRnVuY3Rpb25SZXF1ZXN0O1xuICAgIGV4cGVjdChyZXN1bHQudXJpKS50b0JlKFwiL2EvYlwiKTtcbiAgICAvLyBDbG91ZEZyb250IHJld3JpdGVzIGBob3N0YCB0byB0aGUgb3JpZ2luIGRvbWFpbiwgc28gdGhlIGFwcCB3b3VsZCBvdGhlcndpc2VcbiAgICAvLyBidWlsZCBldmVyeSBhYnNvbHV0ZSBVUkwgYWdhaW5zdCB0aGUgRnVuY3Rpb24gVVJMJ3MgaG9zdG5hbWUuXG4gICAgZXhwZWN0KHJlc3VsdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXS52YWx1ZSkudG9CZShcImEudGVzdFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJvdmVyd3JpdGVzIGEgY2xpZW50LXN1cHBsaWVkIHgtZm9yd2FyZGVkLWhvc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRoZSBydW50aW1lIHRydXN0cyB0aGlzIGhlYWRlciBiZWhpbmQgdGhlIEZ1bmN0aW9uIFVSTCwgc28gYSB2aWV3ZXInc1xuICAgIC8vIG93biB2YWx1ZSBtdXN0IG5vdCBzdXJ2aXZlIHRvIGJ1aWxkIHJlZGlyZWN0cyBvciBvcmlnaW4gY2hlY2tzLlxuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCBoYW5kbGVyKHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgdXJpOiBcIi9hXCIsXG4gICAgICAgIHF1ZXJ5c3RyaW5nOiB7fSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGhvc3Q6IHsgdmFsdWU6IFwiYS50ZXN0XCIgfSxcbiAgICAgICAgICBcIngtZm9yd2FyZGVkLWhvc3RcIjogeyB2YWx1ZTogXCJldmlsLnRlc3RcIiB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSkgYXMgRnVuY3Rpb25SZXF1ZXN0O1xuICAgIGV4cGVjdChyZXN1bHQuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl0udmFsdWUpLnRvQmUoXCJhLnRlc3RcIik7XG4gIH0pO1xufSk7XG5cbi8qKlxuICogYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVgLCBydW4gYXMgQ2xvdWRGcm9udCB3b3VsZCBydW4gaXQgb24gZWFjaCBiZWhhdmlvcixcbiAqIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHN1aXRlIGFib3ZlLlxuICovXG5kZXNjcmliZShcInZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcIiwgKCkgPT4ge1xuICBjb25zdCBCQVNJQ19BVVRIID0gYFxuICAgIGZ1bmN0aW9uIHZpZXdlclJlcXVlc3QoZXZlbnQpIHtcbiAgICAgIHZhciBhdXRoID0gZXZlbnQucmVxdWVzdC5oZWFkZXJzLmF1dGhvcml6YXRpb247XG4gICAgICBpZiAoYXV0aCAmJiBhdXRoLnZhbHVlID09PSBcIkJhc2ljIGRYTmxjanB3WVhOelwiKSByZXR1cm47XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXNDb2RlOiA0MDEsXG4gICAgICAgIHN0YXR1c0Rlc2NyaXB0aW9uOiBcIlVuYXV0aG9yaXplZFwiLFxuICAgICAgICBoZWFkZXJzOiB7IFwid3d3LWF1dGhlbnRpY2F0ZVwiOiB7IHZhbHVlOiAnQmFzaWMgcmVhbG09XCJwcmV2aWV3XCInIH0gfSxcbiAgICAgIH07XG4gICAgfVxuICBgO1xuICBjb25zdCBBVVRIT1JJWkVEID0geyBhdXRob3JpemF0aW9uOiBcIkJhc2ljIGRYTmxjanB3WVhOelwiIH07XG5cbiAgaW50ZXJmYWNlIEZ1bmN0aW9uUmVxdWVzdCB7XG4gICAgdXJpOiBzdHJpbmc7XG4gICAgcXVlcnlzdHJpbmc6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PjtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfT47XG4gIH1cbiAgdHlwZSBGdW5jdGlvblJlc3VsdCA9XG4gICAgfCBGdW5jdGlvblJlcXVlc3RcbiAgICB8IHsgc3RhdHVzQ29kZTogbnVtYmVyOyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfT4gfTtcbiAgdHlwZSBIYW5kbGVyID0gKGV2ZW50OiB7XG4gICAgcmVxdWVzdDogRnVuY3Rpb25SZXF1ZXN0O1xuICB9KSA9PiBQcm9taXNlPEZ1bmN0aW9uUmVzdWx0PjtcbiAgLyoqIFdoYXQgYHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlYCBob2xkcywgYXMgYGNmLmt2cygpYCB3b3VsZCByZWFkIGl0LiAqL1xuICBjb25zdCBmYWtlQ2xvdWRGcm9udE1vZHVsZSA9ICh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+ICh7XG4gICAga3ZzOiAoKSA9PiAoe1xuICAgICAgZ2V0OiBhc3luYyAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHZhbHVlcykpIHRocm93IG5ldyBFcnJvcihga2V5IG5vdCBmb3VuZDogJHtrZXl9YCk7XG4gICAgICAgIHJldHVybiB2YWx1ZXNba2V5XTtcbiAgICAgIH0sXG4gICAgfSksXG4gIH0pO1xuICBpbnRlcmZhY2UgQmVoYXZpb3Ige1xuICAgIFBhdGhQYXR0ZXJuOiBzdHJpbmc7XG4gICAgRnVuY3Rpb25Bc3NvY2lhdGlvbnM/OiBBcnJheTx7XG4gICAgICBFdmVudFR5cGU6IHN0cmluZztcbiAgICAgIEZ1bmN0aW9uQVJOOiB7IFwiRm46OkdldEF0dFwiOiBbc3RyaW5nLCBzdHJpbmddIH07XG4gICAgfT47XG4gIH1cblxuICBjb25zdCBzeW50aCA9IChcbiAgICBwcm9wczoge1xuICAgICAgY29kZT86IHN0cmluZztcbiAgICAgIG5leHRqc1R5cGU/OiBOZXh0anNUeXBlO1xuICAgICAgYXNzZXRQcmVmaXg/OiBzdHJpbmc7XG4gICAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAgIGtleVZhbHVlU3RvcmU/OiBib29sZWFuO1xuICAgICAgb3ZlcnJpZGVzPzogKHN0YWNrOiBTdGFjaykgPT4gTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzO1xuICAgIH0gPSB7fSxcbiAgKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlRlc3RTdGFja1wiKTtcbiAgICBjb25zdCBrZXlWYWx1ZVN0b3JlID0gcHJvcHMua2V5VmFsdWVTdG9yZVxuICAgICAgPyBuZXcgS2V5VmFsdWVTdG9yZShzdGFjaywgXCJLdnNcIilcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbXB1dGUgPVxuICAgICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIGxvYWRCYWxhbmNlcjogbmV3IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyKHN0YWNrLCBcIkFsYlwiLCB7XG4gICAgICAgICAgICAgIHZwYzogbmV3IFZwYyhzdGFjaywgXCJWcGNcIiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgZnVuY3Rpb25Vcmw6IG5ldyBGdW5jdGlvblVybChzdGFjaywgXCJVcmxcIiwge1xuICAgICAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkZuXCIsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9O1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmNvbXB1dGUsXG4gICAgICBhc3NldHNCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssIFwiQXNzZXRzXCIpLFxuICAgICAgYXNzZXRQcmVmaXg6IHByb3BzLmFzc2V0UHJlZml4LFxuICAgICAgYmFzZVBhdGg6IHByb3BzLmJhc2VQYXRoLFxuICAgICAgbmV4dGpzVHlwZTogcHJvcHMubmV4dGpzVHlwZSA/PyBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMsXG4gICAgICBvdmVycmlkZXM6IHByb3BzLm92ZXJyaWRlcz8uKHN0YWNrKSxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFt7IG5hbWU6IFwiZmF2aWNvbi5pY29cIiwgaXNEaXJlY3Rvcnk6IGZhbHNlIH1dLFxuICAgICAgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZTpcbiAgICAgICAgcHJvcHMuY29kZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKHByb3BzLmNvZGUpLFxuICAgICAgdmlld2VyUmVxdWVzdEtleVZhbHVlU3RvcmU6IGtleVZhbHVlU3RvcmUsXG4gICAgfSk7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIGNvbnN0IGZ1bmN0aW9ucyA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoXCJBV1M6OkNsb3VkRnJvbnQ6OkZ1bmN0aW9uXCIpO1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cIiksXG4gICAgKVswXS5Qcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZztcbiAgICBjb25zdCBiZWhhdmlvcnM6IEJlaGF2aW9yW10gPSBbXG4gICAgICB7IFBhdGhQYXR0ZXJuOiBcIipcIiwgLi4uY29uZmlnLkRlZmF1bHRDYWNoZUJlaGF2aW9yIH0sXG4gICAgICAuLi5jb25maWcuQ2FjaGVCZWhhdmlvcnMsXG4gICAgXTtcbiAgICAvKiogVGhlIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIG9uIHRoZSBiZWhhdmlvciBmb3IgYHBhdGhQYXR0ZXJuYC4gKi9cbiAgICBjb25zdCBmdW5jdGlvbkZvciA9IChwYXRoUGF0dGVybjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBiZWhhdmlvciA9IGJlaGF2aW9ycy5maW5kKChpdCkgPT4gaXQuUGF0aFBhdHRlcm4gPT09IHBhdGhQYXR0ZXJuKSE7XG4gICAgICBjb25zdCBhc3NvY2lhdGlvbiA9IGJlaGF2aW9yLkZ1bmN0aW9uQXNzb2NpYXRpb25zIS5maW5kKFxuICAgICAgICAoaXQpID0+IGl0LkV2ZW50VHlwZSA9PT0gXCJ2aWV3ZXItcmVxdWVzdFwiLFxuICAgICAgKSE7XG4gICAgICByZXR1cm4gZnVuY3Rpb25zW2Fzc29jaWF0aW9uLkZ1bmN0aW9uQVJOW1wiRm46OkdldEF0dFwiXVswXV0uUHJvcGVydGllcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoYXQgZnVuY3Rpb24ncyBoYW5kbGVyLCBydW5uYWJsZS4gYG5vZGU6dm1gIHNjcmlwdHMgY2FuJ3QgYGltcG9ydGAsIHNvXG4gICAgICogdGhlIGBjbG91ZGZyb250YCBtb2R1bGUgaXMgaGFuZGVkIGluIGFzIHRoZSBiaW5kaW5nIHRoZSBpbXBvcnQgbWFrZXMuXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlckZvciA9IChcbiAgICAgIHBhdGhQYXR0ZXJuOiBzdHJpbmcsXG4gICAgICBrdnNWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbiAgICApOiBIYW5kbGVyID0+IHtcbiAgICAgIGNvbnN0IGNvZGUgPSAoZnVuY3Rpb25Gb3IocGF0aFBhdHRlcm4pLkZ1bmN0aW9uQ29kZSBhcyBzdHJpbmcpLnJlcGxhY2UoXG4gICAgICAgIC9eXFxzKmltcG9ydCBjZiBmcm9tIFwiY2xvdWRmcm9udFwiOy8sXG4gICAgICAgIFwiXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJ1bkluTmV3Q29udGV4dChgJHtjb2RlfVxcbmhhbmRsZXJgLCB7XG4gICAgICAgIGNmOiBmYWtlQ2xvdWRGcm9udE1vZHVsZShrdnNWYWx1ZXMpLFxuICAgICAgfSkgYXMgSGFuZGxlcjtcbiAgICB9O1xuICAgIHJldHVybiB7IGJlaGF2aW9ycywgZnVuY3Rpb25zLCBmdW5jdGlvbkZvciwgaGFuZGxlckZvciwgc3RhY2sgfTtcbiAgfTtcblxuICBjb25zdCByZXF1ZXN0ID0gKHVyaTogc3RyaW5nLCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30pID0+ICh7XG4gICAgcmVxdWVzdDoge1xuICAgICAgdXJpLFxuICAgICAgcXVlcnlzdHJpbmc6IHt9LFxuICAgICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyh7IGhvc3Q6IFwiYS50ZXN0XCIsIC4uLmhlYWRlcnMgfSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBbXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB7IHZhbHVlIH0sXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICB9LFxuICB9KTtcbiAgY29uc3Qgc3RhdHVzID0gKHJlc3VsdDogRnVuY3Rpb25SZXN1bHQpID0+XG4gICAgKHJlc3VsdCBhcyB7IHN0YXR1c0NvZGU/OiBudW1iZXIgfSkuc3RhdHVzQ29kZTtcblxuICBpdC5lYWNoKFtOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMsIE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNdKShcbiAgICBcImdhdGVzIGV2ZXJ5IGJlaGF2aW9yIG9uICVzLCBzdGF0aWMgYXNzZXRzIGluY2x1ZGVkXCIsXG4gICAgYXN5bmMgKG5leHRqc1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHsgYmVoYXZpb3JzLCBoYW5kbGVyRm9yIH0gPSBzeW50aCh7IGNvZGU6IEJBU0lDX0FVVEgsIG5leHRqc1R5cGUgfSk7XG4gICAgICBleHBlY3QoYmVoYXZpb3JzLm1hcCgoaXQpID0+IGl0LlBhdGhQYXR0ZXJuKS5zb3J0KCkpLnRvRXF1YWwoW1xuICAgICAgICBcIipcIixcbiAgICAgICAgXCJfbmV4dC9pbWFnZSpcIixcbiAgICAgICAgXCJfbmV4dC9zdGF0aWMqXCIsXG4gICAgICAgIFwiZmF2aWNvbi5pY29cIixcbiAgICAgIF0pO1xuICAgICAgZm9yIChjb25zdCB7IFBhdGhQYXR0ZXJuIH0gb2YgYmVoYXZpb3JzKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyRm9yKFBhdGhQYXR0ZXJuKTtcbiAgICAgICAgZXhwZWN0KHN0YXR1cyhhd2FpdCBoYW5kbGVyKHJlcXVlc3QoXCIveFwiKSkpKS50b0JlKDQwMSk7XG4gICAgICAgIGNvbnN0IHBhc3NlZCA9IChhd2FpdCBoYW5kbGVyKFxuICAgICAgICAgIHJlcXVlc3QoXCIveFwiLCBBVVRIT1JJWkVEKSxcbiAgICAgICAgKSkgYXMgRnVuY3Rpb25SZXF1ZXN0O1xuICAgICAgICBleHBlY3QocGFzc2VkLnVyaSkudG9CZShcIi94XCIpO1xuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgaXQoXCJzaGFyZXMgb25lIHBhc3MtdGhyb3VnaCBmdW5jdGlvbiBiZXR3ZWVuIGR5bmFtaWMgYW5kIHN0YXRpYyBvbiBHbG9iYWwgQ29udGFpbmVyc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBiZWhhdmlvcnMsIGZ1bmN0aW9ucyB9ID0gc3ludGgoe1xuICAgICAgY29kZTogQkFTSUNfQVVUSCxcbiAgICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlMsXG4gICAgfSk7XG4gICAgY29uc3QgW2xvZ2ljYWxJZCwgLi4ucmVzdF0gPSBPYmplY3Qua2V5cyhmdW5jdGlvbnMpO1xuICAgIGV4cGVjdChyZXN0KS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KGJlaGF2aW9ycy5tYXAoKGl0KSA9PiBpdC5QYXRoUGF0dGVybikuc29ydCgpKS50b0VxdWFsKFtcbiAgICAgIFwiKlwiLFxuICAgICAgXCJfbmV4dC9pbWFnZSpcIixcbiAgICAgIFwiX25leHQvc3RhdGljKlwiLFxuICAgICAgXCJmYXZpY29uLmljb1wiLFxuICAgIF0pO1xuICAgIGZvciAoY29uc3QgeyBGdW5jdGlvbkFzc29jaWF0aW9ucyB9IG9mIGJlaGF2aW9ycykge1xuICAgICAgZXhwZWN0KEZ1bmN0aW9uQXNzb2NpYXRpb25zKS50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIEV2ZW50VHlwZTogXCJ2aWV3ZXItcmVxdWVzdFwiLFxuICAgICAgICAgIEZ1bmN0aW9uQVJOOiB7IFwiRm46OkdldEF0dFwiOiBbbG9naWNhbElkLCBcIkZ1bmN0aW9uQVJOXCJdIH0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiYWNjZXB0cyB2aWV3ZXJSZXF1ZXN0IGRlY2xhcmVkIGFmdGVyIGFub3RoZXIgdmFyaWFibGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBzeW50aCh7XG4gICAgICBjb2RlOiBgdmFyIHggPSAxLCB2aWV3ZXJSZXF1ZXN0ID0gKGV2ZW50KSA9PiAoeyBzdGF0dXNDb2RlOiA0MDEgfSk7YCxcbiAgICB9KS5oYW5kbGVyRm9yKFwiX25leHQvc3RhdGljKlwiKTtcbiAgICBleHBlY3Qoc3RhdHVzKGF3YWl0IGhhbmRsZXIocmVxdWVzdChcIi94XCIpKSkpLnRvQmUoNDAxKTtcbiAgfSk7XG5cbiAgaXQoXCJhY2NlcHRzIHZpZXdlclJlcXVlc3QgZGVmaW5lZCBhcyBhIGNvbnN0IGFycm93IGZ1bmN0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gc3ludGgoe1xuICAgICAgY29kZTogYGNvbnN0IHZpZXdlclJlcXVlc3QgPSBhc3luYyAoZXZlbnQpID0+ICh7IHN0YXR1c0NvZGU6IDQwMSB9KTtgLFxuICAgIH0pLmhhbmRsZXJGb3IoXCJfbmV4dC9zdGF0aWMqXCIpO1xuICAgIGV4cGVjdChzdGF0dXMoYXdhaXQgaGFuZGxlcihyZXF1ZXN0KFwiL3hcIikpKSkudG9CZSg0MDEpO1xuICB9KTtcblxuICBpdChcInJ1bnMgYmVmb3JlIHRoZSByZXBlYXRlZC1zbGFzaCByZWRpcmVjdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gT3RoZXJ3aXNlIGAvYS8vYmAgd291bGQgYW5zd2VyIDMwOCB0byBhIHZpZXdlciB3aG8gbmV2ZXIgYXV0aGVudGljYXRlZC5cbiAgICBjb25zdCBoYW5kbGVyID0gc3ludGgoeyBjb2RlOiBCQVNJQ19BVVRIIH0pLmhhbmRsZXJGb3IoXCIqXCIpO1xuICAgIGV4cGVjdChzdGF0dXMoYXdhaXQgaGFuZGxlcihyZXF1ZXN0KFwiL2EvL2JcIikpKSkudG9CZSg0MDEpO1xuICAgIGV4cGVjdChzdGF0dXMoYXdhaXQgaGFuZGxlcihyZXF1ZXN0KFwiL2EvL2JcIiwgQVVUSE9SSVpFRCkpKSkudG9CZSgzMDgpO1xuICB9KTtcblxuICBpdChcImFzc29jaWF0ZXMgdGhlIHN0b3JlIHdpdGggZXZlcnkgZnVuY3Rpb24gaXQgcnVucyBpblwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBiZWhhdmlvcnMsIGZ1bmN0aW9uRm9yLCBmdW5jdGlvbnMgfSA9IHN5bnRoKHtcbiAgICAgIGNvZGU6IEJBU0lDX0FVVEgsXG4gICAgICBrZXlWYWx1ZVN0b3JlOiB0cnVlLFxuICAgICAgYXNzZXRQcmVmaXg6IFwiL2NkblwiLFxuICAgIH0pO1xuICAgIGV4cGVjdChPYmplY3Qua2V5cyhmdW5jdGlvbnMpKS50b0hhdmVMZW5ndGgoMyk7XG4gICAgZm9yIChjb25zdCB7IFBhdGhQYXR0ZXJuIH0gb2YgYmVoYXZpb3JzKSB7XG4gICAgICBjb25zdCB7IEZ1bmN0aW9uQ29uZmlnIH0gPSBmdW5jdGlvbkZvcihQYXRoUGF0dGVybik7XG4gICAgICBleHBlY3QoRnVuY3Rpb25Db25maWcuUnVudGltZSkudG9CZShcImNsb3VkZnJvbnQtanMtMi4wXCIpO1xuICAgICAgZXhwZWN0KEZ1bmN0aW9uQ29uZmlnLktleVZhbHVlU3RvcmVBc3NvY2lhdGlvbnMpLnRvRXF1YWwoW1xuICAgICAgICB7IEtleVZhbHVlU3RvcmVBUk46IHsgXCJGbjo6R2V0QXR0XCI6IFtleHBlY3QuYW55KFN0cmluZyksIFwiQXJuXCJdIH0gfSxcbiAgICAgIF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBjcmVkZW50aWFscyBmcm9tIHRoZSBLZXlWYWx1ZVN0b3JlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gc3ludGgoe1xuICAgICAga2V5VmFsdWVTdG9yZTogdHJ1ZSxcbiAgICAgIGNvZGU6IGBpbXBvcnQgY2YgZnJvbSBcImNsb3VkZnJvbnRcIjtcbiAgICAgICAgY29uc3Qga3ZzID0gY2Yua3ZzKCk7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIHZpZXdlclJlcXVlc3QoZXZlbnQpIHtcbiAgICAgICAgICBjb25zdCBhdXRoID0gZXZlbnQucmVxdWVzdC5oZWFkZXJzLmF1dGhvcml6YXRpb247XG4gICAgICAgICAgaWYgKGF1dGggJiYgYXV0aC52YWx1ZSA9PT0gXCJCYXNpYyBcIiArIChhd2FpdCBrdnMuZ2V0KFwiYmFzaWMtYXV0aFwiKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgc3RhdHVzQ29kZTogNDAxLCBzdGF0dXNEZXNjcmlwdGlvbjogXCJVbmF1dGhvcml6ZWRcIiB9O1xuICAgICAgICB9XG4gICAgICBgLFxuICAgIH0pLmhhbmRsZXJGb3IoXCJfbmV4dC9zdGF0aWMqXCIsIHsgXCJiYXNpYy1hdXRoXCI6IFwiZFhObGNqcHdZWE56XCIgfSk7XG4gICAgZXhwZWN0KHN0YXR1cyhhd2FpdCBoYW5kbGVyKHJlcXVlc3QoXCIveFwiKSkpKS50b0JlKDQwMSk7XG4gICAgZXhwZWN0KFxuICAgICAgKChhd2FpdCBoYW5kbGVyKHJlcXVlc3QoXCIveFwiLCBBVVRIT1JJWkVEKSkpIGFzIEZ1bmN0aW9uUmVxdWVzdCkudXJpLFxuICAgICkudG9CZShcIi94XCIpO1xuICB9KTtcblxuICBpdChcInJlZnVzZXMgYSBLZXlWYWx1ZVN0b3JlIHdpdGhvdXQgY29kZSB0byByZWFkIGl0XCIsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gc3ludGgoeyBrZXlWYWx1ZVN0b3JlOiB0cnVlIH0pKS50b1Rocm93KFxuICAgICAgL2B2aWV3ZXJSZXF1ZXN0S2V5VmFsdWVTdG9yZWAgLiogbmVlZHMgYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVgLyxcbiAgICApO1xuICB9KTtcblxuICBpdChcImNhbid0IGtlZXAgYSB2aWV3ZXIncyB4LWZvcndhcmRlZC1ob3N0IHBhc3QgY2RrLW5leHRqcydzIG92ZXJ3cml0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHN5bnRoKHtcbiAgICAgIGNvZGU6IGBcbiAgICAgICAgZnVuY3Rpb24gdmlld2VyUmVxdWVzdChldmVudCkge1xuICAgICAgICAgIGV2ZW50LnJlcXVlc3QuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl0gPSB7IHZhbHVlOiBcImV2aWwudGVzdFwiIH07XG4gICAgICAgICAgcmV0dXJuIGV2ZW50LnJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgfSkuaGFuZGxlckZvcihcIipcIik7XG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IGhhbmRsZXIocmVxdWVzdChcIi94XCIpKSkgYXMgRnVuY3Rpb25SZXF1ZXN0O1xuICAgIGV4cGVjdChyZXN1bHQuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl0udmFsdWUpLnRvQmUoXCJhLnRlc3RcIik7XG4gIH0pO1xuXG4gIGl0KFwiY2FycmllcyBvbiB3aXRoIGEgcmVxdWVzdCBpdCByZXR1cm5zIGFzIGEgbmV3IG9iamVjdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHN5bnRoKHtcbiAgICAgIGNvZGU6IGBcbiAgICAgICAgZnVuY3Rpb24gdmlld2VyUmVxdWVzdChldmVudCkge1xuICAgICAgICAgIHJldHVybiB7IHVyaTogXCIveVwiLCBxdWVyeXN0cmluZzoge30sIGhlYWRlcnM6IGV2ZW50LnJlcXVlc3QuaGVhZGVycyB9O1xuICAgICAgICB9XG4gICAgICBgLFxuICAgIH0pLmhhbmRsZXJGb3IoXCJfbmV4dC9zdGF0aWMqXCIpO1xuICAgIGV4cGVjdCgoKGF3YWl0IGhhbmRsZXIocmVxdWVzdChcIi94XCIpKSkgYXMgRnVuY3Rpb25SZXF1ZXN0KS51cmkpLnRvQmUoXCIveVwiKTtcbiAgfSk7XG5cbiAgaXQoXCJydW5zIGluc2lkZSB0aGUgYXNzZXRQcmVmaXggcmV3cml0ZSwgaW4gcGxhY2Ugb2YgdGhlIHN0YXRpYyBmdW5jdGlvblwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBiZWhhdmlvcnMsIGhhbmRsZXJGb3IgfSA9IHN5bnRoKHtcbiAgICAgIGNvZGU6IEJBU0lDX0FVVEgsXG4gICAgICBhc3NldFByZWZpeDogXCIvY2RuXCIsXG4gICAgfSk7XG4gICAgY29uc3QgcHJlZml4ZWQgPSBiZWhhdmlvcnMuZmluZChcbiAgICAgIChpdCkgPT4gaXQuUGF0aFBhdHRlcm4gPT09IFwiL2Nkbi9fbmV4dC9zdGF0aWMqXCIsXG4gICAgKSE7XG4gICAgLy8gT25lIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIHBlciBiZWhhdmlvciwgb3IgQ2xvdWRGcm9udCByZWplY3RzIGl0LlxuICAgIGV4cGVjdChcbiAgICAgIHByZWZpeGVkLkZ1bmN0aW9uQXNzb2NpYXRpb25zIS5maWx0ZXIoXG4gICAgICAgIChpdCkgPT4gaXQuRXZlbnRUeXBlID09PSBcInZpZXdlci1yZXF1ZXN0XCIsXG4gICAgICApLFxuICAgICkudG9IYXZlTGVuZ3RoKDEpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyRm9yKFwiL2Nkbi9fbmV4dC9zdGF0aWMqXCIpO1xuICAgIGV4cGVjdChzdGF0dXMoYXdhaXQgaGFuZGxlcihyZXF1ZXN0KFwiL2Nkbi9fbmV4dC9zdGF0aWMvYS5qc1wiKSkpKS50b0JlKDQwMSk7XG4gICAgY29uc3QgcGFzc2VkID0gKGF3YWl0IGhhbmRsZXIoXG4gICAgICByZXF1ZXN0KFwiL2Nkbi9fbmV4dC9zdGF0aWMvYS5qc1wiLCBBVVRIT1JJWkVEKSxcbiAgICApKSBhcyBGdW5jdGlvblJlcXVlc3Q7XG4gICAgZXhwZWN0KHBhc3NlZC51cmkpLnRvQmUoXCIvX25leHQvc3RhdGljL2EuanNcIik7XG4gIH0pO1xuXG4gIGl0KFwiYWRkcyBubyBmdW5jdGlvbnMgd2hlbiB1bnNldFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBiZWhhdmlvcnMsIGZ1bmN0aW9ucyB9ID0gc3ludGgoKTtcbiAgICBjb25zdCBzdGF0aWNCZWhhdmlvciA9IGJlaGF2aW9ycy5maW5kKFxuICAgICAgKGl0KSA9PiBpdC5QYXRoUGF0dGVybiA9PT0gXCJfbmV4dC9zdGF0aWMqXCIsXG4gICAgKSE7XG4gICAgZXhwZWN0KHN0YXRpY0JlaGF2aW9yLkZ1bmN0aW9uQXNzb2NpYXRpb25zKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgY29uc3QgW2ZuLCAuLi5yZXN0XSA9IE9iamVjdC52YWx1ZXMoZnVuY3Rpb25zKS5tYXAoKGl0KSA9PiBpdC5Qcm9wZXJ0aWVzKTtcbiAgICBleHBlY3QocmVzdCkudG9IYXZlTGVuZ3RoKDApO1xuICAgIC8vIFRoZSBtYXJrZXIgaXMgZHJvcHBlZCwgbm90IGxlZnQgaW4gdGhlIGRlcGxveWVkIGZ1bmN0aW9uLlxuICAgIGV4cGVjdChmbi5GdW5jdGlvbkNvZGUpLnRvTWF0Y2goXG4gICAgICAvXlxccyphc3luYyBmdW5jdGlvbiBoYW5kbGVyXFwoZXZlbnRcXCkgXFx7XFxuXFxzKmNvbnN0IHJlcXVlc3QvLFxuICAgICk7XG4gICAgZXhwZWN0KGZuLkZ1bmN0aW9uQ29uZmlnLktleVZhbHVlU3RvcmVBc3NvY2lhdGlvbnMpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQuZWFjaChbZmFsc2UsIHRydWVdKShcbiAgICBcInJ1bnMgZXZlcnkgY2RrLW5leHRqcyBmdW5jdGlvbiBvbiBjbG91ZGZyb250LWpzLTIuMCAoaG9vayBzZXQ6ICVzKVwiLFxuICAgIChob29rZWQpID0+IHtcbiAgICAgIGNvbnN0IHsgZnVuY3Rpb25zIH0gPSBzeW50aCh7XG4gICAgICAgIGNvZGU6IGhvb2tlZCA/IEJBU0lDX0FVVEggOiB1bmRlZmluZWQsXG4gICAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG5cIixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcnVudGltZXMgPSBPYmplY3QudmFsdWVzKGZ1bmN0aW9ucykubWFwKFxuICAgICAgICAoaXQpID0+IGl0LlByb3BlcnRpZXMuRnVuY3Rpb25Db25maWcuUnVudGltZSxcbiAgICAgICk7XG4gICAgICBleHBlY3QocnVudGltZXMpLnRvSGF2ZUxlbmd0aChob29rZWQgPyAzIDogMik7XG4gICAgICBleHBlY3QobmV3IFNldChydW50aW1lcykpLnRvRXF1YWwobmV3IFNldChbXCJjbG91ZGZyb250LWpzLTIuMFwiXSkpO1xuICAgIH0sXG4gICk7XG5cbiAgaXQuZWFjaChbXCJkeW5hbWljQmVoYXZpb3JPcHRpb25zXCIsIFwiaW1hZ2VCZWhhdmlvck9wdGlvbnNcIl0gYXMgY29uc3QpKFxuICAgIFwicmVmdXNlcyBhICVzIG92ZXJyaWRlIHRoYXQgY2xhaW1zIHZpZXdlci1yZXF1ZXN0IG9uIEdsb2JhbCBDb250YWluZXJzXCIsXG4gICAgKG92ZXJyaWRlTmFtZSkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIHN5bnRoKHtcbiAgICAgICAgICBjb2RlOiBCQVNJQ19BVVRILFxuICAgICAgICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlMsXG4gICAgICAgICAgb3ZlcnJpZGVzOiAoc3RhY2spID0+ICh7XG4gICAgICAgICAgICBbb3ZlcnJpZGVOYW1lXToge1xuICAgICAgICAgICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbjogbmV3IENsb3VkRnJvbnRGdW5jdGlvbihzdGFjaywgXCJVc2VyRm5cIiwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShcbiAgICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHsgcmV0dXJuIGV2ZW50LnJlcXVlc3Q7IH1cIixcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgICkudG9UaHJvdyhcbiAgICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgICBgb3ZlcnJpZGVzXFxcXC4ke292ZXJyaWRlTmFtZX1cXFxcLmZ1bmN0aW9uQXNzb2NpYXRpb25zLip2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcblxuICBpdChcInJlZnVzZXMgYSBkaXN0cmlidXRpb25Qcm9wcy5kZWZhdWx0QmVoYXZpb3Igb3ZlcnJpZGVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgc3ludGgoe1xuICAgICAgICBjb2RlOiBCQVNJQ19BVVRILFxuICAgICAgICBvdmVycmlkZXM6ICgpID0+ICh7XG4gICAgICAgICAgZGlzdHJpYnV0aW9uUHJvcHM6IHtcbiAgICAgICAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICAgICAgICBvcmlnaW46IG5ldyBIdHRwT3JpZ2luKFwiZXhhbXBsZS5jb21cIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgKS50b1Rocm93KC9vdmVycmlkZXNcXC5kaXN0cmlidXRpb25Qcm9wc1xcLmRlZmF1bHRCZWhhdmlvci8pO1xuICB9KTtcblxuICBpdChcImxldHMgYSBiYXNlUGF0aCBhcHAgcmVwbGFjZSB0aGUgZGVmYXVsdCBiZWhhdmlvclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+XG4gICAgICBzeW50aCh7XG4gICAgICAgIGNvZGU6IEJBU0lDX0FVVEgsXG4gICAgICAgIGJhc2VQYXRoOiBcIi9hcHBcIixcbiAgICAgICAgb3ZlcnJpZGVzOiAoKSA9PiAoe1xuICAgICAgICAgIGRpc3RyaWJ1dGlvblByb3BzOiB7XG4gICAgICAgICAgICBkZWZhdWx0QmVoYXZpb3I6IHsgb3JpZ2luOiBuZXcgSHR0cE9yaWdpbihcImV4YW1wbGUuY29tXCIpIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgY2RrLW5leHRqcydzIGNvZGUgb3V0IG9mIHRoZSBkZXBsb3llZCBpbmRlbnRhdGlvblwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBmdW5jdGlvbkZvciB9ID0gc3ludGgoeyBjb2RlOiBCQVNJQ19BVVRIIH0pO1xuICAgIGNvbnN0IGNvZGUgPSBmdW5jdGlvbkZvcihcIipcIikuRnVuY3Rpb25Db2RlIGFzIHN0cmluZztcbiAgICBjb25zdCBvd24gPSBjb2RlLnNsaWNlKGNvZGUuaW5kZXhPZihcImFzeW5jIGZ1bmN0aW9uIGhhbmRsZXJcIikpO1xuICAgIGV4cGVjdChvd24pLm5vdC50b01hdGNoKC9eWyBcXHRdL20pO1xuICB9KTtcblxuICBpdChcIndhcm5zLCByYXRoZXIgdGhhbiBtZWFzdXJlcywgd2hlbiB0aGUgY29kZSBjb250YWlucyBhIHRva2VuXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrIH0gPSBzeW50aCh7XG4gICAgICBjb2RlOiBgZnVuY3Rpb24gdmlld2VyUmVxdWVzdChldmVudCkgeyByZXR1cm4gJHtMYXp5LnN0cmluZyh7IHByb2R1Y2U6ICgpID0+ICdcInhcIicgfSl9OyB9YCxcbiAgICB9KTtcbiAgICBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spLmhhc1dhcm5pbmcoXG4gICAgICBcIipcIixcbiAgICAgIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJjb250YWlucyBhIENESyB0b2tlblwiKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcInJlZnVzZXMgYSBzdGF0aWMgb3ZlcnJpZGUgdGhhdCBhbHJlYWR5IGNsYWltcyB2aWV3ZXItcmVxdWVzdFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+XG4gICAgICBzeW50aCh7XG4gICAgICAgIGNvZGU6IEJBU0lDX0FVVEgsXG4gICAgICAgIG92ZXJyaWRlczogKHN0YWNrKSA9PiAoe1xuICAgICAgICAgIHN0YXRpY0JlaGF2aW9yT3B0aW9uczoge1xuICAgICAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBDbG91ZEZyb250RnVuY3Rpb24oc3RhY2ssIFwiVXNlckZuXCIsIHtcbiAgICAgICAgICAgICAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKFxuICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHsgcmV0dXJuIGV2ZW50LnJlcXVlc3Q7IH1cIixcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgKS50b1Rocm93KC9vdmVycmlkZXNcXC5zdGF0aWNCZWhhdmlvck9wdGlvbnNcXC5mdW5jdGlvbkFzc29jaWF0aW9ucy8pO1xuICB9KTtcblxuICBpdC5lYWNoKFtcbiAgICBbXCJubyB2aWV3ZXJSZXF1ZXN0XCIsIFwidmFyIHggPSAxO1wiLCAvbXVzdCBkZWZpbmUgYHZpZXdlclJlcXVlc3RcXChldmVudFxcKWAvXSxcbiAgICAuLi5bXG4gICAgICBcImZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHt9XCIsXG4gICAgICBcImZ1bmN0aW9uKiBoYW5kbGVyKGV2ZW50KSB7fVwiLFxuICAgICAgXCJjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiBldmVudC5yZXF1ZXN0O1wiLFxuICAgICAgXCJsZXQgYSA9IDEsIGhhbmRsZXIgPSAyO1wiLFxuICAgICAgXCJ2YXIgaGFuZGxlciA9IChldmVudCkgPT4gZXZlbnQucmVxdWVzdDtcIixcbiAgICAgIFwidmFyIHsgaGFuZGxlciB9ID0geyBoYW5kbGVyOiAoZXZlbnQpID0+IGV2ZW50LnJlcXVlc3QgfTtcIixcbiAgICAgICdnbG9iYWxUaGlzW1wiaGFuZGxlclwiXSA9IChldmVudCkgPT4gZXZlbnQucmVxdWVzdDsnLFxuICAgICAgXCJ2YXIgY2RrTmV4dGpzSGFuZGxlcjsgaGFuZGxlciA9IGNka05leHRqc0hhbmRsZXI7XCIsXG4gICAgXS5tYXAoKGRlY2xhcmF0aW9uKTogW3N0cmluZywgc3RyaW5nLCBSZWdFeHBdID0+IFtcbiAgICAgIGBoYW5kbGVyIGluIFxcYCR7ZGVjbGFyYXRpb259XFxgYCxcbiAgICAgIGAke2RlY2xhcmF0aW9ufVxcbmZ1bmN0aW9uIHZpZXdlclJlcXVlc3QoZXZlbnQpIHt9YCxcbiAgICAgIC91c2VzIHRoZSBuYW1lIGBoYW5kbGVyYC8sXG4gICAgXSksXG4gICAgW1xuICAgICAgXCJ2aWV3ZXJSZXF1ZXN0IG9ubHkgY29tcGFyZWQsIG5ldmVyIGRlY2xhcmVkXCIsXG4gICAgICAnY29uc3Qgb2sgPSB0eXBlb2Ygdmlld2VyUmVxdWVzdCA9PT0gXCJmdW5jdGlvblwiOycsXG4gICAgICAvbXVzdCBkZWZpbmUgYHZpZXdlclJlcXVlc3RcXChldmVudFxcKWAvLFxuICAgIF0sXG4gICAgW1xuICAgICAgXCJ2aWV3ZXJSZXF1ZXN0IG9ubHkgYXNzaWduZWQgYXMgYSBwcm9wZXJ0eVwiLFxuICAgICAgXCJjb25zdCBjZmcgPSB7fTsgY2ZnLnZpZXdlclJlcXVlc3QgPSBmdW5jdGlvbiAoZXZlbnQpIHt9O1wiLFxuICAgICAgL211c3QgZGVmaW5lIGB2aWV3ZXJSZXF1ZXN0XFwoZXZlbnRcXClgLyxcbiAgICBdLFxuICAgIFtcbiAgICAgIFwibW9yZSB0aGFuIGZpdHMgaW4gYSBDbG91ZEZyb250IEZ1bmN0aW9uXCIsXG4gICAgICBgZnVuY3Rpb24gdmlld2VyUmVxdWVzdChldmVudCkge30gLyogJHtcInhcIi5yZXBlYXQoMTAgKiAxMDI0KX0gKi9gLFxuICAgICAgL292ZXIgQ2xvdWRGcm9udCdzIGxpbWl0IG9mIDEwMjQwLyxcbiAgICBdLFxuICBdKShcInJlZnVzZXMgY29kZSB3aXRoICVzXCIsIChfbmFtZSwgY29kZSwgZXJyb3IpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gc3ludGgoeyBjb2RlIH0pKS50b1Rocm93KGVycm9yKTtcbiAgfSk7XG59KTtcbiJdfQ==