UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

86 lines 16.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadCurrentTemplateWithNestedStacks = loadCurrentTemplateWithNestedStacks; exports.loadCurrentTemplate = loadCurrentTemplate; const path = require("path"); const fs = require("fs-extra"); const cloudformation_1 = require("./cloudformation"); const error_1 = require("../../util/error"); const evaluate_cloudformation_template_1 = require("../evaluate-cloudformation-template"); /** * Reads the currently deployed template and all of its nested stack templates from CloudFormation. */ async function loadCurrentTemplateWithNestedStacks(rootStackArtifact, sdk, retrieveProcessedTemplate = false) { const deployedRootTemplate = await loadCurrentTemplate(rootStackArtifact, sdk, retrieveProcessedTemplate); const nestedStacks = await loadNestedStacks(rootStackArtifact, sdk, { generatedTemplate: rootStackArtifact.template, deployedTemplate: deployedRootTemplate, deployedStackName: rootStackArtifact.stackName, }); return { deployedRootTemplate, nestedStacks, }; } /** * Returns the currently deployed template from CloudFormation that corresponds to `stackArtifact`. */ async function loadCurrentTemplate(stackArtifact, sdk, retrieveProcessedTemplate = false) { return loadCurrentStackTemplate(stackArtifact.stackName, sdk, retrieveProcessedTemplate); } async function loadCurrentStackTemplate(stackName, sdk, retrieveProcessedTemplate = false) { const cfn = sdk.cloudFormation(); const stack = await cloudformation_1.CloudFormationStack.lookup(cfn, stackName, retrieveProcessedTemplate); return stack.template(); } async function loadNestedStacks(rootStackArtifact, sdk, parentTemplates) { const listStackResources = parentTemplates.deployedStackName ? new evaluate_cloudformation_template_1.LazyListStackResources(sdk, parentTemplates.deployedStackName) : undefined; const nestedStacks = {}; for (const [nestedStackLogicalId, generatedNestedStackResource] of Object.entries(parentTemplates.generatedTemplate.Resources ?? {})) { if (!isCdkManagedNestedStack(generatedNestedStackResource)) { continue; } const assetPath = generatedNestedStackResource.Metadata['aws:asset:path']; const nestedStackTemplates = await getNestedStackTemplates(rootStackArtifact, assetPath, nestedStackLogicalId, listStackResources, sdk); nestedStacks[nestedStackLogicalId] = { deployedTemplate: nestedStackTemplates.deployedTemplate, generatedTemplate: nestedStackTemplates.generatedTemplate, physicalName: nestedStackTemplates.deployedStackName, nestedStackTemplates: await loadNestedStacks(rootStackArtifact, sdk, nestedStackTemplates), }; } return nestedStacks; } async function getNestedStackTemplates(rootStackArtifact, nestedTemplateAssetPath, nestedStackLogicalId, listStackResources, sdk) { const nestedTemplatePath = path.join(rootStackArtifact.assembly.directory, nestedTemplateAssetPath); // CFN generates the nested stack name in the form `ParentStackName-NestedStackLogicalID-SomeHashWeCan'tCompute, // the arn is of the form: arn:aws:cloudformation:region:123456789012:stack/NestedStackName/AnotherHashWeDon'tNeed // so we get the ARN and manually extract the name. const nestedStackArn = await getNestedStackArn(nestedStackLogicalId, listStackResources); const deployedStackName = nestedStackArn?.slice(nestedStackArn.indexOf('/') + 1, nestedStackArn.lastIndexOf('/')); return { generatedTemplate: JSON.parse(fs.readFileSync(nestedTemplatePath, 'utf-8')), deployedTemplate: deployedStackName ? await loadCurrentStackTemplate(deployedStackName, sdk) : {}, deployedStackName, }; } async function getNestedStackArn(nestedStackLogicalId, listStackResources) { try { const stackResources = await listStackResources?.listStackResources(); return stackResources?.find((sr) => sr.LogicalResourceId === nestedStackLogicalId)?.PhysicalResourceId; } catch (e) { if ((0, error_1.formatErrorMessage)(e).startsWith('Stack with id ') && (0, error_1.formatErrorMessage)(e).endsWith(' does not exist')) { return; } throw e; } } function isCdkManagedNestedStack(stackResource) { return (stackResource.Type === 'AWS::CloudFormation::Stack' && stackResource.Metadata && stackResource.Metadata['aws:asset:path']); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLXN0YWNrLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJuZXN0ZWQtc3RhY2staGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTJCQSxrRkFnQkM7QUFLRCxrREFNQztBQXRERCw2QkFBNkI7QUFFN0IsK0JBQStCO0FBRS9CLHFEQUFzRTtBQUN0RSw0Q0FBc0Q7QUFDdEQsMEZBQXNHO0FBa0J0Rzs7R0FFRztBQUNJLEtBQUssVUFBVSxtQ0FBbUMsQ0FDdkQsaUJBQThDLEVBQzlDLEdBQVEsRUFDUiw0QkFBcUMsS0FBSztJQUUxQyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sbUJBQW1CLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDMUcsTUFBTSxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDbEUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtRQUM3QyxnQkFBZ0IsRUFBRSxvQkFBb0I7UUFDdEMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsU0FBUztLQUMvQyxDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsb0JBQW9CO1FBQ3BCLFlBQVk7S0FDYixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0ksS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxhQUEwQyxFQUMxQyxHQUFRLEVBQ1IsNEJBQXFDLEtBQUs7SUFFMUMsT0FBTyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFFRCxLQUFLLFVBQVUsd0JBQXdCLENBQ3JDLFNBQWlCLEVBQ2pCLEdBQVEsRUFDUiw0QkFBcUMsS0FBSztJQUUxQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsTUFBTSxvQ0FBbUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0lBQzFGLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzFCLENBQUM7QUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQzdCLGlCQUE4QyxFQUM5QyxHQUFRLEVBQ1IsZUFBK0I7SUFFL0IsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUMsaUJBQWlCO1FBQzFELENBQUMsQ0FBQyxJQUFJLHlEQUFzQixDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsaUJBQWlCLENBQUM7UUFDcEUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNkLE1BQU0sWUFBWSxHQUE2RCxFQUFFLENBQUM7SUFDbEYsS0FBSyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsNEJBQTRCLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUMvRSxlQUFlLENBQUMsaUJBQWlCLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FDbEQsRUFBRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLDRCQUE0QixDQUFDLEVBQUUsQ0FBQztZQUMzRCxTQUFTO1FBQ1gsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSx1QkFBdUIsQ0FDeEQsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLEdBQUcsQ0FDSixDQUFDO1FBRUYsWUFBWSxDQUFDLG9CQUFvQixDQUFDLEdBQUc7WUFDbkMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsZ0JBQWdCO1lBQ3ZELGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLGlCQUFpQjtZQUN6RCxZQUFZLEVBQUUsb0JBQW9CLENBQUMsaUJBQWlCO1lBQ3BELG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixDQUFDO1NBQzNGLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVELEtBQUssVUFBVSx1QkFBdUIsQ0FDcEMsaUJBQThDLEVBQzlDLHVCQUErQixFQUMvQixvQkFBNEIsRUFDNUIsa0JBQWtELEVBQ2xELEdBQVE7SUFFUixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBRXBHLGdIQUFnSDtJQUNoSCxrSEFBa0g7SUFDbEgsbURBQW1EO0lBQ25ELE1BQU0sY0FBYyxHQUFHLE1BQU0saUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUN6RixNQUFNLGlCQUFpQixHQUFHLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsY0FBYyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRWxILE9BQU87UUFDTCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0UsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE1BQU0sd0JBQXdCLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDakcsaUJBQWlCO0tBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLGlCQUFpQixDQUM5QixvQkFBNEIsRUFDNUIsa0JBQXVDO0lBRXZDLElBQUksQ0FBQztRQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztRQUN0RSxPQUFPLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsS0FBSyxvQkFBb0IsQ0FBQyxFQUFFLGtCQUFrQixDQUFDO0lBQ3pHLENBQUM7SUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1FBQ2hCLElBQUksSUFBQSwwQkFBa0IsRUFBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFBLDBCQUFrQixFQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDNUcsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLENBQUMsQ0FBQztJQUNWLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxhQUFrQjtJQUNqRCxPQUFPLENBQ0wsYUFBYSxDQUFDLElBQUksS0FBSyw0QkFBNEI7UUFDbkQsYUFBYSxDQUFDLFFBQVE7UUFDdEIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUN6QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgdHlwZSB7IFNESyB9IGZyb20gJy4uL2F3cy1hdXRoJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2ssIHR5cGUgVGVtcGxhdGUgfSBmcm9tICcuL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IGZvcm1hdEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL3V0aWwvZXJyb3InO1xuaW1wb3J0IHsgTGF6eUxpc3RTdGFja1Jlc291cmNlcywgdHlwZSBMaXN0U3RhY2tSZXNvdXJjZXMgfSBmcm9tICcuLi9ldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmVzdGVkU3RhY2tUZW1wbGF0ZXMge1xuICByZWFkb25seSBwaHlzaWNhbE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZGVwbG95ZWRUZW1wbGF0ZTogVGVtcGxhdGU7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZFRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgcmVhZG9ubHkgbmVzdGVkU3RhY2tUZW1wbGF0ZXM6IHtcbiAgICBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3Mge1xuICByZWFkb25seSBkZXBsb3llZFJvb3RUZW1wbGF0ZTogVGVtcGxhdGU7XG4gIHJlYWRvbmx5IG5lc3RlZFN0YWNrczoge1xuICAgIFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXM7XG4gIH07XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGN1cnJlbnRseSBkZXBsb3llZCB0ZW1wbGF0ZSBhbmQgYWxsIG9mIGl0cyBuZXN0ZWQgc3RhY2sgdGVtcGxhdGVzIGZyb20gQ2xvdWRGb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyhcbiAgcm9vdFN0YWNrQXJ0aWZhY3Q6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgc2RrOiBTREssXG4gIHJldHJpZXZlUHJvY2Vzc2VkVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbik6IFByb21pc2U8Um9vdFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcz4ge1xuICBjb25zdCBkZXBsb3llZFJvb3RUZW1wbGF0ZSA9IGF3YWl0IGxvYWRDdXJyZW50VGVtcGxhdGUocm9vdFN0YWNrQXJ0aWZhY3QsIHNkaywgcmV0cmlldmVQcm9jZXNzZWRUZW1wbGF0ZSk7XG4gIGNvbnN0IG5lc3RlZFN0YWNrcyA9IGF3YWl0IGxvYWROZXN0ZWRTdGFja3Mocm9vdFN0YWNrQXJ0aWZhY3QsIHNkaywge1xuICAgIGdlbmVyYXRlZFRlbXBsYXRlOiByb290U3RhY2tBcnRpZmFjdC50ZW1wbGF0ZSxcbiAgICBkZXBsb3llZFRlbXBsYXRlOiBkZXBsb3llZFJvb3RUZW1wbGF0ZSxcbiAgICBkZXBsb3llZFN0YWNrTmFtZTogcm9vdFN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGRlcGxveWVkUm9vdFRlbXBsYXRlLFxuICAgIG5lc3RlZFN0YWNrcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgZGVwbG95ZWQgdGVtcGxhdGUgZnJvbSBDbG91ZEZvcm1hdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIGBzdGFja0FydGlmYWN0YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDdXJyZW50VGVtcGxhdGUoXG4gIHN0YWNrQXJ0aWZhY3Q6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgc2RrOiBTREssXG4gIHJldHJpZXZlUHJvY2Vzc2VkVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbik6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgcmV0dXJuIGxvYWRDdXJyZW50U3RhY2tUZW1wbGF0ZShzdGFja0FydGlmYWN0LnN0YWNrTmFtZSwgc2RrLCByZXRyaWV2ZVByb2Nlc3NlZFRlbXBsYXRlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEN1cnJlbnRTdGFja1RlbXBsYXRlKFxuICBzdGFja05hbWU6IHN0cmluZyxcbiAgc2RrOiBTREssXG4gIHJldHJpZXZlUHJvY2Vzc2VkVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbik6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgY29uc3QgY2ZuID0gc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gIGNvbnN0IHN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoY2ZuLCBzdGFja05hbWUsIHJldHJpZXZlUHJvY2Vzc2VkVGVtcGxhdGUpO1xuICByZXR1cm4gc3RhY2sudGVtcGxhdGUoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZE5lc3RlZFN0YWNrcyhcbiAgcm9vdFN0YWNrQXJ0aWZhY3Q6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgc2RrOiBTREssXG4gIHBhcmVudFRlbXBsYXRlczogU3RhY2tUZW1wbGF0ZXMsXG4pOiBQcm9taXNlPHsgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcyB9PiB7XG4gIGNvbnN0IGxpc3RTdGFja1Jlc291cmNlcyA9IHBhcmVudFRlbXBsYXRlcy5kZXBsb3llZFN0YWNrTmFtZVxuICAgID8gbmV3IExhenlMaXN0U3RhY2tSZXNvdXJjZXMoc2RrLCBwYXJlbnRUZW1wbGF0ZXMuZGVwbG95ZWRTdGFja05hbWUpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG5lc3RlZFN0YWNrczogeyBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzIH0gPSB7fTtcbiAgZm9yIChjb25zdCBbbmVzdGVkU3RhY2tMb2dpY2FsSWQsIGdlbmVyYXRlZE5lc3RlZFN0YWNrUmVzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIHBhcmVudFRlbXBsYXRlcy5nZW5lcmF0ZWRUZW1wbGF0ZS5SZXNvdXJjZXMgPz8ge30sXG4gICkpIHtcbiAgICBpZiAoIWlzQ2RrTWFuYWdlZE5lc3RlZFN0YWNrKGdlbmVyYXRlZE5lc3RlZFN0YWNrUmVzb3VyY2UpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhc3NldFBhdGggPSBnZW5lcmF0ZWROZXN0ZWRTdGFja1Jlc291cmNlLk1ldGFkYXRhWydhd3M6YXNzZXQ6cGF0aCddO1xuICAgIGNvbnN0IG5lc3RlZFN0YWNrVGVtcGxhdGVzID0gYXdhaXQgZ2V0TmVzdGVkU3RhY2tUZW1wbGF0ZXMoXG4gICAgICByb290U3RhY2tBcnRpZmFjdCxcbiAgICAgIGFzc2V0UGF0aCxcbiAgICAgIG5lc3RlZFN0YWNrTG9naWNhbElkLFxuICAgICAgbGlzdFN0YWNrUmVzb3VyY2VzLFxuICAgICAgc2RrLFxuICAgICk7XG5cbiAgICBuZXN0ZWRTdGFja3NbbmVzdGVkU3RhY2tMb2dpY2FsSWRdID0ge1xuICAgICAgZGVwbG95ZWRUZW1wbGF0ZTogbmVzdGVkU3RhY2tUZW1wbGF0ZXMuZGVwbG95ZWRUZW1wbGF0ZSxcbiAgICAgIGdlbmVyYXRlZFRlbXBsYXRlOiBuZXN0ZWRTdGFja1RlbXBsYXRlcy5nZW5lcmF0ZWRUZW1wbGF0ZSxcbiAgICAgIHBoeXNpY2FsTmFtZTogbmVzdGVkU3RhY2tUZW1wbGF0ZXMuZGVwbG95ZWRTdGFja05hbWUsXG4gICAgICBuZXN0ZWRTdGFja1RlbXBsYXRlczogYXdhaXQgbG9hZE5lc3RlZFN0YWNrcyhyb290U3RhY2tBcnRpZmFjdCwgc2RrLCBuZXN0ZWRTdGFja1RlbXBsYXRlcyksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBuZXN0ZWRTdGFja3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5lc3RlZFN0YWNrVGVtcGxhdGVzKFxuICByb290U3RhY2tBcnRpZmFjdDogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICBuZXN0ZWRUZW1wbGF0ZUFzc2V0UGF0aDogc3RyaW5nLFxuICBuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nLFxuICBsaXN0U3RhY2tSZXNvdXJjZXM6IExpc3RTdGFja1Jlc291cmNlcyB8IHVuZGVmaW5lZCxcbiAgc2RrOiBTREssXG4pOiBQcm9taXNlPFN0YWNrVGVtcGxhdGVzPiB7XG4gIGNvbnN0IG5lc3RlZFRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihyb290U3RhY2tBcnRpZmFjdC5hc3NlbWJseS5kaXJlY3RvcnksIG5lc3RlZFRlbXBsYXRlQXNzZXRQYXRoKTtcblxuICAvLyBDRk4gZ2VuZXJhdGVzIHRoZSBuZXN0ZWQgc3RhY2sgbmFtZSBpbiB0aGUgZm9ybSBgUGFyZW50U3RhY2tOYW1lLU5lc3RlZFN0YWNrTG9naWNhbElELVNvbWVIYXNoV2VDYW4ndENvbXB1dGUsXG4gIC8vIHRoZSBhcm4gaXMgb2YgdGhlIGZvcm06IGFybjphd3M6Y2xvdWRmb3JtYXRpb246cmVnaW9uOjEyMzQ1Njc4OTAxMjpzdGFjay9OZXN0ZWRTdGFja05hbWUvQW5vdGhlckhhc2hXZURvbid0TmVlZFxuICAvLyBzbyB3ZSBnZXQgdGhlIEFSTiBhbmQgbWFudWFsbHkgZXh0cmFjdCB0aGUgbmFtZS5cbiAgY29uc3QgbmVzdGVkU3RhY2tBcm4gPSBhd2FpdCBnZXROZXN0ZWRTdGFja0FybihuZXN0ZWRTdGFja0xvZ2ljYWxJZCwgbGlzdFN0YWNrUmVzb3VyY2VzKTtcbiAgY29uc3QgZGVwbG95ZWRTdGFja05hbWUgPSBuZXN0ZWRTdGFja0Fybj8uc2xpY2UobmVzdGVkU3RhY2tBcm4uaW5kZXhPZignLycpICsgMSwgbmVzdGVkU3RhY2tBcm4ubGFzdEluZGV4T2YoJy8nKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZWRUZW1wbGF0ZTogSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobmVzdGVkVGVtcGxhdGVQYXRoLCAndXRmLTgnKSksXG4gICAgZGVwbG95ZWRUZW1wbGF0ZTogZGVwbG95ZWRTdGFja05hbWUgPyBhd2FpdCBsb2FkQ3VycmVudFN0YWNrVGVtcGxhdGUoZGVwbG95ZWRTdGFja05hbWUsIHNkaykgOiB7fSxcbiAgICBkZXBsb3llZFN0YWNrTmFtZSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TmVzdGVkU3RhY2tBcm4oXG4gIG5lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmcsXG4gIGxpc3RTdGFja1Jlc291cmNlcz86IExpc3RTdGFja1Jlc291cmNlcyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhY2tSZXNvdXJjZXMgPSBhd2FpdCBsaXN0U3RhY2tSZXNvdXJjZXM/Lmxpc3RTdGFja1Jlc291cmNlcygpO1xuICAgIHJldHVybiBzdGFja1Jlc291cmNlcz8uZmluZCgoc3IpID0+IHNyLkxvZ2ljYWxSZXNvdXJjZUlkID09PSBuZXN0ZWRTdGFja0xvZ2ljYWxJZCk/LlBoeXNpY2FsUmVzb3VyY2VJZDtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgaWYgKGZvcm1hdEVycm9yTWVzc2FnZShlKS5zdGFydHNXaXRoKCdTdGFjayB3aXRoIGlkICcpICYmIGZvcm1hdEVycm9yTWVzc2FnZShlKS5lbmRzV2l0aCgnIGRvZXMgbm90IGV4aXN0JykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0Nka01hbmFnZWROZXN0ZWRTdGFjayhzdGFja1Jlc291cmNlOiBhbnkpOiBzdGFja1Jlc291cmNlIGlzIE5lc3RlZFN0YWNrUmVzb3VyY2Uge1xuICByZXR1cm4gKFxuICAgIHN0YWNrUmVzb3VyY2UuVHlwZSA9PT0gJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyAmJlxuICAgIHN0YWNrUmVzb3VyY2UuTWV0YWRhdGEgJiZcbiAgICBzdGFja1Jlc291cmNlLk1ldGFkYXRhWydhd3M6YXNzZXQ6cGF0aCddXG4gICk7XG59XG5cbmludGVyZmFjZSBTdGFja1RlbXBsYXRlcyB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZFRlbXBsYXRlOiBhbnk7XG4gIHJlYWRvbmx5IGRlcGxveWVkVGVtcGxhdGU6IGFueTtcbiAgcmVhZG9ubHkgZGVwbG95ZWRTdGFja05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIE5lc3RlZFN0YWNrUmVzb3VyY2Uge1xuICByZWFkb25seSBNZXRhZGF0YTogeyAnYXdzOmFzc2V0OnBhdGgnOiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgUHJvcGVydGllczogYW55O1xufVxuIl19