projen
Version:
CDK for software projects
130 lines • 14.9 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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.GithubCredentials = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const Case = __importStar(require("case"));
const actions_const_1 = require("./actions.const");
/**
* Represents a method of providing GitHub API access for projen workflows.
*/
class GithubCredentials {
options;
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubCredentials", version: "0.103.12" };
/**
* 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_const_1.GitHubActions.ACTIONS_CREATE_GITHUB_APP_TOKEN,
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;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWNyZWRlbnRpYWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dpdGh1Yi9naXRodWItY3JlZGVudGlhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE2QjtBQUM3QixtREFBZ0Q7QUE0RWhEOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUF3RVM7O0lBdkVyQzs7Ozs7Ozs7T0FRRztJQUNJLE1BQU0sQ0FBQyx1QkFBdUIsQ0FDbkMsVUFBdUQsRUFBRTtRQUV6RCxPQUFPLElBQUksaUJBQWlCLENBQUM7WUFDM0IsVUFBVSxFQUFFLEVBQUU7WUFDZCxRQUFRLEVBQUUsZ0JBQWdCLE9BQU8sQ0FBQyxNQUFNLElBQUkscUJBQXFCLEtBQUs7WUFDdEUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUF1QyxFQUFFO1FBQzdELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksZUFBZSxDQUFDO1FBQzNELE1BQU0sZ0JBQWdCLEdBQ3BCLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSx3QkFBd0IsQ0FBQztRQUV2RCxNQUFNLFlBQVksR0FBMkI7WUFDM0MsUUFBUSxFQUFFLGdCQUFnQixXQUFXLEtBQUs7WUFDMUMsYUFBYSxFQUFFLGdCQUFnQixnQkFBZ0IsS0FBSztTQUNyRCxDQUFDO1FBRUYsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsWUFBWSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QixZQUFZLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUVsRSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQ3JCLEdBQUcsQ0FBQyxjQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUM1QyxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQztZQUMzQixVQUFVLEVBQUU7Z0JBQ1Y7b0JBQ0UsSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsRUFBRSxFQUFFLGdCQUFnQjtvQkFDcEIsSUFBSSxFQUFFLDZCQUFhLENBQUMsK0JBQStCO29CQUNuRCxJQUFJLEVBQUU7d0JBQ0osR0FBRyxZQUFZO3dCQUNmLEdBQUcsV0FBVztxQkFDZjtpQkFDRjthQUNGO1lBQ0QsUUFBUSxFQUFFLDJDQUEyQztZQUNyRCxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7U0FDakMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQXFDLE9BQWlDO1FBQWpDLFlBQU8sR0FBUCxPQUFPLENBQTBCO0lBQUcsQ0FBQztJQUUxRTs7T0FFRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUNsQyxDQUFDOztBQTlGSCw4Q0ErRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBDYXNlIGZyb20gXCJjYXNlXCI7XG5pbXBvcnQgeyBHaXRIdWJBY3Rpb25zIH0gZnJvbSBcIi4vYWN0aW9ucy5jb25zdFwiO1xuaW1wb3J0IHR5cGUgeyBKb2JTdGVwLCBBcHBQZXJtaXNzaW9ucyB9IGZyb20gXCIuL3dvcmtmbG93cy1tb2RlbFwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBHaXRodWJDcmVkZW50aWFscy5mcm9tUGVyc29uYWxBY2Nlc3NUb2tlbmBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRodWJDcmVkZW50aWFsc1BlcnNvbmFsQWNjZXNzVG9rZW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZWNyZXQgdGhhdCBob2xkcyB0aGUgR2l0SHViIHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJQUk9KRU5fR0lUSFVCX1RPS0VOXCJcbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiBBY3Rpb25zIGVudmlyb25tZW50IHRoZSBzZWNyZXRzIGlzIGFkZGVkIHRvLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBleHBsaWNpdCBhcHByb3ZhbCBzdGVwcyB0byBhY2Nlc3MgdGhlIHNlY3JldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbnZpcm9ubWVudCB1c2VkXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgR2l0aHViQ3JlZGVudGlhbHMuZnJvbUFwcGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRodWJDcmVkZW50aWFsc0FwcE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHNlY3JldCBjb250YWluaW5nIHRoZSBHaXRIdWIgQXBwIElEXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiUFJPSkVOX0FQUF9JRFwiXG4gICAqL1xuICByZWFkb25seSBhcHBJZFNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNlY3JldCBjb250YWluaW5nIHRoZSBHaXRIdWIgQXBwIHByaXZhdGUga2V5XG4gICAqXG4gICAqIEVzY2FwZWQgbmV3bGluZXMgKFxcXFxuKSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCBhY3R1YWwgbmV3bGluZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiUFJPSkVOX0FQUF9QUklWQVRFX0tFWVwiXG4gICAqL1xuICByZWFkb25seSBwcml2YXRlS2V5U2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3duZXIgb2YgdGhlIEdpdEh1YiBBcHAgaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaWYgZW1wdHksIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkgb3duZXJcbiAgICovXG4gIHJlYWRvbmx5IG93bmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHJlcG9zaXRvcmllcyB0byBncmFudCBhY2Nlc3MgdG9cbiAgICpcbiAgICogQGRlZmF1bHQgLSBpZiBvd25lciBpcyBzZXQgYW5kIHJlcG9zaXRvcmllcyBpcyBlbXB0eSwgYWNjZXNzIHdpbGwgYmUgc2NvcGVkIHRvIGFsbCByZXBvc2l0b3JpZXMgaW4gdGhlIHByb3ZpZGVkIHJlcG9zaXRvcnkgb3duZXIncyBpbnN0YWxsYXRpb24uXG4gICAqIElmIG93bmVyIGFuZCByZXBvc2l0b3JpZXMgYXJlIGVtcHR5LCBhY2Nlc3Mgd2lsbCBiZSBzY29wZWQgdG8gb25seSB0aGUgY3VycmVudCByZXBvc2l0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yaWVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSB0b2tlbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgYXBwXG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9ucz86IEFwcFBlcm1pc3Npb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgR2l0SHViIEFjdGlvbnMgZW52aXJvbm1lbnQgdGhlIHNlY3JldHMgYXJlIGFkZGVkIHRvLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBleHBsaWNpdCBhcHByb3ZhbCBzdGVwcyB0byBhY2Nlc3MgdGhlIHNlY3JldHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZW52aXJvbm1lbnQgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1ldGhvZCBvZiBwcm92aWRpbmcgR2l0SHViIEFQSSBhY2Nlc3MgZm9yIHByb2plbiB3b3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRodWJDcmVkZW50aWFscyB7XG4gIC8qKlxuICAgKiBQcm92aWRlIEFQSSBhY2Nlc3MgdGhyb3VnaCBhIEdpdEh1YiBwZXJzb25hbCBhY2Nlc3MgdG9rZW4uXG4gICAqXG4gICAqIFRoZSB0b2tlbiBtdXN0IGJlIGFkZGVkIGFzIGEgc2VjcmV0IHRvIHRoZSBHaXRIdWIgcmVwbywgYW5kIHRoZSBuYW1lIG9mIHRoZVxuICAgKiBzZWNyZXQgY2FuIGJlIHNwZWNpZmllZCBoZXJlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2F1dGhlbnRpY2F0aW9uL2tlZXBpbmcteW91ci1hY2NvdW50LWFuZC1kYXRhLXNlY3VyZS9jcmVhdGluZy1hLXBlcnNvbmFsLWFjY2Vzcy10b2tlblxuICAgKiBAZGVmYXVsdCAtIGEgc2VjcmV0IG5hbWVkIFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21QZXJzb25hbEFjY2Vzc1Rva2VuKFxuICAgIG9wdGlvbnM6IEdpdGh1YkNyZWRlbnRpYWxzUGVyc29uYWxBY2Nlc3NUb2tlbk9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBHaXRodWJDcmVkZW50aWFscyh7XG4gICAgICBzZXR1cFN0ZXBzOiBbXSxcbiAgICAgIHRva2VuUmVmOiBgXFwke3sgc2VjcmV0cy4ke29wdGlvbnMuc2VjcmV0ID8/IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwifSB9fWAsXG4gICAgICBlbnZpcm9ubWVudDogb3B0aW9ucy5lbnZpcm9ubWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIEFQSSBhY2Nlc3MgdGhyb3VnaCBhIEdpdEh1YiBBcHAuXG4gICAqXG4gICAqIFRoZSBHaXRIdWIgQXBwIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBHaXRIdWIgcmVwbywgaXRzIEFwcCBJRCBhbmQgYVxuICAgKiBwcml2YXRlIGtleSBtdXN0IGJlIGFkZGVkIGFzIHNlY3JldHMgdG8gdGhlIHJlcG8uIFRoZSBuYW1lIG9mIHRoZSBzZWNyZXRzXG4gICAqIGNhbiBiZSBzcGVjaWZpZWQgaGVyZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9kZXZlbG9wZXJzL2FwcHMvYnVpbGRpbmctZ2l0aHViLWFwcHMvY3JlYXRpbmctYS1naXRodWItYXBwXG4gICAqIEBzZWUgaHR0cHM6Ly9wcm9qZW4uaW8vZG9jcy9pbnRlZ3JhdGlvbnMvZ2l0aHViLyNnaXRodWItYXBwXG4gICAqIEBkZWZhdWx0IC0gYXBwIGlkIHN0b3JlZCBpbiBcIlBST0pFTl9BUFBfSURcIiBhbmQgcHJpdmF0ZSBrZXkgc3RvcmVkIGluIFwiUFJPSkVOX0FQUF9QUklWQVRFX0tFWVwiIHdpdGggYWxsIHBlcm1pc3Npb25zIGF0dGFjaGVkIHRvIHRoZSBhcHBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUFwcChvcHRpb25zOiBHaXRodWJDcmVkZW50aWFsc0FwcE9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGFwcElkU2VjcmV0ID0gb3B0aW9ucy5hcHBJZFNlY3JldCA/PyBcIlBST0pFTl9BUFBfSURcIjtcbiAgICBjb25zdCBwcml2YXRlS2V5U2VjcmV0ID1cbiAgICAgIG9wdGlvbnMucHJpdmF0ZUtleVNlY3JldCA/PyBcIlBST0pFTl9BUFBfUFJJVkFURV9LRVlcIjtcblxuICAgIGNvbnN0IGFjdGlvbkNvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwiYXBwLWlkXCI6IGBcXCR7eyBzZWNyZXRzLiR7YXBwSWRTZWNyZXR9IH19YCxcbiAgICAgIFwicHJpdmF0ZS1rZXlcIjogYFxcJHt7IHNlY3JldHMuJHtwcml2YXRlS2V5U2VjcmV0fSB9fWAsXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLm93bmVyKSB7XG4gICAgICBhY3Rpb25Db25maWcub3duZXIgPSBvcHRpb25zLm93bmVyO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5yZXBvc2l0b3JpZXMpIHtcbiAgICAgIGFjdGlvbkNvbmZpZy5yZXBvc2l0b3JpZXMgPSBvcHRpb25zLnJlcG9zaXRvcmllcy5qb2luKFwiLFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMucGVybWlzc2lvbnMgPz8ge30pLnJlZHVjZTxcbiAgICAgIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICA+KChtYXAsIFtuYW1lLCB2YWxdKSA9PiB7XG4gICAgICBtYXBbYHBlcm1pc3Npb24tJHtDYXNlLmtlYmFiKG5hbWUpfWBdID0gdmFsO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4gbmV3IEdpdGh1YkNyZWRlbnRpYWxzKHtcbiAgICAgIHNldHVwU3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiR2VuZXJhdGUgdG9rZW5cIixcbiAgICAgICAgICBpZDogXCJnZW5lcmF0ZV90b2tlblwiLFxuICAgICAgICAgIHVzZXM6IEdpdEh1YkFjdGlvbnMuQUNUSU9OU19DUkVBVEVfR0lUSFVCX0FQUF9UT0tFTixcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAuLi5hY3Rpb25Db25maWcsXG4gICAgICAgICAgICAuLi5wZXJtaXNzaW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRva2VuUmVmOiBcIiR7eyBzdGVwcy5nZW5lcmF0ZV90b2tlbi5vdXRwdXRzLnRva2VuIH19XCIsXG4gICAgICBlbnZpcm9ubWVudDogb3B0aW9ucy5lbnZpcm9ubWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBHaXRodWJDcmVkZW50aWFsc09wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFNldHVwIHN0ZXBzIHRvIG9idGFpbiBHaXRIdWIgY3JlZGVudGlhbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNldHVwU3RlcHMoKTogSm9iU3RlcFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMub3B0aW9ucy5zZXR1cFN0ZXBzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdG8gdXNlIGluIGEgd29ya2Zsb3cgd2hlbiBhIEdpdEh1YiB0b2tlbiBpcyBleHBlY3RlZC4gVGhpc1xuICAgKiB0eXBpY2FsbHkgbG9va3MgbGlrZSBcIiR7eyBzb21lLnBhdGgudG8uYS52YWx1ZSB9fVwiLlxuICAgKi9cbiAgcHVibGljIGdldCB0b2tlblJlZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudG9rZW5SZWY7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEdpdEh1YiBBY3Rpb25zIGVudmlyb25tZW50IHRoZSBjcmVkZW50aWFscyBoYXZlIGJlZW4gYWRkZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVudmlyb25tZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5lbnZpcm9ubWVudDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgR2l0aHViQ3JlZGVudGlhbHNPcHRpb25zIHtcbiAgcmVhZG9ubHkgc2V0dXBTdGVwczogSm9iU3RlcFtdO1xuICByZWFkb25seSB0b2tlblJlZjogc3RyaW5nO1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHN0cmluZztcbn1cbiJdfQ==