cdk-nextjs 0.7.10 → 0.7.12

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 (64) hide show
  1. package/.jsii +76 -22
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +59 -3
  4. package/README.md +2 -2
  5. package/docs/breaking-changes.md +32 -0
  6. package/docs/harness-coverage.md +1 -1
  7. package/docs/next-build-output-guide.md +1 -1
  8. package/docs/nextjs-private-apis.md +128 -0
  9. package/lib/adapter/adapter.mjs +276 -24
  10. package/lib/adapter/build-outputs.d.ts +1 -1
  11. package/lib/adapter/build-outputs.js +29 -13
  12. package/lib/adapter/build-outputs.test.js +35 -7
  13. package/lib/adapter/cache-handler.d.ts +1 -1
  14. package/lib/adapter/cache-handler.js +1 -1
  15. package/lib/adapter/cache-kinds.d.ts +12 -1
  16. package/lib/adapter/cache-kinds.js +16 -4
  17. package/lib/adapter/init-cache.js +7 -7
  18. package/lib/adapter/local-file-cache-handler.d.ts +1 -1
  19. package/lib/adapter/local-file-cache-handler.js +1 -1
  20. package/lib/adapter/memory-cache-handler.d.ts +2 -2
  21. package/lib/adapter/memory-cache-handler.js +1 -1
  22. package/lib/adapter/s3-cache-handler.d.ts +2 -2
  23. package/lib/adapter/s3-cache-handler.js +1 -1
  24. package/lib/adapter/use-cache-common.d.ts +1 -1
  25. package/lib/adapter/use-cache-common.js +1 -1
  26. package/lib/adapter/use-cache-common.test.js +1 -1
  27. package/lib/adapter/use-cache-default-handler.d.ts +1 -1
  28. package/lib/adapter/use-cache-default-handler.js +1 -1
  29. package/lib/adapter/use-cache-handlers.test.js +1 -1
  30. package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
  31. package/lib/adapter/use-cache-remote-handler.js +1 -1
  32. package/lib/cdk-nextjs-version.d.ts +10 -0
  33. package/lib/cdk-nextjs-version.js +15 -0
  34. package/lib/nextjs-api.js +1 -1
  35. package/lib/nextjs-build/nextjs-build.js +7 -6
  36. package/lib/nextjs-build/nextjs-build.test.js +16 -3
  37. package/lib/nextjs-cache.js +1 -1
  38. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  39. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  40. package/lib/nextjs-distribution.js +5 -5
  41. package/lib/nextjs-post-deploy.js +1 -1
  42. package/lib/nextjs-static-assets.d.ts +74 -5
  43. package/lib/nextjs-static-assets.js +276 -41
  44. package/lib/nextjs-static-assets.test.js +286 -1
  45. package/lib/root-constructs/nextjs-base-construct.d.ts +5 -4
  46. package/lib/root-constructs/nextjs-base-construct.js +17 -8
  47. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  48. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  49. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  50. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  51. package/lib/runtime/core.test.js +17 -8
  52. package/lib/runtime/dispatch.js +4 -5
  53. package/lib/runtime/image-utils.d.ts +1 -0
  54. package/lib/runtime/image-utils.js +2 -1
  55. package/lib/runtime/image-utils.test.js +17 -1
  56. package/lib/runtime/image.js +47 -33
  57. package/lib/runtime/image.test.js +47 -26
  58. package/lib/runtime/lambda.mjs +281 -37
  59. package/lib/runtime/manifest.d.ts +34 -8
  60. package/lib/runtime/manifest.js +7 -5
  61. package/lib/runtime/server.mjs +281 -37
  62. package/package.json +1 -1
  63. package/scripts/capture-adapter-fixture.mjs +13 -1
  64. package/scripts/zero-config-build.mjs +5 -1
@@ -32,6 +32,22 @@ describe("fetchFromS3", () => {
32
32
  ETag: '"abc123"',
33
33
  });
34
34
  const keyOf = () => client_s3_1.GetObjectCommand.mock.calls[0][0].Key;
