cdk-nextjs 0.5.16 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.jsii +290 -183
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +244 -4
  4. package/README.md +2 -2
  5. package/docs/breaking-changes.md +53 -0
  6. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +3 -0
  7. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  8. package/lib/image-optimization/handler-utils.d.ts +7 -5
  9. package/lib/image-optimization/handler-utils.js +17 -11
  10. package/lib/image-optimization/handler-utils.test.js +42 -6
  11. package/lib/image-optimization/handler.mjs +19 -5
  12. package/lib/nextjs-api.d.ts +26 -0
  13. package/lib/nextjs-api.js +41 -13
  14. package/lib/nextjs-api.test.d.ts +1 -0
  15. package/lib/nextjs-api.test.js +144 -0
  16. package/lib/nextjs-build/nextjs-build.d.ts +8 -0
  17. package/lib/nextjs-build/nextjs-build.js +12 -2
  18. package/lib/nextjs-cache.js +1 -1
  19. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  20. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  21. package/lib/nextjs-compute/nextjs-image-function.d.ts +10 -0
  22. package/lib/nextjs-compute/nextjs-image-function.js +3 -2
  23. package/lib/nextjs-distribution.d.ts +11 -0
  24. package/lib/nextjs-distribution.js +16 -10
  25. package/lib/nextjs-post-deploy.js +1 -1
  26. package/lib/nextjs-static-assets.d.ts +18 -0
  27. package/lib/nextjs-static-assets.js +33 -6
  28. package/lib/nextjs-static-assets.test.d.ts +1 -0
  29. package/lib/nextjs-static-assets.test.js +58 -0
  30. package/lib/root-constructs/nextjs-base-construct.d.ts +38 -1
  31. package/lib/root-constructs/nextjs-base-construct.js +41 -3
  32. package/lib/root-constructs/nextjs-global-containers.d.ts +6 -1
  33. package/lib/root-constructs/nextjs-global-containers.js +11 -5
  34. package/lib/root-constructs/nextjs-global-functions.d.ts +5 -0
  35. package/lib/root-constructs/nextjs-global-functions.js +10 -4
  36. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  37. package/lib/root-constructs/nextjs-regional-functions.js +5 -5
  38. package/lib/utils/base-path.d.ts +40 -0
  39. package/lib/utils/base-path.js +123 -0
  40. package/lib/utils/base-path.test.d.ts +1 -0
  41. package/lib/utils/base-path.test.js +163 -0
  42. package/package.json +1 -1
@@ -37,7 +37,7 @@ describe("fetchFromS3", () => {
37
37
  Key: "base/foo.png",
38
38
  });
39
39
  });
