cdk-iot-greengrass-fleet-provisioning
Version:
CDK Construct for AWS IoT Greengrass Fleet Provisioning (with AWS IoT Certificates)
186 lines • 23.7 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createResource = createResource;
exports.deleteResource = deleteResource;
const client_iot_1 = require("@aws-sdk/client-iot");
const client_s3_1 = require("@aws-sdk/client-s3");
const client_ssm_1 = require("@aws-sdk/client-ssm");
__exportStar(require("./types"), exports);
__exportStar(require("./iot"), exports);
__exportStar(require("./s3"), exports);
__exportStar(require("./ssm"), exports);
const iot_1 = require("./iot");
const s3_1 = require("./s3");
const ssm_1 = require("./ssm");
const iotClient = (0, iot_1.IoTClientAdapter)(new client_iot_1.IoTClient());
const ssmClient = (0, ssm_1.SSMClientAdapter)(new client_ssm_1.SSMClient());
const s3Client = (0, s3_1.S3ClientAdapter)(new client_s3_1.S3Client());
async function createResource(resource) {
const { certificateId, certificateArn, certificatePem, keyPair } = await iotClient.createKeysAndCertificate();
console.log(`Iot Certificate - Created Certificate with Id ${certificateId}`);
const pathCertificate = `${resource.CertificatePrefix}/${certificateId}`;
const pathCertificatePem = `${pathCertificate}.pem`;
const pathCertificatePrivateKey = `${pathCertificate}.key.prv`;
const pathCertificatePublicKey = `${pathCertificate}.key.pub`;
const pathCertificateRoot = `${pathCertificate}.root`;
const response = await fetch('https://www.amazontrust.com/repository/AmazonRootCA1.pem');
const buffer = await response.arrayBuffer();
const certificateRootCA = Buffer.from(buffer).toString();
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificate}`,
Body: certificateId,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificate}.arn`,
Body: certificateArn,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePem}`,
Body: certificatePem,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePrivateKey}`,
Body: keyPair?.PrivateKey,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePublicKey}`,
Body: keyPair?.PublicKey,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificateRoot}`,
Body: certificateRootCA,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/certificateId`,
Value: `${certificateId}`,
Type: 'String',
Overwrite: true,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/pem`,
Value: `${certificatePem}`,
Type: 'String',
Overwrite: true,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/key-private`,
Value: `${keyPair.PrivateKey}`,
Type: 'String',
Overwrite: true,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/key-public`,
Value: `${keyPair.PublicKey}`,
Type: 'String',
Overwrite: true,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/root-ca`,
Value: `${certificateRootCA}`,
Type: 'String',
Overwrite: true,
});
const credentialEndpointAddress = await iotClient.describeEndpoint({
endpointType: 'iot:CredentialProvider',
});
const dataEndpointAddress = await iotClient.describeEndpoint({
endpointType: 'iot:Data-ATS',
});
;
return {
certificateId: certificateId,
certificateArn: certificateArn,
credentialEndpointAddress: credentialEndpointAddress.endpointAddress,
dataEndpointAddress: dataEndpointAddress.endpointAddress,
// s3CertificatePem: `s3://${resource.CertificateBucketName}/${pathCertificatePem}`,
// s3CertificatePrivateKey: `s3://${resource.CertificateBucketName}/${pathCertificatePrivateKey}`,
// s3CertificatePublicKey: `s3://${resource.CertificateBucketName}/${pathCertificatePublicKey}`,
// s3CertificateRoot: `s3://${resource.CertificateBucketName}/${pathCertificateRoot}`,
// ssmParamCertificateId: `/${resource.ResourcePrefix}/certificateId`,
// ssmParamCertificatePem: `/${resource.ResourcePrefix}/${certificateId}/pem`,
// ssmParamCertificatePrivateKey: `/${resource.ResourcePrefix}/${certificateId}/key-private`,
// ssmParamCertificatePublicKey: `/${resource.ResourcePrefix}/${certificateId}/key-public`,
// ssmParamCertificateRoot: `/${resource.ResourcePrefix}/${certificateId}/root-ca`,
};
}
async function deleteResource(resource, certificateId) {
const pathCertificate = `${resource.CertificatePrefix}/${certificateId}`;
const pathCertificatePem = `${pathCertificate}.pem`;
const pathCertificatePrivateKey = `${pathCertificate}.key.prv`;
const pathCertificatePublicKey = `${pathCertificate}.key.pub`;
const pathCertificateRoot = `${pathCertificate}.root`;
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificate}`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificate}.arn`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePem}`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePrivateKey}`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePublicKey}`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificateRoot}`,
});
// delete if it's the current one
const ssmParamCertificateId = await ssmClient.getParameter({
Name: `/${resource.ResourcePrefix}/certificateId`,
});
if (ssmParamCertificateId.Parameter?.Value === certificateId) {
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/certificateId`,
});
}
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/pem`,
});
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/key-private`,
});
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/key-public`,
});
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/root-ca`,
});
await iotClient.updateCertificate({
certificateId: certificateId,
newStatus: 'INACTIVE',
});
await iotClient.deleteCertificate({
certificateId: certificateId,
});
return {};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ3JlZW5ncmFzcy1mbGVldC1wcm92aXNpb25pbmcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSx3Q0FvR0M7QUFFRCx3Q0FpRUM7QUE5TEQsb0RBQWdEO0FBQ2hELGtEQUE4QztBQUM5QyxvREFBZ0Q7QUFFaEQsMENBQXdCO0FBQ3hCLHdDQUFzQjtBQUN0Qix1Q0FBcUI7QUFDckIsd0NBQXNCO0FBRXRCLCtCQUF5QztBQUN6Qyw2QkFBdUM7QUFDdkMsK0JBQXlDO0FBUXpDLE1BQU0sU0FBUyxHQUFHLElBQUEsc0JBQWdCLEVBQUMsSUFBSSxzQkFBUyxFQUFFLENBQUMsQ0FBQztBQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFBLHNCQUFnQixFQUFDLElBQUksc0JBQVMsRUFBRSxDQUFDLENBQUM7QUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBQSxvQkFBZSxFQUFDLElBQUksb0JBQVEsRUFBRSxDQUFDLENBQUM7QUFFMUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxRQUE0QjtJQUMvRCxNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUM5RyxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBRTlFLE1BQU0sZUFBZSxHQUFXLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQ2pGLE1BQU0sa0JBQWtCLEdBQVcsR0FBRyxlQUFlLE1BQU0sQ0FBQztJQUM1RCxNQUFNLHlCQUF5QixHQUFXLEdBQUcsZUFBZSxVQUFVLENBQUM7SUFDdkUsTUFBTSx3QkFBd0IsR0FBVyxHQUFHLGVBQWUsVUFBVSxDQUFDO0lBQ3RFLE1BQU0sbUJBQW1CLEdBQVcsR0FBRyxlQUFlLE9B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QUFhLE1BQU07S0FDekQsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLENBQUMsZUFBZSxDQUFDO1FBQzlCLElBQUksRUFBRSxJQUFJLFFBQVEsQ0FBQyxjQUFjLElBQUksYUFBYSxjQUFjO0tBQ2pFLENBQUMsQ0FBQztJQUNILE1BQU0sU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUM5QixJQUFJLEVBQUUsSUFBSSxRQUFRLENBQUMsY0FBYyxJQUFJLGFBQWEsYUFBYTtLQUNoRSxDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsQ0FBQyxlQUFlLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUksUUFBUSxDQUFDLGNBQWMsSUFBSSxhQUFhLFVBQVU7S0FDN0QsQ0FBQyxDQUFDO0lBRUgsTUFBTSxTQUFTLENBQUMsaUJBQWlCLENBQUM7UUFDaEMsYUFBYSxFQUFFLGFBQWE7UUFDNUIsU0FBUyxFQUFFLFVBQVU7S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLENBQUMsaUJBQWlCLENBQUM7UUFDaEMsYUFBYSxFQUFFLGFBQWE7S0FDN0IsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUNOLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW9UQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWlvdCc7XG5pbXBvcnQgeyBTM0NsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG5pbXBvcnQgeyBTU01DbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc3NtJztcblxuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2lvdCc7XG5leHBvcnQgKiBmcm9tICcuL3MzJztcbmV4cG9ydCAqIGZyb20gJy4vc3NtJztcblxuaW1wb3J0IHsgSW9UQ2xpZW50QWRhcHRlciB9IGZyb20gJy4vaW90JztcbmltcG9ydCB7IFMzQ2xpZW50QWRhcHRlciB9IGZyb20gJy4vczMnO1xuaW1wb3J0IHsgU1NNQ2xpZW50QWRhcHRlciB9IGZyb20gJy4vc3NtJztcblxuaW1wb3J0IHtcbiAgQ3JlYXRlUmVzb3VyY2VzUmVzcG9uc2UsXG4gIERlbGV0ZVJlc291cmNlc1Jlc3BvbnNlLFxuICBSZXNvdXJjZVByb3BlcnRpZXMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBpb3RDbGllbnQgPSBJb1RDbGllbnRBZGFwdGVyKG5ldyBJb1RDbGllbnQoKSk7XG5jb25zdCBzc21DbGllbnQgPSBTU01DbGllbnRBZGFwdGVyKG5ldyBTU01DbGllbnQoKSk7XG5jb25zdCBzM0NsaWVudCA9IFMzQ2xpZW50QWRhcHRlcihuZXcgUzNDbGllbnQoKSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZTogUmVzb3VyY2VQcm9wZXJ0aWVzKTogUHJvbWlzZTxDcmVhdGVSZXNvdXJjZXNSZXNwb25zZT4ge1xuICBjb25zdCB7IGNlcnRpZmljYXRlSWQsIGNlcnRpZmljYXRlQXJuLCBjZXJ0aWZpY2F0ZVBlbSwga2V5UGFpciB9ID0gYXdhaXQgaW90Q2xpZW50LmNyZWF0ZUtleXNBbmRDZXJ0aWZpY2F0ZSgpO1xuICBjb25zb2xlLmxvZyhgSW90IENlcnRpZmljYXRlIC0gQ3JlYXRlZCBDZXJ0aWZpY2F0ZSB3aXRoIElkICR7Y2VydGlmaWNhdGVJZH1gKTtcblxuICBjb25zdCBwYXRoQ2VydGlmaWNhdGU6IHN0cmluZyA9IGAke3Jlc291cmNlLkNlcnRpZmljYXRlUHJlZml4fS8ke2NlcnRpZmljYXRlSWR9YDtcbiAgY29uc3QgcGF0aENlcnRpZmljYXRlUGVtOiBzdHJpbmcgPSBgJHtwYXRoQ2VydGlmaWNhdGV9LnBlbWA7XG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZVByaXZhdGVLZXk6IHN0cmluZyA9IGAke3BhdGhDZXJ0aWZpY2F0ZX0ua2V5LnBydmA7XG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZVB1YmxpY0tleTogc3RyaW5nID0gYCR7cGF0aENlcnRpZmljYXRlfS5rZXkucHViYDtcbiAgY29uc3QgcGF0aENlcnRpZmljYXRlUm9vdDogc3RyaW5nID0gYCR7cGF0aENlcnRpZmljYXRlfS5yb290YDtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL3d3dy5hbWF6b250cnVzdC5jb20vcmVwb3NpdG9yeS9BbWF6b25Sb290Q0ExLnBlbScpO1xuICBjb25zdCBidWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICBjb25zdCBjZXJ0aWZpY2F0ZVJvb3RDQTogc3RyaW5nID0gQnVmZmVyLmZyb20oYnVmZmVyKS50b1N0cmluZygpO1xuXG4gIGF3YWl0IHMzQ2xpZW50LnB1dE9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGV9YCxcbiAgICBCb2R5OiBjZXJ0aWZpY2F0ZUlkLFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQucHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZX0uYXJuYCxcbiAgICBCb2R5OiBjZXJ0aWZpY2F0ZUFybixcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LnB1dE9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVQZW19YCxcbiAgICBCb2R5OiBjZXJ0aWZpY2F0ZVBlbSxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LnB1dE9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVQcml2YXRlS2V5fWAsXG4gICAgQm9keToga2V5UGFpcj8uUHJpdmF0ZUtleSxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LnB1dE9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVQdWJsaWNLZXl9YCxcbiAgICBCb2R5OiBrZXlQYWlyPy5QdWJsaWNLZXksXG4gIH0pO1xuICBhd2FpdCBzM0NsaWVudC5wdXRPYmplY3Qoe1xuICAgIEJ1Y2tldDogcmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lLFxuICAgIEtleTogYCR7cGF0aENlcnRpZmljYXRlUm9vdH1gLFxuICAgIEJvZHk6IGNlcnRpZmljYXRlUm9vdENBLFxuICB9KTtcblxuICBhd2FpdCBzc21DbGllbnQucHV0UGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9L2NlcnRpZmljYXRlSWRgLFxuICAgIFZhbHVlOiBgJHtjZXJ0aWZpY2F0ZUlkfWAsXG4gICAgVHlwZTogJ1N0cmluZycsXG4gICAgT3ZlcndyaXRlOiB0cnVlLFxuICB9KTtcbiAgYXdhaXQgc3NtQ2xpZW50LnB1dFBhcmFtZXRlcih7XG4gICAgTmFtZTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS8ke2NlcnRpZmljYXRlSWR9L3BlbWAsXG4gICAgVmFsdWU6IGAke2NlcnRpZmljYXRlUGVtfWAsXG4gICAgVHlwZTogJ1N0cmluZycsXG4gICAgT3ZlcndyaXRlOiB0cnVlLFxuICB9KTtcbiAgYXdhaXQgc3NtQ2xpZW50LnB1dFBhcmFtZXRlcih7XG4gICAgTmFtZTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS8ke2NlcnRpZmljYXRlSWR9L2tleS1wcml2YXRlYCxcbiAgICBWYWx1ZTogYCR7a2V5UGFpciEuUHJpdmF0ZUtleSF9YCxcbiAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICBPdmVyd3JpdGU6IHRydWUsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQucHV0UGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0va2V5LXB1YmxpY2AsXG4gICAgVmFsdWU6IGAke2tleVBhaXIhLlB1YmxpY0tleSF9YCxcbiAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICBPdmVyd3JpdGU6IHRydWUsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQucHV0UGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcm9vdC1jYWAsXG4gICAgVmFsdWU6IGAke2NlcnRpZmljYXRlUm9vdENBfWAsXG4gICAgVHlwZTogJ1N0cmluZycsXG4gICAgT3ZlcndyaXRlOiB0cnVlLFxuICB9KTtcblxuICBjb25zdCBjcmVkZW50aWFsRW5kcG9pbnRBZGRyZXNzID0gYXdhaXQgaW90Q2xpZW50LmRlc2NyaWJlRW5kcG9pbnQoe1xuICAgIGVuZHBvaW50VHlwZTogJ2lvdDpDcmVkZW50aWFsUHJvdmlkZXInLFxuICB9KTtcbiAgY29uc3QgZGF0YUVuZHBvaW50QWRkcmVzcyA9IGF3YWl0IGlvdENsaWVudC5kZXNjcmliZUVuZHBvaW50KHtcbiAgICBlbmRwb2ludFR5cGU6ICdpb3Q6RGF0YS1BVFMnLFxuICB9KTs7XG5cbiAgcmV0dXJuIHtcbiAgICBjZXJ0aWZpY2F0ZUlkOiBjZXJ0aWZpY2F0ZUlkISxcbiAgICBjZXJ0aWZpY2F0ZUFybjogY2VydGlmaWNhdGVBcm4hLFxuICAgIGNyZWRlbnRpYWxFbmRwb2ludEFkZHJlc3M6IGNyZWRlbnRpYWxFbmRwb2ludEFkZHJlc3MuZW5kcG9pbnRBZGRyZXNzISxcbiAgICBkYXRhRW5kcG9pbnRBZGRyZXNzOiBkYXRhRW5kcG9pbnRBZGRyZXNzLmVuZHBvaW50QWRkcmVzcyEsXG5cbiAgICAvLyBzM0NlcnRpZmljYXRlUGVtOiBgczM6Ly8ke3Jlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZX0vJHtwYXRoQ2VydGlmaWNhdGVQZW19YCxcbiAgICAvLyBzM0NlcnRpZmljYXRlUHJpdmF0ZUtleTogYHMzOi8vJHtyZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWV9LyR7cGF0aENlcnRpZmljYXRlUHJpdmF0ZUtleX1gLFxuICAgIC8vIHMzQ2VydGlmaWNhdGVQdWJsaWNLZXk6IGBzMzovLyR7cmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lfS8ke3BhdGhDZXJ0aWZpY2F0ZVB1YmxpY0tleX1gLFxuICAgIC8vIHMzQ2VydGlmaWNhdGVSb290OiBgczM6Ly8ke3Jlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZX0vJHtwYXRoQ2VydGlmaWNhdGVSb290fWAsXG5cbiAgICAvLyBzc21QYXJhbUNlcnRpZmljYXRlSWQ6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vY2VydGlmaWNhdGVJZGAsXG4gICAgLy8gc3NtUGFyYW1DZXJ0aWZpY2F0ZVBlbTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS8ke2NlcnRpZmljYXRlSWR9L3BlbWAsXG4gICAgLy8gc3NtUGFyYW1DZXJ0aWZpY2F0ZVByaXZhdGVLZXk6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9rZXktcHJpdmF0ZWAsXG4gICAgLy8gc3NtUGFyYW1DZXJ0aWZpY2F0ZVB1YmxpY0tleTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS8ke2NlcnRpZmljYXRlSWR9L2tleS1wdWJsaWNgLFxuICAgIC8vIHNzbVBhcmFtQ2VydGlmaWNhdGVSb290OiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcm9vdC1jYWAsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVSZXNvdXJjZShyZXNvdXJjZTogUmVzb3VyY2VQcm9wZXJ0aWVzLCBjZXJ0aWZpY2F0ZUlkOiBzdHJpbmcpOiBQcm9taXNlPERlbGV0ZVJlc291cmNlc1Jlc3BvbnNlPiB7XG5cbiAgY29uc3QgcGF0aENlcnRpZmljYXRlOiBzdHJpbmcgPSBgJHtyZXNvdXJjZS5DZXJ0aWZpY2F0ZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfWA7XG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZVBlbTogc3RyaW5nID0gYCR7cGF0aENlcnRpZmljYXRlfS5wZW1gO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVQcml2YXRlS2V5OiBzdHJpbmcgPSBgJHtwYXRoQ2VydGlmaWNhdGV9LmtleS5wcnZgO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVQdWJsaWNLZXk6IHN0cmluZyA9IGAke3BhdGhDZXJ0aWZpY2F0ZX0ua2V5LnB1YmA7XG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZVJvb3Q6IHN0cmluZyA9IGAke3BhdGhDZXJ0aWZpY2F0ZX0ucm9vdGA7XG5cbiAgYXdhaXQgczNDbGllbnQuZGVsZXRlT2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZX1gLFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQuZGVsZXRlT2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZX0uYXJuYCxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LmRlbGV0ZU9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVQZW19YCxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LmRlbGV0ZU9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVQcml2YXRlS2V5fWAsXG4gIH0pO1xuICBhd2FpdCBzM0NsaWVudC5kZWxldGVPYmplY3Qoe1xuICAgIEJ1Y2tldDogcmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lLFxuICAgIEtleTogYCR7cGF0aENlcnRpZmljYXRlUHVibGljS2V5fWAsXG4gIH0pO1xuICBhd2FpdCBzM0NsaWVudC5kZWxldGVPYmplY3Qoe1xuICAgIEJ1Y2tldDogcmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lLFxuICAgIEtleTogYCR7cGF0aENlcnRpZmljYXRlUm9vdH1gLFxuICB9KTtcblxuICAvLyBkZWxldGUgaWYgaXQncyB0aGUgY3VycmVudCBvbmVcbiAgY29uc3Qgc3NtUGFyYW1DZXJ0aWZpY2F0ZUlkID0gYXdhaXQgc3NtQ2xpZW50LmdldFBhcmFtZXRlcih7XG4gICAgTmFtZTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS9jZXJ0aWZpY2F0ZUlkYCxcbiAgfSk7XG4gIGlmIChzc21QYXJhbUNlcnRpZmljYXRlSWQuUGFyYW1ldGVyPy5WYWx1ZSA9PT0gY2VydGlmaWNhdGVJZCkge1xuICAgIGF3YWl0IHNzbUNsaWVudC5kZWxldGVQYXJhbWV0ZXIoe1xuICAgICAgTmFtZTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS9jZXJ0aWZpY2F0ZUlkYCxcbiAgICB9KTtcbiAgfVxuICBhd2FpdCBzc21DbGllbnQuZGVsZXRlUGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcGVtYCxcbiAgfSk7XG4gIGF3YWl0IHNzbUNsaWVudC5kZWxldGVQYXJhbWV0ZXIoe1xuICAgIE5hbWU6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9rZXktcHJpdmF0ZWAsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQuZGVsZXRlUGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0va2V5LXB1YmxpY2AsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQuZGVsZXRlUGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcm9vdC1jYWAsXG4gIH0pO1xuXG4gIGF3YWl0IGlvdENsaWVudC51cGRhdGVDZXJ0aWZpY2F0ZSh7XG4gICAgY2VydGlmaWNhdGVJZDogY2VydGlmaWNhdGVJZCxcbiAgICBuZXdTdGF0dXM6ICdJTkFDVElWRScsXG4gIH0pO1xuICBhd2FpdCBpb3RDbGllbnQuZGVsZXRlQ2VydGlmaWNhdGUoe1xuICAgIGNlcnRpZmljYXRlSWQ6IGNlcnRpZmljYXRlSWQsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gIH07XG59XG4iXX0=