35
+ // What `fetchInternalImage` passes on for a file `next start` serves.
36
+ it("returns the object's Cache-Control", async () => {
37
+ mockSend.mockResolvedValue({
38
+ Body: asyncIterableFrom([Buffer.from("data")]),
39
+ ContentType: "image/png",
40
+ CacheControl: "public, max-age=31536000, immutable",
41
+ ETag: '"abc123"',
42
+ });
43
+ const result = await (0, image_utils_1.fetchFromS3)(s3, "bucket", "/_next/static/media/logo.png", ROOT, 1024);
44
+ expect(result.cacheControl).toBe("public, max-age=31536000, immutable");
45
+ });
46
+ it("returns a null Cache-Control for an object without one", async () => {
47
+ ok();
48
+ const result = await (0, image_utils_1.fetchFromS3)(s3, "bucket", "/logo.png", ROOT, 1024);
49
+ expect(result.cacheControl).toBeNull();
50
+ });
35
51
  it("strips the leading slash when the assets sit at the bucket root", async () => {
36
52
  ok();
37
53
  await (0, image_utils_1.fetchFromS3)(s3, "my-bucket", "/static/foo.png", {
@@ -246,4 +262,4 @@ describe("resolveErrorResponse", () => {
246
262
  });
247
263
  });
248
264
  });
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXRpbHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2ltYWdlLXV0aWxzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRWhDLGtEQUFnRTtBQUNoRSw0RUFBaUU7QUFDakUsK0NBS3VCO0FBRXZCLFNBQVMsaUJBQWlCLENBQUMsTUFBb0I7SUFDN0MsT0FBTztRQUNMLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixPQUFPO2dCQUNMLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUNmLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTTtvQkFDZixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDckMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2FBQ3ZDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxJQUFJLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUVoRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxvQkFBUSxDQUFDLEVBQUUsQ0FBd0IsQ0FBQztJQUVuRCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2IsRUFBMkMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQzdELFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2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QUMvRCxVQUFVLEVBQUUsR0FBRztZQUNmLE9BQU8sRUFBRSx1QkFBdUI7U0FDakMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuamVzdC5tb2NrKFwiQGF3cy1zZGsvY2xpZW50LXMzXCIpO1xuXG5pbXBvcnQgeyBHZXRPYmplY3RDb21tYW5kLCBTM0NsaWVudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB7IEltYWdlRXJyb3IgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIjtcbmltcG9ydCB7XG4gIGV4dHJhY3RFdGFnLFxuICBmZXRjaEZyb21TMyxcbiAgSW1hZ2VUb29MYXJnZUVycm9yLFxuICByZXNvbHZlRXJyb3JSZXNwb25zZSxcbn0gZnJvbSBcIi4vaW1hZ2UtdXRpbHNcIjtcblxuZnVuY3Rpb24gYXN5bmNJdGVyYWJsZUZyb20oY2h1bmtzOiBVaW50OEFycmF5W10pOiBBc3luY0l0ZXJhYmxlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogYXN5bmMgKCkgPT5cbiAgICAgICAgICBpIDwgY2h1bmtzLmxlbmd0aFxuICAgICAgICAgICAgPyB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogY2h1bmtzW2krK10gfVxuICAgICAgICAgICAgOiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIE5vIGFwcCBgYmFzZVBhdGhgLCBhc3NldHMgYXQgdGhlIHJvb3Qgb2YgdGhlIGJ1Y2tldDogdGhlIGRlZmF1bHQuICovXG5jb25zdCBST09UID0geyB1cmxCYXNlUGF0aDogXCJcIiwga2V5UHJlZml4OiBcIlwiIH07XG5cbmRlc2NyaWJlKFwiZmV0Y2hGcm9tUzNcIiwgKCkgPT4ge1xuICBjb25zdCBtb2NrU2VuZCA9IGplc3QuZm4oKTtcbiAgY29uc3QgczMgPSBuZXcgUzNDbGllbnQoe30pIGFzIHVua25vd24gYXMgUzNDbGllbnQ7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgKHMzIGFzIHVua25vd24gYXMgeyBzZW5kOiB0eXBlb2YgbW9ja1NlbmQgfSkuc2VuZCA9IG1vY2tTZW5kO1xuICAgIG1vY2tTZW5kLm1vY2tSZXNldCgpO1xuICB9KTtcblxuICBjb25zdCBvayA9ICgpID0+XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiZGF0YVwiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICBFVGFnOiAnXCJhYmMxMjNcIicsXG4gICAgfSk7XG4gIGNvbnN0IGtleU9mID0gKCkgPT5cbiAgICAoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXS5LZXk7XG5cbiAgaXQoXCJzdHJpcHMgdGhlIGxlYWRpbmcgc2xhc2ggd2hlbiB0aGUgYXNzZXRzIHNpdCBhdCB0aGUgYnVja2V0IHJvb3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG9rKCk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3N0YXRpYy9mb28ucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIlwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdCgoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXSkudG9FcXVhbChcbiAgICAgIHsgQnVja2V0OiBcIm15LWJ1Y2tldFwiLCBLZXk6IFwic3RhdGljL2Zvby5wbmdcIiB9LFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiYXBwbGllcyB0aGUgYnVja2V0IGtleSBwcmVmaXhcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG9rKCk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3N0YXRpYy9mb28uanBnXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICAgIGtleVByZWZpeDogXCJiYXNlXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKFwiYmFzZS9zdGF0aWMvZm9vLmpwZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2VzIG5vdCByZXBlYXQgdGhlIHByZWZpeCB3aGVuIHRoZSB1cmwgYWxyZWFkeSBjYXJyaWVzIGJhc2VQYXRoXCIsIGFzeW5jICgpID0+IHtcbiAgICBvaygpO1xuXG4gICAgLy8gbmV4dC1pbWFnZS1sb2FkZXIgYmFrZXMgYGJhc2VQYXRoYCBpbnRvIHRoZSBocmVmIG9mIGEgc3RhdGljYWxseSBpbXBvcnRlZFxuICAgIC8vIGltYWdlLCB1bmxpa2UgYSBwbGFpbiBzdHJpbmcgcGF0aC5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL2Jhc2UvX25leHQvc3RhdGljL21lZGlhL2EucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICAgIGtleVByZWZpeDogXCJiYXNlXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKFwiYmFzZS9fbmV4dC9zdGF0aWMvbWVkaWEvYS5wbmdcIik7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBUaGUgQVBJIEdhdGV3YXkgZGVwbG95bWVudCB0eXBlcyBzZXJ2ZSB0aGUgYXBwIHVuZGVyIHRoZSBzdGFnZSBuYW1lLCBzbyB0aGVcbiAgICogYXBwJ3MgYGJhc2VQYXRoYCBpcyBgL3Byb2RgIHdoaWxlIHRoZSBhc3NldHMgd2VyZSB1cGxvYWRlZCB0byB0aGUgcm9vdCBvZiB0aGVcbiAgICogYnVja2V0LiBCdWlsZGluZyB0aGUga2V5IGZyb20gYGJhc2VQYXRoYCBhc2tzIFMzIGZvciBgcHJvZC8uLi5gLCB3aGljaCBkb2VzXG4gICAqIG5vdCBleGlzdCwgYW5kIGV2ZXJ5IGxvY2FsIGA8SW1hZ2U+YCA0MDBzLlxuICAgKi9cbiAgaXQoXCJzdHJpcHMgYSBiYXNlUGF0aCB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZSBrZXlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG9rKCk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3Byb2QvX25leHQvc3RhdGljL21lZGlhL2EucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIi9wcm9kXCIsXG4gICAgICAgIGtleVByZWZpeDogXCJcIixcbiAgICAgIH0sXG4gICAgICBJbmZpbml0eSxcbiAgICApO1xuXG4gICAgZXhwZWN0KGtleU9mKCkpLnRvQmUoXCJfbmV4dC9zdGF0aWMvbWVkaWEvYS5wbmdcIik7XG4gIH0pO1xuXG4gIGl0KFwibGVhdmVzIGEgdXJsIHdpdGhvdXQgYmFzZVBhdGggYWxvbmUgd2hlbiB0aGVyZSBpcyBubyBrZXkgcHJlZml4XCIsIGFzeW5jICgpID0+IHtcbiAgICBvaygpO1xuXG4gICAgYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICBzMyxcbiAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICBcIi9zdGF0aWMvZm9vLmpwZ1wiLFxuICAgICAge1xuICAgICAgICB1cmxCYXNlUGF0aDogXCIvcHJvZFwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKFwic3RhdGljL2Zvby5qcGdcIik7XG4gIH0pO1xuXG4gIC8vIFdpdGggYGFzc2V0UHJlZml4OiBcIi9jZG5cImAsIGEgc3RhdGljIGltcG9ydCdzIGhyZWYgaXNcbiAgLy8gYC9jZG4vX25leHQvc3RhdGljL21lZGlhL+KApmAsIHdpdGggYGJhc2VQYXRoYCBub3doZXJlIGluIGl0LlxuICBpdChcInN0cmlwcyBhIHBhdGggYXNzZXRQcmVmaXggaW4gZnJvbnQgb2YgL19uZXh0L1wiLCBhc3luYyAoKSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvY2RuL19uZXh0L3N0YXRpYy9tZWRpYS9hLnBuZ1wiLFxuICAgICAge1xuICAgICAgICB1cmxCYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG4vXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKFwiX25leHQvc3RhdGljL21lZGlhL2EucG5nXCIpO1xuICB9KTtcblxuICBpdChcImxlYXZlcyBhIHB1YmxpYy8gZmlsZSB1bmRlciBhIGRpcmVjdG9yeSBuYW1lZCBsaWtlIHRoZSBhc3NldFByZWZpeCBhbG9uZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvY2RuL2xvZ28ucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIlwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG5cIixcbiAgICAgIH0sXG4gICAgICBJbmZpbml0eSxcbiAgICApO1xuXG4gICAgZXhwZWN0KGtleU9mKCkpLnRvQmUoXCJjZG4vbG9nby5wbmdcIik7XG4gIH0pO1xuXG4gIGl0KFwiaWdub3JlcyBhbiBhYnNvbHV0ZSBhc3NldFByZWZpeFwiLCBhc3luYyAoKSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvX25leHQvc3RhdGljL21lZGlhL2EucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIlwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICAgIGFzc2V0UHJlZml4OiBcImh0dHBzOi8vY2RuLmV4YW1wbGUudGVzdFwiLFxuICAgICAgfSxcbiAgICAgIEluZmluaXR5LFxuICAgICk7XG5cbiAgICBleHBlY3Qoa2V5T2YoKSkudG9CZShcIl9uZXh0L3N0YXRpYy9tZWRpYS9hLnBuZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJvbmx5IG1hdGNoZXMgYmFzZVBhdGggb24gYSBwYXRoIGJvdW5kYXJ5XCIsIGFzeW5jICgpID0+IHtcbiAgICBvaygpO1xuXG4gICAgYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICBzMyxcbiAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICBcIi9iYXNlbWVudC9sb2dvLnBuZ1wiLFxuICAgICAge1xuICAgICAgICB1cmxCYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiYmFzZVwiLFxuICAgICAgfSxcbiAgICAgIEluZmluaXR5LFxuICAgICk7XG5cbiAgICBleHBlY3Qoa2V5T2YoKSkudG9CZShcImJhc2UvYmFzZW1lbnQvbG9nby5wbmdcIik7XG4gIH0pO1xuXG4gIC8vIENhcnJpZWQgb3ZlciBmcm9tICMyNjcsIHdoaWNoIGZpeGVkIHRoZSBzYW1lIGJ1ZyBpbiB0aGUgcHJlLWFkYXB0ZXIgaW1hZ2VcbiAgLy8gaGFuZGxlcjogYSBgZGVzdGluYXRpb25LZXlQcmVmaXhgIG92ZXJyaWRlIGNhbiBhcnJpdmUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICBpdChcImRvZXNuJ3QgZG91YmxlIHRoZSBzZXBhcmF0b3Igd2hlbiB0aGUga2V5IHByZWZpeCBoYXMgYSB0cmFpbGluZyBzbGFzaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvc3RhdGljL2Zvby5qcGdcIixcbiAgICAgIHtcbiAgICAgICAgdXJsQmFzZVBhdGg6IFwiXCIsXG4gICAgICAgIGtleVByZWZpeDogXCJiYXNlL1wiLFxuICAgICAgfSxcbiAgICAgIEluZmluaXR5LFxuICAgICk7XG5cbiAgICBleHBlY3Qoa2V5T2YoKSkudG9CZShcImJhc2Uvc3RhdGljL2Zvby5qcGdcIik7XG4gIH0pO1xuXG4gIC8vIGBuZXh0LWltYWdlLWxlZ2FjeS91bmljb2RlYCwgd2hvc2UgYHB1YmxpYy9gIGhvbGRzIGJvdGggb2YgdGhlc2UgbmFtZXMuIFRoZVxuICAvLyBzcGFjZSBpcyB3aGF0IGJyb2tlOiB0aGUga2V5IGlzIHRoZSBmaWxlJ3MgcmVhbCBuYW1lLCB0aGUgdXJsIGlzIGEgVVJMIHBhdGguXG4gIGl0LmVhY2goW1xuICAgIFtcIi9oZWxsbyUyMHdvcmxkLmpwZ1wiLCBcImhlbGxvIHdvcmxkLmpwZ1wiXSxcbiAgICBbXCIvw6TDtsO8xaHEjcWZw60ucG5nXCIsIFwiw6TDtsO8xaHEjcWZw60ucG5nXCJdLFxuICAgIFtcIi8lQzMlQTQlQzMlQjYucG5nXCIsIFwiw6TDti5wbmdcIl0sXG4gIF0pKFwiZGVjb2RlcyAlcyBpbnRvIHRoZSBvYmplY3QncyByZWFsIG5hbWVcIiwgYXN5bmMgKHVybCwga2V5KSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCB1cmwsIFJPT1QsIEluZmluaXR5KTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKGtleSk7XG4gIH0pO1xuXG4gIC8vIEEgY2FjaGUtYnVzdGVyIG9uIGEgbG9jYWwgc3JjOiBgbmV4dCBzdGFydGAgcm91dGVzIHRoZSBocmVmIGFzIGEgcmVxdWVzdCwgc29cbiAgLy8gdGhlIHF1ZXJ5IGFuZCBmcmFnbWVudCBuZXZlciByZWFjaCB0aGUgZmlsZSBsb29rdXAuXG4gIGl0LmVhY2goW1xuICAgIFtcIi9sb2dvLnBuZz92PTJcIiwgXCJsb2dvLnBuZ1wiXSxcbiAgICBbXCIvbG9nby5wbmcjdG9wXCIsIFwibG9nby5wbmdcIl0sXG4gICAgW1wiL2xvZ28ucG5nP3Y9MiN0b3BcIiwgXCJsb2dvLnBuZ1wiXSxcbiAgICBbXCIvYmFzZS9sb2dvLnBuZz92PTJcIiwgXCJsb2dvLnBuZ1wiXSxcbiAgICAvLyBBIGA/YCB0aGF0IGlzIHBhcnQgb2YgdGhlIG5hbWUgYXJyaXZlcyBlbmNvZGVkIGFuZCBpcyBub3QgYSBxdWVyeS5cbiAgICBbXCIvd2hhdCUzRi5wbmc/dj0yXCIsIFwid2hhdD8ucG5nXCJdLFxuICBdKShcImtleXMgJXMgYnkgaXRzIHBhdGggYWxvbmVcIiwgYXN5bmMgKHVybCwga2V5KSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgdXJsLFxuICAgICAge1xuICAgICAgICB1cmxCYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKGtleSk7XG4gIH0pO1xuXG4gIGl0KFwibGVhdmVzIGEgbmFtZSB0aGF0IGlzbid0IHZhbGlkIHBlcmNlbnQtZW5jb2RpbmcgYWxvbmVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG9rKCk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhzMywgXCJteS1idWNrZXRcIiwgXCIvMTAwJS5wbmdcIiwgUk9PVCwgSW5maW5pdHkpO1xuXG4gICAgZXhwZWN0KGtleU9mKCkpLnRvQmUoXCIxMDAlLnBuZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgYnVmZmVyLCBjb250ZW50IHR5cGUsIGFuZCBldGFnXCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJoZWxcIiksIEJ1ZmZlci5mcm9tKFwibG9cIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBcImltYWdlL2pwZWdcIixcbiAgICAgIEVUYWc6ICdcInRoZS1ldGFnXCInLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICBzMyxcbiAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICBcIi9mb28uanBnXCIsXG4gICAgICBST09ULFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChyZXN1bHQuYnVmZmVyLnRvU3RyaW5nKCkpLnRvQmUoXCJoZWxsb1wiKTtcbiAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRUeXBlKS50b0JlKFwiaW1hZ2UvanBlZ1wiKTtcbiAgICBleHBlY3QocmVzdWx0LmV0YWcpLnRvQmUoJ1widGhlLWV0YWdcIicpO1xuICB9KTtcblxuICBpdChcInJldHVybnMgYW4gZW1wdHkgZXRhZyB3aGVuIFMzIGRvZXNuJ3QgcHJvdmlkZSBvbmVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImRhdGFcIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBudWxsLFxuICAgICAgRVRhZzogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICBzMyxcbiAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICBcIi9mb28ucG5nXCIsXG4gICAgICBST09ULFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXRhZykudG9CZShcIlwiKTtcbiAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRUeXBlKS50b0JlTnVsbCgpO1xuICB9KTtcblxuICAvLyBgaW1hZ2VzLm1heGltdW1SZXNwb25zZUJvZHlgLCB3aGljaCBgbmV4dCBzdGFydGAgZW5mb3JjZXMgb24gbG9jYWwgc291cmNlcy5cbiAgaXQoXCJyZWZ1c2VzIGFuIG9iamVjdCB3aG9zZSBDb250ZW50TGVuZ3RoIGlzIG92ZXIgdGhlIGxpbWl0LCB1bnJlYWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRlc3Ryb3kgPSBqZXN0LmZuKCk7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogeyAuLi5hc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJuZXZlciByZWFkXCIpXSksIGRlc3Ryb3kgfSxcbiAgICAgIENvbnRlbnRMZW5ndGg6IDExLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL2JpZy5wbmdcIiwgUk9PVCwgMTApLFxuICAgICkucmVqZWN0cy50b0JlSW5zdGFuY2VPZihJbWFnZVRvb0xhcmdlRXJyb3IpO1xuICAgIGV4cGVjdChkZXN0cm95KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwic3RvcHMgcmVhZGluZyBvbmNlIHRoZSBieXRlcyByZWFkIHBhc3MgdGhlIGxpbWl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJoZWxcIiksIEJ1ZmZlci5mcm9tKFwibG9cIildKSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9iaWcucG5nXCIsIFJPT1QsIDQpLFxuICAgICkucmVqZWN0cy50b0JlSW5zdGFuY2VPZihJbWFnZVRvb0xhcmdlRXJyb3IpO1xuICAgIC8vIEF0IHRoZSBsaW1pdCBleGFjdGx5IGlzIGZpbmUuXG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiaGVsXCIpLCBCdWZmZXIuZnJvbShcImxvXCIpXSksXG4gICAgICBDb250ZW50TGVuZ3RoOiA1LFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9vay5wbmdcIiwgUk9PVCwgNSk7XG4gICAgZXhwZWN0KHJlc3VsdC5idWZmZXIudG9TdHJpbmcoKSkudG9CZShcImhlbGxvXCIpO1xuICB9KTtcblxuICBpdChcInRocm93cyB3aGVuIFMzIHJldHVybnMgbm8gYm9keVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoeyBCb2R5OiB1bmRlZmluZWQgfSk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBmZXRjaEZyb21TMyhzMywgXCJteS1idWNrZXRcIiwgXCIvbWlzc2luZy5wbmdcIiwgUk9PVCwgSW5maW5pdHkpLFxuICAgICkucmVqZWN0cy50b1Rocm93KC9FbXB0eSByZXNwb25zZSBmcm9tIFMzLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiZXh0cmFjdEV0YWdcIiwgKCkgPT4ge1xuICBjb25zdCBpbWFnZSA9IEJ1ZmZlci5mcm9tKFwibm90IHJlYWxseSBhIHBuZ1wiKTtcblxuICAvLyBXaGF0IG5leHQncyBvd24gYGV4dHJhY3RFdGFnYCByZXR1cm5zIGZvciB0aGVzZSBpbnB1dHMsIHJlY29yZGVkIGZyb21cbiAgLy8gMTYuNCdzIGBpbWFnZS1vcHRpbWl6ZXIvZXh0cmFjdC1ldGFnLmpzYDogYSBsaXRlcmFsLCBzbyB0aGUgdGVzdCBydW5zIG9uXG4gIC8vIGV2ZXJ5IHN1cHBvcnRlZCBgbmV4dGAsIGluY2x1ZGluZyB0aG9zZSB3aXRob3V0IHRoYXQgbW9kdWxlLlxuICBpdChcIm1hdGNoZXMgbmV4dCdzIG93biwgd2l0aCBhbmQgd2l0aG91dCBhbiB1cHN0cmVhbSBldGFnXCIsICgpID0+IHtcbiAgICBleHBlY3QoZXh0cmFjdEV0YWcoJ1cvXCJhYmNcIicsIGltYWdlKSkudG9CZShcIlZ5OGlZV0pqSWdcIik7XG4gICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIFtcIlwiLCBudWxsLCB1bmRlZmluZWRdKSB7XG4gICAgICBleHBlY3QoZXh0cmFjdEV0YWcobWlzc2luZywgaW1hZ2UpKS50b0JlKFxuICAgICAgICBcIjZRRTMwNTNqQk83N3ZuaUx4VFhINkM4bnE3LUFhVkJmdTlpcDNOeFBJQ1FcIixcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInJlc29sdmVFcnJvclJlc3BvbnNlXCIsICgpID0+IHtcbiAgaXQoXCJwcmVzZXJ2ZXMgdGhlIHN0YXR1cyBjb2RlIGFuZCBtZXNzYWdlIGZyb20gYW4gSW1hZ2VFcnJvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgSW1hZ2VFcnJvcig0MDAsICdcInVybFwiIHBhcmFtZXRlciBpcyBub3QgYWxsb3dlZCcpO1xuXG4gICAgZXhwZWN0KHJlc29sdmVFcnJvclJlc3BvbnNlKGVycm9yLCBJbWFnZUVycm9yKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICBtZXNzYWdlOiAnXCJ1cmxcIiBwYXJhbWV0ZXIgaXMgbm90IGFsbG93ZWQnLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcIm1hcHMgYSBzb3VyY2Ugb3ZlciBpbWFnZXMubWF4aW11bVJlc3BvbnNlQm9keSB0byBuZXh0IHN0YXJ0J3MgNDEzXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICByZXNvbHZlRXJyb3JSZXNwb25zZShuZXcgSW1hZ2VUb29MYXJnZUVycm9yKFwiYmlnLnBuZ1wiKSwgSW1hZ2VFcnJvciksXG4gICAgKS50b0VxdWFsKHtcbiAgICAgIHN0YXR1c0NvZGU6IDQxMyxcbiAgICAgIG1lc3NhZ2U6ICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaW50ZXJuYWwgcmVzcG9uc2UgaXMgaW52YWxpZCcsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiZmFsbHMgYmFjayB0byA1MDAgZm9yIHVucmVjb2duaXplZCBlcnJvcnNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShuZXcgRXJyb3IoXCJib29tXCIpLCBJbWFnZUVycm9yKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIH0pO1xuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShcIm5vdCBhbiBlcnJvclwiLCBJbWFnZUVycm9yKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXRpbHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2ltYWdlLXV0aWxzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRWhDLGtEQUFnRTtBQUNoRSw0RUFBaUU7QUFDakUsK0NBS3VCO0FBRXZCLFNBQVMsaUJBQWlCLENBQUMsTUFBb0I7SUFDN0MsT0FBTztRQUNMLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixPQUFPO2dCQUNMLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUNmLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTTtvQkFDZixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDckMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2FBQ3ZDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxJQUFJLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUVoRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxvQkFBUSxDQUFDLEVBQUUsQ0FBd0IsQ0FBQztJQUVuRCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2IsRUFBMkMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQzdELFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUNkLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztRQUN6QixJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDOUMsV0FBVyxFQUFFLFdBQVc7UUFDeEIsSUFBSSxFQUFFLFVBQVU7S0FDakIsQ0FBQyxDQUFDO0lBQ0wsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQ2hCLDRCQUF5QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRWxFLHNFQUFzRTtJQUN0RSxFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1lBQ3pCLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM5QyxXQUFXLEVBQUUsV0FBVztZQUN4QixZQUFZLEVBQUUscUNBQXFDO1lBQ25ELElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSx5QkFBVyxFQUM5QixFQUFFLEVBQ0YsUUFBUSxFQUNSLDhCQUE4QixFQUM5QixJQUFJLEVBQ0osSUFBSSxDQUNMLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3RFLEVBQUUsRUFBRSxDQUFDO1FBQ0wsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLHlCQUFXLEVBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaUVBQWlFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0UsRUFBRSxFQUFFLENBQUM7UUFFTCxNQUFNLElBQUEseUJBQVcsRUFDZixFQUFFLEVBQ0YsV0FBVyxFQUNYLGlCQUFpQixFQUNqQjtZQUNFLFdBQVcsRUFBRSxFQUFFO1lBQ2YsU0FBUyxFQUFFLEVBQUU7U0FDZCxFQUNELFFBQVEsQ0FDVCxDQUFDO1FBRUYsTUFBTSxDQUFFLDRCQUF5QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ3pFLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsQ0FDL0MsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtCQUErQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzdDLEVBQUUsRUFBRSxDQUFDO1FBRUwsTUFBTSxJQUFBLHlCQUFXLEVBQ2YsRUFBRSxFQUNGLFdBQVcsRUFDWCxpQkFBaUIsRUFDakI7WUFDRSxXQUFXLEVBQUUsT0FBTztZQUNwQixTQUFTLEVBQUUsTUFBTTtTQUNsQixFQUNELFFBQVEsQ0FDVCxDQUFDO1FBRUYsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0VBQWtFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEYsRUFBRSxFQUFFLENBQUM7UUFFTCw0RUFBNEU7UUFDNUUscUNBQXFDO1FBQ3JDLE1BQU0sSUFBQSx5QkFBVyxFQUNmLEVBQUUsRUFDRixXQUFXLEVBQ1gsZ0NBQWdDLEVBQ2hDO1lBQ0UsV0FBVyxFQUFFLE9BQU87WUFDcEIsU0FBUyxFQUFFLE1BQU07U0FDbEIsRUFDRCxRQUFRLENBQ1QsQ0FBQztRQUVGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7O09BS0c7SUFDSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDN0QsRUFBRSxFQUFFLENBQUM7UUFFTCxNQUFNLElBQUEseUJBQVcsRUFDZixFQUFFLEVBQ0YsV0FBVyxFQUNYLGdDQUFnQyxFQUNoQztZQUNFLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLFNBQVMsRUFBRSxFQUFFO1NBQ2QsRUFDRCxRQUFRLENBQ1QsQ0FBQztRQUVGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlFQUFpRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQy9FLEVBQUUsRUFBRSxDQUFDO1FBRUwsTUFBTSxJQUFBLHlCQUFXLEVBQ2YsRUFBRSxFQUNGLFdBQVcsRUFDWCxpQkFBaUIsRUFDakI7WUFDRSxXQUFXLEVBQUUsT0FBTztZQUNwQixTQUFTLEVBQUUsRUFBRTtTQUNkLEVBQ0QsUUFBUSxDQUNULENBQUM7UUFFRixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztJQUVILHdEQUF3RDtJQUN4RCw4REFBOEQ7SUFDOUQsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzdELEVBQUUsRUFBRSxDQUFDO1FBRUwsTUFBTSxJQUFBLHlCQUFXLEVBQ2YsRUFBRSxFQUNGLFdBQVcsRUFDWCwrQkFBK0IsRUFDL0I7WUFDRSxXQUFXLEVBQUUsT0FBTztZQUNwQixTQUFTLEVBQUUsRUFBRTtZQUNiLFdBQVcsRUFBRSxPQUFPO1NBQ3JCLEVBQ0QsUUFBUSxDQUNULENBQUM7UUFFRixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwRUFBMEUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RixFQUFFLEVBQUUsQ0FBQztRQUVMLE1BQU0sSUFBQSx5QkFBVyxFQUNmLEVBQUUsRUFDRixXQUFXLEVBQ1gsZUFBZSxFQUNmO1lBQ0UsV0FBVyxFQUFFLEVBQUU7WUFDZixTQUFTLEVBQUUsRUFBRTtZQUNiLFdBQVcsRUFBRSxNQUFNO1NBQ3BCLEVBQ0QsUUFBUSxDQUNULENBQUM7UUFFRixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsRUFBRSxFQUFFLENBQUM7UUFFTCxNQUFNLElBQUEseUJBQVcsRUFDZixFQUFFLEVBQ0YsV0FBVyxFQUNYLDJCQUEyQixFQUMzQjtZQUNFLFdBQVcsRUFBRSxFQUFFO1lBQ2YsU0FBUyxFQUFFLEVBQUU7WUFDYixXQUFXLEVBQUUsMEJBQTBCO1NBQ3hDLEVBQ0QsUUFBUSxDQUNULENBQUM7UUFFRixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RCxFQUFFLEVBQUUsQ0FBQztRQUVMLE1BQU0sSUFBQSx5QkFBVyxFQUNmLEVBQUUsRUFDRixXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCO1lBQ0UsV0FBVyxFQUFFLE9BQU87WUFDcEIsU0FBUyxFQUFFLE1BQU07U0FDbEIsRUFDRCxRQUFRLENBQ1QsQ0FBQztRQUVGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsNEVBQTRFO0lBQzVFLCtFQUErRTtJQUMvRSxFQUFFLENBQUMsdUVBQXVFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckYsRUFBRSxFQUFFLENBQUM7UUFFTCxNQUFNLElBQUEseUJBQVcsRUFDZixFQUFFLEVBQ0YsV0FBVyxFQUNYLGlCQUFpQixFQUNqQjtZQUNFLFdBQVcsRUFBRSxFQUFFO1lBQ2YsU0FBUyxFQUFFLE9BQU87U0FDbkIsRUFDRCxRQUFRLENBQ1QsQ0FBQztRQUVGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzlDLENBQUMsQ0FBQyxDQUFDO0lBRUgsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sQ0FBQyxvQkFBb0IsRUFBRSxpQkFBaUIsQ0FBQztRQUN6QyxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUM7UUFDL0IsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUM7S0FDaEMsQ0FBQyxDQUFDLHdDQUF3QyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDOUQsRUFBRSxFQUFFLENBQUM7UUFFTCxNQUFNLElBQUEseUJBQVcsRUFBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFeEQsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBRUgsK0VBQStFO0lBQy9FLHNEQUFzRDtJQUN0RCxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDO1FBQzdCLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQztRQUM3QixDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQztRQUNqQyxDQUFDLG9CQUFvQixFQUFFLFVBQVUsQ0FBQztRQUNsQyxxRUFBcUU7UUFDckUsQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLENBQUM7S0FDbEMsQ0FBQyxDQUFDLDJCQUEyQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDakQsRUFBRSxFQUFFLENBQUM7UUFFTCxNQUFNLElBQUEseUJBQVcsRUFDZixFQUFFLEVBQ0YsV0FBVyxFQUNYLEdBQUcsRUFDSDtZQUNFLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLFNBQVMsRUFBRSxFQUFFO1NBQ2QsRUFDRCxRQUFRLENBQ1QsQ0FBQztRQUVGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRSxFQUFFLEVBQUUsQ0FBQztRQUVMLE1BQU0sSUFBQSx5QkFBVyxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVoRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkUsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1lBQ3pCLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLElBQUksRUFBRSxZQUFZO1NBQ25CLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSx5QkFBVyxFQUM5QixFQUFFLEVBQ0YsV0FBVyxFQUNYLFVBQVUsRUFDVixJQUFJLEVBQ0osUUFBUSxDQUNULENBQUM7UUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNqRSxRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSx5QkFBVyxFQUM5QixFQUFFLEVBQ0YsV0FBVyxFQUNYLFVBQVUsRUFDVixJQUFJLEVBQ0osUUFBUSxDQUNULENBQUM7UUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsOEVBQThFO0lBQzlFLEVBQUUsQ0FBQyxpRUFBaUUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUIsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1lBQ3pCLElBQUksRUFBRSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUU7WUFDcEUsYUFBYSxFQUFFLEVBQUU7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLENBQ1YsSUFBQSx5QkFBVyxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FDbkQsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGdDQUFrQixDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDckMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEUsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1lBQ3pCLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2pFLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxDQUNWLElBQUEseUJBQVcsRUFBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ2xELENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxnQ0FBa0IsQ0FBQyxDQUFDO1FBQzdDLGdDQUFnQztRQUNoQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsYUFBYSxFQUFFLENBQUM7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLHlCQUFXLEVBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRWhELE1BQU0sTUFBTSxDQUNWLElBQUEseUJBQVcsRUFBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQzdELENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzlDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFOUMsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSwrREFBK0Q7SUFDL0QsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEdBQUcsRUFBRTtRQUMvRCxNQUFNLENBQUMsSUFBQSx5QkFBVyxFQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxLQUFLLE1BQU0sT0FBTyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxJQUFBLHlCQUFXLEVBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUN0Qyw2Q0FBNkMsQ0FDOUMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxFQUFFLENBQUMsMERBQTBELEVBQUUsR0FBRyxFQUFFO1FBQ2xFLE1BQU0sS0FBSyxHQUFHLElBQUksK0JBQVUsQ0FBQyxHQUFHLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUVwRSxNQUFNLENBQUMsSUFBQSxrQ0FBb0IsRUFBQyxLQUFLLEVBQUUsK0JBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3RELFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTyxFQUFFLGdDQUFnQztTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtRUFBbUUsRUFBRSxHQUFHLEVBQUU7UUFDM0UsTUFBTSxDQUNKLElBQUEsa0NBQW9CLEVBQUMsSUFBSSxnQ0FBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSwrQkFBVSxDQUFDLENBQ3BFLENBQUMsT0FBTyxDQUFDO1lBQ1IsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsMkRBQTJEO1NBQ3JFLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtRQUNuRCxNQUFNLENBQUMsSUFBQSxrQ0FBb0IsRUFBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSwrQkFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbEUsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsdUJBQXVCO1NBQ2pDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFBLGtDQUFvQixFQUFDLGNBQWMsRUFBRSwrQkFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDL0QsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsdUJBQXVCO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcblxuaW1wb3J0IHsgR2V0T2JqZWN0Q29tbWFuZCwgUzNDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgeyBJbWFnZUVycm9yIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCI7XG5pbXBvcnQge1xuICBleHRyYWN0RXRhZyxcbiAgZmV0Y2hGcm9tUzMsXG4gIEltYWdlVG9vTGFyZ2VFcnJvcixcbiAgcmVzb2x2ZUVycm9yUmVzcG9uc2UsXG59IGZyb20gXCIuL2ltYWdlLXV0aWxzXCI7XG5cbmZ1bmN0aW9uIGFzeW5jSXRlcmFibGVGcm9tKGNodW5rczogVWludDhBcnJheVtdKTogQXN5bmNJdGVyYWJsZTxVaW50OEFycmF5PiB7XG4gIHJldHVybiB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGFzeW5jICgpID0+XG4gICAgICAgICAgaSA8IGNodW5rcy5sZW5ndGhcbiAgICAgICAgICAgID8geyBkb25lOiBmYWxzZSwgdmFsdWU6IGNodW5rc1tpKytdIH1cbiAgICAgICAgICAgIDogeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbi8qKiBObyBhcHAgYGJhc2VQYXRoYCwgYXNzZXRzIGF0IHRoZSByb290IG9mIHRoZSBidWNrZXQ6IHRoZSBkZWZhdWx0LiAqL1xuY29uc3QgUk9PVCA9IHsgdXJsQmFzZVBhdGg6IFwiXCIsIGtleVByZWZpeDogXCJcIiB9O1xuXG5kZXNjcmliZShcImZldGNoRnJvbVMzXCIsICgpID0+IHtcbiAgY29uc3QgbW9ja1NlbmQgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IHMzID0gbmV3IFMzQ2xpZW50KHt9KSBhcyB1bmtub3duIGFzIFMzQ2xpZW50O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIChzMyBhcyB1bmtub3duIGFzIHsgc2VuZDogdHlwZW9mIG1vY2tTZW5kIH0pLnNlbmQgPSBtb2NrU2VuZDtcbiAgICBtb2NrU2VuZC5tb2NrUmVzZXQoKTtcbiAgfSk7XG5cbiAgY29uc3Qgb2sgPSAoKSA9PlxuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImRhdGFcIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBcImltYWdlL3BuZ1wiLFxuICAgICAgRVRhZzogJ1wiYWJjMTIzXCInLFxuICAgIH0pO1xuICBjb25zdCBrZXlPZiA9ICgpID0+XG4gICAgKEdldE9iamVjdENvbW1hbmQgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2suY2FsbHNbMF1bMF0uS2V5O1xuXG4gIC8vIFdoYXQgYGZldGNoSW50ZXJuYWxJbWFnZWAgcGFzc2VzIG9uIGZvciBhIGZpbGUgYG5leHQgc3RhcnRgIHNlcnZlcy5cbiAgaXQoXCJyZXR1cm5zIHRoZSBvYmplY3QncyBDYWNoZS1Db250cm9sXCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJkYXRhXCIpXSksXG4gICAgICBDb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIENhY2hlQ29udHJvbDogXCJwdWJsaWMsIG1heC1hZ2U9MzE1MzYwMDAsIGltbXV0YWJsZVwiLFxuICAgICAgRVRhZzogJ1wiYWJjMTIzXCInLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcImJ1Y2tldFwiLFxuICAgICAgXCIvX25leHQvc3RhdGljL21lZGlhL2xvZ28ucG5nXCIsXG4gICAgICBST09ULFxuICAgICAgMTAyNCxcbiAgICApO1xuICAgIGV4cGVjdChyZXN1bHQuY2FjaGVDb250cm9sKS50b0JlKFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGVcIik7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhIG51bGwgQ2FjaGUtQ29udHJvbCBmb3IgYW4gb2JqZWN0IHdpdGhvdXQgb25lXCIsIGFzeW5jICgpID0+IHtcbiAgICBvaygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcImJ1Y2tldFwiLCBcIi9sb2dvLnBuZ1wiLCBST09ULCAxMDI0KTtcbiAgICBleHBlY3QocmVzdWx0LmNhY2hlQ29udHJvbCkudG9CZU51bGwoKTtcbiAgfSk7XG5cbiAgaXQoXCJzdHJpcHMgdGhlIGxlYWRpbmcgc2xhc2ggd2hlbiB0aGUgYXNzZXRzIHNpdCBhdCB0aGUgYnVja2V0IHJvb3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG9rKCk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3N0YXRpYy9mb28ucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIlwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdCgoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXSkudG9FcXVhbChcbiAgICAgIHsgQnVja2V0OiBcIm15LWJ1Y2tldFwiLCBLZXk6IFwic3RhdGljL2Zvby5wbmdcIiB9LFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiYXBwbGllcyB0aGUgYnVja2V0IGtleSBwcmVmaXhcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG9rKCk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3N0YXRpYy9mb28uanBnXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICAgIGtleVByZWZpeDogXCJiYXNlXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKFwiYmFzZS9zdGF0aWMvZm9vLmpwZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2VzIG5vdCByZXBlYXQgdGhlIHByZWZpeCB3aGVuIHRoZSB1cmwgYWxyZWFkeSBjYXJyaWVzIGJhc2VQYXRoXCIsIGFzeW5jICgpID0+IHtcbiAgICBvaygpO1xuXG4gICAgLy8gbmV4dC1pbWFnZS1sb2FkZXIgYmFrZXMgYGJhc2VQYXRoYCBpbnRvIHRoZSBocmVmIG9mIGEgc3RhdGljYWxseSBpbXBvcnRlZFxuICAgIC8vIGltYWdlLCB1bmxpa2UgYSBwbGFpbiBzdHJpbmcgcGF0aC5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL2Jhc2UvX25leHQvc3RhdGljL21lZGlhL2EucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICAgIGtleVByZWZpeDogXCJiYXNlXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKFwiYmFzZS9fbmV4dC9zdGF0aWMvbWVkaWEvYS5wbmdcIik7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBUaGUgQVBJIEdhdGV3YXkgZGVwbG95bWVudCB0eXBlcyBzZXJ2ZSB0aGUgYXBwIHVuZGVyIHRoZSBzdGFnZSBuYW1lLCBzbyB0aGVcbiAgICogYXBwJ3MgYGJhc2VQYXRoYCBpcyBgL3Byb2RgIHdoaWxlIHRoZSBhc3NldHMgd2VyZSB1cGxvYWRlZCB0byB0aGUgcm9vdCBvZiB0aGVcbiAgICogYnVja2V0LiBCdWlsZGluZyB0aGUga2V5IGZyb20gYGJhc2VQYXRoYCBhc2tzIFMzIGZvciBgcHJvZC8uLi5gLCB3aGljaCBkb2VzXG4gICAqIG5vdCBleGlzdCwgYW5kIGV2ZXJ5IGxvY2FsIGA8SW1hZ2U+YCA0MDBzLlxuICAgKi9cbiAgaXQoXCJzdHJpcHMgYSBiYXNlUGF0aCB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZSBrZXlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG9rKCk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3Byb2QvX25leHQvc3RhdGljL21lZGlhL2EucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIi9wcm9kXCIsXG4gICAgICAgIGtleVByZWZpeDogXCJcIixcbiAgICAgIH0sXG4gICAgICBJbmZpbml0eSxcbiAgICApO1xuXG4gICAgZXhwZWN0KGtleU9mKCkpLnRvQmUoXCJfbmV4dC9zdGF0aWMvbWVkaWEvYS5wbmdcIik7XG4gIH0pO1xuXG4gIGl0KFwibGVhdmVzIGEgdXJsIHdpdGhvdXQgYmFzZVBhdGggYWxvbmUgd2hlbiB0aGVyZSBpcyBubyBrZXkgcHJlZml4XCIsIGFzeW5jICgpID0+IHtcbiAgICBvaygpO1xuXG4gICAgYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICBzMyxcbiAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICBcIi9zdGF0aWMvZm9vLmpwZ1wiLFxuICAgICAge1xuICAgICAgICB1cmxCYXNlUGF0aDogXCIvcHJvZFwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKFwic3RhdGljL2Zvby5qcGdcIik7XG4gIH0pO1xuXG4gIC8vIFdpdGggYGFzc2V0UHJlZml4OiBcIi9jZG5cImAsIGEgc3RhdGljIGltcG9ydCdzIGhyZWYgaXNcbiAgLy8gYC9jZG4vX25leHQvc3RhdGljL21lZGlhL+KApmAsIHdpdGggYGJhc2VQYXRoYCBub3doZXJlIGluIGl0LlxuICBpdChcInN0cmlwcyBhIHBhdGggYXNzZXRQcmVmaXggaW4gZnJvbnQgb2YgL19uZXh0L1wiLCBhc3luYyAoKSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvY2RuL19uZXh0L3N0YXRpYy9tZWRpYS9hLnBuZ1wiLFxuICAgICAge1xuICAgICAgICB1cmxCYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG4vXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKFwiX25leHQvc3RhdGljL21lZGlhL2EucG5nXCIpO1xuICB9KTtcblxuICBpdChcImxlYXZlcyBhIHB1YmxpYy8gZmlsZSB1bmRlciBhIGRpcmVjdG9yeSBuYW1lZCBsaWtlIHRoZSBhc3NldFByZWZpeCBhbG9uZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvY2RuL2xvZ28ucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIlwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG5cIixcbiAgICAgIH0sXG4gICAgICBJbmZpbml0eSxcbiAgICApO1xuXG4gICAgZXhwZWN0KGtleU9mKCkpLnRvQmUoXCJjZG4vbG9nby5wbmdcIik7XG4gIH0pO1xuXG4gIGl0KFwiaWdub3JlcyBhbiBhYnNvbHV0ZSBhc3NldFByZWZpeFwiLCBhc3luYyAoKSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvX25leHQvc3RhdGljL21lZGlhL2EucG5nXCIsXG4gICAgICB7XG4gICAgICAgIHVybEJhc2VQYXRoOiBcIlwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICAgIGFzc2V0UHJlZml4OiBcImh0dHBzOi8vY2RuLmV4YW1wbGUudGVzdFwiLFxuICAgICAgfSxcbiAgICAgIEluZmluaXR5LFxuICAgICk7XG5cbiAgICBleHBlY3Qoa2V5T2YoKSkudG9CZShcIl9uZXh0L3N0YXRpYy9tZWRpYS9hLnBuZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJvbmx5IG1hdGNoZXMgYmFzZVBhdGggb24gYSBwYXRoIGJvdW5kYXJ5XCIsIGFzeW5jICgpID0+IHtcbiAgICBvaygpO1xuXG4gICAgYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICBzMyxcbiAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICBcIi9iYXNlbWVudC9sb2dvLnBuZ1wiLFxuICAgICAge1xuICAgICAgICB1cmxCYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiYmFzZVwiLFxuICAgICAgfSxcbiAgICAgIEluZmluaXR5LFxuICAgICk7XG5cbiAgICBleHBlY3Qoa2V5T2YoKSkudG9CZShcImJhc2UvYmFzZW1lbnQvbG9nby5wbmdcIik7XG4gIH0pO1xuXG4gIC8vIENhcnJpZWQgb3ZlciBmcm9tICMyNjcsIHdoaWNoIGZpeGVkIHRoZSBzYW1lIGJ1ZyBpbiB0aGUgcHJlLWFkYXB0ZXIgaW1hZ2VcbiAgLy8gaGFuZGxlcjogYSBgZGVzdGluYXRpb25LZXlQcmVmaXhgIG92ZXJyaWRlIGNhbiBhcnJpdmUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICBpdChcImRvZXNuJ3QgZG91YmxlIHRoZSBzZXBhcmF0b3Igd2hlbiB0aGUga2V5IHByZWZpeCBoYXMgYSB0cmFpbGluZyBzbGFzaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvc3RhdGljL2Zvby5qcGdcIixcbiAgICAgIHtcbiAgICAgICAgdXJsQmFzZVBhdGg6IFwiXCIsXG4gICAgICAgIGtleVByZWZpeDogXCJiYXNlL1wiLFxuICAgICAgfSxcbiAgICAgIEluZmluaXR5LFxuICAgICk7XG5cbiAgICBleHBlY3Qoa2V5T2YoKSkudG9CZShcImJhc2Uvc3RhdGljL2Zvby5qcGdcIik7XG4gIH0pO1xuXG4gIC8vIGBuZXh0LWltYWdlLWxlZ2FjeS91bmljb2RlYCwgd2hvc2UgYHB1YmxpYy9gIGhvbGRzIGJvdGggb2YgdGhlc2UgbmFtZXMuIFRoZVxuICAvLyBzcGFjZSBpcyB3aGF0IGJyb2tlOiB0aGUga2V5IGlzIHRoZSBmaWxlJ3MgcmVhbCBuYW1lLCB0aGUgdXJsIGlzIGEgVVJMIHBhdGguXG4gIGl0LmVhY2goW1xuICAgIFtcIi9oZWxsbyUyMHdvcmxkLmpwZ1wiLCBcImhlbGxvIHdvcmxkLmpwZ1wiXSxcbiAgICBbXCIvw6TDtsO8xaHEjcWZw60ucG5nXCIsIFwiw6TDtsO8xaHEjcWZw60ucG5nXCJdLFxuICAgIFtcIi8lQzMlQTQlQzMlQjYucG5nXCIsIFwiw6TDti5wbmdcIl0sXG4gIF0pKFwiZGVjb2RlcyAlcyBpbnRvIHRoZSBvYmplY3QncyByZWFsIG5hbWVcIiwgYXN5bmMgKHVybCwga2V5KSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCB1cmwsIFJPT1QsIEluZmluaXR5KTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKGtleSk7XG4gIH0pO1xuXG4gIC8vIEEgY2FjaGUtYnVzdGVyIG9uIGEgbG9jYWwgc3JjOiBgbmV4dCBzdGFydGAgcm91dGVzIHRoZSBocmVmIGFzIGEgcmVxdWVzdCwgc29cbiAgLy8gdGhlIHF1ZXJ5IGFuZCBmcmFnbWVudCBuZXZlciByZWFjaCB0aGUgZmlsZSBsb29rdXAuXG4gIGl0LmVhY2goW1xuICAgIFtcIi9sb2dvLnBuZz92PTJcIiwgXCJsb2dvLnBuZ1wiXSxcbiAgICBbXCIvbG9nby5wbmcjdG9wXCIsIFwibG9nby5wbmdcIl0sXG4gICAgW1wiL2xvZ28ucG5nP3Y9MiN0b3BcIiwgXCJsb2dvLnBuZ1wiXSxcbiAgICBbXCIvYmFzZS9sb2dvLnBuZz92PTJcIiwgXCJsb2dvLnBuZ1wiXSxcbiAgICAvLyBBIGA/YCB0aGF0IGlzIHBhcnQgb2YgdGhlIG5hbWUgYXJyaXZlcyBlbmNvZGVkIGFuZCBpcyBub3QgYSBxdWVyeS5cbiAgICBbXCIvd2hhdCUzRi5wbmc/dj0yXCIsIFwid2hhdD8ucG5nXCJdLFxuICBdKShcImtleXMgJXMgYnkgaXRzIHBhdGggYWxvbmVcIiwgYXN5bmMgKHVybCwga2V5KSA9PiB7XG4gICAgb2soKTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgdXJsLFxuICAgICAge1xuICAgICAgICB1cmxCYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBrZXlQcmVmaXg6IFwiXCIsXG4gICAgICB9LFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChrZXlPZigpKS50b0JlKGtleSk7XG4gIH0pO1xuXG4gIGl0KFwibGVhdmVzIGEgbmFtZSB0aGF0IGlzbid0IHZhbGlkIHBlcmNlbnQtZW5jb2RpbmcgYWxvbmVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG9rKCk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhzMywgXCJteS1idWNrZXRcIiwgXCIvMTAwJS5wbmdcIiwgUk9PVCwgSW5maW5pdHkpO1xuXG4gICAgZXhwZWN0KGtleU9mKCkpLnRvQmUoXCIxMDAlLnBuZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgYnVmZmVyLCBjb250ZW50IHR5cGUsIGFuZCBldGFnXCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJoZWxcIiksIEJ1ZmZlci5mcm9tKFwibG9cIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBcImltYWdlL2pwZWdcIixcbiAgICAgIEVUYWc6ICdcInRoZS1ldGFnXCInLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICBzMyxcbiAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICBcIi9mb28uanBnXCIsXG4gICAgICBST09ULFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChyZXN1bHQuYnVmZmVyLnRvU3RyaW5nKCkpLnRvQmUoXCJoZWxsb1wiKTtcbiAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRUeXBlKS50b0JlKFwiaW1hZ2UvanBlZ1wiKTtcbiAgICBleHBlY3QocmVzdWx0LmV0YWcpLnRvQmUoJ1widGhlLWV0YWdcIicpO1xuICB9KTtcblxuICBpdChcInJldHVybnMgYW4gZW1wdHkgZXRhZyB3aGVuIFMzIGRvZXNuJ3QgcHJvdmlkZSBvbmVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImRhdGFcIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBudWxsLFxuICAgICAgRVRhZzogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICBzMyxcbiAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICBcIi9mb28ucG5nXCIsXG4gICAgICBST09ULFxuICAgICAgSW5maW5pdHksXG4gICAgKTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXRhZykudG9CZShcIlwiKTtcbiAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRUeXBlKS50b0JlTnVsbCgpO1xuICB9KTtcblxuICAvLyBgaW1hZ2VzLm1heGltdW1SZXNwb25zZUJvZHlgLCB3aGljaCBgbmV4dCBzdGFydGAgZW5mb3JjZXMgb24gbG9jYWwgc291cmNlcy5cbiAgaXQoXCJyZWZ1c2VzIGFuIG9iamVjdCB3aG9zZSBDb250ZW50TGVuZ3RoIGlzIG92ZXIgdGhlIGxpbWl0LCB1bnJlYWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRlc3Ryb3kgPSBqZXN0LmZuKCk7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogeyAuLi5hc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJuZXZlciByZWFkXCIpXSksIGRlc3Ryb3kgfSxcbiAgICAgIENvbnRlbnRMZW5ndGg6IDExLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL2JpZy5wbmdcIiwgUk9PVCwgMTApLFxuICAgICkucmVqZWN0cy50b0JlSW5zdGFuY2VPZihJbWFnZVRvb0xhcmdlRXJyb3IpO1xuICAgIGV4cGVjdChkZXN0cm95KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwic3RvcHMgcmVhZGluZyBvbmNlIHRoZSBieXRlcyByZWFkIHBhc3MgdGhlIGxpbWl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJoZWxcIiksIEJ1ZmZlci5mcm9tKFwibG9cIildKSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9iaWcucG5nXCIsIFJPT1QsIDQpLFxuICAgICkucmVqZWN0cy50b0JlSW5zdGFuY2VPZihJbWFnZVRvb0xhcmdlRXJyb3IpO1xuICAgIC8vIEF0IHRoZSBsaW1pdCBleGFjdGx5IGlzIGZpbmUuXG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiaGVsXCIpLCBCdWZmZXIuZnJvbShcImxvXCIpXSksXG4gICAgICBDb250ZW50TGVuZ3RoOiA1LFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9vay5wbmdcIiwgUk9PVCwgNSk7XG4gICAgZXhwZWN0KHJlc3VsdC5idWZmZXIudG9TdHJpbmcoKSkudG9CZShcImhlbGxvXCIpO1xuICB9KTtcblxuICBpdChcInRocm93cyB3aGVuIFMzIHJldHVybnMgbm8gYm9keVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoeyBCb2R5OiB1bmRlZmluZWQgfSk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBmZXRjaEZyb21TMyhzMywgXCJteS1idWNrZXRcIiwgXCIvbWlzc2luZy5wbmdcIiwgUk9PVCwgSW5maW5pdHkpLFxuICAgICkucmVqZWN0cy50b1Rocm93KC9FbXB0eSByZXNwb25zZSBmcm9tIFMzLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiZXh0cmFjdEV0YWdcIiwgKCkgPT4ge1xuICBjb25zdCBpbWFnZSA9IEJ1ZmZlci5mcm9tKFwibm90IHJlYWxseSBhIHBuZ1wiKTtcblxuICAvLyBXaGF0IG5leHQncyBvd24gYGV4dHJhY3RFdGFnYCByZXR1cm5zIGZvciB0aGVzZSBpbnB1dHMsIHJlY29yZGVkIGZyb21cbiAgLy8gMTYuNCdzIGBpbWFnZS1vcHRpbWl6ZXIvZXh0cmFjdC1ldGFnLmpzYDogYSBsaXRlcmFsLCBzbyB0aGUgdGVzdCBydW5zIG9uXG4gIC8vIGV2ZXJ5IHN1cHBvcnRlZCBgbmV4dGAsIGluY2x1ZGluZyB0aG9zZSB3aXRob3V0IHRoYXQgbW9kdWxlLlxuICBpdChcIm1hdGNoZXMgbmV4dCdzIG93biwgd2l0aCBhbmQgd2l0aG91dCBhbiB1cHN0cmVhbSBldGFnXCIsICgpID0+IHtcbiAgICBleHBlY3QoZXh0cmFjdEV0YWcoJ1cvXCJhYmNcIicsIGltYWdlKSkudG9CZShcIlZ5OGlZV0pqSWdcIik7XG4gICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIFtcIlwiLCBudWxsLCB1bmRlZmluZWRdKSB7XG4gICAgICBleHBlY3QoZXh0cmFjdEV0YWcobWlzc2luZywgaW1hZ2UpKS50b0JlKFxuICAgICAgICBcIjZRRTMwNTNqQk83N3ZuaUx4VFhINkM4bnE3LUFhVkJmdTlpcDNOeFBJQ1FcIixcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInJlc29sdmVFcnJvclJlc3BvbnNlXCIsICgpID0+IHtcbiAgaXQoXCJwcmVzZXJ2ZXMgdGhlIHN0YXR1cyBjb2RlIGFuZCBtZXNzYWdlIGZyb20gYW4gSW1hZ2VFcnJvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgSW1hZ2VFcnJvcig0MDAsICdcInVybFwiIHBhcmFtZXRlciBpcyBub3QgYWxsb3dlZCcpO1xuXG4gICAgZXhwZWN0KHJlc29sdmVFcnJvclJlc3BvbnNlKGVycm9yLCBJbWFnZUVycm9yKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICBtZXNzYWdlOiAnXCJ1cmxcIiBwYXJhbWV0ZXIgaXMgbm90IGFsbG93ZWQnLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcIm1hcHMgYSBzb3VyY2Ugb3ZlciBpbWFnZXMubWF4aW11bVJlc3BvbnNlQm9keSB0byBuZXh0IHN0YXJ0J3MgNDEzXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICByZXNvbHZlRXJyb3JSZXNwb25zZShuZXcgSW1hZ2VUb29MYXJnZUVycm9yKFwiYmlnLnBuZ1wiKSwgSW1hZ2VFcnJvciksXG4gICAgKS50b0VxdWFsKHtcbiAgICAgIHN0YXR1c0NvZGU6IDQxMyxcbiAgICAgIG1lc3NhZ2U6ICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaW50ZXJuYWwgcmVzcG9uc2UgaXMgaW52YWxpZCcsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiZmFsbHMgYmFjayB0byA1MDAgZm9yIHVucmVjb2duaXplZCBlcnJvcnNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShuZXcgRXJyb3IoXCJib29tXCIpLCBJbWFnZUVycm9yKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIH0pO1xuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShcIm5vdCBhbiBlcnJvclwiLCBJbWFnZUVycm9yKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -12,11 +12,11 @@ exports.newImageResponseCache = newImageResponseCache;
12
12
  * makes `NextResponse.rewrite()` onto an image work. That is also why there is no
