cdk-nuxt 2.20.0 → 2.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/functions/assets-cleanup/build/app/index.js +40 -17
- package/lib/functions/assets-cleanup/build/app/index.js.map +1 -1
- package/lib/functions/assets-cleanup/index.js +41 -18
- package/lib/functions/assets-cleanup/index.ts +47 -22
- package/lib/stack/access-logs-analysis/AccessLogsTableConfig.js +5 -1
- package/lib/stack/access-logs-analysis/AccessLogsTableConfig.ts +4 -0
- package/lib/stack/server/NuxtServerAppStack.js +3 -3
- package/lib/stack/server/NuxtServerAppStack.ts +2 -2
- package/lib/stack/waf/CloudFrontWebAcl.js +20 -1
- package/lib/stack/waf/CloudFrontWebAcl.ts +19 -0
- package/lib/stack/waf/WafConfig.d.ts +2 -1
- package/lib/stack/waf/WafConfig.js +2 -2
- package/lib/stack/waf/WafConfig.ts +3 -2
- package/package.json +1 -1
|
@@ -60,55 +60,78 @@ exports.handler = async (event, context) => {
|
|
|
60
60
|
const currentRevision = await getCurrentRevision(client, bucketName);
|
|
61
61
|
const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);
|
|
62
62
|
console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);
|
|
63
|
+
console.log(`Current revision: ${currentRevision.toISOString()}, Retention days: ${retainAssetsInDays}`);
|
|
63
64
|
let assetKeysToDelete = [];
|
|
64
65
|
let lastToken = undefined;
|
|
66
|
+
let totalAssetsScanned = 0;
|
|
67
|
+
let totalBatches = 0;
|
|
68
|
+
const assetsDeleteResults = [];
|
|
65
69
|
do {
|
|
66
70
|
const curAssetsResult = await client.send(new client_s3_1.ListObjectsV2Command({
|
|
67
71
|
Bucket: bucketName,
|
|
68
|
-
|
|
72
|
+
Prefix: '_nuxt/', // Only scan _nuxt/ directory where build assets are stored
|
|
73
|
+
MaxKeys: 1000,
|
|
69
74
|
ContinuationToken: lastToken,
|
|
70
75
|
}));
|
|
71
|
-
|
|
76
|
+
if (!curAssetsResult.Contents || curAssetsResult.Contents.length === 0) {
|
|
77
|
+
console.log('No assets found in current batch');
|
|
78
|
+
lastToken = curAssetsResult.NextContinuationToken;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
totalAssetsScanned += curAssetsResult.Contents.length;
|
|
82
|
+
console.log(`Batch ${++totalBatches}: Scanning ${curAssetsResult.Contents.length} assets (Total: ${totalAssetsScanned})`);
|
|
83
|
+
// Read object metadata in blocks of 50 for better performance
|
|
72
84
|
let processableAssets = [...curAssetsResult.Contents];
|
|
73
85
|
while (processableAssets.length > 0) {
|
|
74
|
-
const assetsBatch = processableAssets.slice(0,
|
|
75
|
-
processableAssets = processableAssets.slice(
|
|
86
|
+
const assetsBatch = processableAssets.slice(0, 50);
|
|
87
|
+
processableAssets = processableAssets.slice(50);
|
|
76
88
|
const pendingMetadataRequests = assetsBatch.map(asset => client.send(new client_s3_1.HeadObjectCommand({
|
|
77
89
|
Bucket: bucketName,
|
|
78
90
|
Key: asset.Key,
|
|
79
|
-
}))
|
|
91
|
+
})).catch(error => {
|
|
92
|
+
console.warn(`Failed to get metadata for ${asset.Key}:`, error.message);
|
|
93
|
+
return { Metadata: {} }; // Return empty metadata on error
|
|
94
|
+
}));
|
|
80
95
|
const metadataResults = await Promise.all(pendingMetadataRequests);
|
|
81
96
|
// Assign metadata to assets
|
|
82
97
|
const metadataByAsset = metadataResults.map((metadataResult, index) => ({
|
|
83
98
|
key: assetsBatch[index].Key,
|
|
84
|
-
metadata: metadataResult.Metadata,
|
|
99
|
+
metadata: metadataResult.Metadata || {},
|
|
85
100
|
}));
|
|
86
101
|
const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);
|
|
87
102
|
assetKeysToDelete.push(...outdatedAssetKeys);
|
|
103
|
+
// Stream deletion: Delete in batches of 1000 to avoid memory issues and timeouts
|
|
104
|
+
if (assetKeysToDelete.length >= MAX_DELETE_OBJECT_KEYS) {
|
|
105
|
+
console.log(`Deleting batch of ${assetKeysToDelete.length} assets...`);
|
|
106
|
+
const results = await deleteAssets(assetKeysToDelete, client, bucketName);
|
|
107
|
+
assetsDeleteResults.push(...results);
|
|
108
|
+
assetKeysToDelete = []; // Clear the array
|
|
109
|
+
}
|
|
88
110
|
}
|
|
89
111
|
lastToken = curAssetsResult.NextContinuationToken;
|
|
90
112
|
} while (lastToken !== undefined);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
113
|
+
// Delete remaining assets
|
|
114
|
+
if (assetKeysToDelete.length > 0) {
|
|
115
|
+
console.log(`Deleting final batch of ${assetKeysToDelete.length} assets...`);
|
|
116
|
+
const results = await deleteAssets(assetKeysToDelete, client, bucketName);
|
|
117
|
+
assetsDeleteResults.push(...results);
|
|
94
118
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const currentError = !!(currentResult.Errors && currentResult.Errors.length > 0);
|
|
100
|
-
if (currentError) {
|
|
119
|
+
// Check for deletion errors and report
|
|
120
|
+
const failed = assetsDeleteResults.reduce((previousResult, currentResult) => {
|
|
121
|
+
const hasCurrentError = !!(currentResult.Errors && currentResult.Errors.length > 0);
|
|
122
|
+
if (hasCurrentError) {
|
|
101
123
|
console.error('Failed to delete outdated static assets', currentResult.Errors);
|
|
102
124
|
}
|
|
103
|
-
return previousResult ||
|
|
125
|
+
return previousResult || hasCurrentError;
|
|
104
126
|
}, false);
|
|
105
127
|
if (failed) {
|
|
106
128
|
throw new Error('Failed to delete outdated static assets');
|
|
107
129
|
}
|
|
108
|
-
console.log(
|
|
130
|
+
console.log(`Cleanup of old static assets finished. Total assets scanned: ${totalAssetsScanned}`);
|
|
109
131
|
}
|
|
110
132
|
catch (error) {
|
|
111
133
|
console.error('### unexpected runtime error ###', error);
|
|
134
|
+
throw error; // Re-throw to mark Lambda as failed
|
|
112
135
|
}
|
|
113
136
|
};
|
|
114
137
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":";;AAAA,kDAM4B;AAE5B,gDAAsC;AAQtC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAEpD;;GAEG;AACH,MAAM,kBAAkB,GAAG,KAAK,EAAE,QAAkB,EAAE,UAAkB,EAAiB,EAAE;IACvF,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,CACpC,IAAI,4BAAgB,CAAC;QACjB,MAAM,EAAE,UAAU;QAClB,GAAG,EAAE,cAAc;KACtB,CAAC,CACL,CAAC;IAEF,OAAO,IAAI,IAAI,CAAC,MAAM,IAAA,gBAAI,EAAC,YAAY,CAAC,IAAgB,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,uBAAuB,GAAG,CAAC,eAAgC,EAAE,eAAqB,EAAY,EAAE;IAClG,OAAO,eAAe;SACjB,MAAM,CAAC,aAAa,CAAC,EAAE,CACpB,aAAa,CAAC,QAAQ,CAAC,QAAQ;QAC3B,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,IAAI,eAAe,CAAC,OAAO,EAAE;QAClF,CAAC,CAAC,KAAK,CACd;SACA,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,YAAY,GAAG,KAAK,EACtB,SAAmB,EACnB,QAAkB,EAClB,UAAkB,EACmB,EAAE;IACvC,IAAI,0BAA0B,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,EAAE,CAAC;IAE1B,OAAO,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;QACnF,0BAA0B,GAAG,0BAA0B,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAEtF,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;QAEhD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAC/B,IAAI,gCAAoB,CAAC;YACrB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE;gBACJ,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;oBACtC,OAAO,EAAC,GAAG,EAAE,WAAW,EAAC,CAAC;gBAC9B,CAAC,CAAC;aACL;SACJ,CAAC,CACL,CAAC;QACF,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,OAAO,CAAC,OAAO,GAAG,KAAK,EAAE,KAAU,EAAE,OAAY,EAAE,EAAE;IACjD,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,oBAAQ,CAAC,EAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAC,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACpD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACvF,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrE,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,kBAAkB,GAAG,uBAAuB,CAAC,CAAC;QAE3G,OAAO,CAAC,GAAG,CAAC,gDAAgD,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEhG,IAAI,iBAAiB,GAAa,EAAE,CAAC;QACrC,IAAI,SAAS,GAAG,SAAS,CAAC;QAE1B,GAAG,CAAC;YACA,MAAM,eAAe,GAA+B,MAAM,MAAM,CAAC,IAAI,CACjE,IAAI,gCAAoB,CAAC;gBACrB,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,GAAG;gBACZ,iBAAiB,EAAE,SAAS;aAC/B,CAAC,CACL,CAAC;YAEF,uCAAuC;YACvC,IAAI,iBAAiB,GAAG,CAAC,GAAG,eAAe,CAAC,QAAS,CAAC,CAAC;YAEvD,OAAO,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnD,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAEhD,MAAM,uBAAuB,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACpD,MAAM,CAAC,IAAI,CACP,IAAI,6BAAiB,CAAC;oBAClB,MAAM,EAAE,UAAU;oBAClB,GAAG,EAAE,KAAK,CAAC,GAAG;iBACjB,CAAC,CACL,CACJ,CAAC;gBAEF,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBAEnE,4BAA4B;gBAC5B,MAAM,eAAe,GAAqB,eAAe,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBACtF,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG;oBAC3B,QAAQ,EAAE,cAAc,CAAC,QAAQ;iBACpC,CAAC,CAAqB,CAAC;gBAExB,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;gBACpF,iBAAiB,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;YACjD,CAAC;YACD,SAAS,GAAG,eAAe,CAAC,qBAAqB,CAAC;QACtD,CAAC,QAAQ,SAAS,KAAK,SAAS,EAAE;QAElC,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,iBAAiB,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;QAEnE,yDAAyD;QACzD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,cAAuB,EAAE,aAAyC,EAAW,EAAE;YAC1G,MAAM,YAAY,GAAY,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1F,IAAI,YAAY,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YACnF,CAAC;YACD,OAAO,cAAc,IAAI,YAAY,CAAC;QAC1C,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;AACL,CAAC,CAAC","sourcesContent":["import {\n DeleteObjectsCommand,\n DeleteObjectsCommandOutput,\n GetObjectCommand, HeadObjectCommand,\n ListObjectsV2Command,\n S3Client\n} from \"@aws-sdk/client-s3\";\nimport type {ListObjectsV2CommandOutput} from \"@aws-sdk/client-s3\";\nimport {text} from 'stream/consumers';\nimport {Readable} from \"stream\";\n\ninterface AssetMetadata {\n readonly key: string;\n readonly metadata: {[key: string]: string};\n}\n\nconst MAX_DELETE_OBJECT_KEYS = 1000;\nconst ONE_DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24;\n\n/**\n * Returns the current deployment revision (build timestamp).\n */\nconst getCurrentRevision = async (s3Client: S3Client, bucketName: string): Promise<Date> => {\n const revisionFile = await s3Client.send(\n new GetObjectCommand({\n Bucket: bucketName,\n Key: 'app-revision',\n })\n );\n\n return new Date(await text(revisionFile.Body as Readable));\n};\n\n/**\n * Filters the given assets by inspecting their revision and returns those, that are older than the specified cutoff date.\n */\nconst filterOutdatedAssetKeys = (metadataResults: AssetMetadata[], returnOlderThan: Date): string[] => {\n return metadataResults\n .filter(assetMetadata =>\n assetMetadata.metadata.revision\n ? new Date(assetMetadata.metadata.revision).getTime() <= returnOlderThan.getTime()\n : false\n )\n .map(filteredAssets => filteredAssets.key);\n};\n\n/**\n * Deletes the given assets.\n */\nconst deleteAssets = async (\n assetKeys: string[],\n s3Client: S3Client,\n bucketName: string\n): Promise<DeleteObjectsCommandOutput[]> => {\n let remainingAssetKeysToDelete = [...assetKeys];\n const pendingDeletes = [];\n\n while (remainingAssetKeysToDelete.length > 0) {\n const curDeleteBatch = remainingAssetKeysToDelete.slice(0, MAX_DELETE_OBJECT_KEYS);\n remainingAssetKeysToDelete = remainingAssetKeysToDelete.slice(MAX_DELETE_OBJECT_KEYS);\n\n console.log('Deleting assets:', curDeleteBatch);\n\n const pendingDelete = s3Client.send(\n new DeleteObjectsCommand({\n Bucket: bucketName,\n Delete: {\n Objects: curDeleteBatch.map(outdatedKey => {\n return {Key: outdatedKey};\n }),\n },\n })\n );\n pendingDeletes.push(pendingDelete);\n }\n\n return await Promise.all(pendingDeletes);\n};\n\nexports.handler = async (event: any, context: any) => {\n try {\n const client = new S3Client({region: process.env.AWS_REGION});\n const bucketName = process.env.STATIC_ASSETS_BUCKET;\n if (!bucketName) {\n throw new Error(\"Static asset's bucket name not specified in environment!\");\n }\n\n if (!process.env.OUTDATED_ASSETS_RETENTION_DAYS) {\n throw new Error('Retain duration of static assets not specified!');\n }\n const retainAssetsInDays = Number.parseInt(process.env.OUTDATED_ASSETS_RETENTION_DAYS);\n const currentRevision = await getCurrentRevision(client, bucketName);\n const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);\n\n console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);\n\n let assetKeysToDelete: string[] = [];\n let lastToken = undefined;\n\n do {\n const curAssetsResult: ListObjectsV2CommandOutput = await client.send(\n new ListObjectsV2Command({\n Bucket: bucketName,\n MaxKeys: 250,\n ContinuationToken: lastToken,\n })\n );\n\n // Read object metadata in blocks of 10\n let processableAssets = [...curAssetsResult.Contents!];\n\n while (processableAssets.length > 0) {\n const assetsBatch = processableAssets.slice(0, 10);\n processableAssets = processableAssets.slice(10);\n\n const pendingMetadataRequests = assetsBatch.map(asset =>\n client.send(\n new HeadObjectCommand({\n Bucket: bucketName,\n Key: asset.Key,\n })\n )\n );\n\n const metadataResults = await Promise.all(pendingMetadataRequests);\n\n // Assign metadata to assets\n const metadataByAsset: AssetMetadata[] = (metadataResults.map((metadataResult, index) => ({\n key: assetsBatch[index].Key,\n metadata: metadataResult.Metadata,\n })) as AssetMetadata[]);\n\n const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);\n assetKeysToDelete.push(...outdatedAssetKeys);\n }\n lastToken = curAssetsResult.NextContinuationToken;\n } while (lastToken !== undefined);\n\n if (assetKeysToDelete.length === 0) {\n console.log('No outdated assets to delete found');\n return;\n }\n\n console.log('Deleting ' + assetKeysToDelete.length + ' assets...');\n\n // Delete outdated assets (max. 1000 allowed per request)\n const results = await deleteAssets(assetKeysToDelete, client, bucketName);\n const failed = results.reduce((previousResult: boolean, currentResult: DeleteObjectsCommandOutput): boolean => {\n const currentError: boolean = !!(currentResult.Errors && currentResult.Errors.length > 0);\n if (currentError) {\n console.error('Failed to delete outdated static assets', currentResult.Errors);\n }\n return previousResult || currentError;\n }, false);\n\n if (failed) {\n throw new Error('Failed to delete outdated static assets');\n }\n\n console.log('Cleanup of old static assets finished');\n } catch (error) {\n console.error('### unexpected runtime error ###', error);\n }\n};"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DeleteObjectsCommand,\n DeleteObjectsCommandOutput,\n GetObjectCommand, HeadObjectCommand,\n ListObjectsV2Command,\n S3Client\n} from \"@aws-sdk/client-s3\";\nimport type {ListObjectsV2CommandOutput} from \"@aws-sdk/client-s3\";\nimport {text} from 'stream/consumers';\nimport {Readable} from \"stream\";\n\ninterface AssetMetadata {\n readonly key: string;\n readonly metadata: {[key: string]: string};\n}\n\nconst MAX_DELETE_OBJECT_KEYS = 1000;\nconst ONE_DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24;\n\n/**\n * Returns the current deployment revision (build timestamp).\n */\nconst getCurrentRevision = async (s3Client: S3Client, bucketName: string): Promise<Date> => {\n const revisionFile = await s3Client.send(\n new GetObjectCommand({\n Bucket: bucketName,\n Key: 'app-revision',\n })\n );\n\n return new Date(await text(revisionFile.Body as Readable));\n};\n\n/**\n * Filters the given assets by inspecting their revision and returns those, that are older than the specified cutoff date.\n */\nconst filterOutdatedAssetKeys = (metadataResults: AssetMetadata[], returnOlderThan: Date): string[] => {\n return metadataResults\n .filter(assetMetadata =>\n assetMetadata.metadata.revision\n ? new Date(assetMetadata.metadata.revision).getTime() <= returnOlderThan.getTime()\n : false\n )\n .map(filteredAssets => filteredAssets.key);\n};\n\n/**\n * Deletes the given assets.\n */\nconst deleteAssets = async (\n assetKeys: string[],\n s3Client: S3Client,\n bucketName: string\n): Promise<DeleteObjectsCommandOutput[]> => {\n let remainingAssetKeysToDelete = [...assetKeys];\n const pendingDeletes = [];\n\n while (remainingAssetKeysToDelete.length > 0) {\n const curDeleteBatch = remainingAssetKeysToDelete.slice(0, MAX_DELETE_OBJECT_KEYS);\n remainingAssetKeysToDelete = remainingAssetKeysToDelete.slice(MAX_DELETE_OBJECT_KEYS);\n\n console.log('Deleting assets:', curDeleteBatch);\n\n const pendingDelete = s3Client.send(\n new DeleteObjectsCommand({\n Bucket: bucketName,\n Delete: {\n Objects: curDeleteBatch.map(outdatedKey => {\n return {Key: outdatedKey};\n }),\n },\n })\n );\n pendingDeletes.push(pendingDelete);\n }\n\n return await Promise.all(pendingDeletes);\n};\n\nexports.handler = async (event: any, context: any) => {\n try {\n const client = new S3Client({region: process.env.AWS_REGION});\n const bucketName = process.env.STATIC_ASSETS_BUCKET;\n if (!bucketName) {\n throw new Error(\"Static asset's bucket name not specified in environment!\");\n }\n\n if (!process.env.OUTDATED_ASSETS_RETENTION_DAYS) {\n throw new Error('Retain duration of static assets not specified!');\n }\n const retainAssetsInDays = Number.parseInt(process.env.OUTDATED_ASSETS_RETENTION_DAYS);\n const currentRevision = await getCurrentRevision(client, bucketName);\n const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);\n\n console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);\n console.log(`Current revision: ${currentRevision.toISOString()}, Retention days: ${retainAssetsInDays}`);\n\n let assetKeysToDelete: string[] = [];\n let lastToken = undefined;\n let totalAssetsScanned = 0;\n let totalBatches = 0;\n const assetsDeleteResults: DeleteObjectsCommandOutput[] = [];\n\n do {\n const curAssetsResult: ListObjectsV2CommandOutput = await client.send(\n new ListObjectsV2Command({\n Bucket: bucketName,\n Prefix: '_nuxt/', // Only scan _nuxt/ directory where build assets are stored\n MaxKeys: 1000,\n ContinuationToken: lastToken,\n })\n );\n\n if (!curAssetsResult.Contents || curAssetsResult.Contents.length === 0) {\n console.log('No assets found in current batch');\n lastToken = curAssetsResult.NextContinuationToken;\n continue;\n }\n\n totalAssetsScanned += curAssetsResult.Contents.length;\n console.log(`Batch ${++totalBatches}: Scanning ${curAssetsResult.Contents.length} assets (Total: ${totalAssetsScanned})`);\n\n // Read object metadata in blocks of 50 for better performance\n let processableAssets = [...curAssetsResult.Contents];\n\n while (processableAssets.length > 0) {\n const assetsBatch = processableAssets.slice(0, 50);\n processableAssets = processableAssets.slice(50);\n\n const pendingMetadataRequests = assetsBatch.map(asset =>\n client.send(\n new HeadObjectCommand({\n Bucket: bucketName,\n Key: asset.Key,\n })\n ).catch(error => {\n console.warn(`Failed to get metadata for ${asset.Key}:`, error.message);\n return { Metadata: {} }; // Return empty metadata on error\n })\n );\n\n const metadataResults = await Promise.all(pendingMetadataRequests);\n\n // Assign metadata to assets\n const metadataByAsset: AssetMetadata[] = metadataResults.map((metadataResult, index) => ({\n key: assetsBatch[index].Key!,\n metadata: metadataResult.Metadata || {},\n }));\n\n const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);\n assetKeysToDelete.push(...outdatedAssetKeys);\n\n // Stream deletion: Delete in batches of 1000 to avoid memory issues and timeouts\n if (assetKeysToDelete.length >= MAX_DELETE_OBJECT_KEYS) {\n console.log(`Deleting batch of ${assetKeysToDelete.length} assets...`);\n const results = await deleteAssets(assetKeysToDelete, client, bucketName);\n assetsDeleteResults.push(...results);\n assetKeysToDelete = []; // Clear the array\n }\n }\n lastToken = curAssetsResult.NextContinuationToken;\n } while (lastToken !== undefined);\n\n // Delete remaining assets\n if (assetKeysToDelete.length > 0) {\n console.log(`Deleting final batch of ${assetKeysToDelete.length} assets...`);\n const results = await deleteAssets(assetKeysToDelete, client, bucketName);\n assetsDeleteResults.push(...results);\n }\n\n // Check for deletion errors and report\n const failed = assetsDeleteResults.reduce((previousResult: boolean, currentResult: DeleteObjectsCommandOutput): boolean => {\n const hasCurrentError: boolean = !!(currentResult.Errors && currentResult.Errors.length > 0);\n if (hasCurrentError) {\n console.error('Failed to delete outdated static assets', currentResult.Errors);\n }\n return previousResult || hasCurrentError;\n }, false);\n\n if (failed) {\n throw new Error('Failed to delete outdated static assets');\n }\n\n console.log(`Cleanup of old static assets finished. Total assets scanned: ${totalAssetsScanned}`);\n } catch (error) {\n console.error('### unexpected runtime error ###', error);\n throw error; // Re-throw to mark Lambda as failed\n }\n};"]}
|
|
@@ -60,55 +60,78 @@ exports.handler = async (event, context) => {
|
|
|
60
60
|
const currentRevision = await getCurrentRevision(client, bucketName);
|
|
61
61
|
const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);
|
|
62
62
|
console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);
|
|
63
|
+
console.log(`Current revision: ${currentRevision.toISOString()}, Retention days: ${retainAssetsInDays}`);
|
|
63
64
|
let assetKeysToDelete = [];
|
|
64
65
|
let lastToken = undefined;
|
|
66
|
+
let totalAssetsScanned = 0;
|
|
67
|
+
let totalBatches = 0;
|
|
68
|
+
const assetsDeleteResults = [];
|
|
65
69
|
do {
|
|
66
70
|
const curAssetsResult = await client.send(new client_s3_1.ListObjectsV2Command({
|
|
67
71
|
Bucket: bucketName,
|
|
68
|
-
|
|
72
|
+
Prefix: '_nuxt/', // Only scan _nuxt/ directory where build assets are stored
|
|
73
|
+
MaxKeys: 1000,
|
|
69
74
|
ContinuationToken: lastToken,
|
|
70
75
|
}));
|
|
71
|
-
|
|
76
|
+
if (!curAssetsResult.Contents || curAssetsResult.Contents.length === 0) {
|
|
77
|
+
console.log('No assets found in current batch');
|
|
78
|
+
lastToken = curAssetsResult.NextContinuationToken;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
totalAssetsScanned += curAssetsResult.Contents.length;
|
|
82
|
+
console.log(`Batch ${++totalBatches}: Scanning ${curAssetsResult.Contents.length} assets (Total: ${totalAssetsScanned})`);
|
|
83
|
+
// Read object metadata in blocks of 50 for better performance
|
|
72
84
|
let processableAssets = [...curAssetsResult.Contents];
|
|
73
85
|
while (processableAssets.length > 0) {
|
|
74
|
-
const assetsBatch = processableAssets.slice(0,
|
|
75
|
-
processableAssets = processableAssets.slice(
|
|
86
|
+
const assetsBatch = processableAssets.slice(0, 50);
|
|
87
|
+
processableAssets = processableAssets.slice(50);
|
|
76
88
|
const pendingMetadataRequests = assetsBatch.map(asset => client.send(new client_s3_1.HeadObjectCommand({
|
|
77
89
|
Bucket: bucketName,
|
|
78
90
|
Key: asset.Key,
|
|
79
|
-
}))
|
|
91
|
+
})).catch(error => {
|
|
92
|
+
console.warn(`Failed to get metadata for ${asset.Key}:`, error.message);
|
|
93
|
+
return { Metadata: {} }; // Return empty metadata on error
|
|
94
|
+
}));
|
|
80
95
|
const metadataResults = await Promise.all(pendingMetadataRequests);
|
|
81
96
|
// Assign metadata to assets
|
|
82
97
|
const metadataByAsset = metadataResults.map((metadataResult, index) => ({
|
|
83
98
|
key: assetsBatch[index].Key,
|
|
84
|
-
metadata: metadataResult.Metadata,
|
|
99
|
+
metadata: metadataResult.Metadata || {},
|
|
85
100
|
}));
|
|
86
101
|
const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);
|
|
87
102
|
assetKeysToDelete.push(...outdatedAssetKeys);
|
|
103
|
+
// Stream deletion: Delete in batches of 1000 to avoid memory issues and timeouts
|
|
104
|
+
if (assetKeysToDelete.length >= MAX_DELETE_OBJECT_KEYS) {
|
|
105
|
+
console.log(`Deleting batch of ${assetKeysToDelete.length} assets...`);
|
|
106
|
+
const results = await deleteAssets(assetKeysToDelete, client, bucketName);
|
|
107
|
+
assetsDeleteResults.push(...results);
|
|
108
|
+
assetKeysToDelete = []; // Clear the array
|
|
109
|
+
}
|
|
88
110
|
}
|
|
89
111
|
lastToken = curAssetsResult.NextContinuationToken;
|
|
90
112
|
} while (lastToken !== undefined);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
113
|
+
// Delete remaining assets
|
|
114
|
+
if (assetKeysToDelete.length > 0) {
|
|
115
|
+
console.log(`Deleting final batch of ${assetKeysToDelete.length} assets...`);
|
|
116
|
+
const results = await deleteAssets(assetKeysToDelete, client, bucketName);
|
|
117
|
+
assetsDeleteResults.push(...results);
|
|
94
118
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const currentError = !!(currentResult.Errors && currentResult.Errors.length > 0);
|
|
100
|
-
if (currentError) {
|
|
119
|
+
// Check for deletion errors and report
|
|
120
|
+
const failed = assetsDeleteResults.reduce((previousResult, currentResult) => {
|
|
121
|
+
const hasCurrentError = !!(currentResult.Errors && currentResult.Errors.length > 0);
|
|
122
|
+
if (hasCurrentError) {
|
|
101
123
|
console.error('Failed to delete outdated static assets', currentResult.Errors);
|
|
102
124
|
}
|
|
103
|
-
return previousResult ||
|
|
125
|
+
return previousResult || hasCurrentError;
|
|
104
126
|
}, false);
|
|
105
127
|
if (failed) {
|
|
106
128
|
throw new Error('Failed to delete outdated static assets');
|
|
107
129
|
}
|
|
108
|
-
console.log(
|
|
130
|
+
console.log(`Cleanup of old static assets finished. Total assets scanned: ${totalAssetsScanned}`);
|
|
109
131
|
}
|
|
110
132
|
catch (error) {
|
|
111
133
|
console.error('### unexpected runtime error ###', error);
|
|
134
|
+
throw error; // Re-throw to mark Lambda as failed
|
|
112
135
|
}
|
|
113
136
|
};
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQU00QjtBQUU1QixnREFBc0M7QUFRdEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFBRSxRQUFrQixFQUFFLFVBQWtCLEVBQWlCLEVBQUU7SUFDdkYsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUNwQyxJQUFJLDRCQUFnQixDQUFDO1FBQ2pCLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLEdBQUcsRUFBRSxjQUFjO0tBQ3RCLENBQUMsQ0FDTCxDQUFDO0lBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUEsZ0JBQUksRUFBQyxZQUFZLENBQUMsSUFBZ0IsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLENBQUMsZUFBZ0MsRUFBRSxlQUFxQixFQUFZLEVBQUU7SUFDbEcsT0FBTyxlQUFlO1NBQ2pCLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUNwQixhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRTtRQUNsRixDQUFDLENBQUMsS0FBSyxDQUNkO1NBQ0EsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUN0QixTQUFt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QztRQUVuRSx5REFBeUQ7UUFDekQsTUFBTSxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUF1QixFQUFFLGFBQXlDLEVBQVcsRUFBRTtZQUMxRyxNQUFNLFlBQVksR0FBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkYsQ0FBQztZQUNELE9BQU8sY0FBYyxJQUFJLFlBQVksQ0FBQztRQUMxQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFVixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdELENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERlbGV0ZU9iamVjdHNDb21tYW5kLFxuICAgIERlbGV0ZU9iamVjdHNDb21tYW5kT3V0cHV0LFxuICAgIEdldE9iamVjdENvbW1hbmQsIEhlYWRPYmplY3RDb21tYW5kLFxuICAgIExpc3RPYmplY3RzVjJDb21tYW5kLFxuICAgIFMzQ2xpZW50XG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB0eXBlIHtMaXN0T2JqZWN0c1YyQ29tbWFuZE91dHB1dH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHt0ZXh0fSBmcm9tICdzdHJlYW0vY29uc3VtZXJzJztcbmltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcblxuaW50ZXJmYWNlIEFzc2V0TWV0YWRhdGEge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IG1ldGFkYXRhOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbn1cblxuY29uc3QgTUFYX0RFTEVURV9PQkpFQ1RfS0VZUyA9IDEwMDA7XG5jb25zdCBPTkVfREFZX0lOX01JTExJU0VDT05EUyA9IDEwMDAgKiA2MCAqIDYwICogMjQ7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBkZXBsb3ltZW50IHJldmlzaW9uIChidWlsZCB0aW1lc3RhbXApLlxuICovXG5jb25zdCBnZXRDdXJyZW50UmV2aXNpb24gPSBhc3luYyAoczNDbGllbnQ6IFMzQ2xpZW50LCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPERhdGU+ID0+IHtcbiAgICBjb25zdCByZXZpc2lvbkZpbGUgPSBhd2FpdCBzM0NsaWVudC5zZW5kKFxuICAgICAgICBuZXcgR2V0T2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBLZXk6ICdhcHAtcmV2aXNpb24nLFxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IERhdGUoYXdhaXQgdGV4dChyZXZpc2lvbkZpbGUuQm9keSBhcyBSZWFkYWJsZSkpO1xufTtcblxuLyoqXG4gKiBGaWx0ZXJzIHRoZSBnaXZlbiBhc3NldHMgYnkgaW5zcGVjdGluZyB0aGVpciByZXZpc2lvbiBhbmQgcmV0dXJucyB0aG9zZSwgdGhhdCBhcmUgb2xkZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGN1dG9mZiBkYXRlLlxuICovXG5jb25zdCBmaWx0ZXJPdXRkYXRlZEFzc2V0S2V5cyA9IChtZXRhZGF0YVJlc3VsdHM6IEFzc2V0TWV0YWRhdGFbXSwgcmV0dXJuT2xkZXJUaGFuOiBEYXRlKTogc3RyaW5nW10gPT4ge1xuICAgIHJldHVybiBtZXRhZGF0YVJlc3VsdHNcbiAgICAgICAgLmZpbHRlcihhc3NldE1ldGFkYXRhID0+XG4gICAgICAgICAgICBhc3NldE1ldGFkYXRhLm1ldGFkYXRhLnJldmlzaW9uXG4gICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShhc3NldE1ldGFkYXRhLm1ldGFkYXRhLnJldmlzaW9uKS5nZXRUaW1lKCkgPD0gcmV0dXJuT2xkZXJUaGFuLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgIDogZmFsc2VcbiAgICAgICAgKVxuICAgICAgICAubWFwKGZpbHRlcmVkQXNzZXRzID0+IGZpbHRlcmVkQXNzZXRzLmtleSk7XG59O1xuXG4vKipcbiAqIERlbGV0ZXMgdGhlIGdpdmVuIGFzc2V0cy5cbiAqL1xuY29uc3QgZGVsZXRlQXNzZXRzID0gYXN5bmMgKFxuICAgIGFzc2V0S2V5czogc3RyaW5nW10sXG4gICAgczNDbGllbnQ6IFMzQ2xpZW50LFxuICAgIGJ1Y2tldE5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxEZWxldGVPYmplY3RzQ29tbWFuZE91dHB1dFtdPiA9PiB7XG4gICAgbGV0IHJlbWFpbmluZ0Fzc2V0S2V5c1RvRGVsZXRlID0gWy4uLmFzc2V0S2V5c107XG4gICAgY29uc3QgcGVuZGluZ0RlbGV0ZXMgPSBbXTtcblxuICAgIHdoaWxlIChyZW1haW5pbmdBc3NldEtleXNUb0RlbGV0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1ckRlbGV0ZUJhdGNoID0gcmVtYWluaW5nQXNzZXRLZXlzVG9EZWxldGUuc2xpY2UoMCwgTUFYX0RFTEVURV9PQkpFQ1RfS0VZUyk7XG4gICAgICAgIHJlbWFpbmluZ0Fzc2V0S2V5c1RvRGVsZXRlID0gcmVtYWluaW5nQXNzZXRLZXlzVG9EZWxldGUuc2xpY2UoTUFYX0RFTEVURV9PQkpFQ1RfS0VZUyk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0aW5nIGFzc2V0czonLCBjdXJEZWxldGVCYXRjaCk7XG5cbiAgICAgICAgY29uc3QgcGVuZGluZ0RlbGV0ZSA9IHMzQ2xpZW50LnNlbmQoXG4gICAgICAgICAgICBuZXcgRGVsZXRlT2JqZWN0c0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICBEZWxldGU6IHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0czogY3VyRGVsZXRlQmF0Y2gubWFwKG91dGRhdGVkS2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7S2V5OiBvdXRkYXRlZEtleX07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBwZW5kaW5nRGVsZXRlcy5wdXNoKHBlbmRpbmdEZWxldGUpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nRGVsZXRlcyk7XG59O1xuXG5leHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFMzQ2xpZW50KHtyZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT059KTtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IHByb2Nlc3MuZW52LlNUQVRJQ19BU1NFVFNfQlVDS0VUO1xuICAgICAgICBpZiAoIWJ1Y2tldE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRpYyBhc3NldCdzIGJ1Y2tldCBuYW1lIG5vdCBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5PVVREQVRFRF9BU1NFVFNfUkVURU5USU9OX0RBWVMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmV0YWluIGR1cmF0aW9uIG9mIHN0YXRpYyBhc3NldHMgbm90IHNwZWNpZmllZCEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXRhaW5Bc3NldHNJbkRheXMgPSBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy5lbnYuT1VUREFURURfQVNTRVRTX1JFVEVOVElPTl9EQVlTKTtcbiAgICAgICAgY29uc3QgY3VycmVudFJldmlzaW9uID0gYXdhaXQgZ2V0Q3VycmVudFJldmlzaW9uKGNsaWVudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGNvbnN0IGRlbGV0ZU9sZGVyVGhhbiA9IG5ldyBEYXRlKGN1cnJlbnRSZXZpc2lvbi5nZXRUaW1lKCkgLSByZXRhaW5Bc3NldHNJbkRheXMgKiBPTkVfREFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAgICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIGNsZWFudXAgb2Ygc3RhdGljIGFzc2V0cyBvbGRlciB0aGFuICR7ZGVsZXRlT2xkZXJUaGFuLnRvSVNPU3RyaW5nKCl9Li4uYCk7XG5cbiAgICAgICAgbGV0IGFzc2V0S2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgbGFzdFRva2VuID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbnN0IGN1ckFzc2V0c1Jlc3VsdDogTGlzdE9iamVjdHNWMkNvbW1hbmRPdXRwdXQgPSBhd2FpdCBjbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgICBuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIE1heEtleXM6IDI1MCxcbiAgICAgICAgICAgICAgICAgICAgQ29udGludWF0aW9uVG9rZW46IGxhc3RUb2tlbixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUmVhZCBvYmplY3QgbWV0YWRhdGEgaW4gYmxvY2tzIG9mIDEwXG4gICAgICAgICAgICBsZXQgcHJvY2Vzc2FibGVBc3NldHMgPSBbLi4uY3VyQXNzZXRzUmVzdWx0LkNvbnRlbnRzIV07XG5cbiAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzYWJsZUFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXNzZXRzQmF0Y2ggPSBwcm9jZXNzYWJsZUFzc2V0cy5zbGljZSgwLCAxMCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2FibGVBc3NldHMgPSBwcm9jZXNzYWJsZUFzc2V0cy5zbGljZSgxMCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nTWV0YWRhdGFSZXF1ZXN0cyA9IGFzc2V0c0JhdGNoLm1hcChhc3NldCA9PlxuICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIZWFkT2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTogYXNzZXQuS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nTWV0YWRhdGFSZXF1ZXN0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBc3NpZ24gbWV0YWRhdGEgdG8gYXNzZXRzXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFCeUFzc2V0OiBBc3NldE1ldGFkYXRhW10gPSAobWV0YWRhdGFSZXN1bHRzLm1hcCgobWV0YWRhdGFSZXN1bHQsIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGFzc2V0c0JhdGNoW2luZGV4XS5LZXksXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YVJlc3VsdC5NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICB9KSkgYXMgQXNzZXRNZXRhZGF0YVtdKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dGRhdGVkQXNzZXRLZXlzID0gZmlsdGVyT3V0ZGF0ZWRBc3NldEtleXMobWV0YWRhdGFCeUFzc2V0LCBkZWxldGVPbGRlclRoYW4pO1xuICAgICAgICAgICAgICAgIGFzc2V0S2V5c1RvRGVsZXRlLnB1c2goLi4ub3V0ZGF0ZWRBc3NldEtleXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdFRva2VuID0gY3VyQXNzZXRzUmVzdWx0Lk5leHRDb250aW51YXRpb25Ub2tlbjtcbiAgICAgICAgfSB3aGlsZSAobGFzdFRva2VuICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIGlmIChhc3NldEtleXNUb0RlbGV0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBvdXRkYXRlZCBhc3NldHMgdG8gZGVsZXRlIGZvdW5kJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRpbmcgJyArIGFzc2V0S2V5c1RvRGVsZXRlLmxlbmd0aCArICcgYXNzZXRzLi4uJyk7XG5cbiAgICAgICAgLy8gRGVsZXRlIG91dGRhdGVkIGFzc2V0cyAobWF4LiAxMDAwIGFsbG93ZWQgcGVyIHJlcXVlc3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBkZWxldGVBc3NldHMoYXNzZXRLZXlzVG9EZWxldGUsIGNsaWVudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMucmVkdWNlKChwcmV2aW91c1Jlc3VsdDogYm9vbGVhbiwgY3VycmVudFJlc3VsdDogRGVsZXRlT2JqZWN0c0NvbW1hbmRPdXRwdXQpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFcnJvcjogYm9vbGVhbiA9ICEhKGN1cnJlbnRSZXN1bHQuRXJyb3JzICYmIGN1cnJlbnRSZXN1bHQuRXJyb3JzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWxldGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cycsIGN1cnJlbnRSZXN1bHQuRXJyb3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1Jlc3VsdCB8fCBjdXJyZW50RXJyb3I7XG4gICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICBpZiAoZmFpbGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZWxldGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ0NsZWFudXAgb2Ygb2xkIHN0YXRpYyBhc3NldHMgZmluaXNoZWQnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCcjIyMgdW5leHBlY3RlZCBydW50aW1lIGVycm9yICMjIycsIGVycm9yKTtcbiAgICB9XG59OyJdfQ==
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQU00QjtBQUU1QixnREFBc0M7QUFRdEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFBRSxRQUFrQixFQUFFLFVBQWtCLEVBQWlCLEVBQUU7SUFDdkYsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUNwQyxJQUFJLDRCQUFnQixDQUFDO1FBQ2pCLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLEdBQUcsRUFBRSxjQUFjO0tBQ3RCLENBQUMsQ0FDTCxDQUFDO0lBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUEsZ0JBQUksRUFBQyxZQUFZLENBQUMsSUFBZ0IsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLENBQUMsZUFBZ0MsRUFBRSxlQUFxQixFQUFZLEVBQUU7SUFDbEcsT0FBTyxlQUFlO1NBQ2pCLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUNwQixhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRTtRQUNsRixDQUFDLENBQUMsS0FBSyxDQUNkO1NBQ0EsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUN0QixTQUFt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bWFuZCxcbiAgICBEZWxldGVPYmplY3RzQ29tbWFuZE91dHB1dCxcbiAgICBHZXRPYmplY3RDb21tYW5kLCBIZWFkT2JqZWN0Q29tbWFuZCxcbiAgICBMaXN0T2JqZWN0c1YyQ29tbWFuZCxcbiAgICBTM0NsaWVudFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgdHlwZSB7TGlzdE9iamVjdHNWMkNvbW1hbmRPdXRwdXR9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB7dGV4dH0gZnJvbSAnc3RyZWFtL2NvbnN1bWVycyc7XG5pbXBvcnQge1JlYWRhYmxlfSBmcm9tIFwic3RyZWFtXCI7XG5cbmludGVyZmFjZSBBc3NldE1ldGFkYXRhIHtcbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICByZWFkb25seSBtZXRhZGF0YToge1trZXk6IHN0cmluZ106IHN0cmluZ307XG59XG5cbmNvbnN0IE1BWF9ERUxFVEVfT0JKRUNUX0tFWVMgPSAxMDAwO1xuY29uc3QgT05FX0RBWV9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwICogNjAgKiA2MCAqIDI0O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGVwbG95bWVudCByZXZpc2lvbiAoYnVpbGQgdGltZXN0YW1wKS5cbiAqL1xuY29uc3QgZ2V0Q3VycmVudFJldmlzaW9uID0gYXN5bmMgKHMzQ2xpZW50OiBTM0NsaWVudCwgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxEYXRlPiA9PiB7XG4gICAgY29uc3QgcmV2aXNpb25GaWxlID0gYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgICAgbmV3IEdldE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgS2V5OiAnYXBwLXJldmlzaW9uJyxcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBEYXRlKGF3YWl0IHRleHQocmV2aXNpb25GaWxlLkJvZHkgYXMgUmVhZGFibGUpKTtcbn07XG5cbi8qKlxuICogRmlsdGVycyB0aGUgZ2l2ZW4gYXNzZXRzIGJ5IGluc3BlY3RpbmcgdGhlaXIgcmV2aXNpb24gYW5kIHJldHVybnMgdGhvc2UsIHRoYXQgYXJlIG9sZGVyIHRoYW4gdGhlIHNwZWNpZmllZCBjdXRvZmYgZGF0ZS5cbiAqL1xuY29uc3QgZmlsdGVyT3V0ZGF0ZWRBc3NldEtleXMgPSAobWV0YWRhdGFSZXN1bHRzOiBBc3NldE1ldGFkYXRhW10sIHJldHVybk9sZGVyVGhhbjogRGF0ZSk6IHN0cmluZ1tdID0+IHtcbiAgICByZXR1cm4gbWV0YWRhdGFSZXN1bHRzXG4gICAgICAgIC5maWx0ZXIoYXNzZXRNZXRhZGF0YSA9PlxuICAgICAgICAgICAgYXNzZXRNZXRhZGF0YS5tZXRhZGF0YS5yZXZpc2lvblxuICAgICAgICAgICAgICAgID8gbmV3IERhdGUoYXNzZXRNZXRhZGF0YS5tZXRhZGF0YS5yZXZpc2lvbikuZ2V0VGltZSgpIDw9IHJldHVybk9sZGVyVGhhbi5nZXRUaW1lKClcbiAgICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgIClcbiAgICAgICAgLm1hcChmaWx0ZXJlZEFzc2V0cyA9PiBmaWx0ZXJlZEFzc2V0cy5rZXkpO1xufTtcblxuLyoqXG4gKiBEZWxldGVzIHRoZSBnaXZlbiBhc3NldHMuXG4gKi9cbmNvbnN0IGRlbGV0ZUFzc2V0cyA9IGFzeW5jIChcbiAgICBhc3NldEtleXM6IHN0cmluZ1tdLFxuICAgIHMzQ2xpZW50OiBTM0NsaWVudCxcbiAgICBidWNrZXROYW1lOiBzdHJpbmdcbik6IFByb21pc2U8RGVsZXRlT2JqZWN0c0NvbW1hbmRPdXRwdXRbXT4gPT4ge1xuICAgIGxldCByZW1haW5pbmdBc3NldEtleXNUb0RlbGV0ZSA9IFsuLi5hc3NldEtleXNdO1xuICAgIGNvbnN0IHBlbmRpbmdEZWxldGVzID0gW107XG5cbiAgICB3aGlsZSAocmVtYWluaW5nQXNzZXRLZXlzVG9EZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJEZWxldGVCYXRjaCA9IHJlbWFpbmluZ0Fzc2V0S2V5c1RvRGVsZXRlLnNsaWNlKDAsIE1BWF9ERUxFVEVfT0JKRUNUX0tFWVMpO1xuICAgICAgICByZW1haW5pbmdBc3NldEtleXNUb0RlbGV0ZSA9IHJlbWFpbmluZ0Fzc2V0S2V5c1RvRGVsZXRlLnNsaWNlKE1BWF9ERUxFVEVfT0JKRUNUX0tFWVMpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGluZyBhc3NldHM6JywgY3VyRGVsZXRlQmF0Y2gpO1xuXG4gICAgICAgIGNvbnN0IHBlbmRpbmdEZWxldGUgPSBzM0NsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IERlbGV0ZU9iamVjdHNDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgRGVsZXRlOiB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdHM6IGN1ckRlbGV0ZUJhdGNoLm1hcChvdXRkYXRlZEtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge0tleTogb3V0ZGF0ZWRLZXl9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcGVuZGluZ0RlbGV0ZXMucHVzaChwZW5kaW5nRGVsZXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwocGVuZGluZ0RlbGV0ZXMpO1xufTtcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBhbnksIGNvbnRleHQ6IGFueSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTM0NsaWVudCh7cmVnaW9uOiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OfSk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBwcm9jZXNzLmVudi5TVEFUSUNfQVNTRVRTX0JVQ0tFVDtcbiAgICAgICAgaWYgKCFidWNrZXROYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0aWMgYXNzZXQncyBidWNrZXQgbmFtZSBub3Qgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJvY2Vzcy5lbnYuT1VUREFURURfQVNTRVRTX1JFVEVOVElPTl9EQVlTKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JldGFpbiBkdXJhdGlvbiBvZiBzdGF0aWMgYXNzZXRzIG5vdCBzcGVjaWZpZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0YWluQXNzZXRzSW5EYXlzID0gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MuZW52Lk9VVERBVEVEX0FTU0VUU19SRVRFTlRJT05fREFZUyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXZpc2lvbiA9IGF3YWl0IGdldEN1cnJlbnRSZXZpc2lvbihjbGllbnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICBjb25zdCBkZWxldGVPbGRlclRoYW4gPSBuZXcgRGF0ZShjdXJyZW50UmV2aXNpb24uZ2V0VGltZSgpIC0gcmV0YWluQXNzZXRzSW5EYXlzICogT05FX0RBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdGFydGluZyBjbGVhbnVwIG9mIHN0YXRpYyBhc3NldHMgb2xkZXIgdGhhbiAke2RlbGV0ZU9sZGVyVGhhbi50b0lTT1N0cmluZygpfS4uLmApO1xuICAgICAgICBjb25zb2xlLmxvZyhgQ3VycmVudCByZXZpc2lvbjogJHtjdXJyZW50UmV2aXNpb24udG9JU09TdHJpbmcoKX0sIFJldGVudGlvbiBkYXlzOiAke3JldGFpbkFzc2V0c0luRGF5c31gKTtcblxuICAgICAgICBsZXQgYXNzZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBsYXN0VG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB0b3RhbEFzc2V0c1NjYW5uZWQgPSAwO1xuICAgICAgICBsZXQgdG90YWxCYXRjaGVzID0gMDtcbiAgICAgICAgY29uc3QgYXNzZXRzRGVsZXRlUmVzdWx0czogRGVsZXRlT2JqZWN0c0NvbW1hbmRPdXRwdXRbXSA9IFtdO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbnN0IGN1ckFzc2V0c1Jlc3VsdDogTGlzdE9iamVjdHNWMkNvbW1hbmRPdXRwdXQgPSBhd2FpdCBjbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgICBuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIFByZWZpeDogJ19udXh0LycsIC8vIE9ubHkgc2NhbiBfbnV4dC8gZGlyZWN0b3J5IHdoZXJlIGJ1aWxkIGFzc2V0cyBhcmUgc3RvcmVkXG4gICAgICAgICAgICAgICAgICAgIE1heEtleXM6IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIENvbnRpbnVhdGlvblRva2VuOiBsYXN0VG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICghY3VyQXNzZXRzUmVzdWx0LkNvbnRlbnRzIHx8IGN1ckFzc2V0c1Jlc3VsdC5Db250ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTm8gYXNzZXRzIGZvdW5kIGluIGN1cnJlbnQgYmF0Y2gnKTtcbiAgICAgICAgICAgICAgICBsYXN0VG9rZW4gPSBjdXJBc3NldHNSZXN1bHQuTmV4dENvbnRpbnVhdGlvblRva2VuO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0b3RhbEFzc2V0c1NjYW5uZWQgKz0gY3VyQXNzZXRzUmVzdWx0LkNvbnRlbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBCYXRjaCAkeysrdG90YWxCYXRjaGVzfTogU2Nhbm5pbmcgJHtjdXJBc3NldHNSZXN1bHQuQ29udGVudHMubGVuZ3RofSBhc3NldHMgKFRvdGFsOiAke3RvdGFsQXNzZXRzU2Nhbm5lZH0pYCk7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgb2JqZWN0IG1ldGFkYXRhIGluIGJsb2NrcyBvZiA1MCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgICAgICAgICBsZXQgcHJvY2Vzc2FibGVBc3NldHMgPSBbLi4uY3VyQXNzZXRzUmVzdWx0LkNvbnRlbnRzXTtcblxuICAgICAgICAgICAgd2hpbGUgKHByb2Nlc3NhYmxlQXNzZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhc3NldHNCYXRjaCA9IHByb2Nlc3NhYmxlQXNzZXRzLnNsaWNlKDAsIDUwKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzYWJsZUFzc2V0cyA9IHByb2Nlc3NhYmxlQXNzZXRzLnNsaWNlKDUwKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdNZXRhZGF0YVJlcXVlc3RzID0gYXNzZXRzQmF0Y2gubWFwKGFzc2V0ID0+XG4gICAgICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhlYWRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5OiBhc3NldC5LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3IgJHthc3NldC5LZXl9OmAsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgTWV0YWRhdGE6IHt9IH07IC8vIFJldHVybiBlbXB0eSBtZXRhZGF0YSBvbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nTWV0YWRhdGFSZXF1ZXN0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBc3NpZ24gbWV0YWRhdGEgdG8gYXNzZXRzXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFCeUFzc2V0OiBBc3NldE1ldGFkYXRhW10gPSBtZXRhZGF0YVJlc3VsdHMubWFwKChtZXRhZGF0YVJlc3VsdCwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYXNzZXRzQmF0Y2hbaW5kZXhdLktleSEsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YVJlc3VsdC5NZXRhZGF0YSB8fCB7fSxcbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRkYXRlZEFzc2V0S2V5cyA9IGZpbHRlck91dGRhdGVkQXNzZXRLZXlzKG1ldGFkYXRhQnlBc3NldCwgZGVsZXRlT2xkZXJUaGFuKTtcbiAgICAgICAgICAgICAgICBhc3NldEtleXNUb0RlbGV0ZS5wdXNoKC4uLm91dGRhdGVkQXNzZXRLZXlzKTtcblxuICAgICAgICAgICAgICAgIC8vIFN0cmVhbSBkZWxldGlvbjogRGVsZXRlIGluIGJhdGNoZXMgb2YgMTAwMCB0byBhdm9pZCBtZW1vcnkgaXNzdWVzIGFuZCB0aW1lb3V0c1xuICAgICAgICAgICAgICAgIGlmIChhc3NldEtleXNUb0RlbGV0ZS5sZW5ndGggPj0gTUFYX0RFTEVURV9PQkpFQ1RfS0VZUykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgYmF0Y2ggb2YgJHthc3NldEtleXNUb0RlbGV0ZS5sZW5ndGh9IGFzc2V0cy4uLmApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZGVsZXRlQXNzZXRzKGFzc2V0S2V5c1RvRGVsZXRlLCBjbGllbnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBhc3NldHNEZWxldGVSZXN1bHRzLnB1c2goLi4ucmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgIGFzc2V0S2V5c1RvRGVsZXRlID0gW107IC8vIENsZWFyIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RUb2tlbiA9IGN1ckFzc2V0c1Jlc3VsdC5OZXh0Q29udGludWF0aW9uVG9rZW47XG4gICAgICAgIH0gd2hpbGUgKGxhc3RUb2tlbiAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICAvLyBEZWxldGUgcmVtYWluaW5nIGFzc2V0c1xuICAgICAgICBpZiAoYXNzZXRLZXlzVG9EZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nIGZpbmFsIGJhdGNoIG9mICR7YXNzZXRLZXlzVG9EZWxldGUubGVuZ3RofSBhc3NldHMuLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBkZWxldGVBc3NldHMoYXNzZXRLZXlzVG9EZWxldGUsIGNsaWVudCwgYnVja2V0TmFtZSk7XG4gICAgICAgICAgICBhc3NldHNEZWxldGVSZXN1bHRzLnB1c2goLi4ucmVzdWx0cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZGVsZXRpb24gZXJyb3JzIGFuZCByZXBvcnRcbiAgICAgICAgY29uc3QgZmFpbGVkID0gYXNzZXRzRGVsZXRlUmVzdWx0cy5yZWR1Y2UoKHByZXZpb3VzUmVzdWx0OiBib29sZWFuLCBjdXJyZW50UmVzdWx0OiBEZWxldGVPYmplY3RzQ29tbWFuZE91dHB1dCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFzQ3VycmVudEVycm9yOiBib29sZWFuID0gISEoY3VycmVudFJlc3VsdC5FcnJvcnMgJiYgY3VycmVudFJlc3VsdC5FcnJvcnMubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICBpZiAoaGFzQ3VycmVudEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRlbGV0ZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzJywgY3VycmVudFJlc3VsdC5FcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzUmVzdWx0IHx8IGhhc0N1cnJlbnRFcnJvcjtcbiAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGRlbGV0ZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgQ2xlYW51cCBvZiBvbGQgc3RhdGljIGFzc2V0cyBmaW5pc2hlZC4gVG90YWwgYXNzZXRzIHNjYW5uZWQ6ICR7dG90YWxBc3NldHNTY2FubmVkfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyMjIyB1bmV4cGVjdGVkIHJ1bnRpbWUgZXJyb3IgIyMjJywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdG8gbWFyayBMYW1iZGEgYXMgZmFpbGVkXG4gICAgfVxufTsiXX0=
|
|
@@ -93,25 +93,39 @@ exports.handler = async (event: any, context: any) => {
|
|
|
93
93
|
const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);
|
|
94
94
|
|
|
95
95
|
console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);
|
|
96
|
+
console.log(`Current revision: ${currentRevision.toISOString()}, Retention days: ${retainAssetsInDays}`);
|
|
96
97
|
|
|
97
98
|
let assetKeysToDelete: string[] = [];
|
|
98
99
|
let lastToken = undefined;
|
|
100
|
+
let totalAssetsScanned = 0;
|
|
101
|
+
let totalBatches = 0;
|
|
102
|
+
const assetsDeleteResults: DeleteObjectsCommandOutput[] = [];
|
|
99
103
|
|
|
100
104
|
do {
|
|
101
105
|
const curAssetsResult: ListObjectsV2CommandOutput = await client.send(
|
|
102
106
|
new ListObjectsV2Command({
|
|
103
107
|
Bucket: bucketName,
|
|
104
|
-
|
|
108
|
+
Prefix: '_nuxt/', // Only scan _nuxt/ directory where build assets are stored
|
|
109
|
+
MaxKeys: 1000,
|
|
105
110
|
ContinuationToken: lastToken,
|
|
106
111
|
})
|
|
107
112
|
);
|
|
108
113
|
|
|
109
|
-
|
|
110
|
-
|
|
114
|
+
if (!curAssetsResult.Contents || curAssetsResult.Contents.length === 0) {
|
|
115
|
+
console.log('No assets found in current batch');
|
|
116
|
+
lastToken = curAssetsResult.NextContinuationToken;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
totalAssetsScanned += curAssetsResult.Contents.length;
|
|
121
|
+
console.log(`Batch ${++totalBatches}: Scanning ${curAssetsResult.Contents.length} assets (Total: ${totalAssetsScanned})`);
|
|
122
|
+
|
|
123
|
+
// Read object metadata in blocks of 50 for better performance
|
|
124
|
+
let processableAssets = [...curAssetsResult.Contents];
|
|
111
125
|
|
|
112
126
|
while (processableAssets.length > 0) {
|
|
113
|
-
const assetsBatch = processableAssets.slice(0,
|
|
114
|
-
processableAssets = processableAssets.slice(
|
|
127
|
+
const assetsBatch = processableAssets.slice(0, 50);
|
|
128
|
+
processableAssets = processableAssets.slice(50);
|
|
115
129
|
|
|
116
130
|
const pendingMetadataRequests = assetsBatch.map(asset =>
|
|
117
131
|
client.send(
|
|
@@ -119,46 +133,57 @@ exports.handler = async (event: any, context: any) => {
|
|
|
119
133
|
Bucket: bucketName,
|
|
120
134
|
Key: asset.Key,
|
|
121
135
|
})
|
|
122
|
-
)
|
|
136
|
+
).catch(error => {
|
|
137
|
+
console.warn(`Failed to get metadata for ${asset.Key}:`, error.message);
|
|
138
|
+
return { Metadata: {} }; // Return empty metadata on error
|
|
139
|
+
})
|
|
123
140
|
);
|
|
124
141
|
|
|
125
142
|
const metadataResults = await Promise.all(pendingMetadataRequests);
|
|
126
143
|
|
|
127
144
|
// Assign metadata to assets
|
|
128
|
-
const metadataByAsset: AssetMetadata[] =
|
|
129
|
-
key: assetsBatch[index].Key
|
|
130
|
-
metadata: metadataResult.Metadata,
|
|
131
|
-
}))
|
|
145
|
+
const metadataByAsset: AssetMetadata[] = metadataResults.map((metadataResult, index) => ({
|
|
146
|
+
key: assetsBatch[index].Key!,
|
|
147
|
+
metadata: metadataResult.Metadata || {},
|
|
148
|
+
}));
|
|
132
149
|
|
|
133
150
|
const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);
|
|
134
151
|
assetKeysToDelete.push(...outdatedAssetKeys);
|
|
152
|
+
|
|
153
|
+
// Stream deletion: Delete in batches of 1000 to avoid memory issues and timeouts
|
|
154
|
+
if (assetKeysToDelete.length >= MAX_DELETE_OBJECT_KEYS) {
|
|
155
|
+
console.log(`Deleting batch of ${assetKeysToDelete.length} assets...`);
|
|
156
|
+
const results = await deleteAssets(assetKeysToDelete, client, bucketName);
|
|
157
|
+
assetsDeleteResults.push(...results);
|
|
158
|
+
assetKeysToDelete = []; // Clear the array
|
|
159
|
+
}
|
|
135
160
|
}
|
|
136
161
|
lastToken = curAssetsResult.NextContinuationToken;
|
|
137
162
|
} while (lastToken !== undefined);
|
|
138
163
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
164
|
+
// Delete remaining assets
|
|
165
|
+
if (assetKeysToDelete.length > 0) {
|
|
166
|
+
console.log(`Deleting final batch of ${assetKeysToDelete.length} assets...`);
|
|
167
|
+
const results = await deleteAssets(assetKeysToDelete, client, bucketName);
|
|
168
|
+
assetsDeleteResults.push(...results);
|
|
142
169
|
}
|
|
143
170
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const failed = results.reduce((previousResult: boolean, currentResult: DeleteObjectsCommandOutput): boolean => {
|
|
149
|
-
const currentError: boolean = !!(currentResult.Errors && currentResult.Errors.length > 0);
|
|
150
|
-
if (currentError) {
|
|
171
|
+
// Check for deletion errors and report
|
|
172
|
+
const failed = assetsDeleteResults.reduce((previousResult: boolean, currentResult: DeleteObjectsCommandOutput): boolean => {
|
|
173
|
+
const hasCurrentError: boolean = !!(currentResult.Errors && currentResult.Errors.length > 0);
|
|
174
|
+
if (hasCurrentError) {
|
|
151
175
|
console.error('Failed to delete outdated static assets', currentResult.Errors);
|
|
152
176
|
}
|
|
153
|
-
return previousResult ||
|
|
177
|
+
return previousResult || hasCurrentError;
|
|
154
178
|
}, false);
|
|
155
179
|
|
|
156
180
|
if (failed) {
|
|
157
181
|
throw new Error('Failed to delete outdated static assets');
|
|
158
182
|
}
|
|
159
183
|
|
|
160
|
-
console.log(
|
|
184
|
+
console.log(`Cleanup of old static assets finished. Total assets scanned: ${totalAssetsScanned}`);
|
|
161
185
|
} catch (error) {
|
|
162
186
|
console.error('### unexpected runtime error ###', error);
|
|
187
|
+
throw error; // Re-throw to mark Lambda as failed
|
|
163
188
|
}
|
|
164
189
|
};
|
|
@@ -160,8 +160,12 @@ class AccessLogsTableConfig {
|
|
|
160
160
|
name: 'sc_range_end',
|
|
161
161
|
type: aws_glue_alpha_1.Schema.BIG_INT,
|
|
162
162
|
},
|
|
163
|
+
{
|
|
164
|
+
name: 'sc_status',
|
|
165
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
166
|
+
}
|
|
163
167
|
];
|
|
164
168
|
}
|
|
165
169
|
}
|
|
166
170
|
exports.AccessLogsTableConfig = AccessLogsTableConfig;
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc1RhYmxlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQWNjZXNzTG9nc1RhYmxlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsNERBQTREO0FBRTVELE1BQWEscUJBQXFCO0lBQ3pCLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTztZQUNMO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSx1QkFBTSxDQUFDLE1BQU07YUFDcEI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNEO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSx1QkFBTSxDQUFDLE1BQU07YUFDcEI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxlQUFlO1FBQzNCLE9BQU87WUFDTDtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxJQUFJO2FBQ2xCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNEO2dCQUNFLElBQUksRUFBRSxVQUFVO2dCQUNoQixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLHVCQUFNLENBQUMsT0FBTzthQUNyQjtZQUNEO2dCQUNFLElBQUksRUFBRSxZQUFZO2dCQUNsQixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNE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SSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsS0Qsc0RBa0tDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm92aWRlcyB0aGUgY29sdW1uIGRlc2NyaXB0aW9ucyBmb3IgYm90aCBvZiB0aGUgYWNjZXNzIGxvZyB0YWJsZXMuXG4gKi9cbmltcG9ydCB7dHlwZSBDb2x1bW4sIFNjaGVtYX0gZnJvbSAnQGF3cy1jZGsvYXdzLWdsdWUtYWxwaGEnO1xuXG5leHBvcnQgY2xhc3MgQWNjZXNzTG9nc1RhYmxlQ29uZmlnIHtcbiAgcHVibGljIHN0YXRpYyBnZXRQYXJ0aXRpb25LZXlzKCk6IENvbHVtbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAneWVhcicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnbW9udGgnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2RheScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaG91cicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFRhYmxlQ29sdW1ucygpOiBDb2x1bW5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2RhdGUnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuREFURSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0aW1lJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdsb2NhdGlvbicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnYnl0ZXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuQklHX0lOVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZXF1ZXN0X2lwJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdtZXRob2QnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hvc3QnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3VyaScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc3RhdHVzJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVmZXJyZXInLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3VzZXJfYWdlbnQnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3F1ZXJ5X3N0cmluZycsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY29va2llJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZXN1bHRfdHlwZScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVxdWVzdF9pZCcsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaG9zdF9oZWFkZXInLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3RfcHJvdG9jb2wnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3RfYnl0ZXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuQklHX0lOVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0aW1lX3Rha2VuJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkZMT0FULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3hmb3J3YXJkZWRfZm9yJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzc2xfcHJvdG9jb2wnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NzbF9jaXBoZXInLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Jlc3BvbnNlX3Jlc3VsdF90eXBlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdodHRwX3ZlcnNpb24nLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2ZsZV9zdGF0dXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2ZsZV9lbmNyeXB0ZWRfZmllbGRzJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY19wb3J0JyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndGltZV90b19maXJzdF9ieXRlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkZMT0FULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3hfZWRnZV9kZXRhaWxlZF9yZXN1bHRfdHlwZScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2NfY29udGVudF90eXBlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzY19jb250ZW50X2xlbicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5CSUdfSU5ULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NjX3JhbmdlX3N0YXJ0JyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkJJR19JTlQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2NfcmFuZ2VfZW5kJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkJJR19JTlQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2Nfc3RhdHVzJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH1cbiAgICBdO1xuICB9XG59XG4iXX0=
|
|
@@ -171,8 +171,8 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
171
171
|
code: aws_lambda_1.Code.fromAsset(`${functionDirPath}/build/app`, {
|
|
172
172
|
exclude: ['*.d.ts']
|
|
173
173
|
}),
|
|
174
|
-
timeout: aws_cdk_lib_1.Duration.minutes(
|
|
175
|
-
memorySize:
|
|
174
|
+
timeout: aws_cdk_lib_1.Duration.minutes(15),
|
|
175
|
+
memorySize: 512,
|
|
176
176
|
environment: {
|
|
177
177
|
STATIC_ASSETS_BUCKET: this.staticAssetsBucket.bucketName,
|
|
178
178
|
OUTDATED_ASSETS_RETENTION_DAYS: `${(_a = props.outdatedAssetsRetentionDays) !== null && _a !== void 0 ? _a : 30}`,
|
|
@@ -568,4 +568,4 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
568
568
|
}
|
|
569
569
|
}
|
|
570
570
|
exports.NuxtServerAppStack = NuxtServerAppStack;
|
|
571
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBZW9DO0FBQ3BDLHVEQUFzRjtBQUN0RiwrQ0FNNEI7QUFDNUIseURBQXdHO0FBQ3hHLHFFQUFxRjtBQUNyRiwrRUFBOEU7QUFDOUUseUVBQWlFO0FBQ2pFLG1EQUErRDtBQUMvRCxnRUFBNEY7QUFDNUYsdURBQXVFO0FBQ3ZFLHVFQUE4RDtBQUM5RCw2QkFBNkI7QUFDN0IsMkJBQXdEO0FBRXhELDZGQUFnRjtBQUNoRixtRUFBMkc7QUFFM0c7O0dBRUc7QUFDSCxNQUFhLGtCQUFtQixTQUFRLG1CQUFLO0lBa0d6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCOztRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNiLEdBQUcsS0FBSztZQUVSLHVFQUF1RTtZQUN2RSxxQkFBcUIsRUFBRSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxDQUFBLE1BQUEsS0FBSyxDQUFDLEdBQUcsMENBQUUsTUFBTSxNQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCO1NBQ2pJLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakYscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUEsa0RBQTRCLEVBQUMsTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FBSSxHQUFHLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBRTFELElBQUksS0FBSyxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNwRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzFELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDOUQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFBO1FBRW5FLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUIsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHdCQUF3QixDQUFDLEtBQThCOztRQUMzRCxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLElBQUEsY0FBUyxFQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLElBQUEsa0JBQWEsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVsRixPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHVCQUF1QjtRQUMzQixNQUFNLHdCQUF3QixHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixnQkFBZ0IsQ0FBQztRQUMxRSxPQUFPLElBQUkscUNBQW9CLENBQUMsSUFBSSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx3QkFBd0I7UUFDNUIsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFNBQVMsQ0FBQztRQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hDLGlCQUFpQixFQUFFLDBCQUFpQixDQUFDLFNBQVM7WUFDOUMsVUFBVTtZQUNWLHVHQUF1RztZQUN2RyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsZUFBZSxFQUFFLHdCQUFlLENBQUMscUJBQXFCO1NBQ3pELENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFOUMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxtQkFBbUI7UUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFVBQVUsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hDLFVBQVU7WUFDVixhQUFhLEVBQUUsNEJBQW1CLENBQUMsT0FBTztZQUMxQyxpQkFBaUIsRUFBRSwwQkFBaUIsQ0FBQyxTQUFTO1lBQzlDLFVBQVUsRUFBRSx5QkFBZ0IsQ0FBQyxVQUFVO1lBQ3ZDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHVHQUF1RztZQUN2RyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLGlCQUFpQixFQUFFLElBQUk7U0FDMUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU5QyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHVCQUF1QixDQUFDLEtBQThCOztRQUMxRCxNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsT0FBTyxDQUFDO1FBRWpELE1BQU0sV0FBVyxHQUFHLElBQUksbUJBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLE9BQU8sRUFBRTtZQUN2RCxZQUFZLEVBQUUsZUFBZSxRQUFRLEVBQUU7WUFDdkMsU0FBUyxFQUFFLHdCQUFhLENBQUMsU0FBUztTQUNyQyxDQUFDLENBQUM7UUFDSCxXQUFXLENBQUMsa0JBQWtCLENBQUMsMkJBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV0RCxPQUFPLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ2hDLFlBQVksRUFBRSxRQUFRO1lBQ3RCLFdBQVcsRUFBRSxlQUFlLElBQUksQ0FBQyxnQkFBZ0IsWUFBWTtZQUM3RCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLFlBQVksRUFBRSx5QkFBWSxDQUFDLE1BQU07WUFDakMsT0FBTyxFQUFFLEdBQUcsTUFBQSxLQUFLLENBQUMsVUFBVSxtQ0FBSSxPQUFPLFVBQVU7WUFDakQsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FBSSxHQUFJLGlCQUFpQixFQUFFO2dCQUM1RCxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO2FBQ2pFLENBQUM7WUFDRixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLFVBQVUsRUFBRSxNQUFBLEtBQUssQ0FBQyxVQUFVLG1DQUFJLElBQUk7WUFDcEMsaUJBQWlCLEVBQUUsS0FBSztZQUN4QixPQUFPLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsb0JBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLG9CQUFPLENBQUMsUUFBUTtZQUNoRSxRQUFRLEVBQUUsV0FBVztZQUNyQixXQUFXLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLHNCQUFzQjtnQkFDcEMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQUEsS0FBSyxDQUFDLGFBQWEsbUNBQUksSUFBSSxDQUFDO2FBQzdDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSywyQkFBMkIsQ0FBQyxLQUE4Qjs7UUFDOUQsTUFBTSxZQUFZLEdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFVBQVUsQ0FBQztRQUNoRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sZUFBZSxHQUFHLElBQUksbUJBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxZQUFZLE9BQU8sRUFBRTtZQUMvRCxZQUFZLEVBQUUsZUFBZSxZQUFZLEVBQUU7WUFDM0MsU0FBUyxFQUFFLHdCQUFhLENBQUMsU0FBUztTQUNyQyxDQUFDLENBQUM7UUFDSCxlQUFlLENBQUMsa0JBQWtCLENBQUMsMkJBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxRCxNQUFNLE1BQU0sR0FBYSxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUN0RCxZQUFZLEVBQUUsWUFBWTtZQUMxQixXQUFXLEVBQUUsa0RBQWtELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLGFBQWE7WUFDOUcsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixZQUFZLEVBQUUseUJBQVksQ0FBQyxNQUFNO1lBQ2pDLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLGVBQWUsWUFBWSxFQUFFO2dCQUNqRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7YUFDdEIsQ0FBQztZQUNGLE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUIsVUFBVSxFQUFFLEdBQUc7WUFDZixXQUFXLEVBQUU7Z0JBQ1Qsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVU7Z0JBQ3hELDhCQUE4QixFQUFFLEdBQUcsTUFBQSxLQUFLLENBQUMsMkJBQTJCLG1DQUFJLEVBQUUsRUFBRTtnQkFDNUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixtQ0FBbUMsRUFBRSxHQUFHO2dCQUN4QyxZQUFZLEVBQUUsc0JBQXNCO2FBQ3ZDO1lBQ0QsUUFBUSxFQUFFLGVBQWU7U0FDNUIsQ0FBQyxDQUFDO1FBRUgscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU1QyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQixDQUFDLEtBQThCO1FBQ25ELE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixNQUFNLENBQUM7UUFDL0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHFEQUFxQixDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixxQkFBcUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUzSCxzRUFBc0U7UUFDdEUsd0dBQXdHO1FBQ3hHLDJGQUEyRjtRQUMzRixNQUFNLFVBQVUsR0FBRyxJQUFJLDZCQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixhQUFhLEVBQUU7WUFDM0UsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3hCLFdBQVcsRUFBRSxvQ0FBVyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLHlCQUF5QixDQUFDO1lBQ25JLFlBQVksRUFBRSwrQkFBWSxDQUFDLFFBQVE7WUFDbkMsY0FBYyxFQUFFLGlDQUFjLENBQUMsT0FBTztTQUN6QyxDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBRyxJQUFJLDBCQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtZQUMxQyxPQUFPO1lBQ1AsV0FBVyxFQUFFLGdCQUFnQixJQUFJLENBQUMsZ0JBQWdCLHFDQUFxQyxJQUFJLENBQUMsZ0JBQWdCLGlEQUFpRDtZQUM3Six1R0FBdUc7WUFDdkcsYUFBYSxFQUFFLFNBQVM7WUFDeEIsa0JBQWtCLEVBQUUsaUJBQWlCO1lBQ3JDLG9CQUFvQixFQUFFO2dCQUNsQixVQUFVLEVBQUUsVUFBVTthQUN6QjtTQUNKLENBQUMsQ0FBQztRQUVILFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDakIsV0FBVyxFQUFFLGlCQUFpQjtZQUM5QixJQUFJLEVBQUUsV0FBVztZQUNqQixPQUFPLEVBQUU7Z0JBQ0wsNkJBQVUsQ0FBQyxHQUFHO2dCQUNkLDZCQUFVLENBQUMsSUFBSTtnQkFDZiw2QkFBVSxDQUFDLE9BQU87Z0JBQ2xCLDZCQUFVLENBQUMsSUFBSTtnQkFDZiw2QkFBVSxDQUFDLEdBQUc7Z0JBQ2QsNkJBQVUsQ0FBQyxLQUFLO2dCQUNoQiw2QkFBVSxDQUFDLE1BQU07YUFDcEI7U0FDSixDQUFDLENBQUM7UUFFSCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssNEJBQTRCLENBQUMsS0FBOEI7UUFDL0QsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLE1BQU0sQ0FBQztRQUUvQyxPQUFPLElBQUksNkJBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ25DLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDM0IsT0FBTyxFQUFFLE9BQU87WUFDaEIsc0JBQXNCLEVBQUUsdUNBQXNCLENBQUMsYUFBYTtZQUM1RCxXQUFXLEVBQUUsb0NBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHFCQUFxQixFQUFFLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztZQUMvSCxXQUFXLEVBQUUsNEJBQVcsQ0FBQyxXQUFXO1lBQ3BDLGVBQWUsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQzdDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7WUFDdkQsVUFBVSxFQUFFLDJCQUFVLENBQUMsZUFBZSxFQUFFLG9DQUFvQztZQUM1RSxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUNoQyxhQUFhLEVBQUUsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLHdCQUF3QjtZQUNsRCxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVM7U0FDNUIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCO1FBQzNCLE9BQU8sSUFBSSxtQ0FBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixJQUFJLENBQUMsTUFBTSxnQkFBZ0IsRUFBRTtZQUMzRixrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLGlCQUFpQixFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN0QyxXQUFXLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLGNBQWMsRUFBRSxxQ0FBb0IsQ0FBQyxVQUFVO1NBQ2xELENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssNkJBQTZCO1FBQ2pDLE9BQU87WUFDSCxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDdkIsY0FBYyxFQUFFLCtCQUFjLENBQUMsY0FBYztZQUM3QyxRQUFRLEVBQUUsSUFBSTtZQUNkLG9CQUFvQixFQUFFLHFDQUFvQixDQUFDLGlCQUFpQjtZQUM1RCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzFDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYztTQUNuQyxDQUFDO0lBQ04sQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQThCO1FBQ3pELElBQUksaUJBQWlCLEdBQW9DO1lBRXJELGdEQUFnRDtZQUNoRCxVQUFVLEVBQUUsSUFBSSxDQUFDLHVCQUF1QjtTQUMzQyxDQUFDO1FBRUYsc0JBQXNCO1FBQ3RCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xCLGlCQUFpQixHQUFHLEVBQUMsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFDLENBQUM7UUFDakYsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RCLGlCQUFpQixHQUFHLEVBQUMsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELCtFQUErRTtRQUMvRSxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsaUJBQWlCLEdBQUcsRUFBQyxHQUFHLGlCQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBQyxDQUFDO1FBQ3RHLENBQUM7UUFFRCxpQkFBaUIsR0FBRyxFQUFDLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLENBQUMsK0JBQStCLEVBQUUsRUFBQyxDQUFDO1FBRXRGLE9BQU8saUJBQWlCLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssd0JBQXdCLENBQUMsS0FBOEI7O1FBQzNELE9BQU8sSUFBSSw0QkFBVyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsZUFBZSxFQUFFO1lBQ2xFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsbUJBQW1CO1lBQzVELE9BQU8sRUFBRSw2Q0FBNkMsSUFBSSxDQUFDLGdCQUFnQiw4Q0FBOEM7WUFDekgsVUFBVSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDMUIsbUJBQW1CLEVBQUUsQ0FBQSxNQUFBLEtBQUssQ0FBQyxtQkFBbUIsMENBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQyx5Q0FBd0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLHVCQUF1QiwwQ0FBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDLHlDQUF3QixDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsTUFBQSxLQUFLLENBQUMsZ0JBQWdCLDBDQUFFLE1BQU0sRUFBQyxDQUFDLENBQUMseUNBQXdCLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxNQUFBLEtBQUssQ0FBQyxlQUFlLDBDQUFFLE1BQU0sRUFBQyxDQUFDLENBQUMseUNBQXdCLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5Q0FBd0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN2MsY0FBYyxFQUFFLENBQUEsTUFBQSxLQUFLLENBQUMsZUFBZSwwQ0FBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDLG9DQUFtQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQyxvQ0FBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9DQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFOLGNBQWMsRUFBRSxDQUFBLE1BQUEsS0FBSyxDQUFDLGVBQWUsMENBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQyxvQ0FBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLE1BQU0sRUFBQyxDQUFDLENBQUMsb0NBQW1CLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxTiwwQkFBMEIsRUFBRSxJQUFJO1lBQ2hDLHdCQUF3QixFQUFFLElBQUk7U0FDakMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNLLDBCQUEwQixDQUFDLEtBQThCOztRQUU3RCxnRkFBZ0Y7UUFDaEYsTUFBTSxZQUFZLEdBQUcsQ0FBQSxNQUFBLEtBQUssQ0FBQyxrQkFBa0IsMENBQUUsTUFBTSxNQUFJLE1BQUEsS0FBSyxDQUFDLGNBQWMsMENBQUUsTUFBTSxDQUFBLEtBQUksTUFBQSxLQUFLLENBQUMsY0FBYywwQ0FBRSxNQUFNLENBQUEsQ0FBQztRQUN0SCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEIsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sSUFBSSxvQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGlCQUFpQixFQUFFO1lBQzVFLHVCQUF1QixFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixxQkFBcUI7WUFDdEUsT0FBTyxFQUFFLDZDQUE2QyxJQUFJLENBQUMsZ0JBQWdCLDBDQUEwQztZQUNySCxtQkFBbUIsRUFBRSxDQUFBLE1BQUEsS0FBSyxDQUFDLGtCQUFrQiwwQ0FBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDLGlEQUFnQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpREFBZ0MsQ0FBQyxHQUFHLEVBQUU7WUFDeEssY0FBYyxFQUFFLENBQUEsTUFBQSxLQUFLLENBQUMsY0FBYywwQ0FBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDLDRDQUEyQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsNENBQTJCLENBQUMsSUFBSSxFQUFFO1lBQ2xKLGNBQWMsRUFBRSxDQUFBLE1BQUEsS0FBSyxDQUFDLGNBQWMsMENBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQyw0Q0FBMkIsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLDRDQUEyQixDQUFDLElBQUksRUFBRTtTQUNySixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxzQkFBc0I7UUFDMUIsTUFBTSxXQUFXLEdBQW9CO1lBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN2QixRQUFRLEVBQUUsSUFBSTtZQUNkLGNBQWMsRUFBRSwrQkFBYyxDQUFDLFNBQVM7WUFDeEMsYUFBYSxFQUFFLDhCQUFhLENBQUMsc0JBQXNCO1lBQ25ELFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNoQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzFDLG9CQUFvQixFQUFFLHFDQUFvQixDQUFDLFVBQVU7U0FDeEQsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFvQyxFQUFFLENBQUM7UUFDbEQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUU5QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHlCQUF5QixDQUFDLFlBQXNCO1FBQ3BELE1BQU0sS0FBSyxHQUFvQyxFQUFFLENBQUM7UUFFbEQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssK0JBQStCO1FBQ25DLE1BQU0sdUJBQXVCLEdBQW9CO1lBQzdDLE1BQU0sRUFBRSx1Q0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDckUsa0JBQWtCLEVBQUUsQ0FBQztnQkFDckIsaUJBQWlCLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2FBQy9DLENBQUM7WUFDRixRQUFRLEVBQUUsSUFBSTtZQUNkLGNBQWMsRUFBRSwrQkFBYyxDQUFDLHNCQUFzQjtZQUNyRCxhQUFhLEVBQUUsOEJBQWEsQ0FBQyxzQkFBc0I7WUFDbkQsV0FBVyxFQUFFLDRCQUFXLENBQUMsaUJBQWlCO1lBQzFDLG9CQUFvQixFQUFFLHFDQUFvQixDQUFDLGlCQUFpQjtTQUMvRCxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQW9DLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsdUJBQXVCLENBQUE7UUFDdEUsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLEtBQUssQ0FBQTtJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSywwQkFBMEI7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUVELE1BQU0sa0JBQWtCLEdBQW9CO1lBQ3hDLE1BQU0sRUFBRSx1Q0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ2hFLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3JCLGlCQUFpQixFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjthQUMvQyxDQUFDO1lBQ0YsUUFBUSxFQUFFLElBQUk7WUFDZCxjQUFjLEVBQUUsK0JBQWMsQ0FBQyxzQkFBc0I7WUFDckQsYUFBYSxFQUFFLDhCQUFhLENBQUMsc0JBQXNCO1lBQ25ELFdBQVcsRUFBRSw0QkFBVyxDQUFDLGlCQUFpQjtZQUMxQyxvQkFBb0IsRUFBRSxxQ0FBb0IsQ0FBQyxpQkFBaUI7U0FDL0QsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFvQyxFQUFFLENBQUM7UUFDbEQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDO1FBQzNDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLGtCQUFrQixDQUFDO1FBQ2hELEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztRQUUxQyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssb0JBQW9CO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHlCQUF5QixFQUFFO1lBQ25GLFlBQVksRUFBRSxlQUFlLElBQUksQ0FBQyxnQkFBZ0Isb0JBQW9CO1lBQ3RFLFNBQVMsRUFBRSx3QkFBYSxDQUFDLE9BQU87WUFDaEMsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztTQUN2QyxDQUFDLENBQUM7UUFFSCxzR0FBc0c7UUFDdEcsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBQSxlQUFVLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQy9GLE9BQU8sSUFBSSxvQ0FBZ0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHNCQUFzQixVQUFVLEVBQUUsRUFBRTtnQkFDMUYsT0FBTyxFQUFFLENBQUMsMEJBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTt3QkFDakMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO3FCQUN6QixDQUFDLENBQUM7Z0JBQ0gsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtnQkFDMUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLHVCQUF1QjtnQkFDaEYsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osWUFBWSxFQUFFLGdDQUFZLENBQUMsUUFBUTtnQkFDbkMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO2dCQUNkLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ3hCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixZQUFZLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUM3RCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDL0UsUUFBUSxFQUFFLFFBQVE7Z0JBRWxCLFFBQVEsRUFBRTtvQkFDTiwwRUFBMEU7b0JBQzFFLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2lCQUNwQztnQkFFRCxzR0FBc0c7Z0JBQ3RHLGdFQUFnRTtnQkFDaEUsV0FBVyxFQUFFLElBQUk7YUFDcEIsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxjQUFjLENBQUMsS0FBOEI7UUFDakQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFNUMsT0FBTyx3QkFBVSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsY0FBYyxFQUFFO1lBQ3JGLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxRQUFRLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUscUJBQXFCO1NBQ3ZFLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGdCQUFnQixDQUFDLEtBQThCO1FBQ25ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsMEJBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxzQ0FBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV6RSwyQkFBMkI7UUFDM0IsSUFBSSxxQkFBTyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsY0FBYyxFQUFFO1lBQ3RELFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTTtZQUN4QixJQUFJLEVBQUUsVUFBVTtZQUNoQixNQUFNLEVBQUUsU0FBUztTQUNwQixDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsSUFBSSx3QkFBVSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsY0FBYyxFQUFFO1lBQ3pELFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTTtZQUN4QixJQUFJLEVBQUUsVUFBVTtZQUNoQixNQUFNLEVBQUUsU0FBUztTQUNwQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQkFBaUIsQ0FBQyxLQUE4QjtRQUNwRCxNQUFNLHVCQUF1QixHQUFHO1lBQzVCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFVBQVUsRUFBRSxlQUFlO1lBQzNCLFNBQVMsRUFBRSxHQUFHO1lBQ2QsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixTQUFTLEVBQUUsRUFBRTtZQUNiLGdCQUFnQixFQUFFO2dCQUNkLFlBQVksRUFBRSxLQUFLLENBQUMsTUFBTTtnQkFDMUIsTUFBTSxFQUFFO29CQUNKLFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSxHQUFHO29CQUNYLFVBQVUsRUFBRSxVQUFVO2lCQUN6QjthQUNKO1NBQ0osQ0FBQztRQUVGLElBQUksaUJBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGNBQWMsRUFBRTtZQUNuRCxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFNBQVM7WUFDM0MsV0FBVyxFQUFFLG9DQUFvQyxJQUFJLENBQUMsZ0JBQWdCLHVDQUF1QztZQUM3RyxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxxQkFBUSxDQUFDLElBQUksQ0FBQyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLG1DQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO29CQUNqRCxLQUFLLEVBQUUsNEJBQWUsQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUM7aUJBQzdELENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQztJQUNQLENBQUM7SUFHRDs7Ozs7T0FLRztJQUNLLHdCQUF3QjtRQUM1QixJQUFJLGlCQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixpQkFBaUIsRUFBRTtZQUN0RCxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFlBQVk7WUFDOUMsV0FBVyxFQUFFLDJEQUEyRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxhQUFhO1lBQ3ZILE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUSxFQUFFLHFCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQztZQUNoRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLG1DQUFjLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDNUQsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCO1FBQzFCLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixjQUFjLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUN4QyxVQUFVO1lBQ1YsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsU0FBUztZQUM5QyxlQUFlLEVBQUUsd0JBQWUsQ0FBQyxzQkFBc0I7WUFDdkQsa0VBQWtFO1lBQ2xFLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87WUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFHTyx3QkFBd0IsQ0FBQyxLQUE4QjtRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxNQUFNLEVBQUUsNEJBQTRCLEVBQUUsR0FBRyxPQUFPLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUV6RyxJQUFJLDRCQUE0QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsdUJBQXVCLEVBQUU7WUFDcEYsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDN0IsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixjQUFjO1lBQ3RELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDM0MsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBMXNCRCxnREEwc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSwgU3RhY2t9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7Q2VydGlmaWNhdGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICAgIEFsbG93ZWRNZXRob2RzLFxuICAgIHR5cGUgQmVoYXZpb3JPcHRpb25zLFxuICAgIENhY2hlQ29va2llQmVoYXZpb3IsXG4gICAgQ2FjaGVkTWV0aG9kcyxcbiAgICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICAgIENhY2hlUG9saWN5LFxuICAgIENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcixcbiAgICBEaXN0cmlidXRpb24sIEh0dHBWZXJzaW9uLFxuICAgIHR5cGUgSU9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICAgIE9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICAgIE9yaWdpblByb3RvY29sUG9saWN5LCBPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgIFByaWNlQ2xhc3MsXG4gICAgU2VjdXJpdHlQb2xpY3lQcm90b2NvbCxcbiAgICBWaWV3ZXJQcm90b2NvbFBvbGljeSxPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3IsIE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvciwgT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3Jcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQge0FyY2hpdGVjdHVyZSwgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUsIFRyYWNpbmd9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICAgIEJsb2NrUHVibGljQWNjZXNzLFxuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRBY2Nlc3NDb250cm9sLFxuICAgIEJ1Y2tldEVuY3J5cHRpb24sXG4gICAgT2JqZWN0T3duZXJzaGlwXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7QWFhYVJlY29yZCwgQVJlY29yZCwgSG9zdGVkWm9uZSwgdHlwZSBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7QnVja2V0RGVwbG95bWVudCwgU291cmNlLCBTdG9yYWdlQ2xhc3N9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHtIdHRwT3JpZ2luLCBTM0J1Y2tldE9yaWdpbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCB7Q2xvdWRGcm9udFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IExvZ0dyb3VwLCBSZXRlbnRpb25EYXlzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge2dldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MsIHR5cGUgU3RhdGljQXNzZXRDb25maWd9IGZyb20gXCIuLi9OdXh0QXBwU3RhdGljQXNzZXRzXCI7XG5pbXBvcnQge1J1bGUsIFJ1bGVUYXJnZXRJbnB1dCwgU2NoZWR1bGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQge0xhbWJkYUZ1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge3dyaXRlRmlsZVN5bmMsIG1rZGlyU3luYywgZXhpc3RzU3luY30gZnJvbSBcImZzXCI7XG5pbXBvcnQge3R5cGUgTnV4dFNlcnZlckFwcFN0YWNrUHJvcHN9IGZyb20gXCIuL051eHRTZXJ2ZXJBcHBTdGFja1Byb3BzXCI7XG5pbXBvcnQge0h0dHBMYW1iZGFJbnRlZ3JhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zXCI7XG5pbXBvcnQge0RvbWFpbk5hbWUsIEVuZHBvaW50VHlwZSwgSHR0cEFwaSwgSHR0cE1ldGhvZCwgU2VjdXJpdHlQb2xpY3l9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyXCI7XG5cbi8qKlxuICogQ0RLIHN0YWNrIHRvIGRlcGxveSBhIGR5bmFtaWMgTnV4dCBhcHAgKHRhcmdldD1zZXJ2ZXIpIG9uIEFXUyB3aXRoIExhbWJkYSwgQXBpR2F0ZXdheSwgUzMgYW5kIENsb3VkRnJvbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdXh0U2VydmVyQXBwU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcmVmaXggb2YgdGhlIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUlkUHJlZml4OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCB0aGF0IGlzIHVzZWQgdG8gdGFnIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBkZXBsb3ltZW50XG4gICAgICogdG8gbGF0ZXIgYmUgYWJsZSB0byBjbGVhbiB1cCBvdXRkYXRlZCBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95bWVudFJldmlzaW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpdHkgdG8gdXNlIGZvciBhY2Nlc3NpbmcgdGhlIGRlcGxveW1lbnQgYXNzZXRzIG9uIFMzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkbkFjY2Vzc0lkZW50aXR5OiBJT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBkZXBsb3ltZW50IGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBhY2Nlc3MgbG9ncyBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIGFjY2Vzc0xvZ3NCdWNrZXQ6IEJ1Y2tldHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBzaXRlbWFwIGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2l0ZW1hcEJ1Y2tldDogQnVja2V0fHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcCBvbiB0aGUgc2VydmVyIHNpZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwTGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGNsZWFudXBzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGVhbnVwTGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFQSSBnYXRld2F5IHRvIG1ha2UgdGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcGlHYXRld2F5OiBIdHRwQXBpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3MgZm9yIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCB0aGF0IHNoYWxsIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWNBc3NldENvbmZpZ3M6IFN0YXRpY0Fzc2V0Q29uZmlnW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gb3JpZ2luIGZvciB0aGUgQVBJIGdhdGV3YXkgdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgaHR0cE9yaWdpbjogSHR0cE9yaWdpbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjYWNoZSBwb2xpY3kgdGhhdCBzcGVjaWZpZXMgd2hpY2ggSFRUUCBoZWFkZXJzLCBjb29raWVzLCBhbmQgcXVlcnkgc3RyaW5nc1xuICAgICAqIENsb3VkRnJvbnQgZm9yd2FyZHMgdG8gdGhlIE51eHQgYXBwIGFuZCB1c2VzIHRvIGdlbmVyYXRlIGEgY2FjaGUga2V5LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwQ2FjaGVQb2xpY3k6IENhY2hlUG9saWN5O1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbiByZXF1ZXN0IHBvbGljeSB0aGF0IHNwZWNpZmllcyB3aGljaCBIVFRQIGhlYWRlcnMsIGNvb2tpZXMsIGFuZCBxdWVyeSBzdHJpbmdzXG4gICAgICogQ2xvdWRGcm9udCBmb3J3YXJkcyB0byB0aGUgTnV4dCBhcHAgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcFJlcXVlc3RQb2xpY3k6IE9yaWdpblJlcXVlc3RQb2xpY3kgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyB3ZWIgcmVxdWVzdHNcbiAgICAgKiB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSBBUEkgZ2F0ZXdheSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBudXh0U2VydmVyUm91dGVCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogVGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIHRoZSBBUEkgZ2F0ZXdheSlcbiAgICAgKiBvciB0aGUgUzMgYXNzZXRzIGZvbGRlciAod2l0aCBjYWNoaW5nKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZG46IERpc3RyaWJ1dGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuXG4gICAgICAgICAgICAvLyBGb3JjZSBjcm9zcy1yZWdpb24gcmVmZXJlbmNlcyBpZiBhIFdBRiBBQ0wgaXMgdXNlZCBvdXRzaWRlIHVzLWVhc3QtMVxuICAgICAgICAgICAgY3Jvc3NSZWdpb25SZWZlcmVuY2VzOiBwcm9wcy53ZWJBY2xBcm4gIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5lbnY/LnJlZ2lvbiAhPT0gJ3VzLWVhc3QtMScgPyB0cnVlIDogcHJvcHMuY3Jvc3NSZWdpb25SZWZlcmVuY2VzLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc291cmNlSWRQcmVmaXggPSBgJHtwcm9wcy5wcm9qZWN0fS0ke3Byb3BzLnNlcnZpY2V9LSR7cHJvcHMuZW52aXJvbm1lbnR9YDtcblxuICAgICAgICAvLyBOdXh0IGFwcCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5kZXBsb3ltZW50UmV2aXNpb24gPSB0aGlzLmNyZWF0ZURlcGxveW1lbnRSZXZpc2lvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRDb25maWdzID0gZ2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlncyhwcm9wcy5yb290RGlyID8/ICcuJyk7XG4gICAgICAgIHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkgPSB0aGlzLmNyZWF0ZUNkbkFjY2Vzc0lkZW50aXR5KCk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0ID0gdGhpcy5jcmVhdGVTdGF0aWNBc3NldHNCdWNrZXQoKTtcblxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzKSB7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQgPSB0aGlzLmNyZWF0ZUFjY2Vzc0xvZ3NCdWNrZXQoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWNjZXNzTG9nc0FuYWx5c2lzKHByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVTaXRlbWFwKSB7XG4gICAgICAgICAgICB0aGlzLnNpdGVtYXBCdWNrZXQgPSB0aGlzLmNyZWF0ZVNpdGVtYXBCdWNrZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUFwcExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5hcGlHYXRld2F5ID0gdGhpcy5jcmVhdGVBcGlHYXRld2F5KHByb3BzKTtcbiAgICAgICAgdGhpcy5odHRwT3JpZ2luID0gdGhpcy5jcmVhdGVOdXh0QXBwSHR0cE9yaWdpbigpO1xuICAgICAgICB0aGlzLmFwcENhY2hlUG9saWN5ID0gdGhpcy5jcmVhdGVOdXh0QXBwQ2FjaGVQb2xpY3kocHJvcHMpXG4gICAgICAgIHRoaXMuYXBwUmVxdWVzdFBvbGljeSA9IHRoaXMuY3JlYXRlTnV4dEFwcFJlcXVlc3RQb2xpY3kocHJvcHMpXG4gICAgICAgIHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3IgPSB0aGlzLmNyZWF0ZU51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yKClcblxuICAgICAgICB0aGlzLmNkbiA9IHRoaXMuY3JlYXRlQ2xvdWRGcm9udERpc3RyaWJ1dGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlRGVwbG95bWVudHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEbnNSZWNvcmRzKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVBcHBQaW5nUnVsZShwcm9wcyk7XG5cbiAgICAgICAgLy8gU3RhdGljIGFzc2V0cyBjbGVhbnVwIHJlc291cmNlc1xuICAgICAgICB0aGlzLmNsZWFudXBMYW1iZGFGdW5jdGlvbiA9IHRoaXMuY3JlYXRlQ2xlYW51cExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDbGVhbnVwVHJpZ2dlclJ1bGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgcmV2aXNpb24gZmlsZSBpbiB0aGUgcHVibGljIGZvbGRlciBvZiB0aGUgTnV4dCBhcHAgdG8gYmUgYWNjZXNzaWJsZVxuICAgICAqIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHJldmlzaW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRGVwbG95bWVudFJldmlzaW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGFwcFJldmlzaW9uID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICAgIGNvbnN0IGRpciA9IHBhdGguam9pbihwcm9wcy5yb290RGlyID8/ICcuJywgJy5vdXRwdXQnLCAncHVibGljJyk7XG4gICAgICAgIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB3cml0ZUZpbGVTeW5jKHBhdGguam9pbihkaXIsICdhcHAtcmV2aXNpb24nKSwgYXBwUmV2aXNpb24sIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwcFJldmlzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGlkZW50aXR5IHRvIGFjY2VzcyB0aGUgUzMgZGVwbG95bWVudCBhc3NldCBmaWxlcyB2aWEgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNkbkFjY2Vzc0lkZW50aXR5KCk6IElPcmlnaW5BY2Nlc3NJZGVudGl0eSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbkFjY2Vzc0lkZW50aXR5TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLXMzLWFjY2Vzc2A7XG4gICAgICAgIHJldHVybiBuZXcgT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgb3JpZ2luQWNjZXNzSWRlbnRpdHlOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBidWNrZXQgdG8gc3RvcmUgdGhlIHN0YXRpYyBkZXBsb3ltZW50IGFzc2V0IGZpbGVzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNBc3NldHNCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBPYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX0VORk9SQ0VELFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBidWNrZXQgdG8gc3RvcmUgdGhlIHNpdGVtYXAgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTaXRlbWFwQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNpdGVtYXBgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBhY2Nlc3NDb250cm9sOiBCdWNrZXRBY2Nlc3NDb250cm9sLlBSSVZBVEUsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmNOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1udXh0YDtcblxuICAgICAgICBjb25zdCBhcHBMb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCBgJHtmdW5jTmFtZX0tbG9nc2AsIHtcbiAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7ZnVuY05hbWV9YCxcbiAgICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICAgIH0pO1xuICAgICAgICBhcHBMb2dHcm91cC5hcHBseVJlbW92YWxQb2xpY3koUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmNOYW1lLCB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmNOYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBSZW5kZXJzIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gTnV4dCBhcHAuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBoYW5kbGVyOiBgJHtwcm9wcy5lbnRyeXBvaW50ID8/ICdpbmRleCd9LmhhbmRsZXJgLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoYCR7cHJvcHMucm9vdERpciA/PyAnLicgfS8ub3V0cHV0L3NlcnZlcmAsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyoqLnN2ZycsICcqKi5pY28nLCAnKioucG5nJywgJyoqLmpwZycsICcqKi5qcy5tYXAnXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplID8/IDE3OTIsXG4gICAgICAgICAgICBhbGxvd1B1YmxpY1N1Ym5ldDogZmFsc2UsXG4gICAgICAgICAgICB0cmFjaW5nOiBwcm9wcy5lbmFibGVUcmFjaW5nID8gVHJhY2luZy5BQ1RJVkUgOiBUcmFjaW5nLkRJU0FCTEVELFxuICAgICAgICAgICAgbG9nR3JvdXA6IGFwcExvZ0dyb3VwLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICAgICAgLi4uSlNPTi5wYXJzZShwcm9wcy5lbnRyeXBvaW50RW52ID8/ICd7fScpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIGJ1bmRsZWQgQVdTIFNESyBmb3IgTm9kZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgYSBjdXN0b20gbGF5ZXJcbiAgICAgKiB3aGljaCByZXN0cmljdHMgdGhlIGNvbnN1bWVyIHRvIGEgc3BlY2lmaWMgeWFybiBvciBucG0gdmVyc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZTogc3RyaW5nID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jbGVhbnVwYDtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25EaXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cCcpO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBMb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCBgJHtmdW5jdGlvbk5hbWV9LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsZWFudXBMb2dHcm91cC5hcHBseVJlbW92YWxQb2xpY3koUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYEF1dG8tZGVsZXRlcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBpbiB0aGUgJHt0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChgJHtmdW5jdGlvbkRpclBhdGh9L2J1aWxkL2FwcGAsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyouZC50cyddXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIFNUQVRJQ19BU1NFVFNfQlVDS0VUOiB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgIE9VVERBVEVEX0FTU0VUU19SRVRFTlRJT05fREFZUzogYCR7cHJvcHMub3V0ZGF0ZWRBc3NldHNSZXRlbnRpb25EYXlzID8/IDMwfWAsXG4gICAgICAgICAgICAgICAgRU5WSVJPTk1FTlQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvZ0dyb3VwOiBjbGVhbnVwTG9nR3JvdXAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGdyYW50IGZ1bmN0aW9uIGFjY2VzcyB0byBTMyBidWNrZXRcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnRSZWFkKHJlc3VsdCk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50RGVsZXRlKHJlc3VsdCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBBUEkgZ2F0ZXdheSB0byBtYWtlIHRoZSBOdXh0IGFwcCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcGlHYXRld2F5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IEh0dHBBcGkge1xuICAgICAgICBjb25zdCBhcGlOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hcGlgO1xuICAgICAgICBjb25zdCBsYW1iZGFJbnRlZ3JhdGlvbiA9IG5ldyBIdHRwTGFtYmRhSW50ZWdyYXRpb24oYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1sYW1iZGEtaW50ZWdyYXRpb25gLCB0aGlzLmFwcExhbWJkYUZ1bmN0aW9uKTtcblxuICAgICAgICAvLyBXZSB3YW50IHRoZSBBUEkgZ2F0ZXdheSB0byBiZSBhY2Nlc3NpYmxlIGJ5IHRoZSBjdXN0b20gZG9tYWluIG5hbWUuXG4gICAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGFjY2VzcyB0aGUgZ2F0ZXdheSB2aWEgQ2xvdWRGcm9udCAoZm9yIGF1dG8gaHR0cCB0byBodHRwcyByZWRpcmVjdHMpLCB0aGlzIGlzIHJlcXVpcmVkXG4gICAgICAgIC8vIHRvIGJlIGFibGUgdG8gcmVkaXJlY3QgdGhlIG9yaWdpbmFsICdIb3N0JyBoZWFkZXIgdG8gdGhlIE51eHQgYXBwbGljYXRpb24sIGlmIHJlcXVlc3RlZC5cbiAgICAgICAgY29uc3QgZG9tYWluTmFtZSA9IG5ldyBEb21haW5OYW1lKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXBpLWRvbWFpbmAsIHtcbiAgICAgICAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1yZWdpb25hbC1jZXJ0aWZpY2F0ZWAsIHByb3BzLnJlZ2lvbmFsVGxzQ2VydGlmaWNhdGVBcm4pLFxuICAgICAgICAgICAgZW5kcG9pbnRUeXBlOiBFbmRwb2ludFR5cGUuUkVHSU9OQUwsXG4gICAgICAgICAgICBzZWN1cml0eVBvbGljeTogU2VjdXJpdHlQb2xpY3kuVExTXzFfMlxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhcGlHYXRld2F5ID0gbmV3IEh0dHBBcGkodGhpcywgYXBpTmFtZSwge1xuICAgICAgICAgICAgYXBpTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ29ubmVjdHMgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gTGFtYmRhIGZ1bmN0aW9uIHRvIG1ha2UgaXQgcHVibGljbHkgYXZhaWxhYmxlLmAsXG4gICAgICAgICAgICAvLyBUaGUgYXBwIGRvZXMgbm90IGFsbG93IGFueSBjcm9zcy1vcmlnaW4gYWNjZXNzIGJ5IHB1cnBvc2U6IHRoZSBhcHAgc2hvdWxkIG5vdCBiZSBlbWJlZGRhYmxlIGFueXdoZXJlXG4gICAgICAgICAgICBjb3JzUHJlZmxpZ2h0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0SW50ZWdyYXRpb246IGxhbWJkYUludGVncmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdERvbWFpbk1hcHBpbmc6IHtcbiAgICAgICAgICAgICAgICBkb21haW5OYW1lOiBkb21haW5OYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwaUdhdGV3YXkuYWRkUm91dGVzKHtcbiAgICAgICAgICAgIGludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIHBhdGg6ICcve3Byb3h5K30nLFxuICAgICAgICAgICAgbWV0aG9kczogW1xuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuR0VULFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuSEVBRCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLk9QVElPTlMsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuUFVULFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuUEFUQ0gsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYXBpR2F0ZXdheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0aGF0IHJvdXRlcyBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSB0aGUgQVBJIGdhdGV3YXkpXG4gICAgICogb3IgdGhlIFMzIGFzc2V0cyBmb2xkZXIgKHdpdGggY2FjaGluZykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xvdWRGcm9udERpc3RyaWJ1dGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBEaXN0cmlidXRpb24ge1xuICAgICAgICBjb25zdCBjZG5OYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG5gO1xuXG4gICAgICAgIHJldHVybiBuZXcgRGlzdHJpYnV0aW9uKHRoaXMsIGNkbk5hbWUsIHtcbiAgICAgICAgICAgIGRvbWFpbk5hbWVzOiBbcHJvcHMuZG9tYWluXSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGNkbk5hbWUsXG4gICAgICAgICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBTZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMTgsXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZ2xvYmFsLWNlcnRpZmljYXRlYCwgcHJvcHMuZ2xvYmFsVGxzQ2VydGlmaWNhdGVBcm4pLFxuICAgICAgICAgICAgaHR0cFZlcnNpb246IEh0dHBWZXJzaW9uLkhUVFAyX0FORF8zLFxuICAgICAgICAgICAgZGVmYXVsdEJlaGF2aW9yOiB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yLFxuICAgICAgICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczogdGhpcy5zZXR1cENsb3VkRnJvbnRSb3V0aW5nKHByb3BzKSxcbiAgICAgICAgICAgIHByaWNlQ2xhc3M6IFByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLCAvLyBVc2Ugb25seSBOb3J0aCBBbWVyaWNhIGFuZCBFdXJvcGVcbiAgICAgICAgICAgIGxvZ0J1Y2tldDogdGhpcy5hY2Nlc3NMb2dzQnVja2V0LFxuICAgICAgICAgICAgbG9nRmlsZVByZWZpeDogcHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzID8gJ3VucHJvY2Vzc2VkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxvZ0luY2x1ZGVzQ29va2llczogcHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzLFxuICAgICAgICAgICAgd2ViQWNsSWQ6IHByb3BzLndlYkFjbEFybixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gYmVoYXZpb3Igb3JpZ2luIHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IHJlbmRlciBMYW1iZGEgZnVuY3Rpb24gKHZpYSBBUEkgZ2F0ZXdheSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwSHR0cE9yaWdpbigpOiBIdHRwT3JpZ2luIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwT3JpZ2luKGAke3RoaXMuYXBpR2F0ZXdheS5odHRwQXBpSWR9LmV4ZWN1dGUtYXBpLiR7dGhpcy5yZWdpb259LmFtYXpvbmF3cy5jb21gLCB7XG4gICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgICAgIHJlYWRUaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgICAgICAgIHByb3RvY29sUG9saWN5OiBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyB3ZWIgcmVxdWVzdHNcbiAgICAgKiB0byB0aGUgTnV4dCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqIEFkZGl0aW9uYWxseSwgdGhpcyBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0cyBIVFRQIHJlcXVlc3RzIHRvIEhUVFBTLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dFNlcnZlclJvdXRlQmVoYXZpb3IoKTogQmVoYXZpb3JPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yaWdpbjogdGhpcy5odHRwT3JpZ2luLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFELFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiB0aGlzLmFwcFJlcXVlc3RQb2xpY3ksXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBDbG91ZEZyb250Um91dGluZyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgbGV0IHJvdXRpbmdCZWhhdmlvdXJzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge1xuXG4gICAgICAgICAgICAvLyBOdXh0IEkxOG4gZmlsZXMgYXJlIHNlcnZlZCB2aWEgYSBzZXJ2ZXIgcm91dGVcbiAgICAgICAgICAgICcvX2kxOG4vKic6IHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3IsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU3BlY2lmaWMgb25lcyBmaXJzdFxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlQXBpKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCl9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVTaXRlbWFwKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTaXRlbWFwUm91dGVCZWhhdmlvcigpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gc2VydmVyIHJvdXRlcyBiZWZvcmUgc3RhdGljIGFzc2V0cyB0byBlbnN1cmUgdGhleSB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgaWYgKHByb3BzLnNlcnZlclJvdXRlcyAmJiBwcm9wcy5zZXJ2ZXJSb3V0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU2VydmVyUm91dGVCZWhhdmlvcihwcm9wcy5zZXJ2ZXJSb3V0ZXMpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZVN0YXRpY0Fzc2V0c1JvdXRlQmVoYXZpb3IoKX07XG5cbiAgICAgICAgcmV0dXJuIHJvdXRpbmdCZWhhdmlvdXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjYWNoZSBwb2xpY3kgZm9yIHRoZSBOdXh0IGFwcCByb3V0ZSBiZWhhdmlvciBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwQ2FjaGVQb2xpY3kocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogQ2FjaGVQb2xpY3kge1xuICAgICAgICByZXR1cm4gbmV3IENhY2hlUG9saWN5KHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2FjaGUtcG9saWN5YCwge1xuICAgICAgICAgICAgY2FjaGVQb2xpY3lOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1jYWNoZS1wb2xpY3lgLFxuICAgICAgICAgICAgY29tbWVudDogYERlZmluZXMgd2hpY2ggcmVxdWVzdCBkYXRhIHRvIHBhc3MgdG8gdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBvcmlnaW4gYW5kIGhvdyB0aGUgY2FjaGUga2V5IGlzIGNhbGN1bGF0ZWQuYCxcbiAgICAgICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgICBtaW5UdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgICBtYXhUdGw6IER1cmF0aW9uLmRheXMoMzY1KSxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlRdWVyeVBhcmFtcykgOiAocHJvcHMuZGVueUNhY2hlS2V5UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5kZW55TGlzdCguLi5wcm9wcy5kZW55Q2FjaGVLZXlRdWVyeVBhcmFtcykgOiAocHJvcHMuYWxsb3dRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5hbGxvd1F1ZXJ5UGFyYW1zKSA6IChwcm9wcy5kZW55UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5kZW55TGlzdCguLi5wcm9wcy5kZW55UXVlcnlQYXJhbXMpIDogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpKSkpLFxuICAgICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5SGVhZGVycz8ubGVuZ3RoID8gQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlIZWFkZXJzKSA6IChwcm9wcy5hbGxvd0hlYWRlcnM/Lmxlbmd0aCA/IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93SGVhZGVycykgOiBDYWNoZUhlYWRlckJlaGF2aW9yLm5vbmUoKSksXG4gICAgICAgICAgICBjb29raWVCZWhhdmlvcjogcHJvcHMuY2FjaGVLZXlDb29raWVzPy5sZW5ndGggPyBDYWNoZUNvb2tpZUJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5jYWNoZUtleUNvb2tpZXMpIDogKHByb3BzLmFsbG93Q29va2llcz8ubGVuZ3RoID8gQ2FjaGVDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dDb29raWVzKSA6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpKSxcbiAgICAgICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICAgICAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBmb3IgdGhlIE51eHQgYXBwIHJvdXRlIGJlaGF2aW9yIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBObyBwb2xpY3kgaXMgY3JlYXRlZCBpZiBubyBleHBsaWNpdCBjb25maWcgaXMgcHJvdmlkZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwUmVxdWVzdFBvbGljeShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBPcmlnaW5SZXF1ZXN0UG9saWN5fHVuZGVmaW5lZCB7XG5cbiAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgY29uZmlnIGlzIHByb3ZpZGVkLCB3ZSB3YW50IHRvIHVzZSB0aGUgZGVmYXVsdCBmcm9tIENsb3VkZnJvbnRcbiAgICAgICAgY29uc3QgaGFzQW55Q29uZmlnID0gcHJvcHMuZm9yd2FyZFF1ZXJ5UGFyYW1zPy5sZW5ndGggfHwgcHJvcHMuZm9yd2FyZEhlYWRlcnM/Lmxlbmd0aCB8fCBwcm9wcy5mb3J3YXJkQ29va2llcz8ubGVuZ3RoO1xuICAgICAgICBpZiAoIWhhc0FueUNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgT3JpZ2luUmVxdWVzdFBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXJlcXVlc3QtcG9saWN5YCwge1xuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLXJlcXVlc3QtcG9saWN5YCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGBEZWZpbmVzIHdoaWNoIHJlcXVlc3QgZGF0YSB0byBwYXNzIHRvIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gb3JpZ2luIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkuYCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IHByb3BzLmZvcndhcmRRdWVyeVBhcmFtcz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRRdWVyeVBhcmFtcykgOiBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAgICAgICAgIGhlYWRlckJlaGF2aW9yOiBwcm9wcy5mb3J3YXJkSGVhZGVycz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5mb3J3YXJkSGVhZGVycykgOiBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICAgICAgY29va2llQmVoYXZpb3I6IHByb3BzLmZvcndhcmRDb29raWVzPy5sZW5ndGggPyBPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRDb29raWVzKSA6IE9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvci5ub25lKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIE51eHQgYXBwIEFQSSByZXF1ZXN0cyB0byB0aGUgQVBJIGdhdGV3YXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBhcGlCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiB0aGlzLmh0dHBPcmlnaW4sXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeSxcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHRoaXMuYXBwUmVxdWVzdFBvbGljeSxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5IVFRQU19PTkxZXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJy9hcGkvKiddID0gYXBpQmVoYXZpb3I7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYmVoYXZpb3JzIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgc3BlY2lmaWVkIHBhdGggcGF0dGVybnMgdG8gdGhlIFNTUiBvcmlnaW4uXG4gICAgICogVGhpcyBhbGxvd3Mgc2VydmVyIGVuZHBvaW50cyB0aGF0IHVzZSBmaWxlLWxpa2UgVVJMcyAoZS5nLiwgL3NpdGVtYXAueG1sIGZyb20gQG51eHRqcy9zaXRlbWFwKSBcbiAgICAgKiB0byBiZSBoYW5kbGVkIGJ5IHRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIGR5bmFtaWMgY29udGVudCBnZW5lcmF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2VydmVyUm91dGVCZWhhdmlvcihzZXJ2ZXJSb3V0ZXM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIFxuICAgICAgICBzZXJ2ZXJSb3V0ZXMuZm9yRWFjaChyb3V0ZSA9PiB7XG4gICAgICAgICAgICBydWxlc1tyb3V0ZV0gPSB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgaW5jb21pbmcgcmVxdWVzdHMgZm9yIHRoZSBzdGF0aWMgYXNzZXRzXG4gICAgICogdG8gdGhlIFMzIGJ1Y2tldCB0aGF0IGhvbGRzIHRoZXNlIHN0YXRpYyBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3Qgc3RhdGljQXNzZXRzQ2FjaGVDb25maWc6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LCB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMpLFxuICAgICAgICAgICAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OiB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZvckVhY2goYXNzZXQgPT4ge1xuICAgICAgICAgICAgcnVsZXNbYCR7YXNzZXQudGFyZ2V0fSR7YXNzZXQucGF0dGVybn1gXSA9IHN0YXRpY0Fzc2V0c0NhY2hlQ29uZmlnXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgaW5jb21pbmcgcmVxdWVzdHMgZm9yIHRoZSBzaXRlbWFwIGFzc2V0c1xuICAgICAqIHRvIHRoZSBTMyBidWNrZXQgdGhhdCBob2xkcyB0aGVzZSBzaXRlbWFwIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTaXRlbWFwUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNpdGVtYXBCdWNrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNpdGVtYXAgYnVja2V0IG11c3QgZXhpc3QgYmVmb3JlIGNyZWF0aW5nIHNpdGVtYXAgcm91dGUgYmVoYXZpb3IuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2l0ZW1hcENhY2hlQ29uZmlnOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IFMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NJZGVudGl0eSh0aGlzLnNpdGVtYXBCdWNrZXQsIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICAgICAgICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuY2RuQWNjZXNzSWRlbnRpdHksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFNcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICBydWxlc1snKnNpdGVtYXAueG1sJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG4gICAgICAgIHJ1bGVzWycqc2l0ZW1hcC1nb25lLnhtbCddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuICAgICAgICBydWxlc1snL3NpdGVtYXBzLyonXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAgYXMgZGVmaW5lZCBpbiB7QHNlZSBnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzfSB0byB0aGUgc3RhdGljIGFzc2V0cyBTMyBidWNrZXQuXG4gICAgICogSW4gb3JkZXIgdG8gZW5hYmxlIGEgemVyby1kb3dudGltZSBkZXBsb3ltZW50IHdpdGggbWluaW1hbCBzdG9yYWdlIGxvYWQsXG4gICAgICogd2UgZGVwbG95IHRoZSBzdGF0aWMgYXNzZXRzIG9mIGV2ZXJ5IGRlcGxveW1lbnQgaW50byB0aGUgc2FtZSBmb2xkZXIgYnV0IG1hcmsgdGhlbSB3aXRoIGEgZGVwbG95bWVudCByZXZpc2lvbi5cbiAgICAgKiBCeSBkb2luZyBzbywgdGhlIGZpbGVzIG9mIHByZXZpb3VzIGRlcGxveW1lbnRzIGFyZSByZXRhaW5lZCB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBhbiBvbGRlciByZXZpc2lvblxuICAgICAqIGJ1dCBnZXRzIGNsZWFuZWQgdXAgYWZ0ZXIgYSBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUgdmlhIHRoZSBjbGVhbnVwIExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbmZpZ3VyZURlcGxveW1lbnRzKCk6IEJ1Y2tldERlcGxveW1lbnRbXSB7XG4gICAgICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzLWRlcGxveW1lbnQtbG9nc2AsIHtcbiAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudGAsXG4gICAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX0RBWSxcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmV0dXJucyBhIGRlcGxveW1lbnQgZm9yIGV2ZXJ5IGNvbmZpZ3VyZWQgc3RhdGljIGFzc2V0IHR5cGUgdG8gcmVzcGVjdCB0aGUgZGlmZmVyZW50IGNhY2hlIHNldHRpbmdzXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncy5maWx0ZXIoYXNzZXQgPT4gZXhpc3RzU3luYyhhc3NldC5zb3VyY2UpKS5tYXAoKGFzc2V0LCBhc3NldEluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudC0ke2Fzc2V0SW5kZXh9YCwge1xuICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtTb3VyY2UuYXNzZXQoYXNzZXQuc291cmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IGFzc2V0LmV4Y2x1ZGUsXG4gICAgICAgICAgICAgICAgfSldLFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogYXNzZXQudGFyZ2V0LnJlcGxhY2UoL15cXC8rL2csICcnKSwgLy8gUmVtb3ZlIGxlYWRpbmcgc2xhc2hcbiAgICAgICAgICAgICAgICBwcnVuZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3RvcmFnZUNsYXNzOiBTdG9yYWdlQ2xhc3MuU1RBTkRBUkQsXG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqJ10sXG4gICAgICAgICAgICAgICAgaW5jbHVkZTogW2Fzc2V0LnBhdHRlcm5dLFxuICAgICAgICAgICAgICAgIGNhY2hlQ29udHJvbDogYXNzZXQuY2FjaGVDb250cm9sLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBhc3NldC5jb250ZW50VHlwZSxcbiAgICAgICAgICAgICAgICBkaXN0cmlidXRpb246IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IHRoaXMuY2RuIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvblBhdGhzOiBhc3NldC5pbnZhbGlkYXRlT25DaGFuZ2UgPyBbYC8ke2Fzc2V0LnBhdHRlcm59YF0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwLFxuXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgYnVpbGQgcmV2aXNpb24gb24gZXZlcnkgYXNzZXQgdG8gYWxsb3cgY2xlYW51cCBvZiBvdXRkYXRlZCBhc3NldHNcbiAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246IHRoaXMuZGVwbG95bWVudFJldmlzaW9uLFxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvLyBTb21lIE51eHQgYXBwbGljYXRpb25zIGhhdmUgYSBsb3Qgb2YgYXNzZXRzIHRvIGRlcGxveSB3aGVyZWJ5IHRoZSBmdW5jdGlvbiBtaWdodCBydW4gb3V0IG9mIG1lbW9yeS5cbiAgICAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGEgaGlnaCBtZW1vcnkgbGltaXQgbWlnaHQgc3BlZWQgdXAgZGVwbG95bWVudHMuXG4gICAgICAgICAgICAgICAgbWVtb3J5TGltaXQ6IDE3OTJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBob3N0ZWQgem9uZSBhdCB3aGljaCB0aGUgRE5TIHJlY29yZHMgc2hhbGwgYmUgY3JlYXRlZCB0byBhY2Nlc3MgdGhlIE51eHQgYXBwIG9uIHRoZSBpbnRlcm5ldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kSG9zdGVkWm9uZShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBJSG9zdGVkWm9uZSB7XG4gICAgICAgIGNvbnN0IGRvbWFpblBhcnRzID0gcHJvcHMuZG9tYWluLnNwbGl0KCcuJyk7XG5cbiAgICAgICAgcmV0dXJuIEhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taG9zdGVkLXpvbmVgLCB7XG4gICAgICAgICAgICBob3N0ZWRab25lSWQ6IHByb3BzLmhvc3RlZFpvbmVJZCxcbiAgICAgICAgICAgIHpvbmVOYW1lOiBkb21haW5QYXJ0c1tkb21haW5QYXJ0cy5sZW5ndGggLSAxXSwgLy8gU3VwcG9ydCBzdWJkb21haW5zXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIEROUyByZWNvcmRzIHRvIGFjY2VzcyB0aGUgTnV4dCBhcHAgb24gdGhlIGludGVybmV0IHZpYSB0aGUgY3VzdG9tIGRvbWFpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVEbnNSZWNvcmRzKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBob3N0ZWRab25lID0gdGhpcy5maW5kSG9zdGVkWm9uZShwcm9wcyk7XG4gICAgICAgIGNvbnN0IGRuc1RhcmdldCA9IFJlY29yZFRhcmdldC5mcm9tQWxpYXMobmV3IENsb3VkRnJvbnRUYXJnZXQodGhpcy5jZG4pKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSByZWNvcmQgZm9yIElQdjRcbiAgICAgICAgbmV3IEFSZWNvcmQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1pcHY0LXJlY29yZGAsIHtcbiAgICAgICAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIHpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICAgICAgICB0YXJnZXQ6IGRuc1RhcmdldCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgcmVjb3JkIGZvciBJUHY2XG4gICAgICAgIG5ldyBBYWFhUmVjb3JkKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taXB2Ni1yZWNvcmRgLCB7XG4gICAgICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgICAgICAgdGFyZ2V0OiBkbnNUYXJnZXQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2hlZHVsZWQgcnVsZSB0byBwaW5nIHRoZSBOdXh0IGFwcCBMYW1iZGEgZnVuY3Rpb24gZXZlcnkgNSBtaW51dGVzIGluIG9yZGVyIHRvIGtlZXAgaXQgd2FybVxuICAgICAqIGFuZCBzcGVlZCB1cCBpbml0aWFsIFNTUiByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcHBQaW5nUnVsZShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmFrZUFwaUdhdGV3YXlFdmVudERhdGEgPSB7XG4gICAgICAgICAgICBcInZlcnNpb25cIjogXCIyLjBcIixcbiAgICAgICAgICAgIFwicm91dGVLZXlcIjogXCJHRVQgL3twcm94eSt9XCIsXG4gICAgICAgICAgICBcInJhd1BhdGhcIjogXCIvXCIsXG4gICAgICAgICAgICBcInJhd1F1ZXJ5U3RyaW5nXCI6IFwiXCIsXG4gICAgICAgICAgICBcImhlYWRlcnNcIjoge30sXG4gICAgICAgICAgICBcInJlcXVlc3RDb250ZXh0XCI6IHtcbiAgICAgICAgICAgICAgICBcImRvbWFpbk5hbWVcIjogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgICAgIFwiaHR0cFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwibWV0aG9kXCI6IFwiR0VUXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicGF0aFwiOiBcIi9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJwcm90b2NvbFwiOiBcIkhUVFAvMS4xXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3IFJ1bGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1waW5nZXItcnVsZWAsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXBpbmdlcmAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFBpbmdzIHRoZSBMYW1iZGEgZnVuY3Rpb24gb2YgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBhcHAgZXZlcnkgNSBtaW51dGVzIHRvIGtlZXAgaXQgd2FybS5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5yYXRlKER1cmF0aW9uLm1pbnV0ZXMoNSkpLFxuICAgICAgICAgICAgdGFyZ2V0czogW25ldyBMYW1iZGFGdW5jdGlvbih0aGlzLmFwcExhbWJkYUZ1bmN0aW9uLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KGZha2VBcGlHYXRld2F5RXZlbnREYXRhKVxuICAgICAgICAgICAgfSldLFxuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2hlZHVsZWQgcnVsZSB0aGF0IHJ1bnMgZXZlcnkgVHVlc2RheSBhdCAwMzozMCBBTSBHTVQgdG8gdHJpZ2dlclxuICAgICAqIG91ciBjbGVhbnVwIExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDbGVhbnVwVHJpZ2dlclJ1bGUoKTogdm9pZCB7XG4gICAgICAgIG5ldyBSdWxlKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVyLXJ1bGVgLCB7XG4gICAgICAgICAgICBydWxlTmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zY2hlZHVsZXJgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBUcmlnZ2VycyBhIGNsZWFudXAgb2YgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgYXQgdGhlICR7dGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZX0gUzMgYnVja2V0LmAsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmNyb24oe3dlZWtEYXk6ICcyJywgaG91cjogJzMnLCBtaW51dGU6ICczMCd9KSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5jbGVhbnVwTGFtYmRhRnVuY3Rpb24pXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFMzIGJ1Y2tldCB0byBzdG9yZSB0aGUgYWNjZXNzIGxvZ3Mgb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQWNjZXNzTG9nc0J1Y2tldCgpOiBCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9nc2A7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgICAgICBvYmplY3RPd25lcnNoaXA6IE9iamVjdE93bmVyc2hpcC5CVUNLRVRfT1dORVJfUFJFRkVSUkVELFxuICAgICAgICAgICAgLy8gV2hlbiB0aGUgc3RhY2sgaXMgZGVzdHJveWVkLCB3ZSBleHBlY3QgZXZlcnl0aGluZyB0byBiZSBkZWxldGVkXG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGNyZWF0ZUFjY2Vzc0xvZ3NBbmFseXNpcyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWNjZXNzIGJ1Y2tldCBub3Qgc2V0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMgfSA9IHJlcXVpcmUoJy4uL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL0Nsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMnKTtcblxuICAgICAgICBuZXcgQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcyh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFjY2Vzcy1sb2dzLWFuYWx5c2lzYCwge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQsXG4gICAgICAgICAgICByZXNvdXJjZVByZWZpeDogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9nc2AsXG4gICAgICAgICAgICBhY2Nlc3NMb2dDb29raWVzOiBwcm9wcy5hY2Nlc3NMb2dDb29raWVzLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|
|
571
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBZW9DO0FBQ3BDLHVEQUFzRjtBQUN0RiwrQ0FNNEI7QUFDNUIseURBQXdHO0FBQ3hHLHFFQUFxRjtBQUNyRiwrRUFBOEU7QUFDOUUseUVBQWlFO0FBQ2pFLG1EQUErRDtBQUMvRCxnRUFBNEY7QUFDNUYsdURBQXVFO0FBQ3ZFLHVFQUE4RDtBQUM5RCw2QkFBNkI7QUFDN0IsMkJBQXdEO0FBRXhELDZGQUFnRjtBQUNoRixtRUFBMkc7QUFFM0c7O0dBRUc7QUFDSCxNQUFhLGtCQUFtQixTQUFRLG1CQUFLO0lBa0d6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCOztRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNiLEdBQUcsS0FBSztZQUVSLHVFQUF1RTtZQUN2RSxxQkFBcUIsRUFBRSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxDQUFBLE1BQUEsS0FBSyxDQUFDLEdBQUcsMENBQUUsTUFBTSxNQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCO1NBQ2pJLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakYscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUEsa0RBQTRCLEVBQUMsTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FBSSxHQUFHLENB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QWtFO1lBQ2xFLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87WUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFHTyx3QkFBd0IsQ0FBQyxLQUE4QjtRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxNQUFNLEVBQUUsNEJBQTRCLEVBQUUsR0FBRyxPQUFPLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUV6RyxJQUFJLDRCQUE0QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsdUJBQXVCLEVBQUU7WUFDcEYsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDN0IsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixjQUFjO1lBQ3RELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDM0MsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBMXNCRCxnREEwc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSwgU3RhY2t9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7Q2VydGlmaWNhdGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICAgIEFsbG93ZWRNZXRob2RzLFxuICAgIHR5cGUgQmVoYXZpb3JPcHRpb25zLFxuICAgIENhY2hlQ29va2llQmVoYXZpb3IsXG4gICAgQ2FjaGVkTWV0aG9kcyxcbiAgICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICAgIENhY2hlUG9saWN5LFxuICAgIENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcixcbiAgICBEaXN0cmlidXRpb24sIEh0dHBWZXJzaW9uLFxuICAgIHR5cGUgSU9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICAgIE9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICAgIE9yaWdpblByb3RvY29sUG9saWN5LCBPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgIFByaWNlQ2xhc3MsXG4gICAgU2VjdXJpdHlQb2xpY3lQcm90b2NvbCxcbiAgICBWaWV3ZXJQcm90b2NvbFBvbGljeSxPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3IsIE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvciwgT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3Jcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQge0FyY2hpdGVjdHVyZSwgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUsIFRyYWNpbmd9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICAgIEJsb2NrUHVibGljQWNjZXNzLFxuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRBY2Nlc3NDb250cm9sLFxuICAgIEJ1Y2tldEVuY3J5cHRpb24sXG4gICAgT2JqZWN0T3duZXJzaGlwXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7QWFhYVJlY29yZCwgQVJlY29yZCwgSG9zdGVkWm9uZSwgdHlwZSBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7QnVja2V0RGVwbG95bWVudCwgU291cmNlLCBTdG9yYWdlQ2xhc3N9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHtIdHRwT3JpZ2luLCBTM0J1Y2tldE9yaWdpbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCB7Q2xvdWRGcm9udFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IExvZ0dyb3VwLCBSZXRlbnRpb25EYXlzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge2dldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MsIHR5cGUgU3RhdGljQXNzZXRDb25maWd9IGZyb20gXCIuLi9OdXh0QXBwU3RhdGljQXNzZXRzXCI7XG5pbXBvcnQge1J1bGUsIFJ1bGVUYXJnZXRJbnB1dCwgU2NoZWR1bGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQge0xhbWJkYUZ1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge3dyaXRlRmlsZVN5bmMsIG1rZGlyU3luYywgZXhpc3RzU3luY30gZnJvbSBcImZzXCI7XG5pbXBvcnQge3R5cGUgTnV4dFNlcnZlckFwcFN0YWNrUHJvcHN9IGZyb20gXCIuL051eHRTZXJ2ZXJBcHBTdGFja1Byb3BzXCI7XG5pbXBvcnQge0h0dHBMYW1iZGFJbnRlZ3JhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zXCI7XG5pbXBvcnQge0RvbWFpbk5hbWUsIEVuZHBvaW50VHlwZSwgSHR0cEFwaSwgSHR0cE1ldGhvZCwgU2VjdXJpdHlQb2xpY3l9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyXCI7XG5cbi8qKlxuICogQ0RLIHN0YWNrIHRvIGRlcGxveSBhIGR5bmFtaWMgTnV4dCBhcHAgKHRhcmdldD1zZXJ2ZXIpIG9uIEFXUyB3aXRoIExhbWJkYSwgQXBpR2F0ZXdheSwgUzMgYW5kIENsb3VkRnJvbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdXh0U2VydmVyQXBwU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcmVmaXggb2YgdGhlIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUlkUHJlZml4OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCB0aGF0IGlzIHVzZWQgdG8gdGFnIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBkZXBsb3ltZW50XG4gICAgICogdG8gbGF0ZXIgYmUgYWJsZSB0byBjbGVhbiB1cCBvdXRkYXRlZCBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95bWVudFJldmlzaW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpdHkgdG8gdXNlIGZvciBhY2Nlc3NpbmcgdGhlIGRlcGxveW1lbnQgYXNzZXRzIG9uIFMzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkbkFjY2Vzc0lkZW50aXR5OiBJT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBkZXBsb3ltZW50IGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBhY2Nlc3MgbG9ncyBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIGFjY2Vzc0xvZ3NCdWNrZXQ6IEJ1Y2tldHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBzaXRlbWFwIGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2l0ZW1hcEJ1Y2tldDogQnVja2V0fHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcCBvbiB0aGUgc2VydmVyIHNpZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwTGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGNsZWFudXBzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGVhbnVwTGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFQSSBnYXRld2F5IHRvIG1ha2UgdGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcGlHYXRld2F5OiBIdHRwQXBpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3MgZm9yIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCB0aGF0IHNoYWxsIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWNBc3NldENvbmZpZ3M6IFN0YXRpY0Fzc2V0Q29uZmlnW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gb3JpZ2luIGZvciB0aGUgQVBJIGdhdGV3YXkgdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgaHR0cE9yaWdpbjogSHR0cE9yaWdpbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjYWNoZSBwb2xpY3kgdGhhdCBzcGVjaWZpZXMgd2hpY2ggSFRUUCBoZWFkZXJzLCBjb29raWVzLCBhbmQgcXVlcnkgc3RyaW5nc1xuICAgICAqIENsb3VkRnJvbnQgZm9yd2FyZHMgdG8gdGhlIE51eHQgYXBwIGFuZCB1c2VzIHRvIGdlbmVyYXRlIGEgY2FjaGUga2V5LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwQ2FjaGVQb2xpY3k6IENhY2hlUG9saWN5O1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbiByZXF1ZXN0IHBvbGljeSB0aGF0IHNwZWNpZmllcyB3aGljaCBIVFRQIGhlYWRlcnMsIGNvb2tpZXMsIGFuZCBxdWVyeSBzdHJpbmdzXG4gICAgICogQ2xvdWRGcm9udCBmb3J3YXJkcyB0byB0aGUgTnV4dCBhcHAgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcFJlcXVlc3RQb2xpY3k6IE9yaWdpblJlcXVlc3RQb2xpY3kgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyB3ZWIgcmVxdWVzdHNcbiAgICAgKiB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSBBUEkgZ2F0ZXdheSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBudXh0U2VydmVyUm91dGVCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogVGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIHRoZSBBUEkgZ2F0ZXdheSlcbiAgICAgKiBvciB0aGUgUzMgYXNzZXRzIGZvbGRlciAod2l0aCBjYWNoaW5nKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZG46IERpc3RyaWJ1dGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuXG4gICAgICAgICAgICAvLyBGb3JjZSBjcm9zcy1yZWdpb24gcmVmZXJlbmNlcyBpZiBhIFdBRiBBQ0wgaXMgdXNlZCBvdXRzaWRlIHVzLWVhc3QtMVxuICAgICAgICAgICAgY3Jvc3NSZWdpb25SZWZlcmVuY2VzOiBwcm9wcy53ZWJBY2xBcm4gIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5lbnY/LnJlZ2lvbiAhPT0gJ3VzLWVhc3QtMScgPyB0cnVlIDogcHJvcHMuY3Jvc3NSZWdpb25SZWZlcmVuY2VzLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc291cmNlSWRQcmVmaXggPSBgJHtwcm9wcy5wcm9qZWN0fS0ke3Byb3BzLnNlcnZpY2V9LSR7cHJvcHMuZW52aXJvbm1lbnR9YDtcblxuICAgICAgICAvLyBOdXh0IGFwcCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5kZXBsb3ltZW50UmV2aXNpb24gPSB0aGlzLmNyZWF0ZURlcGxveW1lbnRSZXZpc2lvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRDb25maWdzID0gZ2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlncyhwcm9wcy5yb290RGlyID8/ICcuJyk7XG4gICAgICAgIHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkgPSB0aGlzLmNyZWF0ZUNkbkFjY2Vzc0lkZW50aXR5KCk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0ID0gdGhpcy5jcmVhdGVTdGF0aWNBc3NldHNCdWNrZXQoKTtcblxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzKSB7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQgPSB0aGlzLmNyZWF0ZUFjY2Vzc0xvZ3NCdWNrZXQoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWNjZXNzTG9nc0FuYWx5c2lzKHByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVTaXRlbWFwKSB7XG4gICAgICAgICAgICB0aGlzLnNpdGVtYXBCdWNrZXQgPSB0aGlzLmNyZWF0ZVNpdGVtYXBCdWNrZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUFwcExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5hcGlHYXRld2F5ID0gdGhpcy5jcmVhdGVBcGlHYXRld2F5KHByb3BzKTtcbiAgICAgICAgdGhpcy5odHRwT3JpZ2luID0gdGhpcy5jcmVhdGVOdXh0QXBwSHR0cE9yaWdpbigpO1xuICAgICAgICB0aGlzLmFwcENhY2hlUG9saWN5ID0gdGhpcy5jcmVhdGVOdXh0QXBwQ2FjaGVQb2xpY3kocHJvcHMpXG4gICAgICAgIHRoaXMuYXBwUmVxdWVzdFBvbGljeSA9IHRoaXMuY3JlYXRlTnV4dEFwcFJlcXVlc3RQb2xpY3kocHJvcHMpXG4gICAgICAgIHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3IgPSB0aGlzLmNyZWF0ZU51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yKClcblxuICAgICAgICB0aGlzLmNkbiA9IHRoaXMuY3JlYXRlQ2xvdWRGcm9udERpc3RyaWJ1dGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlRGVwbG95bWVudHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEbnNSZWNvcmRzKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVBcHBQaW5nUnVsZShwcm9wcyk7XG5cbiAgICAgICAgLy8gU3RhdGljIGFzc2V0cyBjbGVhbnVwIHJlc291cmNlc1xuICAgICAgICB0aGlzLmNsZWFudXBMYW1iZGFGdW5jdGlvbiA9IHRoaXMuY3JlYXRlQ2xlYW51cExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDbGVhbnVwVHJpZ2dlclJ1bGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgcmV2aXNpb24gZmlsZSBpbiB0aGUgcHVibGljIGZvbGRlciBvZiB0aGUgTnV4dCBhcHAgdG8gYmUgYWNjZXNzaWJsZVxuICAgICAqIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHJldmlzaW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRGVwbG95bWVudFJldmlzaW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGFwcFJldmlzaW9uID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICAgIGNvbnN0IGRpciA9IHBhdGguam9pbihwcm9wcy5yb290RGlyID8/ICcuJywgJy5vdXRwdXQnLCAncHVibGljJyk7XG4gICAgICAgIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB3cml0ZUZpbGVTeW5jKHBhdGguam9pbihkaXIsICdhcHAtcmV2aXNpb24nKSwgYXBwUmV2aXNpb24sIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwcFJldmlzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGlkZW50aXR5IHRvIGFjY2VzcyB0aGUgUzMgZGVwbG95bWVudCBhc3NldCBmaWxlcyB2aWEgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNkbkFjY2Vzc0lkZW50aXR5KCk6IElPcmlnaW5BY2Nlc3NJZGVudGl0eSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbkFjY2Vzc0lkZW50aXR5TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLXMzLWFjY2Vzc2A7XG4gICAgICAgIHJldHVybiBuZXcgT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgb3JpZ2luQWNjZXNzSWRlbnRpdHlOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBidWNrZXQgdG8gc3RvcmUgdGhlIHN0YXRpYyBkZXBsb3ltZW50IGFzc2V0IGZpbGVzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNBc3NldHNCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBPYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX0VORk9SQ0VELFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBidWNrZXQgdG8gc3RvcmUgdGhlIHNpdGVtYXAgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTaXRlbWFwQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNpdGVtYXBgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBhY2Nlc3NDb250cm9sOiBCdWNrZXRBY2Nlc3NDb250cm9sLlBSSVZBVEUsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmNOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1udXh0YDtcblxuICAgICAgICBjb25zdCBhcHBMb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCBgJHtmdW5jTmFtZX0tbG9nc2AsIHtcbiAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7ZnVuY05hbWV9YCxcbiAgICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICAgIH0pO1xuICAgICAgICBhcHBMb2dHcm91cC5hcHBseVJlbW92YWxQb2xpY3koUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmNOYW1lLCB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmNOYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBSZW5kZXJzIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gTnV4dCBhcHAuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBoYW5kbGVyOiBgJHtwcm9wcy5lbnRyeXBvaW50ID8/ICdpbmRleCd9LmhhbmRsZXJgLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoYCR7cHJvcHMucm9vdERpciA/PyAnLicgfS8ub3V0cHV0L3NlcnZlcmAsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyoqLnN2ZycsICcqKi5pY28nLCAnKioucG5nJywgJyoqLmpwZycsICcqKi5qcy5tYXAnXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplID8/IDE3OTIsXG4gICAgICAgICAgICBhbGxvd1B1YmxpY1N1Ym5ldDogZmFsc2UsXG4gICAgICAgICAgICB0cmFjaW5nOiBwcm9wcy5lbmFibGVUcmFjaW5nID8gVHJhY2luZy5BQ1RJVkUgOiBUcmFjaW5nLkRJU0FCTEVELFxuICAgICAgICAgICAgbG9nR3JvdXA6IGFwcExvZ0dyb3VwLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICAgICAgLi4uSlNPTi5wYXJzZShwcm9wcy5lbnRyeXBvaW50RW52ID8/ICd7fScpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIGJ1bmRsZWQgQVdTIFNESyBmb3IgTm9kZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgYSBjdXN0b20gbGF5ZXJcbiAgICAgKiB3aGljaCByZXN0cmljdHMgdGhlIGNvbnN1bWVyIHRvIGEgc3BlY2lmaWMgeWFybiBvciBucG0gdmVyc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZTogc3RyaW5nID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jbGVhbnVwYDtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25EaXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cCcpO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBMb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCBgJHtmdW5jdGlvbk5hbWV9LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsZWFudXBMb2dHcm91cC5hcHBseVJlbW92YWxQb2xpY3koUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYEF1dG8tZGVsZXRlcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBpbiB0aGUgJHt0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChgJHtmdW5jdGlvbkRpclBhdGh9L2J1aWxkL2FwcGAsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyouZC50cyddXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBTVEFUSUNfQVNTRVRTX0JVQ0tFVDogdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICBPVVREQVRFRF9BU1NFVFNfUkVURU5USU9OX0RBWVM6IGAke3Byb3BzLm91dGRhdGVkQXNzZXRzUmV0ZW50aW9uRGF5cyA/PyAzMH1gLFxuICAgICAgICAgICAgICAgIEVOVklST05NRU5UOiBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgICAgICAgICAgICBBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRDogJzEnLFxuICAgICAgICAgICAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dHcm91cDogY2xlYW51cExvZ0dyb3VwLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBncmFudCBmdW5jdGlvbiBhY2Nlc3MgdG8gUzMgYnVja2V0XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZChyZXN1bHQpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudERlbGV0ZShyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQVBJIGdhdGV3YXkgdG8gbWFrZSB0aGUgTnV4dCBhcHAgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBpR2F0ZXdheShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBIdHRwQXBpIHtcbiAgICAgICAgY29uc3QgYXBpTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXBpYDtcbiAgICAgICAgY29uc3QgbGFtYmRhSW50ZWdyYXRpb24gPSBuZXcgSHR0cExhbWJkYUludGVncmF0aW9uKGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbGFtYmRhLWludGVncmF0aW9uYCwgdGhpcy5hcHBMYW1iZGFGdW5jdGlvbik7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0aGUgQVBJIGdhdGV3YXkgdG8gYmUgYWNjZXNzaWJsZSBieSB0aGUgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBhY2Nlc3MgdGhlIGdhdGV3YXkgdmlhIENsb3VkRnJvbnQgKGZvciBhdXRvIGh0dHAgdG8gaHR0cHMgcmVkaXJlY3RzKSwgdGhpcyBpcyByZXF1aXJlZFxuICAgICAgICAvLyB0byBiZSBhYmxlIHRvIHJlZGlyZWN0IHRoZSBvcmlnaW5hbCAnSG9zdCcgaGVhZGVyIHRvIHRoZSBOdXh0IGFwcGxpY2F0aW9uLCBpZiByZXF1ZXN0ZWQuXG4gICAgICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBuZXcgRG9tYWluTmFtZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwaS1kb21haW5gLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcmVnaW9uYWwtY2VydGlmaWNhdGVgLCBwcm9wcy5yZWdpb25hbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGVuZHBvaW50VHlwZTogRW5kcG9pbnRUeXBlLlJFR0lPTkFMLFxuICAgICAgICAgICAgc2VjdXJpdHlQb2xpY3k6IFNlY3VyaXR5UG9saWN5LlRMU18xXzJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYXBpR2F0ZXdheSA9IG5ldyBIdHRwQXBpKHRoaXMsIGFwaU5hbWUsIHtcbiAgICAgICAgICAgIGFwaU5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYENvbm5lY3RzIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gd2l0aCB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IExhbWJkYSBmdW5jdGlvbiB0byBtYWtlIGl0IHB1YmxpY2x5IGF2YWlsYWJsZS5gLFxuICAgICAgICAgICAgLy8gVGhlIGFwcCBkb2VzIG5vdCBhbGxvdyBhbnkgY3Jvc3Mtb3JpZ2luIGFjY2VzcyBieSBwdXJwb3NlOiB0aGUgYXBwIHNob3VsZCBub3QgYmUgZW1iZWRkYWJsZSBhbnl3aGVyZVxuICAgICAgICAgICAgY29yc1ByZWZsaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdEludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7XG4gICAgICAgICAgICAgICAgZG9tYWluTmFtZTogZG9tYWluTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcGlHYXRld2F5LmFkZFJvdXRlcyh7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbjogbGFtYmRhSW50ZWdyYXRpb24sXG4gICAgICAgICAgICBwYXRoOiAnL3twcm94eSt9JyxcbiAgICAgICAgICAgIG1ldGhvZHM6IFtcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLkhFQUQsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5PUFRJT05TLFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLlBVVCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLlBBVENILFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwaUdhdGV3YXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdGhhdCByb3V0ZXMgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgdGhlIEFQSSBnYXRld2F5KVxuICAgICAqIG9yIHRoZSBTMyBhc3NldHMgZm9sZGVyICh3aXRoIGNhY2hpbmcpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRGlzdHJpYnV0aW9uIHtcbiAgICAgICAgY29uc3QgY2RuTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuYDtcblxuICAgICAgICByZXR1cm4gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBjZG5OYW1lLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lczogW3Byb3BzLmRvbWFpbl0sXG4gICAgICAgICAgICBjb21tZW50OiBjZG5OYW1lLFxuICAgICAgICAgICAgbWluaW11bVByb3RvY29sVmVyc2lvbjogU2VjdXJpdHlQb2xpY3lQcm90b2NvbC5UTFNfVjFfMl8yMDE4LFxuICAgICAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWdsb2JhbC1jZXJ0aWZpY2F0ZWAsIHByb3BzLmdsb2JhbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5udXh0U2VydmVyUm91dGVCZWhhdmlvcixcbiAgICAgICAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHRoaXMuc2V0dXBDbG91ZEZyb250Um91dGluZyhwcm9wcyksXG4gICAgICAgICAgICBwcmljZUNsYXNzOiBQcmljZUNsYXNzLlBSSUNFX0NMQVNTXzEwMCwgLy8gVXNlIG9ubHkgTm9ydGggQW1lcmljYSBhbmQgRXVyb3BlXG4gICAgICAgICAgICBsb2dCdWNrZXQ6IHRoaXMuYWNjZXNzTG9nc0J1Y2tldCxcbiAgICAgICAgICAgIGxvZ0ZpbGVQcmVmaXg6IHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcyA/ICd1bnByb2Nlc3NlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBsb2dJbmNsdWRlc0Nvb2tpZXM6IHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcyxcbiAgICAgICAgICAgIHdlYkFjbElkOiBwcm9wcy53ZWJBY2xBcm4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGJlaGF2aW9yIG9yaWdpbiB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcEh0dHBPcmlnaW4oKTogSHR0cE9yaWdpbiB7XG4gICAgICAgIHJldHVybiBuZXcgSHR0cE9yaWdpbihgJHt0aGlzLmFwaUdhdGV3YXkuaHR0cEFwaUlkfS5leGVjdXRlLWFwaS4ke3RoaXMucmVnaW9ufS5hbWF6b25hd3MuY29tYCwge1xuICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMiksXG4gICAgICAgICAgICByZWFkVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBwcm90b2NvbFBvbGljeTogT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUFNfT05MWSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgd2ViIHJlcXVlc3RzXG4gICAgICogdG8gdGhlIE51eHQgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKiBBZGRpdGlvbmFsbHksIHRoaXMgYXV0b21hdGljYWxseSByZWRpcmVjdHMgSFRUUCByZXF1ZXN0cyB0byBIVFRQUy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcmlnaW46IHRoaXMuaHR0cE9yaWdpbixcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRCxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5hcHBSZXF1ZXN0UG9saWN5LFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IHRoaXMuYXBwQ2FjaGVQb2xpY3lcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwQ2xvdWRGcm9udFJvdXRpbmcocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGxldCByb3V0aW5nQmVoYXZpb3VyczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHtcblxuICAgICAgICAgICAgLy8gTnV4dCBJMThuIGZpbGVzIGFyZSBzZXJ2ZWQgdmlhIGEgc2VydmVyIHJvdXRlXG4gICAgICAgICAgICAnL19pMThuLyonOiB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNwZWNpZmljIG9uZXMgZmlyc3RcbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZUFwaSkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlQXBpUm91dGVCZWhhdmlvcigpfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU2l0ZW1hcFJvdXRlQmVoYXZpb3IoKX07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgY3VzdG9tIHNlcnZlciByb3V0ZXMgYmVmb3JlIHN0YXRpYyBhc3NldHMgdG8gZW5zdXJlIHRoZXkgdGFrZSBwcmVjZWRlbmNlXG4gICAgICAgIGlmIChwcm9wcy5zZXJ2ZXJSb3V0ZXMgJiYgcHJvcHMuc2VydmVyUm91dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZVNlcnZlclJvdXRlQmVoYXZpb3IocHJvcHMuc2VydmVyUm91dGVzKX07XG4gICAgICAgIH1cblxuICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTdGF0aWNBc3NldHNSb3V0ZUJlaGF2aW9yKCl9O1xuXG4gICAgICAgIHJldHVybiByb3V0aW5nQmVoYXZpb3VycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2FjaGUgcG9saWN5IGZvciB0aGUgTnV4dCBhcHAgcm91dGUgYmVoYXZpb3Igb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcENhY2hlUG9saWN5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IENhY2hlUG9saWN5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNhY2hlLXBvbGljeWAsIHtcbiAgICAgICAgICAgIGNhY2hlUG9saWN5TmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tY2FjaGUtcG9saWN5YCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGBEZWZpbmVzIHdoaWNoIHJlcXVlc3QgZGF0YSB0byBwYXNzIHRvIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gb3JpZ2luIGFuZCBob3cgdGhlIGNhY2hlIGtleSBpcyBjYWxjdWxhdGVkLmAsXG4gICAgICAgICAgICBkZWZhdWx0VHRsOiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICAgICAgbWluVHRsOiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICAgICAgbWF4VHRsOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICAgICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBwcm9wcy5jYWNoZUtleVF1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmNhY2hlS2V5UXVlcnlQYXJhbXMpIDogKHByb3BzLmRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuZGVueUxpc3QoLi4ucHJvcHMuZGVueUNhY2hlS2V5UXVlcnlQYXJhbXMpIDogKHByb3BzLmFsbG93UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dRdWVyeVBhcmFtcykgOiAocHJvcHMuZGVueVF1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuZGVueUxpc3QoLi4ucHJvcHMuZGVueVF1ZXJ5UGFyYW1zKSA6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSkpKSxcbiAgICAgICAgICAgIGhlYWRlckJlaGF2aW9yOiBwcm9wcy5jYWNoZUtleUhlYWRlcnM/Lmxlbmd0aCA/IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmNhY2hlS2V5SGVhZGVycykgOiAocHJvcHMuYWxsb3dIZWFkZXJzPy5sZW5ndGggPyBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5hbGxvd0hlYWRlcnMpIDogQ2FjaGVIZWFkZXJCZWhhdmlvci5ub25lKCkpLFxuICAgICAgICAgICAgY29va2llQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5Q29va2llcz8ubGVuZ3RoID8gQ2FjaGVDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlDb29raWVzKSA6IChwcm9wcy5hbGxvd0Nvb2tpZXM/Lmxlbmd0aCA/IENhY2hlQ29va2llQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93Q29va2llcykgOiBDYWNoZUNvb2tpZUJlaGF2aW9yLm5vbmUoKSksXG4gICAgICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogdHJ1ZSxcbiAgICAgICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nR3ppcDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgZm9yIHRoZSBOdXh0IGFwcCByb3V0ZSBiZWhhdmlvciBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICogTm8gcG9saWN5IGlzIGNyZWF0ZWQgaWYgbm8gZXhwbGljaXQgY29uZmlnIGlzIHByb3ZpZGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcFJlcXVlc3RQb2xpY3kocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogT3JpZ2luUmVxdWVzdFBvbGljeXx1bmRlZmluZWQge1xuXG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGNvbmZpZyBpcyBwcm92aWRlZCwgd2Ugd2FudCB0byB1c2UgdGhlIGRlZmF1bHQgZnJvbSBDbG91ZGZyb250XG4gICAgICAgIGNvbnN0IGhhc0FueUNvbmZpZyA9IHByb3BzLmZvcndhcmRRdWVyeVBhcmFtcz8ubGVuZ3RoIHx8IHByb3BzLmZvcndhcmRIZWFkZXJzPy5sZW5ndGggfHwgcHJvcHMuZm9yd2FyZENvb2tpZXM/Lmxlbmd0aDtcbiAgICAgICAgaWYgKCFoYXNBbnlDb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE9yaWdpblJlcXVlc3RQb2xpY3kodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1yZXF1ZXN0LXBvbGljeWAsIHtcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3lOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1yZXF1ZXN0LXBvbGljeWAsXG4gICAgICAgICAgICBjb21tZW50OiBgRGVmaW5lcyB3aGljaCByZXF1ZXN0IGRhdGEgdG8gcGFzcyB0byB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IG9yaWdpbiB3aXRob3V0IGFmZmVjdGluZyB0aGUgY2FjaGUga2V5LmAsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBwcm9wcy5mb3J3YXJkUXVlcnlQYXJhbXM/Lmxlbmd0aCA/IE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5mb3J3YXJkUXVlcnlQYXJhbXMpIDogT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gICAgICAgICAgICBoZWFkZXJCZWhhdmlvcjogcHJvcHMuZm9yd2FyZEhlYWRlcnM/Lmxlbmd0aCA/IE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuZm9yd2FyZEhlYWRlcnMpIDogT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLm5vbmUoKSxcbiAgICAgICAgICAgIGNvb2tpZUJlaGF2aW9yOiBwcm9wcy5mb3J3YXJkQ29va2llcz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5mb3J3YXJkQ29va2llcykgOiBPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBOdXh0IGFwcCBBUEkgcmVxdWVzdHMgdG8gdGhlIEFQSSBnYXRld2F5LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBpUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3QgYXBpQmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogdGhpcy5odHRwT3JpZ2luLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IHRoaXMuYXBwQ2FjaGVQb2xpY3ksXG4gICAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiB0aGlzLmFwcFJlcXVlc3RQb2xpY3ksXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuSFRUUFNfT05MWVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHJ1bGVzWycvYXBpLyonXSA9IGFwaUJlaGF2aW9yO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJlaGF2aW9ycyBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIHNwZWNpZmllZCBwYXRoIHBhdHRlcm5zIHRvIHRoZSBTU1Igb3JpZ2luLlxuICAgICAqIFRoaXMgYWxsb3dzIHNlcnZlciBlbmRwb2ludHMgdGhhdCB1c2UgZmlsZS1saWtlIFVSTHMgKGUuZy4sIC9zaXRlbWFwLnhtbCBmcm9tIEBudXh0anMvc2l0ZW1hcCkgXG4gICAgICogdG8gYmUgaGFuZGxlZCBieSB0aGUgTGFtYmRhIGZ1bmN0aW9uIGZvciBkeW5hbWljIGNvbnRlbnQgZ2VuZXJhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNlcnZlclJvdXRlQmVoYXZpb3Ioc2VydmVyUm91dGVzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICBcbiAgICAgICAgc2VydmVyUm91dGVzLmZvckVhY2gocm91dGUgPT4ge1xuICAgICAgICAgICAgcnVsZXNbcm91dGVdID0gdGhpcy5udXh0U2VydmVyUm91dGVCZWhhdmlvcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIGluY29taW5nIHJlcXVlc3RzIGZvciB0aGUgc3RhdGljIGFzc2V0c1xuICAgICAqIHRvIHRoZSBTMyBidWNrZXQgdGhhdCBob2xkcyB0aGVzZSBzdGF0aWMgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVN0YXRpY0Fzc2V0c1JvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0c0NhY2hlQ29uZmlnOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IFMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NJZGVudGl0eSh0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eTogdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncy5mb3JFYWNoKGFzc2V0ID0+IHtcbiAgICAgICAgICAgIHJ1bGVzW2Ake2Fzc2V0LnRhcmdldH0ke2Fzc2V0LnBhdHRlcm59YF0gPSBzdGF0aWNBc3NldHNDYWNoZUNvbmZpZ1xuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBydWxlc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIGluY29taW5nIHJlcXVlc3RzIGZvciB0aGUgc2l0ZW1hcCBhc3NldHNcbiAgICAgKiB0byB0aGUgUzMgYnVja2V0IHRoYXQgaG9sZHMgdGhlc2Ugc2l0ZW1hcCBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2l0ZW1hcFJvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGlmICghdGhpcy5zaXRlbWFwQnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTaXRlbWFwIGJ1Y2tldCBtdXN0IGV4aXN0IGJlZm9yZSBjcmVhdGluZyBzaXRlbWFwIHJvdXRlIGJlaGF2aW9yLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpdGVtYXBDYWNoZUNvbmZpZzogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcy5zaXRlbWFwQnVja2V0LCB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMpLFxuICAgICAgICAgICAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OiB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJypzaXRlbWFwLnhtbCddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuICAgICAgICBydWxlc1snKnNpdGVtYXAtZ29uZS54bWwnXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcbiAgICAgICAgcnVsZXNbJy9zaXRlbWFwcy8qJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZHMgdGhlIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIGFzIGRlZmluZWQgaW4ge0BzZWUgZ2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlnc30gdG8gdGhlIHN0YXRpYyBhc3NldHMgUzMgYnVja2V0LlxuICAgICAqIEluIG9yZGVyIHRvIGVuYWJsZSBhIHplcm8tZG93bnRpbWUgZGVwbG95bWVudCB3aXRoIG1pbmltYWwgc3RvcmFnZSBsb2FkLFxuICAgICAqIHdlIGRlcGxveSB0aGUgc3RhdGljIGFzc2V0cyBvZiBldmVyeSBkZXBsb3ltZW50IGludG8gdGhlIHNhbWUgZm9sZGVyIGJ1dCBtYXJrIHRoZW0gd2l0aCBhIGRlcGxveW1lbnQgcmV2aXNpb24uXG4gICAgICogQnkgZG9pbmcgc28sIHRoZSBmaWxlcyBvZiBwcmV2aW91cyBkZXBsb3ltZW50cyBhcmUgcmV0YWluZWQgdG8gYWxsb3cgY2xpZW50cyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggYW4gb2xkZXIgcmV2aXNpb25cbiAgICAgKiBidXQgZ2V0cyBjbGVhbmVkIHVwIGFmdGVyIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lIHZpYSB0aGUgY2xlYW51cCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25maWd1cmVEZXBsb3ltZW50cygpOiBCdWNrZXREZXBsb3ltZW50W10ge1xuICAgICAgICBjb25zdCBsb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzLWRlcGxveW1lbnRgLFxuICAgICAgICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9EQVksXG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJldHVybnMgYSBkZXBsb3ltZW50IGZvciBldmVyeSBjb25maWd1cmVkIHN0YXRpYyBhc3NldCB0eXBlIHRvIHJlc3BlY3QgdGhlIGRpZmZlcmVudCBjYWNoZSBzZXR0aW5nc1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNBc3NldENvbmZpZ3MuZmlsdGVyKGFzc2V0ID0+IGV4aXN0c1N5bmMoYXNzZXQuc291cmNlKSkubWFwKChhc3NldCwgYXNzZXRJbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzLWRlcGxveW1lbnQtJHthc3NldEluZGV4fWAsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VzOiBbU291cmNlLmFzc2V0KGFzc2V0LnNvdXJjZSwge1xuICAgICAgICAgICAgICAgICAgICBleGNsdWRlOiBhc3NldC5leGNsdWRlLFxuICAgICAgICAgICAgICAgIH0pXSxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQsXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IGFzc2V0LnRhcmdldC5yZXBsYWNlKC9eXFwvKy9nLCAnJyksIC8vIFJlbW92ZSBsZWFkaW5nIHNsYXNoXG4gICAgICAgICAgICAgICAgcHJ1bmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHN0b3JhZ2VDbGFzczogU3RvcmFnZUNsYXNzLlNUQU5EQVJELFxuICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IFsnKiddLFxuICAgICAgICAgICAgICAgIGluY2x1ZGU6IFthc3NldC5wYXR0ZXJuXSxcbiAgICAgICAgICAgICAgICBjYWNoZUNvbnRyb2w6IGFzc2V0LmNhY2hlQ29udHJvbCxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogYXNzZXQuY29udGVudFR5cGUsXG4gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uOiBhc3NldC5pbnZhbGlkYXRlT25DaGFuZ2UgPyB0aGlzLmNkbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25QYXRoczogYXNzZXQuaW52YWxpZGF0ZU9uQ2hhbmdlID8gW2AvJHthc3NldC5wYXR0ZXJufWBdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGxvZ0dyb3VwOiBsb2dHcm91cCxcblxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIGJ1aWxkIHJldmlzaW9uIG9uIGV2ZXJ5IGFzc2V0IHRvIGFsbG93IGNsZWFudXAgb2Ygb3V0ZGF0ZWQgYXNzZXRzXG4gICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOiB0aGlzLmRlcGxveW1lbnRSZXZpc2lvbixcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgLy8gU29tZSBOdXh0IGFwcGxpY2F0aW9ucyBoYXZlIGEgbG90IG9mIGFzc2V0cyB0byBkZXBsb3kgd2hlcmVieSB0aGUgZnVuY3Rpb24gbWlnaHQgcnVuIG91dCBvZiBtZW1vcnkuXG4gICAgICAgICAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBhIGhpZ2ggbWVtb3J5IGxpbWl0IG1pZ2h0IHNwZWVkIHVwIGRlcGxveW1lbnRzLlxuICAgICAgICAgICAgICAgIG1lbW9yeUxpbWl0OiAxNzkyXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgaG9zdGVkIHpvbmUgYXQgd2hpY2ggdGhlIEROUyByZWNvcmRzIHNoYWxsIGJlIGNyZWF0ZWQgdG8gYWNjZXNzIHRoZSBOdXh0IGFwcCBvbiB0aGUgaW50ZXJuZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEhvc3RlZFpvbmUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogSUhvc3RlZFpvbmUge1xuICAgICAgICBjb25zdCBkb21haW5QYXJ0cyA9IHByb3BzLmRvbWFpbi5zcGxpdCgnLicpO1xuXG4gICAgICAgIHJldHVybiBIb3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWhvc3RlZC16b25lYCwge1xuICAgICAgICAgICAgaG9zdGVkWm9uZUlkOiBwcm9wcy5ob3N0ZWRab25lSWQsXG4gICAgICAgICAgICB6b25lTmFtZTogZG9tYWluUGFydHNbZG9tYWluUGFydHMubGVuZ3RoIC0gMV0sIC8vIFN1cHBvcnQgc3ViZG9tYWluc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBETlMgcmVjb3JkcyB0byBhY2Nlc3MgdGhlIE51eHQgYXBwIG9uIHRoZSBpbnRlcm5ldCB2aWEgdGhlIGN1c3RvbSBkb21haW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRG5zUmVjb3Jkcyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaG9zdGVkWm9uZSA9IHRoaXMuZmluZEhvc3RlZFpvbmUocHJvcHMpO1xuICAgICAgICBjb25zdCBkbnNUYXJnZXQgPSBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuY2RuKSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgcmVjb3JkIGZvciBJUHY0XG4gICAgICAgIG5ldyBBUmVjb3JkKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taXB2NC1yZWNvcmRgLCB7XG4gICAgICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgICAgICAgdGFyZ2V0OiBkbnNUYXJnZXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NlxuICAgICAgICBuZXcgQWFhYVJlY29yZCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWlwdjYtcmVjb3JkYCwge1xuICAgICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdG8gcGluZyB0aGUgTnV4dCBhcHAgTGFtYmRhIGZ1bmN0aW9uIGV2ZXJ5IDUgbWludXRlcyBpbiBvcmRlciB0byBrZWVwIGl0IHdhcm1cbiAgICAgKiBhbmQgc3BlZWQgdXAgaW5pdGlhbCBTU1IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBwUGluZ1J1bGUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZha2VBcGlHYXRld2F5RXZlbnREYXRhID0ge1xuICAgICAgICAgICAgXCJ2ZXJzaW9uXCI6IFwiMi4wXCIsXG4gICAgICAgICAgICBcInJvdXRlS2V5XCI6IFwiR0VUIC97cHJveHkrfVwiLFxuICAgICAgICAgICAgXCJyYXdQYXRoXCI6IFwiL1wiLFxuICAgICAgICAgICAgXCJyYXdRdWVyeVN0cmluZ1wiOiBcIlwiLFxuICAgICAgICAgICAgXCJoZWFkZXJzXCI6IHt9LFxuICAgICAgICAgICAgXCJyZXF1ZXN0Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgXCJkb21haW5OYW1lXCI6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgICAgICBcImh0dHBcIjoge1xuICAgICAgICAgICAgICAgICAgICBcIm1ldGhvZFwiOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgICAgICBcInBhdGhcIjogXCIvXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicHJvdG9jb2xcIjogXCJIVFRQLzEuMVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIG5ldyBSdWxlKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcGluZ2VyLXJ1bGVgLCB7XG4gICAgICAgICAgICBydWxlTmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1waW5nZXJgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBQaW5ncyB0aGUgTGFtYmRhIGZ1bmN0aW9uIG9mIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gYXBwIGV2ZXJ5IDUgbWludXRlcyB0byBrZWVwIGl0IHdhcm0uYCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5taW51dGVzKDUpKSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5hcHBMYW1iZGFGdW5jdGlvbiwge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBSdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdChmYWtlQXBpR2F0ZXdheUV2ZW50RGF0YSlcbiAgICAgICAgICAgIH0pXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdGhhdCBydW5zIGV2ZXJ5IFR1ZXNkYXkgYXQgMDM6MzAgQU0gR01UIHRvIHRyaWdnZXJcbiAgICAgKiBvdXIgY2xlYW51cCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk6IHZvaWQge1xuICAgICAgICBuZXcgUnVsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlci1ydWxlYCwge1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVyYCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgVHJpZ2dlcnMgYSBjbGVhbnVwIG9mIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGF0IHRoZSAke3RoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9IFMzIGJ1Y2tldC5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5jcm9uKHt3ZWVrRGF5OiAnMicsIGhvdXI6ICczJywgbWludXRlOiAnMzAnfSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuY2xlYW51cExhbWJkYUZ1bmN0aW9uKV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTMyBidWNrZXQgdG8gc3RvcmUgdGhlIGFjY2VzcyBsb2dzIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFjY2Vzc0xvZ3NCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3NgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBPYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX1BSRUZFUlJFRCxcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIHN0YWNrIGlzIGRlc3Ryb3llZCwgd2UgZXhwZWN0IGV2ZXJ5dGhpbmcgdG8gYmUgZGVsZXRlZFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBjcmVhdGVBY2Nlc3NMb2dzQW5hbHlzaXMocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5hY2Nlc3NMb2dzQnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY2VzcyBidWNrZXQgbm90IHNldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzIH0gPSByZXF1aXJlKCcuLi9hY2Nlc3MtbG9ncy1hbmFseXNpcy9DbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzJyk7XG5cbiAgICAgICAgbmV3IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXModGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9ncy1hbmFseXNpc2AsIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5hY2Nlc3NMb2dzQnVja2V0LFxuICAgICAgICAgICAgcmVzb3VyY2VQcmVmaXg6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3NgLFxuICAgICAgICAgICAgYWNjZXNzTG9nQ29va2llczogcHJvcHMuYWNjZXNzTG9nQ29va2llcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|
|
@@ -309,8 +309,8 @@ export class NuxtServerAppStack extends Stack {
|
|
|
309
309
|
code: Code.fromAsset(`${functionDirPath}/build/app`, {
|
|
310
310
|
exclude: ['*.d.ts']
|
|
311
311
|
}),
|
|
312
|
-
timeout: Duration.minutes(
|
|
313
|
-
memorySize:
|
|
312
|
+
timeout: Duration.minutes(15),
|
|
313
|
+
memorySize: 512,
|
|
314
314
|
environment: {
|
|
315
315
|
STATIC_ASSETS_BUCKET: this.staticAssetsBucket.bucketName,
|
|
316
316
|
OUTDATED_ASSETS_RETENTION_DAYS: `${props.outdatedAssetsRetentionDays ?? 30}`,
|
|
@@ -71,6 +71,7 @@ class CloudFrontWebAcl extends constructs_1.Construct {
|
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
// Rate limiting (DDoS protection)
|
|
74
|
+
// Exclude static assets (build files, chunks) from rate limiting
|
|
74
75
|
if (config.rateLimit) {
|
|
75
76
|
rules.push({
|
|
76
77
|
name: 'RateLimiting',
|
|
@@ -79,6 +80,24 @@ class CloudFrontWebAcl extends constructs_1.Construct {
|
|
|
79
80
|
rateBasedStatement: {
|
|
80
81
|
limit: config.rateLimit,
|
|
81
82
|
aggregateKeyType: 'IP',
|
|
83
|
+
// Exclude requests to /_nuxt/* paths (build files)
|
|
84
|
+
scopeDownStatement: {
|
|
85
|
+
notStatement: {
|
|
86
|
+
statement: {
|
|
87
|
+
byteMatchStatement: {
|
|
88
|
+
searchString: '/_nuxt/',
|
|
89
|
+
fieldToMatch: {
|
|
90
|
+
uriPath: {},
|
|
91
|
+
},
|
|
92
|
+
textTransformations: [{
|
|
93
|
+
priority: 0,
|
|
94
|
+
type: 'NONE',
|
|
95
|
+
}],
|
|
96
|
+
positionalConstraint: 'STARTS_WITH',
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
},
|
|
82
101
|
},
|
|
83
102
|
},
|
|
84
103
|
action: { block: {} },
|
|
@@ -219,4 +238,4 @@ class CloudFrontWebAcl extends constructs_1.Construct {
|
|
|
219
238
|
}
|
|
220
239
|
}
|
|
221
240
|
exports.CloudFrontWebAcl = CloudFrontWebAcl;
|
|
222
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xvdWRGcm9udFdlYkFjbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkNsb3VkRnJvbnRXZWJBY2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXFDO0FBQ3JDLHFEQUEwRDtBQUMxRCwyQ0FBb0U7QUFpQnBFOzs7R0FHRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsc0JBQVM7SUFNM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sTUFBTSxHQUFHLEVBQUMsR0FBRyxtQ0FBdUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBNkIsRUFBRSxDQUFDO1FBQzNDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVqQiw2REFBNkQ7UUFDN0QsSUFBSSxNQUFNLENBQUMsa0JBQWtCLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksY0FBYyxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlGLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsSUFBSSxFQUFFLG9CQUFvQjtnQkFDMUIsUUFBUSxFQUFFLFFBQVEsRUFBRTtnQkFDcEIsU0FBUyxFQUFFO29CQUNQLHVCQUF1QixFQUFFO3dCQUNyQixHQUFHLEVBQUUsWUFBWSxDQUFDLE9BQU87cUJBQzVCO2lCQUNKO2dCQUNELE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUM7Z0JBQ25CLGdCQUFnQixFQUFFO29CQUNkLHNCQUFzQixFQUFFLElBQUk7b0JBQzVCLHdCQUF3QixFQUFFLElBQUk7b0JBQzlCLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxh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LFFBQVEsRUFBRSxRQUFRLEVBQUU7aUJBQ0csQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUkscUJBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ3hDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixLQUFLLEVBQUUsWUFBWTtZQUNuQixhQUFhLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFDO1lBQzFCLEtBQUs7WUFDTCxnQkFBZ0IsRUFBRTtnQkFDZCxzQkFBc0IsRUFBRSxJQUFJO2dCQUM1Qix3QkFBd0IsRUFBRSxJQUFJO2dCQUM5QixVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUMsYUFBYSxRQUFRO2FBQzlDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLElBQVksRUFBRSxTQUFtQjtRQUNqRCxPQUFPLElBQUksb0JBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzVCLElBQUk7WUFDSixLQUFLLEVBQUUsWUFBWTtZQUNuQixnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLFNBQVM7U0FDWixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFuT0QsNENBbU9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtDZm5XZWJBQ0wsIENmbklQU2V0fSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtd2FmdjInO1xuaW1wb3J0IHt0eXBlIFdhZkNvbmZpZywgREVGQVVMVF9OVVhUX1dBRl9DT05GSUd9IGZyb20gJy4vV2FmQ29uZmlnJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDbG91ZEZyb250V2ViQWNsIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250V2ViQWNsUHJvcHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIHByZWZpeCBmb3IgdGhlIFdlYiBBQ0wgYW5kIHJlbGF0ZWQgcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFdBRiBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29uZmlnOiBXYWZDb25maWc7XG59XG5cbi8qKlxuICogQSBjb25zdHJ1Y3QgdGhhdCBjcmVhdGVzIGFuIEFXUyBXQUYgV2ViIEFDTCBmb3IgQ2xvdWRGcm9udCBkaXN0cmlidXRpb25zLlxuICogUHJvdmlkZXMgcHJvdGVjdGlvbiBhZ2FpbnN0IGNvbW1vbiB3ZWIgZXhwbG9pdHMsIGJvdHMsIGFuZCBERG9TIGF0dGFja3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG91ZEZyb250V2ViQWNsIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgV2ViIEFDTCByZXNvdXJjZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgd2ViQWNsOiBDZm5XZWJBQ0w7XG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2xvdWRGcm9udFdlYkFjbFByb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gey4uLkRFRkFVTFRfTlVYVF9XQUZfQ09ORklHLCAuLi5wcm9wcy5jb25maWd9O1xuICAgICAgICBjb25zdCBydWxlczogQ2ZuV2ViQUNMLlJ1bGVQcm9wZXJ0eVtdID0gW107XG4gICAgICAgIGxldCBwcmlvcml0eSA9IDA7XG5cbiAgICAgICAgLy8gSVAgYWxsb3dsaXN0IChoaWdoZXN0IHByaW9yaXR5IC0gYnlwYXNzZXMgYWxsIG90aGVyIHJ1bGVzKVxuICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRJcEFkZHJlc3NlcyAmJiBjb25maWcuYWxsb3dlZElwQWRkcmVzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWRJcFNldCA9IHRoaXMuY3JlYXRlSXBTZXQoYCR7cHJvcHMubmFtZX0tYWxsb3dlZC1pcHNgLCBjb25maWcuYWxsb3dlZElwQWRkcmVzc2VzKTtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBbGxvd2VkSXBBZGRyZXNzZXMnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBpcFNldFJlZmVyZW5jZVN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJuOiBhbGxvd2VkSXBTZXQuYXR0ckFybixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFjdGlvbjoge2FsbG93OiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUFsbG93ZWRJcHNgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElQIGJsb2NrbGlzdFxuICAgICAgICBpZiAoY29uZmlnLmJsb2NrZWRJcEFkZHJlc3NlcyAmJiBjb25maWcuYmxvY2tlZElwQWRkcmVzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrZWRJcFNldCA9IHRoaXMuY3JlYXRlSXBTZXQoYCR7cHJvcHMubmFtZX0tYmxvY2tlZC1pcHNgLCBjb25maWcuYmxvY2tlZElwQWRkcmVzc2VzKTtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdCbG9ja2VkSXBBZGRyZXNzZXMnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBpcFNldFJlZmVyZW5jZVN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJuOiBibG9ja2VkSXBTZXQuYXR0ckFybixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFjdGlvbjoge2Jsb2NrOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUJsb2NrZWRJcHNgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlby1ibG9ja2luZ1xuICAgICAgICBpZiAoY29uZmlnLmJsb2NrZWRDb3VudHJpZXMgJiYgY29uZmlnLmJsb2NrZWRDb3VudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0dlb0Jsb2NraW5nJyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvTWF0Y2hTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlczogY29uZmlnLmJsb2NrZWRDb3VudHJpZXMsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY3Rpb246IHtibG9jazoge319LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHtjb25maWcubWV0cmljc1ByZWZpeH1HZW9CbG9ja2luZ2AsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdGluZyAoRERvUyBwcm90ZWN0aW9uKVxuICAgICAgICBpZiAoY29uZmlnLnJhdGVMaW1pdCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JhdGVMaW1pdGluZycsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIHJhdGVCYXNlZFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IGNvbmZpZy5yYXRlTGltaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVLZXlUeXBlOiAnSVAnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7YmxvY2s6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9UmF0ZUxpbWl0YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBV1MgTWFuYWdlZCBSdWxlcyAtIENvbW1vbiBSdWxlIFNldFxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUNvbW1vblJ1bGVTZXQpIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBV1NNYW5hZ2VkUnVsZXNDb21tb25SdWxlU2V0JyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFJ1bGVHcm91cFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTmFtZTogJ0FXUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQ29tbW9uUnVsZVNldCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9Q29tbW9uUnVsZVNldGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBLbm93biBCYWQgSW5wdXRzXG4gICAgICAgIGlmIChjb25maWcuZW5hYmxlS25vd25CYWRJbnB1dHNSdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzS25vd25CYWRJbnB1dHNSdWxlU2V0JyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFJ1bGVHcm91cFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTmFtZTogJ0FXUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzS25vd25CYWRJbnB1dHNSdWxlU2V0JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG92ZXJyaWRlQWN0aW9uOiB7bm9uZToge319LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHtjb25maWcubWV0cmljc1ByZWZpeH1Lbm93bkJhZElucHV0c2AsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBBbm9ueW1vdXMgSVAgTGlzdFxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUFub255bW91c0lwUnVsZVNldCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0Fub255bW91c0lwTGlzdCcsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRSdWxlR3JvdXBTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck5hbWU6ICdBV1MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0Fub255bW91c0lwTGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9QW5vbnltb3VzSXBMaXN0YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBV1MgTWFuYWdlZCBSdWxlcyAtIEFtYXpvbiBJUCBSZXB1dGF0aW9uIExpc3RcbiAgICAgICAgaWYgKGNvbmZpZy5lbmFibGVBbWF6b25JcFJlcHV0YXRpb25SdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQW1hem9uSXBSZXB1dGF0aW9uTGlzdCcsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRSdWxlR3JvdXBTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck5hbWU6ICdBV1MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0FtYXpvbklwUmVwdXRhdGlvbkxpc3QnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVBY3Rpb246IHtub25lOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUFtYXpvbklwUmVwdXRhdGlvbmAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBCb3QgQ29udHJvbFxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUJvdENvbnRyb2xSdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQm90Q29udHJvbFJ1bGVTZXQnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkUnVsZUdyb3VwU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JOYW1lOiAnQVdTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBV1NNYW5hZ2VkUnVsZXNCb3RDb250cm9sUnVsZVNldCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9Qm90Q29udHJvbGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3VzdG9tIHJ1bGVzIChhZGRlZCBhdCB0aGUgZW5kIHdpdGggYXV0b21hdGljYWxseSBhc3NpZ25lZCBwcmlvcml0aWVzKVxuICAgICAgICBpZiAoY29uZmlnLmN1c3RvbVJ1bGVzICYmIGNvbmZpZy5jdXN0b21SdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25maWcuY3VzdG9tUnVsZXMuZm9yRWFjaCgoY3VzdG9tUnVsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi5jdXN0b21SdWxlLFxuICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICB9IGFzIENmbldlYkFDTC5SdWxlUHJvcGVydHkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIFdlYiBBQ0xcbiAgICAgICAgdGhpcy53ZWJBY2wgPSBuZXcgQ2ZuV2ViQUNMKHRoaXMsICdXZWJBY2wnLCB7XG4gICAgICAgICAgICBuYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgICAgICAgc2NvcGU6ICdDTE9VREZST05UJyxcbiAgICAgICAgICAgIGRlZmF1bHRBY3Rpb246IHthbGxvdzoge319LFxuICAgICAgICAgICAgcnVsZXMsXG4gICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9V2ViQWNsYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gSVAgc2V0IGZvciBXQUYgcnVsZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVJcFNldChuYW1lOiBzdHJpbmcsIGFkZHJlc3Nlczogc3RyaW5nW10pOiBDZm5JUFNldCB7XG4gICAgICAgIHJldHVybiBuZXcgQ2ZuSVBTZXQodGhpcywgbmFtZSwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHNjb3BlOiAnQ0xPVURGUk9OVCcsXG4gICAgICAgICAgICBpcEFkZHJlc3NWZXJzaW9uOiAnSVBWNCcsXG4gICAgICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuIl19
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xvdWRGcm9udFdlYkFjbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkNsb3VkRnJvbnRXZWJBY2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXFDO0FBQ3JDLHFEQUEwRDtBQUMxRCwyQ0FBb0U7QUFpQnBFOzs7R0FHRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsc0JBQVM7SUFNM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sTUFBTSxHQUFHLEVBQUMsR0FBRyxtQ0FBdUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBNkIsRUFBRSxDQUFDO1FBQzNDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVqQiw2REFBNkQ7UUFDN0QsSUFBSSxNQUFNLENBQUMsa0JBQWtCLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksY0FBYyxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlGLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsSUFBSSxFQUFFLG9CQUFvQjtnQkFDMUIsUUFBUSxFQUFFLFFBQVEsRUFBRTtnQkFDcEIsU0FBUyxFQUFFO29CQUNQLHVCQUF1QixFQUFFO3dCQUNyQixHQUFHLEVBQUUsWUFBWSxDQUFDLE9BQU87cUJBQzVCO2lCQUNKO2dCQUNELE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUM7Z0JBQ25CLGdCQUFnQixFQUFFO29CQUNkLHNCQUFzQixFQUFFLElBQUk7b0JBQzVCLHdCQUF3QixFQUFFLElBQUk7b0JBQzlCLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxh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cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge0NmbldlYkFDTCwgQ2ZuSVBTZXR9IGZyb20gJ2F3cy1jZGstbGliL2F3cy13YWZ2Mic7XG5pbXBvcnQge3R5cGUgV2FmQ29uZmlnLCBERUZBVUxUX05VWFRfV0FGX0NPTkZJR30gZnJvbSAnLi9XYWZDb25maWcnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIENsb3VkRnJvbnRXZWJBY2wgY29uc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRnJvbnRXZWJBY2xQcm9wcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgcHJlZml4IGZvciB0aGUgV2ViIEFDTCBhbmQgcmVsYXRlZCByZXNvdXJjZXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV0FGIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICAgKi9cbiAgICByZWFkb25seSBjb25maWc6IFdhZkNvbmZpZztcbn1cblxuLyoqXG4gKiBBIGNvbnN0cnVjdCB0aGF0IGNyZWF0ZXMgYW4gQVdTIFdBRiBXZWIgQUNMIGZvciBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbnMuXG4gKiBQcm92aWRlcyBwcm90ZWN0aW9uIGFnYWluc3QgY29tbW9uIHdlYiBleHBsb2l0cywgYm90cywgYW5kIEREb1MgYXR0YWNrcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkRnJvbnRXZWJBY2wgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBXZWIgQUNMIHJlc291cmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB3ZWJBY2w6IENmbldlYkFDTDtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbG91ZEZyb250V2ViQWNsUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgICAgICBjb25zdCBjb25maWcgPSB7Li4uREVGQVVMVF9OVVhUX1dBRl9DT05GSUcsIC4uLnByb3BzLmNvbmZpZ307XG4gICAgICAgIGNvbnN0IHJ1bGVzOiBDZm5XZWJBQ0wuUnVsZVByb3BlcnR5W10gPSBbXTtcbiAgICAgICAgbGV0IHByaW9yaXR5ID0gMDtcblxuICAgICAgICAvLyBJUCBhbGxvd2xpc3QgKGhpZ2hlc3QgcHJpb3JpdHkgLSBieXBhc3NlcyBhbGwgb3RoZXIgcnVsZXMpXG4gICAgICAgIGlmIChjb25maWcuYWxsb3dlZElwQWRkcmVzc2VzICYmIGNvbmZpZy5hbGxvd2VkSXBBZGRyZXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZElwU2V0ID0gdGhpcy5jcmVhdGVJcFNldChgJHtwcm9wcy5uYW1lfS1hbGxvd2VkLWlwc2AsIGNvbmZpZy5hbGxvd2VkSXBBZGRyZXNzZXMpO1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FsbG93ZWRJcEFkZHJlc3NlcycsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIGlwU2V0UmVmZXJlbmNlU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcm46IGFsbG93ZWRJcFNldC5hdHRyQXJuLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7YWxsb3c6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9QWxsb3dlZElwc2AsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSVAgYmxvY2tsaXN0XG4gICAgICAgIGlmIChjb25maWcuYmxvY2tlZElwQWRkcmVzc2VzICYmIGNvbmZpZy5ibG9ja2VkSXBBZGRyZXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tlZElwU2V0ID0gdGhpcy5jcmVhdGVJcFNldChgJHtwcm9wcy5uYW1lfS1ibG9ja2VkLWlwc2AsIGNvbmZpZy5ibG9ja2VkSXBBZGRyZXNzZXMpO1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Jsb2NrZWRJcEFkZHJlc3NlcycsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIGlwU2V0UmVmZXJlbmNlU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcm46IGJsb2NrZWRJcFNldC5hdHRyQXJuLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7YmxvY2s6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9QmxvY2tlZElwc2AsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2VvLWJsb2NraW5nXG4gICAgICAgIGlmIChjb25maWcuYmxvY2tlZENvdW50cmllcyAmJiBjb25maWcuYmxvY2tlZENvdW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnR2VvQmxvY2tpbmcnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBnZW9NYXRjaFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGVzOiBjb25maWcuYmxvY2tlZENvdW50cmllcyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFjdGlvbjoge2Jsb2NrOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUdlb0Jsb2NraW5nYCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSYXRlIGxpbWl0aW5nIChERG9TIHByb3RlY3Rpb24pXG4gICAgICAgIC8vIEV4Y2x1ZGUgc3RhdGljIGFzc2V0cyAoYnVpbGQgZmlsZXMsIGNodW5rcykgZnJvbSByYXRlIGxpbWl0aW5nXG4gICAgICAgIGlmIChjb25maWcucmF0ZUxpbWl0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUmF0ZUxpbWl0aW5nJyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgcmF0ZUJhc2VkU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW1pdDogY29uZmlnLnJhdGVMaW1pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZUtleVR5cGU6ICdJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIHJlcXVlc3RzIHRvIC9fbnV4dC8qIHBhdGhzIChidWlsZCBmaWxlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlRG93blN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVNYXRjaFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFN0cmluZzogJy9fbnV4dC8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVG9NYXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmlQYXRoOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRUcmFuc2Zvcm1hdGlvbnM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTk9ORScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25hbENvbnN0cmFpbnQ6ICdTVEFSVFNfV0lUSCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7YmxvY2s6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9UmF0ZUxpbWl0YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBV1MgTWFuYWdlZCBSdWxlcyAtIENvbW1vbiBSdWxlIFNldFxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUNvbW1vblJ1bGVTZXQpIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBV1NNYW5hZ2VkUnVsZXNDb21tb25SdWxlU2V0JyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFJ1bGVHcm91cFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTmFtZTogJ0FXUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQ29tbW9uUnVsZVNldCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9Q29tbW9uUnVsZVNldGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBLbm93biBCYWQgSW5wdXRzXG4gICAgICAgIGlmIChjb25maWcuZW5hYmxlS25vd25CYWRJbnB1dHNSdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzS25vd25CYWRJbnB1dHNSdWxlU2V0JyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFJ1bGVHcm91cFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTmFtZTogJ0FXUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzS25vd25CYWRJbnB1dHNSdWxlU2V0JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG92ZXJyaWRlQWN0aW9uOiB7bm9uZToge319LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHtjb25maWcubWV0cmljc1ByZWZpeH1Lbm93bkJhZElucHV0c2AsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBBbm9ueW1vdXMgSVAgTGlzdFxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUFub255bW91c0lwUnVsZVNldCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0Fub255bW91c0lwTGlzdCcsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRSdWxlR3JvdXBTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck5hbWU6ICdBV1MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0Fub255bW91c0lwTGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9QW5vbnltb3VzSXBMaXN0YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBV1MgTWFuYWdlZCBSdWxlcyAtIEFtYXpvbiBJUCBSZXB1dGF0aW9uIExpc3RcbiAgICAgICAgaWYgKGNvbmZpZy5lbmFibGVBbWF6b25JcFJlcHV0YXRpb25SdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQW1hem9uSXBSZXB1dGF0aW9uTGlzdCcsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRSdWxlR3JvdXBTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck5hbWU6ICdBV1MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0FtYXpvbklwUmVwdXRhdGlvbkxpc3QnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVBY3Rpb246IHtub25lOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUFtYXpvbklwUmVwdXRhdGlvbmAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBCb3QgQ29udHJvbFxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUJvdENvbnRyb2xSdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQm90Q29udHJvbFJ1bGVTZXQnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkUnVsZUdyb3VwU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JOYW1lOiAnQVdTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBV1NNYW5hZ2VkUnVsZXNCb3RDb250cm9sUnVsZVNldCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9Qm90Q29udHJvbGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3VzdG9tIHJ1bGVzIChhZGRlZCBhdCB0aGUgZW5kIHdpdGggYXV0b21hdGljYWxseSBhc3NpZ25lZCBwcmlvcml0aWVzKVxuICAgICAgICBpZiAoY29uZmlnLmN1c3RvbVJ1bGVzICYmIGNvbmZpZy5jdXN0b21SdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25maWcuY3VzdG9tUnVsZXMuZm9yRWFjaCgoY3VzdG9tUnVsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi5jdXN0b21SdWxlLFxuICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICB9IGFzIENmbldlYkFDTC5SdWxlUHJvcGVydHkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIFdlYiBBQ0xcbiAgICAgICAgdGhpcy53ZWJBY2wgPSBuZXcgQ2ZuV2ViQUNMKHRoaXMsICdXZWJBY2wnLCB7XG4gICAgICAgICAgICBuYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgICAgICAgc2NvcGU6ICdDTE9VREZST05UJyxcbiAgICAgICAgICAgIGRlZmF1bHRBY3Rpb246IHthbGxvdzoge319LFxuICAgICAgICAgICAgcnVsZXMsXG4gICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9V2ViQWNsYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gSVAgc2V0IGZvciBXQUYgcnVsZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVJcFNldChuYW1lOiBzdHJpbmcsIGFkZHJlc3Nlczogc3RyaW5nW10pOiBDZm5JUFNldCB7XG4gICAgICAgIHJldHVybiBuZXcgQ2ZuSVBTZXQodGhpcywgbmFtZSwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHNjb3BlOiAnQ0xPVURGUk9OVCcsXG4gICAgICAgICAgICBpcEFkZHJlc3NWZXJzaW9uOiAnSVBWNCcsXG4gICAgICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuIl19
|
|
@@ -94,6 +94,7 @@ export class CloudFrontWebAcl extends Construct {
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
// Rate limiting (DDoS protection)
|
|
97
|
+
// Exclude static assets (build files, chunks) from rate limiting
|
|
97
98
|
if (config.rateLimit) {
|
|
98
99
|
rules.push({
|
|
99
100
|
name: 'RateLimiting',
|
|
@@ -102,6 +103,24 @@ export class CloudFrontWebAcl extends Construct {
|
|
|
102
103
|
rateBasedStatement: {
|
|
103
104
|
limit: config.rateLimit,
|
|
104
105
|
aggregateKeyType: 'IP',
|
|
106
|
+
// Exclude requests to /_nuxt/* paths (build files)
|
|
107
|
+
scopeDownStatement: {
|
|
108
|
+
notStatement: {
|
|
109
|
+
statement: {
|
|
110
|
+
byteMatchStatement: {
|
|
111
|
+
searchString: '/_nuxt/',
|
|
112
|
+
fieldToMatch: {
|
|
113
|
+
uriPath: {},
|
|
114
|
+
},
|
|
115
|
+
textTransformations: [{
|
|
116
|
+
priority: 0,
|
|
117
|
+
type: 'NONE',
|
|
118
|
+
}],
|
|
119
|
+
positionalConstraint: 'STARTS_WITH',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
105
124
|
},
|
|
106
125
|
},
|
|
107
126
|
action: {block: {}},
|
|
@@ -39,8 +39,9 @@ export interface WafConfig {
|
|
|
39
39
|
/**
|
|
40
40
|
* The maximum number of requests allowed from a single IP within a 5-minute period
|
|
41
41
|
* to protect against DDoS attacks.
|
|
42
|
+
* Does not apply to build files server under the `/_nuxt/` path.
|
|
42
43
|
* Can be disabled by setting it to `undefined`.
|
|
43
|
-
* @default
|
|
44
|
+
* @default 300
|
|
44
45
|
*/
|
|
45
46
|
readonly rateLimit?: number | undefined;
|
|
46
47
|
/**
|
|
@@ -10,7 +10,7 @@ exports.DEFAULT_NUXT_WAF_CONFIG = {
|
|
|
10
10
|
enableAnonymousIpRuleSet: false,
|
|
11
11
|
enableAmazonIpReputationRuleSet: true,
|
|
12
12
|
enableBotControlRuleSet: false,
|
|
13
|
-
rateLimit:
|
|
13
|
+
rateLimit: 300,
|
|
14
14
|
metricsPrefix: 'WafMetrics',
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2FmQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiV2FmQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJHQTs7R0FFRztBQUNVLFFBQUEsdUJBQXVCLEdBQXVCO0lBQ3ZELG1CQUFtQixFQUFFLElBQUk7SUFDekIsMkJBQTJCLEVBQUUsSUFBSTtJQUNqQyx3QkFBd0IsRUFBRSxLQUFLO0lBQy9CLCtCQUErQixFQUFFLElBQUk7SUFDckMsdUJBQXVCLEVBQUUsS0FBSztJQUM5QixTQUFTLEVBQUUsR0FBRztJQUNkLGFBQWEsRUFBRSxZQUFZO0NBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgQVdTIFdBRiBXZWIgQUNMLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhZkNvbmZpZyB7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBBV1MgbWFuYWdlZCBydWxlIGZvciBjb21tb24gZXhwbG9pdHMgKFNRTCBpbmplY3Rpb24sIFhTUywgZXRjLikuXG4gICAgICogVGhpcyBydWxlIGdyb3VwIGNvbnRhaW5zIHJ1bGVzIHRoYXQgYmxvY2sgcmVxdWVzdCBwYXR0ZXJucyBhc3NvY2lhdGVkIHdpdGggZXhwbG9pdGF0aW9uXG4gICAgICogb2YgdnVsbmVyYWJpbGl0aWVzIHNwZWNpZmljIHRvIHdlYiBhcHBsaWNhdGlvbnMuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZUNvbW1vblJ1bGVTZXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIG1hbmFnZWQgcnVsZSBmb3Iga25vd24gYmFkIGlucHV0cy5cbiAgICAgKiBUaGlzIHJ1bGUgZ3JvdXAgY29udGFpbnMgcnVsZXMgdG8gYmxvY2sgcmVxdWVzdCBwYXR0ZXJucyBrbm93biB0byBiZSBpbnZhbGlkXG4gICAgICogYW5kIGFzc29jaWF0ZWQgd2l0aCBleHBsb2l0YXRpb24gb3IgZGlzY292ZXJ5IG9mIHZ1bG5lcmFiaWxpdGllcy5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlS25vd25CYWRJbnB1dHNSdWxlU2V0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIEFXUyBtYW5hZ2VkIHJ1bGUgZm9yIGFub255bW91cyBJUCBhZGRyZXNzZXMuXG4gICAgICogVGhpcyBydWxlIGdyb3VwIGNvbnRhaW5zIHJ1bGVzIHRvIGJsb2NrIHJlcXVlc3RzIGZyb20gc2VydmljZXMgdGhhdCBhbGxvd1xuICAgICAqIG9iZnVzY2F0aW9uIG9mIHZpZXdlciBpZGVudGl0eSAoVlBOcywgcHJveGllcywgVG9yIG5vZGVzLCBob3N0aW5nIHByb3ZpZGVycykuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVBbm9ueW1vdXNJcFJ1bGVTZXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIG1hbmFnZWQgcnVsZSBmb3IgQW1hem9uIElQIHJlcHV0YXRpb24gbGlzdC5cbiAgICAgKiBUaGlzIHJ1bGUgZ3JvdXAgY29udGFpbnMgcnVsZXMgYmFzZWQgb24gQW1hem9uIHRocmVhdCBpbnRlbGxpZ2VuY2UuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZUFtYXpvbklwUmVwdXRhdGlvblJ1bGVTZXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIG1hbmFnZWQgcnVsZSBmb3IgYm90IGNvbnRyb2wuXG4gICAgICogVGhpcyBydWxlIGdyb3VwIHByb3ZpZGVzIHByb3RlY3Rpb24gYWdhaW5zdCBhdXRvbWF0ZWQgYm90cy5cbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgcGFpZCBmZWF0dXJlIHdpdGggYWRkaXRpb25hbCBjb3N0cy5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZUJvdENvbnRyb2xSdWxlU2V0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyBhbGxvd2VkIGZyb20gYSBzaW5nbGUgSVAgd2l0aGluIGEgNS1taW51dGUgcGVyaW9kXG4gICAgICogdG8gcHJvdGVjdCBhZ2FpbnN0IEREb1MgYXR0YWNrcy5cbiAgICAgKiBEb2VzIG5vdCBhcHBseSB0byBidWlsZCBmaWxlcyBzZXJ2ZXIgdW5kZXIgdGhlIGAvX251eHQvYCBwYXRoLlxuICAgICAqIENhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIGl0IHRvIGB1bmRlZmluZWRgLlxuICAgICAqIEBkZWZhdWx0IDMwMFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJhdGVMaW1pdD86IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGNvdW50cnkgY29kZXMgKElTTyAzMTY2LTEgYWxwaGEtMikgdG8gYmxvY2suXG4gICAgICogRXhhbXBsZTogWydDTicsICdSVScsICdLUCddXG4gICAgICovXG4gICAgcmVhZG9ubHkgYmxvY2tlZENvdW50cmllcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIElQIGFkZHJlc3NlcyBvciBDSURSIHJhbmdlcyB0byBibG9jay5cbiAgICAgKiBFeGFtcGxlOiBbJzE5Mi4wLjIuMC8yNCcsICcxOTguNTEuMTAwLjQyLzMyJ11cbiAgICAgKi9cbiAgICByZWFkb25seSBibG9ja2VkSXBBZGRyZXNzZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBJUCBhZGRyZXNzZXMgb3IgQ0lEUiByYW5nZXMgdG8gYWxsb3cgKGJ5cGFzcyBhbGwgcnVsZXMpLlxuICAgICAqIEV4YW1wbGU6IFsnMjAzLjAuMTEzLjAvMjQnXVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFsbG93ZWRJcEFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQ2xvdWRXYXRjaCBtZXRyaWNzIG5hbWUgcHJlZml4IGZvciB0aGUgV0FGLlxuICAgICAqIEBkZWZhdWx0ICdXYWZNZXRyaWNzJ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IG1ldHJpY3NQcmVmaXg/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gV0FGIHJ1bGVzIHRvIGFkZCBhdCB0aGUgZW5kIG9mIHRoZSBydWxlIHNldC5cbiAgICAgKiBUaGVzZSBydWxlcyB3aWxsIGJlIGFwcGVuZGVkIGFmdGVyIGFsbCBidWlsdC1pbiBtYW5hZ2VkIHJ1bGVzLlxuICAgICAqXG4gICAgICogTm90ZTogRG8gbm90IHNldCB0aGUgYHByaW9yaXR5YCBmaWVsZCAtIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBhc3NpZ25lZC5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGN1c3RvbVJ1bGVzOiBbe1xuICAgICAqICAgbmFtZTogJ0Jsb2NrU3BlY2lmaWNVc2VyQWdlbnQnLFxuICAgICAqICAgc3RhdGVtZW50OiB7XG4gICAgICogICAgIGJ5dGVNYXRjaFN0YXRlbWVudDoge1xuICAgICAqICAgICAgIHNlYXJjaFN0cmluZzogJ0JhZEJvdCcsXG4gICAgICogICAgICAgZmllbGRUb01hdGNoOiB7IHNpbmdsZUhlYWRlcjogeyBuYW1lOiAndXNlci1hZ2VudCcgfSB9LFxuICAgICAqICAgICAgIHRleHRUcmFuc2Zvcm1hdGlvbnM6IFt7IHByaW9yaXR5OiAwLCB0eXBlOiAnTE9XRVJDQVNFJyB9XSxcbiAgICAgKiAgICAgICBwb3NpdGlvbmFsQ29uc3RyYWludDogJ0NPTlRBSU5TJ1xuICAgICAqICAgICB9XG4gICAgICogICB9LFxuICAgICAqICAgYWN0aW9uOiB7IGJsb2NrOiB7fSB9LFxuICAgICAqICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAqICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAqICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICogICAgIG1ldHJpY05hbWU6ICdCbG9ja1NwZWNpZmljVXNlckFnZW50J1xuICAgICAqICAgfVxuICAgICAqIH1dXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcmVhZG9ubHkgY3VzdG9tUnVsZXM/OiBPbWl0PGltcG9ydCgnYXdzLWNkay1saWIvYXdzLXdhZnYyJykuQ2ZuV2ViQUNMLlJ1bGVQcm9wZXJ0eSwgJ3ByaW9yaXR5Jz5bXTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIFdBRiBvcHRpbWl6ZWQgZm9yIE51eHQgYXBwbGljYXRpb25zLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9OVVhUX1dBRl9DT05GSUc6IFBhcnRpYWw8V2FmQ29uZmlnPiA9IHtcbiAgICBlbmFibGVDb21tb25SdWxlU2V0OiB0cnVlLFxuICAgIGVuYWJsZUtub3duQmFkSW5wdXRzUnVsZVNldDogdHJ1ZSxcbiAgICBlbmFibGVBbm9ueW1vdXNJcFJ1bGVTZXQ6IGZhbHNlLFxuICAgIGVuYWJsZUFtYXpvbklwUmVwdXRhdGlvblJ1bGVTZXQ6IHRydWUsXG4gICAgZW5hYmxlQm90Q29udHJvbFJ1bGVTZXQ6IGZhbHNlLFxuICAgIHJhdGVMaW1pdDogMzAwLFxuICAgIG1ldHJpY3NQcmVmaXg6ICdXYWZNZXRyaWNzJyxcbn07XG5cbiJdfQ==
|
|
@@ -45,8 +45,9 @@ export interface WafConfig {
|
|
|
45
45
|
/**
|
|
46
46
|
* The maximum number of requests allowed from a single IP within a 5-minute period
|
|
47
47
|
* to protect against DDoS attacks.
|
|
48
|
+
* Does not apply to build files server under the `/_nuxt/` path.
|
|
48
49
|
* Can be disabled by setting it to `undefined`.
|
|
49
|
-
* @default
|
|
50
|
+
* @default 300
|
|
50
51
|
*/
|
|
51
52
|
readonly rateLimit?: number | undefined;
|
|
52
53
|
|
|
@@ -113,7 +114,7 @@ export const DEFAULT_NUXT_WAF_CONFIG: Partial<WafConfig> = {
|
|
|
113
114
|
enableAnonymousIpRuleSet: false,
|
|
114
115
|
enableAmazonIpReputationRuleSet: true,
|
|
115
116
|
enableBotControlRuleSet: false,
|
|
116
|
-
rateLimit:
|
|
117
|
+
rateLimit: 300,
|
|
117
118
|
metricsPrefix: 'WafMetrics',
|
|
118
119
|
};
|
|
119
120
|
|