cdk-nextjs 0.6.2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +2404 -2723
- package/.jsii.tabl.json +1 -1
- package/API.md +1681 -1930
- package/CLAUDE.md +2 -1
- package/README.md +429 -130
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +148 -169
- package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
- package/docs/adapter-runtime.md +185 -0
- package/docs/breaking-changes.md +667 -4
- package/docs/caching-guide.md +156 -112
- package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
- package/docs/development-guide.md +1 -1
- package/docs/harness-coverage.md +598 -0
- package/docs/init-cache-deployment.md +32 -1
- package/docs/next-build-output-guide.md +30 -20
- package/examples/README.md +5 -1
- package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
- package/lib/adapter/__fixtures__/app-playground.json +4917 -0
- package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
- package/lib/adapter/adapter.mjs +1551 -185
- package/lib/adapter/adapter.test.js +106 -0
- package/lib/adapter/aws-cache-store.d.ts +489 -0
- package/lib/adapter/aws-cache-store.js +1004 -0
- package/lib/adapter/aws-cache-store.test.d.ts +1 -0
- package/lib/adapter/aws-cache-store.test.js +361 -0
- package/lib/adapter/build-outputs.d.ts +80 -0
- package/lib/adapter/build-outputs.js +857 -0
- package/lib/adapter/build-outputs.test.d.ts +1 -0
- package/lib/adapter/build-outputs.test.js +863 -0
- package/lib/adapter/cache-handler.d.ts +9 -2
- package/lib/adapter/cache-handler.js +72 -96
- package/lib/adapter/cache-handler.mjs +18956 -17774
- package/lib/adapter/cache-handler.test.js +263 -31
- package/lib/adapter/cache-kinds.d.ts +32 -0
- package/lib/adapter/cache-kinds.js +35 -0
- package/lib/adapter/cache-kinds.test.d.ts +1 -0
- package/lib/adapter/cache-kinds.test.js +69 -0
- package/lib/adapter/cache-utils.d.ts +90 -0
- package/lib/adapter/cache-utils.js +199 -4
- package/lib/adapter/cache-utils.test.d.ts +1 -0
- package/lib/adapter/cache-utils.test.js +179 -0
- package/lib/adapter/function-groups.d.ts +215 -0
- package/lib/adapter/function-groups.js +1099 -0
- package/lib/adapter/function-groups.test.d.ts +1 -0
- package/lib/adapter/function-groups.test.js +743 -0
- package/lib/adapter/init-cache.d.ts +6 -0
- package/lib/adapter/init-cache.js +245 -0
- package/lib/adapter/init-cache.test.d.ts +1 -0
- package/lib/adapter/init-cache.test.js +137 -0
- package/lib/adapter/local-file-cache-handler.d.ts +23 -0
- package/lib/adapter/local-file-cache-handler.js +52 -1
- package/lib/adapter/memory-cache-handler.d.ts +26 -17
- package/lib/adapter/memory-cache-handler.js +32 -50
- package/lib/adapter/memory-cache-handler.test.js +105 -85
- package/lib/adapter/s3-cache-handler.d.ts +179 -40
- package/lib/adapter/s3-cache-handler.js +807 -277
- package/lib/adapter/s3-cache-handler.test.js +1186 -31
- package/lib/adapter/use-cache-common.d.ts +90 -0
- package/lib/adapter/use-cache-common.js +250 -0
- package/lib/adapter/use-cache-common.test.d.ts +1 -0
- package/lib/adapter/use-cache-common.test.js +646 -0
- package/lib/adapter/use-cache-default-handler.d.ts +24 -0
- package/lib/adapter/use-cache-default-handler.js +90 -0
- package/lib/adapter/use-cache-default-handler.mjs +38645 -0
- package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
- package/lib/adapter/use-cache-handlers.test.js +349 -0
- package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
- package/lib/adapter/use-cache-remote-handler.js +186 -0
- package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
- package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
- package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +8 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +6 -4
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
- package/lib/index.d.ts +6 -7
- package/lib/index.js +2 -4
- package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
- package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
- package/lib/lambdas/post-deploy/prune-s3.d.ts +14 -5
- package/lib/lambdas/post-deploy/prune-s3.js +41 -12
- package/lib/lambdas/post-deploy/prune-s3.test.js +97 -18
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
- package/lib/nextjs-api.d.ts +102 -18
- package/lib/nextjs-api.js +338 -38
- package/lib/nextjs-api.test.js +537 -1
- package/lib/nextjs-build/global-containers.Dockerfile +15 -10
- package/lib/nextjs-build/nextjs-build.d.ts +339 -63
- package/lib/nextjs-build/nextjs-build.js +684 -327
- package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
- package/lib/nextjs-build/nextjs-build.test.js +412 -0
- package/lib/nextjs-build/patch-fetch.js +1 -1
- package/lib/nextjs-build/patch-fetch.test.js +166 -11
- package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
- package/lib/nextjs-cache.d.ts +82 -4
- package/lib/nextjs-cache.js +186 -10
- package/lib/nextjs-cache.test.js +176 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
- package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
- package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
- package/lib/nextjs-compute/nextjs-containers.js +57 -20
- package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
- package/lib/nextjs-compute/nextjs-functions.js +113 -67
- package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
- package/lib/nextjs-distribution.d.ts +194 -23
- package/lib/nextjs-distribution.js +535 -62
- package/lib/nextjs-distribution.test.d.ts +1 -0
- package/lib/nextjs-distribution.test.js +697 -0
- package/lib/nextjs-post-deploy.d.ts +13 -5
- package/lib/nextjs-post-deploy.js +13 -10
- package/lib/nextjs-post-deploy.test.d.ts +1 -0
- package/lib/nextjs-post-deploy.test.js +34 -0
- package/lib/nextjs-static-assets.d.ts +17 -4
- package/lib/nextjs-static-assets.js +22 -5
- package/lib/root-constructs/nextjs-base-construct.d.ts +102 -58
- package/lib/root-constructs/nextjs-base-construct.js +139 -47
- package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
- package/lib/root-constructs/nextjs-global-containers.js +20 -71
- package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
- package/lib/root-constructs/nextjs-global-functions.js +52 -70
- package/lib/root-constructs/nextjs-regional-containers.d.ts +18 -5
- package/lib/root-constructs/nextjs-regional-containers.js +8 -15
- package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
- package/lib/root-constructs/nextjs-regional-functions.js +8 -26
- package/lib/runtime/api-gateway-path.d.ts +34 -0
- package/lib/runtime/api-gateway-path.js +71 -0
- package/lib/runtime/api-gateway-path.test.d.ts +1 -0
- package/lib/runtime/api-gateway-path.test.js +65 -0
- package/lib/runtime/case-redirect.d.ts +22 -0
- package/lib/runtime/case-redirect.js +63 -0
- package/lib/runtime/case-redirect.test.d.ts +1 -0
- package/lib/runtime/case-redirect.test.js +32 -0
- package/lib/runtime/core.d.ts +234 -0
- package/lib/runtime/core.js +1216 -0
- package/lib/runtime/core.test.d.ts +1 -0
- package/lib/runtime/core.test.js +1686 -0
- package/lib/runtime/deployment-root.d.ts +13 -0
- package/lib/runtime/deployment-root.js +29 -0
- package/lib/runtime/dispatch.d.ts +331 -0
- package/lib/runtime/dispatch.js +751 -0
- package/lib/runtime/dispatch.test.d.ts +1 -0
- package/lib/runtime/dispatch.test.js +853 -0
- package/lib/runtime/entrypoints.d.ts +57 -0
- package/lib/runtime/entrypoints.js +115 -0
- package/lib/runtime/http/abort-signal.d.ts +6 -0
- package/lib/runtime/http/abort-signal.js +19 -0
- package/lib/runtime/http/abort-signal.test.d.ts +1 -0
- package/lib/runtime/http/abort-signal.test.js +49 -0
- package/lib/runtime/http/node-server.d.ts +38 -0
- package/lib/runtime/http/node-server.js +99 -0
- package/lib/runtime/http/node-server.test.d.ts +1 -0
- package/lib/runtime/http/node-server.test.js +96 -0
- package/lib/runtime/http/node-sink.d.ts +16 -0
- package/lib/runtime/http/node-sink.js +48 -0
- package/lib/runtime/http/node-sink.test.d.ts +1 -0
- package/lib/runtime/http/node-sink.test.js +66 -0
- package/lib/runtime/http/request.d.ts +62 -0
- package/lib/runtime/http/request.js +134 -0
- package/lib/runtime/http/request.test.d.ts +1 -0
- package/lib/runtime/http/request.test.js +103 -0
- package/lib/runtime/http/response.d.ts +77 -0
- package/lib/runtime/http/response.js +229 -0
- package/lib/runtime/http/response.test.d.ts +1 -0
- package/lib/runtime/http/response.test.js +178 -0
- package/lib/runtime/http/sink.d.ts +73 -0
- package/lib/runtime/http/sink.js +188 -0
- package/lib/runtime/http/sink.test.d.ts +1 -0
- package/lib/runtime/http/sink.test.js +257 -0
- package/lib/runtime/image-utils.d.ts +78 -0
- package/lib/runtime/image-utils.js +129 -0
- package/lib/runtime/image-utils.test.d.ts +1 -0
- package/lib/runtime/image-utils.test.js +237 -0
- package/lib/runtime/image.d.ts +76 -0
- package/lib/runtime/image.js +296 -0
- package/lib/runtime/image.test.d.ts +1 -0
- package/lib/runtime/image.test.js +405 -0
- package/lib/runtime/lambda-event.d.ts +4 -0
- package/lib/runtime/lambda-event.js +113 -0
- package/lib/runtime/lambda-event.test.d.ts +1 -0
- package/lib/runtime/lambda-event.test.js +119 -0
- package/lib/runtime/lambda.mjs +41600 -0
- package/lib/runtime/load-module.d.ts +8 -0
- package/lib/runtime/load-module.js +35 -0
- package/lib/runtime/manifest.d.ts +215 -0
- package/lib/runtime/manifest.js +118 -0
- package/lib/runtime/middleware.d.ts +43 -0
- package/lib/runtime/middleware.js +113 -0
- package/lib/runtime/middleware.test.d.ts +1 -0
- package/lib/runtime/middleware.test.js +259 -0
- package/lib/runtime/next-modules.d.ts +71 -0
- package/lib/runtime/next-modules.js +144 -0
- package/lib/runtime/next-modules.test.d.ts +1 -0
- package/lib/runtime/next-modules.test.js +34 -0
- package/lib/runtime/public-files.d.ts +32 -0
- package/lib/runtime/public-files.js +117 -0
- package/lib/runtime/public-files.test.d.ts +1 -0
- package/lib/runtime/public-files.test.js +97 -0
- package/lib/runtime/server.mjs +41593 -0
- package/lib/runtime/static-files.d.ts +50 -0
- package/lib/runtime/static-files.js +266 -0
- package/lib/runtime/static-files.test.d.ts +1 -0
- package/lib/runtime/static-files.test.js +118 -0
- package/lib/runtime/util.d.ts +28 -0
- package/lib/runtime/util.js +79 -0
- package/lib/utils/base-path.d.ts +106 -13
- package/lib/utils/base-path.js +254 -41
- package/lib/utils/base-path.test.js +219 -51
- package/lib/utils/get-architecture.d.ts +7 -8
- package/lib/utils/get-architecture.js +12 -13
- package/lib/utils/zip-directory.d.ts +14 -0
- package/lib/utils/zip-directory.js +121 -0
- package/lib/utils/zip-directory.test.d.ts +1 -0
- package/lib/utils/zip-directory.test.js +99 -0
- package/package.json +22 -3
- package/scripts/capture-adapter-fixture.mjs +325 -0
- package/scripts/e2e-deploy.sh +398 -0
- package/scripts/e2e-harness/README.md +707 -0
- package/scripts/e2e-harness/app.js +370 -0
- package/scripts/e2e-harness/common.sh +249 -0
- package/scripts/e2e-harness/screen.mjs +302 -0
- package/scripts/e2e-harness/stage-proxy.mjs +145 -0
- package/scripts/e2e-harness/type-filters.mjs +47 -0
- package/scripts/e2e-logs.sh +75 -0
- package/scripts/e2e-offline.sh +91 -0
- package/scripts/e2e-sweep.sh +370 -0
- package/scripts/e2e-warm.sh +114 -0
- package/scripts/zero-config-build.mjs +418 -0
- package/docs/1k-concurrent-users-executions.png +0 -0
- package/docs/plans/adapter-runtime-release.md +0 -362
- package/docs/plans/phase-0-image-function-opt-in.md +0 -295
- package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
- package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
- package/lib/image-optimization/handler-utils.d.ts +0 -34
- package/lib/image-optimization/handler-utils.js +0 -83
- package/lib/image-optimization/handler-utils.test.js +0 -178
- package/lib/nextjs-build/functions.Dockerfile +0 -31
- package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
- package/lib/nextjs-compute/nextjs-image-function.js +0 -59
- package/lib/utils/experimental-flags.d.ts +0 -24
- package/lib/utils/experimental-flags.js +0 -30
- /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const node_fs_1 = require("node:fs");
|
|
4
|
-
const node_os_1 = require("node:os");
|
|
5
|
-
const node_path_1 = require("node:path");
|
|
6
3
|
const constants_1 = require("../constants");
|
|
7
4
|
const base_path_1 = require("./base-path");
|
|
8
5
|
const GLOBAL = [constants_1.NextjsType.GLOBAL_FUNCTIONS, constants_1.NextjsType.GLOBAL_CONTAINERS];
|
|
@@ -22,6 +19,21 @@ describe("normalizeBasePath", () => {
|
|
|
22
19
|
expect((0, base_path_1.normalizeBasePath)("/team/app/")).toBe("team/app");
|
|
23
20
|
});
|
|
24
21
|
});
|
|
22
|
+
describe("wholeAppInvalidationPaths", () => {
|
|
23
|
+
it("is the whole distribution without a basePath", () => {
|
|
24
|
+
expect((0, base_path_1.wholeAppInvalidationPaths)()).toEqual(["/*"]);
|
|
25
|
+
expect((0, base_path_1.wholeAppInvalidationPaths)("")).toEqual(["/*"]);
|
|
26
|
+
});
|
|
27
|
+
it("covers the app's root and RSC payload, but no sibling prefix", () => {
|
|
28
|
+
for (const basePath of ["/base", "base", "/base/"]) {
|
|
29
|
+
expect((0, base_path_1.wholeAppInvalidationPaths)(basePath)).toEqual([
|
|
30
|
+
"/base",
|
|
31
|
+
"/base?*",
|
|
32
|
+
"/base/*",
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
25
37
|
describe("joinPath", () => {
|
|
26
38
|
const origin = "https://d111111abcdef8.cloudfront.net";
|
|
27
39
|
it("drops empty parts", () => {
|
|
@@ -54,7 +66,7 @@ describe("joinPath", () => {
|
|
|
54
66
|
});
|
|
55
67
|
describe("prefixWithBasePath", () => {
|
|
56
68
|
// The health check path is handed to things that talk to the app directly (an
|
|
57
|
-
// ALB target group, the
|
|
69
|
+
// ALB target group, the container's own health probe), and the app only
|
|
58
70
|
// answers under its basePath. Unprefixed, every check 404s: the target never
|
|
59
71
|
// turns healthy, so tasks are killed on the health check interval and the
|
|
60
72
|
// deployment rolls back.
|
|
@@ -99,47 +111,94 @@ describe("prefixWithBasePath", () => {
|
|
|
99
111
|
expect((0, base_path_1.prefixWithBasePath)("/prod/base", "/api/health")).toBe("/prod/base/api/health");
|
|
100
112
|
});
|
|
101
113
|
});
|
|
102
|
-
describe("
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
114
|
+
describe("basePathPrefix", () => {
|
|
115
|
+
it("spells every basePath the way Next.js does", () => {
|
|
116
|
+
for (const value of ["/base", "base", "/base/", "//base//"]) {
|
|
117
|
+
expect((0, base_path_1.basePathPrefix)(value)).toBe("/base");
|
|
118
|
+
}
|
|
119
|
+
expect((0, base_path_1.basePathPrefix)("/a/b/")).toBe("/a/b");
|
|
120
|
+
expect((0, base_path_1.basePathPrefix)("/")).toBe("");
|
|
121
|
+
expect((0, base_path_1.basePathPrefix)(undefined)).toBe("");
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe("relativeAssetPrefix", () => {
|
|
125
|
+
it("reads a path-style assetPrefix with one leading slash", () => {
|
|
126
|
+
expect((0, base_path_1.relativeAssetPrefix)("/custom-asset-prefix")).toBe("/custom-asset-prefix");
|
|
127
|
+
expect((0, base_path_1.relativeAssetPrefix)("custom-asset-prefix/")).toBe("/custom-asset-prefix");
|
|
128
|
+
expect((0, base_path_1.relativeAssetPrefix)("")).toBe("");
|
|
129
|
+
expect((0, base_path_1.relativeAssetPrefix)("/")).toBe("");
|
|
130
|
+
});
|
|
131
|
+
it("ignores an absolute assetPrefix", () => {
|
|
132
|
+
// It names an origin cdk-nextjs does not serve, so there is no behavior to
|
|
133
|
+
// add and nothing the distribution could get wrong.
|
|
134
|
+
for (const assetPrefix of [
|
|
135
|
+
"https://cdn.example.com",
|
|
136
|
+
"http://cdn.example.com/x",
|
|
137
|
+
"//cdn.example.com",
|
|
138
|
+
]) {
|
|
139
|
+
expect((0, base_path_1.relativeAssetPrefix)(assetPrefix)).toBe("");
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe("assetPrefixPath", () => {
|
|
144
|
+
it("reports the path an absolute assetPrefix carries too", () => {
|
|
145
|
+
// `relativeAssetPrefix` answers "is this a prefix the regional NextjsTypes
|
|
146
|
+
// cannot serve"; this answers "what path do bundle URLs carry", and an
|
|
147
|
+
// absolute prefix with a path carries one — `next build` compiles a
|
|
148
|
+
// rewrite for it, so `next start` serves bundles there. See
|
|
149
|
+
// `test/e2e/app-dir/asset-prefix-absolute`.
|
|
150
|
+
for (const [assetPrefix, path] of [
|
|
151
|
+
["https://example.vercel.sh/custom-asset-prefix", "/custom-asset-prefix"],
|
|
152
|
+
["//example.vercel.sh/cdn/", "/cdn"],
|
|
153
|
+
["https://example.vercel.sh/", ""],
|
|
154
|
+
["https://example.vercel.sh", ""],
|
|
155
|
+
["/cdn", "/cdn"],
|
|
156
|
+
["", ""],
|
|
157
|
+
]) {
|
|
158
|
+
expect((0, base_path_1.assetPrefixPath)(assetPrefix)).toBe(path);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe("isAssetPrefixUnserved", () => {
|
|
163
|
+
const REGIONAL = [
|
|
164
|
+
constants_1.NextjsType.REGIONAL_FUNCTIONS,
|
|
165
|
+
constants_1.NextjsType.REGIONAL_CONTAINERS,
|
|
166
|
+
];
|
|
167
|
+
it.each(REGIONAL)("%s: does not flag the assetPrefix Next.js derives from basePath", (nextjsType) => {
|
|
168
|
+
// The regression this function was extracted for. An app that sets only
|
|
169
|
+
// `basePath: "/prod"` — `examples/regional-functions`, and every regional
|
|
170
|
+
// deployment with a basePath — gets
|
|
171
|
+
// `{"assetPrefix":"/prod","basePath":"/prod"}` in
|
|
172
|
+
// `required-server-files.json`, because Next.js resolves one from the other.
|
|
173
|
+
// Flagging that told users their bundles would 404 at the one path that does
|
|
174
|
+
// serve them, on every synth.
|
|
175
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/prod", "prod")).toBe(false);
|
|
176
|
+
// Both sides arrive in different shapes — the assetPrefix reader adds a
|
|
177
|
+
// leading slash, the basePath reader strips one — so the comparison has to
|
|
178
|
+
// normalize rather than compare strings.
|
|
179
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/prod", "/prod/")).toBe(false);
|
|
180
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/a/b", "a/b")).toBe(false);
|
|
181
|
+
});
|
|
182
|
+
it.each(REGIONAL)("%s: flags a prefix nothing serves", (nextjsType) => {
|
|
183
|
+
// A genuinely different prefix is the case the warning exists for: bundles are
|
|
184
|
+
// requested at `/cdn/_next/static/...` and neither API Gateway's
|
|
185
|
+
// `_next/static` resource nor the container's own files answer there.
|
|
186
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", "prod")).toBe(true);
|
|
187
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", undefined)).toBe(true);
|
|
188
|
+
// A prefix *under* the basePath is still a different path, not a match.
|
|
189
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/prod/cdn", "prod")).toBe(true);
|
|
190
|
+
});
|
|
191
|
+
it.each(GLOBAL)("%s: flags nothing, having a behavior for it", (nextjsType) => {
|
|
192
|
+
// `NextjsDistribution` adds a cache behavior for the prefix, so on these types
|
|
193
|
+
// any prefix is served.
|
|
194
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", "prod")).toBe(false);
|
|
195
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", undefined)).toBe(false);
|
|
196
|
+
});
|
|
197
|
+
it.each(Object.values(constants_1.NextjsType))("%s: flags nothing when there is no prefix", (nextjsType) => {
|
|
198
|
+
// `relativeAssetPrefix` already reduces an absolute prefix to `""`,
|
|
199
|
+
// which is the supported way to serve assets from another origin.
|
|
200
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "", "prod")).toBe(false);
|
|
201
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "", undefined)).toBe(false);
|
|
143
202
|
});
|
|
144
203
|
});
|
|
145
204
|
describe("resolveBasePath", () => {
|
|
@@ -177,12 +236,71 @@ describe("resolveBasePath", () => {
|
|
|
177
236
|
});
|
|
178
237
|
});
|
|
179
238
|
describe(constants_1.NextjsType.REGIONAL_FUNCTIONS, () => {
|
|
239
|
+
const RF = constants_1.NextjsType.REGIONAL_FUNCTIONS;
|
|
240
|
+
const stage = (name) => ({
|
|
241
|
+
strippedPrefix: name,
|
|
242
|
+
customDomain: false,
|
|
243
|
+
});
|
|
244
|
+
const domain = (mapping = "") => ({
|
|
245
|
+
strippedPrefix: mapping,
|
|
246
|
+
customDomain: true,
|
|
247
|
+
});
|
|
248
|
+
let warn;
|
|
249
|
+
beforeEach(() => {
|
|
250
|
+
warn = jest.spyOn(console, "warn").mockImplementation(() => { });
|
|
251
|
+
});
|
|
252
|
+
afterEach(() => warn.mockRestore());
|
|
180
253
|
// API Gateway strips the stage before matching resources, so an app served
|
|
181
|
-
// at the default `prod` stage sets basePath: "/prod" and
|
|
182
|
-
//
|
|
183
|
-
//
|
|
184
|
-
|
|
185
|
-
|
|
254
|
+
// at the default `prod` stage sets basePath: "/prod" and its resources live
|
|
255
|
+
// at the root. Mounting them under "prod" would nest every resource under a
|
|
256
|
+
// path the stage already consumed.
|
|
257
|
+
// A domain attached with `addDomainName({ basePath: "v1" })` strips "/v1"
|
|
258
|
+
// where synth can't see it; "/" is how the user says so. Deriving would
|
|
259
|
+
// mount everything under "v1", which the stripped requests never reach.
|
|
260
|
+
it('mounts at the root when the prop is "/", instead of deriving', () => {
|
|
261
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/", "/v1")).toBeUndefined();
|
|
262
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/", "/v1", domain())).toBeUndefined();
|
|
263
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/", "/prod/base")).toBeUndefined();
|
|
264
|
+
// Unset still derives.
|
|
265
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/v1")).toBe("v1");
|
|
266
|
+
});
|
|
267
|
+
it("mounts an app whose basePath is the stage at the root", () => {
|
|
268
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/prod")).toBeUndefined();
|
|
269
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/test", stage("test"))).toBeUndefined();
|
|
270
|
+
expect(warn).not.toHaveBeenCalled();
|
|
271
|
+
});
|
|
272
|
+
it("mounts the rest of a basePath nested below the stage", () => {
|
|
273
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/prod/base")).toBe("base");
|
|
274
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/v2/a/b", stage("v2"))).toBe("a/b");
|
|
275
|
+
});
|
|
276
|
+
// The case that used to 404 every bundle: a custom domain mapped at the root
|
|
277
|
+
// strips nothing, so the app's basePath is a real resource path, and left at
|
|
278
|
+
// the root `_next/static` fell through to the Lambda catch-all.
|
|
279
|
+
it("mounts an app under its whole basePath when nothing strips it", () => {
|
|
280
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs", domain())).toBe("docs");
|
|
281
|
+
expect(warn).not.toHaveBeenCalled();
|
|
282
|
+
});
|
|
283
|
+
it("strips a custom domain's base path mapping like a stage", () => {
|
|
284
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/app", domain("app"))).toBeUndefined();
|
|
285
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/app/docs", domain("app"))).toBe("docs");
|
|
286
|
+
});
|
|
287
|
+
it("matches the stage on a segment boundary", () => {
|
|
288
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/production", domain())).toBe("production");
|
|
289
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/production", stage("prod"))).toBe("production");
|
|
290
|
+
});
|
|
291
|
+
// Without a custom domain the app's own links miss the stage, which synth
|
|
292
|
+
// can say but not fix - a domain attached with `addDomainName` is invisible.
|
|
293
|
+
it("warns when an execute-api app's basePath lacks the stage", () => {
|
|
294
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs")).toBe("docs");
|
|
295
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/prod/docs"`'));
|
|
296
|
+
});
|
|
297
|
+
it("warns when a custom domain's base path mapping is missing from the app's basePath", () => {
|
|
298
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs", domain("v1"))).toBe("docs");
|
|
299
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/v1/docs"`'));
|
|
300
|
+
});
|
|
301
|
+
it("derives nothing when the stage is a token", () => {
|
|
302
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs", { customDomain: false })).toBeUndefined();
|
|
303
|
+
expect(warn).not.toHaveBeenCalled();
|
|
186
304
|
});
|
|
187
305
|
// The stripped prefix is part of what the app emits but never part of the
|
|
188
306
|
// resource path, so an app at the `prod` stage nested under "/base" sets
|
|
@@ -196,6 +314,56 @@ describe("resolveBasePath", () => {
|
|
|
196
314
|
// emit "/prod/..." while the resources live under "/prod/base/...".
|
|
197
315
|
expect(() => (0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, "/prod", "/prod/base")).toThrow(/nests every API Gateway resource under that path/);
|
|
198
316
|
});
|
|
317
|
+
// Any other leading prefix is served at `/prod/base/...` while the app
|
|
318
|
+
// links to `/foo/base/...`, so only the stripped prefix itself qualifies.
|
|
319
|
+
// Behind a custom domain synth can see, that is certain.
|
|
320
|
+
it("only accepts the stripped prefix in front of the prop", () => {
|
|
321
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/docs", "/app/docs", domain("app"))).toBe("docs");
|
|
322
|
+
expect(() => (0, base_path_1.resolveBasePath)(RF, "/docs", "/prod/docs", domain("app"))).toThrow(/nests every API Gateway resource under that path/);
|
|
323
|
+
// A custom domain mapped at the root strips nothing, so only equality works.
|
|
324
|
+
expect(() => (0, base_path_1.resolveBasePath)(RF, "/docs", "/v1/docs", domain())).toThrow(/nests every API Gateway resource under that path/);
|
|
325
|
+
});
|
|
326
|
+
// On the execute-api endpoint a domain attached later with
|
|
327
|
+
// `addDomainName({ basePath: "v1" })` can strip the leading part, and an
|
|
328
|
+
// explicit prop wins, so any other leading prefix warns instead.
|
|
329
|
+
it("warns on another leading prefix when only the stage is known", () => {
|
|
330
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/app", "/v1/app")).toBe("app");
|
|
331
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('addDomainName({ basePath: "v1" })'));
|
|
332
|
+
warn.mockClear();
|
|
333
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/base", "/prod/x/base")).toBe("base");
|
|
334
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('addDomainName({ basePath: "prod/x" })'));
|
|
335
|
+
});
|
|
336
|
+
it("falls back to a trailing segment when the stage is a token", () => {
|
|
337
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/base", "/foo/base", { customDomain: false })).toBe("base");
|
|
338
|
+
});
|
|
339
|
+
// Agreeing with the app is not enough when the value starts with the stage:
|
|
340
|
+
// resources under "prod" are only reached at "/prod/prod/...".
|
|
341
|
+
// Certain behind a custom domain synth can see; on the execute-api
|
|
342
|
+
// endpoint an `addDomainName()` domain mapped at the root makes it right,
|
|
343
|
+
// so there it only warns.
|
|
344
|
+
it("rejects a prop equal to an app basePath that starts with the stage", () => {
|
|
345
|
+
expect(() => (0, base_path_1.resolveBasePath)(RF, "/app", "/app", domain("app"))).toThrow(/strips "\/app"/);
|
|
346
|
+
expect(() => (0, base_path_1.resolveBasePath)(RF, "/app/base", "/app/base", domain("app"))).toThrow(/Leave the prop unset/);
|
|
347
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/prod", "/prod")).toBe("prod");
|
|
348
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('strips "/prod" before matching resources'));
|
|
349
|
+
warn.mockClear();
|
|
350
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/prod/base", "/prod/base")).toBe("prod/base");
|
|
351
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining("addDomainName()"));
|
|
352
|
+
});
|
|
353
|
+
it("accepts a matching prop and app basePath nothing strips", () => {
|
|
354
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/docs", "/docs", domain())).toBe("docs");
|
|
355
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/prod", "/prod", { customDomain: false })).toBe("prod");
|
|
356
|
+
expect(warn).not.toHaveBeenCalled();
|
|
357
|
+
});
|
|
358
|
+
// Matching the app is the unset case's problem again when a stage or
|
|
359
|
+
// mapping is stripped that the app's basePath lacks, so it warns the same.
|
|
360
|
+
it("warns when a matching prop and app basePath lack the stage", () => {
|
|
361
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/production", "/production")).toBe("production");
|
|
362
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/prod/production"`'));
|
|
363
|
+
warn.mockClear();
|
|
364
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/docs", "/docs", domain("v1"))).toBe("docs");
|
|
365
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/v1/docs"`'));
|
|
366
|
+
});
|
|
199
367
|
// The reverse is never right: the prop nests every resource, including the
|
|
200
368
|
// catch-all, under a path the app never links to.
|
|
201
369
|
it("rejects the prop setting a basePath the app doesn't", () => {
|
|
@@ -217,4 +385,4 @@ describe("resolveBasePath", () => {
|
|
|
217
385
|
});
|
|
218
386
|
});
|
|
219
387
|
});
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1wYXRoLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYmFzZS1wYXRoLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBNkQ7QUFDN0QscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQyw0Q0FBMEM7QUFDMUMsMkNBTXFCO0FBRXJCLE1BQU0sTUFBTSxHQUFHLENBQUMsc0JBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFM0UsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO1FBQ3JFLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIs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RUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZHRlbXBTeW5jLCBybVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgam9pblBhdGgsXG4gIG5vcm1hbGl6ZUJhc2VQYXRoLFxuICBwcmVmaXhXaXRoQmFzZVBhdGgsXG4gIHJlYWROZXh0Q29uZmlnQmFzZVBhdGgsXG4gIHJlc29sdmVCYXNlUGF0aCxcbn0gZnJvbSBcIi4vYmFzZS1wYXRoXCI7XG5cbmNvbnN0IEdMT0JBTCA9IFtOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMsIE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNdO1xuXG5kZXNjcmliZShcIm5vcm1hbGl6ZUJhc2VQYXRoXCIsICgpID0+IHtcbiAgaXQoXCJyZWR1Y2VzIHZhbHVlcyBhZGRyZXNzaW5nIHRoZSBzYW1lIHBhdGggdG8gdGhlIHNhbWUgc2VnbWVudFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcImJhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi9iYXNlL1wiKSkudG9CZShcImJhc2VcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiLy9iYXNlLy9cIikpLnRvQmUoXCJiYXNlXCIpO1xuICB9KTtcblxuICBpdChcIm1hcHMgdW5kZWZpbmVkIGFuZCBlbXB0eSB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nXCIsICgpID0+IHtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgodW5kZWZpbmVkKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCJcIikpLnRvQmUoXCJcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiL1wiKSkudG9CZShcIlwiKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyBpbnRlcmlvciBzbGFzaGVzIG9mIGEgbmVzdGVkIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvdGVhbS9hcHAvXCIpKS50b0JlKFwidGVhbS9hcHBcIik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiam9pblBhdGhcIiwgKCkgPT4ge1xuICBjb25zdCBvcmlnaW4gPSBcImh0dHBzOi8vZDExMTExMWFiY2RlZjguY2xvdWRmcm9udC5uZXRcIjtcblxuICBpdChcImRyb3BzIGVtcHR5IHBhcnRzXCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiXCIpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgdW5kZWZpbmVkKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiL1wiKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChcIlwiLCBcImJhc2VcIiwgdW5kZWZpbmVkLCBcIl9uZXh0L3N0YXRpY1wiKSkudG9CZShcbiAgICAgIFwiYmFzZS9fbmV4dC9zdGF0aWNcIixcbiAgICApO1xuICB9KTtcblxuICBpdChcImpvaW5zIHdpdGggZXhhY3RseSBvbmUgc2xhc2ggcmVnYXJkbGVzcyBvZiBlYWNoIHBhcnQncyBzbGFzaGVzXCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCBcIi9iYXNlXCIpKS50b0JlKGAke29yaWdpbn0vYmFzZWApO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiYmFzZS9cIikpLnRvQmUoYCR7b3JpZ2lufS9iYXNlYCk7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCIvdGVhbS9hcHAvXCIpKS50b0JlKGAke29yaWdpbn0vdGVhbS9hcHBgKTtcbiAgICBleHBlY3Qoam9pblBhdGgoXCIvYmFzZS9cIiwgXCIvX25leHQvc3RhdGljL3trZXl9XCIpKS50b0JlKFxuICAgICAgXCJiYXNlL19uZXh0L3N0YXRpYy97a2V5fVwiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiBldmVyeSBwYXJ0IGlzIGVtcHR5XCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgoKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qoam9pblBhdGgodW5kZWZpbmVkLCBcIlwiLCBcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIC8vIEhvdyBgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzLnVybGAgYXBwZW5kcyB0aGUgYXBwJ3MgYmFzZVBhdGg6IHRoZSBBTEJcbiAgLy8gZm9yd2FyZHMgZXZlcnkgcGF0aCB0byB0aGUgY29udGFpbmVyIHVuY2hhbmdlZCwgc28gdGhlIGFwcCBvbmx5IGFuc3dlcnNcbiAgLy8gdW5kZXIgaXRzIG93biBiYXNlUGF0aCBhbmQgdGhlIGJhcmUgQUxCIFVSTCB3b3VsZCA0MDQuXG4gIGl0KFwiYXBwZW5kcyBhbiBhcHAgYmFzZVBhdGggdG8gYSBiYXJlIEFMQiBvcmlnaW5cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGFsYiA9IFwiaHR0cDovL215LWFsYi0xMjMudXMtZWFzdC0xLmVsYi5hbWF6b25hd3MuY29tXCI7XG4gICAgZXhwZWN0KGpvaW5QYXRoKGFsYiwgXCJiYXNlXCIpKS50b0JlKGAke2FsYn0vYmFzZWApO1xuICAgIGV4cGVjdChqb2luUGF0aChhbGIsIFwidGVhbS9hcHBcIikpLnRvQmUoYCR7YWxifS90ZWFtL2FwcGApO1xuICAgIC8vIEFuIGFwcCB3aXRoIG5vIGJhc2VQYXRoIGlzIHNlcnZlZCBhdCB0aGUgb3JpZ2luIGl0c2VsZi5cbiAgICBleHBlY3Qoam9pblBhdGgoYWxiLCBcIlwiKSkudG9CZShhbGIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInByZWZpeFdpdGhCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIC8vIFRoZSBoZWFsdGggY2hlY2sgcGF0aCBpcyBoYW5kZWQgdG8gdGhpbmdzIHRoYXQgdGFsayB0byB0aGUgYXBwIGRpcmVjdGx5IChhblxuICAvLyBBTEIgdGFyZ2V0IGdyb3VwLCB0aGUgTGFtYmRhIFdlYiBBZGFwdGVyIHJlYWRpbmVzcyBjaGVjayksIGFuZCB0aGUgYXBwIG9ubHlcbiAgLy8gYW5zd2VycyB1bmRlciBpdHMgYmFzZVBhdGguIFVucHJlZml4ZWQsIGV2ZXJ5IGNoZWNrIDQwNHM6IHRoZSB0YXJnZXQgbmV2ZXJcbiAgLy8gdHVybnMgaGVhbHRoeSwgc28gdGFza3MgYXJlIGtpbGxlZCBvbiB0aGUgaGVhbHRoIGNoZWNrIGludGVydmFsIGFuZCB0aGVcbiAgLy8gZGVwbG95bWVudCByb2xscyBiYWNrLlxuICBpdChcInByZWZpeGVzIGEgaGVhbHRoIGNoZWNrIHBhdGggd2l0aCB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCJiYXNlXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYmFzZS9hcGkvaGVhbHRoXCIpO1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCIvYmFzZS9cIiwgXCIvYXBpL2hlYWx0aFwiKSkudG9CZShcbiAgICAgIFwiL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwibGVhdmVzIHRoZSBwYXRoIHVudG91Y2hlZCB3aGVuIHRoZSBhcHAgc2V0cyBubyBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZWZpeFdpdGhCYXNlUGF0aCh1bmRlZmluZWQsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiL1wiLCBcIi9hcGkvaGVhbHRoXCIpKS50b0JlKFwiL2FwaS9oZWFsdGhcIik7XG4gIH0pO1xuXG4gIGl0KFwiYWx3YXlzIHJldHVybnMgYSBsZWFkaW5nIHNsYXNoLCB3aGF0ZXZlciB0aGUgcGF0aCBjYW1lIHdpdGhcIiwgKCkgPT4ge1xuICAgIC8vIFRoZSBBTEIgaGVhbHRoIGNoZWNrIGFuZCB0aGUgcmVhZGluZXNzIGNoZWNrIFVSTCBib3RoIG5lZWQgYW4gYWJzb2x1dGVcbiAgICAvLyBwYXRoLCBzbyB0aGUgcmVzdWx0IGNhbid0IGNvbWUgYmFjayBiYXJlLiBXaXRob3V0IGEgYmFzZVBhdGggYSBiYXJlIHBhdGhcbiAgICAvLyB1c2VkIHRvIHBhc3Mgc3RyYWlnaHQgdGhyb3VnaCwgd2hpY2ggY29uY2F0ZW5hdGVkIGludG9cbiAgICAvLyBcImh0dHA6Ly8xMjcuMC4wLjE6MzAwMGFwaS9oZWFsdGhcIiBhcyB0aGUgcmVhZGluZXNzIGNoZWNrIFVSTC5cbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiYmFzZVwiLCBcImFwaS9oZWFsdGhcIikpLnRvQmUoXCIvYmFzZS9hcGkvaGVhbHRoXCIpO1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgodW5kZWZpbmVkLCBcImFwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiXCIsIFwiYXBpL2hlYWx0aFwiKSkudG9CZShcIi9hcGkvaGVhbHRoXCIpO1xuICB9KTtcblxuICAvLyBUaGUgcGF0aCBpcyB3aGF0IHRoZSBhcHAgcm91dGVzLCB3aXRob3V0IGJhc2VQYXRoLCBhbmQgaXQgaXMgcHJlZml4ZWRcbiAgLy8gd2hldGhlciBvciBub3QgaXQgYWxyZWFkeSBsb29rcyBwcmVmaXhlZDogYW4gYXBwIGNhbiByb3V0ZSBcIi9iYXNlL2Jhc2UvLi4uXCJcbiAgLy8gbGVnaXRpbWF0ZWx5LCBzbyB0cmVhdGluZyBhIGxlYWRpbmcgXCIvYmFzZVwiIGFzIGFscmVhZHktcHJlZml4ZWQgd291bGQgbWFrZVxuICAvLyB0aGF0IHBhdGggdW5yZWFjaGFibGUgYW5kIGdpdmUgdGhlIHByb3AgdHdvIG1lYW5pbmdzLiBVc2VycyB3aG8gcHJlZml4ZWRcbiAgLy8gYGhlYWx0aENoZWNrUGF0aGAgYnkgaGFuZCB0byB3b3JrIGFyb3VuZCB0aGUgbWlzc2luZyBwcmVmaXggZHJvcCBpdCBvblxuICAvLyB1cGdyYWRlIOKAlCBkb2N1bWVudGVkIGluIGRvY3MvYnJlYWtpbmctY2hhbmdlcy5tZCB1bmRlciAwLjYuMC5cbiAgaXQoXCJwcmVmaXhlcyBhIHBhdGggdGhhdCBhbHJlYWR5IGxvb2tzIHByZWZpeGVkXCIsICgpID0+IHtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiYmFzZVwiLCBcIi9iYXNlL2FwaS9oZWFsdGhcIikpLnRvQmUoXG4gICAgICBcIi9iYXNlL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xuXG4gIC8vIEEgYHRyYWlsaW5nU2xhc2g6IHRydWVgIGFwcCByZWRpcmVjdHMgXCIvYXBpL2hlYWx0aFwiIHRvIFwiL2FwaS9oZWFsdGgvXCIgd2l0aCBhXG4gIC8vIDMwOCwgd2hpY2ggYW4gQUxCIGhlYWx0aCBjaGVjayBkb2Vzbid0IGNvdW50IGFzIGhlYWx0aHksIHNvIHRoZSBzbGFzaCB0aGVcbiAgLy8gdXNlciB3cm90ZSBoYXMgdG8gc3Vydml2ZS5cbiAgaXQoXCJwcmVzZXJ2ZXMgYSB0cmFpbGluZyBzbGFzaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZWZpeFdpdGhCYXNlUGF0aChcImJhc2VcIiwgXCIvYXBpL2hlYWx0aC9cIikpLnRvQmUoXG4gICAgICBcIi9iYXNlL2FwaS9oZWFsdGgvXCIsXG4gICAgKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKHVuZGVmaW5lZCwgXCIvYXBpL2hlYWx0aC9cIikpLnRvQmUoXCIvYXBpL2hlYWx0aC9cIik7XG4gIH0pO1xuXG4gIGl0KFwiaGFuZGxlcyBhIG5lc3RlZCBiYXNlUGF0aCwgYXMgUkVHSU9OQUxfRlVOQ1RJT05TIGNhbiBwcm9kdWNlXCIsICgpID0+IHtcbiAgICAvLyBBbiBhcHAgYXQgdGhlIGBwcm9kYCBzdGFnZSBuZXN0ZWQgdW5kZXIgXCIvYmFzZVwiIHNldHMgYGJhc2VQYXRoOlxuICAgIC8vIFwiL3Byb2QvYmFzZVwiYCwgYW5kIHRoZSByZWFkaW5lc3MgY2hlY2sgaGl0cyB0aGUgbG9jYWwgc2VydmVyLCBzbyB0aGVcbiAgICAvLyB3aG9sZSBwcmVmaXggaGFzIHRvIGJlIHRoZXJlLlxuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCIvcHJvZC9iYXNlXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXG4gICAgICBcIi9wcm9kL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwicmVhZE5leHRDb25maWdCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIGxldCBkb3ROZXh0UGF0aDogc3RyaW5nO1xuICBsZXQgd2FybjogamVzdC5TcHlJbnN0YW5jZTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkb3ROZXh0UGF0aCA9IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFwiYmFzZS1wYXRoLVwiKSk7XG4gICAgd2FybiA9IGplc3Quc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgd2Fybi5tb2NrUmVzdG9yZSgpO1xuICAgIHJtU3luYyhkb3ROZXh0UGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcblxuICBmdW5jdGlvbiB3cml0ZVJlcXVpcmVkU2VydmVyRmlsZXMoY29udGVudHM6IHN0cmluZykge1xuICAgIHdyaXRlRmlsZVN5bmMoam9pbihkb3ROZXh0UGF0aCwgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiKSwgY29udGVudHMpO1xuICB9XG5cbiAgaXQoXCJyZWFkcyB0aGUgYXBwJ3MgYmFzZVBhdGggYW5kIHN0cmlwcyB0aGUgbGVhZGluZyBzbGFzaFwiLCAoKSA9PiB7XG4gICAgd3JpdGVSZXF1aXJlZFNlcnZlckZpbGVzKEpTT04uc3RyaW5naWZ5KHsgY29uZmlnOiB7IGJhc2VQYXRoOiBcIi9wcm9kXCIgfSB9KSk7XG5cbiAgICBleHBlY3QocmVhZE5leHRDb25maWdCYXNlUGF0aChkb3ROZXh0UGF0aCkpLnRvQmUoXCJwcm9kXCIpO1xuICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdChcInJldHVybnMgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGFwcCBzZXRzIG5vIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAvLyBgbmV4dCBidWlsZGAgd3JpdGVzIGJhc2VQYXRoOiBcIlwiIHJhdGhlciB0aGFuIG9taXR0aW5nIGl0LlxuICAgIHdyaXRlUmVxdWlyZWRTZXJ2ZXJGaWxlcyhKU09OLnN0cmluZ2lmeSh7IGNvbmZpZzogeyBiYXNlUGF0aDogXCJcIiB9IH0pKTtcblxuICAgIGV4cGVjdChyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoKGRvdE5leHRQYXRoKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qod2Fybikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgLy8gRGVncmFkaW5nIHRvIFwiXCIgaXMgZGVsaWJlcmF0ZSwgYnV0IGl0J3MgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBhcHAgdGhhdFxuICAvLyBzZXRzIG5vIGJhc2VQYXRoLCBzbyBpdCBoYXMgdG8gYmUgdmlzaWJsZTogdGhlIEdsb2JhbCBjb25zdHJ1Y3RzIGRlcml2ZVxuICAvLyB0aGVpciBiYXNlUGF0aCBmcm9tIHRoaXMgdmFsdWUgYW5kIHdvdWxkIG90aGVyd2lzZSA0MDQgZXZlcnkgc3RhdGljIGFzc2V0XG4gIC8vIHdpdGggbm90aGluZyBidXQgYSBzaWxlbnQgZmFsbGJhY2sgdG8gZXhwbGFpbiBpdC5cbiAgaXQoXCJ3YXJucyB3aGVuIHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uIGlzIG1pc3NpbmdcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoKGRvdE5leHRQYXRoKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qod2FybikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcInJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uXCIpLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwid2FybnMgd2hlbiB0aGUgZmlsZSBpc24ndCB2YWxpZCBKU09OXCIsICgpID0+IHtcbiAgICB3cml0ZVJlcXVpcmVkU2VydmVyRmlsZXMoXCJub3QganNvblwiKTtcblxuICAgIGV4cGVjdChyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoKGRvdE5leHRQYXRoKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qod2FybikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIkNvdWxkIG5vdCByZWFkIGJhc2VQYXRoXCIpLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgZmlsZSBoYXMgbm8gY29uZmlnIGtleVwiLCAoKSA9PiB7XG4gICAgd3JpdGVSZXF1aXJlZFNlcnZlckZpbGVzKEpTT04uc3RyaW5naWZ5KHsgZmlsZXM6IFtdIH0pKTtcblxuICAgIGV4cGVjdChyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoKGRvdE5leHRQYXRoKSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJyZXNvbHZlQmFzZVBhdGhcIiwgKCkgPT4ge1xuICBkZXNjcmliZS5lYWNoKE9iamVjdC52YWx1ZXMoTmV4dGpzVHlwZSkpKFwiJXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICBpdChcInJlc29sdmVzIHRvIHVuZGVmaW5lZCB3aGVuIGJvdGggYXJlIHVuc2V0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJcIiwgXCJcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIC8vIE5vcm1hbGl6ZXMgdG8gZW1wdHksIHNvIGl0J3MgdGhlIHNhbWUgYXMgdW5zZXQgcmF0aGVyIHRoYW4gYSBwcmVmaXguXG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gT25lIHNoYXBlIG91dCwgd2hhdGV2ZXIgc2hhcGUgY2FtZSBpbjogY29uc3VtZXJzIHRoYXQgbmVlZCBhIGxlYWRpbmdcbiAgICAvLyBzbGFzaCAob25seSBgTmV4dGpzRGlzdHJpYnV0aW9uYCdzIHBhdGggcGF0dGVybnMpIGFkZCB0aGVpciBvd24sIHNvXG4gICAgLy8gbm90aGluZyBkb3duc3RyZWFtIGhhcyB0byByZS1ub3JtYWxpemUuXG4gICAgaXQoXCJub3JtYWxpemVzIHRoZSBwcm9wIHdoZW4gaXQgbWF0Y2hlcyB0aGUgYXBwXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYmFzZVwiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJiYXNlXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9iYXNlL1wiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJiYXNlLy9cIiwgXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlLmVhY2goR0xPQkFMKShcIiVzXCIsIChuZXh0anNUeXBlKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCB1c2VzIHRoZSByZXF1ZXN0IHBhdGggdmVyYmF0aW0gYXMgdGhlIFMzIG9iamVjdCBrZXksIHNvIHRoZVxuICAgIC8vIHByb3AgaGFzIHRvIGJlIHRoZSBwcmVmaXggdGhlIGFwcCBlbWl0cyDigJQgdGhlcmUncyBleGFjdGx5IG9uZSB2YWxpZCB2YWx1ZSxcbiAgICAvLyB3aGljaCBtYWtlcyB0aGUgYXBwJ3MgY29uZmlnIHRoZSBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgaXQoXCJkZXJpdmVzIHRoZSBwcm9wIGZyb20gdGhlIGFwcCdzIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJcIiwgXCJiYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi90ZWFtL2FwcC9cIikpLnRvQmUoXG4gICAgICAgIFwidGVhbS9hcHBcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInJlamVjdHMgdGhlIHByb3Agc2V0dGluZyBhIGJhc2VQYXRoIHRoZSBhcHAgZG9lc24ndFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2Jhc2VcIikpLnRvVGhyb3coXG4gICAgICAgIC9DbG91ZEZyb250IHNlcnZlcyBzdGF0aWMgYXNzZXRzIHN0cmFpZ2h0IGZyb20gUzMvLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVqZWN0cyB0d28gZGlmZmVyZW50IHZhbHVlc1wiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2FcIiwgXCIvYlwiKSkudG9UaHJvdyhcbiAgICAgICAgJ3Byb3AgaXMgXCIvYVwiIGJ1dCB5b3VyIE5leHQuanMgYXBwXFwncyBjb25maWcgc2V0cyBgYmFzZVBhdGhgIHRvIFwiL2JcIicsXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgKCkgPT4ge1xuICAgIC8vIEFQSSBHYXRld2F5IHN0cmlwcyB0aGUgc3RhZ2UgYmVmb3JlIG1hdGNoaW5nIHJlc291cmNlcywgc28gYW4gYXBwIHNlcnZlZFxuICAgIC8vIGF0IHRoZSBkZWZhdWx0IGBwcm9kYCBzdGFnZSBzZXRzIGJhc2VQYXRoOiBcIi9wcm9kXCIgYW5kIGxlYXZlcyB0aGUgcHJvcFxuICAgIC8vIHVuc2V0LiBTYW1lIHNoYXBlIGFzIGEgY3VzdG9tIGRvbWFpbiBiYXNlIHBhdGggbWFwcGluZy4gRGVyaXZpbmcgaGVyZVxuICAgIC8vIHdvdWxkIG5lc3QgZXZlcnkgcmVzb3VyY2UgdW5kZXIgYSBwYXRoIHRoZSBzdGFnZSBhbHJlYWR5IGNvbnN1bWVkLlxuICAgIGl0KFwiZG9lcyBub3QgZGVyaXZlIHRoZSBhcHAncyBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgdW5kZWZpbmVkLCBcIi9wcm9kXCIpLFxuICAgICAgKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc3RyaXBwZWQgcHJlZml4IGlzIHBhcnQgb2Ygd2hhdCB0aGUgYXBwIGVtaXRzIGJ1dCBuZXZlciBwYXJ0IG9mIHRoZVxuICAgIC8vIHJlc291cmNlIHBhdGgsIHNvIGFuIGFwcCBhdCB0aGUgYHByb2RgIHN0YWdlIG5lc3RlZCB1bmRlciBcIi9iYXNlXCIgc2V0c1xuICAgIC8vIGJhc2VQYXRoOiBcIi9wcm9kL2Jhc2VcIiBhbmQgdGhlIHByb3AgdG8gXCIvYmFzZVwiLlxuICAgIGl0KFwiYWNjZXB0cyBhbiBhcHAgYmFzZVBhdGggdGhhdCBlbmRzIHdpdGggdGhlIHByb3BcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2Jhc2VcIiwgXCIvcHJvZC9iYXNlXCIpLFxuICAgICAgKS50b0JlKFwiYmFzZVwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwib25seSBhY2NlcHRzIHRoZSBwcm9wIGFzIGEgd2hvbGUgdHJhaWxpbmcgcGF0aCBzZWdtZW50XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL3NlXCIsIFwiL3Byb2QvYmFzZVwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgICAvLyBMZWFkaW5nLCBub3QgdHJhaWxpbmc6IEFQSSBHYXRld2F5IHN0cmlwcyB0aGUgc3RhZ2UsIHNvIHRoZSBhcHAgd291bGRcbiAgICAgIC8vIGVtaXQgXCIvcHJvZC8uLi5cIiB3aGlsZSB0aGUgcmVzb3VyY2VzIGxpdmUgdW5kZXIgXCIvcHJvZC9iYXNlLy4uLlwiLlxuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgXCIvcHJvZFwiLCBcIi9wcm9kL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHJldmVyc2UgaXMgbmV2ZXIgcmlnaHQ6IHRoZSBwcm9wIG5lc3RzIGV2ZXJ5IHJlc291cmNlLCBpbmNsdWRpbmcgdGhlXG4gICAgLy8gY2F0Y2gtYWxsLCB1bmRlciBhIHBhdGggdGhlIGFwcCBuZXZlciBsaW5rcyB0by5cbiAgICBpdChcInJlamVjdHMgdGhlIHByb3Agc2V0dGluZyBhIGJhc2VQYXRoIHRoZSBhcHAgZG9lc24ndFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9iYXNlXCIpLFxuICAgICAgKS50b1Rocm93KC9uZXN0cyBldmVyeSBBUEkgR2F0ZXdheSByZXNvdXJjZSB1bmRlciB0aGF0IHBhdGgvKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVqZWN0cyB0d28gZGlmZmVyZW50IHZhbHVlc1wiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9hXCIsIFwiL2JcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlMsICgpID0+IHtcbiAgICAvLyBiYXNlUGF0aCBvbmx5IG5hbWVzcGFjZXMgdGhlIFMzIGJ1Y2tldCBoZXJlOiB0aGUgQUxCIGZvcndhcmRzIGV2ZXJ5IHBhdGhcbiAgICAvLyB0byB0aGUgY29udGFpbmVyLCB3aGljaCBzZXJ2ZXMgaXRzIG93biBzdGF0aWMgYXNzZXRzLiBTbyBhbnkgY29tYmluYXRpb25cbiAgICAvLyBpcyB2YWxpZCwgYW5kIHRoZSBhcHAncyBiYXNlUGF0aCBpcyBuZXZlciBkZXJpdmVkIGludG8gdGhlIGJ1Y2tldCBwcmVmaXguXG4gICAgaXQoXCJhY2NlcHRzIGFueSBjb21iaW5hdGlvbiwgYWx3YXlzIGtlZXBpbmcgdGhlIHByb3BcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbmV4dGpzVHlwZSA9IE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUztcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYVwiLCBcIi9iXCIpKS50b0JlKFwiYVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYVwiKSkudG9CZShcImFcIik7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIHVuZGVmaW5lZCwgXCIvYlwiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1wYXRoLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYmFzZS1wYXRoLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0Q0FBMEM7QUFDMUMsMkNBVXFCO0FBRXJCLE1BQU0sTUFBTSxHQUFHLENBQUMsc0JBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFM0UsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO1FBQ3JFLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFF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QUFDLHNCQUFVLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQ3hELENBQUMsT0FBTyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FDVixJQUFBLDJCQUFlLEVBQUMsc0JBQVUsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQzNELENBQUMsT0FBTyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxzQkFBVSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUM1QywyRUFBMkU7UUFDM0UsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSxFQUFFLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1lBQzFELE1BQU0sVUFBVSxHQUFHLHNCQUFVLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsTUFBTSxDQUFDLElBQUEsMkJBQWUsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELE1BQU0sQ0FBQyxJQUFBLDJCQUFlLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxJQUFBLDJCQUFlLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBhc3NldFByZWZpeFBhdGgsXG4gIGJhc2VQYXRoUHJlZml4LFxuICBpc0Fzc2V0UHJlZml4VW5zZXJ2ZWQsXG4gIGpvaW5QYXRoLFxuICBub3JtYWxpemVCYXNlUGF0aCxcbiAgcHJlZml4V2l0aEJhc2VQYXRoLFxuICByZWxhdGl2ZUFzc2V0UHJlZml4LFxuICByZXNvbHZlQmFzZVBhdGgsXG4gIHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMsXG59IGZyb20gXCIuL2Jhc2UtcGF0aFwiO1xuXG5jb25zdCBHTE9CQUwgPSBbTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TLCBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTXTtcblxuZGVzY3JpYmUoXCJub3JtYWxpemVCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIGl0KFwicmVkdWNlcyB2YWx1ZXMgYWRkcmVzc2luZyB0aGUgc2FtZSBwYXRoIHRvIHRoZSBzYW1lIHNlZ21lbnRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCJiYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvYmFzZS9cIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi8vYmFzZS8vXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgfSk7XG5cbiAgaXQoXCJtYXBzIHVuZGVmaW5lZCBhbmQgZW1wdHkgdmFsdWVzIHRvIGFuIGVtcHR5IHN0cmluZ1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKHVuZGVmaW5lZCkpLnRvQmUoXCJcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiXCIpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgaW50ZXJpb3Igc2xhc2hlcyBvZiBhIG5lc3RlZCBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiL3RlYW0vYXBwL1wiKSkudG9CZShcInRlYW0vYXBwXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIndob2xlQXBwSW52YWxpZGF0aW9uUGF0aHNcIiwgKCkgPT4ge1xuICBpdChcImlzIHRoZSB3aG9sZSBkaXN0cmlidXRpb24gd2l0aG91dCBhIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICBleHBlY3Qod2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocygpKS50b0VxdWFsKFtcIi8qXCJdKTtcbiAgICBleHBlY3Qod2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyhcIlwiKSkudG9FcXVhbChbXCIvKlwiXSk7XG4gIH0pO1xuXG4gIGl0KFwiY292ZXJzIHRoZSBhcHAncyByb290IGFuZCBSU0MgcGF5bG9hZCwgYnV0IG5vIHNpYmxpbmcgcHJlZml4XCIsICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGJhc2VQYXRoIG9mIFtcIi9iYXNlXCIsIFwiYmFzZVwiLCBcIi9iYXNlL1wiXSkge1xuICAgICAgZXhwZWN0KHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMoYmFzZVBhdGgpKS50b0VxdWFsKFtcbiAgICAgICAgXCIvYmFzZVwiLFxuICAgICAgICBcIi9iYXNlPypcIixcbiAgICAgICAgXCIvYmFzZS8qXCIsXG4gICAgICBdKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiam9pblBhdGhcIiwgKCkgPT4ge1xuICBjb25zdCBvcmlnaW4gPSBcImh0dHBzOi8vZDExMTExMWFiY2RlZjguY2xvdWRmcm9udC5uZXRcIjtcblxuICBpdChcImRyb3BzIGVtcHR5IHBhcnRzXCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiXCIpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgdW5kZWZpbmVkKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiL1wiKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChcIlwiLCBcImJhc2VcIiwgdW5kZWZpbmVkLCBcIl9uZXh0L3N0YXRpY1wiKSkudG9CZShcbiAgICAgIFwiYmFzZS9fbmV4dC9zdGF0aWNcIixcbiAgICApO1xuICB9KTtcblxuICBpdChcImpvaW5zIHdpdGggZXhhY3RseSBvbmUgc2xhc2ggcmVnYXJkbGVzcyBvZiBlYWNoIHBhcnQncyBzbGFzaGVzXCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCBcIi9iYXNlXCIpKS50b0JlKGAke29yaWdpbn0vYmFzZWApO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiYmFzZS9cIikpLnRvQmUoYCR7b3JpZ2lufS9iYXNlYCk7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCIvdGVhbS9hcHAvXCIpKS50b0JlKGAke29yaWdpbn0vdGVhbS9hcHBgKTtcbiAgICBleHBlY3Qoam9pblBhdGgoXCIvYmFzZS9cIiwgXCIvX25leHQvc3RhdGljL3trZXl9XCIpKS50b0JlKFxuICAgICAgXCJiYXNlL19uZXh0L3N0YXRpYy97a2V5fVwiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiBldmVyeSBwYXJ0IGlzIGVtcHR5XCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgoKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qoam9pblBhdGgodW5kZWZpbmVkLCBcIlwiLCBcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIC8vIEhvdyBgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzLnVybGAgYXBwZW5kcyB0aGUgYXBwJ3MgYmFzZVBhdGg6IHRoZSBBTEJcbiAgLy8gZm9yd2FyZHMgZXZlcnkgcGF0aCB0byB0aGUgY29udGFpbmVyIHVuY2hhbmdlZCwgc28gdGhlIGFwcCBvbmx5IGFuc3dlcnNcbiAgLy8gdW5kZXIgaXRzIG93biBiYXNlUGF0aCBhbmQgdGhlIGJhcmUgQUxCIFVSTCB3b3VsZCA0MDQuXG4gIGl0KFwiYXBwZW5kcyBhbiBhcHAgYmFzZVBhdGggdG8gYSBiYXJlIEFMQiBvcmlnaW5cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGFsYiA9IFwiaHR0cDovL215LWFsYi0xMjMudXMtZWFzdC0xLmVsYi5hbWF6b25hd3MuY29tXCI7XG4gICAgZXhwZWN0KGpvaW5QYXRoKGFsYiwgXCJiYXNlXCIpKS50b0JlKGAke2FsYn0vYmFzZWApO1xuICAgIGV4cGVjdChqb2luUGF0aChhbGIsIFwidGVhbS9hcHBcIikpLnRvQmUoYCR7YWxifS90ZWFtL2FwcGApO1xuICAgIC8vIEFuIGFwcCB3aXRoIG5vIGJhc2VQYXRoIGlzIHNlcnZlZCBhdCB0aGUgb3JpZ2luIGl0c2VsZi5cbiAgICBleHBlY3Qoam9pblBhdGgoYWxiLCBcIlwiKSkudG9CZShhbGIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInByZWZpeFdpdGhCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIC8vIFRoZSBoZWFsdGggY2hlY2sgcGF0aCBpcyBoYW5kZWQgdG8gdGhpbmdzIHRoYXQgdGFsayB0byB0aGUgYXBwIGRpcmVjdGx5IChhblxuICAvLyBBTEIgdGFyZ2V0IGdyb3VwLCB0aGUgY29udGFpbmVyJ3Mgb3duIGhlYWx0aCBwcm9iZSksIGFuZCB0aGUgYXBwIG9ubHlcbiAgLy8gYW5zd2VycyB1bmRlciBpdHMgYmFzZVBhdGguIFVucHJlZml4ZWQsIGV2ZXJ5IGNoZWNrIDQwNHM6IHRoZSB0YXJnZXQgbmV2ZXJcbiAgLy8gdHVybnMgaGVhbHRoeSwgc28gdGFza3MgYXJlIGtpbGxlZCBvbiB0aGUgaGVhbHRoIGNoZWNrIGludGVydmFsIGFuZCB0aGVcbiAgLy8gZGVwbG95bWVudCByb2xscyBiYWNrLlxuICBpdChcInByZWZpeGVzIGEgaGVhbHRoIGNoZWNrIHBhdGggd2l0aCB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCJiYXNlXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYmFzZS9hcGkvaGVhbHRoXCIpO1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCIvYmFzZS9cIiwgXCIvYXBpL2hlYWx0aFwiKSkudG9CZShcbiAgICAgIFwiL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwibGVhdmVzIHRoZSBwYXRoIHVudG91Y2hlZCB3aGVuIHRoZSBhcHAgc2V0cyBubyBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZWZpeFdpdGhCYXNlUGF0aCh1bmRlZmluZWQsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiL1wiLCBcIi9hcGkvaGVhbHRoXCIpKS50b0JlKFwiL2FwaS9oZWFsdGhcIik7XG4gIH0pO1xuXG4gIGl0KFwiYWx3YXlzIHJldHVybnMgYSBsZWFkaW5nIHNsYXNoLCB3aGF0ZXZlciB0aGUgcGF0aCBjYW1lIHdpdGhcIiwgKCkgPT4ge1xuICAgIC8vIFRoZSBBTEIgaGVhbHRoIGNoZWNrIGFuZCB0aGUgcmVhZGluZXNzIGNoZWNrIFVSTCBib3RoIG5lZWQgYW4gYWJzb2x1dGVcbiAgICAvLyBwYXRoLCBzbyB0aGUgcmVzdWx0IGNhbid0IGNvbWUgYmFjayBiYXJlLiBXaXRob3V0IGEgYmFzZVBhdGggYSBiYXJlIHBhdGhcbiAgICAvLyB1c2VkIHRvIHBhc3Mgc3RyYWlnaHQgdGhyb3VnaCwgd2hpY2ggY29uY2F0ZW5hdGVkIGludG9cbiAgICAvLyBcImh0dHA6Ly8xMjcuMC4wLjE6MzAwMGFwaS9oZWFsdGhcIiBhcyB0aGUgcmVhZGluZXNzIGNoZWNrIFVSTC5cbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiYmFzZVwiLCBcImFwaS9oZWFsdGhcIikpLnRvQmUoXCIvYmFzZS9hcGkvaGVhbHRoXCIpO1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgodW5kZWZpbmVkLCBcImFwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiXCIsIFwiYXBpL2hlYWx0aFwiKSkudG9CZShcIi9hcGkvaGVhbHRoXCIpO1xuICB9KTtcblxuICAvLyBUaGUgcGF0aCBpcyB3aGF0IHRoZSBhcHAgcm91dGVzLCB3aXRob3V0IGJhc2VQYXRoLCBhbmQgaXQgaXMgcHJlZml4ZWRcbiAgLy8gd2hldGhlciBvciBub3QgaXQgYWxyZWFkeSBsb29rcyBwcmVmaXhlZDogYW4gYXBwIGNhbiByb3V0ZSBcIi9iYXNlL2Jhc2UvLi4uXCJcbiAgLy8gbGVnaXRpbWF0ZWx5LCBzbyB0cmVhdGluZyBhIGxlYWRpbmcgXCIvYmFzZVwiIGFzIGFscmVhZHktcHJlZml4ZWQgd291bGQgbWFrZVxuICAvLyB0aGF0IHBhdGggdW5yZWFjaGFibGUgYW5kIGdpdmUgdGhlIHByb3AgdHdvIG1lYW5pbmdzLiBVc2VycyB3aG8gcHJlZml4ZWRcbiAgLy8gYGhlYWx0aENoZWNrUGF0aGAgYnkgaGFuZCB0byB3b3JrIGFyb3VuZCB0aGUgbWlzc2luZyBwcmVmaXggZHJvcCBpdCBvblxuICAvLyB1cGdyYWRlIOKAlCBkb2N1bWVudGVkIGluIGRvY3MvYnJlYWtpbmctY2hhbmdlcy5tZCB1bmRlciAwLjYuMC5cbiAgaXQoXCJwcmVmaXhlcyBhIHBhdGggdGhhdCBhbHJlYWR5IGxvb2tzIHByZWZpeGVkXCIsICgpID0+IHtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiYmFzZVwiLCBcIi9iYXNlL2FwaS9oZWFsdGhcIikpLnRvQmUoXG4gICAgICBcIi9iYXNlL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xuXG4gIC8vIEEgYHRyYWlsaW5nU2xhc2g6IHRydWVgIGFwcCByZWRpcmVjdHMgXCIvYXBpL2hlYWx0aFwiIHRvIFwiL2FwaS9oZWFsdGgvXCIgd2l0aCBhXG4gIC8vIDMwOCwgd2hpY2ggYW4gQUxCIGhlYWx0aCBjaGVjayBkb2Vzbid0IGNvdW50IGFzIGhlYWx0aHksIHNvIHRoZSBzbGFzaCB0aGVcbiAgLy8gdXNlciB3cm90ZSBoYXMgdG8gc3Vydml2ZS5cbiAgaXQoXCJwcmVzZXJ2ZXMgYSB0cmFpbGluZyBzbGFzaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZWZpeFdpdGhCYXNlUGF0aChcImJhc2VcIiwgXCIvYXBpL2hlYWx0aC9cIikpLnRvQmUoXG4gICAgICBcIi9iYXNlL2FwaS9oZWFsdGgvXCIsXG4gICAgKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKHVuZGVmaW5lZCwgXCIvYXBpL2hlYWx0aC9cIikpLnRvQmUoXCIvYXBpL2hlYWx0aC9cIik7XG4gIH0pO1xuXG4gIGl0KFwiaGFuZGxlcyBhIG5lc3RlZCBiYXNlUGF0aCwgYXMgUkVHSU9OQUxfRlVOQ1RJT05TIGNhbiBwcm9kdWNlXCIsICgpID0+IHtcbiAgICAvLyBBbiBhcHAgYXQgdGhlIGBwcm9kYCBzdGFnZSBuZXN0ZWQgdW5kZXIgXCIvYmFzZVwiIHNldHMgYGJhc2VQYXRoOlxuICAgIC8vIFwiL3Byb2QvYmFzZVwiYCwgYW5kIHRoZSByZWFkaW5lc3MgY2hlY2sgaGl0cyB0aGUgbG9jYWwgc2VydmVyLCBzbyB0aGVcbiAgICAvLyB3aG9sZSBwcmVmaXggaGFzIHRvIGJlIHRoZXJlLlxuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCIvcHJvZC9iYXNlXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXG4gICAgICBcIi9wcm9kL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiYmFzZVBhdGhQcmVmaXhcIiwgKCkgPT4ge1xuICBpdChcInNwZWxscyBldmVyeSBiYXNlUGF0aCB0aGUgd2F5IE5leHQuanMgZG9lc1wiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBbXCIvYmFzZVwiLCBcImJhc2VcIiwgXCIvYmFzZS9cIiwgXCIvL2Jhc2UvL1wiXSkge1xuICAgICAgZXhwZWN0KGJhc2VQYXRoUHJlZml4KHZhbHVlKSkudG9CZShcIi9iYXNlXCIpO1xuICAgIH1cbiAgICBleHBlY3QoYmFzZVBhdGhQcmVmaXgoXCIvYS9iL1wiKSkudG9CZShcIi9hL2JcIik7XG4gICAgZXhwZWN0KGJhc2VQYXRoUHJlZml4KFwiL1wiKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3QoYmFzZVBhdGhQcmVmaXgodW5kZWZpbmVkKSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJyZWxhdGl2ZUFzc2V0UHJlZml4XCIsICgpID0+IHtcbiAgaXQoXCJyZWFkcyBhIHBhdGgtc3R5bGUgYXNzZXRQcmVmaXggd2l0aCBvbmUgbGVhZGluZyBzbGFzaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbGF0aXZlQXNzZXRQcmVmaXgoXCIvY3VzdG9tLWFzc2V0LXByZWZpeFwiKSkudG9CZShcbiAgICAgIFwiL2N1c3RvbS1hc3NldC1wcmVmaXhcIixcbiAgICApO1xuICAgIGV4cGVjdChyZWxhdGl2ZUFzc2V0UHJlZml4KFwiY3VzdG9tLWFzc2V0LXByZWZpeC9cIikpLnRvQmUoXG4gICAgICBcIi9jdXN0b20tYXNzZXQtcHJlZml4XCIsXG4gICAgKTtcbiAgICBleHBlY3QocmVsYXRpdmVBc3NldFByZWZpeChcIlwiKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3QocmVsYXRpdmVBc3NldFByZWZpeChcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIGl0KFwiaWdub3JlcyBhbiBhYnNvbHV0ZSBhc3NldFByZWZpeFwiLCAoKSA9PiB7XG4gICAgLy8gSXQgbmFtZXMgYW4gb3JpZ2luIGNkay1uZXh0anMgZG9lcyBub3Qgc2VydmUsIHNvIHRoZXJlIGlzIG5vIGJlaGF2aW9yIHRvXG4gICAgLy8gYWRkIGFuZCBub3RoaW5nIHRoZSBkaXN0cmlidXRpb24gY291bGQgZ2V0IHdyb25nLlxuICAgIGZvciAoY29uc3QgYXNzZXRQcmVmaXggb2YgW1xuICAgICAgXCJodHRwczovL2Nkbi5leGFtcGxlLmNvbVwiLFxuICAgICAgXCJodHRwOi8vY2RuLmV4YW1wbGUuY29tL3hcIixcbiAgICAgIFwiLy9jZG4uZXhhbXBsZS5jb21cIixcbiAgICBdKSB7XG4gICAgICBleHBlY3QocmVsYXRpdmVBc3NldFByZWZpeChhc3NldFByZWZpeCkpLnRvQmUoXCJcIik7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImFzc2V0UHJlZml4UGF0aFwiLCAoKSA9PiB7XG4gIGl0KFwicmVwb3J0cyB0aGUgcGF0aCBhbiBhYnNvbHV0ZSBhc3NldFByZWZpeCBjYXJyaWVzIHRvb1wiLCAoKSA9PiB7XG4gICAgLy8gYHJlbGF0aXZlQXNzZXRQcmVmaXhgIGFuc3dlcnMgXCJpcyB0aGlzIGEgcHJlZml4IHRoZSByZWdpb25hbCBOZXh0anNUeXBlc1xuICAgIC8vIGNhbm5vdCBzZXJ2ZVwiOyB0aGlzIGFuc3dlcnMgXCJ3aGF0IHBhdGggZG8gYnVuZGxlIFVSTHMgY2FycnlcIiwgYW5kIGFuXG4gICAgLy8gYWJzb2x1dGUgcHJlZml4IHdpdGggYSBwYXRoIGNhcnJpZXMgb25lIOKAlCBgbmV4dCBidWlsZGAgY29tcGlsZXMgYVxuICAgIC8vIHJld3JpdGUgZm9yIGl0LCBzbyBgbmV4dCBzdGFydGAgc2VydmVzIGJ1bmRsZXMgdGhlcmUuIFNlZVxuICAgIC8vIGB0ZXN0L2UyZS9hcHAtZGlyL2Fzc2V0LXByZWZpeC1hYnNvbHV0ZWAuXG4gICAgZm9yIChjb25zdCBbYXNzZXRQcmVmaXgsIHBhdGhdIG9mIFtcbiAgICAgIFtcImh0dHBzOi8vZXhhbXBsZS52ZXJjZWwuc2gvY3VzdG9tLWFzc2V0LXByZWZpeFwiLCBcIi9jdXN0b20tYXNzZXQtcHJlZml4XCJdLFxuICAgICAgW1wiLy9leGFtcGxlLnZlcmNlbC5zaC9jZG4vXCIsIFwiL2NkblwiXSxcbiAgICAgIFtcImh0dHBzOi8vZXhhbXBsZS52ZXJjZWwuc2gvXCIsIFwiXCJdLFxuICAgICAgW1wiaHR0cHM6Ly9leGFtcGxlLnZlcmNlbC5zaFwiLCBcIlwiXSxcbiAgICAgIFtcIi9jZG5cIiwgXCIvY2RuXCJdLFxuICAgICAgW1wiXCIsIFwiXCJdLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGV4cGVjdChhc3NldFByZWZpeFBhdGgoYXNzZXRQcmVmaXgpKS50b0JlKHBhdGgpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJpc0Fzc2V0UHJlZml4VW5zZXJ2ZWRcIiwgKCkgPT4ge1xuICBjb25zdCBSRUdJT05BTCA9IFtcbiAgICBOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUyxcbiAgICBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlMsXG4gIF07XG5cbiAgaXQuZWFjaChSRUdJT05BTCkoXG4gICAgXCIlczogZG9lcyBub3QgZmxhZyB0aGUgYXNzZXRQcmVmaXggTmV4dC5qcyBkZXJpdmVzIGZyb20gYmFzZVBhdGhcIixcbiAgICAobmV4dGpzVHlwZSkgPT4ge1xuICAgICAgLy8gVGhlIHJlZ3Jlc3Npb24gdGhpcyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGZvci4gQW4gYXBwIHRoYXQgc2V0cyBvbmx5XG4gICAgICAvLyBgYmFzZVBhdGg6IFwiL3Byb2RcImAg4oCUIGBleGFtcGxlcy9yZWdpb25hbC1mdW5jdGlvbnNgLCBhbmQgZXZlcnkgcmVnaW9uYWxcbiAgICAgIC8vIGRlcGxveW1lbnQgd2l0aCBhIGJhc2VQYXRoIOKAlCBnZXRzXG4gICAgICAvLyBge1wiYXNzZXRQcmVmaXhcIjpcIi9wcm9kXCIsXCJiYXNlUGF0aFwiOlwiL3Byb2RcIn1gIGluXG4gICAgICAvLyBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gLCBiZWNhdXNlIE5leHQuanMgcmVzb2x2ZXMgb25lIGZyb20gdGhlIG90aGVyLlxuICAgICAgLy8gRmxhZ2dpbmcgdGhhdCB0b2xkIHVzZXJzIHRoZWlyIGJ1bmRsZXMgd291bGQgNDA0IGF0IHRoZSBvbmUgcGF0aCB0aGF0IGRvZXNcbiAgICAgIC8vIHNlcnZlIHRoZW0sIG9uIGV2ZXJ5IHN5bnRoLlxuICAgICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9wcm9kXCIsIFwicHJvZFwiKSkudG9CZShmYWxzZSk7XG4gICAgICAvLyBCb3RoIHNpZGVzIGFycml2ZSBpbiBkaWZmZXJlbnQgc2hhcGVzIOKAlCB0aGUgYXNzZXRQcmVmaXggcmVhZGVyIGFkZHMgYVxuICAgICAgLy8gbGVhZGluZyBzbGFzaCwgdGhlIGJhc2VQYXRoIHJlYWRlciBzdHJpcHMgb25lIOKAlCBzbyB0aGUgY29tcGFyaXNvbiBoYXMgdG9cbiAgICAgIC8vIG5vcm1hbGl6ZSByYXRoZXIgdGhhbiBjb21wYXJlIHN0cmluZ3MuXG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiL3Byb2RcIiwgXCIvcHJvZC9cIikpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9hL2JcIiwgXCJhL2JcIikpLnRvQmUoZmFsc2UpO1xuICAgIH0sXG4gICk7XG5cbiAgaXQuZWFjaChSRUdJT05BTCkoXCIlczogZmxhZ3MgYSBwcmVmaXggbm90aGluZyBzZXJ2ZXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICAvLyBBIGdlbnVpbmVseSBkaWZmZXJlbnQgcHJlZml4IGlzIHRoZSBjYXNlIHRoZSB3YXJuaW5nIGV4aXN0cyBmb3I6IGJ1bmRsZXMgYXJlXG4gICAgLy8gcmVxdWVzdGVkIGF0IGAvY2RuL19uZXh0L3N0YXRpYy8uLi5gIGFuZCBuZWl0aGVyIEFQSSBHYXRld2F5J3NcbiAgICAvLyBgX25leHQvc3RhdGljYCByZXNvdXJjZSBub3IgdGhlIGNvbnRhaW5lcidzIG93biBmaWxlcyBhbnN3ZXIgdGhlcmUuXG4gICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9jZG5cIiwgXCJwcm9kXCIpKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChpc0Fzc2V0UHJlZml4VW5zZXJ2ZWQobmV4dGpzVHlwZSwgXCIvY2RuXCIsIHVuZGVmaW5lZCkpLnRvQmUodHJ1ZSk7XG4gICAgLy8gQSBwcmVmaXggKnVuZGVyKiB0aGUgYmFzZVBhdGggaXMgc3RpbGwgYSBkaWZmZXJlbnQgcGF0aCwgbm90IGEgbWF0Y2guXG4gICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9wcm9kL2NkblwiLCBcInByb2RcIikpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0LmVhY2goR0xPQkFMKShcbiAgICBcIiVzOiBmbGFncyBub3RoaW5nLCBoYXZpbmcgYSBiZWhhdmlvciBmb3IgaXRcIixcbiAgICAobmV4dGpzVHlwZSkgPT4ge1xuICAgICAgLy8gYE5leHRqc0Rpc3RyaWJ1dGlvbmAgYWRkcyBhIGNhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJlZml4LCBzbyBvbiB0aGVzZSB0eXBlc1xuICAgICAgLy8gYW55IHByZWZpeCBpcyBzZXJ2ZWQuXG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiL2NkblwiLCBcInByb2RcIikpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9jZG5cIiwgdW5kZWZpbmVkKSkudG9CZShmYWxzZSk7XG4gICAgfSxcbiAgKTtcblxuICBpdC5lYWNoKE9iamVjdC52YWx1ZXMoTmV4dGpzVHlwZSkpKFxuICAgIFwiJXM6IGZsYWdzIG5vdGhpbmcgd2hlbiB0aGVyZSBpcyBubyBwcmVmaXhcIixcbiAgICAobmV4dGpzVHlwZSkgPT4ge1xuICAgICAgLy8gYHJlbGF0aXZlQXNzZXRQcmVmaXhgIGFscmVhZHkgcmVkdWNlcyBhbiBhYnNvbHV0ZSBwcmVmaXggdG8gYFwiXCJgLFxuICAgICAgLy8gd2hpY2ggaXMgdGhlIHN1cHBvcnRlZCB3YXkgdG8gc2VydmUgYXNzZXRzIGZyb20gYW5vdGhlciBvcmlnaW4uXG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiXCIsIFwicHJvZFwiKSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiXCIsIHVuZGVmaW5lZCkpLnRvQmUoZmFsc2UpO1xuICAgIH0sXG4gICk7XG59KTtcblxuZGVzY3JpYmUoXCJyZXNvbHZlQmFzZVBhdGhcIiwgKCkgPT4ge1xuICBkZXNjcmliZS5lYWNoKE9iamVjdC52YWx1ZXMoTmV4dGpzVHlwZSkpKFwiJXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICBpdChcInJlc29sdmVzIHRvIHVuZGVmaW5lZCB3aGVuIGJvdGggYXJlIHVuc2V0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJcIiwgXCJcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIC8vIE5vcm1hbGl6ZXMgdG8gZW1wdHksIHNvIGl0J3MgdGhlIHNhbWUgYXMgdW5zZXQgcmF0aGVyIHRoYW4gYSBwcmVmaXguXG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gT25lIHNoYXBlIG91dCwgd2hhdGV2ZXIgc2hhcGUgY2FtZSBpbjogY29uc3VtZXJzIHRoYXQgbmVlZCBhIGxlYWRpbmdcbiAgICAvLyBzbGFzaCAob25seSBgTmV4dGpzRGlzdHJpYnV0aW9uYCdzIHBhdGggcGF0dGVybnMpIGFkZCB0aGVpciBvd24sIHNvXG4gICAgLy8gbm90aGluZyBkb3duc3RyZWFtIGhhcyB0byByZS1ub3JtYWxpemUuXG4gICAgaXQoXCJub3JtYWxpemVzIHRoZSBwcm9wIHdoZW4gaXQgbWF0Y2hlcyB0aGUgYXBwXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYmFzZVwiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJiYXNlXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9iYXNlL1wiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJiYXNlLy9cIiwgXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlLmVhY2goR0xPQkFMKShcIiVzXCIsIChuZXh0anNUeXBlKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCB1c2VzIHRoZSByZXF1ZXN0IHBhdGggdmVyYmF0aW0gYXMgdGhlIFMzIG9iamVjdCBrZXksIHNvIHRoZVxuICAgIC8vIHByb3AgaGFzIHRvIGJlIHRoZSBwcmVmaXggdGhlIGFwcCBlbWl0cyDigJQgdGhlcmUncyBleGFjdGx5IG9uZSB2YWxpZCB2YWx1ZSxcbiAgICAvLyB3aGljaCBtYWtlcyB0aGUgYXBwJ3MgY29uZmlnIHRoZSBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgaXQoXCJkZXJpdmVzIHRoZSBwcm9wIGZyb20gdGhlIGFwcCdzIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJcIiwgXCJiYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi90ZWFtL2FwcC9cIikpLnRvQmUoXG4gICAgICAgIFwidGVhbS9hcHBcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInJlamVjdHMgdGhlIHByb3Agc2V0dGluZyBhIGJhc2VQYXRoIHRoZSBhcHAgZG9lc24ndFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2Jhc2VcIikpLnRvVGhyb3coXG4gICAgICAgIC9DbG91ZEZyb250IHNlcnZlcyBzdGF0aWMgYXNzZXRzIHN0cmFpZ2h0IGZyb20gUzMvLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVqZWN0cyB0d28gZGlmZmVyZW50IHZhbHVlc1wiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2FcIiwgXCIvYlwiKSkudG9UaHJvdyhcbiAgICAgICAgJ3Byb3AgaXMgXCIvYVwiIGJ1dCB5b3VyIE5leHQuanMgYXBwXFwncyBjb25maWcgc2V0cyBgYmFzZVBhdGhgIHRvIFwiL2JcIicsXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgKCkgPT4ge1xuICAgIGNvbnN0IFJGID0gTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlM7XG4gICAgY29uc3Qgc3RhZ2UgPSAobmFtZTogc3RyaW5nKSA9PiAoe1xuICAgICAgc3RyaXBwZWRQcmVmaXg6IG5hbWUsXG4gICAgICBjdXN0b21Eb21haW46IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGRvbWFpbiA9IChtYXBwaW5nID0gXCJcIikgPT4gKHtcbiAgICAgIHN0cmlwcGVkUHJlZml4OiBtYXBwaW5nLFxuICAgICAgY3VzdG9tRG9tYWluOiB0cnVlLFxuICAgIH0pO1xuICAgIGxldCB3YXJuOiBqZXN0LlNweUluc3RhbmNlO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgd2FybiA9IGplc3Quc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG4gICAgfSk7XG4gICAgYWZ0ZXJFYWNoKCgpID0+IHdhcm4ubW9ja1Jlc3RvcmUoKSk7XG5cbiAgICAvLyBBUEkgR2F0ZXdheSBzdHJpcHMgdGhlIHN0YWdlIGJlZm9yZSBtYXRjaGluZyByZXNvdXJjZXMsIHNvIGFuIGFwcCBzZXJ2ZWRcbiAgICAvLyBhdCB0aGUgZGVmYXVsdCBgcHJvZGAgc3RhZ2Ugc2V0cyBiYXNlUGF0aDogXCIvcHJvZFwiIGFuZCBpdHMgcmVzb3VyY2VzIGxpdmVcbiAgICAvLyBhdCB0aGUgcm9vdC4gTW91bnRpbmcgdGhlbSB1bmRlciBcInByb2RcIiB3b3VsZCBuZXN0IGV2ZXJ5IHJlc291cmNlIHVuZGVyIGFcbiAgICAvLyBwYXRoIHRoZSBzdGFnZSBhbHJlYWR5IGNvbnN1bWVkLlxuICAgIC8vIEEgZG9tYWluIGF0dGFjaGVkIHdpdGggYGFkZERvbWFpbk5hbWUoeyBiYXNlUGF0aDogXCJ2MVwiIH0pYCBzdHJpcHMgXCIvdjFcIlxuICAgIC8vIHdoZXJlIHN5bnRoIGNhbid0IHNlZSBpdDsgXCIvXCIgaXMgaG93IHRoZSB1c2VyIHNheXMgc28uIERlcml2aW5nIHdvdWxkXG4gICAgLy8gbW91bnQgZXZlcnl0aGluZyB1bmRlciBcInYxXCIsIHdoaWNoIHRoZSBzdHJpcHBlZCByZXF1ZXN0cyBuZXZlciByZWFjaC5cbiAgICBpdCgnbW91bnRzIGF0IHRoZSByb290IHdoZW4gdGhlIHByb3AgaXMgXCIvXCIsIGluc3RlYWQgb2YgZGVyaXZpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9cIiwgXCIvdjFcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL1wiLCBcIi92MVwiLCBkb21haW4oKSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL1wiLCBcIi9wcm9kL2Jhc2VcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIC8vIFVuc2V0IHN0aWxsIGRlcml2ZXMuXG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL3YxXCIpKS50b0JlKFwidjFcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIm1vdW50cyBhbiBhcHAgd2hvc2UgYmFzZVBhdGggaXMgdGhlIHN0YWdlIGF0IHRoZSByb290XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvcHJvZFwiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvdGVzdFwiLCBzdGFnZShcInRlc3RcIikpLFxuICAgICAgKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3Qod2Fybikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwibW91bnRzIHRoZSByZXN0IG9mIGEgYmFzZVBhdGggbmVzdGVkIGJlbG93IHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL3Byb2QvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL3YyL2EvYlwiLCBzdGFnZShcInYyXCIpKSkudG9CZShcbiAgICAgICAgXCJhL2JcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgY2FzZSB0aGF0IHVzZWQgdG8gNDA0IGV2ZXJ5IGJ1bmRsZTogYSBjdXN0b20gZG9tYWluIG1hcHBlZCBhdCB0aGUgcm9vdFxuICAgIC8vIHN0cmlwcyBub3RoaW5nLCBzbyB0aGUgYXBwJ3MgYmFzZVBhdGggaXMgYSByZWFsIHJlc291cmNlIHBhdGgsIGFuZCBsZWZ0IGF0XG4gICAgLy8gdGhlIHJvb3QgYF9uZXh0L3N0YXRpY2AgZmVsbCB0aHJvdWdoIHRvIHRoZSBMYW1iZGEgY2F0Y2gtYWxsLlxuICAgIGl0KFwibW91bnRzIGFuIGFwcCB1bmRlciBpdHMgd2hvbGUgYmFzZVBhdGggd2hlbiBub3RoaW5nIHN0cmlwcyBpdFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2RvY3NcIiwgZG9tYWluKCkpKS50b0JlKFwiZG9jc1wiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdHJpcHMgYSBjdXN0b20gZG9tYWluJ3MgYmFzZSBwYXRoIG1hcHBpbmcgbGlrZSBhIHN0YWdlXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2FwcFwiLCBkb21haW4oXCJhcHBcIikpLFxuICAgICAgKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2FwcC9kb2NzXCIsIGRvbWFpbihcImFwcFwiKSkpLnRvQmUoXG4gICAgICAgIFwiZG9jc1wiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwibWF0Y2hlcyB0aGUgc3RhZ2Ugb24gYSBzZWdtZW50IGJvdW5kYXJ5XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvcHJvZHVjdGlvblwiLCBkb21haW4oKSkpLnRvQmUoXG4gICAgICAgIFwicHJvZHVjdGlvblwiLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvcHJvZHVjdGlvblwiLCBzdGFnZShcInByb2RcIikpKS50b0JlKFxuICAgICAgICBcInByb2R1Y3Rpb25cIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXRob3V0IGEgY3VzdG9tIGRvbWFpbiB0aGUgYXBwJ3Mgb3duIGxpbmtzIG1pc3MgdGhlIHN0YWdlLCB3aGljaCBzeW50aFxuICAgIC8vIGNhbiBzYXkgYnV0IG5vdCBmaXggLSBhIGRvbWFpbiBhdHRhY2hlZCB3aXRoIGBhZGREb21haW5OYW1lYCBpcyBpbnZpc2libGUuXG4gICAgaXQoXCJ3YXJucyB3aGVuIGFuIGV4ZWN1dGUtYXBpIGFwcCdzIGJhc2VQYXRoIGxhY2tzIHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2RvY3NcIikpLnRvQmUoXCJkb2NzXCIpO1xuICAgICAgZXhwZWN0KHdhcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnU2V0IGBiYXNlUGF0aDogXCIvcHJvZC9kb2NzXCJgJyksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ3YXJucyB3aGVuIGEgY3VzdG9tIGRvbWFpbidzIGJhc2UgcGF0aCBtYXBwaW5nIGlzIG1pc3NpbmcgZnJvbSB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChSRiwgdW5kZWZpbmVkLCBcIi9kb2NzXCIsIGRvbWFpbihcInYxXCIpKSkudG9CZShcbiAgICAgICAgXCJkb2NzXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KHdhcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnU2V0IGBiYXNlUGF0aDogXCIvdjEvZG9jc1wiYCcpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZGVyaXZlcyBub3RoaW5nIHdoZW4gdGhlIHN0YWdlIGlzIGEgdG9rZW5cIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvZG9jc1wiLCB7IGN1c3RvbURvbWFpbjogZmFsc2UgfSksXG4gICAgICApLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHN0cmlwcGVkIHByZWZpeCBpcyBwYXJ0IG9mIHdoYXQgdGhlIGFwcCBlbWl0cyBidXQgbmV2ZXIgcGFydCBvZiB0aGVcbiAgICAvLyByZXNvdXJjZSBwYXRoLCBzbyBhbiBhcHAgYXQgdGhlIGBwcm9kYCBzdGFnZSBuZXN0ZWQgdW5kZXIgXCIvYmFzZVwiIHNldHNcbiAgICAvLyBiYXNlUGF0aDogXCIvcHJvZC9iYXNlXCIgYW5kIHRoZSBwcm9wIHRvIFwiL2Jhc2VcIi5cbiAgICBpdChcImFjY2VwdHMgYW4gYXBwIGJhc2VQYXRoIHRoYXQgZW5kcyB3aXRoIHRoZSBwcm9wXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9iYXNlXCIsIFwiL3Byb2QvYmFzZVwiKSxcbiAgICAgICkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIm9ubHkgYWNjZXB0cyB0aGUgcHJvcCBhcyBhIHdob2xlIHRyYWlsaW5nIHBhdGggc2VnbWVudFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9zZVwiLCBcIi9wcm9kL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgICAgLy8gTGVhZGluZywgbm90IHRyYWlsaW5nOiBBUEkgR2F0ZXdheSBzdHJpcHMgdGhlIHN0YWdlLCBzbyB0aGUgYXBwIHdvdWxkXG4gICAgICAvLyBlbWl0IFwiL3Byb2QvLi4uXCIgd2hpbGUgdGhlIHJlc291cmNlcyBsaXZlIHVuZGVyIFwiL3Byb2QvYmFzZS8uLi5cIi5cbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL3Byb2RcIiwgXCIvcHJvZC9iYXNlXCIpLFxuICAgICAgKS50b1Rocm93KC9uZXN0cyBldmVyeSBBUEkgR2F0ZXdheSByZXNvdXJjZSB1bmRlciB0aGF0IHBhdGgvKTtcbiAgICB9KTtcblxuICAgIC8vIEFueSBvdGhlciBsZWFkaW5nIHByZWZpeCBpcyBzZXJ2ZWQgYXQgYC9wcm9kL2Jhc2UvLi4uYCB3aGlsZSB0aGUgYXBwXG4gICAgLy8gbGlua3MgdG8gYC9mb28vYmFzZS8uLi5gLCBzbyBvbmx5IHRoZSBzdHJpcHBlZCBwcmVmaXggaXRzZWxmIHF1YWxpZmllcy5cbiAgICAvLyBCZWhpbmQgYSBjdXN0b20gZG9tYWluIHN5bnRoIGNhbiBzZWUsIHRoYXQgaXMgY2VydGFpbi5cbiAgICBpdChcIm9ubHkgYWNjZXB0cyB0aGUgc3RyaXBwZWQgcHJlZml4IGluIGZyb250IG9mIHRoZSBwcm9wXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL2RvY3NcIiwgXCIvYXBwL2RvY3NcIiwgZG9tYWluKFwiYXBwXCIpKSkudG9CZShcbiAgICAgICAgXCJkb2NzXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChSRiwgXCIvZG9jc1wiLCBcIi9wcm9kL2RvY3NcIiwgZG9tYWluKFwiYXBwXCIpKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgICAvLyBBIGN1c3RvbSBkb21haW4gbWFwcGVkIGF0IHRoZSByb290IHN0cmlwcyBub3RoaW5nLCBzbyBvbmx5IGVxdWFsaXR5IHdvcmtzLlxuICAgICAgZXhwZWN0KCgpID0+IHJlc29sdmVCYXNlUGF0aChSRiwgXCIvZG9jc1wiLCBcIi92MS9kb2NzXCIsIGRvbWFpbigpKSkudG9UaHJvdyhcbiAgICAgICAgL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gT24gdGhlIGV4ZWN1dGUtYXBpIGVuZHBvaW50IGEgZG9tYWluIGF0dGFjaGVkIGxhdGVyIHdpdGhcbiAgICAvLyBgYWRkRG9tYWluTmFtZSh7IGJhc2VQYXRoOiBcInYxXCIgfSlgIGNhbiBzdHJpcCB0aGUgbGVhZGluZyBwYXJ0LCBhbmQgYW5cbiAgICAvLyBleHBsaWNpdCBwcm9wIHdpbnMsIHNvIGFueSBvdGhlciBsZWFkaW5nIHByZWZpeCB3YXJucyBpbnN0ZWFkLlxuICAgIGl0KFwid2FybnMgb24gYW5vdGhlciBsZWFkaW5nIHByZWZpeCB3aGVuIG9ubHkgdGhlIHN0YWdlIGlzIGtub3duXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL2FwcFwiLCBcIi92MS9hcHBcIikpLnRvQmUoXCJhcHBcIik7XG4gICAgICBleHBlY3Qod2FybikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdhZGREb21haW5OYW1lKHsgYmFzZVBhdGg6IFwidjFcIiB9KScpLFxuICAgICAgKTtcbiAgICAgIHdhcm4ubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9iYXNlXCIsIFwiL3Byb2QveC9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ2FkZERvbWFpbk5hbWUoeyBiYXNlUGF0aDogXCJwcm9kL3hcIiB9KScpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmFsbHMgYmFjayB0byBhIHRyYWlsaW5nIHNlZ21lbnQgd2hlbiB0aGUgc3RhZ2UgaXMgYSB0b2tlblwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChSRiwgXCIvYmFzZVwiLCBcIi9mb28vYmFzZVwiLCB7IGN1c3RvbURvbWFpbjogZmFsc2UgfSksXG4gICAgICApLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgLy8gQWdyZWVpbmcgd2l0aCB0aGUgYXBwIGlzIG5vdCBlbm91Z2ggd2hlbiB0aGUgdmFsdWUgc3RhcnRzIHdpdGggdGhlIHN0YWdlOlxuICAgIC8vIHJlc291cmNlcyB1bmRlciBcInByb2RcIiBhcmUgb25seSByZWFjaGVkIGF0IFwiL3Byb2QvcHJvZC8uLi5cIi5cbiAgICAvLyBDZXJ0YWluIGJlaGluZCBhIGN1c3RvbSBkb21haW4gc3ludGggY2FuIHNlZTsgb24gdGhlIGV4ZWN1dGUtYXBpXG4gICAgLy8gZW5kcG9pbnQgYW4gYGFkZERvbWFpbk5hbWUoKWAgZG9tYWluIG1hcHBlZCBhdCB0aGUgcm9vdCBtYWtlcyBpdCByaWdodCxcbiAgICAvLyBzbyB0aGVyZSBpdCBvbmx5IHdhcm5zLlxuICAgIGl0KFwicmVqZWN0cyBhIHByb3AgZXF1YWwgdG8gYW4gYXBwIGJhc2VQYXRoIHRoYXQgc3RhcnRzIHdpdGggdGhlIHN0YWdlXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZXNvbHZlQmFzZVBhdGgoUkYsIFwiL2FwcFwiLCBcIi9hcHBcIiwgZG9tYWluKFwiYXBwXCIpKSkudG9UaHJvdyhcbiAgICAgICAgL3N0cmlwcyBcIlxcL2FwcFwiLyxcbiAgICAgICk7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9hcHAvYmFzZVwiLCBcIi9hcHAvYmFzZVwiLCBkb21haW4oXCJhcHBcIikpLFxuICAgICAgKS50b1Rocm93KC9MZWF2ZSB0aGUgcHJvcCB1bnNldC8pO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChSRiwgXCIvcHJvZFwiLCBcIi9wcm9kXCIpKS50b0JlKFwicHJvZFwiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ3N0cmlwcyBcIi9wcm9kXCIgYmVmb3JlIG1hdGNoaW5nIHJlc291cmNlcycpLFxuICAgICAgKTtcbiAgICAgIHdhcm4ubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9wcm9kL2Jhc2VcIiwgXCIvcHJvZC9iYXNlXCIpKS50b0JlKFwicHJvZC9iYXNlXCIpO1xuICAgICAgZXhwZWN0KHdhcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcImFkZERvbWFpbk5hbWUoKVwiKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImFjY2VwdHMgYSBtYXRjaGluZyBwcm9wIGFuZCBhcHAgYmFzZVBhdGggbm90aGluZyBzdHJpcHNcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChSRiwgXCIvZG9jc1wiLCBcIi9kb2NzXCIsIGRvbWFpbigpKSkudG9CZShcImRvY3NcIik7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChSRiwgXCIvcHJvZFwiLCBcIi9wcm9kXCIsIHsgY3VzdG9tRG9tYWluOiBmYWxzZSB9KSxcbiAgICAgICkudG9CZShcInByb2RcIik7XG4gICAgICBleHBlY3Qod2Fybikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIC8vIE1hdGNoaW5nIHRoZSBhcHAgaXMgdGhlIHVuc2V0IGNhc2UncyBwcm9ibGVtIGFnYWluIHdoZW4gYSBzdGFnZSBvclxuICAgIC8vIG1hcHBpbmcgaXMgc3RyaXBwZWQgdGhhdCB0aGUgYXBwJ3MgYmFzZVBhdGggbGFja3MsIHNvIGl0IHdhcm5zIHRoZSBzYW1lLlxuICAgIGl0KFwid2FybnMgd2hlbiBhIG1hdGNoaW5nIHByb3AgYW5kIGFwcCBiYXNlUGF0aCBsYWNrIHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9wcm9kdWN0aW9uXCIsIFwiL3Byb2R1Y3Rpb25cIikpLnRvQmUoXG4gICAgICAgIFwicHJvZHVjdGlvblwiLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1NldCBgYmFzZVBhdGg6IFwiL3Byb2QvcHJvZHVjdGlvblwiYCcpLFxuICAgICAgKTtcbiAgICAgIHdhcm4ubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9kb2NzXCIsIFwiL2RvY3NcIiwgZG9tYWluKFwidjFcIikpKS50b0JlKFwiZG9jc1wiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1NldCBgYmFzZVBhdGg6IFwiL3YxL2RvY3NcImAnKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmV2ZXJzZSBpcyBuZXZlciByaWdodDogdGhlIHByb3AgbmVzdHMgZXZlcnkgcmVzb3VyY2UsIGluY2x1ZGluZyB0aGVcbiAgICAvLyBjYXRjaC1hbGwsIHVuZGVyIGEgcGF0aCB0aGUgYXBwIG5ldmVyIGxpbmtzIHRvLlxuICAgIGl0KFwicmVqZWN0cyB0aGUgcHJvcCBzZXR0aW5nIGEgYmFzZVBhdGggdGhlIGFwcCBkb2Vzbid0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIHR3byBkaWZmZXJlbnQgdmFsdWVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2FcIiwgXCIvYlwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUywgKCkgPT4ge1xuICAgIC8vIGJhc2VQYXRoIG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0IGhlcmU6IHRoZSBBTEIgZm9yd2FyZHMgZXZlcnkgcGF0aFxuICAgIC8vIHRvIHRoZSBjb250YWluZXIsIHdoaWNoIHNlcnZlcyBpdHMgb3duIHN0YXRpYyBhc3NldHMuIFNvIGFueSBjb21iaW5hdGlvblxuICAgIC8vIGlzIHZhbGlkLCBhbmQgdGhlIGFwcCdzIGJhc2VQYXRoIGlzIG5ldmVyIGRlcml2ZWQgaW50byB0aGUgYnVja2V0IHByZWZpeC5cbiAgICBpdChcImFjY2VwdHMgYW55IGNvbWJpbmF0aW9uLCBhbHdheXMga2VlcGluZyB0aGUgcHJvcFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXh0anNUeXBlID0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIsIFwiL2JcIikpLnRvQmUoXCJhXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIpKS50b0JlKFwiYVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { Architecture } from "aws-cdk-lib/aws-lambda";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* The Lambda's architecture and the Sharp binaries bundled into its asset must
|
|
7
|
-
* come from this one value: deriving them separately lets them disagree on a
|
|
8
|
-
* host that is neither x64 nor arm (e.g. s390x), which produces a Lambda that
|
|
9
|
-
* fails to load its own bindings.
|
|
3
|
+
* The host's architecture as a Lambda one: the Functions types' default, so
|
|
4
|
+
* any native dependency `next build` traced from this machine runs as built.
|
|
10
5
|
*/
|
|
11
|
-
export declare function getNodeArchitecture(): string;
|
|
12
6
|
export declare function getLambdaArchitecture(): Architecture;
|
|
7
|
+
/**
|
|
8
|
+
* `architecture` spelled the way Sharp's `@img/sharp-<platform>-<arch>`
|
|
9
|
+
* packages spell it.
|
|
10
|
+
*/
|
|
11
|
+
export declare function toNodeArchitecture(architecture: Architecture): string;
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getNodeArchitecture = getNodeArchitecture;
|
|
4
3
|
exports.getLambdaArchitecture = getLambdaArchitecture;
|
|
4
|
+
exports.toNodeArchitecture = toNodeArchitecture;
|
|
5
5
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* The Lambda's architecture and the Sharp binaries bundled into its asset must
|
|
11
|
-
* come from this one value: deriving them separately lets them disagree on a
|
|
12
|
-
* host that is neither x64 nor arm (e.g. s390x), which produces a Lambda that
|
|
13
|
-
* fails to load its own bindings.
|
|
7
|
+
* The host's architecture as a Lambda one: the Functions types' default, so
|
|
8
|
+
* any native dependency `next build` traced from this machine runs as built.
|
|
14
9
|
*/
|
|
15
|
-
function getNodeArchitecture() {
|
|
16
|
-
return process.arch.startsWith("arm") ? "arm64" : "x64";
|
|
17
|
-
}
|
|
18
10
|
function getLambdaArchitecture() {
|
|
19
|
-
return
|
|
11
|
+
return process.arch.startsWith("arm")
|
|
20
12
|
? aws_lambda_1.Architecture.ARM_64
|
|
21
13
|
: aws_lambda_1.Architecture.X86_64;
|
|
22
14
|
}
|
|
23
|
-
|
|
15
|
+
/**
|
|
16
|
+
* `architecture` spelled the way Sharp's `@img/sharp-<platform>-<arch>`
|
|
17
|
+
* packages spell it.
|
|
18
|
+
*/
|
|
19
|
+
function toNodeArchitecture(architecture) {
|
|
20
|
+
return architecture.name === aws_lambda_1.Architecture.ARM_64.name ? "arm64" : "x64";
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFyY2hpdGVjdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9nZXQtYXJjaGl0ZWN0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsc0RBSUM7QUFNRCxnREFFQztBQWxCRCx1REFBc0Q7QUFFdEQ7OztHQUdHO0FBQ0gsU0FBZ0IscUJBQXFCO0lBQ25DLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ25DLENBQUMsQ0FBQyx5QkFBWSxDQUFDLE1BQU07UUFDckIsQ0FBQyxDQUFDLHlCQUFZLENBQUMsTUFBTSxDQUFDO0FBQzFCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxZQUEwQjtJQUMzRCxPQUFPLFlBQVksQ0FBQyxJQUFJLEtBQUsseUJBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMxRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJjaGl0ZWN0dXJlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcblxuLyoqXG4gKiBUaGUgaG9zdCdzIGFyY2hpdGVjdHVyZSBhcyBhIExhbWJkYSBvbmU6IHRoZSBGdW5jdGlvbnMgdHlwZXMnIGRlZmF1bHQsIHNvXG4gKiBhbnkgbmF0aXZlIGRlcGVuZGVuY3kgYG5leHQgYnVpbGRgIHRyYWNlZCBmcm9tIHRoaXMgbWFjaGluZSBydW5zIGFzIGJ1aWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFtYmRhQXJjaGl0ZWN0dXJlKCk6IEFyY2hpdGVjdHVyZSB7XG4gIHJldHVybiBwcm9jZXNzLmFyY2guc3RhcnRzV2l0aChcImFybVwiKVxuICAgID8gQXJjaGl0ZWN0dXJlLkFSTV82NFxuICAgIDogQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbn1cblxuLyoqXG4gKiBgYXJjaGl0ZWN0dXJlYCBzcGVsbGVkIHRoZSB3YXkgU2hhcnAncyBgQGltZy9zaGFycC08cGxhdGZvcm0+LTxhcmNoPmBcbiAqIHBhY2thZ2VzIHNwZWxsIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Ob2RlQXJjaGl0ZWN0dXJlKGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyY2hpdGVjdHVyZS5uYW1lID09PSBBcmNoaXRlY3R1cmUuQVJNXzY0Lm5hbWUgPyBcImFybTY0XCIgOiBcIng2NFwiO1xufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function crc32(data: Buffer): number;
|
|
2
|
+
/**
|
|
3
|
+
* Zip `dir` with its symlinks stored *as* symlinks, which Lambda extracts as
|
|
4
|
+
* such. `Code.fromAsset(dir)` can't be used for a deployment root because
|
|
5
|
+
* `cdk-assets` dereferences them when it zips, and under pnpm that
|
|
6
|
+
* materializes a store package at its logical path while the siblings it
|
|
7
|
+
* resolves its own dependencies through stay behind in the store. Preserved,
|
|
8
|
+
* the links resolve the way they do in the workspace, and the way they do in
|
|
9
|
+
* a Containers image (`COPY` preserves them too).
|
|
10
|
+
*
|
|
11
|
+
* Deterministic — entries sorted, timestamps fixed, modes normalized — so the
|
|
12
|
+
* asset hash only changes when the contents do.
|
|
13
|
+
*/
|
|
14
|
+
export declare function zipDirectory(dir: string): Buffer;
|