13
13
  * longer a dedicated image optimization Lambda — middleware never ran for it.
14
14
  */
15
- const node_fs_1 = require("node:fs");
16
15
  const node_path_1 = require("node:path");
17
16
  const node_url_1 = require("node:url");
18
17
  const response_1 = require("./http/response");
19
18
  const image_utils_1 = require("./image-utils");
19
+ const cdk_nextjs_version_1 = require("../cdk-nextjs-version");
20
20
  const next_modules_1 = require("./next-modules");
21
21
  const util_1 = require("./util");
22
22
  class RuntimeImageOptimizer {
@@ -35,16 +35,17 @@ class RuntimeImageOptimizer {
35
35
  * off.
36
36
  */
37
37
  isEnabled() {
38
- this.loaded ??= loadImageRuntime(this.options);
39
- const { imagesConfig } = this.loaded;
40
- return imagesConfig.loader === "default" && !imagesConfig.unoptimized;
38
+ // From the manifest alone: an app that turned images off shouldn't load the
39
+ // optimizer (and `sharp`) just to answer 404.
40
+ const images = manifestImages(this.options.manifest);
41
+ return images.loader === "default" && !images.unoptimized;
41
42
  }
42
43
  async handle(req, res, url, waitUntil) {
43
44
  // Resolved on the first image request rather than at cold start: an app with
44
- // no `<Image>` should pay neither the `next` module loads nor the
45
- // `required-server-files.json` parse.
45
+ // no `<Image>` should not pay for the `next` module loads.
46
46
  this.loaded ??= loadImageRuntime(this.options);
47
- const { next, nextConfig, imagesConfig } = this.loaded;
47
+ const { next, nextConfig } = this.loaded;
48
+ const imagesConfig = nextConfig.images;
48
49
  const { ImageError, ImageOptimizerCache, fetchExternalImage, imageOptimizer, sendResponse, } = next.optimizer;
49
50
  try {
50
51
  const params = ImageOptimizerCache.validateParams(req, Object.fromEntries(url.searchParams), nextConfig, false);
@@ -162,7 +163,10 @@ class RuntimeImageOptimizer {
162
163
  return {
163
164
  buffer: result.buffer,
164
165
  contentType: result.contentType,
165
- cacheControl: null,
166
+ // The object's own, as `fetchInternalImage` passes on the file's
167
+ // `Cache-Control`: the optimizer keeps the result for its max-age, a
168
+ // year for an immutable `_next/static/media` file.
169
+ cacheControl: result.cacheControl,
166
170
  // Encoded as for a route's response: `fetchInternalImage` does too.
167
171
  etag: (0, image_utils_1.extractEtag)(result.etag, result.buffer),
168
172
  };
@@ -205,8 +209,8 @@ const IMAGE_KIND = "IMAGE";
205
209
  /**
206
210
  * The app's `cacheHandler`, constructed the way `next start` constructs it for
207
211
  * images (`next-server.js`, `handleNextImageRequest`): once, and kept, so its
208
- * in-memory layer lasts across requests. Its path in `required-server-files.json`
209
- * is relative to the dist dir; see {@link cacheHandlerUrl}.
212
+ * in-memory layer lasts across requests. Its path in the manifest is relative
213
+ * to the dist dir; see {@link cacheHandlerUrl}.
210
214
  */
211
215
  async function loadImageCache({ deploymentRoot, manifest, importModule }, loaded) {
212
216
  const { next, nextConfig } = loaded;
@@ -267,13 +271,11 @@ function newImageResponseCache(ResponseCache) {
267
271
  /**
268
272
  * `formatDynamicImportPath` from `next/dist/lib/format-dynamic-import-path.js`,
269
273
  * restated: `next build` doesn't trace that module into the deployment, so
270
- * loading it failed every image request with the cache on.
274
+ * loading it failed every image request with the cache on. No `file://` case:
275
+ * the adapter already turned one into a path (`distRelativeCacheHandler`).
271
276
  */
272
277
  function cacheHandlerUrl(distDir, cacheHandler) {
273
- const path = cacheHandler.startsWith("file://")
274
- ? (0, node_url_1.fileURLToPath)(cacheHandler)
275
- : cacheHandler;
276
- return (0, node_url_1.pathToFileURL)((0, node_path_1.isAbsolute)(path) ? path : (0, node_path_1.join)(distDir, path)).toString();
278
+ return (0, node_url_1.pathToFileURL)((0, node_path_1.isAbsolute)(cacheHandler) ? cacheHandler : (0, node_path_1.join)(distDir, cacheHandler)).toString();
277
279
  }
278
280
  /**
279
281
  * `images`, with its `set` moved off the response's critical path.
@@ -301,28 +303,40 @@ function sendText(res, statusCode, body) {
301
303
  res.end(body);
302
304
  }
303
305
  /**
304
- * The image config comes from the app's own `required-server-files.json`, not the
305
- * adapter manifest: `imageOptimizer` reads whole `experimental` and `images`
306
- * objects, and mirroring those into the manifest would be a second definition of
307
- * the same thing that silently goes stale on a `next` minor.
306
+ * `manifest.config.images`, once the manifest is known to be one this runtime
307
+ * reads (with `experimental`, …). The fields are typed `unknown`, so only the
308
+ * version catches a manifest another cdk-nextjs wrote; `NextjsBuild` rejects one
309
+ * at synth, which a hand-wired function skips.
310
+ */
311
+ function manifestImages(manifest) {
312
+ if (manifest.cdkNextjsVersion !== cdk_nextjs_version_1.CDK_NEXTJS_VERSION) {
313
+ throw new Error(`The adapter manifest was written by cdk-nextjs ` +
314
+ `${manifest.cdkNextjsVersion ?? "(unknown)"}, but this runtime is ` +
315
+ `cdk-nextjs ${cdk_nextjs_version_1.CDK_NEXTJS_VERSION}. Rebuild the app with this version.`);
316
+ }
317
+ return manifest.config.images;
318
+ }
319
+ /**
320
+ * The optimizer's `nextConfig`, from the adapter manifest, which copied it out
321
+ * of the build's `ctx.config` (`AdapterManifestConfig.images`): already resolved
322
+ * and defaulted, so neither `getNextConfigRuntime` nor `imageConfigDefault` is
323
+ * needed. Only the fields Next's image code reads; the cast is because the
324
+ * manifest stores them as JSON.
308
325
  */
309
- function loadImageRuntime({ deploymentRoot, manifest }) {
326
+ function loadImageRuntime({ manifest }) {
310
327
  const next = {
311
- configShared: (0, next_modules_1.nextModule)("next/dist/server/config-shared.js"),
312
- imageConfig: (0, next_modules_1.nextModule)("next/dist/shared/lib/image-config.js"),
313
328
  optimizer: (0, next_modules_1.nextModule)("next/dist/server/image-optimizer.js"),
314
329
  serveStatic: (0, next_modules_1.nextModule)("next/dist/server/serve-static.js"),
315
330
  };
316
- const path = (0, node_path_1.join)(deploymentRoot, manifest.relativeProjectDir, manifest.config.distDir, "required-server-files.json");
317
- const required = JSON.parse((0, node_fs_1.readFileSync)(path, "utf-8"));
318
- const nextConfig = next.configShared.getNextConfigRuntime(required.config);
319
- return {
320
- next,
321
- nextConfig,
322
- imagesConfig: {
323
- ...next.imageConfig.imageConfigDefault,
324
- ...nextConfig.images,
325
- },
331
+ const { config } = manifest;
332
+ const nextConfig = {
333
+ basePath: config.basePath,
334
+ assetPrefix: config.assetPrefix,
335
+ images: manifestImages(manifest),
336
+ experimental: config.experimental,
337
+ cacheHandler: config.cacheHandler ?? undefined,
338
+ cacheMaxMemorySize: config.cacheMaxMemorySize,
326
339
  };
340
+ return { next, nextConfig };
327
341
  }
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1ZEEsc0RBY0M7QUFyZUQsc0RBQXNEO0FBQ3REOzs7Ozs7OztHQVFHO0FBQ0gscUNBQXVDO0FBQ3ZDLHlDQUErRDtBQUMvRCx1Q0FBd0Q7QUFJeEQsOENBQXVFO0FBQ3ZFLCtDQUErRTtBQUUvRSxpREFBNEM7QUFDNUMsaUNBQThDO0FBeUY5QyxNQUFhLHFCQUFxQjtJQUtJO0lBSm5CLEVBQUUsR0FBRyxJQUFBLGVBQVEsR0FBRSxDQUFDO0lBQ3pCLE1BQU0sQ0FBdUM7SUFDN0MsVUFBVSxDQUF1QjtJQUV6QyxZQUFvQyxPQUE4QjtRQUE5QixZQUFPLEdBQVAsT0FBTyxDQUF1QjtJQUFHLENBQUM7SUFFdEU7Ozs7OztPQU1HO0lBQ0ksU0FBUztRQUNkLElBQUksQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE9BQU8sWUFBWSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO0lBQ3hFLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUNqQixHQUF3QixFQUN4QixHQUF1QixFQUN2QixHQUFRLEVBQ1IsU0FBOEM7UUFFOUMsNkVBQTZFO1FBQzdFLGtFQUFrRTtRQUNsRSxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLEVBQ0osVUFBVSxFQUNWLG1CQUFtQixFQUNuQixrQkFBa0IsRUFD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Q0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0UsT0FBTztRQUNMLElBQUk7UUFDSixVQUFVO1FBQ1YsWUFBWSxFQUFFO1lBQ1osR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQjtZQUN0QyxHQUFHLFVBQVUsQ0FBQyxNQUFNO1NBQ3JCO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbi8qKlxuICogYC9fbmV4dC9pbWFnZWAsIGZvbGRlZCBpbnRvIHRoZSBydW50aW1lIGNvcmUuXG4gKlxuICogVGhlIHJlc3BvbnNlIGlzIHdyaXR0ZW4gdG8gYSB7QGxpbmsgU2hpbVNlcnZlclJlc3BvbnNlfSByYXRoZXIgdGhhbiBzdHJhaWdodCB0b1xuICogYSBMYW1iZGEgcmVzcG9uc2Ugc3RyZWFtLCBzbyBpdCBjb21wb3NlcyB3aXRoIHJvdXRpbmc6IGRpc3BhdGNoIG9ubHkgY2xhc3NpZmllc1xuICogYSByZXF1ZXN0IGFzIGltYWdlIG9wdGltaXphdGlvbiAqYWZ0ZXIqIG1pZGRsZXdhcmUgaGFzIGhhZCBpdCwgd2hpY2ggaXMgd2hhdFxuICogbWFrZXMgYE5leHRSZXNwb25zZS5yZXdyaXRlKClgIG9udG8gYW4gaW1hZ2Ugd29yay4gVGhhdCBpcyBhbHNvIHdoeSB0aGVyZSBpcyBub1xuICogbG9uZ2VyIGEgZGVkaWNhdGVkIGltYWdlIG9wdGltaXphdGlvbiBMYW1iZGEg4oCUIG1pZGRsZXdhcmUgbmV2ZXIgcmFuIGZvciBpdC5cbiAqL1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGlzQWJzb2x1dGUgYXMgaXNBYnNvbHV0ZVBhdGgsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgdHlwZSB7IE5leHRDb25maWdDb21wbGV0ZSB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2NvbmZpZy1zaGFyZWQuanNcIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVkUm91dGVLaW5kIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcmVzcG9uc2UtY2FjaGUvdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgU2hpbUluY29taW5nTWVzc2FnZSB9IGZyb20gXCIuL2h0dHAvcmVxdWVzdFwiO1xuaW1wb3J0IHsgYXNTZXJ2ZXJSZXNwb25zZSwgU2hpbVNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgZXh0cmFjdEV0YWcsIGZldGNoRnJvbVMzLCByZXNvbHZlRXJyb3JSZXNwb25zZSB9IGZyb20gXCIuL2ltYWdlLXV0aWxzXCI7XG5pbXBvcnQgeyBBZGFwdGVyTWFuaWZlc3QgfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgbmV4dE1vZHVsZSB9IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZSwgczNDbGllbnQgfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8qKlxuICogUmVxdWlyZWQgdGhyb3VnaCB7QGxpbmsgbmV4dE1vZHVsZX0gcmF0aGVyIHRoYW4gaW1wb3J0ZWQsIGJlY2F1c2UgYG5leHRgIGlzXG4gKiBleHRlcm5hbCB0byB0aGUgc2hlbGwgYnVuZGxlcyBhbmQgZG9lcyBub3QgcmVzb2x2ZSBmcm9tIHdoZXJlIHRoZXkgc2l0LiBFdmVyeVxuICogdHlwZSBoZXJlIGlzIHN0aWxsIHRoZSByZWFsIG9uZTogYHR5cGVvZiBpbXBvcnQoLi4uKWAgaXMgZXJhc2VkLlxuICovXG5pbnRlcmZhY2UgTmV4dEltYWdlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IGNvbmZpZ1NoYXJlZDogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiKTtcbiAgcmVhZG9ubHkgaW1hZ2VDb25maWc6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9pbWFnZS1jb25maWcuanNcIik7XG4gIHJlYWRvbmx5IG9wdGltaXplcjogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCIpO1xuICByZWFkb25seSBzZXJ2ZVN0YXRpYzogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIpO1xufVxuXG4vKiogVGhlIG1vZHVsZXMgb25seSB0aGUgaW1hZ2UgY2FjaGUgbmVlZHMsIGxvYWRlZCB3aXRoIGl0LiAqL1xuaW50ZXJmYWNlIE5leHRJbWFnZUNhY2hlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlQ2FjaGU6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCIpO1xufVxuXG4vKiogQSBgY2FjaGVIYW5kbGVyYCBjbGFzcywgYXMgYG5leHQuY29uZmlnYCdzIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBleHBvcnRzIGl0LiAqL1xudHlwZSBDYWNoZUhhbmRsZXJDbGFzcyA9IG5ldyAoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKSA9PiBOb25OdWxsYWJsZTxcbiAgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgIE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl1bXCJJbWFnZU9wdGltaXplckNhY2hlXCJdXG4gID5bMF1bXCJjYWNoZUhhbmRsZXJcIl1cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VPcHRpbWl6ZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvb3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUVgLiBFbXB0eSB3aGVuIHRoZSBzb3VyY2VzIGFyZSBvbiBkaXNrXG4gICAqIChgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYCksIHdoaWNoIHNlbmRzIGV2ZXJ5IG9uZSB0byBgZmV0Y2hJbnRlcm5hbGAuXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuIEVtcHR5IHdoZW4gdGhlIGFzc2V0cyBzaXQgYXQgdGhlIHJvb3RcbiAgICogb2YgdGhlIGJ1Y2tldCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRLZXlQcmVmaXg6IHN0cmluZztcbiAgLyoqXG4gICAqIFJlcXVlc3RzIGEgbG9jYWwgc291cmNlIGZyb20gdGhlIGFwcCdzIG93biByb3V0ZXMsIGZvciBvbmUgUzMgaGFzIG5vIGZpbGVcbiAgICogZm9yOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyP2lkPTQyXCI+YCwgc2VydmVkIGJ5IGEgcm91dGUgaGFuZGxlci4gYG5leHRcbiAgICogc3RhcnRgIGZldGNoZXMgZXZlcnkgbG9jYWwgc291cmNlIHRoYXQgd2F5IChgZmV0Y2hJbnRlcm5hbEltYWdlYCk7IGhlcmUgaXRcbiAgICogaXMgdGhlIGZhbGxiYWNrLCBzaW5jZSBuZWFybHkgZXZlcnkgc291cmNlIGlzIGEgZmlsZSwgYW5kIGEgYEdldE9iamVjdGAgaXNcbiAgICogZmFyIGNoZWFwZXIgdGhhbiBhIHJvdXRlIGludm9jYXRpb24uXG4gICAqXG4gICAqIEdpdmVuIHRoZSByZXF1ZXN0IGJlaW5nIG9wdGltaXplZCwgZm9yIGl0cyBhdXRob3JpdHk7IGxpa2UgYG5leHQgc3RhcnRgLFxuICAgKiB0aGUgdmlld2VyJ3MgY29va2llcyBhbmQgb3RoZXIgaGVhZGVycyBhcmUgbm90IHRoZSBpbXBsZW1lbnRhdGlvbidzIHRvXG4gICAqIGZvcndhcmQuIEFuZCBnaXZlbiBgaW1hZ2VzLm1heGltdW1SZXNwb25zZUJvZHlgLCBwYXN0IHdoaWNoIGl0IHN0b3BzXG4gICAqIHJlYWRpbmcgYW5kIGFuc3dlcnMge0BsaW5rIEludGVybmFsSW1hZ2VSZXNwb25zZS50b29MYXJnZX0uXG4gICAqL1xuICByZWFkb25seSBmZXRjaEludGVybmFsOiAoXG4gICAgaHJlZjogc3RyaW5nLFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICBtYXhpbXVtUmVzcG9uc2VCb2R5OiBudW1iZXIsXG4gICkgPT4gUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+O1xuICAvKipcbiAgICogTG9hZHMgdGhlIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBmcm9tIGl0cyBmaWxlIFVSTC4gQSBzZWFtIGZvciB0ZXN0cywgd2hpY2hcbiAgICogcnVuIGFzIENvbW1vbkpTIGFuZCBjYW5ub3QgYGltcG9ydCgpYCBhIFVSTC5cbiAgICogQGRlZmF1bHQgLSBgaW1wb3J0KClgXG4gICAqL1xuICByZWFkb25seSBpbXBvcnRNb2R1bGU/OiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKiBUaGUgcmVzcG9uc2Uge0BsaW5rIEltYWdlT3B0aW1pemVyT3B0aW9ucy5mZXRjaEludGVybmFsfSBnb3QuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsSW1hZ2VSZXNwb25zZSB7XG4gIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgcmVhZG9ubHkgYm9keTogQnVmZmVyO1xuICAvKipcbiAgICogVGhlIGBmdW5jdGlvbkdyb3Vwc2AgZ3JvdXAgd2hvc2UgcGFja2FnZSBoYXMgdGhlIHJvdXRlIHRoYXQgc2VydmVzIHRoZVxuICAgKiBzb3VyY2UsIHdoZW4gaXQgaXMgbm90IHRoaXMgZnVuY3Rpb24nczogdGhlcmUgaXMgbm8gcmVzcG9uc2UgdG8gdXNlLCBhbmRcbiAgICogdGhlIG9wdGltaXplciBhbnN3ZXJzIGFuIGV4cGxpY2l0IDUwMiByYXRoZXIgdGhhbiBhIFwibm90IGEgdmFsaWQgaW1hZ2VcIi5cbiAgICovXG4gIHJlYWRvbmx5IG90aGVyR3JvdXA/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYm9keSBwYXNzZWQgYGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5YCwgc28gaXQgd2FzIGN1dCBvZmY6IGEgNDEzLCBhc1xuICAgKiBgbmV4dCBzdGFydGAgYW5zd2Vycy5cbiAgICovXG4gIHJlYWRvbmx5IHRvb0xhcmdlPzogYm9vbGVhbjtcbn1cblxuLyoqIFdoYXQgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBpcyByZWFkIGZvci4gKi9cbmludGVyZmFjZSBSZXF1aXJlZFNlcnZlckZpbGVzIHtcbiAgY29uZmlnOiBOZXh0Q29uZmlnQ29tcGxldGU7XG59XG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHMzID0gczNDbGllbnQoKTtcbiAgcHJpdmF0ZSBsb2FkZWQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPjtcbiAgcHJpdmF0ZSBpbWFnZUNhY2hlPzogUHJvbWlzZTxJbWFnZUNhY2hlPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJbWFnZU9wdGltaXplck9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFwcCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAgYXQgYWxsLiBgbmV4dCBzdGFydGAgYW5zd2VycyA0MDRcbiAgICogd2hlbiBgaW1hZ2VzLnVub3B0aW1pemVkYCBpcyBzZXQgb3IgYSBub24tZGVmYXVsdCBgbG9hZGVyYCBpcyBjb25maWd1cmVkXG4gICAqIChgbmV4dC1zZXJ2ZXIuanNgKSwgYW5kIHNvIGRvZXMgdGhlIHJ1bnRpbWU6IG90aGVyd2lzZSBhbnlvbmUgY2FuIG1ha2UgdGhlXG4gICAqIGNvbXB1dGUgcnVuIHNoYXJwIGFuZCB3cml0ZSB0aGUgaW1hZ2UgY2FjaGUgb24gYW4gZW5kcG9pbnQgdGhlIGFwcCB0dXJuZWRcbiAgICogb2ZmLlxuICAgKi9cbiAgcHVibGljIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICB0aGlzLmxvYWRlZCA/Pz0gbG9hZEltYWdlUnVudGltZSh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgaW1hZ2VzQ29uZmlnIH0gPSB0aGlzLmxvYWRlZDtcbiAgICByZXR1cm4gaW1hZ2VzQ29uZmlnLmxvYWRlciA9PT0gXCJkZWZhdWx0XCIgJiYgIWltYWdlc0NvbmZpZy51bm9wdGltaXplZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHVybDogVVJMLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJlc29sdmVkIG9uIHRoZSBmaXJzdCBpbWFnZSByZXF1ZXN0IHJhdGhlciB0aGFuIGF0IGNvbGQgc3RhcnQ6IGFuIGFwcCB3aXRoXG4gICAgLy8gbm8gYDxJbWFnZT5gIHNob3VsZCBwYXkgbmVpdGhlciB0aGUgYG5leHRgIG1vZHVsZSBsb2FkcyBub3IgdGhlXG4gICAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBwYXJzZS5cbiAgICB0aGlzLmxvYWRlZCA/Pz0gbG9hZEltYWdlUnVudGltZSh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgbmV4dCwgbmV4dENvbmZpZywgaW1hZ2VzQ29uZmlnIH0gPSB0aGlzLmxvYWRlZDtcbiAgICBjb25zdCB7XG4gICAgICBJbWFnZUVycm9yLFxuICAgICAgSW1hZ2VPcHRpbWl6ZXJDYWNoZSxcbiAgICAgIGZldGNoRXh0ZXJuYWxJbWFnZSxcbiAgICAgIGltYWdlT3B0aW1pemVyLFxuICAgICAgc2VuZFJlc3BvbnNlLFxuICAgIH0gPSBuZXh0Lm9wdGltaXplcjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBJbWFnZU9wdGltaXplckNhY2hlLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgICByZXEgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiBJbWFnZU9wdGltaXplckNhY2hlLnZhbGlkYXRlUGFyYW1zXG4gICAgICAgID5bMF0sXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyh1cmwuc2VhcmNoUGFyYW1zKSxcbiAgICAgICAgbmV4dENvbmZpZyxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgaWYgKFwiZXJyb3JNZXNzYWdlXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBzZW5kVGV4dChyZXMsIDQwMCwgcGFyYW1zLmVycm9yTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaHJlZiwgaXNBYnNvbHV0ZSB9ID0gcGFyYW1zO1xuICAgICAgY29uc3Qgb3B0aW1pemUgPSBhc3luYyAocHJldmlvdXNDYWNoZUVudHJ5PzogUHJldmlvdXNJbWFnZUVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwc3RyZWFtID0gaXNBYnNvbHV0ZVxuICAgICAgICAgID8gYXdhaXQgZmV0Y2hFeHRlcm5hbEltYWdlKFxuICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcuZGFuZ2Vyb3VzbHlBbGxvd0xvY2FsSVAsXG4gICAgICAgICAgICAgIGltYWdlc0NvbmZpZy5tYXhpbXVtUmVzcG9uc2VCb2R5LFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcubWF4aW11bVJlZGlyZWN0cyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMuZmV0Y2hMb2NhbChcbiAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICBuZXh0Q29uZmlnLFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcubWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICAgICAgICAgICAgbmV4dC5vcHRpbWl6ZXIsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG9wdGltaXplZCA9IGF3YWl0IGltYWdlT3B0aW1pemVyKFxuICAgICAgICAgIHVwc3RyZWFtLFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleHBlcmltZW50YWw6IG5leHRDb25maWcuZXhwZXJpbWVudGFsLFxuICAgICAgICAgICAgaW1hZ2VzOiB7XG4gICAgICAgICAgICAgIGRhbmdlcm91c2x5QWxsb3dTVkc6IGltYWdlc0NvbmZpZy5kYW5nZXJvdXNseUFsbG93U1ZHLFxuICAgICAgICAgICAgICBtaW5pbXVtQ2FjaGVUVEw6IGltYWdlc0NvbmZpZy5taW5pbXVtQ2FjaGVUVEwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBpc0RldjogZmFsc2UsIHByZXZpb3VzQ2FjaGVFbnRyeSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGBpbWFnZU9wdGltaXplcmAgcmVwb3J0cyBhIGZhaWxlZCBvcHRpbWl6YXRpb24gYnkgcmV0dXJuaW5nIHRoZVxuICAgICAgICAvLyB1bnRvdWNoZWQgdXBzdHJlYW0gaW1hZ2UgYWxvbmdzaWRlIGBlcnJvcmAgcmF0aGVyIHRoYW4gdGhyb3dpbmcsIHNvXG4gICAgICAgIC8vIHdpdGhvdXQgdGhpcyBhIGJyb2tlbiBgc2hhcnBgIGluc3RhbGwgc2VydmVzIGZ1bGwtc2l6ZSBvcmlnaW5hbHMgd2l0aFxuICAgICAgICAvLyBhIDIwMCBpbmRlZmluaXRlbHkgYW5kIG5vdGhpbmcgaW4gdGhlIGxvZ3Mgc2F5cyB3aHkuXG4gICAgICAgIGlmIChvcHRpbWl6ZWQuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBvcHRpbWl6ZSAke2hyZWZ9LCBzZXJ2aW5nIHRoZSB1bm9wdGltaXplZCBvcmlnaW5hbDpgLFxuICAgICAgICAgICAgb3B0aW1pemVkLmVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wdGltaXplZDtcbiAgICAgIH07XG5cbiAgICAgIC8vIE5leHQncyBvd24gcmVzcG9uc2Ugd3JpdGVyLCByYXRoZXIgdGhhbiBhIHJlc3RhdGVtZW50IG9mIGl0LCBzbyB0aGVcbiAgICAgIC8vIGhlYWRlcnMgYG5leHQgc3RhcnRgIHNlbmRzIGNvbWUgd2l0aCBpdDogdGhlIHllYXItbG9uZyBgaW1tdXRhYmxlYCBmb3JcbiAgICAgIC8vIGEgYC9fbmV4dC9zdGF0aWMvbWVkaWFgIHNyYywgYElmLU5vbmUtTWF0Y2hgIGFzIGBmcmVzaGAgcmVhZHMgaXQgKHdlYWtcbiAgICAgIC8vIGFuZCBsaXN0ZWQgdGFncywgYENhY2hlLUNvbnRyb2w6IG5vLWNhY2hlYCksIGEgYENvbnRlbnQtRGlzcG9zaXRpb25gXG4gICAgICAvLyB0aGF0IFJGQyA1OTg3LWVuY29kZXMgYSBmaWxlbmFtZSBgd3JpdGVIZWFkYCB3b3VsZCByZWplY3QgYXNcbiAgICAgIC8vIG5vbi1sYXRpbjEsIGBDb250ZW50LUxlbmd0aGAsIGFuZCBubyBib2R5IGZvciBIRUFELiBUaGUgcmVzdGF0ZWRcbiAgICAgIC8vIHZlcnNpb24gaGFkIGRyaWZ0ZWQgb24gZXZlcnkgb25lIG9mIHRob3NlLlxuICAgICAgY29uc3Qgc2VuZCA9IChcbiAgICAgICAgZXh0ZW5zaW9uOiBzdHJpbmcsXG4gICAgICAgIGJ1ZmZlcjogQnVmZmVyLFxuICAgICAgICBldGFnOiBzdHJpbmcsXG4gICAgICAgIHhDYWNoZTogXCJNSVNTXCIgfCBcIkhJVFwiIHwgXCJTVEFMRVwiLFxuICAgICAgICBtYXhBZ2U6IG51bWJlcixcbiAgICAgICkgPT4ge1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDIwMDtcbiAgICAgICAgc2VuZFJlc3BvbnNlKFxuICAgICAgICAgIHJlcSBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHNlbmRSZXNwb25zZT5bMF0sXG4gICAgICAgICAgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLFxuICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICBldGFnLFxuICAgICAgICAgIHBhcmFtcy5pc1N0YXRpYyxcbiAgICAgICAgICB4Q2FjaGUsXG4gICAgICAgICAgaW1hZ2VzQ29uZmlnLFxuICAgICAgICAgIG1heEFnZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGBuZXh0IHN0YXJ0YCdzIGBoYW5kbGVOZXh0SW1hZ2VSZXF1ZXN0YCwgc3RlcCBmb3Igc3RlcDogYVxuICAgICAgLy8gYFJlc3BvbnNlQ2FjaGVgIG92ZXIgYW4gYEltYWdlT3B0aW1pemVyQ2FjaGVgIGJhY2tlZCBieSB0aGUgYXBwJ3NcbiAgICAgIC8vIGBjYWNoZUhhbmRsZXJgLCBzbyBhIGhpdCBza2lwcyB0aGUgZmV0Y2ggYW5kIGBzaGFycGAsIGEgc3RhbGUgZW50cnkgaXNcbiAgICAgIC8vIHNlcnZlZCB3aGlsZSBpdCBpcyByZWdlbmVyYXRlZCwgYW5kIGNvbmN1cnJlbnQgbWlzc2VzIGZvciBvbmUgaW1hZ2VcbiAgICAgIC8vIG9wdGltaXplIGl0IG9uY2UuIFRoZSBhcHAncyBgY2FjaGVIYW5kbGVyYCBpcyB0aGUgUzMgY2FjaGUsIHdoaWNoIHRoZVxuICAgICAgLy8gYWRhcHRlciB0dXJucyBvbiB3aXRoIGBpbWFnZXMuY3VzdG9tQ2FjaGVIYW5kbGVyYDogd2l0aCBubyBDRE4gaW4gZnJvbnRcbiAgICAgIC8vICh0aGUgUmVnaW9uYWwgdHlwZXMpIGV2ZXJ5IHJlcXVlc3Qgd291bGQgb3RoZXJ3aXNlIHJ1biBgc2hhcnBgIGFnYWluLFxuICAgICAgLy8gYW5kIGJlaGluZCBDbG91ZEZyb250IGVhY2ggZWRnZSBtaXNzIGlzIGFuIFMzIHJlYWQgaW5zdGVhZC5cbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5sb2FkQ2FjaGUodGhpcy5sb2FkZWQpO1xuICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCBjYWNoZS5yZXNwb25zZXMuZ2V0KFxuICAgICAgICBJbWFnZU9wdGltaXplckNhY2hlLmdldENhY2hlS2V5KHBhcmFtcyksXG4gICAgICAgIGFzeW5jICh7IHByZXZpb3VzQ2FjaGVFbnRyeSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBidWZmZXIsIGNvbnRlbnRUeXBlLCBtYXhBZ2UsIGV0YWcsIHVwc3RyZWFtRXRhZyB9ID1cbiAgICAgICAgICAgIGF3YWl0IG9wdGltaXplKHByZXZpb3VzQ2FjaGVFbnRyeSBhcyBQcmV2aW91c0ltYWdlRW50cnkpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBraW5kOiBJTUFHRV9LSU5ELFxuICAgICAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgICAgIGV0YWcsXG4gICAgICAgICAgICAgIGV4dGVuc2lvbjogbmV4dC5zZXJ2ZVN0YXRpYy5nZXRFeHRlbnNpb24oY29udGVudFR5cGUpID8/IFwiXCIsXG4gICAgICAgICAgICAgIHVwc3RyZWFtRXRhZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHsgcmV2YWxpZGF0ZTogbWF4QWdlLCBleHBpcmU6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZUtpbmQ6IElNQUdFX0tJTkQsXG4gICAgICAgICAgaW5jcmVtZW50YWxDYWNoZTogZGVmZXJXcml0ZXMoY2FjaGUuaW1hZ2VzLCB3YWl0VW50aWwpLFxuICAgICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgICAgIC8vIEEgc3RhbGUgZW50cnkgaXMgc2VydmVkIGF0IG9uY2UgYW5kIHJlZ2VuZXJhdGVkIGluIHRoZSBiYWNrZ3JvdW5kO1xuICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgYSBMYW1iZGEgY291bGQgZnJlZXplIHdpdGggdGhlIHJlZ2VuZXJhdGlvbiBoYWxmIGRvbmUuXG4gICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgUGFyYW1ldGVyczxJbWFnZUNhY2hlW1wicmVzcG9uc2VzXCJdW1wiZ2V0XCJdPlsyXSxcbiAgICAgICk7XG4gICAgICAvLyBBIGZhaWxlZCByZW5kZXIsIGZyb20gbmV4dCAxNi40OyBgbmV4dC1zZXJ2ZXIuanNgIHJldGhyb3dzIGl0IHRoZSBzYW1lXG4gICAgICAvLyB3YXkuIFRoZSBnZW5lcmF0b3IgYWJvdmUgdGhyb3dzIGluc3RlYWQsIHNvIHRoaXMgaXMgdGhlIHR5cGUncyBjYXNlLlxuICAgICAgaWYgKGVudHJ5ICYmIFwiZXJyb3JcIiBpbiBlbnRyeSkge1xuICAgICAgICB0aHJvdyBlbnRyeS5lcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gZW50cnk/LnZhbHVlIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAga2luZDogc3RyaW5nO1xuICAgICAgICAgICAgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gICAgICAgICAgICBidWZmZXI6IEJ1ZmZlcjtcbiAgICAgICAgICAgIGV0YWc6IHN0cmluZztcbiAgICAgICAgICB9XG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh2YWx1ZT8ua2luZCAhPT0gSU1BR0VfS0lORCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgaW1hZ2UgY2FjaGUgcmV0dXJuZWQgbm8gaW1hZ2UgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBzZW5kKFxuICAgICAgICB2YWx1ZS5leHRlbnNpb24sXG4gICAgICAgIHZhbHVlLmJ1ZmZlcixcbiAgICAgICAgdmFsdWUuZXRhZyxcbiAgICAgICAgZW50cnkhLmlzTWlzcyA/IFwiTUlTU1wiIDogZW50cnkhLmlzU3RhbGUgPyBcIlNUQUxFXCIgOiBcIkhJVFwiLFxuICAgICAgICBlbnRyeSEuY2FjaGVDb250cm9sPy5yZXZhbGlkYXRlIHx8IDAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCB7IHN0YXR1c0NvZGUsIG1lc3NhZ2UgfSA9IHJlc29sdmVFcnJvclJlc3BvbnNlKGVycm9yLCBJbWFnZUVycm9yKTtcbiAgICAgIGlmIChzdGF0dXNDb2RlID49IDUwMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiSW1hZ2Ugb3B0aW1pemF0aW9uIGZhaWxlZDpcIiwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgc2VuZFRleHQocmVzLCBzdGF0dXNDb2RlLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZpY3RlZCBvbiBmYWlsdXJlLCBhcyBgRW50cnlwb2ludFJlZ2lzdHJ5LmxvYWRgIGV2aWN0cyBhIGZhaWxlZCBtb2R1bGUgbG9hZDpcbiAgICogYSB0cmFuc2llbnQgZmFpbHVyZSBpbXBvcnRpbmcgdGhlIGBjYWNoZUhhbmRsZXJgIChFTUZJTEUgdW5kZXIgYSBjb2xkLXN0YXJ0XG4gICAqIGJ1cnN0KSB3b3VsZCBvdGhlcndpc2UgNTAwIGV2ZXJ5IGltYWdlIHJlcXVlc3QgdW50aWwgdGhlIHNhbmRib3ggcmVjeWNsZXMuXG4gICAqL1xuICBwcml2YXRlIGxvYWRDYWNoZShcbiAgICBsb2FkZWQ6IFJldHVyblR5cGU8dHlwZW9mIGxvYWRJbWFnZVJ1bnRpbWU+LFxuICApOiBQcm9taXNlPEltYWdlQ2FjaGU+IHtcbiAgICBpZiAoIXRoaXMuaW1hZ2VDYWNoZSkge1xuICAgICAgY29uc3QgY2FjaGUgPSBsb2FkSW1hZ2VDYWNoZSh0aGlzLm9wdGlvbnMsIGxvYWRlZCk7XG4gICAgICB0aGlzLmltYWdlQ2FjaGUgPSBjYWNoZTtcbiAgICAgIGNhY2hlLmNhdGNoKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VDYWNoZSA9PT0gY2FjaGUpIHtcbiAgICAgICAgICB0aGlzLmltYWdlQ2FjaGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbWFnZUNhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaExvY2FsKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICBocmVmOiBzdHJpbmcsXG4gICAgbmV4dENvbmZpZzogUmV0dXJuVHlwZTx0eXBlb2YgbG9hZEltYWdlUnVudGltZT5bXCJuZXh0Q29uZmlnXCJdLFxuICAgIG1heGltdW1SZXNwb25zZUJvZHk6IG51bWJlcixcbiAgICBvcHRpbWl6ZXI6IE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl0sXG4gICkge1xuICAgIGNvbnN0IHsgYnVja2V0LCBmZXRjaEludGVybmFsIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgLy8gTm8gYnVja2V0IHdoZW4gdGhlIHNvdXJjZXMgYXJlIG9uIGRpc2sgKGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgKSwgYW5kXG4gICAgLy8gdGhlIHJvdXRlcyBzZXJ2ZSB0aG9zZSBhcyB0aGV5IHNlcnZlIGFueXRoaW5nIFMzIGhhcyBubyBmaWxlIGZvci5cbiAgICBpZiAoYnVja2V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgICAgICB0aGlzLnMzLFxuICAgICAgICAgIGJ1Y2tldCxcbiAgICAgICAgICBocmVmLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVybEJhc2VQYXRoOiBuZXh0Q29uZmlnLmJhc2VQYXRoLFxuICAgICAgICAgICAga2V5UHJlZml4OiB0aGlzLm9wdGlvbnMuYnVja2V0S2V5UHJlZml4LFxuICAgICAgICAgICAgYXNzZXRQcmVmaXg6IG5leHRDb25maWcuYXNzZXRQcmVmaXgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXhpbXVtUmVzcG9uc2VCb2R5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJ1ZmZlcjogcmVzdWx0LmJ1ZmZlcixcbiAgICAgICAgICBjb250ZW50VHlwZTogcmVzdWx0LmNvbnRlbnRUeXBlLFxuICAgICAgICAgIGNhY2hlQ29udHJvbDogbnVsbCxcbiAgICAgICAgICAvLyBFbmNvZGVkIGFzIGZvciBhIHJvdXRlJ3MgcmVzcG9uc2U6IGBmZXRjaEludGVybmFsSW1hZ2VgIGRvZXMgdG9vLlxuICAgICAgICAgIGV0YWc6IGV4dHJhY3RFdGFnKHJlc3VsdC5ldGFnLCByZXN1bHQuYnVmZmVyKSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09IFwiTm9TdWNoS2V5XCI7XG4gICAgICAgIGlmICghbWlzc2luZykgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2hhdCBgZmV0Y2hJbnRlcm5hbEltYWdlYCBjaGVja3MsIGFuZCB0aHJvd3MsIGZvciB0aGUgc2FtZSByZXNwb25zZS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoSW50ZXJuYWwoaHJlZiwgcmVxLCBtYXhpbXVtUmVzcG9uc2VCb2R5KTtcbiAgICBpZiAocmVzcG9uc2Uub3RoZXJHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIGRlcGxveW1lbnQgcHJvYmxlbSwgbm90IGEgYmFkIGB1cmxgOiBsZWF2ZSB0aGUgcm91dGUgaW4gdGhlIGRlZmF1bHRcbiAgICAgIC8vIGdyb3VwLCBvciBzZXJ2ZSB0aGUgaW1hZ2UgYXMgYSBmaWxlIChwdWJsaWMvIG9yIGEgc3RhdGljIGltcG9ydCkuXG4gICAgICB0aHJvdyBuZXcgb3B0aW1pemVyLkltYWdlRXJyb3IoXG4gICAgICAgIDUwMixcbiAgICAgICAgJ1widXJsXCIgcGFyYW1ldGVyIGlzIHZhbGlkIGJ1dCBpdHMgc291cmNlIGlzIGEgcm91dGUgaW4gYW5vdGhlciAnICtcbiAgICAgICAgICBgZnVuY3Rpb25Hcm91cHMgZ3JvdXAgKFwiJHtyZXNwb25zZS5vdGhlckdyb3VwfVwiKSwgd2hpY2ggdGhlIGltYWdlIGAgK1xuICAgICAgICAgIFwib3B0aW1pemVyIGNhbm5vdCBmZXRjaFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLnRvb0xhcmdlKSB7XG4gICAgICB0aHJvdyBuZXcgb3B0aW1pemVyLkltYWdlRXJyb3IoXG4gICAgICAgIDQxMyxcbiAgICAgICAgJ1widXJsXCIgcGFyYW1ldGVyIGlzIHZhbGlkIGJ1dCBpbnRlcm5hbCByZXNwb25zZSBpcyBpbnZhbGlkJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2Uuc3RhdHVzQ29kZSB8fCByZXNwb25zZS5ib2R5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA0MDAsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaW50ZXJuYWwgcmVzcG9uc2UgaXMgaW52YWxpZCcsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyOiByZXNwb25zZS5ib2R5LFxuICAgICAgY29udGVudFR5cGU6IGZpcnN0VmFsdWUocmVzcG9uc2UuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSkgPz8gbnVsbCxcbiAgICAgIGNhY2hlQ29udHJvbDogZmlyc3RWYWx1ZShyZXNwb25zZS5oZWFkZXJzW1wiY2FjaGUtY29udHJvbFwiXSkgPz8gbnVsbCxcbiAgICAgIGV0YWc6IGV4dHJhY3RFdGFnKFxuICAgICAgICBmaXJzdFZhbHVlKHJlc3BvbnNlLmhlYWRlcnMuZXRhZykgPz8gbnVsbCxcbiAgICAgICAgcmVzcG9uc2UuYm9keSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIGBDYWNoZWRSb3V0ZUtpbmQuSU1BR0VgLCB3aGljaCBpcyBhbHNvIGBSb3V0ZUtpbmQuSU1BR0VgLiBSZXN0YXRlZDogdGhlIGVudW0gaXNcbiAqIGEgcnVudGltZSB2YWx1ZSBvZiBgbmV4dGAsIHdoaWNoIHRoZSBidW5kbGUgY2Fubm90IGltcG9ydC5cbiAqL1xuY29uc3QgSU1BR0VfS0lORCA9IFwiSU1BR0VcIiBhcyBDYWNoZWRSb3V0ZUtpbmQuSU1BR0U7XG5cbi8qKiBgaW1hZ2VPcHRpbWl6ZXJgJ3MgYHByZXZpb3VzQ2FjaGVFbnRyeWAuICovXG50eXBlIFByZXZpb3VzSW1hZ2VFbnRyeSA9IFBhcmFtZXRlcnM8XG4gIE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl1bXCJpbWFnZU9wdGltaXplclwiXVxuPlszXVtcInByZXZpb3VzQ2FjaGVFbnRyeVwiXTtcblxuaW50ZXJmYWNlIEltYWdlQ2FjaGUge1xuICByZWFkb25seSByZXNwb25zZXM6IEluc3RhbmNlVHlwZTxcbiAgICBOZXh0SW1hZ2VDYWNoZU1vZHVsZXNbXCJyZXNwb25zZUNhY2hlXCJdW1wiZGVmYXVsdFwiXVxuICA+O1xuICByZWFkb25seSBpbWFnZXM6IEluc3RhbmNlVHlwZTxcbiAgICBOZXh0SW1hZ2VNb2R1bGVzW1wib3B0aW1pemVyXCJdW1wiSW1hZ2VPcHRpbWl6ZXJDYWNoZVwiXVxuICA+O1xufVxuXG4vKipcbiAqIFRoZSBhcHAncyBgY2FjaGVIYW5kbGVyYCwgY29uc3RydWN0ZWQgdGhlIHdheSBgbmV4dCBzdGFydGAgY29uc3RydWN0cyBpdCBmb3JcbiAqIGltYWdlcyAoYG5leHQtc2VydmVyLmpzYCwgYGhhbmRsZU5leHRJbWFnZVJlcXVlc3RgKTogb25jZSwgYW5kIGtlcHQsIHNvIGl0c1xuICogaW4tbWVtb3J5IGxheWVyIGxhc3RzIGFjcm9zcyByZXF1ZXN0cy4gSXRzIHBhdGggaW4gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYFxuICogaXMgcmVsYXRpdmUgdG8gdGhlIGRpc3QgZGlyOyBzZWUge0BsaW5rIGNhY2hlSGFuZGxlclVybH0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRJbWFnZUNhY2hlKFxuICB7IGRlcGxveW1lbnRSb290LCBtYW5pZmVzdCwgaW1wb3J0TW9kdWxlIH06IEltYWdlT3B0aW1pemVyT3B0aW9ucyxcbiAgbG9hZGVkOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPixcbik6IFByb21pc2U8SW1hZ2VDYWNoZT4ge1xuICBjb25zdCB7IG5leHQsIG5leHRDb25maWcgfSA9IGxvYWRlZDtcbiAgY29uc3QgbW9kdWxlczogTmV4dEltYWdlQ2FjaGVNb2R1bGVzID0ge1xuICAgIHJlc3BvbnNlQ2FjaGU6IG5leHRNb2R1bGUoXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCIpLFxuICB9O1xuICBjb25zdCBkaXN0RGlyID0gam9pbihcbiAgICBkZXBsb3ltZW50Um9vdCxcbiAgICBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXIsXG4gICAgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIsXG4gICk7XG4gIGxldCBjYWNoZUhhbmRsZXI6IEluc3RhbmNlVHlwZTxDYWNoZUhhbmRsZXJDbGFzcz4gfCB1bmRlZmluZWQ7XG4gIGlmIChuZXh0Q29uZmlnLmNhY2hlSGFuZGxlcikge1xuICAgIGNvbnN0IHVybCA9IGNhY2hlSGFuZGxlclVybChkaXN0RGlyLCBuZXh0Q29uZmlnLmNhY2hlSGFuZGxlcik7XG4gICAgY29uc3QgaW1wb3J0ZWQgPSAoYXdhaXQgKGltcG9ydE1vZHVsZVxuICAgICAgPyBpbXBvcnRNb2R1bGUodXJsKVxuICAgICAgOiBpbXBvcnQodXJsKSkpIGFzIHsgZGVmYXVsdD86IENhY2hlSGFuZGxlckNsYXNzIH0gJiBDYWNoZUhhbmRsZXJDbGFzcztcbiAgICBjb25zdCBDYWNoZUhhbmRsZXIgPSBpbXBvcnRlZC5kZWZhdWx0ID8/IGltcG9ydGVkO1xuICAgIGNhY2hlSGFuZGxlciA9IG5ldyBDYWNoZUhhbmRsZXIoe1xuICAgICAgZGV2OiBmYWxzZSxcbiAgICAgIGZsdXNoVG9EaXNrOiBuZXh0Q29uZmlnLmV4cGVyaW1lbnRhbC5pc3JGbHVzaFRvRGlzayxcbiAgICAgIHNlcnZlckRpc3REaXI6IGpvaW4oZGlzdERpciwgXCJzZXJ2ZXJcIiksXG4gICAgICBtYXhNZW1vcnlDYWNoZVNpemU6IG5leHRDb25maWcuY2FjaGVNYXhNZW1vcnlTaXplLFxuICAgICAgcmV2YWxpZGF0ZWRUYWdzOiBbXSxcbiAgICAgIF9yZXF1ZXN0SGVhZGVyczoge30sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZXNwb25zZXM6IG5ld0ltYWdlUmVzcG9uc2VDYWNoZShtb2R1bGVzLnJlc3BvbnNlQ2FjaGUuZGVmYXVsdCksXG4gICAgaW1hZ2VzOiBuZXcgbmV4dC5vcHRpbWl6ZXIuSW1hZ2VPcHRpbWl6ZXJDYWNoZSh7XG4gICAgICBkaXN0RGlyLFxuICAgICAgbmV4dENvbmZpZyxcbiAgICAgIGNhY2hlSGFuZGxlcixcbiAgICB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBgbmV3IFJlc3BvbnNlQ2FjaGUoLi4uKWAgZm9yIGltYWdlcywgb24gZWl0aGVyIHNpZGUgb2YgbmV4dCAxNi4zLjguIEJlZm9yZVxuICogaXQgdGhlIGNvbnN0cnVjdG9yIHRvb2sgYG1pbmltYWxNb2RlYDsgZnJvbSBpdCwgYHsgbWluaW1hbE1vZGUsIHJvdXRlIH1gLCBhbmRcbiAqIGl0IHRocm93cyB3aXRob3V0IGEgYHJvdXRlYCAtIGBuZXh0LXNlcnZlci5qc2AgcGFzc2VzIGBcImltYWdlXCJgLiBOZWl0aGVyIGZvcm1cbiAqIGNhbiBzdGFuZCBpbiBmb3IgdGhlIG90aGVyOiBhbiBvbGRlciBgbmV4dGAgdGFrZXMgdGhlIG9wdGlvbnMgb2JqZWN0IGFzIGFcbiAqIHRydXRoeSBgbWluaW1hbE1vZGVgLCBhbmQgMTYuMy44IHJlamVjdHMgYSBiYXJlIGBmYWxzZWAuXG4gKlxuICogVG9sZCBhcGFydCBieSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIHRoZSBvbGRlciBmb3JtIHJhdGhlciB0aGFuIGJ5XG4gKiB0aGUgdmVyc2lvbiwgd2hpY2ggYSBjYW5hcnkgZG9lcyBub3Qgb3JkZXIsIG9yIGJ5IGl0cyBwcml2YXRlIGZpZWxkczogMTYuMy44XG4gKiBkZXN0cnVjdHVyZXMgYSBiYXJlIGBmYWxzZWAgaW50byBubyBgcm91dGVgIGFuZCB0aHJvd3MuIE9ubHkgdGhhdCB0aHJvd1xuICogc2VsZWN0cyB0aGUgbmV3ZXIgZm9ybTsgYW55IG90aGVyIGVycm9yIGZyb20gdGhlIGNvbnN0cnVjdG9yIGlzIHJldGhyb3duXG4gKiByYXRoZXIgdGhhbiByZWFkIGFzIGEgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0ltYWdlUmVzcG9uc2VDYWNoZShcbiAgUmVzcG9uc2VDYWNoZTogTmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl0sXG4pOiBJbnN0YW5jZVR5cGU8TmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl0+IHtcbiAgY29uc3QgTGVnYWN5ID0gUmVzcG9uc2VDYWNoZSBhcyB1bmtub3duIGFzIG5ldyAoXG4gICAgbWluaW1hbE1vZGU6IGJvb2xlYW4sXG4gICkgPT4gSW5zdGFuY2VUeXBlPHR5cGVvZiBSZXNwb25zZUNhY2hlPjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IExlZ2FjeShmYWxzZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghU3RyaW5nKChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlKS5pbmNsdWRlcyhcInJlcXVpcmVzIGEgc291cmNlIHJvdXRlXCIpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUmVzcG9uc2VDYWNoZSh7IG1pbmltYWxNb2RlOiBmYWxzZSwgcm91dGU6IFwiaW1hZ2VcIiB9KTtcbiAgfVxufVxuXG4vKipcbiAqIGBmb3JtYXREeW5hbWljSW1wb3J0UGF0aGAgZnJvbSBgbmV4dC9kaXN0L2xpYi9mb3JtYXQtZHluYW1pYy1pbXBvcnQtcGF0aC5qc2AsXG4gKiByZXN0YXRlZDogYG5leHQgYnVpbGRgIGRvZXNuJ3QgdHJhY2UgdGhhdCBtb2R1bGUgaW50byB0aGUgZGVwbG95bWVudCwgc29cbiAqIGxvYWRpbmcgaXQgZmFpbGVkIGV2ZXJ5IGltYWdlIHJlcXVlc3Qgd2l0aCB0aGUgY2FjaGUgb24uXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFuZGxlclVybChkaXN0RGlyOiBzdHJpbmcsIGNhY2hlSGFuZGxlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9IGNhY2hlSGFuZGxlci5zdGFydHNXaXRoKFwiZmlsZTovL1wiKVxuICAgID8gZmlsZVVSTFRvUGF0aChjYWNoZUhhbmRsZXIpXG4gICAgOiBjYWNoZUhhbmRsZXI7XG4gIHJldHVybiBwYXRoVG9GaWxlVVJMKFxuICAgIGlzQWJzb2x1dGVQYXRoKHBhdGgpID8gcGF0aCA6IGpvaW4oZGlzdERpciwgcGF0aCksXG4gICkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBgaW1hZ2VzYCwgd2l0aCBpdHMgYHNldGAgbW92ZWQgb2ZmIHRoZSByZXNwb25zZSdzIGNyaXRpY2FsIHBhdGguXG4gKlxuICogYFJlc3BvbnNlQ2FjaGVgIGF3YWl0cyB0aGUgd3JpdGUgb2YgYSBmcmVzaGx5IG9wdGltaXplZCBpbWFnZSBiZWZvcmUgaXQgaGFuZHNcbiAqIHRoZSBpbWFnZSBiYWNrLCBzbyBldmVyeSBtaXNzIHBhaWQgYW4gUzMgYFB1dE9iamVjdGAgKH4zMCBtcyBtZWFzdXJlZCkgYmVmb3JlXG4gKiBpdHMgZmlyc3QgYnl0ZS4gVGhlIHdyaXRlIGlzIHJlZ2lzdGVyZWQgd2l0aCBgd2FpdFVudGlsYCBpbnN0ZWFkLCB3aGljaCB0aGVcbiAqIHJ1bnRpbWUgZHJhaW5zIGJlZm9yZSBhIExhbWJkYSBpbnZvY2F0aW9uIHJldHVybnMgb3IgYSBjb250YWluZXIgc2h1dHMgZG93bixcbiAqIHNvIGl0IHN0aWxsIGxhbmRzLiBBIGZhaWxlZCB3cml0ZSBpcyBsb2dnZWQ7IHRoZSBuZXh0IHJlcXVlc3Qgb3B0aW1pemVzIHRoZVxuICogaW1hZ2UgYWdhaW4sIHdoaWNoIGlzIHdoYXQgaXQgd291bGQgaGF2ZSBkb25lIGFueXdheS5cbiAqL1xuZnVuY3Rpb24gZGVmZXJXcml0ZXMoXG4gIGltYWdlczogSW1hZ2VDYWNoZVtcImltYWdlc1wiXSxcbiAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbik6IEltYWdlQ2FjaGVbXCJpbWFnZXNcIl0ge1xuICBjb25zdCBkZWZlcnJlZCA9IE9iamVjdC5jcmVhdGUoaW1hZ2VzKSBhcyBJbWFnZUNhY2hlW1wiaW1hZ2VzXCJdO1xuICBkZWZlcnJlZC5zZXQgPSAoLi4uYXJnczogUGFyYW1ldGVyczxJbWFnZUNhY2hlW1wiaW1hZ2VzXCJdW1wic2V0XCJdPikgPT4ge1xuICAgIHdhaXRVbnRpbChcbiAgICAgIGltYWdlcy5zZXQoLi4uYXJncykuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY2FjaGUgYW4gb3B0aW1pemVkIGltYWdlOlwiLCBlcnJvcik7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfTtcbiAgcmV0dXJuIGRlZmVycmVkO1xufVxuXG5mdW5jdGlvbiBzZW5kVGV4dChcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIHN0YXR1c0NvZGU6IG51bWJlcixcbiAgYm9keTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW5cIik7XG4gIHJlcy5lbmQoYm9keSk7XG59XG5cbi8qKlxuICogVGhlIGltYWdlIGNvbmZpZyBjb21lcyBmcm9tIHRoZSBhcHAncyBvd24gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCwgbm90IHRoZVxuICogYWRhcHRlciBtYW5pZmVzdDogYGltYWdlT3B0aW1pemVyYCByZWFkcyB3aG9sZSBgZXhwZXJpbWVudGFsYCBhbmQgYGltYWdlc2BcbiAqIG9iamVjdHMsIGFuZCBtaXJyb3JpbmcgdGhvc2UgaW50byB0aGUgbWFuaWZlc3Qgd291bGQgYmUgYSBzZWNvbmQgZGVmaW5pdGlvbiBvZlxuICogdGhlIHNhbWUgdGhpbmcgdGhhdCBzaWxlbnRseSBnb2VzIHN0YWxlIG9uIGEgYG5leHRgIG1pbm9yLlxuICovXG5mdW5jdGlvbiBsb2FkSW1hZ2VSdW50aW1lKHsgZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0IH06IEltYWdlT3B0aW1pemVyT3B0aW9ucykge1xuICBjb25zdCBuZXh0OiBOZXh0SW1hZ2VNb2R1bGVzID0ge1xuICAgIGNvbmZpZ1NoYXJlZDogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiKSxcbiAgICBpbWFnZUNvbmZpZzogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zaGFyZWQvbGliL2ltYWdlLWNvbmZpZy5qc1wiKSxcbiAgICBvcHRpbWl6ZXI6IG5leHRNb2R1bGUoXCJuZXh0L2Rpc3Qvc2VydmVyL2ltYWdlLW9wdGltaXplci5qc1wiKSxcbiAgICBzZXJ2ZVN0YXRpYzogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIpLFxuICB9O1xuICBjb25zdCBwYXRoID0gam9pbihcbiAgICBkZXBsb3ltZW50Um9vdCxcbiAgICBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXIsXG4gICAgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIsXG4gICAgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiLFxuICApO1xuICBjb25zdCByZXF1aXJlZDogUmVxdWlyZWRTZXJ2ZXJGaWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmLThcIikpO1xuICBjb25zdCBuZXh0Q29uZmlnID0gbmV4dC5jb25maWdTaGFyZWQuZ2V0TmV4dENvbmZpZ1J1bnRpbWUocmVxdWlyZWQuY29uZmlnKTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0LFxuICAgIG5leHRDb25maWcsXG4gICAgaW1hZ2VzQ29uZmlnOiB7XG4gICAgICAuLi5uZXh0LmltYWdlQ29uZmlnLmltYWdlQ29uZmlnRGVmYXVsdCxcbiAgICAgIC4uLm5leHRDb25maWcuaW1hZ2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=
342
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvZEEsc0RBY0M7QUFsZUQsc0RBQXNEO0FBQ3REOzs7Ozs7OztHQVFHO0FBQ0gseUNBQStEO0FBQy9ELHVDQUF5QztBQUl6Qyw4Q0FBdUU7QUFDdkUsK0NBQStFO0FBQy9FLDhEQUEyRDtBQUUzRCxpREFBNEM7QUFDNUMsaUNBQThDO0FBa0Y5QyxNQUFhLHFCQUFxQjtJQUtJO0lBSm5CLEVBQUUsR0FBRyxJQUFBLGVBQVEsR0FBRSxDQUFDO0lBQ3pCLE1BQU0sQ0FBdUM7SUFDN0MsVUFBVSxDQUF1QjtJQUV6QyxZQUFvQyxPQUE4QjtRQUE5QixZQUFPLEdBQVAsT0FBTyxDQUF1QjtJQUFHLENBQUM7SUFFdEU7Ozs7OztPQU1HO0lBQ0ksU0FBUztRQUNkLDRFQUE0RTtRQUM1RSw4Q0FBOEM7UUFDOUMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDNUQsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQ2pCLEdBQXdCLEVBQ3hCLEdBQXVCLEVBQ3ZCLEdBQVEsRUFDUixTQUE4QztRQUU5Qyw2RUFBNkU7UUFDN0UsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN6QyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLE1BQU0sRUFDSixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixj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LENBQUM7UUFDaEMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1FBQ2pDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLFNBQVM7UUFDOUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQjtLQUN4QixDQUFDO0lBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyoqXG4gKiBgL19uZXh0L2ltYWdlYCwgZm9sZGVkIGludG8gdGhlIHJ1bnRpbWUgY29yZS5cbiAqXG4gKiBUaGUgcmVzcG9uc2UgaXMgd3JpdHRlbiB0byBhIHtAbGluayBTaGltU2VydmVyUmVzcG9uc2V9IHJhdGhlciB0aGFuIHN0cmFpZ2h0IHRvXG4gKiBhIExhbWJkYSByZXNwb25zZSBzdHJlYW0sIHNvIGl0IGNvbXBvc2VzIHdpdGggcm91dGluZzogZGlzcGF0Y2ggb25seSBjbGFzc2lmaWVzXG4gKiBhIHJlcXVlc3QgYXMgaW1hZ2Ugb3B0aW1pemF0aW9uICphZnRlciogbWlkZGxld2FyZSBoYXMgaGFkIGl0LCB3aGljaCBpcyB3aGF0XG4gKiBtYWtlcyBgTmV4dFJlc3BvbnNlLnJld3JpdGUoKWAgb250byBhbiBpbWFnZSB3b3JrLiBUaGF0IGlzIGFsc28gd2h5IHRoZXJlIGlzIG5vXG4gKiBsb25nZXIgYSBkZWRpY2F0ZWQgaW1hZ2Ugb3B0aW1pemF0aW9uIExhbWJkYSDigJQgbWlkZGxld2FyZSBuZXZlciByYW4gZm9yIGl0LlxuICovXG5pbXBvcnQgeyBpc0Fic29sdXRlIGFzIGlzQWJzb2x1dGVQYXRoLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnQ29tcGxldGUgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9jb25maWctc2hhcmVkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENhY2hlZFJvdXRlS2luZCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL3R5cGVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNoaW1JbmNvbWluZ01lc3NhZ2UgfSBmcm9tIFwiLi9odHRwL3JlcXVlc3RcIjtcbmltcG9ydCB7IGFzU2VydmVyUmVzcG9uc2UsIFNoaW1TZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCIuL2h0dHAvcmVzcG9uc2VcIjtcbmltcG9ydCB7IGV4dHJhY3RFdGFnLCBmZXRjaEZyb21TMywgcmVzb2x2ZUVycm9yUmVzcG9uc2UgfSBmcm9tIFwiLi9pbWFnZS11dGlsc1wiO1xuaW1wb3J0IHsgQ0RLX05FWFRKU19WRVJTSU9OIH0gZnJvbSBcIi4uL2Nkay1uZXh0anMtdmVyc2lvblwiO1xuaW1wb3J0IHsgQWRhcHRlck1hbmlmZXN0IH0gZnJvbSBcIi4vbWFuaWZlc3RcIjtcbmltcG9ydCB7IG5leHRNb2R1bGUgfSBmcm9tIFwiLi9uZXh0LW1vZHVsZXNcIjtcbmltcG9ydCB7IGZpcnN0VmFsdWUsIHMzQ2xpZW50IH0gZnJvbSBcIi4vdXRpbFwiO1xuXG4vKipcbiAqIFJlcXVpcmVkIHRocm91Z2gge0BsaW5rIG5leHRNb2R1bGV9IHJhdGhlciB0aGFuIGltcG9ydGVkLCBiZWNhdXNlIGBuZXh0YCBpc1xuICogZXh0ZXJuYWwgdG8gdGhlIHNoZWxsIGJ1bmRsZXMgYW5kIGRvZXMgbm90IHJlc29sdmUgZnJvbSB3aGVyZSB0aGV5IHNpdC4gRXZlcnlcbiAqIHR5cGUgaGVyZSBpcyBzdGlsbCB0aGUgcmVhbCBvbmU6IGB0eXBlb2YgaW1wb3J0KC4uLilgIGlzIGVyYXNlZC5cbiAqL1xuaW50ZXJmYWNlIE5leHRJbWFnZU1vZHVsZXMge1xuICByZWFkb25seSBvcHRpbWl6ZXI6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2VydmVyL2ltYWdlLW9wdGltaXplci5qc1wiKTtcbiAgcmVhZG9ubHkgc2VydmVTdGF0aWM6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2VydmVyL3NlcnZlLXN0YXRpYy5qc1wiKTtcbn1cblxuLyoqIFRoZSBtb2R1bGVzIG9ubHkgdGhlIGltYWdlIGNhY2hlIG5lZWRzLCBsb2FkZWQgd2l0aCBpdC4gKi9cbmludGVyZmFjZSBOZXh0SW1hZ2VDYWNoZU1vZHVsZXMge1xuICByZWFkb25seSByZXNwb25zZUNhY2hlOiB0eXBlb2YgaW1wb3J0KFwibmV4dC9kaXN0L3NlcnZlci9yZXNwb25zZS1jYWNoZS9pbmRleC5qc1wiKTtcbn1cblxuLyoqIEEgYGNhY2hlSGFuZGxlcmAgY2xhc3MsIGFzIGBuZXh0LmNvbmZpZ2AncyBgY2FjaGVIYW5kbGVyYCBtb2R1bGUgZXhwb3J0cyBpdC4gKi9cbnR5cGUgQ2FjaGVIYW5kbGVyQ2xhc3MgPSBuZXcgKFxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbikgPT4gTm9uTnVsbGFibGU8XG4gIENvbnN0cnVjdG9yUGFyYW1ldGVyczxcbiAgICBOZXh0SW1hZ2VNb2R1bGVzW1wib3B0aW1pemVyXCJdW1wiSW1hZ2VPcHRpbWl6ZXJDYWNoZVwiXVxuICA+WzBdW1wiY2FjaGVIYW5kbGVyXCJdXG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlT3B0aW1pemVyT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGRlcGxveW1lbnRSb290OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3Q7XG4gIC8qKlxuICAgKiBgQ0RLX05FWFRKU19TVEFUSUNfQVNTRVRTX0JVQ0tFVF9OQU1FYC4gRW1wdHkgd2hlbiB0aGUgc291cmNlcyBhcmUgb24gZGlza1xuICAgKiAoYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2ApLCB3aGljaCBzZW5kcyBldmVyeSBvbmUgdG8gYGZldGNoSW50ZXJuYWxgLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgQ0RLX05FWFRKU19TVEFUSUNfQVNTRVRTX0tFWV9QUkVGSVhgLiBFbXB0eSB3aGVuIHRoZSBhc3NldHMgc2l0IGF0IHRoZSByb290XG4gICAqIG9mIHRoZSBidWNrZXQsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0S2V5UHJlZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhIGxvY2FsIHNvdXJjZSBmcm9tIHRoZSBhcHAncyBvd24gcm91dGVzLCBmb3Igb25lIFMzIGhhcyBubyBmaWxlXG4gICAqIGZvcjogYDxJbWFnZSBzcmM9XCIvYXBpL2F2YXRhcj9pZD00MlwiPmAsIHNlcnZlZCBieSBhIHJvdXRlIGhhbmRsZXIuIGBuZXh0XG4gICAqIHN0YXJ0YCBmZXRjaGVzIGV2ZXJ5IGxvY2FsIHNvdXJjZSB0aGF0IHdheSAoYGZldGNoSW50ZXJuYWxJbWFnZWApOyBoZXJlIGl0XG4gICAqIGlzIHRoZSBmYWxsYmFjaywgc2luY2UgbmVhcmx5IGV2ZXJ5IHNvdXJjZSBpcyBhIGZpbGUsIGFuZCBhIGBHZXRPYmplY3RgIGlzXG4gICAqIGZhciBjaGVhcGVyIHRoYW4gYSByb3V0ZSBpbnZvY2F0aW9uLlxuICAgKlxuICAgKiBHaXZlbiB0aGUgcmVxdWVzdCBiZWluZyBvcHRpbWl6ZWQsIGZvciBpdHMgYXV0aG9yaXR5OyBsaWtlIGBuZXh0IHN0YXJ0YCxcbiAgICogdGhlIHZpZXdlcidzIGNvb2tpZXMgYW5kIG90aGVyIGhlYWRlcnMgYXJlIG5vdCB0aGUgaW1wbGVtZW50YXRpb24ncyB0b1xuICAgKiBmb3J3YXJkLiBBbmQgZ2l2ZW4gYGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5YCwgcGFzdCB3aGljaCBpdCBzdG9wc1xuICAgKiByZWFkaW5nIGFuZCBhbnN3ZXJzIHtAbGluayBJbnRlcm5hbEltYWdlUmVzcG9uc2UudG9vTGFyZ2V9LlxuICAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hJbnRlcm5hbDogKFxuICAgIGhyZWY6IHN0cmluZyxcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgbWF4aW11bVJlc3BvbnNlQm9keTogbnVtYmVyLFxuICApID0+IFByb21pc2U8SW50ZXJuYWxJbWFnZVJlc3BvbnNlPjtcbiAgLyoqXG4gICAqIExvYWRzIHRoZSBgY2FjaGVIYW5kbGVyYCBtb2R1bGUgZnJvbSBpdHMgZmlsZSBVUkwuIEEgc2VhbSBmb3IgdGVzdHMsIHdoaWNoXG4gICAqIHJ1biBhcyBDb21tb25KUyBhbmQgY2Fubm90IGBpbXBvcnQoKWAgYSBVUkwuXG4gICAqIEBkZWZhdWx0IC0gYGltcG9ydCgpYFxuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0TW9kdWxlPzogKHVybDogc3RyaW5nKSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKiogVGhlIHJlc3BvbnNlIHtAbGluayBJbWFnZU9wdGltaXplck9wdGlvbnMuZmV0Y2hJbnRlcm5hbH0gZ290LiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcm5hbEltYWdlUmVzcG9uc2Uge1xuICByZWFkb25seSBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIHJlYWRvbmx5IGJvZHk6IEJ1ZmZlcjtcbiAgLyoqXG4gICAqIFRoZSBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwIHdob3NlIHBhY2thZ2UgaGFzIHRoZSByb3V0ZSB0aGF0IHNlcnZlcyB0aGVcbiAgICogc291cmNlLCB3aGVuIGl0IGlzIG5vdCB0aGlzIGZ1bmN0aW9uJ3M6IHRoZXJlIGlzIG5vIHJlc3BvbnNlIHRvIHVzZSwgYW5kXG4gICAqIHRoZSBvcHRpbWl6ZXIgYW5zd2VycyBhbiBleHBsaWNpdCA1MDIgcmF0aGVyIHRoYW4gYSBcIm5vdCBhIHZhbGlkIGltYWdlXCIuXG4gICAqL1xuICByZWFkb25seSBvdGhlckdyb3VwPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGJvZHkgcGFzc2VkIGBpbWFnZXMubWF4aW11bVJlc3BvbnNlQm9keWAsIHNvIGl0IHdhcyBjdXQgb2ZmOiBhIDQxMywgYXNcbiAgICogYG5leHQgc3RhcnRgIGFuc3dlcnMuXG4gICAqL1xuICByZWFkb25seSB0b29MYXJnZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHMzID0gczNDbGllbnQoKTtcbiAgcHJpdmF0ZSBsb2FkZWQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPjtcbiAgcHJpdmF0ZSBpbWFnZUNhY2hlPzogUHJvbWlzZTxJbWFnZUNhY2hlPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJbWFnZU9wdGltaXplck9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFwcCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAgYXQgYWxsLiBgbmV4dCBzdGFydGAgYW5zd2VycyA0MDRcbiAgICogd2hlbiBgaW1hZ2VzLnVub3B0aW1pemVkYCBpcyBzZXQgb3IgYSBub24tZGVmYXVsdCBgbG9hZGVyYCBpcyBjb25maWd1cmVkXG4gICAqIChgbmV4dC1zZXJ2ZXIuanNgKSwgYW5kIHNvIGRvZXMgdGhlIHJ1bnRpbWU6IG90aGVyd2lzZSBhbnlvbmUgY2FuIG1ha2UgdGhlXG4gICAqIGNvbXB1dGUgcnVuIHNoYXJwIGFuZCB3cml0ZSB0aGUgaW1hZ2UgY2FjaGUgb24gYW4gZW5kcG9pbnQgdGhlIGFwcCB0dXJuZWRcbiAgICogb2ZmLlxuICAgKi9cbiAgcHVibGljIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAvLyBGcm9tIHRoZSBtYW5pZmVzdCBhbG9uZTogYW4gYXBwIHRoYXQgdHVybmVkIGltYWdlcyBvZmYgc2hvdWxkbid0IGxvYWQgdGhlXG4gICAgLy8gb3B0aW1pemVyIChhbmQgYHNoYXJwYCkganVzdCB0byBhbnN3ZXIgNDA0LlxuICAgIGNvbnN0IGltYWdlcyA9IG1hbmlmZXN0SW1hZ2VzKHRoaXMub3B0aW9ucy5tYW5pZmVzdCk7XG4gICAgcmV0dXJuIGltYWdlcy5sb2FkZXIgPT09IFwiZGVmYXVsdFwiICYmICFpbWFnZXMudW5vcHRpbWl6ZWQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB1cmw6IFVSTCxcbiAgICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBSZXNvbHZlZCBvbiB0aGUgZmlyc3QgaW1hZ2UgcmVxdWVzdCByYXRoZXIgdGhhbiBhdCBjb2xkIHN0YXJ0OiBhbiBhcHAgd2l0aFxuICAgIC8vIG5vIGA8SW1hZ2U+YCBzaG91bGQgbm90IHBheSBmb3IgdGhlIGBuZXh0YCBtb2R1bGUgbG9hZHMuXG4gICAgdGhpcy5sb2FkZWQgPz89IGxvYWRJbWFnZVJ1bnRpbWUodGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCB7IG5leHQsIG5leHRDb25maWcgfSA9IHRoaXMubG9hZGVkO1xuICAgIGNvbnN0IGltYWdlc0NvbmZpZyA9IG5leHRDb25maWcuaW1hZ2VzO1xuICAgIGNvbnN0IHtcbiAgICAgIEltYWdlRXJyb3IsXG4gICAgICBJbWFnZU9wdGltaXplckNhY2hlLFxuICAgICAgZmV0Y2hFeHRlcm5hbEltYWdlLFxuICAgICAgaW1hZ2VPcHRpbWl6ZXIsXG4gICAgICBzZW5kUmVzcG9uc2UsXG4gICAgfSA9IG5leHQub3B0aW1pemVyO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IEltYWdlT3B0aW1pemVyQ2FjaGUudmFsaWRhdGVQYXJhbXMoXG4gICAgICAgIHJlcSBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8XG4gICAgICAgICAgdHlwZW9mIEltYWdlT3B0aW1pemVyQ2FjaGUudmFsaWRhdGVQYXJhbXNcbiAgICAgICAgPlswXSxcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKHVybC5zZWFyY2hQYXJhbXMpLFxuICAgICAgICBuZXh0Q29uZmlnLFxuICAgICAgICBmYWxzZSxcbiAgICAgICk7XG4gICAgICBpZiAoXCJlcnJvck1lc3NhZ2VcIiBpbiBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHNlbmRUZXh0KHJlcywgNDAwLCBwYXJhbXMuZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBocmVmLCBpc0Fic29sdXRlIH0gPSBwYXJhbXM7XG4gICAgICBjb25zdCBvcHRpbWl6ZSA9IGFzeW5jIChwcmV2aW91c0NhY2hlRW50cnk/OiBQcmV2aW91c0ltYWdlRW50cnkpID0+IHtcbiAgICAgICAgY29uc3QgdXBzdHJlYW0gPSBpc0Fic29sdXRlXG4gICAgICAgICAgPyBhd2FpdCBmZXRjaEV4dGVybmFsSW1hZ2UoXG4gICAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgICAgIGltYWdlc0NvbmZpZy5kYW5nZXJvdXNseUFsbG93TG9jYWxJUCxcbiAgICAgICAgICAgICAgaW1hZ2VzQ29uZmlnLm1heGltdW1SZXNwb25zZUJvZHksXG4gICAgICAgICAgICAgIGltYWdlc0NvbmZpZy5tYXhpbXVtUmVkaXJlY3RzLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5mZXRjaExvY2FsKFxuICAgICAgICAgICAgICByZXEsXG4gICAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgICAgIG5leHRDb25maWcsXG4gICAgICAgICAgICAgIGltYWdlc0NvbmZpZy5tYXhpbXVtUmVzcG9uc2VCb2R5LFxuICAgICAgICAgICAgICBuZXh0Lm9wdGltaXplcixcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW1pemVkID0gYXdhaXQgaW1hZ2VPcHRpbWl6ZXIoXG4gICAgICAgICAgdXBzdHJlYW0sXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4cGVyaW1lbnRhbDogbmV4dENvbmZpZy5leHBlcmltZW50YWwsXG4gICAgICAgICAgICBpbWFnZXM6IHtcbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlBbGxvd1NWRzogaW1hZ2VzQ29uZmlnLmRhbmdlcm91c2x5QWxsb3dTVkcsXG4gICAgICAgICAgICAgIG1pbmltdW1DYWNoZVRUTDogaW1hZ2VzQ29uZmlnLm1pbmltdW1DYWNoZVRUTCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGlzRGV2OiBmYWxzZSwgcHJldmlvdXNDYWNoZUVudHJ5IH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gYGltYWdlT3B0aW1pemVyYCByZXBvcnRzIGEgZmFpbGVkIG9wdGltaXphdGlvbiBieSByZXR1cm5pbmcgdGhlXG4gICAgICAgIC8vIHVudG91Y2hlZCB1cHN0cmVhbSBpbWFnZSBhbG9uZ3NpZGUgYGVycm9yYCByYXRoZXIgdGhhbiB0aHJvd2luZywgc29cbiAgICAgICAgLy8gd2l0aG91dCB0aGlzIGEgYnJva2VuIGBzaGFycGAgaW5zdGFsbCBzZXJ2ZXMgZnVsbC1zaXplIG9yaWdpbmFscyB3aXRoXG4gICAgICAgIC8vIGEgMjAwIGluZGVmaW5pdGVseSBhbmQgbm90aGluZyBpbiB0aGUgbG9ncyBzYXlzIHdoeS5cbiAgICAgICAgaWYgKG9wdGltaXplZC5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIG9wdGltaXplICR7aHJlZn0sIHNlcnZpbmcgdGhlIHVub3B0aW1pemVkIG9yaWdpbmFsOmAsXG4gICAgICAgICAgICBvcHRpbWl6ZWQuZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW1pemVkO1xuICAgICAgfTtcblxuICAgICAgLy8gTmV4dCdzIG93biByZXNwb25zZSB3cml0ZXIsIHJhdGhlciB0aGFuIGEgcmVzdGF0ZW1lbnQgb2YgaXQsIHNvIHRoZVxuICAgICAgLy8gaGVhZGVycyBgbmV4dCBzdGFydGAgc2VuZHMgY29tZSB3aXRoIGl0OiB0aGUgeWVhci1sb25nIGBpbW11dGFibGVgIGZvclxuICAgICAgLy8gYSBgL19uZXh0L3N0YXRpYy9tZWRpYWAgc3JjLCBgSWYtTm9uZS1NYXRjaGAgYXMgYGZyZXNoYCByZWFkcyBpdCAod2Vha1xuICAgICAgLy8gYW5kIGxpc3RlZCB0YWdzLCBgQ2FjaGUtQ29udHJvbDogbm8tY2FjaGVgKSwgYSBgQ29udGVudC1EaXNwb3NpdGlvbmBcbiAgICAgIC8vIHRoYXQgUkZDIDU5ODctZW5jb2RlcyBhIGZpbGVuYW1lIGB3cml0ZUhlYWRgIHdvdWxkIHJlamVjdCBhc1xuICAgICAgLy8gbm9uLWxhdGluMSwgYENvbnRlbnQtTGVuZ3RoYCwgYW5kIG5vIGJvZHkgZm9yIEhFQUQuIFRoZSByZXN0YXRlZFxuICAgICAgLy8gdmVyc2lvbiBoYWQgZHJpZnRlZCBvbiBldmVyeSBvbmUgb2YgdGhvc2UuXG4gICAgICBjb25zdCBzZW5kID0gKFxuICAgICAgICBleHRlbnNpb246IHN0cmluZyxcbiAgICAgICAgYnVmZmVyOiBCdWZmZXIsXG4gICAgICAgIGV0YWc6IHN0cmluZyxcbiAgICAgICAgeENhY2hlOiBcIk1JU1NcIiB8IFwiSElUXCIgfCBcIlNUQUxFXCIsXG4gICAgICAgIG1heEFnZTogbnVtYmVyLFxuICAgICAgKSA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXNDb2RlID0gMjAwO1xuICAgICAgICBzZW5kUmVzcG9uc2UoXG4gICAgICAgICAgcmVxIGFzIHVua25vd24gYXMgUGFyYW1ldGVyczx0eXBlb2Ygc2VuZFJlc3BvbnNlPlswXSxcbiAgICAgICAgICBhc1NlcnZlclJlc3BvbnNlKHJlcyksXG4gICAgICAgICAgaHJlZixcbiAgICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGV0YWcsXG4gICAgICAgICAgcGFyYW1zLmlzU3RhdGljLFxuICAgICAgICAgIHhDYWNoZSxcbiAgICAgICAgICBpbWFnZXNDb25maWcsXG4gICAgICAgICAgbWF4QWdlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuICAgICAgfTtcblxuICAgICAgLy8gYG5leHQgc3RhcnRgJ3MgYGhhbmRsZU5leHRJbWFnZVJlcXVlc3RgLCBzdGVwIGZvciBzdGVwOiBhXG4gICAgICAvLyBgUmVzcG9uc2VDYWNoZWAgb3ZlciBhbiBgSW1hZ2VPcHRpbWl6ZXJDYWNoZWAgYmFja2VkIGJ5IHRoZSBhcHAnc1xuICAgICAgLy8gYGNhY2hlSGFuZGxlcmAsIHNvIGEgaGl0IHNraXBzIHRoZSBmZXRjaCBhbmQgYHNoYXJwYCwgYSBzdGFsZSBlbnRyeSBpc1xuICAgICAgLy8gc2VydmVkIHdoaWxlIGl0IGlzIHJlZ2VuZXJhdGVkLCBhbmQgY29uY3VycmVudCBtaXNzZXMgZm9yIG9uZSBpbWFnZVxuICAgICAgLy8gb3B0aW1pemUgaXQgb25jZS4gVGhlIGFwcCdzIGBjYWNoZUhhbmRsZXJgIGlzIHRoZSBTMyBjYWNoZSwgd2hpY2ggdGhlXG4gICAgICAvLyBhZGFwdGVyIHR1cm5zIG9uIHdpdGggYGltYWdlcy5jdXN0b21DYWNoZUhhbmRsZXJgOiB3aXRoIG5vIENETiBpbiBmcm9udFxuICAgICAgLy8gKHRoZSBSZWdpb25hbCB0eXBlcykgZXZlcnkgcmVxdWVzdCB3b3VsZCBvdGhlcndpc2UgcnVuIGBzaGFycGAgYWdhaW4sXG4gICAgICAvLyBhbmQgYmVoaW5kIENsb3VkRnJvbnQgZWFjaCBlZGdlIG1pc3MgaXMgYW4gUzMgcmVhZCBpbnN0ZWFkLlxuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCB0aGlzLmxvYWRDYWNoZSh0aGlzLmxvYWRlZCk7XG4gICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNhY2hlLnJlc3BvbnNlcy5nZXQoXG4gICAgICAgIEltYWdlT3B0aW1pemVyQ2FjaGUuZ2V0Q2FjaGVLZXkocGFyYW1zKSxcbiAgICAgICAgYXN5bmMgKHsgcHJldmlvdXNDYWNoZUVudHJ5IH0pID0+IHtcbiAgICAgICAgICBjb25zdCB7IGJ1ZmZlciwgY29udGVudFR5cGUsIG1heEFnZSwgZXRhZywgdXBzdHJlYW1FdGFnIH0gPVxuICAgICAgICAgICAgYXdhaXQgb3B0aW1pemUocHJldmlvdXNDYWNoZUVudHJ5IGFzIFByZXZpb3VzSW1hZ2VFbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGtpbmQ6IElNQUdFX0tJTkQsXG4gICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgZXRhZyxcbiAgICAgICAgICAgICAgZXh0ZW5zaW9uOiBuZXh0LnNlcnZlU3RhdGljLmdldEV4dGVuc2lvbihjb250ZW50VHlwZSkgPz8gXCJcIixcbiAgICAgICAgICAgICAgdXBzdHJlYW1FdGFnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDogeyByZXZhbGlkYXRlOiBtYXhBZ2UsIGV4cGlyZTogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHJvdXRlS2luZDogSU1BR0VfS0lORCxcbiAgICAgICAgICBpbmNyZW1lbnRhbENhY2hlOiBkZWZlcldyaXRlcyhjYWNoZS5pbWFnZXMsIHdhaXRVbnRpbCksXG4gICAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICAgICAgLy8gQSBzdGFsZSBlbnRyeSBpcyBzZXJ2ZWQgYXQgb25jZSBhbmQgcmVnZW5lcmF0ZWQgaW4gdGhlIGJhY2tncm91bmQ7XG4gICAgICAgICAgLy8gd2l0aG91dCB0aGlzLCBhIExhbWJkYSBjb3VsZCBmcmVlemUgd2l0aCB0aGUgcmVnZW5lcmF0aW9uIGhhbGYgZG9uZS5cbiAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPEltYWdlQ2FjaGVbXCJyZXNwb25zZXNcIl1bXCJnZXRcIl0+WzJdLFxuICAgICAgKTtcbiAgICAgIC8vIEEgZmFpbGVkIHJlbmRlciwgZnJvbSBuZXh0IDE2LjQ7IGBuZXh0LXNlcnZlci5qc2AgcmV0aHJvd3MgaXQgdGhlIHNhbWVcbiAgICAgIC8vIHdheS4gVGhlIGdlbmVyYXRvciBhYm92ZSB0aHJvd3MgaW5zdGVhZCwgc28gdGhpcyBpcyB0aGUgdHlwZSdzIGNhc2UuXG4gICAgICBpZiAoZW50cnkgJiYgXCJlcnJvclwiIGluIGVudHJ5KSB7XG4gICAgICAgIHRocm93IGVudHJ5LmVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBlbnRyeT8udmFsdWUgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBraW5kOiBzdHJpbmc7XG4gICAgICAgICAgICBleHRlbnNpb246IHN0cmluZztcbiAgICAgICAgICAgIGJ1ZmZlcjogQnVmZmVyO1xuICAgICAgICAgICAgZXRhZzogc3RyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfCBudWxsXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHZhbHVlPy5raW5kICE9PSBJTUFHRV9LSU5EKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBpbWFnZSBjYWNoZSByZXR1cm5lZCBubyBpbWFnZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIHNlbmQoXG4gICAgICAgIHZhbHVlLmV4dGVuc2lvbixcbiAgICAgICAgdmFsdWUuYnVmZmVyLFxuICAgICAgICB2YWx1ZS5ldGFnLFxuICAgICAgICBlbnRyeSEuaXNNaXNzID8gXCJNSVNTXCIgOiBlbnRyeSEuaXNTdGFsZSA/IFwiU1RBTEVcIiA6IFwiSElUXCIsXG4gICAgICAgIGVudHJ5IS5jYWNoZUNvbnRyb2w/LnJldmFsaWRhdGUgfHwgMCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHsgc3RhdHVzQ29kZSwgbWVzc2FnZSB9ID0gcmVzb2x2ZUVycm9yUmVzcG9uc2UoZXJyb3IsIEltYWdlRXJyb3IpO1xuICAgICAgaWYgKHN0YXR1c0NvZGUgPj0gNTAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbWFnZSBvcHRpbWl6YXRpb24gZmFpbGVkOlwiLCBlcnJvcik7XG4gICAgICB9XG4gICAgICBzZW5kVGV4dChyZXMsIHN0YXR1c0NvZGUsIG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmljdGVkIG9uIGZhaWx1cmUsIGFzIGBFbnRyeXBvaW50UmVnaXN0cnkubG9hZGAgZXZpY3RzIGEgZmFpbGVkIG1vZHVsZSBsb2FkOlxuICAgKiBhIHRyYW5zaWVudCBmYWlsdXJlIGltcG9ydGluZyB0aGUgYGNhY2hlSGFuZGxlcmAgKEVNRklMRSB1bmRlciBhIGNvbGQtc3RhcnRcbiAgICogYnVyc3QpIHdvdWxkIG90aGVyd2lzZSA1MDAgZXZlcnkgaW1hZ2UgcmVxdWVzdCB1bnRpbCB0aGUgc2FuZGJveCByZWN5Y2xlcy5cbiAgICovXG4gIHByaXZhdGUgbG9hZENhY2hlKFxuICAgIGxvYWRlZDogUmV0dXJuVHlwZTx0eXBlb2YgbG9hZEltYWdlUnVudGltZT4sXG4gICk6IFByb21pc2U8SW1hZ2VDYWNoZT4ge1xuICAgIGlmICghdGhpcy5pbWFnZUNhY2hlKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGxvYWRJbWFnZUNhY2hlKHRoaXMub3B0aW9ucywgbG9hZGVkKTtcbiAgICAgIHRoaXMuaW1hZ2VDYWNoZSA9IGNhY2hlO1xuICAgICAgY2FjaGUuY2F0Y2goKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbWFnZUNhY2hlID09PSBjYWNoZSkge1xuICAgICAgICAgIHRoaXMuaW1hZ2VDYWNoZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmltYWdlQ2FjaGU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoTG9jYWwoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIGhyZWY6IHN0cmluZyxcbiAgICBuZXh0Q29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPltcIm5leHRDb25maWdcIl0sXG4gICAgbWF4aW11bVJlc3BvbnNlQm9keTogbnVtYmVyLFxuICAgIG9wdGltaXplcjogTmV4dEltYWdlTW9kdWxlc1tcIm9wdGltaXplclwiXSxcbiAgKSB7XG4gICAgY29uc3QgeyBidWNrZXQsIGZldGNoSW50ZXJuYWwgfSA9IHRoaXMub3B0aW9ucztcbiAgICAvLyBObyBidWNrZXQgd2hlbiB0aGUgc291cmNlcyBhcmUgb24gZGlzayAoYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2ApLCBhbmRcbiAgICAvLyB0aGUgcm91dGVzIHNlcnZlIHRob3NlIGFzIHRoZXkgc2VydmUgYW55dGhpbmcgUzMgaGFzIG5vIGZpbGUgZm9yLlxuICAgIGlmIChidWNrZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgICAgIHRoaXMuczMsXG4gICAgICAgICAgYnVja2V0LFxuICAgICAgICAgIGhyZWYsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXJsQmFzZVBhdGg6IG5leHRDb25maWcuYmFzZVBhdGgsXG4gICAgICAgICAgICBrZXlQcmVmaXg6IHRoaXMub3B0aW9ucy5idWNrZXRLZXlQcmVmaXgsXG4gICAgICAgICAgICBhc3NldFByZWZpeDogbmV4dENvbmZpZy5hc3NldFByZWZpeCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1heGltdW1SZXNwb25zZUJvZHksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYnVmZmVyOiByZXN1bHQuYnVmZmVyLFxuICAgICAgICAgIGNvbnRlbnRUeXBlOiByZXN1bHQuY29udGVudFR5cGUsXG4gICAgICAgICAgLy8gVGhlIG9iamVjdCdzIG93biwgYXMgYGZldGNoSW50ZXJuYWxJbWFnZWAgcGFzc2VzIG9uIHRoZSBmaWxlJ3NcbiAgICAgICAgICAvLyBgQ2FjaGUtQ29udHJvbGA6IHRoZSBvcHRpbWl6ZXIga2VlcHMgdGhlIHJlc3VsdCBmb3IgaXRzIG1heC1hZ2UsIGFcbiAgICAgICAgICAvLyB5ZWFyIGZvciBhbiBpbW11dGFibGUgYF9uZXh0L3N0YXRpYy9tZWRpYWAgZmlsZS5cbiAgICAgICAgICBjYWNoZUNvbnRyb2w6IHJlc3VsdC5jYWNoZUNvbnRyb2wsXG4gICAgICAgICAgLy8gRW5jb2RlZCBhcyBmb3IgYSByb3V0ZSdzIHJlc3BvbnNlOiBgZmV0Y2hJbnRlcm5hbEltYWdlYCBkb2VzIHRvby5cbiAgICAgICAgICBldGFnOiBleHRyYWN0RXRhZyhyZXN1bHQuZXRhZywgcmVzdWx0LmJ1ZmZlciksXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSBcIk5vU3VjaEtleVwiO1xuICAgICAgICBpZiAoIW1pc3NpbmcpIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoYXQgYGZldGNoSW50ZXJuYWxJbWFnZWAgY2hlY2tzLCBhbmQgdGhyb3dzLCBmb3IgdGhlIHNhbWUgcmVzcG9uc2UuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEludGVybmFsKGhyZWYsIHJlcSwgbWF4aW11bVJlc3BvbnNlQm9keSk7XG4gICAgaWYgKHJlc3BvbnNlLm90aGVyR3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSBkZXBsb3ltZW50IHByb2JsZW0sIG5vdCBhIGJhZCBgdXJsYDogbGVhdmUgdGhlIHJvdXRlIGluIHRoZSBkZWZhdWx0XG4gICAgICAvLyBncm91cCwgb3Igc2VydmUgdGhlIGltYWdlIGFzIGEgZmlsZSAocHVibGljLyBvciBhIHN0YXRpYyBpbXBvcnQpLlxuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA1MDIsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaXRzIHNvdXJjZSBpcyBhIHJvdXRlIGluIGFub3RoZXIgJyArXG4gICAgICAgICAgYGZ1bmN0aW9uR3JvdXBzIGdyb3VwIChcIiR7cmVzcG9uc2Uub3RoZXJHcm91cH1cIiksIHdoaWNoIHRoZSBpbWFnZSBgICtcbiAgICAgICAgICBcIm9wdGltaXplciBjYW5ub3QgZmV0Y2hcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZS50b29MYXJnZSkge1xuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA0MTMsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaW50ZXJuYWwgcmVzcG9uc2UgaXMgaW52YWxpZCcsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLnN0YXR1c0NvZGUgfHwgcmVzcG9uc2UuYm9keS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBvcHRpbWl6ZXIuSW1hZ2VFcnJvcihcbiAgICAgICAgNDAwLFxuICAgICAgICAnXCJ1cmxcIiBwYXJhbWV0ZXIgaXMgdmFsaWQgYnV0IGludGVybmFsIHJlc3BvbnNlIGlzIGludmFsaWQnLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1ZmZlcjogcmVzcG9uc2UuYm9keSxcbiAgICAgIGNvbnRlbnRUeXBlOiBmaXJzdFZhbHVlKHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0pID8/IG51bGwsXG4gICAgICBjYWNoZUNvbnRyb2w6IGZpcnN0VmFsdWUocmVzcG9uc2UuaGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0pID8/IG51bGwsXG4gICAgICBldGFnOiBleHRyYWN0RXRhZyhcbiAgICAgICAgZmlyc3RWYWx1ZShyZXNwb25zZS5oZWFkZXJzLmV0YWcpID8/IG51bGwsXG4gICAgICAgIHJlc3BvbnNlLmJvZHksXG4gICAgICApLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBgQ2FjaGVkUm91dGVLaW5kLklNQUdFYCwgd2hpY2ggaXMgYWxzbyBgUm91dGVLaW5kLklNQUdFYC4gUmVzdGF0ZWQ6IHRoZSBlbnVtIGlzXG4gKiBhIHJ1bnRpbWUgdmFsdWUgb2YgYG5leHRgLCB3aGljaCB0aGUgYnVuZGxlIGNhbm5vdCBpbXBvcnQuXG4gKi9cbmNvbnN0IElNQUdFX0tJTkQgPSBcIklNQUdFXCIgYXMgQ2FjaGVkUm91dGVLaW5kLklNQUdFO1xuXG4vKiogYGltYWdlT3B0aW1pemVyYCdzIGBwcmV2aW91c0NhY2hlRW50cnlgLiAqL1xudHlwZSBQcmV2aW91c0ltYWdlRW50cnkgPSBQYXJhbWV0ZXJzPFxuICBOZXh0SW1hZ2VNb2R1bGVzW1wib3B0aW1pemVyXCJdW1wiaW1hZ2VPcHRpbWl6ZXJcIl1cbj5bM11bXCJwcmV2aW91c0NhY2hlRW50cnlcIl07XG5cbmludGVyZmFjZSBJbWFnZUNhY2hlIHtcbiAgcmVhZG9ubHkgcmVzcG9uc2VzOiBJbnN0YW5jZVR5cGU8XG4gICAgTmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl1cbiAgPjtcbiAgcmVhZG9ubHkgaW1hZ2VzOiBJbnN0YW5jZVR5cGU8XG4gICAgTmV4dEltYWdlTW9kdWxlc1tcIm9wdGltaXplclwiXVtcIkltYWdlT3B0aW1pemVyQ2FjaGVcIl1cbiAgPjtcbn1cblxuLyoqXG4gKiBUaGUgYXBwJ3MgYGNhY2hlSGFuZGxlcmAsIGNvbnN0cnVjdGVkIHRoZSB3YXkgYG5leHQgc3RhcnRgIGNvbnN0cnVjdHMgaXQgZm9yXG4gKiBpbWFnZXMgKGBuZXh0LXNlcnZlci5qc2AsIGBoYW5kbGVOZXh0SW1hZ2VSZXF1ZXN0YCk6IG9uY2UsIGFuZCBrZXB0LCBzbyBpdHNcbiAqIGluLW1lbW9yeSBsYXllciBsYXN0cyBhY3Jvc3MgcmVxdWVzdHMuIEl0cyBwYXRoIGluIHRoZSBtYW5pZmVzdCBpcyByZWxhdGl2ZVxuICogdG8gdGhlIGRpc3QgZGlyOyBzZWUge0BsaW5rIGNhY2hlSGFuZGxlclVybH0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRJbWFnZUNhY2hlKFxuICB7IGRlcGxveW1lbnRSb290LCBtYW5pZmVzdCwgaW1wb3J0TW9kdWxlIH06IEltYWdlT3B0aW1pemVyT3B0aW9ucyxcbiAgbG9hZGVkOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPixcbik6IFByb21pc2U8SW1hZ2VDYWNoZT4ge1xuICBjb25zdCB7IG5leHQsIG5leHRDb25maWcgfSA9IGxvYWRlZDtcbiAgY29uc3QgbW9kdWxlczogTmV4dEltYWdlQ2FjaGVNb2R1bGVzID0ge1xuICAgIHJlc3BvbnNlQ2FjaGU6IG5leHRNb2R1bGUoXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCIpLFxuICB9O1xuICBjb25zdCBkaXN0RGlyID0gam9pbihcbiAgICBkZXBsb3ltZW50Um9vdCxcbiAgICBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXIsXG4gICAgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIsXG4gICk7XG4gIGxldCBjYWNoZUhhbmRsZXI6IEluc3RhbmNlVHlwZTxDYWNoZUhhbmRsZXJDbGFzcz4gfCB1bmRlZmluZWQ7XG4gIGlmIChuZXh0Q29uZmlnLmNhY2hlSGFuZGxlcikge1xuICAgIGNvbnN0IHVybCA9IGNhY2hlSGFuZGxlclVybChkaXN0RGlyLCBuZXh0Q29uZmlnLmNhY2hlSGFuZGxlcik7XG4gICAgY29uc3QgaW1wb3J0ZWQgPSAoYXdhaXQgKGltcG9ydE1vZHVsZVxuICAgICAgPyBpbXBvcnRNb2R1bGUodXJsKVxuICAgICAgOiBpbXBvcnQodXJsKSkpIGFzIHsgZGVmYXVsdD86IENhY2hlSGFuZGxlckNsYXNzIH0gJiBDYWNoZUhhbmRsZXJDbGFzcztcbiAgICBjb25zdCBDYWNoZUhhbmRsZXIgPSBpbXBvcnRlZC5kZWZhdWx0ID8/IGltcG9ydGVkO1xuICAgIGNhY2hlSGFuZGxlciA9IG5ldyBDYWNoZUhhbmRsZXIoe1xuICAgICAgZGV2OiBmYWxzZSxcbiAgICAgIGZsdXNoVG9EaXNrOiBuZXh0Q29uZmlnLmV4cGVyaW1lbnRhbC5pc3JGbHVzaFRvRGlzayxcbiAgICAgIHNlcnZlckRpc3REaXI6IGpvaW4oZGlzdERpciwgXCJzZXJ2ZXJcIiksXG4gICAgICBtYXhNZW1vcnlDYWNoZVNpemU6IG5leHRDb25maWcuY2FjaGVNYXhNZW1vcnlTaXplLFxuICAgICAgcmV2YWxpZGF0ZWRUYWdzOiBbXSxcbiAgICAgIF9yZXF1ZXN0SGVhZGVyczoge30sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZXNwb25zZXM6IG5ld0ltYWdlUmVzcG9uc2VDYWNoZShtb2R1bGVzLnJlc3BvbnNlQ2FjaGUuZGVmYXVsdCksXG4gICAgaW1hZ2VzOiBuZXcgbmV4dC5vcHRpbWl6ZXIuSW1hZ2VPcHRpbWl6ZXJDYWNoZSh7XG4gICAgICBkaXN0RGlyLFxuICAgICAgbmV4dENvbmZpZyxcbiAgICAgIGNhY2hlSGFuZGxlcixcbiAgICB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBgbmV3IFJlc3BvbnNlQ2FjaGUoLi4uKWAgZm9yIGltYWdlcywgb24gZWl0aGVyIHNpZGUgb2YgbmV4dCAxNi4zLjguIEJlZm9yZVxuICogaXQgdGhlIGNvbnN0cnVjdG9yIHRvb2sgYG1pbmltYWxNb2RlYDsgZnJvbSBpdCwgYHsgbWluaW1hbE1vZGUsIHJvdXRlIH1gLCBhbmRcbiAqIGl0IHRocm93cyB3aXRob3V0IGEgYHJvdXRlYCAtIGBuZXh0LXNlcnZlci5qc2AgcGFzc2VzIGBcImltYWdlXCJgLiBOZWl0aGVyIGZvcm1cbiAqIGNhbiBzdGFuZCBpbiBmb3IgdGhlIG90aGVyOiBhbiBvbGRlciBgbmV4dGAgdGFrZXMgdGhlIG9wdGlvbnMgb2JqZWN0IGFzIGFcbiAqIHRydXRoeSBgbWluaW1hbE1vZGVgLCBhbmQgMTYuMy44IHJlamVjdHMgYSBiYXJlIGBmYWxzZWAuXG4gKlxuICogVG9sZCBhcGFydCBieSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIHRoZSBvbGRlciBmb3JtIHJhdGhlciB0aGFuIGJ5XG4gKiB0aGUgdmVyc2lvbiwgd2hpY2ggYSBjYW5hcnkgZG9lcyBub3Qgb3JkZXIsIG9yIGJ5IGl0cyBwcml2YXRlIGZpZWxkczogMTYuMy44XG4gKiBkZXN0cnVjdHVyZXMgYSBiYXJlIGBmYWxzZWAgaW50byBubyBgcm91dGVgIGFuZCB0aHJvd3MuIE9ubHkgdGhhdCB0aHJvd1xuICogc2VsZWN0cyB0aGUgbmV3ZXIgZm9ybTsgYW55IG90aGVyIGVycm9yIGZyb20gdGhlIGNvbnN0cnVjdG9yIGlzIHJldGhyb3duXG4gKiByYXRoZXIgdGhhbiByZWFkIGFzIGEgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0ltYWdlUmVzcG9uc2VDYWNoZShcbiAgUmVzcG9uc2VDYWNoZTogTmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl0sXG4pOiBJbnN0YW5jZVR5cGU8TmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl0+IHtcbiAgY29uc3QgTGVnYWN5ID0gUmVzcG9uc2VDYWNoZSBhcyB1bmtub3duIGFzIG5ldyAoXG4gICAgbWluaW1hbE1vZGU6IGJvb2xlYW4sXG4gICkgPT4gSW5zdGFuY2VUeXBlPHR5cGVvZiBSZXNwb25zZUNhY2hlPjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IExlZ2FjeShmYWxzZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghU3RyaW5nKChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlKS5pbmNsdWRlcyhcInJlcXVpcmVzIGEgc291cmNlIHJvdXRlXCIpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUmVzcG9uc2VDYWNoZSh7IG1pbmltYWxNb2RlOiBmYWxzZSwgcm91dGU6IFwiaW1hZ2VcIiB9KTtcbiAgfVxufVxuXG4vKipcbiAqIGBmb3JtYXREeW5hbWljSW1wb3J0UGF0aGAgZnJvbSBgbmV4dC9kaXN0L2xpYi9mb3JtYXQtZHluYW1pYy1pbXBvcnQtcGF0aC5qc2AsXG4gKiByZXN0YXRlZDogYG5leHQgYnVpbGRgIGRvZXNuJ3QgdHJhY2UgdGhhdCBtb2R1bGUgaW50byB0aGUgZGVwbG95bWVudCwgc29cbiAqIGxvYWRpbmcgaXQgZmFpbGVkIGV2ZXJ5IGltYWdlIHJlcXVlc3Qgd2l0aCB0aGUgY2FjaGUgb24uIE5vIGBmaWxlOi8vYCBjYXNlOlxuICogdGhlIGFkYXB0ZXIgYWxyZWFkeSB0dXJuZWQgb25lIGludG8gYSBwYXRoIChgZGlzdFJlbGF0aXZlQ2FjaGVIYW5kbGVyYCkuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFuZGxlclVybChkaXN0RGlyOiBzdHJpbmcsIGNhY2hlSGFuZGxlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGhUb0ZpbGVVUkwoXG4gICAgaXNBYnNvbHV0ZVBhdGgoY2FjaGVIYW5kbGVyKSA/IGNhY2hlSGFuZGxlciA6IGpvaW4oZGlzdERpciwgY2FjaGVIYW5kbGVyKSxcbiAgKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIGBpbWFnZXNgLCB3aXRoIGl0cyBgc2V0YCBtb3ZlZCBvZmYgdGhlIHJlc3BvbnNlJ3MgY3JpdGljYWwgcGF0aC5cbiAqXG4gKiBgUmVzcG9uc2VDYWNoZWAgYXdhaXRzIHRoZSB3cml0ZSBvZiBhIGZyZXNobHkgb3B0aW1pemVkIGltYWdlIGJlZm9yZSBpdCBoYW5kc1xuICogdGhlIGltYWdlIGJhY2ssIHNvIGV2ZXJ5IG1pc3MgcGFpZCBhbiBTMyBgUHV0T2JqZWN0YCAofjMwIG1zIG1lYXN1cmVkKSBiZWZvcmVcbiAqIGl0cyBmaXJzdCBieXRlLiBUaGUgd3JpdGUgaXMgcmVnaXN0ZXJlZCB3aXRoIGB3YWl0VW50aWxgIGluc3RlYWQsIHdoaWNoIHRoZVxuICogcnVudGltZSBkcmFpbnMgYmVmb3JlIGEgTGFtYmRhIGludm9jYXRpb24gcmV0dXJucyBvciBhIGNvbnRhaW5lciBzaHV0cyBkb3duLFxuICogc28gaXQgc3RpbGwgbGFuZHMuIEEgZmFpbGVkIHdyaXRlIGlzIGxvZ2dlZDsgdGhlIG5leHQgcmVxdWVzdCBvcHRpbWl6ZXMgdGhlXG4gKiBpbWFnZSBhZ2Fpbiwgd2hpY2ggaXMgd2hhdCBpdCB3b3VsZCBoYXZlIGRvbmUgYW55d2F5LlxuICovXG5mdW5jdGlvbiBkZWZlcldyaXRlcyhcbiAgaW1hZ2VzOiBJbWFnZUNhY2hlW1wiaW1hZ2VzXCJdLFxuICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuKTogSW1hZ2VDYWNoZVtcImltYWdlc1wiXSB7XG4gIGNvbnN0IGRlZmVycmVkID0gT2JqZWN0LmNyZWF0ZShpbWFnZXMpIGFzIEltYWdlQ2FjaGVbXCJpbWFnZXNcIl07XG4gIGRlZmVycmVkLnNldCA9ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEltYWdlQ2FjaGVbXCJpbWFnZXNcIl1bXCJzZXRcIl0+KSA9PiB7XG4gICAgd2FpdFVudGlsKFxuICAgICAgaW1hZ2VzLnNldCguLi5hcmdzKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjYWNoZSBhbiBvcHRpbWl6ZWQgaW1hZ2U6XCIsIGVycm9yKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9O1xuICByZXR1cm4gZGVmZXJyZWQ7XG59XG5cbmZ1bmN0aW9uIHNlbmRUZXh0KFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICBib2R5OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpblwiKTtcbiAgcmVzLmVuZChib2R5KTtcbn1cblxuLyoqXG4gKiBgbWFuaWZlc3QuY29uZmlnLmltYWdlc2AsIG9uY2UgdGhlIG1hbmlmZXN0IGlzIGtub3duIHRvIGJlIG9uZSB0aGlzIHJ1bnRpbWVcbiAqIHJlYWRzICh3aXRoIGBleHBlcmltZW50YWxgLCDigKYpLiBUaGUgZmllbGRzIGFyZSB0eXBlZCBgdW5rbm93bmAsIHNvIG9ubHkgdGhlXG4gKiB2ZXJzaW9uIGNhdGNoZXMgYSBtYW5pZmVzdCBhbm90aGVyIGNkay1uZXh0anMgd3JvdGU7IGBOZXh0anNCdWlsZGAgcmVqZWN0cyBvbmVcbiAqIGF0IHN5bnRoLCB3aGljaCBhIGhhbmQtd2lyZWQgZnVuY3Rpb24gc2tpcHMuXG4gKi9cbmZ1bmN0aW9uIG1hbmlmZXN0SW1hZ2VzKFxuICBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0LFxuKTogTmV4dENvbmZpZ0NvbXBsZXRlW1wiaW1hZ2VzXCJdIHtcbiAgaWYgKG1hbmlmZXN0LmNka05leHRqc1ZlcnNpb24gIT09IENES19ORVhUSlNfVkVSU0lPTikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgYWRhcHRlciBtYW5pZmVzdCB3YXMgd3JpdHRlbiBieSBjZGstbmV4dGpzIGAgK1xuICAgICAgICBgJHttYW5pZmVzdC5jZGtOZXh0anNWZXJzaW9uID8/IFwiKHVua25vd24pXCJ9LCBidXQgdGhpcyBydW50aW1lIGlzIGAgK1xuICAgICAgICBgY2RrLW5leHRqcyAke0NES19ORVhUSlNfVkVSU0lPTn0uIFJlYnVpbGQgdGhlIGFwcCB3aXRoIHRoaXMgdmVyc2lvbi5gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1hbmlmZXN0LmNvbmZpZy5pbWFnZXMgYXMgTmV4dENvbmZpZ0NvbXBsZXRlW1wiaW1hZ2VzXCJdO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpbWl6ZXIncyBgbmV4dENvbmZpZ2AsIGZyb20gdGhlIGFkYXB0ZXIgbWFuaWZlc3QsIHdoaWNoIGNvcGllZCBpdCBvdXRcbiAqIG9mIHRoZSBidWlsZCdzIGBjdHguY29uZmlnYCAoYEFkYXB0ZXJNYW5pZmVzdENvbmZpZy5pbWFnZXNgKTogYWxyZWFkeSByZXNvbHZlZFxuICogYW5kIGRlZmF1bHRlZCwgc28gbmVpdGhlciBgZ2V0TmV4dENvbmZpZ1J1bnRpbWVgIG5vciBgaW1hZ2VDb25maWdEZWZhdWx0YCBpc1xuICogbmVlZGVkLiBPbmx5IHRoZSBmaWVsZHMgTmV4dCdzIGltYWdlIGNvZGUgcmVhZHM7IHRoZSBjYXN0IGlzIGJlY2F1c2UgdGhlXG4gKiBtYW5pZmVzdCBzdG9yZXMgdGhlbSBhcyBKU09OLlxuICovXG5mdW5jdGlvbiBsb2FkSW1hZ2VSdW50aW1lKHsgbWFuaWZlc3QgfTogSW1hZ2VPcHRpbWl6ZXJPcHRpb25zKSB7XG4gIGNvbnN0IG5leHQ6IE5leHRJbWFnZU1vZHVsZXMgPSB7XG4gICAgb3B0aW1pemVyOiBuZXh0TW9kdWxlKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiksXG4gICAgc2VydmVTdGF0aWM6IG5leHRNb2R1bGUoXCJuZXh0L2Rpc3Qvc2VydmVyL3NlcnZlLXN0YXRpYy5qc1wiKSxcbiAgfTtcbiAgY29uc3QgeyBjb25maWcgfSA9IG1hbmlmZXN0O1xuICBjb25zdCBuZXh0Q29uZmlnID0ge1xuICAgIGJhc2VQYXRoOiBjb25maWcuYmFzZVBhdGgsXG4gICAgYXNzZXRQcmVmaXg6IGNvbmZpZy5hc3NldFByZWZpeCxcbiAgICBpbWFnZXM6IG1hbmlmZXN0SW1hZ2VzKG1hbmlmZXN0KSxcbiAgICBleHBlcmltZW50YWw6IGNvbmZpZy5leHBlcmltZW50YWwsXG4gICAgY2FjaGVIYW5kbGVyOiBjb25maWcuY2FjaGVIYW5kbGVyID8/IHVuZGVmaW5lZCxcbiAgICBjYWNoZU1heE1lbW9yeVNpemU6IGNvbmZpZy5jYWNoZU1heE1lbW9yeVNpemUsXG4gIH0gYXMgTmV4dENvbmZpZ0NvbXBsZXRlO1xuICByZXR1cm4geyBuZXh0LCBuZXh0Q29uZmlnIH07XG59XG4iXX0=