UNPKG

projen

Version:

CDK for software projects

97 lines 13.3 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.GithubCredentials = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const Case = require("case"); /** * Represents a method of providing GitHub API access for projen workflows. */ class GithubCredentials { /** * Provide API access through a GitHub personal access token. * * The token must be added as a secret to the GitHub repo, and the name of the * secret can be specified here. * * @see https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token * @default - a secret named "PROJEN_GITHUB_TOKEN" */ static fromPersonalAccessToken(options = {}) { return new GithubCredentials({ setupSteps: [], tokenRef: `\${{ secrets.${options.secret ?? "PROJEN_GITHUB_TOKEN"} }}`, environment: options.environment, }); } /** * Provide API access through a GitHub App. * * The GitHub App must be installed on the GitHub repo, its App ID and a * private key must be added as secrets to the repo. The name of the secrets * can be specified here. * * @see https://docs.github.com/en/developers/apps/building-github-apps/creating-a-github-app * @see https://projen.io/docs/integrations/github/#github-app * @default - app id stored in "PROJEN_APP_ID" and private key stored in "PROJEN_APP_PRIVATE_KEY" with all permissions attached to the app */ static fromApp(options = {}) { const appIdSecret = options.appIdSecret ?? "PROJEN_APP_ID"; const privateKeySecret = options.privateKeySecret ?? "PROJEN_APP_PRIVATE_KEY"; const actionConfig = { "app-id": `\${{ secrets.${appIdSecret} }}`, "private-key": `\${{ secrets.${privateKeySecret} }}`, }; if (options.owner) { actionConfig.owner = options.owner; } if (options.repositories) { actionConfig.repositories = options.repositories.join(","); } const permissions = Object.entries(options.permissions ?? {}).reduce((map, [name, val]) => { map[`permission-${Case.kebab(name)}`] = val; return map; }, {}); return new GithubCredentials({ setupSteps: [ { name: "Generate token", id: "generate_token", uses: "actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5", with: { ...actionConfig, ...permissions, }, }, ], tokenRef: "${{ steps.generate_token.outputs.token }}", environment: options.environment, }); } constructor(options) { this.options = options; } /** * Setup steps to obtain GitHub credentials. */ get setupSteps() { return [...this.options.setupSteps]; } /** * The value to use in a workflow when a GitHub token is expected. This * typically looks like "${{ some.path.to.a.value }}". */ get tokenRef() { return this.options.tokenRef; } /** * The GitHub Actions environment the credentials have been added to. */ get environment() { return this.options.environment; } } exports.GithubCredentials = GithubCredentials; _a = JSII_RTTI_SYMBOL_1; GithubCredentials[_a] = { fqn: "projen.github.GithubCredentials", version: "0.99.16" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWNyZWRlbnRpYWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dpdGh1Yi9naXRodWItY3JlZGVudGlhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBNkI7QUE0RTdCOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFDNUI7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsdUJBQXVCLENBQ25DLFVBQXVELEVBQUU7UUFFekQsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1lBQzNCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsUUFBUSxFQUFFLGdCQUFnQixPQUFPLENBQUMsTUFBTSxJQUFJLHFCQUFxQixLQUFLO1lBQ3RFLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBdUMsRUFBRTtRQUM3RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLGVBQWUsQ0FBQztRQUMzRCxNQUFNLGdCQUFnQixHQUNwQixPQUFPLENBQUMsZ0JBQWdCLElBQUksd0JBQXdCLENBQUM7UUFFdkQsTUFBTSxZQUFZLEdBQTJCO1lBQzNDLFFBQVEsRUFBRSxnQkFBZ0IsV0FBVyxLQUFLO1lBQzFDLGFBQWEsRUFBRSxnQkFBZ0IsZ0JBQWdCLEtBQUs7U0FDckQsQ0FBQztRQUVGLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLFlBQVksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekIsWUFBWSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FFbEUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRTtZQUNyQixHQUFHLENBQUMsY0FBYyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDNUMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxPQUFPLElBQUksaUJBQWlCLENBQUM7WUFDM0IsVUFBVSxFQUFFO2dCQUNWO29CQUNFLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLEVBQUUsRUFBRSxnQkFBZ0I7b0JBQ3BCLElBQUksRUFBRSwwRUFBMEU7b0JBQ2hGLElBQUksRUFBRTt3QkFDSixHQUFHLFlBQVk7d0JBQ2YsR0FBRyxXQUFXO3FCQUNmO2lCQUNGO2FBQ0Y7WUFDRCxRQUFRLEVBQUUsMkNBQTJDO1lBQ3JELFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBcUMsT0FBaUM7UUFBakMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7SUFBRyxDQUFDO0lBRTFFOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ25CLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ2xDLENBQUM7O0FBOUZILDhDQStGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIENhc2UgZnJvbSBcImNhc2VcIjtcbmltcG9ydCB7IEpvYlN0ZXAsIEFwcFBlcm1pc3Npb25zIH0gZnJvbSBcIi4vd29ya2Zsb3dzLW1vZGVsXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYEdpdGh1YkNyZWRlbnRpYWxzLmZyb21QZXJzb25hbEFjY2Vzc1Rva2VuYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdGh1YkNyZWRlbnRpYWxzUGVyc29uYWxBY2Nlc3NUb2tlbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNlY3JldCB0aGF0IGhvbGRzIHRoZSBHaXRIdWIgcGVyc29uYWwgYWNjZXNzIHRva2VuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIlBST0pFTl9HSVRIVUJfVE9LRU5cIlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgR2l0SHViIEFjdGlvbnMgZW52aXJvbm1lbnQgdGhlIHNlY3JldHMgaXMgYWRkZWQgdG8uXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGV4cGxpY2l0IGFwcHJvdmFsIHN0ZXBzIHRvIGFjY2VzcyB0aGUgc2VjcmV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGVudmlyb25tZW50IHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBHaXRodWJDcmVkZW50aWFscy5mcm9tQXBwYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdGh1YkNyZWRlbnRpYWxzQXBwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIEdpdEh1YiBBcHAgSURcbiAgICpcbiAgICogQGRlZmF1bHQgXCJQUk9KRU5fQVBQX0lEXCJcbiAgICovXG4gIHJlYWRvbmx5IGFwcElkU2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIEdpdEh1YiBBcHAgcHJpdmF0ZSBrZXlcbiAgICpcbiAgICogRXNjYXBlZCBuZXdsaW5lcyAoXFxcXG4pIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIGFjdHVhbCBuZXdsaW5lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJQUk9KRU5fQVBQX1BSSVZBVEVfS0VZXCJcbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVLZXlTZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvd25lciBvZiB0aGUgR2l0SHViIEFwcCBpbnN0YWxsYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBpZiBlbXB0eSwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeSBvd25lclxuICAgKi9cbiAgcmVhZG9ubHkgb3duZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcmVwb3NpdG9yaWVzIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIGlmIG93bmVyIGlzIHNldCBhbmQgcmVwb3NpdG9yaWVzIGlzIGVtcHR5LCBhY2Nlc3Mgd2lsbCBiZSBzY29wZWQgdG8gYWxsIHJlcG9zaXRvcmllcyBpbiB0aGUgcHJvdmlkZWQgcmVwb3NpdG9yeSBvd25lcidzIGluc3RhbGxhdGlvbi5cbiAgICogSWYgb3duZXIgYW5kIHJlcG9zaXRvcmllcyBhcmUgZW1wdHksIGFjY2VzcyB3aWxsIGJlIHNjb3BlZCB0byBvbmx5IHRoZSBjdXJyZW50IHJlcG9zaXRvcnkuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3JpZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gdGhlIHRva2VuLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCBwZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSBhcHBcbiAgICovXG4gIHJlYWRvbmx5IHBlcm1pc3Npb25zPzogQXBwUGVybWlzc2lvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgQWN0aW9ucyBlbnZpcm9ubWVudCB0aGUgc2VjcmV0cyBhcmUgYWRkZWQgdG8uXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGV4cGxpY2l0IGFwcHJvdmFsIHN0ZXBzIHRvIGFjY2VzcyB0aGUgc2VjcmV0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbnZpcm9ubWVudCB1c2VkXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWV0aG9kIG9mIHByb3ZpZGluZyBHaXRIdWIgQVBJIGFjY2VzcyBmb3IgcHJvamVuIHdvcmtmbG93cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdGh1YkNyZWRlbnRpYWxzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGUgQVBJIGFjY2VzcyB0aHJvdWdoIGEgR2l0SHViIHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cbiAgICpcbiAgICogVGhlIHRva2VuIG11c3QgYmUgYWRkZWQgYXMgYSBzZWNyZXQgdG8gdGhlIEdpdEh1YiByZXBvLCBhbmQgdGhlIG5hbWUgb2YgdGhlXG4gICAqIHNlY3JldCBjYW4gYmUgc3BlY2lmaWVkIGhlcmUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYXV0aGVudGljYXRpb24va2VlcGluZy15b3VyLWFjY291bnQtYW5kLWRhdGEtc2VjdXJlL2NyZWF0aW5nLWEtcGVyc29uYWwtYWNjZXNzLXRva2VuXG4gICAqIEBkZWZhdWx0IC0gYSBzZWNyZXQgbmFtZWQgXCJQUk9KRU5fR0lUSFVCX1RPS0VOXCJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVBlcnNvbmFsQWNjZXNzVG9rZW4oXG4gICAgb3B0aW9uczogR2l0aHViQ3JlZGVudGlhbHNQZXJzb25hbEFjY2Vzc1Rva2VuT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gbmV3IEdpdGh1YkNyZWRlbnRpYWxzKHtcbiAgICAgIHNldHVwU3RlcHM6IFtdLFxuICAgICAgdG9rZW5SZWY6IGBcXCR7eyBzZWNyZXRzLiR7b3B0aW9ucy5zZWNyZXQgPz8gXCJQUk9KRU5fR0lUSFVCX1RPS0VOXCJ9IH19YCxcbiAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgQVBJIGFjY2VzcyB0aHJvdWdoIGEgR2l0SHViIEFwcC5cbiAgICpcbiAgICogVGhlIEdpdEh1YiBBcHAgbXVzdCBiZSBpbnN0YWxsZWQgb24gdGhlIEdpdEh1YiByZXBvLCBpdHMgQXBwIElEIGFuZCBhXG4gICAqIHByaXZhdGUga2V5IG11c3QgYmUgYWRkZWQgYXMgc2VjcmV0cyB0byB0aGUgcmVwby4gVGhlIG5hbWUgb2YgdGhlIHNlY3JldHNcbiAgICogY2FuIGJlIHNwZWNpZmllZCBoZXJlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2RldmVsb3BlcnMvYXBwcy9idWlsZGluZy1naXRodWItYXBwcy9jcmVhdGluZy1hLWdpdGh1Yi1hcHBcbiAgICogQHNlZSBodHRwczovL3Byb2plbi5pby9kb2NzL2ludGVncmF0aW9ucy9naXRodWIvI2dpdGh1Yi1hcHBcbiAgICogQGRlZmF1bHQgLSBhcHAgaWQgc3RvcmVkIGluIFwiUFJPSkVOX0FQUF9JRFwiIGFuZCBwcml2YXRlIGtleSBzdG9yZWQgaW4gXCJQUk9KRU5fQVBQX1BSSVZBVEVfS0VZXCIgd2l0aCBhbGwgcGVybWlzc2lvbnMgYXR0YWNoZWQgdG8gdGhlIGFwcFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQXBwKG9wdGlvbnM6IEdpdGh1YkNyZWRlbnRpYWxzQXBwT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgYXBwSWRTZWNyZXQgPSBvcHRpb25zLmFwcElkU2VjcmV0ID8/IFwiUFJPSkVOX0FQUF9JRFwiO1xuICAgIGNvbnN0IHByaXZhdGVLZXlTZWNyZXQgPVxuICAgICAgb3B0aW9ucy5wcml2YXRlS2V5U2VjcmV0ID8/IFwiUFJPSkVOX0FQUF9QUklWQVRFX0tFWVwiO1xuXG4gICAgY29uc3QgYWN0aW9uQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgXCJhcHAtaWRcIjogYFxcJHt7IHNlY3JldHMuJHthcHBJZFNlY3JldH0gfX1gLFxuICAgICAgXCJwcml2YXRlLWtleVwiOiBgXFwke3sgc2VjcmV0cy4ke3ByaXZhdGVLZXlTZWNyZXR9IH19YCxcbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnMub3duZXIpIHtcbiAgICAgIGFjdGlvbkNvbmZpZy5vd25lciA9IG9wdGlvbnMub3duZXI7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnJlcG9zaXRvcmllcykge1xuICAgICAgYWN0aW9uQ29uZmlnLnJlcG9zaXRvcmllcyA9IG9wdGlvbnMucmVwb3NpdG9yaWVzLmpvaW4oXCIsXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5wZXJtaXNzaW9ucyA/PyB7fSkucmVkdWNlPFxuICAgICAgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgID4oKG1hcCwgW25hbWUsIHZhbF0pID0+IHtcbiAgICAgIG1hcFtgcGVybWlzc2lvbi0ke0Nhc2Uua2ViYWIobmFtZSl9YF0gPSB2YWw7XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH0sIHt9KTtcblxuICAgIHJldHVybiBuZXcgR2l0aHViQ3JlZGVudGlhbHMoe1xuICAgICAgc2V0dXBTdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJHZW5lcmF0ZSB0b2tlblwiLFxuICAgICAgICAgIGlkOiBcImdlbmVyYXRlX3Rva2VuXCIsXG4gICAgICAgICAgdXNlczogXCJhY3Rpb25zL2NyZWF0ZS1naXRodWItYXBwLXRva2VuQDNmZjFjYWFhMjhiNjRjOWNjMjc2Y2UwYTAyZTJmZjU4NGYzOTAwYzVcIixcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAuLi5hY3Rpb25Db25maWcsXG4gICAgICAgICAgICAuLi5wZXJtaXNzaW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRva2VuUmVmOiBcIiR7eyBzdGVwcy5nZW5lcmF0ZV90b2tlbi5vdXRwdXRzLnRva2VuIH19XCIsXG4gICAgICBlbnZpcm9ubWVudDogb3B0aW9ucy5lbnZpcm9ubWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBHaXRodWJDcmVkZW50aWFsc09wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFNldHVwIHN0ZXBzIHRvIG9idGFpbiBHaXRIdWIgY3JlZGVudGlhbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNldHVwU3RlcHMoKTogSm9iU3RlcFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMub3B0aW9ucy5zZXR1cFN0ZXBzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdG8gdXNlIGluIGEgd29ya2Zsb3cgd2hlbiBhIEdpdEh1YiB0b2tlbiBpcyBleHBlY3RlZC4gVGhpc1xuICAgKiB0eXBpY2FsbHkgbG9va3MgbGlrZSBcIiR7eyBzb21lLnBhdGgudG8uYS52YWx1ZSB9fVwiLlxuICAgKi9cbiAgcHVibGljIGdldCB0b2tlblJlZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudG9rZW5SZWY7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEdpdEh1YiBBY3Rpb25zIGVudmlyb25tZW50IHRoZSBjcmVkZW50aWFscyBoYXZlIGJlZW4gYWRkZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVudmlyb25tZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5lbnZpcm9ubWVudDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgR2l0aHViQ3JlZGVudGlhbHNPcHRpb25zIHtcbiAgcmVhZG9ubHkgc2V0dXBTdGVwczogSm9iU3RlcFtdO1xuICByZWFkb25seSB0b2tlblJlZjogc3RyaW5nO1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHN0cmluZztcbn1cbiJdfQ==