UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

532 lines 73.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.exec = exec; exports.cli = cli; const cxapi = require("@aws-cdk/cx-api"); require("@jsii/check-node/run"); const chalk = require("chalk"); const cdk_toolkit_1 = require("./cdk-toolkit"); const parse_command_line_arguments_1 = require("./parse-command-line-arguments"); const platform_warnings_1 = require("./platform-warnings"); const version = require("./version"); const aws_auth_1 = require("../api/aws-auth"); const sdk_logger_1 = require("../api/aws-auth/sdk-logger"); const bootstrap_1 = require("../api/bootstrap"); const cloud_executable_1 = require("../api/cxapp/cloud-executable"); const exec_1 = require("../api/cxapp/exec"); const deployments_1 = require("../api/deployments"); const common_1 = require("../api/hotswap/common"); const plugin_1 = require("../api/plugin"); const toolkit_info_1 = require("../api/toolkit-info"); const context_1 = require("../commands/context"); const docs_1 = require("../commands/docs"); const doctor_1 = require("../commands/doctor"); const migrate_1 = require("../commands/migrate"); const init_1 = require("../init"); const logging_1 = require("../logging"); const notices_1 = require("../notices"); const user_configuration_1 = require("./user-configuration"); const cli_io_host_1 = require("../toolkit/cli-io-host"); const error_1 = require("../toolkit/error"); const tracing_1 = require("../util/tracing"); /* eslint-disable max-len */ /* eslint-disable @typescript-eslint/no-shadow */ // yargs if (!process.stdout.isTTY) { // Disable chalk color highlighting process.env.FORCE_COLOR = '0'; } async function exec(args, synthesizer) { const argv = await (0, parse_command_line_arguments_1.parseCommandLineArguments)(args); const cmd = argv._[0]; // if one -v, log at a DEBUG level // if 2 -v, log at a TRACE level let ioMessageLevel = 'info'; if (argv.verbose) { switch (argv.verbose) { case 1: ioMessageLevel = 'debug'; break; case 2: default: ioMessageLevel = 'trace'; break; } } const ioHost = cli_io_host_1.CliIoHost.instance({ logLevel: ioMessageLevel, isTTY: process.stdout.isTTY, isCI: Boolean(argv.ci), currentAction: cmd, }, true); // Debug should always imply tracing if (argv.debug || argv.verbose > 2) { (0, tracing_1.enableTracing)(true); } try { await (0, platform_warnings_1.checkForPlatformWarnings)(); } catch (e) { (0, logging_1.debug)(`Error while checking for platform warnings: ${e}`); } (0, logging_1.debug)('CDK toolkit version:', version.DISPLAY_VERSION); (0, logging_1.debug)('Command line arguments:', argv); const configuration = new user_configuration_1.Configuration({ commandLineArguments: { ...argv, _: argv._, // TypeScript at its best }, }); await configuration.load(); const notices = notices_1.Notices.create({ context: configuration.context, output: configuration.settings.get(['outdir']), shouldDisplay: configuration.settings.get(['notices']), includeAcknowledged: cmd === 'notices' ? !argv.unacknowledged : false, httpOptions: { proxyAddress: configuration.settings.get(['proxy']), caBundlePath: configuration.settings.get(['caBundlePath']), }, }); await notices.refresh(); const sdkProvider = await aws_auth_1.SdkProvider.withAwsCliCompatibleDefaults({ profile: configuration.settings.get(['profile']), httpOptions: { proxyAddress: argv.proxy, caBundlePath: argv['ca-bundle-path'], }, logger: new sdk_logger_1.SdkToCliLogger(), }); let outDirLock; const cloudExecutable = new cloud_executable_1.CloudExecutable({ configuration, sdkProvider, synthesizer: synthesizer ?? (async (aws, config) => { // Invoke 'execProgram', and copy the lock for the directory in the global // variable here. It will be released when the CLI exits. Locks are not re-entrant // so release it if we have to synthesize more than once (because of context lookups). await outDirLock?.release(); const { assembly, lock } = await (0, exec_1.execProgram)(aws, config); outDirLock = lock; return assembly; }), }); /** Function to load plug-ins, using configurations additively. */ function loadPlugins(...settings) { const loaded = new Set(); for (const source of settings) { const plugins = source.get(['plugin']) || []; for (const plugin of plugins) { const resolved = tryResolve(plugin); if (loaded.has(resolved)) { continue; } (0, logging_1.debug)(`Loading plug-in: ${chalk.green(plugin)} from ${chalk.blue(resolved)}`); plugin_1.PluginHost.instance.load(plugin); loaded.add(resolved); } } function tryResolve(plugin) { try { return require.resolve(plugin); } catch (e) { (0, logging_1.error)(`Unable to resolve plugin ${chalk.green(plugin)}: ${e.stack}`); throw new error_1.ToolkitError(`Unable to resolve plug-in: ${plugin}`); } } } loadPlugins(configuration.settings); if (typeof (cmd) !== 'string') { throw new error_1.ToolkitError(`First argument should be a string. Got: ${cmd} (${typeof (cmd)})`); } try { return await main(cmd, argv); } finally { // If we locked the 'cdk.out' directory, release it here. await outDirLock?.release(); // Do PSAs here await version.displayVersionMessage(); if (cmd === 'notices') { await notices.refresh({ force: true }); notices.display({ showTotal: argv.unacknowledged }); } else if (cmd !== 'version') { await notices.refresh(); notices.display(); } } async function main(command, args) { ioHost.currentAction = command; const toolkitStackName = toolkit_info_1.ToolkitInfo.determineName(configuration.settings.get(['toolkitStackName'])); (0, logging_1.debug)(`Toolkit stack: ${chalk.bold(toolkitStackName)}`); const cloudFormation = new deployments_1.Deployments({ sdkProvider, toolkitStackName }); if (args.all && args.STACKS) { throw new error_1.ToolkitError('You must either specify a list of Stacks or the `--all` argument'); } args.STACKS = args.STACKS ?? (args.STACK ? [args.STACK] : []); args.ENVIRONMENTS = args.ENVIRONMENTS ?? []; const selector = { allTopLevel: args.all, patterns: args.STACKS, }; const cli = new cdk_toolkit_1.CdkToolkit({ cloudExecutable, deployments: cloudFormation, verbose: argv.trace || argv.verbose > 0, ignoreErrors: argv['ignore-errors'], strict: argv.strict, configuration, sdkProvider, }); switch (command) { case 'context': ioHost.currentAction = 'context'; return (0, context_1.contextHandler)({ context: configuration.context, clear: argv.clear, json: argv.json, force: argv.force, reset: argv.reset, }); case 'docs': case 'doc': ioHost.currentAction = 'docs'; return (0, docs_1.docs)({ browser: configuration.settings.get(['browser']) }); case 'doctor': ioHost.currentAction = 'doctor'; return (0, doctor_1.doctor)(); case 'ls': case 'list': ioHost.currentAction = 'list'; return cli.list(args.STACKS, { long: args.long, json: argv.json, showDeps: args.showDependencies, }); case 'diff': ioHost.currentAction = 'diff'; const enableDiffNoFail = isFeatureEnabled(configuration, cxapi.ENABLE_DIFF_NO_FAIL_CONTEXT); return cli.diff({ stackNames: args.STACKS, exclusively: args.exclusively, templatePath: args.template, strict: args.strict, contextLines: args.contextLines, securityOnly: args.securityOnly, fail: args.fail != null ? args.fail : !enableDiffNoFail, stream: args.ci ? process.stdout : undefined, compareAgainstProcessedTemplate: args.processed, quiet: args.quiet, changeSet: args['change-set'], toolkitStackName: toolkitStackName, }); case 'bootstrap': ioHost.currentAction = 'bootstrap'; const source = determineBootstrapVersion(args); if (args.showTemplate) { const bootstrapper = new bootstrap_1.Bootstrapper(source); return bootstrapper.showTemplate(args.json); } return cli.bootstrap(args.ENVIRONMENTS, { source, roleArn: args.roleArn, force: argv.force, toolkitStackName: toolkitStackName, execute: args.execute, tags: configuration.settings.get(['tags']), terminationProtection: args.terminationProtection, usePreviousParameters: args['previous-parameters'], parameters: { bucketName: configuration.settings.get(['toolkitBucket', 'bucketName']), kmsKeyId: configuration.settings.get(['toolkitBucket', 'kmsKeyId']), createCustomerMasterKey: args.bootstrapCustomerKey, qualifier: args.qualifier ?? configuration.context.get('@aws-cdk/core:bootstrapQualifier'), publicAccessBlockConfiguration: args.publicAccessBlockConfiguration, examplePermissionsBoundary: argv.examplePermissionsBoundary, customPermissionsBoundary: argv.customPermissionsBoundary, trustedAccounts: arrayFromYargs(args.trust), trustedAccountsForLookup: arrayFromYargs(args.trustForLookup), untrustedAccounts: arrayFromYargs(args.untrust), cloudFormationExecutionPolicies: arrayFromYargs(args.cloudformationExecutionPolicies), }, }); case 'deploy': ioHost.currentAction = 'deploy'; const parameterMap = {}; for (const parameter of args.parameters) { if (typeof parameter === 'string') { const keyValue = parameter.split('='); parameterMap[keyValue[0]] = keyValue.slice(1).join('='); } } if (args.execute !== undefined && args.method !== undefined) { throw new error_1.ToolkitError('Can not supply both --[no-]execute and --method at the same time'); } let deploymentMethod; switch (args.method) { case 'direct': if (args.changeSetName) { throw new error_1.ToolkitError('--change-set-name cannot be used with method=direct'); } if (args.importExistingResources) { throw new error_1.ToolkitError('--import-existing-resources cannot be enabled with method=direct'); } deploymentMethod = { method: 'direct' }; break; case 'change-set': deploymentMethod = { method: 'change-set', execute: true, changeSetName: args.changeSetName, importExistingResources: args.importExistingResources, }; break; case 'prepare-change-set': deploymentMethod = { method: 'change-set', execute: false, changeSetName: args.changeSetName, importExistingResources: args.importExistingResources, }; break; case undefined: deploymentMethod = { method: 'change-set', execute: args.execute ?? true, changeSetName: args.changeSetName, importExistingResources: args.importExistingResources, }; break; } return cli.deploy({ selector, exclusively: args.exclusively, toolkitStackName, roleArn: args.roleArn, notificationArns: args.notificationArns, requireApproval: configuration.settings.get(['requireApproval']), reuseAssets: args['build-exclude'], tags: configuration.settings.get(['tags']), deploymentMethod, force: args.force, parameters: parameterMap, usePreviousParameters: args['previous-parameters'], outputsFile: configuration.settings.get(['outputsFile']), progress: configuration.settings.get(['progress']), ci: args.ci, rollback: configuration.settings.get(['rollback']), hotswap: determineHotswapMode(args.hotswap, args.hotswapFallback), watch: args.watch, traceLogs: args.logs, concurrency: args.concurrency, assetParallelism: configuration.settings.get(['assetParallelism']), assetBuildTime: configuration.settings.get(['assetPrebuild']) ? cdk_toolkit_1.AssetBuildTime.ALL_BEFORE_DEPLOY : cdk_toolkit_1.AssetBuildTime.JUST_IN_TIME, ignoreNoStacks: args.ignoreNoStacks, }); case 'rollback': ioHost.currentAction = 'rollback'; return cli.rollback({ selector, toolkitStackName, roleArn: args.roleArn, force: args.force, validateBootstrapStackVersion: args['validate-bootstrap-version'], orphanLogicalIds: args.orphan, }); case 'import': ioHost.currentAction = 'import'; return cli.import({ selector, toolkitStackName, roleArn: args.roleArn, deploymentMethod: { method: 'change-set', execute: args.execute, changeSetName: args.changeSetName, }, progress: configuration.settings.get(['progress']), rollback: configuration.settings.get(['rollback']), recordResourceMapping: args['record-resource-mapping'], resourceMappingFile: args['resource-mapping'], force: args.force, }); case 'watch': ioHost.currentAction = 'watch'; return cli.watch({ selector, exclusively: args.exclusively, toolkitStackName, roleArn: args.roleArn, reuseAssets: args['build-exclude'], deploymentMethod: { method: 'change-set', changeSetName: args.changeSetName, }, force: args.force, progress: configuration.settings.get(['progress']), rollback: configuration.settings.get(['rollback']), hotswap: determineHotswapMode(args.hotswap, args.hotswapFallback, true), traceLogs: args.logs, concurrency: args.concurrency, }); case 'destroy': ioHost.currentAction = 'destroy'; return cli.destroy({ selector, exclusively: args.exclusively, force: args.force, roleArn: args.roleArn, ci: args.ci, }); case 'gc': ioHost.currentAction = 'gc'; if (!configuration.settings.get(['unstable']).includes('gc')) { throw new error_1.ToolkitError('Unstable feature use: \'gc\' is unstable. It must be opted in via \'--unstable\', e.g. \'cdk gc --unstable=gc\''); } return cli.garbageCollect(args.ENVIRONMENTS, { action: args.action, type: args.type, rollbackBufferDays: args['rollback-buffer-days'], createdBufferDays: args['created-buffer-days'], bootstrapStackName: args.bootstrapStackName, confirm: args.confirm, }); case 'synthesize': case 'synth': ioHost.currentAction = 'synth'; const quiet = configuration.settings.get(['quiet']) ?? args.quiet; if (args.exclusively) { return cli.synth(args.STACKS, args.exclusively, quiet, args.validation, argv.json); } else { return cli.synth(args.STACKS, true, quiet, args.validation, argv.json); } case 'notices': ioHost.currentAction = 'notices'; // This is a valid command, but we're postponing its execution return; case 'metadata': ioHost.currentAction = 'metadata'; return cli.metadata(args.STACK, argv.json); case 'acknowledge': case 'ack': ioHost.currentAction = 'notices'; return cli.acknowledge(args.ID); case 'init': ioHost.currentAction = 'init'; const language = configuration.settings.get(['language']); if (args.list) { return (0, init_1.printAvailableTemplates)(language); } else { return (0, init_1.cliInit)({ type: args.TEMPLATE, language, canUseNetwork: undefined, generateOnly: args.generateOnly, }); } case 'migrate': ioHost.currentAction = 'migrate'; return cli.migrate({ stackName: args['stack-name'], fromPath: args['from-path'], fromStack: args['from-stack'], language: args.language, outputPath: args['output-path'], fromScan: (0, migrate_1.getMigrateScanType)(args['from-scan']), filter: args.filter, account: args.account, region: args.region, compress: args.compress, }); case 'version': ioHost.currentAction = 'version'; return (0, logging_1.data)(version.DISPLAY_VERSION); default: throw new error_1.ToolkitError('Unknown command: ' + command); } } } /** * Determine which version of bootstrapping */ function determineBootstrapVersion(args) { let source; if (args.template) { (0, logging_1.info)(`Using bootstrapping template from ${args.template}`); source = { source: 'custom', templateFile: args.template }; } else if (process.env.CDK_LEGACY_BOOTSTRAP) { (0, logging_1.info)('CDK_LEGACY_BOOTSTRAP set, using legacy-style bootstrapping'); source = { source: 'legacy' }; } else { // in V2, the "new" bootstrapping is the default source = { source: 'default' }; } return source; } function isFeatureEnabled(configuration, featureFlag) { return configuration.context.get(featureFlag) ?? cxapi.futureFlagDefault(featureFlag); } /** * Translate a Yargs input array to something that makes more sense in a programming language * model (telling the difference between absence and an empty array) * * - An empty array is the default case, meaning the user didn't pass any arguments. We return * undefined. * - If the user passed a single empty string, they did something like `--array=`, which we'll * take to mean they passed an empty array. */ function arrayFromYargs(xs) { if (xs.length === 0) { return undefined; } return xs.filter((x) => x !== ''); } function determineHotswapMode(hotswap, hotswapFallback, watch) { if (hotswap && hotswapFallback) { throw new error_1.ToolkitError('Can not supply both --hotswap and --hotswap-fallback at the same time'); } else if (!hotswap && !hotswapFallback) { if (hotswap === undefined && hotswapFallback === undefined) { return watch ? common_1.HotswapMode.HOTSWAP_ONLY : common_1.HotswapMode.FULL_DEPLOYMENT; } else if (hotswap === false || hotswapFallback === false) { return common_1.HotswapMode.FULL_DEPLOYMENT; } } let hotswapMode; if (hotswap) { hotswapMode = common_1.HotswapMode.HOTSWAP_ONLY; /*if (hotswapFallback)*/ } else { hotswapMode = common_1.HotswapMode.FALL_BACK; } return hotswapMode; } /* istanbul ignore next: we never call this in unit tests */ function cli(args = process.argv.slice(2)) { exec(args) .then(async (value) => { if (typeof value === 'number') { process.exitCode = value; } }) .catch((err) => { (0, logging_1.error)(err.message); // Log the stack trace if we're on a developer workstation. Otherwise this will be into a minified // file and the printed code line and stack trace are huge and useless. if (err.stack && version.isDeveloperBuild()) { (0, logging_1.debug)(err.stack); } process.exitCode = 1; }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0NBLG9CQXljQztBQStERCxrQkFpQkM7QUFqa0JELHlDQUF5QztBQUN6QyxnQ0FBOEI7QUFDOUIsK0JBQStCO0FBQy9CLCtDQUEyRDtBQUMzRCxpRkFBMkU7QUFDM0UsMkRBQStEO0FBRS9ELHFDQUFxQztBQUNyQyw4Q0FBOEM7QUFDOUMsMkRBQTREO0FBQzVELGdEQUFpRTtBQUVqRSxvRUFBNkU7QUFDN0UsNENBQWdEO0FBQ2hELG9EQUFtRTtBQUNuRSxrREFBb0Q7QUFDcEQsMENBQTJDO0FBRTNDLHNEQUFrRDtBQUVsRCxpREFBZ0U7QUFDaEUsMkNBQXdDO0FBQ3hDLCtDQUE0QztBQUM1QyxpREFBeUQ7QUFDekQsa0NBQTJEO0FBQzNELHdDQUFzRDtBQUN0RCx3Q0FBcUM7QUFDckMsNkRBQThEO0FBQzlELHdEQUFtRTtBQUNuRSw0Q0FBZ0Q7QUFDaEQsNkNBQWdEO0FBRWhELDRCQUE0QjtBQUM1QixpREFBaUQsQ0FBQyxRQUFRO0FBRTFELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLG1DQUFtQztJQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFDaEMsQ0FBQztBQUVNLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBYyxFQUFFLFdBQXlCO0lBQ2xFLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSx3REFBeUIsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXRCLGtDQUFrQztJQUNsQyxnQ0FBZ0M7SUFDaEMsSUFBSSxjQUFjLEdBQW1CLE1BQU0sQ0FBQztJQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixRQUFRLElBQUksQ0FBQyxPQUFP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QUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUMsQ0FBQztTQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2IsSUFBQSxlQUFLLEVBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5CLGtHQUFrRztRQUNsRyx1RUFBdUU7UUFDdkUsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBQSxlQUFLLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0ICdAanNpaS9jaGVjay1ub2RlL3J1bic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBDZGtUb29sa2l0LCBBc3NldEJ1aWxkVGltZSB9IGZyb20gJy4vY2RrLXRvb2xraXQnO1xuaW1wb3J0IHsgcGFyc2VDb21tYW5kTGluZUFyZ3VtZW50cyB9IGZyb20gJy4vcGFyc2UtY29tbWFuZC1saW5lLWFyZ3VtZW50cyc7XG5pbXBvcnQgeyBjaGVja0ZvclBsYXRmb3JtV2FybmluZ3MgfSBmcm9tICcuL3BsYXRmb3JtLXdhcm5pbmdzJztcblxuaW1wb3J0ICogYXMgdmVyc2lvbiBmcm9tICcuL3ZlcnNpb24nO1xuaW1wb3J0IHsgU2RrUHJvdmlkZXIgfSBmcm9tICcuLi9hcGkvYXdzLWF1dGgnO1xuaW1wb3J0IHsgU2RrVG9DbGlMb2dnZXIgfSBmcm9tICcuLi9hcGkvYXdzLWF1dGgvc2RrLWxvZ2dlcic7XG5pbXBvcnQgeyBCb290c3RyYXBTb3VyY2UsIEJvb3RzdHJhcHBlciB9IGZyb20gJy4uL2FwaS9ib290c3RyYXAnO1xuaW1wb3J0IHsgU3RhY2tTZWxlY3RvciB9IGZyb20gJy4uL2FwaS9jeGFwcC9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgeyBDbG91ZEV4ZWN1dGFibGUsIFN5bnRoZXNpemVyIH0gZnJvbSAnLi4vYXBpL2N4YXBwL2Nsb3VkLWV4ZWN1dGFibGUnO1xuaW1wb3J0IHsgZXhlY1Byb2dyYW0gfSBmcm9tICcuLi9hcGkvY3hhcHAvZXhlYyc7XG5pbXBvcnQgeyBEZXBsb3ltZW50cywgRGVwbG95bWVudE1ldGhvZCB9IGZyb20gJy4uL2FwaS9kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBIb3Rzd2FwTW9kZSB9IGZyb20gJy4uL2FwaS9ob3Rzd2FwL2NvbW1vbic7XG5pbXBvcnQgeyBQbHVnaW5Ib3N0IH0gZnJvbSAnLi4vYXBpL3BsdWdpbic7XG5pbXBvcnQgeyBTZXR0aW5ncyB9IGZyb20gJy4uL2FwaS9zZXR0aW5ncyc7XG5pbXBvcnQgeyBUb29sa2l0SW5mbyB9IGZyb20gJy4uL2FwaS90b29sa2l0LWluZm8nO1xuaW1wb3J0IHsgSUxvY2sgfSBmcm9tICcuLi9hcGkvdXRpbC9yd2xvY2snO1xuaW1wb3J0IHsgY29udGV4dEhhbmRsZXIgYXMgY29udGV4dCB9IGZyb20gJy4uL2NvbW1hbmRzL2NvbnRleHQnO1xuaW1wb3J0IHsgZG9jcyB9IGZyb20gJy4uL2NvbW1hbmRzL2RvY3MnO1xuaW1wb3J0IHsgZG9jdG9yIH0gZnJvbSAnLi4vY29tbWFuZHMvZG9jdG9yJztcbmltcG9ydCB7IGdldE1pZ3JhdGVTY2FuVHlwZSB9IGZyb20gJy4uL2NvbW1hbmRzL21pZ3JhdGUnO1xuaW1wb3J0IHsgY2xpSW5pdCwgcHJpbnRBdmFpbGFibGVUZW1wbGF0ZXMgfSBmcm9tICcuLi9pbml0JztcbmltcG9ydCB7IGRhdGEsIGRlYnVnLCBlcnJvciwgaW5mbyB9IGZyb20gJy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgTm90aWNlcyB9IGZyb20gJy4uL25vdGljZXMnO1xuaW1wb3J0IHsgQ29tbWFuZCwgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vdXNlci1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IElvTWVzc2FnZUxldmVsLCBDbGlJb0hvc3QgfSBmcm9tICcuLi90b29sa2l0L2NsaS1pby1ob3N0JztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uL3Rvb2xraXQvZXJyb3InO1xuaW1wb3J0IHsgZW5hYmxlVHJhY2luZyB9IGZyb20gJy4uL3V0aWwvdHJhY2luZyc7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3cgKi8gLy8geWFyZ3NcblxuaWYgKCFwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAvLyBEaXNhYmxlIGNoYWxrIGNvbG9yIGhpZ2hsaWdodGluZ1xuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiA9ICcwJztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWMoYXJnczogc3RyaW5nW10sIHN5bnRoZXNpemVyPzogU3ludGhlc2l6ZXIpOiBQcm9taXNlPG51bWJlciB8IHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHBhcnNlQ29tbWFuZExpbmVBcmd1bWVudHMoYXJncyk7XG4gIGNvbnN0IGNtZCA9IGFyZ3YuX1swXTtcblxuICAvLyBpZiBvbmUgLXYsIGxvZyBhdCBhIERFQlVHIGxldmVsXG4gIC8vIGlmIDIgLXYsIGxvZyBhdCBhIFRSQUNFIGxldmVsXG4gIGxldCBpb01lc3NhZ2VMZXZlbDogSW9NZXNzYWdlTGV2ZWwgPSAnaW5mbyc7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBzd2l0Y2ggKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpb01lc3NhZ2VMZXZlbCA9ICdkZWJ1Zyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW9NZXNzYWdlTGV2ZWwgPSAndHJhY2UnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBjb25zdCBpb0hvc3QgPSBDbGlJb0hvc3QuaW5zdGFuY2Uoe1xuICAgIGxvZ0xldmVsOiBpb01lc3NhZ2VMZXZlbCxcbiAgICBpc1RUWTogcHJvY2Vzcy5zdGRvdXQuaXNUVFksXG4gICAgaXNDSTogQm9vbGVhbihhcmd2LmNpKSxcbiAgICBjdXJyZW50QWN0aW9uOiBjbWQsXG4gIH0sIHRydWUpO1xuXG4gIC8vIERlYnVnIHNob3VsZCBhbHdheXMgaW1wbHkgdHJhY2luZ1xuICBpZiAoYXJndi5kZWJ1ZyB8fCBhcmd2LnZlcmJvc2UgPiAyKSB7XG4gICAgZW5hYmxlVHJhY2luZyh0cnVlKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgY2hlY2tGb3JQbGF0Zm9ybVdhcm5pbmdzKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkZWJ1ZyhgRXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yIHBsYXRmb3JtIHdhcm5pbmdzOiAke2V9YCk7XG4gIH1cblxuICBkZWJ1ZygnQ0RLIHRvb2xraXQgdmVyc2lvbjonLCB2ZXJzaW9uLkRJU1BMQVlfVkVSU0lPTik7XG4gIGRlYnVnKCdDb21tYW5kIGxpbmUgYXJndW1lbnRzOicsIGFyZ3YpO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbih7XG4gICAgY29tbWFuZExpbmVBcmd1bWVudHM6IHtcbiAgICAgIC4uLmFyZ3YsXG4gICAgICBfOiBhcmd2Ll8gYXMgW0NvbW1hbmQsIC4uLnN0cmluZ1tdXSwgLy8gVHlwZVNjcmlwdCBhdCBpdHMgYmVzdFxuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBjb25maWd1cmF0aW9uLmxvYWQoKTtcblxuICBjb25zdCBub3RpY2VzID0gTm90aWNlcy5jcmVhdGUoe1xuICAgIGNvbnRleHQ6IGNvbmZpZ3VyYXRpb24uY29udGV4dCxcbiAgICBvdXRwdXQ6IGNvbmZpZ3VyYXRpb24uc2V0dGluZ3MuZ2V0KFsnb3V0ZGlyJ10pLFxuICAgIHNob3VsZERpc3BsYXk6IGNvbmZpZ3