40
- it("keeps a single basePath prefix when the url already includes it", async () => {
40
+ it("applies the key prefix once when the url already includes the app basePath", async () => {
41
41
  mockSend.mockResolvedValue({
42
42
  Body: asyncIterableFrom([Buffer.from("data")]),
43
43
  ContentType: "image/png",
@@ -46,11 +46,11 @@ describe("fetchFromS3", () => {
46
46
  // next-image-loader bakes "/base" into the href for statically imported
47
47
  // images, and NextjsStaticAssets uploads under the same prefix, so the
48
48
  // key must carry it exactly once.
49
- await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/base/_next/static/media/a.png", "/base");
49
+ await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/base/_next/static/media/a.png", "/base", "/base");
50
50
  const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
51
51
  expect(params.Key).toBe("base/_next/static/media/a.png");
52
52
  });
53
- it("adds the basePath prefix when the url omits it", async () => {
53
+ it("applies the key prefix when the url omits the app basePath", async () => {
54
54
  mockSend.mockResolvedValue({
55
55
  Body: asyncIterableFrom([Buffer.from("data")]),
56
56
  ContentType: "image/png",
@@ -59,7 +59,7 @@ describe("fetchFromS3", () => {
59
59
  // Plain string paths (e.g. `<Image src="/static/foo.jpg">`) are passed
60
60
  // through by next/image as written, without basePath baked in, but the
61
61
  // S3 key still has it.
62
- await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/static/foo.jpg", "/base");
62
+ await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/static/foo.jpg", "/base", "/base");
63
63
  const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
64
64
  expect(params.Key).toBe("base/static/foo.jpg");
65
65
  });
@@ -71,10 +71,46 @@ describe("fetchFromS3", () => {
71
71
  });
72
72
  // "/basement" merely shares a prefix with basePath "/base"; treating it
73
73
  // as a match would produce the key "base/ment/logo.png".
74
- await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/basement/logo.png", "/base");
74
+ await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/basement/logo.png", "/base", "/base");
75
75
  const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
76
76
  expect(params.Key).toBe("base/basement/logo.png");
77
77
  });
78
+ // regression test: the Next.js app's own `basePath` (e.g. set to match an
79
+ // API Gateway stage) and the CDK `NextjsStaticAssets` `basePath` prop (key
80
+ // namespacing) are unrelated and don't have to match. A deployment that
81
+ // only sets the former must not leak it into the S3 key.
82
+ it("doesn't apply nextBasePath as a key prefix when the key prefix differs", async () => {
83
+ mockSend.mockResolvedValue({
84
+ Body: asyncIterableFrom([Buffer.from("data")]),
85
+ ContentType: "image/png",
86
+ ETag: '"abc123"',
87
+ });
88
+ await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/static/nextjs-icon-light-background.png", "/prod", "");
89
+ const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
90
+ expect(params.Key).toBe("static/nextjs-icon-light-background.png");
91
+ });
92
+ it("strips nextBasePath from a baked-in href before applying a different key prefix", async () => {
93
+ mockSend.mockResolvedValue({
94
+ Body: asyncIterableFrom([Buffer.from("data")]),
95
+ ContentType: "image/png",
96
+ ETag: '"abc123"',
97
+ });
98
+ await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/prod/_next/static/media/imported-logo.png", "/prod", "");
99
+ const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
100
+ expect(params.Key).toBe("_next/static/media/imported-logo.png");
101
+ });
102
+ it("doesn't double the separator when the key prefix has a trailing slash", async () => {
103
+ mockSend.mockResolvedValue({
104
+ Body: asyncIterableFrom([Buffer.from("data")]),
105
+ ContentType: "image/png",
106
+ ETag: '"abc123"',
107
+ });
108
+ // BucketDeployment collapses the trailing slash when uploading, so the
109
+ // object is at "base/static/foo.jpg", not "base//static/foo.jpg".
110
+ await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/static/foo.jpg", "", "/base/");
111
+ const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
112
+ expect(params.Key).toBe("base/static/foo.jpg");
113
+ });
78
114
  it("returns the concatenated buffer, content type, and etag", async () => {
79
115
  mockSend.mockResolvedValue({
80
116
  Body: asyncIterableFrom([Buffer.from("hel"), Buffer.from("lo")]),
@@ -139,4 +175,4 @@ describe("resolveErrorResponse", () => {
139
175
  });
140
176
  });
141
177
  });
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci11dGlscy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltYWdlLW9wdGltaXphdGlvbi9oYW5kbGVyLXV0aWxzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRWhDLGtEQUFnRTtBQUNoRSw0RUFBaUU7QUFDakUsbURBSXlCO0FBRXpCLFNBQVMsaUJBQWlCLENBQUMsTUFBb0I7SUFDN0MsT0FBTztRQUNMLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixPQUFPO2dCQUNMLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUNmLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTTtvQkFDZixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDckMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2FBQ3ZDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxvQkFBUSxDQUFDLEVBQUUsQ0FBd0IsQ0FBQztJQUVuRCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2IsRUFBMkMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQzdELFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRSxRQUFR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QUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcblxuaW1wb3J0IHsgR2V0T2JqZWN0Q29tbWFuZCwgUzNDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgeyBJbWFnZUVycm9yIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCI7XG5pbXBvcnQge1xuICBmZXRjaEZyb21TMyxcbiAgZ2V0RmlsZU5hbWVXaXRoRXh0ZW5zaW9uLFxuICByZXNvbHZlRXJyb3JSZXNwb25zZSxcbn0gZnJvbSBcIi4vaGFuZGxlci11dGlsc1wiO1xuXG5mdW5jdGlvbiBhc3luY0l0ZXJhYmxlRnJvbShjaHVua3M6IFVpbnQ4QXJyYXlbXSk6IEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4ge1xuICByZXR1cm4ge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PlxuICAgICAgICAgIGkgPCBjaHVua3MubGVuZ3RoXG4gICAgICAgICAgICA/IHsgZG9uZTogZmFsc2UsIHZhbHVlOiBjaHVua3NbaSsrXSB9XG4gICAgICAgICAgICA6IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5kZXNjcmliZShcImZldGNoRnJvbVMzXCIsICgpID0+IHtcbiAgY29uc3QgbW9ja1NlbmQgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IHMzID0gbmV3IFMzQ2xpZW50KHt9KSBhcyB1bmtub3duIGFzIFMzQ2xpZW50O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIChzMyBhcyB1bmtub3duIGFzIHsgc2VuZDogdHlwZW9mIG1vY2tTZW5kIH0pLnNlbmQgPSBtb2NrU2VuZDtcbiAgICBtb2NrU2VuZC5tb2NrUmVzZXQoKTtcbiAgfSk7XG5cbiAgaXQoXCJzdHJpcHMgdGhlIGxlYWRpbmcgc2xhc2ggYW5kIHVzZXMgdXJsIGFzLWlzIGZvciB0aGUgUzMga2V5XCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJkYXRhXCIpXSksXG4gICAgICBDb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIEVUYWc6ICdcImFiYzEyM1wiJyxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9iYXNlL2Zvby5wbmdcIiwgXCJcIik7XG5cbiAgICBjb25zdCBwYXJhbXMgPSAoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXTtcbiAgICBleHBlY3QocGFyYW1zKS50b0VxdWFsKHtcbiAgICAgIEJ1Y2tldDogXCJteS1idWNrZXRcIixcbiAgICAgIEtleTogXCJiYXNlL2Zvby5wbmdcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyBhIHNpbmdsZSBiYXNlUGF0aCBwcmVmaXggd2hlbiB0aGUgdXJsIGFscmVhZHkgaW5jbHVkZXMgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImRhdGFcIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBcImltYWdlL3BuZ1wiLFxuICAgICAgRVRhZzogJ1wiYWJjMTIzXCInLFxuICAgIH0pO1xuXG4gICAgLy8gbmV4dC1pbWFnZS1sb2FkZXIgYmFrZXMgXCIvYmFzZVwiIGludG8gdGhlIGhyZWYgZm9yIHN0YXRpY2FsbHkgaW1wb3J0ZWRcbiAgICAvLyBpbWFnZXMsIGFuZCBOZXh0anNTdGF0aWNBc3NldHMgdXBsb2FkcyB1bmRlciB0aGUgc2FtZSBwcmVmaXgsIHNvIHRoZVxuICAgIC8vIGtleSBtdXN0IGNhcnJ5IGl0IGV4YWN0bHkgb25jZS5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL2Jhc2UvX25leHQvc3RhdGljL21lZGlhL2EucG5nXCIsXG4gICAgICBcIi9iYXNlXCIsXG4gICAgKTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IChHZXRPYmplY3RDb21tYW5kIGFzIHVua25vd24gYXMgamVzdC5Nb2NrKS5tb2NrLmNhbGxzWzBdWzBdO1xuICAgIGV4cGVjdChwYXJhbXMuS2V5KS50b0JlKFwiYmFzZS9fbmV4dC9zdGF0aWMvbWVkaWEvYS5wbmdcIik7XG4gIH0pO1xuXG4gIGl0KFwiYWRkcyB0aGUgYmFzZVBhdGggcHJlZml4IHdoZW4gdGhlIHVybCBvbWl0cyBpdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiZGF0YVwiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICBFVGFnOiAnXCJhYmMxMjNcIicsXG4gICAgfSk7XG5cbiAgICAvLyBQbGFpbiBzdHJpbmcgcGF0aHMgKGUuZy4gYDxJbWFnZSBzcmM9XCIvc3RhdGljL2Zvby5qcGdcIj5gKSBhcmUgcGFzc2VkXG4gICAgLy8gdGhyb3VnaCBieSBuZXh0L2ltYWdlIGFzIHdyaXR0ZW4sIHdpdGhvdXQgYmFzZVBhdGggYmFrZWQgaW4sIGJ1dCB0aGVcbiAgICAvLyBTMyBrZXkgc3RpbGwgaGFzIGl0LlxuICAgIGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9zdGF0aWMvZm9vLmpwZ1wiLCBcIi9iYXNlXCIpO1xuXG4gICAgY29uc3QgcGFyYW1zID0gKEdldE9iamVjdENvbW1hbmQgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2suY2FsbHNbMF1bMF07XG4gICAgZXhwZWN0KHBhcmFtcy5LZXkpLnRvQmUoXCJiYXNlL3N0YXRpYy9mb28uanBnXCIpO1xuICB9KTtcblxuICBpdChcIm9ubHkgbWF0Y2hlcyBiYXNlUGF0aCBvbiBhIHBhdGggYm91bmRhcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImRhdGFcIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBcImltYWdlL3BuZ1wiLFxuICAgICAgRVRhZzogJ1wiYWJjMTIzXCInLFxuICAgIH0pO1xuXG4gICAgLy8gXCIvYmFzZW1lbnRcIiBtZXJlbHkgc2hhcmVzIGEgcHJlZml4IHdpdGggYmFzZVBhdGggXCIvYmFzZVwiOyB0cmVhdGluZyBpdFxuICAgIC8vIGFzIGEgbWF0Y2ggd291bGQgcHJvZHVjZSB0aGUga2V5IFwiYmFzZS9tZW50L2xvZ28ucG5nXCIuXG4gICAgYXdhaXQgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL2Jhc2VtZW50L2xvZ28ucG5nXCIsIFwiL2Jhc2VcIik7XG5cbiAgICBjb25zdCBwYXJhbXMgPSAoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXTtcbiAgICBleHBlY3QocGFyYW1zLktleSkudG9CZShcImJhc2UvYmFzZW1lbnQvbG9nby5wbmdcIik7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIGJ1ZmZlciwgY29udGVudCB0eXBlLCBhbmQgZXRhZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiaGVsXCIpLCBCdWZmZXIuZnJvbShcImxvXCIpXSksXG4gICAgICBDb250ZW50VHlwZTogXCJpbWFnZS9qcGVnXCIsXG4gICAgICBFVGFnOiAnXCJ0aGUtZXRhZ1wiJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9mb28uanBnXCIsIFwiXCIpO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5idWZmZXIudG9TdHJpbmcoKSkudG9CZShcImhlbGxvXCIpO1xuICAgIGV4cGVjdChyZXN1bHQuY29udGVudFR5cGUpLnRvQmUoXCJpbWFnZS9qcGVnXCIpO1xuICAgIGV4cGVjdChyZXN1bHQuZXRhZykudG9CZSgnXCJ0aGUtZXRhZ1wiJyk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhbiBlbXB0eSBldGFnIHdoZW4gUzMgZG9lc24ndCBwcm92aWRlIG9uZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiZGF0YVwiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IG51bGwsXG4gICAgICBFVGFnOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaEZyb21TMyhzMywgXCJteS1idWNrZXRcIiwgXCIvZm9vLnBuZ1wiLCBcIlwiKTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXRhZykudG9CZShcIlwiKTtcbiAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRUeXBlKS50b0JlTnVsbCgpO1xuICB9KTtcblxuICBpdChcInRocm93cyB3aGVuIFMzIHJldHVybnMgbm8gYm9keVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoeyBCb2R5OiB1bmRlZmluZWQgfSk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBmZXRjaEZyb21TMyhzMywgXCJteS1idWNrZXRcIiwgXCIvbWlzc2luZy5wbmdcIiwgXCJcIiksXG4gICAgKS5yZWplY3RzLnRvVGhyb3coL0VtcHR5IHJlc3BvbnNlIGZyb20gUzMvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJnZXRGaWxlTmFtZVdpdGhFeHRlbnNpb25cIiwgKCkgPT4ge1xuICBpdChcImRlcml2ZXMgZmlsZW5hbWUgYW5kIGV4dGVuc2lvbiBmcm9tIHRoZSB1cmwgYW5kIGNvbnRlbnQgdHlwZVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgZ2V0RmlsZU5hbWVXaXRoRXh0ZW5zaW9uKFwiL2Zvby9iYXIucG5nP3c9MTAwJnE9NzVcIiwgXCJpbWFnZS93ZWJwXCIpLFxuICAgICkudG9CZShcImJhci53ZWJwXCIpO1xuICB9KTtcblxuICBpdChcImZhbGxzIGJhY2sgdG8gaW1hZ2UuYmluIHdoZW4gY29udGVudFR5cGUgaXMgbWlzc2luZ1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KGdldEZpbGVOYW1lV2l0aEV4dGVuc2lvbihcIi9mb28vYmFyLnBuZ1wiLCBudWxsKSkudG9CZShcImltYWdlLmJpblwiKTtcbiAgfSk7XG5cbiAgaXQoXCJmYWxscyBiYWNrIHRvIGltYWdlLmJpbiB3aGVuIHRoZSB1cmwgaGFzIG5vIGZpbGVuYW1lIHNlZ21lbnRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChnZXRGaWxlTmFtZVdpdGhFeHRlbnNpb24oXCIvXCIsIFwiaW1hZ2UvcG5nXCIpKS50b0JlKFwiaW1hZ2UuYmluXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInJlc29sdmVFcnJvclJlc3BvbnNlXCIsICgpID0+IHtcbiAgaXQoXCJwcmVzZXJ2ZXMgdGhlIHN0YXR1cyBjb2RlIGFuZCBtZXNzYWdlIGZyb20gYW4gSW1hZ2VFcnJvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgSW1hZ2VFcnJvcig0MDAsICdcInVybFwiIHBhcmFtZXRlciBpcyBub3QgYWxsb3dlZCcpO1xuXG4gICAgZXhwZWN0KHJlc29sdmVFcnJvclJlc3BvbnNlKGVycm9yKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICBtZXNzYWdlOiAnXCJ1cmxcIiBwYXJhbWV0ZXIgaXMgbm90IGFsbG93ZWQnLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcIm1hcHMgYSBtaXNzaW5nIFMzIG9iamVjdCB0byB0aGUgc2FtZSA0MDAgTmV4dC5qcydzIG93biBsb2NhbC1pbWFnZSBmZXRjaCBwcm9kdWNlc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoXCJOb1N1Y2hLZXk6IGRvZXMgbm90IGV4aXN0XCIpO1xuICAgIGVycm9yLm5hbWUgPSBcIk5vU3VjaEtleVwiO1xuXG4gICAgZXhwZWN0KHJlc29sdmVFcnJvclJlc3BvbnNlKGVycm9yKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICBtZXNzYWdlOiBcIlRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXNuJ3QgYSB2YWxpZCBpbWFnZS5cIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJmYWxscyBiYWNrIHRvIDUwMCBmb3IgdW5yZWNvZ25pemVkIGVycm9yc1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlc29sdmVFcnJvclJlc3BvbnNlKG5ldyBFcnJvcihcImJvb21cIikpKS50b0VxdWFsKHtcbiAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgIG1lc3NhZ2U6IFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIsXG4gICAgfSk7XG4gICAgZXhwZWN0KHJlc29sdmVFcnJvclJlc3BvbnNlKFwibm90IGFuIGVycm9yXCIpKS50b0VxdWFsKHtcbiAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgIG1lc3NhZ2U6IFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIsXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci11dGlscy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltYWdlLW9wdGltaXphdGlvbi9oYW5kbGVyLXV0aWxzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRWhDLGtEQUFnRTtBQUNoRSw0RUFBaUU7QUFDakUsbURBSXlCO0FBRXpCLFNBQVMsaUJBQWlCLENBQUMsTUFBb0I7SUFDN0MsT0FBTztRQUNMLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixPQUFPO2dCQUNMLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUNmLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTTtvQkFDZixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDckMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2FBQ3ZDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxvQkFBUSxDQUFDLEVBQUUsQ0FBd0IsQ0FBQztJQUVuRCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2IsRUFBMkMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQzdELFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRSxRQUFR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QUFFLEdBQUcsRUFBRTtRQUMzRixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3JELEtBQUssQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO1FBRXpCLE1BQU0sQ0FBQyxJQUFBLG9DQUFvQixFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzFDLFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTyxFQUFFLDZDQUE2QztTQUN2RCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7UUFDbkQsTUFBTSxDQUFDLElBQUEsb0NBQW9CLEVBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUN0RCxVQUFVLEVBQUUsR0FBRztZQUNmLE9BQU8sRUFBRSx1QkFBdUI7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUEsb0NBQW9CLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkQsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsdUJBQXVCO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcblxuaW1wb3J0IHsgR2V0T2JqZWN0Q29tbWFuZCwgUzNDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgeyBJbWFnZUVycm9yIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCI7XG5pbXBvcnQge1xuICBmZXRjaEZyb21TMyxcbiAgZ2V0RmlsZU5hbWVXaXRoRXh0ZW5zaW9uLFxuICByZXNvbHZlRXJyb3JSZXNwb25zZSxcbn0gZnJvbSBcIi4vaGFuZGxlci11dGlsc1wiO1xuXG5mdW5jdGlvbiBhc3luY0l0ZXJhYmxlRnJvbShjaHVua3M6IFVpbnQ4QXJyYXlbXSk6IEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4ge1xuICByZXR1cm4ge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PlxuICAgICAgICAgIGkgPCBjaHVua3MubGVuZ3RoXG4gICAgICAgICAgICA/IHsgZG9uZTogZmFsc2UsIHZhbHVlOiBjaHVua3NbaSsrXSB9XG4gICAgICAgICAgICA6IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5kZXNjcmliZShcImZldGNoRnJvbVMzXCIsICgpID0+IHtcbiAgY29uc3QgbW9ja1NlbmQgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IHMzID0gbmV3IFMzQ2xpZW50KHt9KSBhcyB1bmtub3duIGFzIFMzQ2xpZW50O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIChzMyBhcyB1bmtub3duIGFzIHsgc2VuZDogdHlwZW9mIG1vY2tTZW5kIH0pLnNlbmQgPSBtb2NrU2VuZDtcbiAgICBtb2NrU2VuZC5tb2NrUmVzZXQoKTtcbiAgfSk7XG5cbiAgaXQoXCJzdHJpcHMgdGhlIGxlYWRpbmcgc2xhc2ggYW5kIHVzZXMgdXJsIGFzLWlzIGZvciB0aGUgUzMga2V5XCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJkYXRhXCIpXSksXG4gICAgICBDb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIEVUYWc6ICdcImFiYzEyM1wiJyxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9iYXNlL2Zvby5wbmdcIiwgXCJcIik7XG5cbiAgICBjb25zdCBwYXJhbXMgPSAoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXTtcbiAgICBleHBlY3QocGFyYW1zKS50b0VxdWFsKHtcbiAgICAgIEJ1Y2tldDogXCJteS1idWNrZXRcIixcbiAgICAgIEtleTogXCJiYXNlL2Zvby5wbmdcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJhcHBsaWVzIHRoZSBrZXkgcHJlZml4IG9uY2Ugd2hlbiB0aGUgdXJsIGFscmVhZHkgaW5jbHVkZXMgdGhlIGFwcCBiYXNlUGF0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiZGF0YVwiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICBFVGFnOiAnXCJhYmMxMjNcIicsXG4gICAgfSk7XG5cbiAgICAvLyBuZXh0LWltYWdlLWxvYWRlciBiYWtlcyBcIi9iYXNlXCIgaW50byB0aGUgaHJlZiBmb3Igc3RhdGljYWxseSBpbXBvcnRlZFxuICAgIC8vIGltYWdlcywgYW5kIE5leHRqc1N0YXRpY0Fzc2V0cyB1cGxvYWRzIHVuZGVyIHRoZSBzYW1lIHByZWZpeCwgc28gdGhlXG4gICAgLy8ga2V5IG11c3QgY2FycnkgaXQgZXhhY3RseSBvbmNlLlxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvYmFzZS9fbmV4dC9zdGF0aWMvbWVkaWEvYS5wbmdcIixcbiAgICAgIFwiL2Jhc2VcIixcbiAgICAgIFwiL2Jhc2VcIixcbiAgICApO1xuXG4gICAgY29uc3QgcGFyYW1zID0gKEdldE9iamVjdENvbW1hbmQgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2suY2FsbHNbMF1bMF07XG4gICAgZXhwZWN0KHBhcmFtcy5LZXkpLnRvQmUoXCJiYXNlL19uZXh0L3N0YXRpYy9tZWRpYS9hLnBuZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJhcHBsaWVzIHRoZSBrZXkgcHJlZml4IHdoZW4gdGhlIHVybCBvbWl0cyB0aGUgYXBwIGJhc2VQYXRoXCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJkYXRhXCIpXSksXG4gICAgICBDb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIEVUYWc6ICdcImFiYzEyM1wiJyxcbiAgICB9KTtcblxuICAgIC8vIFBsYWluIHN0cmluZyBwYXRocyAoZS5nLiBgPEltYWdlIHNyYz1cIi9zdGF0aWMvZm9vLmpwZ1wiPmApIGFyZSBwYXNzZWRcbiAgICAvLyB0aHJvdWdoIGJ5IG5leHQvaW1hZ2UgYXMgd3JpdHRlbiwgd2l0aG91dCBiYXNlUGF0aCBiYWtlZCBpbiwgYnV0IHRoZVxuICAgIC8vIFMzIGtleSBzdGlsbCBoYXMgaXQuXG4gICAgYXdhaXQgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL3N0YXRpYy9mb28uanBnXCIsIFwiL2Jhc2VcIiwgXCIvYmFzZVwiKTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IChHZXRPYmplY3RDb21tYW5kIGFzIHVua25vd24gYXMgamVzdC5Nb2NrKS5tb2NrLmNhbGxzWzBdWzBdO1xuICAgIGV4cGVjdChwYXJhbXMuS2V5KS50b0JlKFwiYmFzZS9zdGF0aWMvZm9vLmpwZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJvbmx5IG1hdGNoZXMgYmFzZVBhdGggb24gYSBwYXRoIGJvdW5kYXJ5XCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJkYXRhXCIpXSksXG4gICAgICBDb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIEVUYWc6ICdcImFiYzEyM1wiJyxcbiAgICB9KTtcblxuICAgIC8vIFwiL2Jhc2VtZW50XCIgbWVyZWx5IHNoYXJlcyBhIHByZWZpeCB3aXRoIGJhc2VQYXRoIFwiL2Jhc2VcIjsgdHJlYXRpbmcgaXRcbiAgICAvLyBhcyBhIG1hdGNoIHdvdWxkIHByb2R1Y2UgdGhlIGtleSBcImJhc2UvbWVudC9sb2dvLnBuZ1wiLlxuICAgIGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9iYXNlbWVudC9sb2dvLnBuZ1wiLCBcIi9iYXNlXCIsIFwiL2Jhc2VcIik7XG5cbiAgICBjb25zdCBwYXJhbXMgPSAoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXTtcbiAgICBleHBlY3QocGFyYW1zLktleSkudG9CZShcImJhc2UvYmFzZW1lbnQvbG9nby5wbmdcIik7XG4gIH0pO1xuXG4gIC8vIHJlZ3Jlc3Npb24gdGVzdDogdGhlIE5leHQuanMgYXBwJ3Mgb3duIGBiYXNlUGF0aGAgKGUuZy4gc2V0IHRvIG1hdGNoIGFuXG4gIC8vIEFQSSBHYXRld2F5IHN0YWdlKSBhbmQgdGhlIENESyBgTmV4dGpzU3RhdGljQXNzZXRzYCBgYmFzZVBhdGhgIHByb3AgKGtleVxuICAvLyBuYW1lc3BhY2luZykgYXJlIHVucmVsYXRlZCBhbmQgZG9uJ3QgaGF2ZSB0byBtYXRjaC4gQSBkZXBsb3ltZW50IHRoYXRcbiAgLy8gb25seSBzZXRzIHRoZSBmb3JtZXIgbXVzdCBub3QgbGVhayBpdCBpbnRvIHRoZSBTMyBrZXkuXG4gIGl0KFwiZG9lc24ndCBhcHBseSBuZXh0QmFzZVBhdGggYXMgYSBrZXkgcHJlZml4IHdoZW4gdGhlIGtleSBwcmVmaXggZGlmZmVyc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiZGF0YVwiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICBFVGFnOiAnXCJhYmMxMjNcIicsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3N0YXRpYy9uZXh0anMtaWNvbi1saWdodC1iYWNrZ3JvdW5kLnBuZ1wiLFxuICAgICAgXCIvcHJvZFwiLFxuICAgICAgXCJcIixcbiAgICApO1xuXG4gICAgY29uc3QgcGFyYW1zID0gKEdldE9iamVjdENvbW1hbmQgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2suY2FsbHNbMF1bMF07XG4gICAgZXhwZWN0KHBhcmFtcy5LZXkpLnRvQmUoXCJzdGF0aWMvbmV4dGpzLWljb24tbGlnaHQtYmFja2dyb3VuZC5wbmdcIik7XG4gIH0pO1xuXG4gIGl0KFwic3RyaXBzIG5leHRCYXNlUGF0aCBmcm9tIGEgYmFrZWQtaW4gaHJlZiBiZWZvcmUgYXBwbHlpbmcgYSBkaWZmZXJlbnQga2V5IHByZWZpeFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiZGF0YVwiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICBFVGFnOiAnXCJhYmMxMjNcIicsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3Byb2QvX25leHQvc3RhdGljL21lZGlhL2ltcG9ydGVkLWxvZ28ucG5nXCIsXG4gICAgICBcIi9wcm9kXCIsXG4gICAgICBcIlwiLFxuICAgICk7XG5cbiAgICBjb25zdCBwYXJhbXMgPSAoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXTtcbiAgICBleHBlY3QocGFyYW1zLktleSkudG9CZShcIl9uZXh0L3N0YXRpYy9tZWRpYS9pbXBvcnRlZC1sb2dvLnBuZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2Vzbid0IGRvdWJsZSB0aGUgc2VwYXJhdG9yIHdoZW4gdGhlIGtleSBwcmVmaXggaGFzIGEgdHJhaWxpbmcgc2xhc2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImRhdGFcIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBcImltYWdlL3BuZ1wiLFxuICAgICAgRVRhZzogJ1wiYWJjMTIzXCInLFxuICAgIH0pO1xuXG4gICAgLy8gQnVja2V0RGVwbG95bWVudCBjb2xsYXBzZXMgdGhlIHRyYWlsaW5nIHNsYXNoIHdoZW4gdXBsb2FkaW5nLCBzbyB0aGVcbiAgICAvLyBvYmplY3QgaXMgYXQgXCJiYXNlL3N0YXRpYy9mb28uanBnXCIsIG5vdCBcImJhc2UvL3N0YXRpYy9mb28uanBnXCIuXG4gICAgYXdhaXQgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL3N0YXRpYy9mb28uanBnXCIsIFwiXCIsIFwiL2Jhc2UvXCIpO1xuXG4gICAgY29uc3QgcGFyYW1zID0gKEdldE9iamVjdENvbW1hbmQgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2suY2FsbHNbMF1bMF07XG4gICAgZXhwZWN0KHBhcmFtcy5LZXkpLnRvQmUoXCJiYXNlL3N0YXRpYy9mb28uanBnXCIpO1xuICB9KTtcblxuICBpdChcInJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBidWZmZXIsIGNvbnRlbnQgdHlwZSwgYW5kIGV0YWdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImhlbFwiKSwgQnVmZmVyLmZyb20oXCJsb1wiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvanBlZ1wiLFxuICAgICAgRVRhZzogJ1widGhlLWV0YWdcIicsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaEZyb21TMyhzMywgXCJteS1idWNrZXRcIiwgXCIvZm9vLmpwZ1wiLCBcIlwiKTtcblxuICAgIGV4cGVjdChyZXN1bHQuYnVmZmVyLnRvU3RyaW5nKCkpLnRvQmUoXCJoZWxsb1wiKTtcbiAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRUeXBlKS50b0JlKFwiaW1hZ2UvanBlZ1wiKTtcbiAgICBleHBlY3QocmVzdWx0LmV0YWcpLnRvQmUoJ1widGhlLWV0YWdcIicpO1xuICB9KTtcblxuICBpdChcInJldHVybnMgYW4gZW1wdHkgZXRhZyB3aGVuIFMzIGRvZXNuJ3QgcHJvdmlkZSBvbmVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImRhdGFcIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBudWxsLFxuICAgICAgRVRhZzogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL2Zvby5wbmdcIiwgXCJcIik7XG5cbiAgICBleHBlY3QocmVzdWx0LmV0YWcpLnRvQmUoXCJcIik7XG4gICAgZXhwZWN0KHJlc3VsdC5jb250ZW50VHlwZSkudG9CZU51bGwoKTtcbiAgfSk7XG5cbiAgaXQoXCJ0aHJvd3Mgd2hlbiBTMyByZXR1cm5zIG5vIGJvZHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHsgQm9keTogdW5kZWZpbmVkIH0pO1xuXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL21pc3NpbmcucG5nXCIsIFwiXCIpLFxuICAgICkucmVqZWN0cy50b1Rocm93KC9FbXB0eSByZXNwb25zZSBmcm9tIFMzLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiZ2V0RmlsZU5hbWVXaXRoRXh0ZW5zaW9uXCIsICgpID0+IHtcbiAgaXQoXCJkZXJpdmVzIGZpbGVuYW1lIGFuZCBleHRlbnNpb24gZnJvbSB0aGUgdXJsIGFuZCBjb250ZW50IHR5cGVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGdldEZpbGVOYW1lV2l0aEV4dGVuc2lvbihcIi9mb28vYmFyLnBuZz93PTEwMCZxPTc1XCIsIFwiaW1hZ2Uvd2VicFwiKSxcbiAgICApLnRvQmUoXCJiYXIud2VicFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJmYWxscyBiYWNrIHRvIGltYWdlLmJpbiB3aGVuIGNvbnRlbnRUeXBlIGlzIG1pc3NpbmdcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChnZXRGaWxlTmFtZVdpdGhFeHRlbnNpb24oXCIvZm9vL2Jhci5wbmdcIiwgbnVsbCkpLnRvQmUoXCJpbWFnZS5iaW5cIik7XG4gIH0pO1xuXG4gIGl0KFwiZmFsbHMgYmFjayB0byBpbWFnZS5iaW4gd2hlbiB0aGUgdXJsIGhhcyBubyBmaWxlbmFtZSBzZWdtZW50XCIsICgpID0+IHtcbiAgICBleHBlY3QoZ2V0RmlsZU5hbWVXaXRoRXh0ZW5zaW9uKFwiL1wiLCBcImltYWdlL3BuZ1wiKSkudG9CZShcImltYWdlLmJpblwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJyZXNvbHZlRXJyb3JSZXNwb25zZVwiLCAoKSA9PiB7XG4gIGl0KFwicHJlc2VydmVzIHRoZSBzdGF0dXMgY29kZSBhbmQgbWVzc2FnZSBmcm9tIGFuIEltYWdlRXJyb3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEltYWdlRXJyb3IoNDAwLCAnXCJ1cmxcIiBwYXJhbWV0ZXIgaXMgbm90IGFsbG93ZWQnKTtcblxuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShlcnJvcikpLnRvRXF1YWwoe1xuICAgICAgc3RhdHVzQ29kZTogNDAwLFxuICAgICAgbWVzc2FnZTogJ1widXJsXCIgcGFyYW1ldGVyIGlzIG5vdCBhbGxvd2VkJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJtYXBzIGEgbWlzc2luZyBTMyBvYmplY3QgdG8gdGhlIHNhbWUgNDAwIE5leHQuanMncyBvd24gbG9jYWwtaW1hZ2UgZmV0Y2ggcHJvZHVjZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwiTm9TdWNoS2V5OiBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICBlcnJvci5uYW1lID0gXCJOb1N1Y2hLZXlcIjtcblxuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShlcnJvcikpLnRvRXF1YWwoe1xuICAgICAgc3RhdHVzQ29kZTogNDAwLFxuICAgICAgbWVzc2FnZTogXCJUaGUgcmVxdWVzdGVkIHJlc291cmNlIGlzbid0IGEgdmFsaWQgaW1hZ2UuXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiZmFsbHMgYmFjayB0byA1MDAgZm9yIHVucmVjb2duaXplZCBlcnJvcnNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShuZXcgRXJyb3IoXCJib29tXCIpKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIH0pO1xuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShcIm5vdCBhbiBlcnJvclwiKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -55838,10 +55838,22 @@ import { readFileSync } from "node:fs";
55838
55838
  var import_client_s3 = __toESM(require_dist_cjs16());
55839
55839
  var import_image_optimizer = __toESM(require_image_optimizer());
55840
55840
  var import_serve_static = __toESM(require_serve_static());
55841
- async function fetchFromS3(s32, bucket, url, basePath) {
55842
- const hasBasePath = !!basePath && (url === basePath || url.startsWith(`${basePath}/`));
55843
- const withoutBasePath = hasBasePath ? url.slice(basePath.length) : url;
55844
- const key = `${basePath}${withoutBasePath}`.replace(/^\//, "");
55841
+
55842
+ // src/utils/base-path.ts
55843
+ function normalizeBasePath(basePath) {
55844
+ return (basePath || "").replace(/^\/+/, "").replace(/\/+$/, "");
55845
+ }
55846
+ function joinPath(...parts) {
55847
+ return parts.map(normalizeBasePath).filter(Boolean).join("/");
55848
+ }
55849
+
55850
+ // src/image-optimization/handler-utils.ts
55851
+ async function fetchFromS3(s32, bucket, url, nextBasePath, staticAssetsKeyPrefix = "") {
55852
+ const hasNextBasePath = !!nextBasePath && (url === nextBasePath || url.startsWith(`${nextBasePath}/`));
55853
+ const key = joinPath(
55854
+ staticAssetsKeyPrefix,
55855
+ hasNextBasePath ? url.slice(nextBasePath.length) : url
55856
+ );
55845
55857
  const response = await s32.send(
55846
55858
  new import_client_s3.GetObjectCommand({
55847
55859
  Bucket: bucket,
@@ -55889,6 +55901,7 @@ function resolveErrorResponse(error2) {
55889
55901
  var debug = (0, import_debug5.default)("cdk-nextjs:image-optimization");
55890
55902
  var s3 = new import_client_s32.S3Client({});
55891
55903
  var STATIC_ASSETS_BUCKET = process.env.CDK_NEXTJS_STATIC_ASSETS_BUCKET_NAME || "";
55904
+ var STATIC_ASSETS_KEY_PREFIX = process.env.CDK_NEXTJS_STATIC_ASSETS_KEY_PREFIX || "";
55892
55905
  var requiredServerFiles = JSON.parse(
55893
55906
  readFileSync("required-server-files.json", "utf-8")
55894
55907
  );
@@ -55940,7 +55953,8 @@ var handler = awslambda.streamifyResponse(
55940
55953
  s3,
55941
55954
  STATIC_ASSETS_BUCKET,
55942
55955
  href,
55943
- nextConfig.basePath
55956
+ nextConfig.basePath,
55957
+ STATIC_ASSETS_KEY_PREFIX
55944
55958
  ).then((result) => ({
55945
55959
  buffer: result.buffer,
55946
55960
  contentType: result.contentType,
@@ -46,6 +46,17 @@ export interface NextjsApiProps {
46
46
  * The S3 bucket containing static assets
47
47
  */
48
48
  readonly staticAssetsBucket: IBucket;
49
+ /**
50
+ * S3 key prefix the static assets were uploaded under, i.e.
51
+ * `NextjsStaticAssets.keyPrefix`, which namespaces a shared bucket.
52
+ *
53
+ * Independent of `basePath` above: that one is the URL prefix the REST API
54
+ * serves the app at (commonly the API Gateway stage), while this one is where
55
+ * the objects live in the bucket. `_next/static` and public directory
56
+ * requests are mapped to S3 keys directly, so they 404 unless this prefix is
57
+ * applied.
58
+ */
59
+ readonly staticAssetsKeyPrefix?: string;
49
60
  /**
50
61
  * [Future] Required if `NextjsRegionalContainers`. VPC to create VPC Link and ECS Service Discovery
51
62
  */
@@ -59,6 +70,16 @@ export declare class NextjsApi extends Construct {
59
70
  * The API Gateway REST API
60
71
  */
61
72
  readonly api: RestApi;
73
+ /**
74
+ * Public URL of the app, including every path segment the API nests it under.
75
+ * Prefers a custom domain configured through `overrides.restApiProps.domainName`
76
+ * over the execute-api endpoint.
77
+ *
78
+ * A domain attached after this construct is created (`api.addDomainName()`) is
79
+ * still used for the host, but CDK keeps its base path mappings private, so a
80
+ * mapping added that way won't show up here.
81
+ */
82
+ get url(): string;
62
83
  private readonly baseResource;
63
84
  private readonly nextResource;
64
85
  private readonly props;
@@ -72,6 +93,11 @@ export declare class NextjsApi extends Construct {
72
93
  private createBaseResource;
73
94
  private createStaticIntegrationRole;
74
95
  private createStaticIntegrations;
96
+ /**
97
+ * Prefixes a request path with the key prefix the assets were uploaded under,
98
+ * since the S3 integrations address objects by key rather than by URL.
99
+ */
100
+ private s3Key;
75
101
  /**
76
102
  * Maps API request to S3 request.
77
103
  * @see https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-parameter-mapping-sources.html
package/lib/nextjs-api.js CHANGED
@@ -6,15 +6,40 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
6
  const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
7
7
  const aws_iam_1 = require("aws-cdk-lib/aws-iam");
8
8
  const constructs_1 = require("constructs");
9
+ const base_path_1 = require("./utils/base-path");
9
10
  /**
10
11
  * Creates an API Gateway REST API for Next.js applications
11
12
  */
12
13
  class NextjsApi extends constructs_1.Construct {
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.5.16" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.6.0" };
14
15
  /**
15
16
  * The API Gateway REST API
16
17
  */
17
18
  api;
19
+ /**
20
+ * Public URL of the app, including every path segment the API nests it under.
21
+ * Prefers a custom domain configured through `overrides.restApiProps.domainName`
22
+ * over the execute-api endpoint.
23
+ *
24
+ * A domain attached after this construct is created (`api.addDomainName()`) is
25
+ * still used for the host, but CDK keeps its base path mappings private, so a
26
+ * mapping added that way won't show up here.
27
+ */
28
+ get url() {
29
+ const customDomain = this.api.domainName;
30
+ // A custom domain reaches the stage through a base path mapping, so the
31
+ // stage name isn't in the path there; the mapping may be, when set.
32
+ const [origin, prefix] = customDomain
33
+ ? [
34
+ `https://${customDomain.domainName}`,
35
+ this.props.overrides?.restApiProps?.domainName?.basePath,
36
+ ]
37
+ : [
38
+ `https://${this.api.restApiId}.execute-api.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com`,
39
+ this.api.deploymentStage.stageName,
40
+ ];
41
+ return (0, base_path_1.joinPath)(origin, prefix, this.props.basePath);
42
+ }
18
43
  baseResource;
19
44
  nextResource;
20
45
  props;
@@ -59,14 +84,8 @@ class NextjsApi extends constructs_1.Construct {
59
84
  */
60
85
  createBaseResource(basePath) {
61
86
  // Create base resource path if needed
62
- let baseResource = this.api.root;
63
- if (basePath) {
64
- const _basePath = basePath.startsWith("/")
65
- ? basePath.substring(1)
66
- : basePath;
67
- baseResource = this.api.root.addResource(_basePath);
68
- }
69
- return baseResource;
87
+ const normalized = (0, base_path_1.normalizeBasePath)(basePath);
88
+ return normalized ? this.api.root.addResource(normalized) : this.api.root;
70
89
  }
71
90
  createStaticIntegrationRole() {
72
91
  // Create S3 integration role
@@ -86,22 +105,31 @@ class NextjsApi extends constructs_1.Construct {
86
105
  this.nextResource
87
106
  .addResource("static")
88
107
  .addResource("{proxy+}")
89
- .addMethod("GET", this.createS3Integration({ key: "_next/static/{key}" }), this.getStaticMethodOptions({ proxy: true }));
108
+ .addMethod("GET", this.createS3Integration({ key: this.s3Key("_next/static/{key}") }), this.getStaticMethodOptions({ proxy: true }));
90
109
  // add public directory files/directories that exist at top level but need to go to S3.
91
110
  for (const publicDirEntry of this.props.publicDirEntries) {
92
111
  if (publicDirEntry.isDirectory) {
93
112
  this.baseResource
94
113
  .addResource(publicDirEntry.name)
95
114
  .addResource("{proxy+}")
96
- .addMethod("GET", this.createS3Integration({ key: `${publicDirEntry.name}/{key}` }), this.getStaticMethodOptions({ proxy: true }));
115
+ .addMethod("GET", this.createS3Integration({
116
+ key: this.s3Key(`${publicDirEntry.name}/{key}`),
117
+ }), this.getStaticMethodOptions({ proxy: true }));
97
118
  }
98
119
  else {
99
120
  this.baseResource
100
121
  .addResource(publicDirEntry.name)
101
- .addMethod("GET", this.createS3Integration({ key: publicDirEntry.name }), this.getStaticMethodOptions());
122
+ .addMethod("GET", this.createS3Integration({ key: this.s3Key(publicDirEntry.name) }), this.getStaticMethodOptions());
102
123
  }
103
124
  }
104
125
  }
126
+ /**
127
+ * Prefixes a request path with the key prefix the assets were uploaded under,
128
+ * since the S3 integrations address objects by key rather than by URL.
129
+ */
130
+ s3Key(key) {
131
+ return (0, base_path_1.joinPath)(this.props.staticAssetsKeyPrefix, key);
132
+ }
105
133
  /**
106
134
  * Maps API request to S3 request.
107
135
  * @see https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-parameter-mapping-sources.html
@@ -201,4 +229,4 @@ class NextjsApi extends constructs_1.Construct {
201
229
  }
202
230
  }
203
231
  exports.NextjsApi = NextjsApi;
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBMEM7QUFDMUMsK0RBWW9DO0FBRXBDLGlEQUs2QjtBQUc3QiwyQ0FBdUM7QUFvRHZDOztHQUVHO0FBQ0gsTUFBYSxTQUFVLFNBQVEsc0JBQVM7O0lBQ3RDOztPQUVHO0lBQ2EsR0FBRyxDQUFVO0lBRVosWUFBWSxDQUFZO0lBQ3hCLFlBQVksQ0FBWTtJQUN4QixLQUFLLENBQWlCO0lBQy9CLHFCQUFxQixDQUFRO0lBRXJDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUI7UUFDN0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6Qix5RUFBeUU7WUFDekUsK0NBQStDO1lBQy9DLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ25ELENBQUM7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aUU7UUFDakUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGtDQUFpQixDQUFDLGFBQWEsRUFBRTtZQUM1RCxvQkFBb0IsRUFBRSxxQ0FBb0IsQ0FBQyxNQUFNO1lBQ2pELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUscUJBQXFCO1NBQy9DLENBQUMsQ0FBQztRQUNILE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssd0JBQXdCLENBQUMsY0FBeUI7UUFDeEQsd0RBQXdEO1FBQ3hELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxrQ0FBaUIsQ0FBQyxjQUFjLEVBQUU7WUFDakUsb0JBQW9CLEVBQUUscUNBQW9CLENBQUMsTUFBTTtZQUNqRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHVCQUF1QjtTQUNqRCxDQUFDLENBQUM7UUFFSCw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUN2RCxDQUFDOztBQTNOSCw4QkE0TkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaXplLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgUmVzdEFwaSxcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIEF3c0ludGVncmF0aW9uLFxuICBNZXRob2RPcHRpb25zLFxuICBJUmVzb3VyY2UsXG4gIEVuZHBvaW50VHlwZSxcbiAgUmVzdEFwaVByb3BzLFxuICBBd3NJbnRlZ3JhdGlvblByb3BzLFxuICBMYW1iZGFJbnRlZ3JhdGlvbk9wdGlvbnMsXG4gIFBhc3N0aHJvdWdoQmVoYXZpb3IsXG4gIFJlc3BvbnNlVHJhbnNmZXJNb2RlLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXlcIjtcbmltcG9ydCB7IElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtcbiAgUm9sZSxcbiAgU2VydmljZVByaW5jaXBhbCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBJUm9sZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IElGdW5jdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFB1YmxpY0RpckVudHJ5IH0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0FwaU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IHJlc3RBcGlQcm9wcz86IFJlc3RBcGlQcm9wcztcbiAgcmVhZG9ubHkgc3RhdGljSW50ZWdyYXRpb25Qcm9wcz86IEF3c0ludGVncmF0aW9uUHJvcHM7XG4gIHJlYWRvbmx5IHMzTWV0aG9kT3B0aW9ucz86IE1ldGhvZE9wdGlvbnM7XG4gIHJlYWRvbmx5IGR5bmFtaWNJbnRlZ3JhdGlvblByb3BzPzogTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zO1xuICByZWFkb25seSBpbWFnZUludGVncmF0aW9uUHJvcHM/OiBMYW1iZGFJbnRlZ3JhdGlvbk9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXBpUHJvcHMge1xuICAvKipcbiAgICogT3B0aW9uYWwgYmFzZSBwYXRoIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0FwaU92ZXJyaWRlcztcbiAgLyoqXG4gICAqIFBhdGggdG8gZGlyZWN0b3J5IG9mIE5leHQuanMgYXBwJ3MgcHVibGljIGRpcmVjdG9yeS4gVXNlZCB0byBhZGQgcmVzb3VyY2VzXG4gICAqIHRvIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBwdWJsaWMgZGlyZWN0b3J5IHRvIGdvIGRpcmVjdGx5IHRvIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljRGlyRW50cmllczogUHVibGljRGlyRW50cnlbXTtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc2AuIFRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyRnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgaW1hZ2Ugb3B0aW1pemF0aW9uIExhbWJkYSBmb3IgdGhlIGBfbmV4dC9pbWFnZWAgcm91dGUuIFdoZW5cbiAgICogb21pdHRlZCwgbm8gYF9uZXh0L2ltYWdlYCByZXNvdXJjZSBpcyBjcmVhdGVkIGFuZCB0aG9zZSByZXF1ZXN0cyBmYWxsXG4gICAqIHRocm91Z2ggdG8gYHNlcnZlckZ1bmN0aW9uYCB2aWEgdGhlIGB7cHJveHkrfWAgY2F0Y2gtYWxsLlxuICAgKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbWluZyAoYXMgdGhlXG4gICAqIGRlZGljYXRlZCBpbWFnZSBMYW1iZGEgdGhpcyBwYWNrYWdlIGJ1aWxkcyBkb2VzKSBhbmQgaXMgaW52b2tlZCB3aXRoXG4gICAqIGBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU1gIGFjY29yZGluZ2x5LiBJZiB5b3Ugc3VwcGx5IGEgY3VzdG9tXG4gICAqIGBpbWFnZUZ1bmN0aW9uYCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBzdHJlYW1pbmcsIG92ZXJyaWRlXG4gICAqIGByZXNwb25zZVRyYW5zZmVyTW9kZWAgdG8gYEJVRkZFUkVEYCB2aWEgYG92ZXJyaWRlcy5pbWFnZUludGVncmF0aW9uUHJvcHNgLFxuICAgKiBvdGhlcndpc2UgQVBJIEdhdGV3YXkgcmV0dXJucyBhIDUwMi5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlRnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0OiBJQnVja2V0O1xuICAvKipcbiAgICogW0Z1dHVyZV0gUmVxdWlyZWQgaWYgYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2AuIFZQQyB0byBjcmVhdGUgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBOZXh0LmpzIGFwcGxpY2F0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQXBpIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaTogUmVzdEFwaTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VSZXNvdXJjZTogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHRSZXNvdXJjZTogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBOZXh0anNBcGlQcm9wcztcbiAgcHJpdmF0ZSBzdGF0aWNJbnRlZ3JhdGlvblJvbGU6IElSb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcbiAgICB0aGlzLmFwaSA9IHRoaXMuY3JlYXRlUmVzdEFwaSgpO1xuICAgIHRoaXMuYmFzZVJlc291cmNlID0gdGhpcy5jcmVhdGVCYXNlUmVzb3VyY2UocHJvcHMuYmFzZVBhdGgpO1xuICAgIHRoaXMubmV4dFJlc291cmNlID0gdGhpcy5iYXNlUmVzb3VyY2UuYWRkUmVzb3VyY2UoXCJfbmV4dFwiKTtcbiAgICB0aGlzLnN0YXRpY0ludGVncmF0aW9uUm9sZSA9IHRoaXMuY3JlYXRlU3RhdGljSW50ZWdyYXRpb25Sb2xlKCk7XG4gICAgdGhpcy5jcmVhdGVTdGF0aWNJbnRlZ3JhdGlvbnMoKTtcbiAgICBpZiAocHJvcHMuc2VydmVyRnVuY3Rpb24pIHtcbiAgICAgIC8vIFdpdGhvdXQgYSBkZWRpY2F0ZWQgaW1hZ2UgZnVuY3Rpb24sIGBfbmV4dC9pbWFnZWAgZmFsbHMgdGhyb3VnaCB0byB0aGVcbiAgICAgIC8vIGB7cHJveHkrfWAgY2F0Y2gtYWxsIG9uIHRoZSBzZXJ2ZXIgZnVuY3Rpb24uXG4gICAgICBpZiAocHJvcHMuaW1hZ2VGdW5jdGlvbikge1xuICAgICAgICB0aGlzLmNyZWF0ZUltYWdlSW50ZWdyYXRpb24ocHJvcHMuaW1hZ2VGdW5jdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLmNyZWF0ZUR5bmFtaWNJbnRlZ3JhdGlvbihwcm9wcy5zZXJ2ZXJGdW5jdGlvbik7XG4gICAgfSBlbHNlIGlmIChwcm9wcy52cGMpIHtcbiAgICAgIC8vIFtGdXR1cmVdIGNyZWF0ZSBpbnRlZ3JhdGlvbiB3aXRoIEVDUyB2aWEgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogTmV4dGpzQXBpUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnNlcnZlckZ1bmN0aW9uICYmICFwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlcnZlckZ1bmN0aW9uIG9yIHZwYyBtdXN0IGJlIHNldCBpbiBOZXh0anNBcGlQcm9wc1wiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlc3RBcGkoKTogUmVzdEFwaSB7XG4gICAgcmV0dXJuIG5ldyBSZXN0QXBpKHRoaXMsIFwiUmVzdEFwaVwiLCB7XG4gICAgICBiaW5hcnlNZWRpYVR5cGVzOiBbXCIqLypcIl0sXG4gICAgICBkZXNjcmlwdGlvbjogYGNkay1uZXh0anMgUkVTVCBBUEkgZm9yICR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcbiAgICAgIG1pbkNvbXByZXNzaW9uU2l6ZTogU2l6ZS5ieXRlcygwKSwgLy8gY29tcHJlc3MgYWxsIHJlc3BvbnNlcyBmb3IgYmV0dGVyIHBlcmZcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5yZXN0QXBpUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGJhc2UgcmVzb3VyY2UgcGF0aCBpZiBuZWVkZWQuIEltcG9ydGFudCBpZiBgYmFzZVBhdGhgIGlzIHNldC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQmFzZVJlc291cmNlKGJhc2VQYXRoPzogc3RyaW5nKTogSVJlc291cmNlIHtcbiAgICAvLyBDcmVhdGUgYmFzZSByZXNvdXJjZSBwYXRoIGlmIG5lZWRlZFxuICAgIGxldCBiYXNlUmVzb3VyY2UgPSB0aGlzLmFwaS5yb290O1xuICAgIGlmIChiYXNlUGF0aCkge1xuICAgICAgY29uc3QgX2Jhc2VQYXRoID0gYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgPyBiYXNlUGF0aC5zdWJzdHJpbmcoMSlcbiAgICAgICAgOiBiYXNlUGF0aDtcblxuICAgICAgYmFzZVJlc291cmNlID0gdGhpcy5hcGkucm9vdC5hZGRSZXNvdXJjZShfYmFzZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZVJlc291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNJbnRlZ3JhdGlvblJvbGUoKSB7XG4gICAgLy8gQ3JlYXRlIFMzIGludGVncmF0aW9uIHJvbGVcbiAgICBjb25zdCBzdGF0aWNJbnRlZ3JhdGlvblJvbGUgPSBuZXcgUm9sZSh0aGlzLCBcIlN0YXRpY0ludGVncmF0aW9uUm9sZVwiLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tXCIpLFxuICAgIH0pO1xuXG4gICAgc3RhdGljSW50ZWdyYXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcInMzOkdldE9iamVjdFwiLCBcInMzOkxpc3RCdWNrZXRcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldEFybixcbiAgICAgICAgICBgJHt0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXRBcm59LypgLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gc3RhdGljSW50ZWdyYXRpb25Sb2xlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNJbnRlZ3JhdGlvbnMoKSB7XG4gICAgdGhpcy5uZXh0UmVzb3VyY2VcbiAgICAgIC5hZGRSZXNvdXJjZShcInN0YXRpY1wiKVxuICAgICAgLmFkZFJlc291cmNlKFwie3Byb3h5K31cIilcbiAgICAgIC5hZGRNZXRob2QoXG4gICAgICAgIFwiR0VUXCIsXG4gICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleTogXCJfbmV4dC9zdGF0aWMve2tleX1cIiB9KSxcbiAgICAgICAgdGhpcy5nZXRTdGF0aWNNZXRob2RPcHRpb25zKHsgcHJveHk6IHRydWUgfSksXG4gICAgICApO1xuICAgIC8vIGFkZCBwdWJsaWMgZGlyZWN0b3J5IGZpbGVzL2RpcmVjdG9yaWVzIHRoYXQgZXhpc3QgYXQgdG9wIGxldmVsIGJ1dCBuZWVkIHRvIGdvIHRvIFMzLlxuICAgIGZvciAoY29uc3QgcHVibGljRGlyRW50cnkgb2YgdGhpcy5wcm9wcy5wdWJsaWNEaXJFbnRyaWVzKSB7XG4gICAgICBpZiAocHVibGljRGlyRW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgdGhpcy5iYXNlUmVzb3VyY2VcbiAgICAgICAgICAuYWRkUmVzb3VyY2UocHVibGljRGlyRW50cnkubmFtZSlcbiAgICAgICAgICAuYWRkUmVzb3VyY2UoXCJ7cHJveHkrfVwiKVxuICAgICAgICAgIC5hZGRNZXRob2QoXG4gICAgICAgICAgICBcIkdFVFwiLFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTM0ludGVncmF0aW9uKHsga2V5OiBgJHtwdWJsaWNEaXJFbnRyeS5uYW1lfS97a2V5fWAgfSksXG4gICAgICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eTogdHJ1ZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5iYXNlUmVzb3VyY2VcbiAgICAgICAgICAuYWRkUmVzb3VyY2UocHVibGljRGlyRW50cnkubmFtZSlcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleTogcHVibGljRGlyRW50cnkubmFtZSB9KSxcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RhdGljTWV0aG9kT3B0aW9ucygpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgQVBJIHJlcXVlc3QgdG8gUzMgcmVxdWVzdC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcmVzdC1hcGktcGFyYW1ldGVyLW1hcHBpbmctc291cmNlcy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2ludGVncmF0aW5nLWFwaS13aXRoLWF3cy1zZXJ2aWNlcy1zMy5odG1sI2FwaS1pdGVtcy1pbi1mb2xkZXItYXMtczMtb2JqZWN0cy1pbi1idWNrZXRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcbiAgICBjb25zdCBzM0ludGVncmF0aW9uID0gbmV3IEF3c0ludGVncmF0aW9uKHtcbiAgICAgIHNlcnZpY2U6IFwiczNcIixcbiAgICAgIGludGVncmF0aW9uSHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICAgIHBhdGg6IGAke3RoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9LyR7a2V5fWAsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGNyZWRlbnRpYWxzUm9sZTogdGhpcy5zdGF0aWNJbnRlZ3JhdGlvblJvbGUsXG4gICAgICAgIHBhc3N0aHJvdWdoQmVoYXZpb3I6IFBhc3N0aHJvdWdoQmVoYXZpb3IuV0hFTl9OT19URU1QTEFURVMsIC8vIHJlY29tbWVuZGVkXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiBrZXkuaW5jbHVkZXMoXCJ7a2V5fVwiKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlcXVlc3QucGF0aC5rZXlcIjogXCJtZXRob2QucmVxdWVzdC5wYXRoLnByb3h5XCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVncmF0aW9uUmVzcG9uc2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzQ29kZTogXCIyMDBcIixcbiAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LUxlbmd0aFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5DYWNoZS1Db250cm9sXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuRVRhZ1wiOiBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5FVGFnXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgICAgICBzZWxlY3Rpb25QYXR0ZXJuOiBcIjQwNFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0ludGVncmF0aW9uUHJvcHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHMzSW50ZWdyYXRpb247XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eSB9ID0geyBwcm94eTogZmFsc2UgfSk6IE1ldGhvZE9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyczogcHJveHlcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBcIm1ldGhvZC5yZXF1ZXN0LnBhdGgucHJveHlcIjogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgbWV0aG9kUmVzcG9uc2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBcIjIwMFwiLFxuICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtVHlwZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkVUYWdcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnMzTWV0aG9kT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIHRoZSBgX25leHQvaW1hZ2VgIHJvdXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUludGVncmF0aW9uKGltYWdlRnVuY3Rpb246IElGdW5jdGlvbikge1xuICAgIC8vIGltYWdlRnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSB0aGUgZGVkaWNhdGVkLCBzdHJlYW1pbmctY2FwYWJsZSBpbWFnZVxuICAgIC8vIExhbWJkYSAoc2VlIGl0cyBkb2MgY29tbWVudCk7IG92ZXJyaWRlIHJlc3BvbnNlVHJhbnNmZXJNb2RlIHZpYVxuICAgIC8vIGltYWdlSW50ZWdyYXRpb25Qcm9wcyBpZiB0aGF0IGFzc3VtcHRpb24gZG9lc24ndCBob2xkIGZvciBhIGN1c3RvbVxuICAgIC8vIGltYWdlRnVuY3Rpb24sIG90aGVyd2lzZSBBUEkgR2F0ZXdheSByZXR1cm5zIGEgNTAyLiBEZWxpYmVyYXRlbHlcbiAgICAvLyBkb2Vzbid0IGluaGVyaXQgZHluYW1pY0ludGVncmF0aW9uUHJvcHM6IHRoYXQncyBmb3Igc2VydmVyRnVuY3Rpb24sXG4gICAgLy8gYSBkaWZmZXJlbnQgTGFtYmRhIHdpdGggZGlmZmVyZW50IChhbmQgcG9zc2libHkgY29uZmxpY3RpbmcsIGUuZy5cbiAgICAvLyBCVUZGRVJFRCBmb3IgYSBub24tc3RyZWFtaW5nIExhbWJkYSBXZWIgQWRhcHRlciBzZXR1cCkgc3RyZWFtaW5nXG4gICAgLy8gcmVxdWlyZW1lbnRzIHRoYW4gdGhlIGFsd2F5cy1zdHJlYW1pbmcgZGVkaWNhdGVkIGltYWdlIExhbWJkYS5cbiAgICBjb25zdCBpbWFnZUludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKGltYWdlRnVuY3Rpb24sIHtcbiAgICAgIHJlc3BvbnNlVHJhbnNmZXJNb2RlOiBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uaW1hZ2VJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuICAgIGNvbnN0IGltYWdlUmVzb3VyY2UgPSB0aGlzLm5leHRSZXNvdXJjZS5hZGRSZXNvdXJjZShcImltYWdlXCIpO1xuICAgIGltYWdlUmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIGltYWdlSW50ZWdyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIGFsbCBvdGhlciByb3V0ZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0ludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uOiBJRnVuY3Rpb24pIHtcbiAgICAvLyBBbGwgb3RoZXIgcm91dGVzIHVzZSBzdHJlYW1pbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IHN0cmVhbWluZ0ludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uLCB7XG4gICAgICByZXNwb25zZVRyYW5zZmVyTW9kZTogUmVzcG9uc2VUcmFuc2Zlck1vZGUuU1RSRUFNLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGNhdGNoLWFsbCByb3V0ZXMgd2l0aCBzdHJlYW1pbmcgaW50ZWdyYXRpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgIHRoaXMuYmFzZVJlc291cmNlLmFkZE1ldGhvZChcIkFOWVwiLCBzdHJlYW1pbmdJbnRlZ3JhdGlvbik7XG4gICAgY29uc3QgcHJveHlSZXNvdXJjZSA9IHRoaXMuYmFzZVJlc291cmNlLmFkZFJlc291cmNlKFwie3Byb3h5K31cIik7XG4gICAgcHJveHlSZXNvdXJjZS5hZGRNZXRob2QoXCJBTllcIiwgc3RyZWFtaW5nSW50ZWdyYXRpb24pO1xuICB9XG59XG4iXX0=
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBMEM7QUFDMUMsK0RBWW9DO0FBRXBDLGlEQUs2QjtBQUc3QiwyQ0FBdUM7QUFFdkMsaURBQWdFO0FBOERoRTs7R0FFRztBQUNILE1BQWEsU0FBVSxTQUFRLHNCQUFTOztJQUN0Qzs7T0FFRztJQUNhLEdBQUcsQ0FBVTtJQUU3Qjs7Ozs7Ozs7T0FRRztJQUNILElBQUksR0FBRztRQUNMLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3pDLHdFQUF3RTtRQUN4RSxvRUFBb0U7UUFDcEUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxZQUFZO1lBQ25DLENBQUMsQ0FBQztnQkFDRSxXQUFXLFlBQVksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUTthQUN6RDtZQUNILENBQUMsQ0FBQztnQkFDRSxXQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxnQkFBZ0IsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxnQkFBZ0I7Z0JBQ2xGLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVM7YUFDbkMsQ0FBQztRQUNOLE9BQU8sSUFBQSxvQkFBUSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRWdCLFlBQVksQ0FBWTtJQUN4QixZQUFZLENBQVk7SUFDeEIsS0FBSyxDQUFpQjtJQUMvQixxQkFBcUIsQ0FBUTtJQUVyQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFB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QUNLLHdCQUF3QixDQUFDLGNBQXlCO1FBQ3hELHdEQUF3RDtRQUN4RCxNQUFNLG9CQUFvQixHQUFHLElBQUksa0NBQWlCLENBQUMsY0FBYyxFQUFFO1lBQ2pFLG9CQUFvQixFQUFFLHFDQUFvQixDQUFDLE1BQU07WUFDakQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx1QkFBdUI7U0FDakQsQ0FBQyxDQUFDO1FBRUgsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDdkQsQ0FBQzs7QUF2UEgsOEJBd1BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2l6ZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIFJlc3RBcGksXG4gIExhbWJkYUludGVncmF0aW9uLFxuICBBd3NJbnRlZ3JhdGlvbixcbiAgTWV0aG9kT3B0aW9ucyxcbiAgSVJlc291cmNlLFxuICBFbmRwb2ludFR5cGUsXG4gIFJlc3RBcGlQcm9wcyxcbiAgQXdzSW50ZWdyYXRpb25Qcm9wcyxcbiAgTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zLFxuICBQYXNzdGhyb3VnaEJlaGF2aW9yLFxuICBSZXNwb25zZVRyYW5zZmVyTW9kZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5XCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIFJvbGUsXG4gIFNlcnZpY2VQcmluY2lwYWwsXG4gIFBvbGljeVN0YXRlbWVudCxcbiAgSVJvbGUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBJRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBQdWJsaWNEaXJFbnRyeSB9IGZyb20gXCIuL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGRcIjtcbmltcG9ydCB7IGpvaW5QYXRoLCBub3JtYWxpemVCYXNlUGF0aCB9IGZyb20gXCIuL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0FwaU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IHJlc3RBcGlQcm9wcz86IFJlc3RBcGlQcm9wcztcbiAgcmVhZG9ubHkgc3RhdGljSW50ZWdyYXRpb25Qcm9wcz86IEF3c0ludGVncmF0aW9uUHJvcHM7XG4gIHJlYWRvbmx5IHMzTWV0aG9kT3B0aW9ucz86IE1ldGhvZE9wdGlvbnM7XG4gIHJlYWRvbmx5IGR5bmFtaWNJbnRlZ3JhdGlvblByb3BzPzogTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zO1xuICByZWFkb25seSBpbWFnZUludGVncmF0aW9uUHJvcHM/OiBMYW1iZGFJbnRlZ3JhdGlvbk9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXBpUHJvcHMge1xuICAvKipcbiAgICogT3B0aW9uYWwgYmFzZSBwYXRoIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0FwaU92ZXJyaWRlcztcbiAgLyoqXG4gICAqIFBhdGggdG8gZGlyZWN0b3J5IG9mIE5leHQuanMgYXBwJ3MgcHVibGljIGRpcmVjdG9yeS4gVXNlZCB0byBhZGQgcmVzb3VyY2VzXG4gICAqIHRvIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBwdWJsaWMgZGlyZWN0b3J5IHRvIGdvIGRpcmVjdGx5IHRvIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljRGlyRW50cmllczogUHVibGljRGlyRW50cnlbXTtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc2AuIFRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyRnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgaW1hZ2Ugb3B0aW1pemF0aW9uIExhbWJkYSBmb3IgdGhlIGBfbmV4dC9pbWFnZWAgcm91dGUuIFdoZW5cbiAgICogb21pdHRlZCwgbm8gYF9uZXh0L2ltYWdlYCByZXNvdXJjZSBpcyBjcmVhdGVkIGFuZCB0aG9zZSByZXF1ZXN0cyBmYWxsXG4gICAqIHRocm91Z2ggdG8gYHNlcnZlckZ1bmN0aW9uYCB2aWEgdGhlIGB7cHJveHkrfWAgY2F0Y2gtYWxsLlxuICAgKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbWluZyAoYXMgdGhlXG4gICAqIGRlZGljYXRlZCBpbWFnZSBMYW1iZGEgdGhpcyBwYWNrYWdlIGJ1aWxkcyBkb2VzKSBhbmQgaXMgaW52b2tlZCB3aXRoXG4gICAqIGBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU1gIGFjY29yZGluZ2x5LiBJZiB5b3Ugc3VwcGx5IGEgY3VzdG9tXG4gICAqIGBpbWFnZUZ1bmN0aW9uYCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBzdHJlYW1pbmcsIG92ZXJyaWRlXG4gICAqIGByZXNwb25zZVRyYW5zZmVyTW9kZWAgdG8gYEJVRkZFUkVEYCB2aWEgYG92ZXJyaWRlcy5pbWFnZUludGVncmF0aW9uUHJvcHNgLFxuICAgKiBvdGhlcndpc2UgQVBJIEdhdGV3YXkgcmV0dXJucyBhIDUwMi5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlRnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0OiBJQnVja2V0O1xuICAvKipcbiAgICogUzMga2V5IHByZWZpeCB0aGUgc3RhdGljIGFzc2V0cyB3ZXJlIHVwbG9hZGVkIHVuZGVyLCBpLmUuXG4gICAqIGBOZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4YCwgd2hpY2ggbmFtZXNwYWNlcyBhIHNoYXJlZCBidWNrZXQuXG4gICAqXG4gICAqIEluZGVwZW5kZW50IG9mIGBiYXNlUGF0aGAgYWJvdmU6IHRoYXQgb25lIGlzIHRoZSBVUkwgcHJlZml4IHRoZSBSRVNUIEFQSVxuICAgKiBzZXJ2ZXMgdGhlIGFwcCBhdCAoY29tbW9ubHkgdGhlIEFQSSBHYXRld2F5IHN0YWdlKSwgd2hpbGUgdGhpcyBvbmUgaXMgd2hlcmVcbiAgICogdGhlIG9iamVjdHMgbGl2ZSBpbiB0aGUgYnVja2V0LiBgX25leHQvc3RhdGljYCBhbmQgcHVibGljIGRpcmVjdG9yeVxuICAgKiByZXF1ZXN0cyBhcmUgbWFwcGVkIHRvIFMzIGtleXMgZGlyZWN0bHksIHNvIHRoZXkgNDA0IHVubGVzcyB0aGlzIHByZWZpeCBpc1xuICAgKiBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzS2V5UHJlZml4Pzogc3RyaW5nO1xuICAvKipcbiAgICogW0Z1dHVyZV0gUmVxdWlyZWQgaWYgYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2AuIFZQQyB0byBjcmVhdGUgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBOZXh0LmpzIGFwcGxpY2F0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQXBpIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaTogUmVzdEFwaTtcblxuICAvKipcbiAgICogUHVibGljIFVSTCBvZiB0aGUgYXBwLCBpbmNsdWRpbmcgZXZlcnkgcGF0aCBzZWdtZW50IHRoZSBBUEkgbmVzdHMgaXQgdW5kZXIuXG4gICAqIFByZWZlcnMgYSBjdXN0b20gZG9tYWluIGNvbmZpZ3VyZWQgdGhyb3VnaCBgb3ZlcnJpZGVzLnJlc3RBcGlQcm9wcy5kb21haW5OYW1lYFxuICAgKiBvdmVyIHRoZSBleGVjdXRlLWFwaSBlbmRwb2ludC5cbiAgICpcbiAgICogQSBkb21haW4gYXR0YWNoZWQgYWZ0ZXIgdGhpcyBjb25zdHJ1Y3QgaXMgY3JlYXRlZCAoYGFwaS5hZGREb21haW5OYW1lKClgKSBpc1xuICAgKiBzdGlsbCB1c2VkIGZvciB0aGUgaG9zdCwgYnV0IENESyBrZWVwcyBpdHMgYmFzZSBwYXRoIG1hcHBpbmdzIHByaXZhdGUsIHNvIGFcbiAgICogbWFwcGluZyBhZGRlZCB0aGF0IHdheSB3b24ndCBzaG93IHVwIGhlcmUuXG4gICAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY3VzdG9tRG9tYWluID0gdGhpcy5hcGkuZG9tYWluTmFtZTtcbiAgICAvLyBBIGN1c3RvbSBkb21haW4gcmVhY2hlcyB0aGUgc3RhZ2UgdGhyb3VnaCBhIGJhc2UgcGF0aCBtYXBwaW5nLCBzbyB0aGVcbiAgICAvLyBzdGFnZSBuYW1lIGlzbid0IGluIHRoZSBwYXRoIHRoZXJlOyB0aGUgbWFwcGluZyBtYXkgYmUsIHdoZW4gc2V0LlxuICAgIGNvbnN0IFtvcmlnaW4sIHByZWZpeF0gPSBjdXN0b21Eb21haW5cbiAgICAgID8gW1xuICAgICAgICAgIGBodHRwczovLyR7Y3VzdG9tRG9tYWluLmRvbWFpbk5hbWV9YCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8ucmVzdEFwaVByb3BzPy5kb21haW5OYW1lPy5iYXNlUGF0aCxcbiAgICAgICAgXVxuICAgICAgOiBbXG4gICAgICAgICAgYGh0dHBzOi8vJHt0aGlzLmFwaS5yZXN0QXBpSWR9LmV4ZWN1dGUtYXBpLiR7U3RhY2sub2YodGhpcykucmVnaW9ufS5hbWF6b25hd3MuY29tYCxcbiAgICAgICAgICB0aGlzLmFwaS5kZXBsb3ltZW50U3RhZ2Uuc3RhZ2VOYW1lLFxuICAgICAgICBdO1xuICAgIHJldHVybiBqb2luUGF0aChvcmlnaW4sIHByZWZpeCwgdGhpcy5wcm9wcy5iYXNlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VSZXNvdXJjZTogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHRSZXNvdXJjZTogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBOZXh0anNBcGlQcm9wcztcbiAgcHJpdmF0ZSBzdGF0aWNJbnRlZ3JhdGlvblJvbGU6IElSb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcbiAgICB0aGlzLmFwaSA9IHRoaXMuY3JlYXRlUmVzdEFwaSgpO1xuICAgIHRoaXMuYmFzZVJlc291cmNlID0gdGhpcy5jcmVhdGVCYXNlUmVzb3VyY2UocHJvcHMuYmFzZVBhdGgpO1xuICAgIHRoaXMubmV4dFJlc291cmNlID0gdGhpcy5iYXNlUmVzb3VyY2UuYWRkUmVzb3VyY2UoXCJfbmV4dFwiKTtcbiAgICB0aGlzLnN0YXRpY0ludGVncmF0aW9uUm9sZSA9IHRoaXMuY3JlYXRlU3RhdGljSW50ZWdyYXRpb25Sb2xlKCk7XG4gICAgdGhpcy5jcmVhdGVTdGF0aWNJbnRlZ3JhdGlvbnMoKTtcbiAgICBpZiAocHJvcHMuc2VydmVyRnVuY3Rpb24pIHtcbiAgICAgIC8vIFdpdGhvdXQgYSBkZWRpY2F0ZWQgaW1hZ2UgZnVuY3Rpb24sIGBfbmV4dC9pbWFnZWAgZmFsbHMgdGhyb3VnaCB0byB0aGVcbiAgICAgIC8vIGB7cHJveHkrfWAgY2F0Y2gtYWxsIG9uIHRoZSBzZXJ2ZXIgZnVuY3Rpb24uXG4gICAgICBpZiAocHJvcHMuaW1hZ2VGdW5jdGlvbikge1xuICAgICAgICB0aGlzLmNyZWF0ZUltYWdlSW50ZWdyYXRpb24ocHJvcHMuaW1hZ2VGdW5jdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLmNyZWF0ZUR5bmFtaWNJbnRlZ3JhdGlvbihwcm9wcy5zZXJ2ZXJGdW5jdGlvbik7XG4gICAgfSBlbHNlIGlmIChwcm9wcy52cGMpIHtcbiAgICAgIC8vIFtGdXR1cmVdIGNyZWF0ZSBpbnRlZ3JhdGlvbiB3aXRoIEVDUyB2aWEgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogTmV4dGpzQXBpUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnNlcnZlckZ1bmN0aW9uICYmICFwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlcnZlckZ1bmN0aW9uIG9yIHZwYyBtdXN0IGJlIHNldCBpbiBOZXh0anNBcGlQcm9wc1wiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlc3RBcGkoKTogUmVzdEFwaSB7XG4gICAgcmV0dXJuIG5ldyBSZXN0QXBpKHRoaXMsIFwiUmVzdEFwaVwiLCB7XG4gICAgICBiaW5hcnlNZWRpYVR5cGVzOiBbXCIqLypcIl0sXG4gICAgICBkZXNjcmlwdGlvbjogYGNkay1uZXh0anMgUkVTVCBBUEkgZm9yICR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcbiAgICAgIG1pbkNvbXByZXNzaW9uU2l6ZTogU2l6ZS5ieXRlcygwKSwgLy8gY29tcHJlc3MgYWxsIHJlc3BvbnNlcyBmb3IgYmV0dGVyIHBlcmZcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5yZXN0QXBpUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGJhc2UgcmVzb3VyY2UgcGF0aCBpZiBuZWVkZWQuIEltcG9ydGFudCBpZiBgYmFzZVBhdGhgIGlzIHNldC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQmFzZVJlc291cmNlKGJhc2VQYXRoPzogc3RyaW5nKTogSVJlc291cmNlIHtcbiAgICAvLyBDcmVhdGUgYmFzZSByZXNvdXJjZSBwYXRoIGlmIG5lZWRlZFxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVCYXNlUGF0aChiYXNlUGF0aCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQgPyB0aGlzLmFwaS5yb290LmFkZFJlc291cmNlKG5vcm1hbGl6ZWQpIDogdGhpcy5hcGkucm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljSW50ZWdyYXRpb25Sb2xlKCkge1xuICAgIC8vIENyZWF0ZSBTMyBpbnRlZ3JhdGlvbiByb2xlXG4gICAgY29uc3Qgc3RhdGljSW50ZWdyYXRpb25Sb2xlID0gbmV3IFJvbGUodGhpcywgXCJTdGF0aWNJbnRlZ3JhdGlvblJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiKSxcbiAgICB9KTtcblxuICAgIHN0YXRpY0ludGVncmF0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzMzpHZXRPYmplY3RcIiwgXCJzMzpMaXN0QnVja2V0XCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXRBcm4sXG4gICAgICAgICAgYCR7dGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0QXJufS8qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHN0YXRpY0ludGVncmF0aW9uUm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljSW50ZWdyYXRpb25zKCkge1xuICAgIHRoaXMubmV4dFJlc291cmNlXG4gICAgICAuYWRkUmVzb3VyY2UoXCJzdGF0aWNcIilcbiAgICAgIC5hZGRSZXNvdXJjZShcIntwcm94eSt9XCIpXG4gICAgICAuYWRkTWV0aG9kKFxuICAgICAgICBcIkdFVFwiLFxuICAgICAgICB0aGlzLmNyZWF0ZVMzSW50ZWdyYXRpb24oeyBrZXk6IHRoaXMuczNLZXkoXCJfbmV4dC9zdGF0aWMve2tleX1cIikgfSksXG4gICAgICAgIHRoaXMuZ2V0U3RhdGljTWV0aG9kT3B0aW9ucyh7IHByb3h5OiB0cnVlIH0pLFxuICAgICAgKTtcbiAgICAvLyBhZGQgcHVibGljIGRpcmVjdG9yeSBmaWxlcy9kaXJlY3RvcmllcyB0aGF0IGV4aXN0IGF0IHRvcCBsZXZlbCBidXQgbmVlZCB0byBnbyB0byBTMy5cbiAgICBmb3IgKGNvbnN0IHB1YmxpY0RpckVudHJ5IG9mIHRoaXMucHJvcHMucHVibGljRGlyRW50cmllcykge1xuICAgICAgaWYgKHB1YmxpY0RpckVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIHRoaXMuYmFzZVJlc291cmNlXG4gICAgICAgICAgLmFkZFJlc291cmNlKHB1YmxpY0RpckVudHJ5Lm5hbWUpXG4gICAgICAgICAgLmFkZFJlc291cmNlKFwie3Byb3h5K31cIilcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7XG4gICAgICAgICAgICAgIGtleTogdGhpcy5zM0tleShgJHtwdWJsaWNEaXJFbnRyeS5uYW1lfS97a2V5fWApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eTogdHJ1ZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5iYXNlUmVzb3VyY2VcbiAgICAgICAgICAuYWRkUmVzb3VyY2UocHVibGljRGlyRW50cnkubmFtZSlcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleTogdGhpcy5zM0tleShwdWJsaWNEaXJFbnRyeS5uYW1lKSB9KSxcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RhdGljTWV0aG9kT3B0aW9ucygpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWZpeGVzIGEgcmVxdWVzdCBwYXRoIHdpdGggdGhlIGtleSBwcmVmaXggdGhlIGFzc2V0cyB3ZXJlIHVwbG9hZGVkIHVuZGVyLFxuICAgKiBzaW5jZSB0aGUgUzMgaW50ZWdyYXRpb25zIGFkZHJlc3Mgb2JqZWN0cyBieSBrZXkgcmF0aGVyIHRoYW4gYnkgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBzM0tleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW5QYXRoKHRoaXMucHJvcHMuc3RhdGljQXNzZXRzS2V5UHJlZml4LCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgQVBJIHJlcXVlc3QgdG8gUzMgcmVxdWVzdC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcmVzdC1hcGktcGFyYW1ldGVyLW1hcHBpbmctc291cmNlcy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2ludGVncmF0aW5nLWFwaS13aXRoLWF3cy1zZXJ2aWNlcy1zMy5odG1sI2FwaS1pdGVtcy1pbi1mb2xkZXItYXMtczMtb2JqZWN0cy1pbi1idWNrZXRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcbiAgICBjb25zdCBzM0ludGVncmF0aW9uID0gbmV3IEF3c0ludGVncmF0aW9uKHtcbiAgICAgIHNlcnZpY2U6IFwiczNcIixcbiAgICAgIGludGVncmF0aW9uSHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICAgIHBhdGg6IGAke3RoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9LyR7a2V5fWAsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGNyZWRlbnRpYWxzUm9sZTogdGhpcy5zdGF0aWNJbnRlZ3JhdGlvblJvbGUsXG4gICAgICAgIHBhc3N0aHJvdWdoQmVoYXZpb3I6IFBhc3N0aHJvdWdoQmVoYXZpb3IuV0hFTl9OT19URU1QTEFURVMsIC8vIHJlY29tbWVuZGVkXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiBrZXkuaW5jbHVkZXMoXCJ7a2V5fVwiKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlcXVlc3QucGF0aC5rZXlcIjogXCJtZXRob2QucmVxdWVzdC5wYXRoLnByb3h5XCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVncmF0aW9uUmVzcG9uc2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzQ29kZTogXCIyMDBcIixcbiAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LUxlbmd0aFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5DYWNoZS1Db250cm9sXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuRVRhZ1wiOiBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5FVGFnXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgICAgICBzZWxlY3Rpb25QYXR0ZXJuOiBcIjQwNFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0ludGVncmF0aW9uUHJvcHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHMzSW50ZWdyYXRpb247XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eSB9ID0geyBwcm94eTogZmFsc2UgfSk6IE1ldGhvZE9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyczogcHJveHlcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBcIm1ldGhvZC5yZXF1ZXN0LnBhdGgucHJveHlcIjogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgbWV0aG9kUmVzcG9uc2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBcIjIwMFwiLFxuICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtVHlwZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkVUYWdcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnMzTWV0aG9kT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIHRoZSBgX25leHQvaW1hZ2VgIHJvdXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUludGVncmF0aW9uKGltYWdlRnVuY3Rpb246IElGdW5jdGlvbikge1xuICAgIC8vIGltYWdlRnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSB0aGUgZGVkaWNhdGVkLCBzdHJlYW1pbmctY2FwYWJsZSBpbWFnZVxuICAgIC8vIExhbWJkYSAoc2VlIGl0cyBkb2MgY29tbWVudCk7IG92ZXJyaWRlIHJlc3BvbnNlVHJhbnNmZXJNb2RlIHZpYVxuICAgIC8vIGltYWdlSW50ZWdyYXRpb25Qcm9wcyBpZiB0aGF0IGFzc3VtcHRpb24gZG9lc24ndCBob2xkIGZvciBhIGN1c3RvbVxuICAgIC8vIGltYWdlRnVuY3Rpb24sIG90aGVyd2lzZSBBUEkgR2F0ZXdheSByZXR1cm5zIGEgNTAyLiBEZWxpYmVyYXRlbHlcbiAgICAvLyBkb2Vzbid0IGluaGVyaXQgZHluYW1pY0ludGVncmF0aW9uUHJvcHM6IHRoYXQncyBmb3Igc2VydmVyRnVuY3Rpb24sXG4gICAgLy8gYSBkaWZmZXJlbnQgTGFtYmRhIHdpdGggZGlmZmVyZW50IChhbmQgcG9zc2libHkgY29uZmxpY3RpbmcsIGUuZy5cbiAgICAvLyBCVUZGRVJFRCBmb3IgYSBub24tc3RyZWFtaW5nIExhbWJkYSBXZWIgQWRhcHRlciBzZXR1cCkgc3RyZWFtaW5nXG4gICAgLy8gcmVxdWlyZW1lbnRzIHRoYW4gdGhlIGFsd2F5cy1zdHJlYW1pbmcgZGVkaWNhdGVkIGltYWdlIExhbWJkYS5cbiAgICBjb25zdCBpbWFnZUludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKGltYWdlRnVuY3Rpb24sIHtcbiAgICAgIHJlc3BvbnNlVHJhbnNmZXJNb2RlOiBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uaW1hZ2VJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuICAgIGNvbnN0IGltYWdlUmVzb3VyY2UgPSB0aGlzLm5leHRSZXNvdXJjZS5hZGRSZXNvdXJjZShcImltYWdlXCIpO1xuICAgIGltYWdlUmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIGltYWdlSW50ZWdyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIGFsbCBvdGhlciByb3V0ZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0ludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uOiBJRnVuY3Rpb24pIHtcbiAgICAvLyBBbGwgb3RoZXIgcm91dGVzIHVzZSBzdHJlYW1pbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IHN0cmVhbWluZ0ludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uLCB7XG4gICAgICByZXNwb25zZVRyYW5zZmVyTW9kZTogUmVzcG9uc2VUcmFuc2Zlck1vZGUuU1RSRUFNLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGNhdGNoLWFsbCByb3V0ZXMgd2l0aCBzdHJlYW1pbmcgaW50ZWdyYXRpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgIHRoaXMuYmFzZVJlc291cmNlLmFkZE1ldGhvZChcIkFOWVwiLCBzdHJlYW1pbmdJbnRlZ3JhdGlvbik7XG4gICAgY29uc3QgcHJveHlSZXNvdXJjZSA9IHRoaXMuYmFzZVJlc291cmNlLmFkZFJlc291cmNlKFwie3Byb3h5K31cIik7XG4gICAgcHJveHlSZXNvdXJjZS5hZGRNZXRob2QoXCJBTllcIiwgc3RyZWFtaW5nSW50ZWdyYXRpb24pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};