cdk-nextjs 0.6.0 → 0.6.2
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 +117 -45
- package/.jsii.tabl.json +1 -1
- package/API.md +66 -1
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +10 -7
- package/docs/breaking-changes.md +23 -3
- package/docs/development-guide.md +6 -4
- package/lib/adapter/adapter.mjs +1 -1
- package/lib/adapter/cache-handler.mjs +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +5 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +7 -0
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
- package/lib/image-optimization/handler.mjs +1 -1
- package/lib/lambdas/post-deploy/post-deploy.lambda.js +3 -2
- package/lib/lambdas/post-deploy/prune-s3.d.ts +9 -2
- package/lib/lambdas/post-deploy/prune-s3.js +17 -7
- package/lib/lambdas/post-deploy/prune-s3.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-s3.test.js +176 -0
- package/lib/nextjs-api.d.ts +5 -0
- package/lib/nextjs-api.js +13 -3
- package/lib/nextjs-api.test.js +46 -1
- package/lib/nextjs-build/nextjs-build.js +1 -1
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-compute/nextjs-image-function.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.d.ts +12 -0
- package/lib/nextjs-post-deploy.js +3 -2
- package/lib/nextjs-static-assets.d.ts +6 -0
- package/lib/nextjs-static-assets.js +9 -3
- package/lib/nextjs-static-assets.test.js +20 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +16 -0
- package/lib/root-constructs/nextjs-base-construct.js +21 -3
- package/lib/root-constructs/nextjs-global-containers.js +3 -2
- package/lib/root-constructs/nextjs-global-functions.js +3 -2
- package/lib/root-constructs/nextjs-regional-containers.d.ts +7 -0
- package/lib/root-constructs/nextjs-regional-containers.js +12 -3
- package/lib/root-constructs/nextjs-regional-functions.js +3 -2
- package/lib/utils/base-path.d.ts +19 -0
- package/lib/utils/base-path.js +25 -1
- package/lib/utils/base-path.test.js +58 -1
- package/package.json +1 -1
|
@@ -25,7 +25,7 @@ const handler = async (event, context) => {
|
|
|
25
25
|
try {
|
|
26
26
|
const props = event.ResourceProperties;
|
|
27
27
|
if (event.RequestType === "Create" || event.RequestType === "Update") {
|
|
28
|
-
const { buildId, cacheBucketName, createInvalidationCommandInput, msTtl, revalidationTableName, staticAssetsBucketName, } = props;
|
|
28
|
+
const { buildId, cacheBucketName, createInvalidationCommandInput, msTtl, revalidationTableName, staticAssetsBucketName, staticAssetsKeyPrefix, } = props;
|
|
29
29
|
const promises = [];
|
|
30
30
|
if (createInvalidationCommandInput) {
|
|
31
31
|
promises.push((0, create_invalidation_1.createInvalidation)(createInvalidationCommandInput));
|
|
@@ -48,6 +48,7 @@ const handler = async (event, context) => {
|
|
|
48
48
|
bucketName: staticAssetsBucketName,
|
|
49
49
|
currentBuildId: buildId,
|
|
50
50
|
msTtl: parseInt(msTtl),
|
|
51
|
+
keyPrefix: staticAssetsKeyPrefix,
|
|
51
52
|
}));
|
|
52
53
|
}
|
|
53
54
|
await Promise.all(promises);
|
|
@@ -70,4 +71,4 @@ const handler = async (event, context) => {
|
|
|
70
71
|
}
|
|
71
72
|
};
|
|
72
73
|
exports.handler = handler;
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdC1kZXBsb3kubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvcG9zdC1kZXBsb3kvcG9zdC1kZXBsb3kubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLGtEQUE2QjtBQUM3QiwrREFBMkQ7QUFDM0QsNkRBQXdEO0FBQ3hELHlFQUFvRTtBQUNwRSx5Q0FBcUM7QUFFckMsb0NBQTBEO0FBRTFELE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLHdCQUF3QixDQUFDLENBQUM7QUFNakQ7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sT0FBTyxHQUF3QyxLQUFLLEVBQy9ELEtBQUssRUFDTCxPQUFPLEVBQ1AsRUFBRTtJQUNGLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDakIsSUFBSSxjQUFjLEdBQUcseUJBQWlCLENBQUMsTUFBTSxDQUFDO0lBQzlDLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxrQkFBbUMsQ0FBQztRQUN4RCxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDckUsTUFBTSxFQUNKLE9BQU8sRUFDUCxlQUFlLEVBQ2YsOEJBQThCLEVBQzlCLEtBQUssRUFDTCxxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUN0QixHQUFHLEtBQUssQ0FBQztZQUNWLE1BQU0sUUFBUSxHQUF1QixFQUFFLENBQUM7WUFDeEMsSUFBSSw4QkFBOEIsRUFBRSxDQUFDO2dCQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUEsd0NBQWtCLEVBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixRQUFRLENBQUMsSUFBSSxDQUNYLElBQUEscUNBQWdCLEVBQUM7b0JBQ2YsVUFBVSxFQUFFLGVBQWU7b0JBQzNCLGNBQWMsRUFBRSxPQUFPO2lCQUN4QixDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLHFCQUFxQixFQUFFLENBQUM7Z0JBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQ1gsSUFBQSxpREFBc0IsRUFBQztvQkFDckIsU0FBUyxFQUFFLHFCQUFxQjtvQkFDaEMsY0FBYyxFQUFFLE9BQU87aUJBQ3hCLENBQUMsQ0FDSCxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDM0IsNEJBQTRCO2dCQUM1QixRQUFRLENBQUMsSUFBSSxDQUNYLElBQUEsa0JBQU8sRUFBQztvQkFDTixVQUFVLEVBQUUsc0JBQXNCO29CQUNsQyxjQUFjLEVBQUUsT0FBTztvQkFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ3RCLFNBQVMsRUFBRSxxQkFBcUI7aUJBQ2pDLENBQUMsQ0FDSCxDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QixjQUFjLEdBQUcseUJBQWlCLENBQUMsT0FBTyxDQUFDO1FBQzdDLENBQUM7YUFBTSxDQUFDO1lBQ04sY0FBYyxHQUFHLHlCQUFpQixDQUFDLE9BQU8sQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxJQUFBLG1CQUFXLEVBQUM7WUFDaEIsS0FBSztZQUNMLE9BQU87WUFDUCxjQUFjO1lBQ2QsWUFBWSxFQUFFLEVBQUU7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQztBQWhFVyxRQUFBLE9BQU8sV0FnRWxCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlSGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhXCI7XG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQgeyBjcmVhdGVJbnZhbGlkYXRpb24gfSBmcm9tIFwiLi9jcmVhdGUtaW52YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBwcnVuZUNhY2hlQnVja2V0IH0gZnJvbSBcIi4vcHJ1bmUtY2FjaGUtYnVja2V0XCI7XG5pbXBvcnQgeyBwcnVuZVJldmFsaWRhdGlvblRhYmxlIH0gZnJvbSBcIi4vcHJ1bmUtcmV2YWxpZGF0aW9uLXRhYmxlXCI7XG5pbXBvcnQgeyBwcnVuZVMzIH0gZnJvbSBcIi4vcHJ1bmUtczNcIjtcbmltcG9ydCB7IFBvc3REZXBsb3lDdXN0b21SZXNvdXJjZVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vLi4vbmV4dGpzLXBvc3QtZGVwbG95XCI7XG5pbXBvcnQgeyBjZm5SZXNwb25zZSwgQ2ZuUmVzcG9uc2VTdGF0dXMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6cG9zdC1kZXBsb3lcIik7XG5cbnR5cGUgUmVzb3VyY2VQcm9wcyA9IFBvc3REZXBsb3lDdXN0b21SZXNvdXJjZVByb3BlcnRpZXMgJiB7XG4gIFNlcnZpY2VUb2tlbjogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtczpcbiAqIDEuIENsb3VkRnJvbnQgSW52YWxpZGF0aW9uXG4gKiAyLiBQcnVuZSBjYWNoZSBidWNrZXQgb2Ygb2xkIEJVSUxEX0lEIHByZWZpeGVkIG9iamVjdHNcbiAqIDMuIFBydW5lIER5bmFtb0RCIHJldmFsaWRhdGlvbiB0YWJsZSBvZiBvbGQgQlVJTERfSUQgcHJlZml4ZWQgZW50cmllc1xuICogNC4gUHJ1bmVzIG9iamVjdHMgaW4gc3RhdGljIGFzc2V0cyBTMyB0aGF0IGRvIG5vdCBoYXZlIG1ldGFkYXRhIHdpdGggY3VycmVudCBCVUlMRF9JRCBhbmRcbiAqIHdlcmUgbW9kaWZpZWQgb3ZlciBgbXNUdGxgIGFnbyAoZGVmYXVsdCAzMCBkYXlzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZXI6IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VIYW5kbGVyID0gYXN5bmMgKFxuICBldmVudCxcbiAgY29udGV4dCxcbikgPT4ge1xuICBkZWJ1Zyh7IGV2ZW50IH0pO1xuICBsZXQgcmVzcG9uc2VTdGF0dXMgPSBDZm5SZXNwb25zZVN0YXR1cy5GYWlsZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvcHMgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMgYXMgUmVzb3VyY2VQcm9wcztcbiAgICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiQ3JlYXRlXCIgfHwgZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiVXBkYXRlXCIpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYnVpbGRJZCxcbiAgICAgICAgY2FjaGVCdWNrZXROYW1lLFxuICAgICAgICBjcmVhdGVJbnZhbGlkYXRpb25Db21tYW5kSW5wdXQsXG4gICAgICAgIG1zVHRsLFxuICAgICAgICByZXZhbGlkYXRpb25UYWJsZU5hbWUsXG4gICAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldE5hbWUsXG4gICAgICAgIHN0YXRpY0Fzc2V0c0tleVByZWZpeCxcbiAgICAgIH0gPSBwcm9wcztcbiAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICAgIGlmIChjcmVhdGVJbnZhbGlkYXRpb25Db21tYW5kSW5wdXQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChjcmVhdGVJbnZhbGlkYXRpb24oY3JlYXRlSW52YWxpZGF0aW9uQ29tbWFuZElucHV0KSk7XG4gICAgICB9XG4gICAgICBpZiAoY2FjaGVCdWNrZXROYW1lKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgcHJ1bmVDYWNoZUJ1Y2tldCh7XG4gICAgICAgICAgICBidWNrZXROYW1lOiBjYWNoZUJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBjdXJyZW50QnVpbGRJZDogYnVpbGRJZCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXZhbGlkYXRpb25UYWJsZU5hbWUpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICBwcnVuZVJldmFsaWRhdGlvblRhYmxlKHtcbiAgICAgICAgICAgIHRhYmxlTmFtZTogcmV2YWxpZGF0aW9uVGFibGVOYW1lLFxuICAgICAgICAgICAgY3VycmVudEJ1aWxkSWQ6IGJ1aWxkSWQsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGljQXNzZXRzQnVja2V0TmFtZSkge1xuICAgICAgICAvLyB3aWxsIG5vdCBydW4gZm9yIHJlZ2lvbmFsXG4gICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgcHJ1bmVTMyh7XG4gICAgICAgICAgICBidWNrZXROYW1lOiBzdGF0aWNBc3NldHNCdWNrZXROYW1lLFxuICAgICAgICAgICAgY3VycmVudEJ1aWxkSWQ6IGJ1aWxkSWQsXG4gICAgICAgICAgICBtc1R0bDogcGFyc2VJbnQobXNUdGwpLFxuICAgICAgICAgICAga2V5UHJlZml4OiBzdGF0aWNBc3NldHNLZXlQcmVmaXgsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICByZXNwb25zZVN0YXR1cyA9IENmblJlc3BvbnNlU3RhdHVzLlN1Y2Nlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlU3RhdHVzID0gQ2ZuUmVzcG9uc2VTdGF0dXMuU3VjY2VzcztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBjZm5SZXNwb25zZSh7XG4gICAgICBldmVudCxcbiAgICAgIGNvbnRleHQsXG4gICAgICByZXNwb25zZVN0YXR1cyxcbiAgICAgIHJlc3BvbnNlRGF0YToge30sXG4gICAgfSk7XG4gIH1cbn07XG4iXX0=
|
|
@@ -5,10 +5,17 @@ interface PruneS3Props {
|
|
|
5
5
|
* Time to live in milliseconds.
|
|
6
6
|
*/
|
|
7
7
|
msTtl: number;
|
|
8
|
+
/**
|
|
9
|
+
* S3 key prefix the app's static assets live under. Surrounding slashes are
|
|
10
|
+
* normalized away. Scopes pruning to this app's objects so that apps or
|
|
11
|
+
* branches sharing one bucket under different `basePath`s don't delete each
|
|
12
|
+
* other's assets. Empty or omitted prunes the whole bucket.
|
|
13
|
+
*/
|
|
14
|
+
keyPrefix?: string;
|
|
8
15
|
}
|
|
9
16
|
/**
|
|
10
|
-
* Given `bucketName`, `currentBuildId`, and `msTtl`, list
|
|
11
|
-
*
|
|
17
|
+
* Given `bucketName`, `currentBuildId`, and `msTtl`, list the objects under
|
|
18
|
+
* `keyPrefix` and delete any that 1/ do not have a metadata key of "next-build-id"
|
|
12
19
|
* and value of `currentBuildId` and 2/ were created more than `msTtl` ago
|
|
13
20
|
*/
|
|
14
21
|
export declare function pruneS3(props: PruneS3Props): Promise<void>;
|
|
@@ -13,12 +13,20 @@ const s3Client = new client_s3_1.S3Client();
|
|
|
13
13
|
// Maximum number of concurrent operations
|
|
14
14
|
const MAX_CONCURRENT_OPERATIONS = 50;
|
|
15
15
|
/**
|
|
16
|
-
* Given `bucketName`, `currentBuildId`, and `msTtl`, list
|
|
17
|
-
*
|
|
16
|
+
* Given `bucketName`, `currentBuildId`, and `msTtl`, list the objects under
|
|
17
|
+
* `keyPrefix` and delete any that 1/ do not have a metadata key of "next-build-id"
|
|
18
18
|
* and value of `currentBuildId` and 2/ were created more than `msTtl` ago
|
|
19
19
|
*/
|
|
20
20
|
async function pruneS3(props) {
|
|
21
|
-
const { bucketName, currentBuildId, msTtl } = props;
|
|
21
|
+
const { bucketName, currentBuildId, msTtl, keyPrefix } = props;
|
|
22
|
+
// Surrounding slashes are stripped before use: `NextjsStaticAssets` hands over
|
|
23
|
+
// a bare prefix, but `overrides.customResourceProperties` lets a user set
|
|
24
|
+
// `staticAssetsKeyPrefix` directly, and "base/" or "/base" would build a
|
|
25
|
+
// Prefix ("base//", "/base/") that matches no key at all — pruning would
|
|
26
|
+
// silently become a no-op.
|
|
27
|
+
const bare = (keyPrefix || "").replace(/^\/+/, "").replace(/\/+$/, "");
|
|
28
|
+
// Trailing slash so a prefix of "app" doesn't also match "app-staging/...".
|
|
29
|
+
const prefix = bare ? `${bare}/` : undefined;
|
|
22
30
|
const cutoffDate = new Date(Date.now() - msTtl);
|
|
23
31
|
const objectsToDelete = [];
|
|
24
32
|
let continuationToken = undefined;
|
|
@@ -28,6 +36,7 @@ async function pruneS3(props) {
|
|
|
28
36
|
const listObjectsV2Input = {
|
|
29
37
|
Bucket: bucketName,
|
|
30
38
|
ContinuationToken: continuationToken,
|
|
39
|
+
Prefix: prefix,
|
|
31
40
|
};
|
|
32
41
|
const listResponse = await s3Client.send(new client_s3_1.ListObjectsV2Command(listObjectsV2Input));
|
|
33
42
|
if (!listResponse.Contents || listResponse.Contents.length === 0) {
|
|
@@ -61,9 +70,10 @@ async function pruneS3(props) {
|
|
|
61
70
|
});
|
|
62
71
|
// Add valid objects to delete list
|
|
63
72
|
objectsToDelete.push(...checkResults.filter(Boolean));
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
73
|
+
// Assigned unconditionally: the last page carries no NextContinuationToken,
|
|
74
|
+
// and keeping the previous page's token would re-list that same page until
|
|
75
|
+
// the guard below trips, re-checking every object on it 100 times over.
|
|
76
|
+
continuationToken = listResponse.NextContinuationToken;
|
|
67
77
|
listObjectsCount++;
|
|
68
78
|
// assume less than 100K objects (100 * 1K objects per ListObjectsV2Command = 100K)
|
|
69
79
|
} while (continuationToken && listObjectsCount <= 100);
|
|
@@ -103,4 +113,4 @@ async function processBatch(items, batchSize, processFn) {
|
|
|
103
113
|
}
|
|
104
114
|
return results;
|
|
105
115
|
}
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9wb3N0LWRlcGxveS9wcnVuZS1zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQStCQSwwQkEyR0M7QUExSUQsNkRBQTZEO0FBQzdELGtEQU00QjtBQUM1Qiw2REFBNkQ7QUFDN0Qsa0RBQTZCO0FBRTdCLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFFMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxvQkFBUSxFQUFFLENBQUM7QUFDaEMsMENBQTBDO0FBQzFDLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDO0FBV3JDOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQW1CO0lBQy9DLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQztJQUVwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxlQUFlLEdBQXNCLEVBQUUsQ0FBQztJQUU5QyxJQUFJLGlCQUFpQixHQUF1QixTQUFTLENBQUM7SUFDdEQsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFFekIsR0FBRyxDQUFDO1FBQ0YsNkJBQTZCO1FBQzdCLE1BQU0sa0JBQWtCLEdBQThCO1lBQ3BELE1BQU0sRUFBRSxVQUFVO1lBQ2xCLGlCQUFpQixFQUFFLGlCQUFpQjtTQUNyQyxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUN0QyxJQUFJLGdDQUFvQixDQUFDLGtCQUFrQixDQUFDLENBQzdDLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZ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QUM7b0JBQ3ZCLE1BQU0sRUFBRSxVQUFVO29CQUNsQixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO2lCQUMzQixDQUFDLENBQ0gsQ0FBQztnQkFDRixLQUFLLENBQUMsV0FBVyxLQUFLLENBQUMsTUFBTSxpQkFBaUIsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQ0gsNkJBQTZCLGVBQWUsQ0FBQyxNQUFNLGlCQUFpQixVQUFVLEVBQUUsQ0FDakYsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSxZQUFZLENBQ3pCLEtBQVUsRUFDVixTQUFpQixFQUNqQixTQUFrQztJQUVsQyxNQUFNLE9BQU8sR0FBUSxFQUFFLENBQUM7SUFFeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUM1QyxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzdELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7XG4gIFMzQ2xpZW50LFxuICBMaXN0T2JqZWN0c1YyQ29tbWFuZCxcbiAgRGVsZXRlT2JqZWN0c0NvbW1hbmQsXG4gIEhlYWRPYmplY3RDb21tYW5kLFxuICBMaXN0T2JqZWN0c1YyQ29tbWFuZElucHV0LFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoXCJjZGstbmV4dGpzOnBvc3QtZGVwbG95OnBydW5lLXMzXCIpO1xuXG5jb25zdCBzM0NsaWVudCA9IG5ldyBTM0NsaWVudCgpO1xuLy8gTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBvcGVyYXRpb25zXG5jb25zdCBNQVhfQ09OQ1VSUkVOVF9PUEVSQVRJT05TID0gNTA7XG5cbmludGVyZmFjZSBQcnVuZVMzUHJvcHMge1xuICBidWNrZXROYW1lOiBzdHJpbmc7XG4gIGN1cnJlbnRCdWlsZElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lIHRvIGxpdmUgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgbXNUdGw6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHaXZlbiBgYnVja2V0TmFtZWAsIGBjdXJyZW50QnVpbGRJZGAsIGFuZCBgbXNUdGxgLCBsaXN0IGFsbCBvYmplY3RzXG4gKiBpbiB0aGUgYnVja2V0IGFuZCBkZWxldGUgYW55IHRoYXQgMS8gZG8gbm90IGhhdmUgYSBtZXRhZGF0YSBrZXkgb2YgXCJuZXh0LWJ1aWxkLWlkXCJcbiAqIGFuZCB2YWx1ZSBvZiBgY3VycmVudEJ1aWxkSWRgIGFuZCAyLyB3ZXJlIGNyZWF0ZWQgbW9yZSB0aGFuIGBtc1R0bGAgYWdvXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcnVuZVMzKHByb3BzOiBQcnVuZVMzUHJvcHMpIHtcbiAgY29uc3QgeyBidWNrZXROYW1lLCBjdXJyZW50QnVpbGRJZCwgbXNUdGwgfSA9IHByb3BzO1xuXG4gIGNvbnN0IGN1dG9mZkRhdGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gbXNUdGwpO1xuICBjb25zdCBvYmplY3RzVG9EZWxldGU6IHsgS2V5OiBzdHJpbmcgfVtdID0gW107XG5cbiAgbGV0IGNvbnRpbnVhdGlvblRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGxldCBsaXN0T2JqZWN0c0NvdW50ID0gMDtcblxuICBkbyB7XG4gICAgLy8gTGlzdCBvYmplY3RzIGluIHRoZSBidWNrZXRcbiAgICBjb25zdCBsaXN0T2JqZWN0c1YySW5wdXQ6IExpc3RPYmplY3RzVjJDb21tYW5kSW5wdXQgPSB7XG4gICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICBDb250aW51YXRpb25Ub2tlbjogY29udGludWF0aW9uVG9rZW4sXG4gICAgfTtcbiAgICBjb25zdCBsaXN0UmVzcG9uc2UgPSBhd2FpdCBzM0NsaWVudC5zZW5kKFxuICAgICAgbmV3IExpc3RPYmplY3RzVjJDb21tYW5kKGxpc3RPYmplY3RzVjJJbnB1dCksXG4gICAgKTtcblxuICAgIGlmICghbGlzdFJlc3BvbnNlLkNvbnRlbnRzIHx8IGxpc3RSZXNwb25zZS5Db250ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgb2JqZWN0cyB3aXRob3V0IGtleXNcbiAgICBjb25zdCBvbGRPYmplY3RzID0gbGlzdFJlc3BvbnNlLkNvbnRlbnRzLmZpbHRlcigob2JqKSA9PiB7XG4gICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBvYmouTGFzdE1vZGlmaWVkIHx8IG5ldyBEYXRlKCk7XG4gICAgICByZXR1cm4gb2JqLktleSAmJiBsYXN0TW9kaWZpZWQgPCBjdXRvZmZEYXRlO1xuICAgIH0pO1xuICAgIGRlYnVnKFxuICAgICAgYENoZWNraW5nIG9sZCBvYmplY3RzIG1ldGFkYXRhIHRvIGRldGVybWluZSBwcnVuaW5nOiAke29sZE9iamVjdHMubWFwKChvKSA9PiBvLktleSl9YCxcbiAgICApO1xuXG4gICAgLy8gUHJvY2VzcyBvYmplY3RzIGluIHBhcmFsbGVsIHdpdGggY29udHJvbGxlZCBjb25jdXJyZW5jeVxuICAgIGNvbnN0IGNoZWNrUmVzdWx0cyA9IGF3YWl0IHByb2Nlc3NCYXRjaChcbiAgICAgIG9sZE9iamVjdHMsXG4gICAgICBNQVhfQ09OQ1VSUkVOVF9PUEVSQVRJT05TLFxuICAgICAgYXN5bmMgKG9iamVjdCkgPT4ge1xuICAgICAgICBpZiAoIW9iamVjdC5LZXkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZFJlc3BvbnNlID0gYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgICAgICAgIG5ldyBIZWFkT2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgS2V5OiBvYmplY3QuS2V5LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IG9iamVjdEJ1aWxkSWQgPSBoZWFkUmVzcG9uc2UuTWV0YWRhdGE/LltcIm5leHQtYnVpbGQtaWRcIl07XG5cbiAgICAgICAgICAvLyBSZXR1cm4gdGhlIGtleSBpZiBpdCBzaG91bGQgYmUgZGVsZXRlZFxuICAgICAgICAgIGlmIChvYmplY3RCdWlsZElkICE9PSBjdXJyZW50QnVpbGRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgS2V5OiBvYmplY3QuS2V5IH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNoZWNraW5nIG9iamVjdCAke29iamVjdC5LZXl9OmAsIGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQWRkIHZhbGlkIG9iamVjdHMgdG8gZGVsZXRlIGxpc3RcbiAgICBvYmplY3RzVG9EZWxldGUucHVzaChcbiAgICAgIC4uLihjaGVja1Jlc3VsdHMuZmlsdGVyKEJvb2xlYW4pIGFzIHsgS2V5OiBzdHJpbmcgfVtdKSxcbiAgICApO1xuXG4gICAgaWYgKGxpc3RSZXNwb25zZS5OZXh0Q29udGludWF0aW9uVG9rZW4pIHtcbiAgICAgIGNvbnRpbnVhdGlvblRva2VuID0gbGlzdFJlc3BvbnNlLk5leHRDb250aW51YXRpb25Ub2tlbjtcbiAgICB9XG4gICAgbGlzdE9iamVjdHNDb3VudCsrO1xuICAgIC8vIGFzc3VtZSBsZXNzIHRoYW4gMTAwSyBvYmplY3RzICgxMDAgKiAxSyBvYmplY3RzIHBlciBMaXN0T2JqZWN0c1YyQ29tbWFuZCA9IDEwMEspXG4gIH0gd2hpbGUgKGNvbnRpbnVhdGlvblRva2VuICYmIGxpc3RPYmplY3RzQ291bnQgPD0gMTAwKTtcblxuICAvLyBEZWxldGUgb2JqZWN0cyBpbiBwYXJhbGxlbCBiYXRjaGVzIChyZXNwZWN0aW5nIFMzJ3MgMTAwMCBvYmplY3RzIHBlciByZXF1ZXN0IGxpbWl0KVxuICBpZiAob2JqZWN0c1RvRGVsZXRlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZWxldGVCYXRjaGVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHNUb0RlbGV0ZS5sZW5ndGg7IGkgKz0gMTAwMCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBvYmplY3RzVG9EZWxldGUuc2xpY2UoaSwgaSArIDEwMDApO1xuICAgICAgZGVsZXRlQmF0Y2hlcy5wdXNoKGJhdGNoKTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9jZXNzQmF0Y2goXG4gICAgICBkZWxldGVCYXRjaGVzLFxuICAgICAgNSwgLy8gUHJvY2VzcyB1cCB0byA1IGRlbGV0ZSBiYXRjaGVzIGluIHBhcmFsbGVsXG4gICAgICBhc3luYyAoYmF0Y2gpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBEZWxldGluZyBvYmplY3RzOiAke2JhdGNoLm1hcCgoYikgPT4gYi5LZXkpfSBmcm9tICR7YnVja2V0TmFtZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgICAgICAgIG5ldyBEZWxldGVPYmplY3RzQ29tbWFuZCh7XG4gICAgICAgICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgRGVsZXRlOiB7IE9iamVjdHM6IGJhdGNoIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGRlYnVnKGBEZWxldGVkICR7YmF0Y2gubGVuZ3RofSBvYmplY3RzIGZyb20gJHtidWNrZXROYW1lfWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkZWxldGluZyBvYmplY3RzOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIGRlYnVnKFxuICAgIGBQcnVuaW5nIGNvbXBsZXRlLiBEZWxldGVkICR7b2JqZWN0c1RvRGVsZXRlLmxlbmd0aH0gb2JqZWN0cyBmcm9tICR7YnVja2V0TmFtZX1gLFxuICApO1xufVxuXG4vKipcbiAqIFByb2Nlc3Mgb2JqZWN0cyBpbiBiYXRjaGVzIHRvIGF2b2lkIG92ZXJ3aGVsbWluZyB0aGUgc3lzdGVtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCYXRjaDxULCBSPihcbiAgaXRlbXM6IFRbXSxcbiAgYmF0Y2hTaXplOiBudW1iZXIsXG4gIHByb2Nlc3NGbjogKGl0ZW06IFQpID0+IFByb21pc2U8Uj4sXG4pOiBQcm9taXNlPFJbXT4ge1xuICBjb25zdCByZXN1bHRzOiBSW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICBjb25zdCBiYXRjaCA9IGl0ZW1zLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpO1xuICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGJhdGNoLm1hcChwcm9jZXNzRm4pKTtcbiAgICByZXN1bHRzLnB1c2goLi4uYmF0Y2hSZXN1bHRzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIl19
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9wb3N0LWRlcGxveS9wcnVuZS1zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXNDQSwwQkFxSEM7QUEzSkQsNkRBQTZEO0FBQzdELGtEQU00QjtBQUM1Qiw2REFBNkQ7QUFDN0Qsa0RBQTZCO0FBRTdCLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFFMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxvQkFBUSxFQUFFLENBQUM7QUFDaEMsMENBQTBDO0FBQzFDLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDO0FBa0JyQzs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFtQjtJQUMvQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQy9ELCtFQUErRTtJQUMvRSwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSwyQkFBMkI7SUFDM0IsTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLDRFQUE0RTtJQUM1RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUU3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxlQUFlLEdBQXNCLEVBQUUsQ0FBQztJQUU5QyxJQUFJLGlCQUFpQixHQUF1QixTQUFTLENBQUM7SUFDdEQsSUFBSSxnQkFBZ0Is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QyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHtcbiAgUzNDbGllbnQsXG4gIExpc3RPYmplY3RzVjJDb21tYW5kLFxuICBEZWxldGVPYmplY3RzQ29tbWFuZCxcbiAgSGVhZE9iamVjdENvbW1hbmQsXG4gIExpc3RPYmplY3RzVjJDb21tYW5kSW5wdXQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6cG9zdC1kZXBsb3k6cHJ1bmUtczNcIik7XG5cbmNvbnN0IHMzQ2xpZW50ID0gbmV3IFMzQ2xpZW50KCk7XG4vLyBNYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IG9wZXJhdGlvbnNcbmNvbnN0IE1BWF9DT05DVVJSRU5UX09QRVJBVElPTlMgPSA1MDtcblxuaW50ZXJmYWNlIFBydW5lUzNQcm9wcyB7XG4gIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgY3VycmVudEJ1aWxkSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRpbWUgdG8gbGl2ZSBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBtc1R0bDogbnVtYmVyO1xuICAvKipcbiAgICogUzMga2V5IHByZWZpeCB0aGUgYXBwJ3Mgc3RhdGljIGFzc2V0cyBsaXZlIHVuZGVyLiBTdXJyb3VuZGluZyBzbGFzaGVzIGFyZVxuICAgKiBub3JtYWxpemVkIGF3YXkuIFNjb3BlcyBwcnVuaW5nIHRvIHRoaXMgYXBwJ3Mgb2JqZWN0cyBzbyB0aGF0IGFwcHMgb3JcbiAgICogYnJhbmNoZXMgc2hhcmluZyBvbmUgYnVja2V0IHVuZGVyIGRpZmZlcmVudCBgYmFzZVBhdGhgcyBkb24ndCBkZWxldGUgZWFjaFxuICAgKiBvdGhlcidzIGFzc2V0cy4gRW1wdHkgb3Igb21pdHRlZCBwcnVuZXMgdGhlIHdob2xlIGJ1Y2tldC5cbiAgICovXG4gIGtleVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBHaXZlbiBgYnVja2V0TmFtZWAsIGBjdXJyZW50QnVpbGRJZGAsIGFuZCBgbXNUdGxgLCBsaXN0IHRoZSBvYmplY3RzIHVuZGVyXG4gKiBga2V5UHJlZml4YCBhbmQgZGVsZXRlIGFueSB0aGF0IDEvIGRvIG5vdCBoYXZlIGEgbWV0YWRhdGEga2V5IG9mIFwibmV4dC1idWlsZC1pZFwiXG4gKiBhbmQgdmFsdWUgb2YgYGN1cnJlbnRCdWlsZElkYCBhbmQgMi8gd2VyZSBjcmVhdGVkIG1vcmUgdGhhbiBgbXNUdGxgIGFnb1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJ1bmVTMyhwcm9wczogUHJ1bmVTM1Byb3BzKSB7XG4gIGNvbnN0IHsgYnVja2V0TmFtZSwgY3VycmVudEJ1aWxkSWQsIG1zVHRsLCBrZXlQcmVmaXggfSA9IHByb3BzO1xuICAvLyBTdXJyb3VuZGluZyBzbGFzaGVzIGFyZSBzdHJpcHBlZCBiZWZvcmUgdXNlOiBgTmV4dGpzU3RhdGljQXNzZXRzYCBoYW5kcyBvdmVyXG4gIC8vIGEgYmFyZSBwcmVmaXgsIGJ1dCBgb3ZlcnJpZGVzLmN1c3RvbVJlc291cmNlUHJvcGVydGllc2AgbGV0cyBhIHVzZXIgc2V0XG4gIC8vIGBzdGF0aWNBc3NldHNLZXlQcmVmaXhgIGRpcmVjdGx5LCBhbmQgXCJiYXNlL1wiIG9yIFwiL2Jhc2VcIiB3b3VsZCBidWlsZCBhXG4gIC8vIFByZWZpeCAoXCJiYXNlLy9cIiwgXCIvYmFzZS9cIikgdGhhdCBtYXRjaGVzIG5vIGtleSBhdCBhbGwg4oCUIHBydW5pbmcgd291bGRcbiAgLy8gc2lsZW50bHkgYmVjb21lIGEgbm8tb3AuXG4gIGNvbnN0IGJhcmUgPSAoa2V5UHJlZml4IHx8IFwiXCIpLnJlcGxhY2UoL15cXC8rLywgXCJcIikucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgLy8gVHJhaWxpbmcgc2xhc2ggc28gYSBwcmVmaXggb2YgXCJhcHBcIiBkb2Vzbid0IGFsc28gbWF0Y2ggXCJhcHAtc3RhZ2luZy8uLi5cIi5cbiAgY29uc3QgcHJlZml4ID0gYmFyZSA/IGAke2JhcmV9L2AgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY3V0b2ZmRGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkgLSBtc1R0bCk7XG4gIGNvbnN0IG9iamVjdHNUb0RlbGV0ZTogeyBLZXk6IHN0cmluZyB9W10gPSBbXTtcblxuICBsZXQgY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgbGV0IGxpc3RPYmplY3RzQ291bnQgPSAwO1xuXG4gIGRvIHtcbiAgICAvLyBMaXN0IG9iamVjdHMgaW4gdGhlIGJ1Y2tldFxuICAgIGNvbnN0IGxpc3RPYmplY3RzVjJJbnB1dDogTGlzdE9iamVjdHNWMkNvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgIENvbnRpbnVhdGlvblRva2VuOiBjb250aW51YXRpb25Ub2tlbixcbiAgICAgIFByZWZpeDogcHJlZml4LFxuICAgIH07XG4gICAgY29uc3QgbGlzdFJlc3BvbnNlID0gYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgIG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZChsaXN0T2JqZWN0c1YySW5wdXQpLFxuICAgICk7XG5cbiAgICBpZiAoIWxpc3RSZXNwb25zZS5Db250ZW50cyB8fCBsaXN0UmVzcG9uc2UuQ29udGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IG9iamVjdHMgd2l0aG91dCBrZXlzXG4gICAgY29uc3Qgb2xkT2JqZWN0cyA9IGxpc3RSZXNwb25zZS5Db250ZW50cy5maWx0ZXIoKG9iaikgPT4ge1xuICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gb2JqLkxhc3RNb2RpZmllZCB8fCBuZXcgRGF0ZSgpO1xuICAgICAgcmV0dXJuIG9iai5LZXkgJiYgbGFzdE1vZGlmaWVkIDwgY3V0b2ZmRGF0ZTtcbiAgICB9KTtcbiAgICBkZWJ1ZyhcbiAgICAgIGBDaGVja2luZyBvbGQgb2JqZWN0cyBtZXRhZGF0YSB0byBkZXRlcm1pbmUgcHJ1bmluZzogJHtvbGRPYmplY3RzLm1hcCgobykgPT4gby5LZXkpfWAsXG4gICAgKTtcblxuICAgIC8vIFByb2Nlc3Mgb2JqZWN0cyBpbiBwYXJhbGxlbCB3aXRoIGNvbnRyb2xsZWQgY29uY3VycmVuY3lcbiAgICBjb25zdCBjaGVja1Jlc3VsdHMgPSBhd2FpdCBwcm9jZXNzQmF0Y2goXG4gICAgICBvbGRPYmplY3RzLFxuICAgICAgTUFYX0NPTkNVUlJFTlRfT1BFUkFUSU9OUyxcbiAgICAgIGFzeW5jIChvYmplY3QpID0+IHtcbiAgICAgICAgaWYgKCFvYmplY3QuS2V5KSByZXR1cm4gbnVsbDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlYWRSZXNwb25zZSA9IGF3YWl0IHMzQ2xpZW50LnNlbmQoXG4gICAgICAgICAgICBuZXcgSGVhZE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgIEtleTogb2JqZWN0LktleSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBvYmplY3RCdWlsZElkID0gaGVhZFJlc3BvbnNlLk1ldGFkYXRhPy5bXCJuZXh0LWJ1aWxkLWlkXCJdO1xuXG4gICAgICAgICAgLy8gUmV0dXJuIHRoZSBrZXkgaWYgaXQgc2hvdWxkIGJlIGRlbGV0ZWRcbiAgICAgICAgICBpZiAob2JqZWN0QnVpbGRJZCAhPT0gY3VycmVudEJ1aWxkSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IEtleTogb2JqZWN0LktleSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjaGVja2luZyBvYmplY3QgJHtvYmplY3QuS2V5fTpgLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFkZCB2YWxpZCBvYmplY3RzIHRvIGRlbGV0ZSBsaXN0XG4gICAgb2JqZWN0c1RvRGVsZXRlLnB1c2goXG4gICAgICAuLi4oY2hlY2tSZXN1bHRzLmZpbHRlcihCb29sZWFuKSBhcyB7IEtleTogc3RyaW5nIH1bXSksXG4gICAgKTtcblxuICAgIC8vIEFzc2lnbmVkIHVuY29uZGl0aW9uYWxseTogdGhlIGxhc3QgcGFnZSBjYXJyaWVzIG5vIE5leHRDb250aW51YXRpb25Ub2tlbixcbiAgICAvLyBhbmQga2VlcGluZyB0aGUgcHJldmlvdXMgcGFnZSdzIHRva2VuIHdvdWxkIHJlLWxpc3QgdGhhdCBzYW1lIHBhZ2UgdW50aWxcbiAgICAvLyB0aGUgZ3VhcmQgYmVsb3cgdHJpcHMsIHJlLWNoZWNraW5nIGV2ZXJ5IG9iamVjdCBvbiBpdCAxMDAgdGltZXMgb3Zlci5cbiAgICBjb250aW51YXRpb25Ub2tlbiA9IGxpc3RSZXNwb25zZS5OZXh0Q29udGludWF0aW9uVG9rZW47XG4gICAgbGlzdE9iamVjdHNDb3VudCsrO1xuICAgIC8vIGFzc3VtZSBsZXNzIHRoYW4gMTAwSyBvYmplY3RzICgxMDAgKiAxSyBvYmplY3RzIHBlciBMaXN0T2JqZWN0c1YyQ29tbWFuZCA9IDEwMEspXG4gIH0gd2hpbGUgKGNvbnRpbnVhdGlvblRva2VuICYmIGxpc3RPYmplY3RzQ291bnQgPD0gMTAwKTtcblxuICAvLyBEZWxldGUgb2JqZWN0cyBpbiBwYXJhbGxlbCBiYXRjaGVzIChyZXNwZWN0aW5nIFMzJ3MgMTAwMCBvYmplY3RzIHBlciByZXF1ZXN0IGxpbWl0KVxuICBpZiAob2JqZWN0c1RvRGVsZXRlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZWxldGVCYXRjaGVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHNUb0RlbGV0ZS5sZW5ndGg7IGkgKz0gMTAwMCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBvYmplY3RzVG9EZWxldGUuc2xpY2UoaSwgaSArIDEwMDApO1xuICAgICAgZGVsZXRlQmF0Y2hlcy5wdXNoKGJhdGNoKTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9jZXNzQmF0Y2goXG4gICAgICBkZWxldGVCYXRjaGVzLFxuICAgICAgNSwgLy8gUHJvY2VzcyB1cCB0byA1IGRlbGV0ZSBiYXRjaGVzIGluIHBhcmFsbGVsXG4gICAgICBhc3luYyAoYmF0Y2gpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBEZWxldGluZyBvYmplY3RzOiAke2JhdGNoLm1hcCgoYikgPT4gYi5LZXkpfSBmcm9tICR7YnVja2V0TmFtZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgICAgICAgIG5ldyBEZWxldGVPYmplY3RzQ29tbWFuZCh7XG4gICAgICAgICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgRGVsZXRlOiB7IE9iamVjdHM6IGJhdGNoIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGRlYnVnKGBEZWxldGVkICR7YmF0Y2gubGVuZ3RofSBvYmplY3RzIGZyb20gJHtidWNrZXROYW1lfWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkZWxldGluZyBvYmplY3RzOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIGRlYnVnKFxuICAgIGBQcnVuaW5nIGNvbXBsZXRlLiBEZWxldGVkICR7b2JqZWN0c1RvRGVsZXRlLmxlbmd0aH0gb2JqZWN0cyBmcm9tICR7YnVja2V0TmFtZX1gLFxuICApO1xufVxuXG4vKipcbiAqIFByb2Nlc3Mgb2JqZWN0cyBpbiBiYXRjaGVzIHRvIGF2b2lkIG92ZXJ3aGVsbWluZyB0aGUgc3lzdGVtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCYXRjaDxULCBSPihcbiAgaXRlbXM6IFRbXSxcbiAgYmF0Y2hTaXplOiBudW1iZXIsXG4gIHByb2Nlc3NGbjogKGl0ZW06IFQpID0+IFByb21pc2U8Uj4sXG4pOiBQcm9taXNlPFJbXT4ge1xuICBjb25zdCByZXN1bHRzOiBSW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICBjb25zdCBiYXRjaCA9IGl0ZW1zLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpO1xuICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGJhdGNoLm1hcChwcm9jZXNzRm4pKTtcbiAgICByZXN1bHRzLnB1c2goLi4uYmF0Y2hSZXN1bHRzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
4
|
+
// Only the client is mocked; the command classes stay real so that assertions
|
|
5
|
+
// can read `command.input`. `send` is looked up through the holder at call time
|
|
6
|
+
// because `prune-s3` constructs its client at module scope, before the mock
|
|
7
|
+
// variables here are initialized.
|
|
8
|
+
jest.mock("@aws-sdk/client-s3", () => ({
|
|
9
|
+
...jest.requireActual("@aws-sdk/client-s3"),
|
|
10
|
+
S3Client: jest.fn(() => ({
|
|
11
|
+
send: (...args) => holder.send(...args),
|
|
12
|
+
})),
|
|
13
|
+
}));
|
|
14
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
15
|
+
const prune_s3_1 = require("./prune-s3");
|
|
16
|
+
const holder = { send: jest.fn() };
|
|
17
|
+
const BUCKET = "my-static-assets";
|
|
18
|
+
const CURRENT_BUILD_ID = "build-2";
|
|
19
|
+
const MS_TTL = 1000 * 60 * 60 * 24 * 30;
|
|
20
|
+
/**
|
|
21
|
+
* One page of listed objects, all old enough to prune and each carrying a stale
|
|
22
|
+
* build id, so every one of them is a deletion candidate. That isolates the
|
|
23
|
+
* question this suite is about: which keys `pruneS3` was ever shown.
|
|
24
|
+
*/
|
|
25
|
+
function stubBucketContents(keys, buildId = "build-1") {
|
|
26
|
+
const longAgo = new Date(Date.now() - MS_TTL * 2);
|
|
27
|
+
holder.send.mockImplementation((command) => {
|
|
28
|
+
if (command instanceof client_s3_1.ListObjectsV2Command) {
|
|
29
|
+
return Promise.resolve({
|
|
30
|
+
Contents: keys.map((Key) => ({ Key, LastModified: longAgo })),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (command instanceof client_s3_1.DeleteObjectsCommand) {
|
|
34
|
+
return Promise.resolve({});
|
|
35
|
+
}
|
|
36
|
+
// HeadObject
|
|
37
|
+
return Promise.resolve({ Metadata: { "next-build-id": buildId } });
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Several pages of listed objects, keyed by the continuation token that asks for
|
|
42
|
+
* each one, so the suite can assert how `pruneS3` walks a paginated listing. The
|
|
43
|
+
* last page deliberately carries no NextContinuationToken, as S3 returns it.
|
|
44
|
+
*/
|
|
45
|
+
function stubPagedBucketContents(pages) {
|
|
46
|
+
const longAgo = new Date(Date.now() - MS_TTL * 2);
|
|
47
|
+
holder.send.mockImplementation((command) => {
|
|
48
|
+
if (command instanceof client_s3_1.ListObjectsV2Command) {
|
|
49
|
+
const token = command.input.ContinuationToken;
|
|
50
|
+
const index = token ? Number(token.replace("page-", "")) : 0;
|
|
51
|
+
return Promise.resolve({
|
|
52
|
+
Contents: (pages[index] ?? []).map((Key) => ({
|
|
53
|
+
Key,
|
|
54
|
+
LastModified: longAgo,
|
|
55
|
+
})),
|
|
56
|
+
NextContinuationToken: index + 1 < pages.length ? `page-${index + 1}` : undefined,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (command instanceof client_s3_1.DeleteObjectsCommand) {
|
|
60
|
+
return Promise.resolve({});
|
|
61
|
+
}
|
|
62
|
+
// HeadObject
|
|
63
|
+
return Promise.resolve({ Metadata: { "next-build-id": "build-1" } });
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function sentCommands(type) {
|
|
67
|
+
return holder.send.mock.calls
|
|
68
|
+
.map(([command]) => command)
|
|
69
|
+
.filter((command) => command instanceof type);
|
|
70
|
+
}
|
|
71
|
+
function listPrefixes() {
|
|
72
|
+
return sentCommands(client_s3_1.ListObjectsV2Command).map((command) => command.input.Prefix);
|
|
73
|
+
}
|
|
74
|
+
function deletedKeys() {
|
|
75
|
+
return sentCommands(client_s3_1.DeleteObjectsCommand).flatMap((command) => (command.input.Delete?.Objects ?? []).map((o) => o.Key));
|
|
76
|
+
}
|
|
77
|
+
function prune(keyPrefix) {
|
|
78
|
+
return (0, prune_s3_1.pruneS3)({
|
|
79
|
+
bucketName: BUCKET,
|
|
80
|
+
currentBuildId: CURRENT_BUILD_ID,
|
|
81
|
+
msTtl: MS_TTL,
|
|
82
|
+
keyPrefix,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
describe("pruneS3", () => {
|
|
86
|
+
beforeEach(() => {
|
|
87
|
+
holder.send.mockReset();
|
|
88
|
+
});
|
|
89
|
+
// Without a Prefix, pruning walks the whole bucket. Two branches sharing one
|
|
90
|
+
// bucket under different basePaths would then delete each other's assets once
|
|
91
|
+
// they aged past msTtl, 404ing the other branch.
|
|
92
|
+
it("scopes the listing to the key prefix", async () => {
|
|
93
|
+
stubBucketContents(["branch-a/_next/static/old.js"]);
|
|
94
|
+
await prune("branch-a");
|
|
95
|
+
expect(listPrefixes()).toEqual(["branch-a/"]);
|
|
96
|
+
});
|
|
97
|
+
// A bare "branch-a" prefix also matches "branch-a-staging/...", which is a
|
|
98
|
+
// different app's objects.
|
|
99
|
+
it("terminates the prefix with a slash", async () => {
|
|
100
|
+
stubBucketContents([]);
|
|
101
|
+
await prune("branch-a");
|
|
102
|
+
// Asserted as an exact value: a bare "branch-a", and an absent prefix, both
|
|
103
|
+
// reach objects belonging to another app.
|
|
104
|
+
expect(listPrefixes()).toEqual(["branch-a/"]);
|
|
105
|
+
});
|
|
106
|
+
it("takes a nested prefix as NextjsStaticAssets resolved it", async () => {
|
|
107
|
+
stubBucketContents([]);
|
|
108
|
+
await prune("team/app");
|
|
109
|
+
expect(listPrefixes()).toEqual(["team/app/"]);
|
|
110
|
+
});
|
|
111
|
+
// The single-app case, and every deployment predating the prefix being
|
|
112
|
+
// threaded through: an unset prefix still prunes the whole bucket.
|
|
113
|
+
it.each([
|
|
114
|
+
["omitted", undefined],
|
|
115
|
+
["empty", ""],
|
|
116
|
+
])("lists the whole bucket when the prefix is %s", async (_label, prefix) => {
|
|
117
|
+
stubBucketContents([]);
|
|
118
|
+
await prune(prefix);
|
|
119
|
+
expect(listPrefixes()).toEqual([undefined]);
|
|
120
|
+
});
|
|
121
|
+
it("still deletes stale objects within the prefix", async () => {
|
|
122
|
+
stubBucketContents([
|
|
123
|
+
"branch-a/_next/static/old.js",
|
|
124
|
+
"branch-a/favicon.ico",
|
|
125
|
+
]);
|
|
126
|
+
await prune("branch-a");
|
|
127
|
+
expect(deletedKeys().sort()).toEqual([
|
|
128
|
+
"branch-a/_next/static/old.js",
|
|
129
|
+
"branch-a/favicon.ico",
|
|
130
|
+
]);
|
|
131
|
+
});
|
|
132
|
+
it("keeps objects carrying the current build id", async () => {
|
|
133
|
+
stubBucketContents(["branch-a/current.js"], CURRENT_BUILD_ID);
|
|
134
|
+
await prune("branch-a");
|
|
135
|
+
expect(deletedKeys()).toEqual([]);
|
|
136
|
+
});
|
|
137
|
+
// The construct always hands over a bare prefix, but
|
|
138
|
+
// `overrides.customResourceProperties.staticAssetsKeyPrefix` reaches this
|
|
139
|
+
// directly. "base/" would build a Prefix of "base//" and "/base" one of
|
|
140
|
+
// "/base/", neither of which matches any key, so pruning would silently stop
|
|
141
|
+
// deleting anything at all.
|
|
142
|
+
it.each([
|
|
143
|
+
["a trailing slash", "branch-a/"],
|
|
144
|
+
["a leading slash", "/branch-a"],
|
|
145
|
+
["both", "/branch-a/"],
|
|
146
|
+
])("normalizes a prefix given with %s", async (_label, prefix) => {
|
|
147
|
+
stubBucketContents([]);
|
|
148
|
+
await prune(prefix);
|
|
149
|
+
expect(listPrefixes()).toEqual(["branch-a/"]);
|
|
150
|
+
});
|
|
151
|
+
describe("pagination", () => {
|
|
152
|
+
it("follows the continuation token across pages", async () => {
|
|
153
|
+
stubPagedBucketContents([["a/one.js"], ["a/two.js"], ["a/three.js"]]);
|
|
154
|
+
await prune("a");
|
|
155
|
+
expect(sentCommands(client_s3_1.ListObjectsV2Command).map((command) => command.input.ContinuationToken)).toEqual([undefined, "page-1", "page-2"]);
|
|
156
|
+
expect(deletedKeys().sort()).toEqual([
|
|
157
|
+
"a/one.js",
|
|
158
|
+
"a/three.js",
|
|
159
|
+
"a/two.js",
|
|
160
|
+
]);
|
|
161
|
+
});
|
|
162
|
+
// The last page carries no NextContinuationToken. Holding on to the previous
|
|
163
|
+
// page's token re-lists that page until the 100-iteration guard trips,
|
|
164
|
+
// re-HEADing every object on it 100 times over (~100k requests for a full
|
|
165
|
+
// 1000-key page) and pushing duplicate keys into the delete batches — enough
|
|
166
|
+
// to blow the post-deploy Lambda's timeout, which leaves the custom resource
|
|
167
|
+
// waiting on a response that never comes.
|
|
168
|
+
it("stops listing once a page returns no continuation token", async () => {
|
|
169
|
+
stubPagedBucketContents([["a/one.js"], ["a/two.js"]]);
|
|
170
|
+
await prune("a");
|
|
171
|
+
expect(sentCommands(client_s3_1.ListObjectsV2Command)).toHaveLength(2);
|
|
172
|
+
expect(deletedKeys()).toEqual(["a/one.js", "a/two.js"]);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtczMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYW1iZGFzL3Bvc3QtZGVwbG95L3BydW5lLXMzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiw0RUFBNEU7QUFDNUUsa0NBQWtDO0FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNyQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUM7SUFDM0MsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QixJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztLQUNuRCxDQUFDLENBQUM7Q0FDSixDQUFDLENBQUMsQ0FBQztBQUVKLGtEQUFnRjtBQUNoRix5Q0FBcUM7QUFFckMsTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFFbkMsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUM7QUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7QUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUV4Qzs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxJQUFjLEVBQUUsT0FBTyxHQUFHLFNBQVM7SUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBZ0IsRUFBRSxFQUFFO1FBQ2xELElBQUksT0FBTyxZQUFZLGdDQUFvQixFQUFFLENBQUM7WUFDNUMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUM5RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxPQUFPLFlBQVksZ0NBQW9CLEVBQUUsQ0FBQztZQUM1QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELGFBQWE7UUFDYixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLEtBQWlCO0lBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtRQUNsRCxJQUFJLE9BQU8sWUFBWSxnQ0FBb0IsRUFBRSxDQUFDO1lBQzVDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7WUFDOUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDckIsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDM0MsR0FBRztvQkFDSCxZQUFZLEVBQUUsT0FBTztpQkFDdEIsQ0FBQyxDQUFDO2dCQUNILHFCQUFxQixFQUNuQixLQUFLLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzdELENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLE9BQU8sWUFBWSxnQ0FBb0IsRUFBRSxDQUFDO1lBQzVDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsYUFBYTtRQUNiLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUksSUFBK0I7SUFDdEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1NBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQztTQUMzQixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQWdCLEVBQUUsQ0FBQyxPQUFPLFlBQVksSUFBSSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELFNBQVMsWUFBWTtJQUNuQixPQUFPLFlBQVksQ0FBQyxnQ0FBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FDM0MsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUNsQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsV0FBVztJQUNsQixPQUFPLFlBQVksQ0FBQyxnQ0FBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQzVELENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQWEsQ0FBQyxDQUNsRSxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLFNBQWtCO0lBQy9CLE9BQU8sSUFBQSxrQkFBTyxFQUFDO1FBQ2IsVUFBVSxFQUFFLE1BQU07UUFDbEIsY0FBYyxFQUFFLGdCQUFnQjtRQUNoQyxLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVM7S0FDVixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDdkIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSCw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLGlEQUFpRDtJQUNqRCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDcEQsa0JBQWtCLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7UUFFckQsTUFBTSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFeEIsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztJQUVILDJFQUEyRTtJQUMzRSwyQkFBMkI7SUFDM0IsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2xELGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXZCLE1BQU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXhCLDRFQUE0RTtRQUM1RSwwQ0FBMEM7UUFDMUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV2QixNQUFNLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV4QixNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0lBRUgsdUVBQXVFO0lBQ3ZFLG1FQUFtRTtJQUNuRSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO1FBQ3RCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztLQUNkLENBQUMsQ0FBQyw4Q0FBOEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzFFLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXZCLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBCLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDN0Qsa0JBQWtCLENBQUM7WUFDakIsOEJBQThCO1lBQzlCLHNCQUFzQjtTQUN2QixDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV4QixNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkMsOEJBQThCO1lBQzlCLHNCQUFzQjtTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMzRCxrQkFBa0IsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUU5RCxNQUFNLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV4QixNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxxREFBcUQ7SUFDckQsMEVBQTBFO0lBQzFFLHdFQUF3RTtJQUN4RSw2RUFBNkU7SUFDN0UsNEJBQTRCO0lBQzVCLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDTixDQUFDLGtCQUFrQixFQUFFLFdBQVcsQ0FBQztRQUNqQyxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQztRQUNoQyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7S0FDdkIsQ0FBQyxDQUFDLG1DQUFtQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDL0Qsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdkIsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEIsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1FBQzFCLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzRCx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV0RSxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVqQixNQUFNLENBQ0osWUFBWSxDQUFDLGdDQUFvQixDQUFDLENBQUMsR0FBRyxDQUNwQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FDN0MsQ0FDRixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ25DLFVBQVU7Z0JBQ1YsWUFBWTtnQkFDWixVQUFVO2FBQ1gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCw2RUFBNkU7UUFDN0UsdUVBQXVFO1FBQ3ZFLDBFQUEwRTtRQUMxRSw2RUFBNkU7UUFDN0UsNkVBQTZFO1FBQzdFLDBDQUEwQztRQUMxQyxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdkUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRELE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWpCLE1BQU0sQ0FBQyxZQUFZLENBQUMsZ0NBQW9CLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbi8vIE9ubHkgdGhlIGNsaWVudCBpcyBtb2NrZWQ7IHRoZSBjb21tYW5kIGNsYXNzZXMgc3RheSByZWFsIHNvIHRoYXQgYXNzZXJ0aW9uc1xuLy8gY2FuIHJlYWQgYGNvbW1hbmQuaW5wdXRgLiBgc2VuZGAgaXMgbG9va2VkIHVwIHRocm91Z2ggdGhlIGhvbGRlciBhdCBjYWxsIHRpbWVcbi8vIGJlY2F1c2UgYHBydW5lLXMzYCBjb25zdHJ1Y3RzIGl0cyBjbGllbnQgYXQgbW9kdWxlIHNjb3BlLCBiZWZvcmUgdGhlIG1vY2tcbi8vIHZhcmlhYmxlcyBoZXJlIGFyZSBpbml0aWFsaXplZC5cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiLCAoKSA9PiAoe1xuICAuLi5qZXN0LnJlcXVpcmVBY3R1YWwoXCJAYXdzLXNkay9jbGllbnQtczNcIiksXG4gIFMzQ2xpZW50OiBqZXN0LmZuKCgpID0+ICh7XG4gICAgc2VuZDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gaG9sZGVyLnNlbmQoLi4uYXJncyksXG4gIH0pKSxcbn0pKTtcblxuaW1wb3J0IHsgTGlzdE9iamVjdHNWMkNvbW1hbmQsIERlbGV0ZU9iamVjdHNDb21tYW5kIH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHsgcHJ1bmVTMyB9IGZyb20gXCIuL3BydW5lLXMzXCI7XG5cbmNvbnN0IGhvbGRlciA9IHsgc2VuZDogamVzdC5mbigpIH07XG5cbmNvbnN0IEJVQ0tFVCA9IFwibXktc3RhdGljLWFzc2V0c1wiO1xuY29uc3QgQ1VSUkVOVF9CVUlMRF9JRCA9IFwiYnVpbGQtMlwiO1xuY29uc3QgTVNfVFRMID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIDMwO1xuXG4vKipcbiAqIE9uZSBwYWdlIG9mIGxpc3RlZCBvYmplY3RzLCBhbGwgb2xkIGVub3VnaCB0byBwcnVuZSBhbmQgZWFjaCBjYXJyeWluZyBhIHN0YWxlXG4gKiBidWlsZCBpZCwgc28gZXZlcnkgb25lIG9mIHRoZW0gaXMgYSBkZWxldGlvbiBjYW5kaWRhdGUuIFRoYXQgaXNvbGF0ZXMgdGhlXG4gKiBxdWVzdGlvbiB0aGlzIHN1aXRlIGlzIGFib3V0OiB3aGljaCBrZXlzIGBwcnVuZVMzYCB3YXMgZXZlciBzaG93bi5cbiAqL1xuZnVuY3Rpb24gc3R1YkJ1Y2tldENvbnRlbnRzKGtleXM6IHN0cmluZ1tdLCBidWlsZElkID0gXCJidWlsZC0xXCIpOiB2b2lkIHtcbiAgY29uc3QgbG9uZ0FnbyA9IG5ldyBEYXRlKERhdGUubm93KCkgLSBNU19UVEwgKiAyKTtcbiAgaG9sZGVyLnNlbmQubW9ja0ltcGxlbWVudGF0aW9uKChjb21tYW5kOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBMaXN0T2JqZWN0c1YyQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIENvbnRlbnRzOiBrZXlzLm1hcCgoS2V5KSA9PiAoeyBLZXksIExhc3RNb2RpZmllZDogbG9uZ0FnbyB9KSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBEZWxldGVPYmplY3RzQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgfVxuICAgIC8vIEhlYWRPYmplY3RcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgTWV0YWRhdGE6IHsgXCJuZXh0LWJ1aWxkLWlkXCI6IGJ1aWxkSWQgfSB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2V2ZXJhbCBwYWdlcyBvZiBsaXN0ZWQgb2JqZWN0cywga2V5ZWQgYnkgdGhlIGNvbnRpbnVhdGlvbiB0b2tlbiB0aGF0IGFza3MgZm9yXG4gKiBlYWNoIG9uZSwgc28gdGhlIHN1aXRlIGNhbiBhc3NlcnQgaG93IGBwcnVuZVMzYCB3YWxrcyBhIHBhZ2luYXRlZCBsaXN0aW5nLiBUaGVcbiAqIGxhc3QgcGFnZSBkZWxpYmVyYXRlbHkgY2FycmllcyBubyBOZXh0Q29udGludWF0aW9uVG9rZW4sIGFzIFMzIHJldHVybnMgaXQuXG4gKi9cbmZ1bmN0aW9uIHN0dWJQYWdlZEJ1Y2tldENvbnRlbnRzKHBhZ2VzOiBzdHJpbmdbXVtdKTogdm9pZCB7XG4gIGNvbnN0IGxvbmdBZ28gPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gTVNfVFRMICogMik7XG4gIGhvbGRlci5zZW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoY29tbWFuZDogdW5rbm93bikgPT4ge1xuICAgIGlmIChjb21tYW5kIGluc3RhbmNlb2YgTGlzdE9iamVjdHNWMkNvbW1hbmQpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gY29tbWFuZC5pbnB1dC5Db250aW51YXRpb25Ub2tlbjtcbiAgICAgIGNvbnN0IGluZGV4ID0gdG9rZW4gPyBOdW1iZXIodG9rZW4ucmVwbGFjZShcInBhZ2UtXCIsIFwiXCIpKSA6IDA7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgQ29udGVudHM6IChwYWdlc1tpbmRleF0gPz8gW10pLm1hcCgoS2V5KSA9PiAoe1xuICAgICAgICAgIEtleSxcbiAgICAgICAgICBMYXN0TW9kaWZpZWQ6IGxvbmdBZ28sXG4gICAgICAgIH0pKSxcbiAgICAgICAgTmV4dENvbnRpbnVhdGlvblRva2VuOlxuICAgICAgICAgIGluZGV4ICsgMSA8IHBhZ2VzLmxlbmd0aCA/IGBwYWdlLSR7aW5kZXggKyAxfWAgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBEZWxldGVPYmplY3RzQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgfVxuICAgIC8vIEhlYWRPYmplY3RcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgTWV0YWRhdGE6IHsgXCJuZXh0LWJ1aWxkLWlkXCI6IFwiYnVpbGQtMVwiIH0gfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZW50Q29tbWFuZHM8VD4odHlwZTogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCk6IFRbXSB7XG4gIHJldHVybiBob2xkZXIuc2VuZC5tb2NrLmNhbGxzXG4gICAgLm1hcCgoW2NvbW1hbmRdKSA9PiBjb21tYW5kKVxuICAgIC5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIFQgPT4gY29tbWFuZCBpbnN0YW5jZW9mIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBsaXN0UHJlZml4ZXMoKTogKHN0cmluZyB8IHVuZGVmaW5lZClbXSB7XG4gIHJldHVybiBzZW50Q29tbWFuZHMoTGlzdE9iamVjdHNWMkNvbW1hbmQpLm1hcChcbiAgICAoY29tbWFuZCkgPT4gY29tbWFuZC5pbnB1dC5QcmVmaXgsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZWRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHNlbnRDb21tYW5kcyhEZWxldGVPYmplY3RzQ29tbWFuZCkuZmxhdE1hcCgoY29tbWFuZCkgPT5cbiAgICAoY29tbWFuZC5pbnB1dC5EZWxldGU/Lk9iamVjdHMgPz8gW10pLm1hcCgobykgPT4gby5LZXkgYXMgc3RyaW5nKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcHJ1bmUoa2V5UHJlZml4Pzogc3RyaW5nKSB7XG4gIHJldHVybiBwcnVuZVMzKHtcbiAgICBidWNrZXROYW1lOiBCVUNLRVQsXG4gICAgY3VycmVudEJ1aWxkSWQ6IENVUlJFTlRfQlVJTERfSUQsXG4gICAgbXNUdGw6IE1TX1RUTCxcbiAgICBrZXlQcmVmaXgsXG4gIH0pO1xufVxuXG5kZXNjcmliZShcInBydW5lUzNcIiwgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBob2xkZXIuc2VuZC5tb2NrUmVzZXQoKTtcbiAgfSk7XG5cbiAgLy8gV2l0aG91dCBhIFByZWZpeCwgcHJ1bmluZyB3YWxrcyB0aGUgd2hvbGUgYnVja2V0LiBUd28gYnJhbmNoZXMgc2hhcmluZyBvbmVcbiAgLy8gYnVja2V0IHVuZGVyIGRpZmZlcmVudCBiYXNlUGF0aHMgd291bGQgdGhlbiBkZWxldGUgZWFjaCBvdGhlcidzIGFzc2V0cyBvbmNlXG4gIC8vIHRoZXkgYWdlZCBwYXN0IG1zVHRsLCA0MDRpbmcgdGhlIG90aGVyIGJyYW5jaC5cbiAgaXQoXCJzY29wZXMgdGhlIGxpc3RpbmcgdG8gdGhlIGtleSBwcmVmaXhcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHN0dWJCdWNrZXRDb250ZW50cyhbXCJicmFuY2gtYS9fbmV4dC9zdGF0aWMvb2xkLmpzXCJdKTtcblxuICAgIGF3YWl0IHBydW5lKFwiYnJhbmNoLWFcIik7XG5cbiAgICBleHBlY3QobGlzdFByZWZpeGVzKCkpLnRvRXF1YWwoW1wiYnJhbmNoLWEvXCJdKTtcbiAgfSk7XG5cbiAgLy8gQSBiYXJlIFwiYnJhbmNoLWFcIiBwcmVmaXggYWxzbyBtYXRjaGVzIFwiYnJhbmNoLWEtc3RhZ2luZy8uLi5cIiwgd2hpY2ggaXMgYVxuICAvLyBkaWZmZXJlbnQgYXBwJ3Mgb2JqZWN0cy5cbiAgaXQoXCJ0ZXJtaW5hdGVzIHRoZSBwcmVmaXggd2l0aCBhIHNsYXNoXCIsIGFzeW5jICgpID0+IHtcbiAgICBzdHViQnVja2V0Q29udGVudHMoW10pO1xuXG4gICAgYXdhaXQgcHJ1bmUoXCJicmFuY2gtYVwiKTtcblxuICAgIC8vIEFzc2VydGVkIGFzIGFuIGV4YWN0IHZhbHVlOiBhIGJhcmUgXCJicmFuY2gtYVwiLCBhbmQgYW4gYWJzZW50IHByZWZpeCwgYm90aFxuICAgIC8vIHJlYWNoIG9iamVjdHMgYmVsb25naW5nIHRvIGFub3RoZXIgYXBwLlxuICAgIGV4cGVjdChsaXN0UHJlZml4ZXMoKSkudG9FcXVhbChbXCJicmFuY2gtYS9cIl0pO1xuICB9KTtcblxuICBpdChcInRha2VzIGEgbmVzdGVkIHByZWZpeCBhcyBOZXh0anNTdGF0aWNBc3NldHMgcmVzb2x2ZWQgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHN0dWJCdWNrZXRDb250ZW50cyhbXSk7XG5cbiAgICBhd2FpdCBwcnVuZShcInRlYW0vYXBwXCIpO1xuXG4gICAgZXhwZWN0KGxpc3RQcmVmaXhlcygpKS50b0VxdWFsKFtcInRlYW0vYXBwL1wiXSk7XG4gIH0pO1xuXG4gIC8vIFRoZSBzaW5nbGUtYXBwIGNhc2UsIGFuZCBldmVyeSBkZXBsb3ltZW50IHByZWRhdGluZyB0aGUgcHJlZml4IGJlaW5nXG4gIC8vIHRocmVhZGVkIHRocm91Z2g6IGFuIHVuc2V0IHByZWZpeCBzdGlsbCBwcnVuZXMgdGhlIHdob2xlIGJ1Y2tldC5cbiAgaXQuZWFjaChbXG4gICAgW1wib21pdHRlZFwiLCB1bmRlZmluZWRdLFxuICAgIFtcImVtcHR5XCIsIFwiXCJdLFxuICBdKShcImxpc3RzIHRoZSB3aG9sZSBidWNrZXQgd2hlbiB0aGUgcHJlZml4IGlzICVzXCIsIGFzeW5jIChfbGFiZWwsIHByZWZpeCkgPT4ge1xuICAgIHN0dWJCdWNrZXRDb250ZW50cyhbXSk7XG5cbiAgICBhd2FpdCBwcnVuZShwcmVmaXgpO1xuXG4gICAgZXhwZWN0KGxpc3RQcmVmaXhlcygpKS50b0VxdWFsKFt1bmRlZmluZWRdKTtcbiAgfSk7XG5cbiAgaXQoXCJzdGlsbCBkZWxldGVzIHN0YWxlIG9iamVjdHMgd2l0aGluIHRoZSBwcmVmaXhcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHN0dWJCdWNrZXRDb250ZW50cyhbXG4gICAgICBcImJyYW5jaC1hL19uZXh0L3N0YXRpYy9vbGQuanNcIixcbiAgICAgIFwiYnJhbmNoLWEvZmF2aWNvbi5pY29cIixcbiAgICBdKTtcblxuICAgIGF3YWl0IHBydW5lKFwiYnJhbmNoLWFcIik7XG5cbiAgICBleHBlY3QoZGVsZXRlZEtleXMoKS5zb3J0KCkpLnRvRXF1YWwoW1xuICAgICAgXCJicmFuY2gtYS9fbmV4dC9zdGF0aWMvb2xkLmpzXCIsXG4gICAgICBcImJyYW5jaC1hL2Zhdmljb24uaWNvXCIsXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgb2JqZWN0cyBjYXJyeWluZyB0aGUgY3VycmVudCBidWlsZCBpZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgc3R1YkJ1Y2tldENvbnRlbnRzKFtcImJyYW5jaC1hL2N1cnJlbnQuanNcIl0sIENVUlJFTlRfQlVJTERfSUQpO1xuXG4gICAgYXdhaXQgcHJ1bmUoXCJicmFuY2gtYVwiKTtcblxuICAgIGV4cGVjdChkZWxldGVkS2V5cygpKS50b0VxdWFsKFtdKTtcbiAgfSk7XG5cbiAgLy8gVGhlIGNvbnN0cnVjdCBhbHdheXMgaGFuZHMgb3ZlciBhIGJhcmUgcHJlZml4LCBidXRcbiAgLy8gYG92ZXJyaWRlcy5jdXN0b21SZXNvdXJjZVByb3BlcnRpZXMuc3RhdGljQXNzZXRzS2V5UHJlZml4YCByZWFjaGVzIHRoaXNcbiAgLy8gZGlyZWN0bHkuIFwiYmFzZS9cIiB3b3VsZCBidWlsZCBhIFByZWZpeCBvZiBcImJhc2UvL1wiIGFuZCBcIi9iYXNlXCIgb25lIG9mXG4gIC8vIFwiL2Jhc2UvXCIsIG5laXRoZXIgb2Ygd2hpY2ggbWF0Y2hlcyBhbnkga2V5LCBzbyBwcnVuaW5nIHdvdWxkIHNpbGVudGx5IHN0b3BcbiAgLy8gZGVsZXRpbmcgYW55dGhpbmcgYXQgYWxsLlxuICBpdC5lYWNoKFtcbiAgICBbXCJhIHRyYWlsaW5nIHNsYXNoXCIsIFwiYnJhbmNoLWEvXCJdLFxuICAgIFtcImEgbGVhZGluZyBzbGFzaFwiLCBcIi9icmFuY2gtYVwiXSxcbiAgICBbXCJib3RoXCIsIFwiL2JyYW5jaC1hL1wiXSxcbiAgXSkoXCJub3JtYWxpemVzIGEgcHJlZml4IGdpdmVuIHdpdGggJXNcIiwgYXN5bmMgKF9sYWJlbCwgcHJlZml4KSA9PiB7XG4gICAgc3R1YkJ1Y2tldENvbnRlbnRzKFtdKTtcblxuICAgIGF3YWl0IHBydW5lKHByZWZpeCk7XG5cbiAgICBleHBlY3QobGlzdFByZWZpeGVzKCkpLnRvRXF1YWwoW1wiYnJhbmNoLWEvXCJdKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJwYWdpbmF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcImZvbGxvd3MgdGhlIGNvbnRpbnVhdGlvbiB0b2tlbiBhY3Jvc3MgcGFnZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgc3R1YlBhZ2VkQnVja2V0Q29udGVudHMoW1tcImEvb25lLmpzXCJdLCBbXCJhL3R3by5qc1wiXSwgW1wiYS90aHJlZS5qc1wiXV0pO1xuXG4gICAgICBhd2FpdCBwcnVuZShcImFcIik7XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2VudENvbW1hbmRzKExpc3RPYmplY3RzVjJDb21tYW5kKS5tYXAoXG4gICAgICAgICAgKGNvbW1hbmQpID0+IGNvbW1hbmQuaW5wdXQuQ29udGludWF0aW9uVG9rZW4sXG4gICAgICAgICksXG4gICAgICApLnRvRXF1YWwoW3VuZGVmaW5lZCwgXCJwYWdlLTFcIiwgXCJwYWdlLTJcIl0pO1xuICAgICAgZXhwZWN0KGRlbGV0ZWRLZXlzKCkuc29ydCgpKS50b0VxdWFsKFtcbiAgICAgICAgXCJhL29uZS5qc1wiLFxuICAgICAgICBcImEvdGhyZWUuanNcIixcbiAgICAgICAgXCJhL3R3by5qc1wiLFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgbGFzdCBwYWdlIGNhcnJpZXMgbm8gTmV4dENvbnRpbnVhdGlvblRva2VuLiBIb2xkaW5nIG9uIHRvIHRoZSBwcmV2aW91c1xuICAgIC8vIHBhZ2UncyB0b2tlbiByZS1saXN0cyB0aGF0IHBhZ2UgdW50aWwgdGhlIDEwMC1pdGVyYXRpb24gZ3VhcmQgdHJpcHMsXG4gICAgLy8gcmUtSEVBRGluZyBldmVyeSBvYmplY3Qgb24gaXQgMTAwIHRpbWVzIG92ZXIgKH4xMDBrIHJlcXVlc3RzIGZvciBhIGZ1bGxcbiAgICAvLyAxMDAwLWtleSBwYWdlKSBhbmQgcHVzaGluZyBkdXBsaWNhdGUga2V5cyBpbnRvIHRoZSBkZWxldGUgYmF0Y2hlcyDigJQgZW5vdWdoXG4gICAgLy8gdG8gYmxvdyB0aGUgcG9zdC1kZXBsb3kgTGFtYmRhJ3MgdGltZW91dCwgd2hpY2ggbGVhdmVzIHRoZSBjdXN0b20gcmVzb3VyY2VcbiAgICAvLyB3YWl0aW5nIG9uIGEgcmVzcG9uc2UgdGhhdCBuZXZlciBjb21lcy5cbiAgICBpdChcInN0b3BzIGxpc3Rpbmcgb25jZSBhIHBhZ2UgcmV0dXJucyBubyBjb250aW51YXRpb24gdG9rZW5cIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgc3R1YlBhZ2VkQnVja2V0Q29udGVudHMoW1tcImEvb25lLmpzXCJdLCBbXCJhL3R3by5qc1wiXV0pO1xuXG4gICAgICBhd2FpdCBwcnVuZShcImFcIik7XG5cbiAgICAgIGV4cGVjdChzZW50Q29tbWFuZHMoTGlzdE9iamVjdHNWMkNvbW1hbmQpKS50b0hhdmVMZW5ndGgoMik7XG4gICAgICBleHBlY3QoZGVsZXRlZEtleXMoKSkudG9FcXVhbChbXCJhL29uZS5qc1wiLCBcImEvdHdvLmpzXCJdKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
package/lib/nextjs-api.d.ts
CHANGED
|
@@ -89,6 +89,11 @@ export declare class NextjsApi extends Construct {
|
|
|
89
89
|
private createRestApi;
|
|
90
90
|
/**
|
|
91
91
|
* Create base resource path if needed. Important if `basePath` is set.
|
|
92
|
+
*
|
|
93
|
+
* A nested `basePath` ("/team/app") has to become one resource per segment:
|
|
94
|
+
* API Gateway path parts can't contain "/", so passing the whole thing to a
|
|
95
|
+
* single `addResource` fails validation at synth. `resolveBasePath` accepts
|
|
96
|
+
* nested values, so this is reachable.
|
|
92
97
|
*/
|
|
93
98
|
private createBaseResource;
|
|
94
99
|
private createStaticIntegrationRole;
|
package/lib/nextjs-api.js
CHANGED
|
@@ -11,7 +11,7 @@ const base_path_1 = require("./utils/base-path");
|
|
|
11
11
|
* Creates an API Gateway REST API for Next.js applications
|
|
12
12
|
*/
|
|
13
13
|
class NextjsApi extends constructs_1.Construct {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.6.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.6.2" };
|
|
15
15
|
/**
|
|
16
16
|
* The API Gateway REST API
|
|
17
17
|
*/
|
|
@@ -81,11 +81,21 @@ class NextjsApi extends constructs_1.Construct {
|
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
83
83
|
* Create base resource path if needed. Important if `basePath` is set.
|
|
84
|
+
*
|
|
85
|
+
* A nested `basePath` ("/team/app") has to become one resource per segment:
|
|
86
|
+
* API Gateway path parts can't contain "/", so passing the whole thing to a
|
|
87
|
+
* single `addResource` fails validation at synth. `resolveBasePath` accepts
|
|
88
|
+
* nested values, so this is reachable.
|
|
84
89
|
*/
|
|
85
90
|
createBaseResource(basePath) {
|
|
86
91
|
// Create base resource path if needed
|
|
87
92
|
const normalized = (0, base_path_1.normalizeBasePath)(basePath);
|
|
88
|
-
|
|
93
|
+
if (!normalized) {
|
|
94
|
+
return this.api.root;
|
|
95
|
+
}
|
|
96
|
+
return normalized
|
|
97
|
+
.split("/")
|
|
98
|
+
.reduce((parent, segment) => parent.addResource(segment), this.api.root);
|
|
89
99
|
}
|
|
90
100
|
createStaticIntegrationRole() {
|
|
91
101
|
// Create S3 integration role
|
|
@@ -229,4 +239,4 @@ class NextjsApi extends constructs_1.Construct {
|
|
|
229
239
|
}
|
|
230
240
|
}
|
|
231
241
|
exports.NextjsApi = NextjsApi;
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBMEM7QUFDMUMsK0RBWW9DO0FBRXBDLGlEQUs2QjtBQUc3QiwyQ0FBdUM7QUFFdkMsaURBQWdFO0FBOERoRTs7R0FFRztBQUNILE1BQWEsU0FBVSxTQUFRLHNCQUFTOztJQUN0Qzs7T0FFRztJQUNhLEdBQUcsQ0FBVTtJQUU3Qjs7Ozs7Ozs7T0FRRztJQUNILElBQUksR0FBRztRQUNMLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3pDLHdFQUF3RTtRQUN4RSxvRUFBb0U7UUFDcEUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxZQUFZO1lBQ25DLENBQUMsQ0FBQztnQkFDRSxXQUFXLFlBQVksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUTthQUN6RDtZQUNILENBQUMsQ0FBQztnQkFDRSxXQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxnQkFBZ0IsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxnQkFBZ0I7Z0JBQ2xGLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVM7YUFDbkMsQ0FBQztRQUNOLE9BQU8sSUFBQSxvQkFBUSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRWdCLFlBQVksQ0FBWTtJQUN4QixZQUFZLENBQVk7SUFDeEIsS0FBSyxDQUFpQjtJQUMvQixxQkFBcUIsQ0FBUTtJQUVyQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFB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QUNLLHdCQUF3QixDQUFDLGNBQXlCO1FBQ3hELHdEQUF3RDtRQUN4RCxNQUFNLG9CQUFvQixHQUFHLElBQUksa0NBQWlCLENBQUMsY0FBYyxFQUFFO1lBQ2pFLG9CQUFvQixFQUFFLHFDQUFvQixDQUFDLE1BQU07WUFDakQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx1QkFBdUI7U0FDakQsQ0FBQyxDQUFDO1FBRUgsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDdkQsQ0FBQzs7QUF2UEgsOEJBd1BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2l6ZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIFJlc3RBcGksXG4gIExhbWJkYUludGVncmF0aW9uLFxuICBBd3NJbnRlZ3JhdGlvbixcbiAgTWV0aG9kT3B0aW9ucyxcbiAgSVJlc291cmNlLFxuICBFbmRwb2ludFR5cGUsXG4gIFJlc3RBcGlQcm9wcyxcbiAgQXdzSW50ZWdyYXRpb25Qcm9wcyxcbiAgTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zLFxuICBQYXNzdGhyb3VnaEJlaGF2aW9yLFxuICBSZXNwb25zZVRyYW5zZmVyTW9kZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5XCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIFJvbGUsXG4gIFNlcnZpY2VQcmluY2lwYWwsXG4gIFBvbGljeVN0YXRlbWVudCxcbiAgSVJvbGUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBJRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBQdWJsaWNEaXJFbnRyeSB9IGZyb20gXCIuL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGRcIjtcbmltcG9ydCB7IGpvaW5QYXRoLCBub3JtYWxpemVCYXNlUGF0aCB9IGZyb20gXCIuL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0FwaU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IHJlc3RBcGlQcm9wcz86IFJlc3RBcGlQcm9wcztcbiAgcmVhZG9ubHkgc3RhdGljSW50ZWdyYXRpb25Qcm9wcz86IEF3c0ludGVncmF0aW9uUHJvcHM7XG4gIHJlYWRvbmx5IHMzTWV0aG9kT3B0aW9ucz86IE1ldGhvZE9wdGlvbnM7XG4gIHJlYWRvbmx5IGR5bmFtaWNJbnRlZ3JhdGlvblByb3BzPzogTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zO1xuICByZWFkb25seSBpbWFnZUludGVncmF0aW9uUHJvcHM/OiBMYW1iZGFJbnRlZ3JhdGlvbk9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXBpUHJvcHMge1xuICAvKipcbiAgICogT3B0aW9uYWwgYmFzZSBwYXRoIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0FwaU92ZXJyaWRlcztcbiAgLyoqXG4gICAqIFBhdGggdG8gZGlyZWN0b3J5IG9mIE5leHQuanMgYXBwJ3MgcHVibGljIGRpcmVjdG9yeS4gVXNlZCB0byBhZGQgcmVzb3VyY2VzXG4gICAqIHRvIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBwdWJsaWMgZGlyZWN0b3J5IHRvIGdvIGRpcmVjdGx5IHRvIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljRGlyRW50cmllczogUHVibGljRGlyRW50cnlbXTtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc2AuIFRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyRnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgaW1hZ2Ugb3B0aW1pemF0aW9uIExhbWJkYSBmb3IgdGhlIGBfbmV4dC9pbWFnZWAgcm91dGUuIFdoZW5cbiAgICogb21pdHRlZCwgbm8gYF9uZXh0L2ltYWdlYCByZXNvdXJjZSBpcyBjcmVhdGVkIGFuZCB0aG9zZSByZXF1ZXN0cyBmYWxsXG4gICAqIHRocm91Z2ggdG8gYHNlcnZlckZ1bmN0aW9uYCB2aWEgdGhlIGB7cHJveHkrfWAgY2F0Y2gtYWxsLlxuICAgKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbWluZyAoYXMgdGhlXG4gICAqIGRlZGljYXRlZCBpbWFnZSBMYW1iZGEgdGhpcyBwYWNrYWdlIGJ1aWxkcyBkb2VzKSBhbmQgaXMgaW52b2tlZCB3aXRoXG4gICAqIGBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU1gIGFjY29yZGluZ2x5LiBJZiB5b3Ugc3VwcGx5IGEgY3VzdG9tXG4gICAqIGBpbWFnZUZ1bmN0aW9uYCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBzdHJlYW1pbmcsIG92ZXJyaWRlXG4gICAqIGByZXNwb25zZVRyYW5zZmVyTW9kZWAgdG8gYEJVRkZFUkVEYCB2aWEgYG92ZXJyaWRlcy5pbWFnZUludGVncmF0aW9uUHJvcHNgLFxuICAgKiBvdGhlcndpc2UgQVBJIEdhdGV3YXkgcmV0dXJucyBhIDUwMi5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlRnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0OiBJQnVja2V0O1xuICAvKipcbiAgICogUzMga2V5IHByZWZpeCB0aGUgc3RhdGljIGFzc2V0cyB3ZXJlIHVwbG9hZGVkIHVuZGVyLCBpLmUuXG4gICAqIGBOZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4YCwgd2hpY2ggbmFtZXNwYWNlcyBhIHNoYXJlZCBidWNrZXQuXG4gICAqXG4gICAqIEluZGVwZW5kZW50IG9mIGBiYXNlUGF0aGAgYWJvdmU6IHRoYXQgb25lIGlzIHRoZSBVUkwgcHJlZml4IHRoZSBSRVNUIEFQSVxuICAgKiBzZXJ2ZXMgdGhlIGFwcCBhdCAoY29tbW9ubHkgdGhlIEFQSSBHYXRld2F5IHN0YWdlKSwgd2hpbGUgdGhpcyBvbmUgaXMgd2hlcmVcbiAgICogdGhlIG9iamVjdHMgbGl2ZSBpbiB0aGUgYnVja2V0LiBgX25leHQvc3RhdGljYCBhbmQgcHVibGljIGRpcmVjdG9yeVxuICAgKiByZXF1ZXN0cyBhcmUgbWFwcGVkIHRvIFMzIGtleXMgZGlyZWN0bHksIHNvIHRoZXkgNDA0IHVubGVzcyB0aGlzIHByZWZpeCBpc1xuICAgKiBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzS2V5UHJlZml4Pzogc3RyaW5nO1xuICAvKipcbiAgICogW0Z1dHVyZV0gUmVxdWlyZWQgaWYgYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2AuIFZQQyB0byBjcmVhdGUgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBOZXh0LmpzIGFwcGxpY2F0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQXBpIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaTogUmVzdEFwaTtcblxuICAvKipcbiAgICogUHVibGljIFVSTCBvZiB0aGUgYXBwLCBpbmNsdWRpbmcgZXZlcnkgcGF0aCBzZWdtZW50IHRoZSBBUEkgbmVzdHMgaXQgdW5kZXIuXG4gICAqIFByZWZlcnMgYSBjdXN0b20gZG9tYWluIGNvbmZpZ3VyZWQgdGhyb3VnaCBgb3ZlcnJpZGVzLnJlc3RBcGlQcm9wcy5kb21haW5OYW1lYFxuICAgKiBvdmVyIHRoZSBleGVjdXRlLWFwaSBlbmRwb2ludC5cbiAgICpcbiAgICogQSBkb21haW4gYXR0YWNoZWQgYWZ0ZXIgdGhpcyBjb25zdHJ1Y3QgaXMgY3JlYXRlZCAoYGFwaS5hZGREb21haW5OYW1lKClgKSBpc1xuICAgKiBzdGlsbCB1c2VkIGZvciB0aGUgaG9zdCwgYnV0IENESyBrZWVwcyBpdHMgYmFzZSBwYXRoIG1hcHBpbmdzIHByaXZhdGUsIHNvIGFcbiAgICogbWFwcGluZyBhZGRlZCB0aGF0IHdheSB3b24ndCBzaG93IHVwIGhlcmUuXG4gICAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY3VzdG9tRG9tYWluID0gdGhpcy5hcGkuZG9tYWluTmFtZTtcbiAgICAvLyBBIGN1c3RvbSBkb21haW4gcmVhY2hlcyB0aGUgc3RhZ2UgdGhyb3VnaCBhIGJhc2UgcGF0aCBtYXBwaW5nLCBzbyB0aGVcbiAgICAvLyBzdGFnZSBuYW1lIGlzbid0IGluIHRoZSBwYXRoIHRoZXJlOyB0aGUgbWFwcGluZyBtYXkgYmUsIHdoZW4gc2V0LlxuICAgIGNvbnN0IFtvcmlnaW4sIHByZWZpeF0gPSBjdXN0b21Eb21haW5cbiAgICAgID8gW1xuICAgICAgICAgIGBodHRwczovLyR7Y3VzdG9tRG9tYWluLmRvbWFpbk5hbWV9YCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8ucmVzdEFwaVByb3BzPy5kb21haW5OYW1lPy5iYXNlUGF0aCxcbiAgICAgICAgXVxuICAgICAgOiBbXG4gICAgICAgICAgYGh0dHBzOi8vJHt0aGlzLmFwaS5yZXN0QXBpSWR9LmV4ZWN1dGUtYXBpLiR7U3RhY2sub2YodGhpcykucmVnaW9ufS5hbWF6b25hd3MuY29tYCxcbiAgICAgICAgICB0aGlzLmFwaS5kZXBsb3ltZW50U3RhZ2Uuc3RhZ2VOYW1lLFxuICAgICAgICBdO1xuICAgIHJldHVybiBqb2luUGF0aChvcmlnaW4sIHByZWZpeCwgdGhpcy5wcm9wcy5iYXNlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VSZXNvdXJjZTogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHRSZXNvdXJjZTogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBOZXh0anNBcGlQcm9wcztcbiAgcHJpdmF0ZSBzdGF0aWNJbnRlZ3JhdGlvblJvbGU6IElSb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcbiAgICB0aGlzLmFwaSA9IHRoaXMuY3JlYXRlUmVzdEFwaSgpO1xuICAgIHRoaXMuYmFzZVJlc291cmNlID0gdGhpcy5jcmVhdGVCYXNlUmVzb3VyY2UocHJvcHMuYmFzZVBhdGgpO1xuICAgIHRoaXMubmV4dFJlc291cmNlID0gdGhpcy5iYXNlUmVzb3VyY2UuYWRkUmVzb3VyY2UoXCJfbmV4dFwiKTtcbiAgICB0aGlzLnN0YXRpY0ludGVncmF0aW9uUm9sZSA9IHRoaXMuY3JlYXRlU3RhdGljSW50ZWdyYXRpb25Sb2xlKCk7XG4gICAgdGhpcy5jcmVhdGVTdGF0aWNJbnRlZ3JhdGlvbnMoKTtcbiAgICBpZiAocHJvcHMuc2VydmVyRnVuY3Rpb24pIHtcbiAgICAgIC8vIFdpdGhvdXQgYSBkZWRpY2F0ZWQgaW1hZ2UgZnVuY3Rpb24sIGBfbmV4dC9pbWFnZWAgZmFsbHMgdGhyb3VnaCB0byB0aGVcbiAgICAgIC8vIGB7cHJveHkrfWAgY2F0Y2gtYWxsIG9uIHRoZSBzZXJ2ZXIgZnVuY3Rpb24uXG4gICAgICBpZiAocHJvcHMuaW1hZ2VGdW5jdGlvbikge1xuICAgICAgICB0aGlzLmNyZWF0ZUltYWdlSW50ZWdyYXRpb24ocHJvcHMuaW1hZ2VGdW5jdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLmNyZWF0ZUR5bmFtaWNJbnRlZ3JhdGlvbihwcm9wcy5zZXJ2ZXJGdW5jdGlvbik7XG4gICAgfSBlbHNlIGlmIChwcm9wcy52cGMpIHtcbiAgICAgIC8vIFtGdXR1cmVdIGNyZWF0ZSBpbnRlZ3JhdGlvbiB3aXRoIEVDUyB2aWEgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogTmV4dGpzQXBpUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnNlcnZlckZ1bmN0aW9uICYmICFwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlcnZlckZ1bmN0aW9uIG9yIHZwYyBtdXN0IGJlIHNldCBpbiBOZXh0anNBcGlQcm9wc1wiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlc3RBcGkoKTogUmVzdEFwaSB7XG4gICAgcmV0dXJuIG5ldyBSZXN0QXBpKHRoaXMsIFwiUmVzdEFwaVwiLCB7XG4gICAgICBiaW5hcnlNZWRpYVR5cGVzOiBbXCIqLypcIl0sXG4gICAgICBkZXNjcmlwdGlvbjogYGNkay1uZXh0anMgUkVTVCBBUEkgZm9yICR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcbiAgICAgIG1pbkNvbXByZXNzaW9uU2l6ZTogU2l6ZS5ieXRlcygwKSwgLy8gY29tcHJlc3MgYWxsIHJlc3BvbnNlcyBmb3IgYmV0dGVyIHBlcmZcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5yZXN0QXBpUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGJhc2UgcmVzb3VyY2UgcGF0aCBpZiBuZWVkZWQuIEltcG9ydGFudCBpZiBgYmFzZVBhdGhgIGlzIHNldC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQmFzZVJlc291cmNlKGJhc2VQYXRoPzogc3RyaW5nKTogSVJlc291cmNlIHtcbiAgICAvLyBDcmVhdGUgYmFzZSByZXNvdXJjZSBwYXRoIGlmIG5lZWRlZFxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVCYXNlUGF0aChiYXNlUGF0aCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQgPyB0aGlzLmFwaS5yb290LmFkZFJlc291cmNlKG5vcm1hbGl6ZWQpIDogdGhpcy5hcGkucm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljSW50ZWdyYXRpb25Sb2xlKCkge1xuICAgIC8vIENyZWF0ZSBTMyBpbnRlZ3JhdGlvbiByb2xlXG4gICAgY29uc3Qgc3RhdGljSW50ZWdyYXRpb25Sb2xlID0gbmV3IFJvbGUodGhpcywgXCJTdGF0aWNJbnRlZ3JhdGlvblJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiKSxcbiAgICB9KTtcblxuICAgIHN0YXRpY0ludGVncmF0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzMzpHZXRPYmplY3RcIiwgXCJzMzpMaXN0QnVja2V0XCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXRBcm4sXG4gICAgICAgICAgYCR7dGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0QXJufS8qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHN0YXRpY0ludGVncmF0aW9uUm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljSW50ZWdyYXRpb25zKCkge1xuICAgIHRoaXMubmV4dFJlc291cmNlXG4gICAgICAuYWRkUmVzb3VyY2UoXCJzdGF0aWNcIilcbiAgICAgIC5hZGRSZXNvdXJjZShcIntwcm94eSt9XCIpXG4gICAgICAuYWRkTWV0aG9kKFxuICAgICAgICBcIkdFVFwiLFxuICAgICAgICB0aGlzLmNyZWF0ZVMzSW50ZWdyYXRpb24oeyBrZXk6IHRoaXMuczNLZXkoXCJfbmV4dC9zdGF0aWMve2tleX1cIikgfSksXG4gICAgICAgIHRoaXMuZ2V0U3RhdGljTWV0aG9kT3B0aW9ucyh7IHByb3h5OiB0cnVlIH0pLFxuICAgICAgKTtcbiAgICAvLyBhZGQgcHVibGljIGRpcmVjdG9yeSBmaWxlcy9kaXJlY3RvcmllcyB0aGF0IGV4aXN0IGF0IHRvcCBsZXZlbCBidXQgbmVlZCB0byBnbyB0byBTMy5cbiAgICBmb3IgKGNvbnN0IHB1YmxpY0RpckVudHJ5IG9mIHRoaXMucHJvcHMucHVibGljRGlyRW50cmllcykge1xuICAgICAgaWYgKHB1YmxpY0RpckVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIHRoaXMuYmFzZVJlc291cmNlXG4gICAgICAgICAgLmFkZFJlc291cmNlKHB1YmxpY0RpckVudHJ5Lm5hbWUpXG4gICAgICAgICAgLmFkZFJlc291cmNlKFwie3Byb3h5K31cIilcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7XG4gICAgICAgICAgICAgIGtleTogdGhpcy5zM0tleShgJHtwdWJsaWNEaXJFbnRyeS5uYW1lfS97a2V5fWApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eTogdHJ1ZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5iYXNlUmVzb3VyY2VcbiAgICAgICAgICAuYWRkUmVzb3VyY2UocHVibGljRGlyRW50cnkubmFtZSlcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleTogdGhpcy5zM0tleShwdWJsaWNEaXJFbnRyeS5uYW1lKSB9KSxcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RhdGljTWV0aG9kT3B0aW9ucygpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWZpeGVzIGEgcmVxdWVzdCBwYXRoIHdpdGggdGhlIGtleSBwcmVmaXggdGhlIGFzc2V0cyB3ZXJlIHVwbG9hZGVkIHVuZGVyLFxuICAgKiBzaW5jZSB0aGUgUzMgaW50ZWdyYXRpb25zIGFkZHJlc3Mgb2JqZWN0cyBieSBrZXkgcmF0aGVyIHRoYW4gYnkgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBzM0tleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW5QYXRoKHRoaXMucHJvcHMuc3RhdGljQXNzZXRzS2V5UHJlZml4LCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgQVBJIHJlcXVlc3QgdG8gUzMgcmVxdWVzdC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcmVzdC1hcGktcGFyYW1ldGVyLW1hcHBpbmctc291cmNlcy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2ludGVncmF0aW5nLWFwaS13aXRoLWF3cy1zZXJ2aWNlcy1zMy5odG1sI2FwaS1pdGVtcy1pbi1mb2xkZXItYXMtczMtb2JqZWN0cy1pbi1idWNrZXRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcbiAgICBjb25zdCBzM0ludGVncmF0aW9uID0gbmV3IEF3c0ludGVncmF0aW9uKHtcbiAgICAgIHNlcnZpY2U6IFwiczNcIixcbiAgICAgIGludGVncmF0aW9uSHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICAgIHBhdGg6IGAke3RoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9LyR7a2V5fWAsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGNyZWRlbnRpYWxzUm9sZTogdGhpcy5zdGF0aWNJbnRlZ3JhdGlvblJvbGUsXG4gICAgICAgIHBhc3N0aHJvdWdoQmVoYXZpb3I6IFBhc3N0aHJvdWdoQmVoYXZpb3IuV0hFTl9OT19URU1QTEFURVMsIC8vIHJlY29tbWVuZGVkXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiBrZXkuaW5jbHVkZXMoXCJ7a2V5fVwiKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlcXVlc3QucGF0aC5rZXlcIjogXCJtZXRob2QucmVxdWVzdC5wYXRoLnByb3h5XCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVncmF0aW9uUmVzcG9uc2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzQ29kZTogXCIyMDBcIixcbiAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LUxlbmd0aFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5DYWNoZS1Db250cm9sXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuRVRhZ1wiOiBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5FVGFnXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgICAgICBzZWxlY3Rpb25QYXR0ZXJuOiBcIjQwNFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0ludGVncmF0aW9uUHJvcHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHMzSW50ZWdyYXRpb247XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eSB9ID0geyBwcm94eTogZmFsc2UgfSk6IE1ldGhvZE9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyczogcHJveHlcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBcIm1ldGhvZC5yZXF1ZXN0LnBhdGgucHJveHlcIjogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgbWV0aG9kUmVzcG9uc2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBcIjIwMFwiLFxuICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtVHlwZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkVUYWdcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnMzTWV0aG9kT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIHRoZSBgX25leHQvaW1hZ2VgIHJvdXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUludGVncmF0aW9uKGltYWdlRnVuY3Rpb246IElGdW5jdGlvbikge1xuICAgIC8vIGltYWdlRnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSB0aGUgZGVkaWNhdGVkLCBzdHJlYW1pbmctY2FwYWJsZSBpbWFnZVxuICAgIC8vIExhbWJkYSAoc2VlIGl0cyBkb2MgY29tbWVudCk7IG92ZXJyaWRlIHJlc3BvbnNlVHJhbnNmZXJNb2RlIHZpYVxuICAgIC8vIGltYWdlSW50ZWdyYXRpb25Qcm9wcyBpZiB0aGF0IGFzc3VtcHRpb24gZG9lc24ndCBob2xkIGZvciBhIGN1c3RvbVxuICAgIC8vIGltYWdlRnVuY3Rpb24sIG90aGVyd2lzZSBBUEkgR2F0ZXdheSByZXR1cm5zIGEgNTAyLiBEZWxpYmVyYXRlbHlcbiAgICAvLyBkb2Vzbid0IGluaGVyaXQgZHluYW1pY0ludGVncmF0aW9uUHJvcHM6IHRoYXQncyBmb3Igc2VydmVyRnVuY3Rpb24sXG4gICAgLy8gYSBkaWZmZXJlbnQgTGFtYmRhIHdpdGggZGlmZmVyZW50IChhbmQgcG9zc2libHkgY29uZmxpY3RpbmcsIGUuZy5cbiAgICAvLyBCVUZGRVJFRCBmb3IgYSBub24tc3RyZWFtaW5nIExhbWJkYSBXZWIgQWRhcHRlciBzZXR1cCkgc3RyZWFtaW5nXG4gICAgLy8gcmVxdWlyZW1lbnRzIHRoYW4gdGhlIGFsd2F5cy1zdHJlYW1pbmcgZGVkaWNhdGVkIGltYWdlIExhbWJkYS5cbiAgICBjb25zdCBpbWFnZUludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKGltYWdlRnVuY3Rpb24sIHtcbiAgICAgIHJlc3BvbnNlVHJhbnNmZXJNb2RlOiBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uaW1hZ2VJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuICAgIGNvbnN0IGltYWdlUmVzb3VyY2UgPSB0aGlzLm5leHRSZXNvdXJjZS5hZGRSZXNvdXJjZShcImltYWdlXCIpO1xuICAgIGltYWdlUmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIGltYWdlSW50ZWdyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIGFsbCBvdGhlciByb3V0ZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0ludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uOiBJRnVuY3Rpb24pIHtcbiAgICAvLyBBbGwgb3RoZXIgcm91dGVzIHVzZSBzdHJlYW1pbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IHN0cmVhbWluZ0ludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uLCB7XG4gICAgICByZXNwb25zZVRyYW5zZmVyTW9kZTogUmVzcG9uc2VUcmFuc2Zlck1vZGUuU1RSRUFNLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGNhdGNoLWFsbCByb3V0ZXMgd2l0aCBzdHJlYW1pbmcgaW50ZWdyYXRpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgIHRoaXMuYmFzZVJlc291cmNlLmFkZE1ldGhvZChcIkFOWVwiLCBzdHJlYW1pbmdJbnRlZ3JhdGlvbik7XG4gICAgY29uc3QgcHJveHlSZXNvdXJjZSA9IHRoaXMuYmFzZVJlc291cmNlLmFkZFJlc291cmNlKFwie3Byb3h5K31cIik7XG4gICAgcHJveHlSZXNvdXJjZS5hZGRNZXRob2QoXCJBTllcIiwgc3RyZWFtaW5nSW50ZWdyYXRpb24pO1xuICB9XG59XG4iXX0=
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBMEM7QUFDMUMsK0RBWW9DO0FBRXBDLGlEQUs2QjtBQUc3QiwyQ0FBdUM7QUFFdkMsaURBQWdFO0FBOERoRTs7R0FFRztBQUNILE1BQWEsU0FBVSxTQUFRLHNCQUFTOztJQUN0Qzs7T0FFRztJQUNhLEdBQUcsQ0FBVTtJQUU3Qjs7Ozs7Ozs7T0FRRztJQUNILElBQUksR0FBRztRQUNMLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3pDLHdFQUF3RTtRQUN4RSxvRUFBb0U7UUFDcEUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxZQUFZO1lBQ25DLENBQUMsQ0FBQztnQkFDRSxXQUFXLFlBQVksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUTthQUN6RDtZQUNILENBQUMsQ0FBQztnQkFDRSxXQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxnQkFBZ0IsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxnQkFBZ0I7Z0JBQ2xGLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVM7YUFDbkMsQ0FBQztRQUNOLE9BQU8sSUFBQSxvQkFBUSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRWdCLFlBQVksQ0FBWTtJQUN4QixZQUFZLENBQVk7SUFDeEIsS0FBSyxDQUFpQjtJQUMvQixxQkFBcUIsQ0FBUTtJQUVyQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFB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LElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssd0JBQXdCLENBQUMsY0FBeUI7UUFDeEQsd0RBQXdEO1FBQ3hELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxrQ0FBaUIsQ0FBQyxjQUFjLEVBQUU7WUFDakUsb0JBQW9CLEVBQUUscUNBQW9CLENBQUMsTUFBTTtZQUNqRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHVCQUF1QjtTQUNqRCxDQUFDLENBQUM7UUFFSCw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUN2RCxDQUFDOztBQXBRSCw4QkFxUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaXplLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgUmVzdEFwaSxcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIEF3c0ludGVncmF0aW9uLFxuICBNZXRob2RPcHRpb25zLFxuICBJUmVzb3VyY2UsXG4gIEVuZHBvaW50VHlwZSxcbiAgUmVzdEFwaVByb3BzLFxuICBBd3NJbnRlZ3JhdGlvblByb3BzLFxuICBMYW1iZGFJbnRlZ3JhdGlvbk9wdGlvbnMsXG4gIFBhc3N0aHJvdWdoQmVoYXZpb3IsXG4gIFJlc3BvbnNlVHJhbnNmZXJNb2RlLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXlcIjtcbmltcG9ydCB7IElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtcbiAgUm9sZSxcbiAgU2VydmljZVByaW5jaXBhbCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBJUm9sZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IElGdW5jdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFB1YmxpY0RpckVudHJ5IH0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuaW1wb3J0IHsgam9pblBhdGgsIG5vcm1hbGl6ZUJhc2VQYXRoIH0gZnJvbSBcIi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXBpT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgcmVzdEFwaVByb3BzPzogUmVzdEFwaVByb3BzO1xuICByZWFkb25seSBzdGF0aWNJbnRlZ3JhdGlvblByb3BzPzogQXdzSW50ZWdyYXRpb25Qcm9wcztcbiAgcmVhZG9ubHkgczNNZXRob2RPcHRpb25zPzogTWV0aG9kT3B0aW9ucztcbiAgcmVhZG9ubHkgZHluYW1pY0ludGVncmF0aW9uUHJvcHM/OiBMYW1iZGFJbnRlZ3JhdGlvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IGltYWdlSW50ZWdyYXRpb25Qcm9wcz86IExhbWJkYUludGVncmF0aW9uT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBcGlQcm9wcyB7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBiYXNlIHBhdGggZm9yIHRoZSBhcHBsaWNhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdmVycmlkZSBwcm9wcyBmb3IgZXZlcnkgY29uc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzQXBpT3ZlcnJpZGVzO1xuICAvKipcbiAgICogUGF0aCB0byBkaXJlY3Rvcnkgb2YgTmV4dC5qcyBhcHAncyBwdWJsaWMgZGlyZWN0b3J5LiBVc2VkIHRvIGFkZCByZXNvdXJjZXNcbiAgICogdG8gQVBJIEdhdGV3YXkgUkVTVCBBUEkgZm9yIHB1YmxpYyBkaXJlY3RvcnkgdG8gZ28gZGlyZWN0bHkgdG8gUzMuXG4gICAqL1xuICByZWFkb25seSBwdWJsaWNEaXJFbnRyaWVzOiBQdWJsaWNEaXJFbnRyeVtdO1xuICAvKipcbiAgICogUmVxdWlyZWQgaWYgYE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zYC4gVGhlIExhbWJkYSBmdW5jdGlvbiBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAqL1xuICByZWFkb25seSBzZXJ2ZXJGdW5jdGlvbj86IElGdW5jdGlvbjtcbiAgLyoqXG4gICAqIERlZGljYXRlZCBpbWFnZSBvcHRpbWl6YXRpb24gTGFtYmRhIGZvciB0aGUgYF9uZXh0L2ltYWdlYCByb3V0ZS4gV2hlblxuICAgKiBvbWl0dGVkLCBubyBgX25leHQvaW1hZ2VgIHJlc291cmNlIGlzIGNyZWF0ZWQgYW5kIHRob3NlIHJlcXVlc3RzIGZhbGxcbiAgICogdGhyb3VnaCB0byBgc2VydmVyRnVuY3Rpb25gIHZpYSB0aGUgYHtwcm94eSt9YCBjYXRjaC1hbGwuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQgdG8gc3VwcG9ydCBMYW1iZGEgcmVzcG9uc2Ugc3RyZWFtaW5nIChhcyB0aGVcbiAgICogZGVkaWNhdGVkIGltYWdlIExhbWJkYSB0aGlzIHBhY2thZ2UgYnVpbGRzIGRvZXMpIGFuZCBpcyBpbnZva2VkIHdpdGhcbiAgICogYFJlc3BvbnNlVHJhbnNmZXJNb2RlLlNUUkVBTWAgYWNjb3JkaW5nbHkuIElmIHlvdSBzdXBwbHkgYSBjdXN0b21cbiAgICogYGltYWdlRnVuY3Rpb25gIHRoYXQgZG9lc24ndCBzdXBwb3J0IHN0cmVhbWluZywgb3ZlcnJpZGVcbiAgICogYHJlc3BvbnNlVHJhbnNmZXJNb2RlYCB0byBgQlVGRkVSRURgIHZpYSBgb3ZlcnJpZGVzLmltYWdlSW50ZWdyYXRpb25Qcm9wc2AsXG4gICAqIG90aGVyd2lzZSBBUEkgR2F0ZXdheSByZXR1cm5zIGEgNTAyLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VGdW5jdGlvbj86IElGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTMyBidWNrZXQgY29udGFpbmluZyBzdGF0aWMgYXNzZXRzXG4gICAqL1xuICByZWFkb25seSBzdGF0aWNBc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBTMyBrZXkgcHJlZml4IHRoZSBzdGF0aWMgYXNzZXRzIHdlcmUgdXBsb2FkZWQgdW5kZXIsIGkuZS5cbiAgICogYE5leHRqc1N0YXRpY0Fzc2V0cy5rZXlQcmVmaXhgLCB3aGljaCBuYW1lc3BhY2VzIGEgc2hhcmVkIGJ1Y2tldC5cbiAgICpcbiAgICogSW5kZXBlbmRlbnQgb2YgYGJhc2VQYXRoYCBhYm92ZTogdGhhdCBvbmUgaXMgdGhlIFVSTCBwcmVmaXggdGhlIFJFU1QgQVBJXG4gICAqIHNlcnZlcyB0aGUgYXBwIGF0IChjb21tb25seSB0aGUgQVBJIEdhdGV3YXkgc3RhZ2UpLCB3aGlsZSB0aGlzIG9uZSBpcyB3aGVyZVxuICAgKiB0aGUgb2JqZWN0cyBsaXZlIGluIHRoZSBidWNrZXQuIGBfbmV4dC9zdGF0aWNgIGFuZCBwdWJsaWMgZGlyZWN0b3J5XG4gICAqIHJlcXVlc3RzIGFyZSBtYXBwZWQgdG8gUzMga2V5cyBkaXJlY3RseSwgc28gdGhleSA0MDQgdW5sZXNzIHRoaXMgcHJlZml4IGlzXG4gICAqIGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBzdGF0aWNBc3NldHNLZXlQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBbRnV0dXJlXSBSZXF1aXJlZCBpZiBgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYC4gVlBDIHRvIGNyZWF0ZSBWUEMgTGluayBhbmQgRUNTIFNlcnZpY2UgRGlzY292ZXJ5XG4gICAqL1xuICByZWFkb25seSB2cGM/OiBJVnBjO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQVBJIEdhdGV3YXkgUkVTVCBBUEkgZm9yIE5leHQuanMgYXBwbGljYXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNBcGkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIEFQSSBHYXRld2F5IFJFU1QgQVBJXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpOiBSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgVVJMIG9mIHRoZSBhcHAsIGluY2x1ZGluZyBldmVyeSBwYXRoIHNlZ21lbnQgdGhlIEFQSSBuZXN0cyBpdCB1bmRlci5cbiAgICogUHJlZmVycyBhIGN1c3RvbSBkb21haW4gY29uZmlndXJlZCB0aHJvdWdoIGBvdmVycmlkZXMucmVzdEFwaVByb3BzLmRvbWFpbk5hbWVgXG4gICAqIG92ZXIgdGhlIGV4ZWN1dGUtYXBpIGVuZHBvaW50LlxuICAgKlxuICAgKiBBIGRvbWFpbiBhdHRhY2hlZCBhZnRlciB0aGlzIGNvbnN0cnVjdCBpcyBjcmVhdGVkIChgYXBpLmFkZERvbWFpbk5hbWUoKWApIGlzXG4gICAqIHN0aWxsIHVzZWQgZm9yIHRoZSBob3N0LCBidXQgQ0RLIGtlZXBzIGl0cyBiYXNlIHBhdGggbWFwcGluZ3MgcHJpdmF0ZSwgc28gYVxuICAgKiBtYXBwaW5nIGFkZGVkIHRoYXQgd2F5IHdvbid0IHNob3cgdXAgaGVyZS5cbiAgICovXG4gIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21Eb21haW4gPSB0aGlzLmFwaS5kb21haW5OYW1lO1xuICAgIC8vIEEgY3VzdG9tIGRvbWFpbiByZWFjaGVzIHRoZSBzdGFnZSB0aHJvdWdoIGEgYmFzZSBwYXRoIG1hcHBpbmcsIHNvIHRoZVxuICAgIC8vIHN0YWdlIG5hbWUgaXNuJ3QgaW4gdGhlIHBhdGggdGhlcmU7IHRoZSBtYXBwaW5nIG1heSBiZSwgd2hlbiBzZXQuXG4gICAgY29uc3QgW29yaWdpbiwgcHJlZml4XSA9IGN1c3RvbURvbWFpblxuICAgICAgPyBbXG4gICAgICAgICAgYGh0dHBzOi8vJHtjdXN0b21Eb21haW4uZG9tYWluTmFtZX1gLFxuICAgICAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5yZXN0QXBpUHJvcHM/LmRvbWFpbk5hbWU/LmJhc2VQYXRoLFxuICAgICAgICBdXG4gICAgICA6IFtcbiAgICAgICAgICBgaHR0cHM6Ly8ke3RoaXMuYXBpLnJlc3RBcGlJZH0uZXhlY3V0ZS1hcGkuJHtTdGFjay5vZih0aGlzKS5yZWdpb259LmFtYXpvbmF3cy5jb21gLFxuICAgICAgICAgIHRoaXMuYXBpLmRlcGxveW1lbnRTdGFnZS5zdGFnZU5hbWUsXG4gICAgICAgIF07XG4gICAgcmV0dXJuIGpvaW5QYXRoKG9yaWdpbiwgcHJlZml4LCB0aGlzLnByb3BzLmJhc2VQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVJlc291cmNlOiBJUmVzb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV4dFJlc291cmNlOiBJUmVzb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IE5leHRqc0FwaVByb3BzO1xuICBwcml2YXRlIHN0YXRpY0ludGVncmF0aW9uUm9sZTogSVJvbGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0FwaVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICB0aGlzLnZhbGlkYXRlUHJvcHMocHJvcHMpO1xuICAgIHRoaXMuYXBpID0gdGhpcy5jcmVhdGVSZXN0QXBpKCk7XG4gICAgdGhpcy5iYXNlUmVzb3VyY2UgPSB0aGlzLmNyZWF0ZUJhc2VSZXNvdXJjZShwcm9wcy5iYXNlUGF0aCk7XG4gICAgdGhpcy5uZXh0UmVzb3VyY2UgPSB0aGlzLmJhc2VSZXNvdXJjZS5hZGRSZXNvdXJjZShcIl9uZXh0XCIpO1xuICAgIHRoaXMuc3RhdGljSW50ZWdyYXRpb25Sb2xlID0gdGhpcy5jcmVhdGVTdGF0aWNJbnRlZ3JhdGlvblJvbGUoKTtcbiAgICB0aGlzLmNyZWF0ZVN0YXRpY0ludGVncmF0aW9ucygpO1xuICAgIGlmIChwcm9wcy5zZXJ2ZXJGdW5jdGlvbikge1xuICAgICAgLy8gV2l0aG91dCBhIGRlZGljYXRlZCBpbWFnZSBmdW5jdGlvbiwgYF9uZXh0L2ltYWdlYCBmYWxscyB0aHJvdWdoIHRvIHRoZVxuICAgICAgLy8gYHtwcm94eSt9YCBjYXRjaC1hbGwgb24gdGhlIHNlcnZlciBmdW5jdGlvbi5cbiAgICAgIGlmIChwcm9wcy5pbWFnZUZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlSW1hZ2VJbnRlZ3JhdGlvbihwcm9wcy5pbWFnZUZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JlYXRlRHluYW1pY0ludGVncmF0aW9uKHByb3BzLnNlcnZlckZ1bmN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLnZwYykge1xuICAgICAgLy8gW0Z1dHVyZV0gY3JlYXRlIGludGVncmF0aW9uIHdpdGggRUNTIHZpYSBWUEMgTGluayBhbmQgRUNTIFNlcnZpY2UgRGlzY292ZXJ5XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3BzKHByb3BzOiBOZXh0anNBcGlQcm9wcykge1xuICAgIGlmICghcHJvcHMuc2VydmVyRnVuY3Rpb24gJiYgIXByb3BzLnZwYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VydmVyRnVuY3Rpb24gb3IgdnBjIG11c3QgYmUgc2V0IGluIE5leHRqc0FwaVByb3BzXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVzdEFwaSgpOiBSZXN0QXBpIHtcbiAgICByZXR1cm4gbmV3IFJlc3RBcGkodGhpcywgXCJSZXN0QXBpXCIsIHtcbiAgICAgIGJpbmFyeU1lZGlhVHlwZXM6IFtcIiovKlwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgY2RrLW5leHRqcyBSRVNUIEFQSSBmb3IgJHtTdGFjay5vZih0aGlzKS5zdGFja05hbWV9YCxcbiAgICAgIGVuZHBvaW50VHlwZXM6IFtFbmRwb2ludFR5cGUuUkVHSU9OQUxdLFxuICAgICAgbWluQ29tcHJlc3Npb25TaXplOiBTaXplLmJ5dGVzKDApLCAvLyBjb21wcmVzcyBhbGwgcmVzcG9uc2VzIGZvciBiZXR0ZXIgcGVyZlxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnJlc3RBcGlQcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYmFzZSByZXNvdXJjZSBwYXRoIGlmIG5lZWRlZC4gSW1wb3J0YW50IGlmIGBiYXNlUGF0aGAgaXMgc2V0LlxuICAgKlxuICAgKiBBIG5lc3RlZCBgYmFzZVBhdGhgIChcIi90ZWFtL2FwcFwiKSBoYXMgdG8gYmVjb21lIG9uZSByZXNvdXJjZSBwZXIgc2VnbWVudDpcbiAgICogQVBJIEdhdGV3YXkgcGF0aCBwYXJ0cyBjYW4ndCBjb250YWluIFwiL1wiLCBzbyBwYXNzaW5nIHRoZSB3aG9sZSB0aGluZyB0byBhXG4gICAqIHNpbmdsZSBgYWRkUmVzb3VyY2VgIGZhaWxzIHZhbGlkYXRpb24gYXQgc3ludGguIGByZXNvbHZlQmFzZVBhdGhgIGFjY2VwdHNcbiAgICogbmVzdGVkIHZhbHVlcywgc28gdGhpcyBpcyByZWFjaGFibGUuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUJhc2VSZXNvdXJjZShiYXNlUGF0aD86IHN0cmluZyk6IElSZXNvdXJjZSB7XG4gICAgLy8gQ3JlYXRlIGJhc2UgcmVzb3VyY2UgcGF0aCBpZiBuZWVkZWRcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplQmFzZVBhdGgoYmFzZVBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBpLnJvb3Q7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVkXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAucmVkdWNlPElSZXNvdXJjZT4oXG4gICAgICAgIChwYXJlbnQsIHNlZ21lbnQpID0+IHBhcmVudC5hZGRSZXNvdXJjZShzZWdtZW50KSxcbiAgICAgICAgdGhpcy5hcGkucm9vdCxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0YXRpY0ludGVncmF0aW9uUm9sZSgpIHtcbiAgICAvLyBDcmVhdGUgUzMgaW50ZWdyYXRpb24gcm9sZVxuICAgIGNvbnN0IHN0YXRpY0ludGVncmF0aW9uUm9sZSA9IG5ldyBSb2xlKHRoaXMsIFwiU3RhdGljSW50ZWdyYXRpb25Sb2xlXCIsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIiksXG4gICAgfSk7XG5cbiAgICBzdGF0aWNJbnRlZ3JhdGlvblJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wiczM6R2V0T2JqZWN0XCIsIFwiczM6TGlzdEJ1Y2tldFwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0QXJuLFxuICAgICAgICAgIGAke3RoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldEFybn0vKmAsXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBzdGF0aWNJbnRlZ3JhdGlvblJvbGU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0YXRpY0ludGVncmF0aW9ucygpIHtcbiAgICB0aGlzLm5leHRSZXNvdXJjZVxuICAgICAgLmFkZFJlc291cmNlKFwic3RhdGljXCIpXG4gICAgICAuYWRkUmVzb3VyY2UoXCJ7cHJveHkrfVwiKVxuICAgICAgLmFkZE1ldGhvZChcbiAgICAgICAgXCJHRVRcIixcbiAgICAgICAgdGhpcy5jcmVhdGVTM0ludGVncmF0aW9uKHsga2V5OiB0aGlzLnMzS2V5KFwiX25leHQvc3RhdGljL3trZXl9XCIpIH0pLFxuICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgLy8gYWRkIHB1YmxpYyBkaXJlY3RvcnkgZmlsZXMvZGlyZWN0b3JpZXMgdGhhdCBleGlzdCBhdCB0b3AgbGV2ZWwgYnV0IG5lZWQgdG8gZ28gdG8gUzMuXG4gICAgZm9yIChjb25zdCBwdWJsaWNEaXJFbnRyeSBvZiB0aGlzLnByb3BzLnB1YmxpY0RpckVudHJpZXMpIHtcbiAgICAgIGlmIChwdWJsaWNEaXJFbnRyeS5pc0RpcmVjdG9yeSkge1xuICAgICAgICB0aGlzLmJhc2VSZXNvdXJjZVxuICAgICAgICAgIC5hZGRSZXNvdXJjZShwdWJsaWNEaXJFbnRyeS5uYW1lKVxuICAgICAgICAgIC5hZGRSZXNvdXJjZShcIntwcm94eSt9XCIpXG4gICAgICAgICAgLmFkZE1ldGhvZChcbiAgICAgICAgICAgIFwiR0VUXCIsXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVMzSW50ZWdyYXRpb24oe1xuICAgICAgICAgICAgICBrZXk6IHRoaXMuczNLZXkoYCR7cHVibGljRGlyRW50cnkubmFtZX0ve2tleX1gKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcy5nZXRTdGF0aWNNZXRob2RPcHRpb25zKHsgcHJveHk6IHRydWUgfSksXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYmFzZVJlc291cmNlXG4gICAgICAgICAgLmFkZFJlc291cmNlKHB1YmxpY0RpckVudHJ5Lm5hbWUpXG4gICAgICAgICAgLmFkZE1ldGhvZChcbiAgICAgICAgICAgIFwiR0VUXCIsXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVMzSW50ZWdyYXRpb24oeyBrZXk6IHRoaXMuczNLZXkocHVibGljRGlyRW50cnkubmFtZSkgfSksXG4gICAgICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoKSxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXhlcyBhIHJlcXVlc3QgcGF0aCB3aXRoIHRoZSBrZXkgcHJlZml4IHRoZSBhc3NldHMgd2VyZSB1cGxvYWRlZCB1bmRlcixcbiAgICogc2luY2UgdGhlIFMzIGludGVncmF0aW9ucyBhZGRyZXNzIG9iamVjdHMgYnkga2V5IHJhdGhlciB0aGFuIGJ5IFVSTC5cbiAgICovXG4gIHByaXZhdGUgczNLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBqb2luUGF0aCh0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0tleVByZWZpeCwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIEFQSSByZXF1ZXN0IHRvIFMzIHJlcXVlc3QuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Jlc3QtYXBpLXBhcmFtZXRlci1tYXBwaW5nLXNvdXJjZXMuaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9pbnRlZ3JhdGluZy1hcGktd2l0aC1hd3Mtc2VydmljZXMtczMuaHRtbCNhcGktaXRlbXMtaW4tZm9sZGVyLWFzLXMzLW9iamVjdHMtaW4tYnVja2V0XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVMzSW50ZWdyYXRpb24oeyBrZXkgfTogeyBrZXk6IHN0cmluZyB9KSB7XG4gICAgY29uc3QgczNJbnRlZ3JhdGlvbiA9IG5ldyBBd3NJbnRlZ3JhdGlvbih7XG4gICAgICBzZXJ2aWNlOiBcInMzXCIsXG4gICAgICBpbnRlZ3JhdGlvbkh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgICBwYXRoOiBgJHt0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfS8ke2tleX1gLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBjcmVkZW50aWFsc1JvbGU6IHRoaXMuc3RhdGljSW50ZWdyYXRpb25Sb2xlLFxuICAgICAgICBwYXNzdGhyb3VnaEJlaGF2aW9yOiBQYXNzdGhyb3VnaEJlaGF2aW9yLldIRU5fTk9fVEVNUExBVEVTLCAvLyByZWNvbW1lbmRlZFxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVyczoga2V5LmluY2x1ZGVzKFwie2tleX1cIilcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXF1ZXN0LnBhdGgua2V5XCI6IFwibWV0aG9kLnJlcXVlc3QucGF0aC5wcm94eVwiLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlZ3JhdGlvblJlc3BvbnNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IFwiMjAwXCIsXG4gICAgICAgICAgICByZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtVHlwZVwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1MZW5ndGhcIjpcbiAgICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LUxlbmd0aFwiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNhY2hlLUNvbnRyb2xcIixcbiAgICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkVUYWdcIjogXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuRVRhZ1wiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkxhc3QtTW9kaWZpZWRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBcIjQwNFwiLFxuICAgICAgICAgICAgc2VsZWN0aW9uUGF0dGVybjogXCI0MDRcIixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5zdGF0aWNJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuICAgIHJldHVybiBzM0ludGVncmF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGF0aWNNZXRob2RPcHRpb25zKHsgcHJveHkgfSA9IHsgcHJveHk6IGZhbHNlIH0pOiBNZXRob2RPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWVzdFBhcmFtZXRlcnM6IHByb3h5XG4gICAgICAgID8ge1xuICAgICAgICAgICAgXCJtZXRob2QucmVxdWVzdC5wYXRoLnByb3h5XCI6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG1ldGhvZFJlc3BvbnNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogXCIyMDBcIixcbiAgICAgICAgICByZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LVR5cGVcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LUxlbmd0aFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNhY2hlLUNvbnRyb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5FVGFnXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBcIjQwNFwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5zM01ldGhvZE9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgTGFtYmRhIFByb3h5IGludGVncmF0aW9uIGZvciB0aGUgYF9uZXh0L2ltYWdlYCByb3V0ZS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VJbnRlZ3JhdGlvbihpbWFnZUZ1bmN0aW9uOiBJRnVuY3Rpb24pIHtcbiAgICAvLyBpbWFnZUZ1bmN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGRlZGljYXRlZCwgc3RyZWFtaW5nLWNhcGFibGUgaW1hZ2VcbiAgICAvLyBMYW1iZGEgKHNlZSBpdHMgZG9jIGNvbW1lbnQpOyBvdmVycmlkZSByZXNwb25zZVRyYW5zZmVyTW9kZSB2aWFcbiAgICAvLyBpbWFnZUludGVncmF0aW9uUHJvcHMgaWYgdGhhdCBhc3N1bXB0aW9uIGRvZXNuJ3QgaG9sZCBmb3IgYSBjdXN0b21cbiAgICAvLyBpbWFnZUZ1bmN0aW9uLCBvdGhlcndpc2UgQVBJIEdhdGV3YXkgcmV0dXJucyBhIDUwMi4gRGVsaWJlcmF0ZWx5XG4gICAgLy8gZG9lc24ndCBpbmhlcml0IGR5bmFtaWNJbnRlZ3JhdGlvblByb3BzOiB0aGF0J3MgZm9yIHNlcnZlckZ1bmN0aW9uLFxuICAgIC8vIGEgZGlmZmVyZW50IExhbWJkYSB3aXRoIGRpZmZlcmVudCAoYW5kIHBvc3NpYmx5IGNvbmZsaWN0aW5nLCBlLmcuXG4gICAgLy8gQlVGRkVSRUQgZm9yIGEgbm9uLXN0cmVhbWluZyBMYW1iZGEgV2ViIEFkYXB0ZXIgc2V0dXApIHN0cmVhbWluZ1xuICAgIC8vIHJlcXVpcmVtZW50cyB0aGFuIHRoZSBhbHdheXMtc3RyZWFtaW5nIGRlZGljYXRlZCBpbWFnZSBMYW1iZGEuXG4gICAgY29uc3QgaW1hZ2VJbnRlZ3JhdGlvbiA9IG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihpbWFnZUZ1bmN0aW9uLCB7XG4gICAgICByZXNwb25zZVRyYW5zZmVyTW9kZTogUmVzcG9uc2VUcmFuc2Zlck1vZGUuU1RSRUFNLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlSW50ZWdyYXRpb25Qcm9wcyxcbiAgICB9KTtcbiAgICBjb25zdCBpbWFnZVJlc291cmNlID0gdGhpcy5uZXh0UmVzb3VyY2UuYWRkUmVzb3VyY2UoXCJpbWFnZVwiKTtcbiAgICBpbWFnZVJlc291cmNlLmFkZE1ldGhvZChcIkFOWVwiLCBpbWFnZUludGVncmF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgTGFtYmRhIFByb3h5IGludGVncmF0aW9uIGZvciBhbGwgb3RoZXIgcm91dGVzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUR5bmFtaWNJbnRlZ3JhdGlvbihzZXJ2ZXJGdW5jdGlvbjogSUZ1bmN0aW9uKSB7XG4gICAgLy8gQWxsIG90aGVyIHJvdXRlcyB1c2Ugc3RyZWFtaW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICBjb25zdCBzdHJlYW1pbmdJbnRlZ3JhdGlvbiA9IG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihzZXJ2ZXJGdW5jdGlvbiwge1xuICAgICAgcmVzcG9uc2VUcmFuc2Zlck1vZGU6IFJlc3BvbnNlVHJhbnNmZXJNb2RlLlNUUkVBTSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljSW50ZWdyYXRpb25Qcm9wcyxcbiAgICB9KTtcblxuICAgIC8vIEFkZCBjYXRjaC1hbGwgcm91dGVzIHdpdGggc3RyZWFtaW5nIGludGVncmF0aW9uIGZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICB0aGlzLmJhc2VSZXNvdXJjZS5hZGRNZXRob2QoXCJBTllcIiwgc3RyZWFtaW5nSW50ZWdyYXRpb24pO1xuICAgIGNvbnN0IHByb3h5UmVzb3VyY2UgPSB0aGlzLmJhc2VSZXNvdXJjZS5hZGRSZXNvdXJjZShcIntwcm94eSt9XCIpO1xuICAgIHByb3h5UmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIHN0cmVhbWluZ0ludGVncmF0aW9uKTtcbiAgfVxufVxuIl19
|