@cloudsnorkel/cdk-github-runners 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/.gitattributes +10 -9
  2. package/.jsii +98 -81
  3. package/API.md +13 -2
  4. package/assets/{lambdas/delete-runner.lambda → delete-runner.lambda}/index.js +96 -56
  5. package/assets/{lambdas → providers}/build-image.lambda/index.js +3 -3
  6. package/assets/{lambdas → providers/image-builders/aws-image-builder}/delete-ami.lambda/index.js +3 -3
  7. package/assets/providers/image-builders/aws-image-builder/filter-failed-builds.lambda/index.js +39 -0
  8. package/assets/{lambdas/aws-image-builder-versioner.lambda → providers/image-builders/aws-image-builder/versioner.lambda}/index.js +98 -58
  9. package/assets/{lambdas → providers}/update-lambda.lambda/index.js +1 -1
  10. package/assets/{lambdas/setup.lambda → setup.lambda}/index.js +4 -4
  11. package/assets/{lambdas/status.lambda → status.lambda}/index.js +96 -56
  12. package/assets/{lambdas/token-retriever.lambda → token-retriever.lambda}/index.js +96 -56
  13. package/assets/{lambdas/webhook-handler.lambda → webhook-handler.lambda}/index.js +3 -3
  14. package/lib/access.js +1 -1
  15. package/lib/{lambdas/delete-runner-function.d.ts → delete-runner-function.d.ts} +1 -1
  16. package/lib/delete-runner-function.js +23 -0
  17. package/lib/delete-runner.lambda.js +69 -0
  18. package/lib/github.js +50 -0
  19. package/lib/lambda-helpers.js +66 -0
  20. package/lib/{lambdas → providers}/build-image-function.d.ts +1 -1
  21. package/lib/providers/build-image-function.js +23 -0
  22. package/lib/providers/build-image.lambda.js +92 -0
  23. package/lib/providers/codebuild.js +2 -2
  24. package/lib/providers/common.js +3 -3
  25. package/lib/providers/ec2.js +2 -2
  26. package/lib/providers/ecs.js +7 -3
  27. package/lib/providers/fargate.js +2 -2
  28. package/lib/providers/image-builders/api.js +1 -1
  29. package/lib/providers/image-builders/aws-image-builder/builder.d.ts +12 -3
  30. package/lib/providers/image-builders/aws-image-builder/builder.js +43 -11
  31. package/lib/providers/image-builders/aws-image-builder/common.js +3 -3
  32. package/lib/{lambdas → providers/image-builders/aws-image-builder}/delete-ami-function.d.ts +1 -1
  33. package/lib/providers/image-builders/aws-image-builder/delete-ami-function.js +23 -0
  34. package/lib/providers/image-builders/aws-image-builder/delete-ami.lambda.js +87 -0
  35. package/lib/providers/image-builders/aws-image-builder/deprecated/ami.d.ts +0 -1
  36. package/lib/providers/image-builders/aws-image-builder/deprecated/ami.js +6 -5
  37. package/lib/providers/image-builders/aws-image-builder/deprecated/common.js +6 -1
  38. package/lib/providers/image-builders/aws-image-builder/deprecated/container.js +3 -3
  39. package/lib/providers/image-builders/aws-image-builder/deprecated/linux-components.js +2 -10
  40. package/lib/providers/image-builders/aws-image-builder/deprecated/windows-components.js +3 -16
  41. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds-function.d.ts +13 -0
  42. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds-function.js +23 -0
  43. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds.lambda.js +18 -0
  44. package/lib/providers/image-builders/aws-image-builder/versioner-function.d.ts +13 -0
  45. package/lib/providers/image-builders/aws-image-builder/versioner-function.js +23 -0
  46. package/lib/providers/image-builders/aws-image-builder/versioner.lambda.js +96 -0
  47. package/lib/providers/image-builders/codebuild-deprecated.js +3 -3
  48. package/lib/providers/image-builders/codebuild.d.ts +11 -2
  49. package/lib/providers/image-builders/codebuild.js +19 -3
  50. package/lib/providers/image-builders/components.js +1 -1
  51. package/lib/providers/image-builders/static.js +1 -1
  52. package/lib/providers/lambda.js +4 -4
  53. package/lib/{lambdas → providers}/update-lambda-function.d.ts +1 -1
  54. package/lib/providers/update-lambda-function.js +23 -0
  55. package/lib/providers/update-lambda.lambda.js +34 -0
  56. package/lib/runner.d.ts +9 -1
  57. package/lib/runner.js +24 -12
  58. package/lib/secrets.js +1 -1
  59. package/lib/{lambdas/setup-function.d.ts → setup-function.d.ts} +1 -1
  60. package/lib/setup-function.js +23 -0
  61. package/lib/setup.lambda.js +152 -0
  62. package/lib/{lambdas/status-function.d.ts → status-function.d.ts} +1 -1
  63. package/lib/status-function.js +23 -0
  64. package/lib/status.lambda.js +298 -0
  65. package/lib/{lambdas/token-retriever-function.d.ts → token-retriever-function.d.ts} +1 -1
  66. package/lib/token-retriever-function.js +23 -0
  67. package/lib/token-retriever.lambda.js +15 -0
  68. package/lib/{lambdas/webhook-handler-function.d.ts → webhook-handler-function.d.ts} +1 -1
  69. package/lib/webhook-handler-function.js +23 -0
  70. package/lib/webhook-handler.lambda.d.ts +1 -0
  71. package/lib/webhook-handler.lambda.js +116 -0
  72. package/lib/webhook.d.ts +1 -1
  73. package/lib/webhook.js +2 -2
  74. package/package.json +28 -26
  75. package/lib/lambdas/aws-image-builder-versioner-function.d.ts +0 -13
  76. package/lib/lambdas/aws-image-builder-versioner-function.js +0 -23
  77. package/lib/lambdas/aws-image-builder-versioner.lambda.js +0 -96
  78. package/lib/lambdas/build-image-function.js +0 -23
  79. package/lib/lambdas/build-image.lambda.js +0 -92
  80. package/lib/lambdas/delete-ami-function.js +0 -23
  81. package/lib/lambdas/delete-ami.lambda.js +0 -87
  82. package/lib/lambdas/delete-runner-function.js +0 -23
  83. package/lib/lambdas/delete-runner.lambda.js +0 -69
  84. package/lib/lambdas/github.js +0 -50
  85. package/lib/lambdas/helpers.js +0 -66
  86. package/lib/lambdas/setup-function.js +0 -23
  87. package/lib/lambdas/setup.lambda.js +0 -152
  88. package/lib/lambdas/status-function.js +0 -23
  89. package/lib/lambdas/status.lambda.js +0 -298
  90. package/lib/lambdas/token-retriever-function.js +0 -23
  91. package/lib/lambdas/token-retriever.lambda.js +0 -15
  92. package/lib/lambdas/update-lambda-function.js +0 -23
  93. package/lib/lambdas/update-lambda.lambda.js +0 -34
  94. package/lib/lambdas/webhook-handler-function.js +0 -23
  95. package/lib/lambdas/webhook-handler.lambda.js +0 -116
  96. /package/assets/{lambdas/setup.lambda → setup.lambda}/index.html +0 -0
  97. /package/lib/{lambdas/delete-runner.lambda.d.ts → delete-runner.lambda.d.ts} +0 -0
  98. /package/lib/{lambdas/github.d.ts → github.d.ts} +0 -0
  99. /package/lib/{lambdas/helpers.d.ts → lambda-helpers.d.ts} +0 -0
  100. /package/lib/{lambdas → providers}/build-image.lambda.d.ts +0 -0
  101. /package/lib/{lambdas → providers/image-builders/aws-image-builder}/delete-ami.lambda.d.ts +0 -0
  102. /package/lib/{lambdas/setup.lambda.d.ts → providers/image-builders/aws-image-builder/filter-failed-builds.lambda.d.ts} +0 -0
  103. /package/lib/{lambdas/aws-image-builder-versioner.lambda.d.ts → providers/image-builders/aws-image-builder/versioner.lambda.d.ts} +0 -0
  104. /package/lib/{lambdas → providers}/update-lambda.lambda.d.ts +0 -0
  105. /package/lib/{lambdas/status.lambda.d.ts → setup.lambda.d.ts} +0 -0
  106. /package/lib/{lambdas/token-retriever.lambda.d.ts → status.lambda.d.ts} +0 -0
  107. /package/lib/{lambdas/webhook-handler.lambda.d.ts → token-retriever.lambda.d.ts} +0 -0
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ const auth_app_1 = require("@octokit/auth-app");
5
+ const core_1 = require("@octokit/core");
6
+ /* eslint-disable-next-line import/no-extraneous-dependencies,import/no-unresolved */
7
+ const AWS = require("aws-sdk");
8
+ const github_1 = require("./github");
9
+ const lambda_helpers_1 = require("./lambda-helpers");
10
+ const cfn = new AWS.CloudFormation();
11
+ const ec2 = new AWS.EC2();
12
+ const ecr = new AWS.ECR();
13
+ const sf = new AWS.StepFunctions();
14
+ function secretArnToUrl(arn) {
15
+ const parts = arn.split(':'); // arn:aws:secretsmanager:us-east-1:12345678:secret:secret-name-REVISION
16
+ const region = parts[3];
17
+ const fullName = parts[6];
18
+ const name = fullName.slice(0, fullName.lastIndexOf('-'));
19
+ return `https://${region}.console.aws.amazon.com/secretsmanager/home?region=${region}#!/secret?name=${name}`;
20
+ }
21
+ function lambdaArnToUrl(arn) {
22
+ const parts = arn.split(':'); // arn:aws:lambda:us-east-1:12345678:function:name-XYZ
23
+ const region = parts[3];
24
+ const name = parts[6];
25
+ return `https://${region}.console.aws.amazon.com/lambda/home?region=${region}#/functions/${name}?tab=monitoring`;
26
+ }
27
+ function stepFunctionArnToUrl(arn) {
28
+ const parts = arn.split(':'); // arn:aws:states:us-east-1:12345678:stateMachine:name-XYZ
29
+ const region = parts[3];
30
+ return `https://${region}.console.aws.amazon.com/states/home?region=${region}#/statemachines/view/${arn}`;
31
+ }
32
+ async function generateProvidersStatus(stack, logicalId) {
33
+ const resource = await cfn.describeStackResource({ StackName: stack, LogicalResourceId: logicalId }).promise();
34
+ const providers = JSON.parse(resource.StackResourceDetail?.Metadata ?? '{}').providers;
35
+ if (!providers) {
36
+ return {};
37
+ }
38
+ return Promise.all(providers.map(async (p) => {
39
+ // add ECR data, if image is from ECR
40
+ if (p.image?.imageRepository?.match(/[0-9]+\.dkr\.ecr\.[a-z0-9\-]+\.amazonaws\.com\/.+/)) {
41
+ const tags = await ecr.describeImages({
42
+ repositoryName: p.image.imageRepository.split('/')[1],
43
+ filter: {
44
+ tagStatus: 'TAGGED',
45
+ },
46
+ maxResults: 1,
47
+ }).promise();
48
+ if (tags.imageDetails && tags.imageDetails?.length >= 1) {
49
+ p.image.latestImage = {
50
+ tags: tags.imageDetails[0].imageTags,
51
+ digest: tags.imageDetails[0].imageDigest,
52
+ date: tags.imageDetails[0].imagePushedAt,
53
+ };
54
+ }
55
+ }
56
+ // add AMI data, if image is AMI
57
+ if (p.ami?.launchTemplate) {
58
+ const versions = await ec2.describeLaunchTemplateVersions({
59
+ LaunchTemplateId: p.ami.launchTemplate,
60
+ Versions: ['$Default'],
61
+ }).promise();
62
+ if (versions.LaunchTemplateVersions && versions.LaunchTemplateVersions.length >= 1) {
63
+ p.ami.latestAmi = versions.LaunchTemplateVersions[0].LaunchTemplateData?.ImageId;
64
+ }
65
+ }
66
+ return p;
67
+ }));
68
+ }
69
+ function safeReturnValue(event, status) {
70
+ if (event.path) {
71
+ return {
72
+ statusCode: 200,
73
+ headers: {
74
+ 'Content-Type': 'application/json',
75
+ },
76
+ body: JSON.stringify(status),
77
+ };
78
+ }
79
+ return status;
80
+ }
81
+ exports.handler = async function (event) {
82
+ // confirm required environment variables
83
+ if (!process.env.WEBHOOK_SECRET_ARN || !process.env.GITHUB_SECRET_ARN || !process.env.GITHUB_PRIVATE_KEY_SECRET_ARN || !process.env.LOGICAL_ID ||
84
+ !process.env.WEBHOOK_HANDLER_ARN || !process.env.STEP_FUNCTION_ARN || !process.env.SETUP_SECRET_ARN || !process.env.SETUP_FUNCTION_URL ||
85
+ !process.env.STACK_NAME) {
86
+ throw new Error('Missing environment variables');
87
+ }
88
+ // base status
89
+ const status = {
90
+ github: {
91
+ setup: {
92
+ status: 'Unknown',
93
+ url: '',
94
+ secretArn: process.env.SETUP_SECRET_ARN,
95
+ secretUrl: secretArnToUrl(process.env.SETUP_SECRET_ARN),
96
+ },
97
+ domain: 'Unknown',
98
+ webhook: {
99
+ url: process.env.WEBHOOK_URL,
100
+ status: 'Unable to check',
101
+ secretArn: process.env.WEBHOOK_SECRET_ARN,
102
+ secretUrl: secretArnToUrl(process.env.WEBHOOK_SECRET_ARN),
103
+ },
104
+ auth: {
105
+ type: 'Unknown',
106
+ status: 'Unknown',
107
+ secretArn: process.env.GITHUB_SECRET_ARN,
108
+ secretUrl: secretArnToUrl(process.env.GITHUB_SECRET_ARN),
109
+ privateKeySecretArn: process.env.GITHUB_PRIVATE_KEY_SECRET_ARN,
110
+ privateKeySecretUrl: secretArnToUrl(process.env.GITHUB_PRIVATE_KEY_SECRET_ARN),
111
+ app: {
112
+ id: '',
113
+ url: '',
114
+ installations: [],
115
+ },
116
+ personalAuthToken: '',
117
+ },
118
+ },
119
+ providers: await generateProvidersStatus(process.env.STACK_NAME, process.env.LOGICAL_ID),
120
+ troubleshooting: {
121
+ webhookHandlerArn: process.env.WEBHOOK_HANDLER_ARN,
122
+ webhookHandlerUrl: lambdaArnToUrl(process.env.WEBHOOK_HANDLER_ARN),
123
+ stepFunctionArn: process.env.STEP_FUNCTION_ARN,
124
+ stepFunctionUrl: stepFunctionArnToUrl(process.env.STEP_FUNCTION_ARN),
125
+ stepFunctionLogGroup: process.env.STEP_FUNCTION_LOG_GROUP,
126
+ recentRuns: [],
127
+ },
128
+ };
129
+ // setup url
130
+ const setupToken = (await (0, lambda_helpers_1.getSecretJsonValue)(process.env.SETUP_SECRET_ARN)).token;
131
+ if (setupToken) {
132
+ status.github.setup.status = 'Pending';
133
+ status.github.setup.url = `${process.env.SETUP_FUNCTION_URL}?token=${setupToken}`;
134
+ }
135
+ else {
136
+ status.github.setup.status = 'Complete';
137
+ }
138
+ // list last 10 executions and their status
139
+ try {
140
+ const executions = await sf.listExecutions({
141
+ stateMachineArn: process.env.STEP_FUNCTION_ARN,
142
+ maxResults: 10,
143
+ }).promise();
144
+ for (const execution of executions.executions) {
145
+ const executionDetails = await sf.describeExecution({
146
+ executionArn: execution.executionArn,
147
+ }).promise();
148
+ const input = JSON.parse(executionDetails.input || '{}');
149
+ status.troubleshooting.recentRuns.push({
150
+ executionArn: execution.executionArn,
151
+ status: execution.status,
152
+ owner: input.owner,
153
+ repo: input.repo,
154
+ runId: input.runId,
155
+ });
156
+ }
157
+ }
158
+ catch (e) {
159
+ status.troubleshooting.recentRuns.push({ status: `Error getting executions: ${e}` });
160
+ }
161
+ // get secrets
162
+ let githubSecrets;
163
+ try {
164
+ githubSecrets = await (0, lambda_helpers_1.getSecretJsonValue)(process.env.GITHUB_SECRET_ARN);
165
+ }
166
+ catch (e) {
167
+ status.github.auth.status = `Unable to read secret: ${e}`;
168
+ return safeReturnValue(event, status);
169
+ }
170
+ let privateKey;
171
+ try {
172
+ privateKey = await (0, lambda_helpers_1.getSecretValue)(process.env.GITHUB_PRIVATE_KEY_SECRET_ARN);
173
+ }
174
+ catch (e) {
175
+ status.github.auth.status = `Unable to read private key secret: ${e}`;
176
+ return safeReturnValue(event, status);
177
+ }
178
+ // calculate base url
179
+ let baseUrl = (0, github_1.baseUrlFromDomain)(githubSecrets.domain);
180
+ status.github.domain = githubSecrets.domain;
181
+ if (githubSecrets.personalAuthToken) {
182
+ // try authenticating with personal authentication token
183
+ status.github.auth.type = 'Personal Auth Token';
184
+ status.github.auth.personalAuthToken = '*redacted*';
185
+ let octokit;
186
+ try {
187
+ octokit = new core_1.Octokit({ baseUrl, auth: githubSecrets.personalAuthToken });
188
+ }
189
+ catch (e) {
190
+ status.github.auth.status = `Unable to authenticate using personal auth token: ${e}`;
191
+ return safeReturnValue(event, status);
192
+ }
193
+ try {
194
+ const user = await octokit.request('GET /user');
195
+ status.github.auth.personalAuthToken = `username: ${user.data.login}`;
196
+ }
197
+ catch (e) {
198
+ status.github.auth.status = `Unable to call /user with personal auth token: ${e}`;
199
+ return safeReturnValue(event, status);
200
+ }
201
+ status.github.auth.status = 'OK';
202
+ status.github.webhook.status = 'Unable to verify automatically';
203
+ }
204
+ else {
205
+ // try authenticating with GitHub app
206
+ status.github.auth.type = 'GitHub App';
207
+ status.github.auth.app.id = githubSecrets.appId;
208
+ let appOctokit;
209
+ try {
210
+ appOctokit = new core_1.Octokit({
211
+ baseUrl,
212
+ authStrategy: auth_app_1.createAppAuth,
213
+ auth: {
214
+ appId: githubSecrets.appId,
215
+ privateKey: privateKey,
216
+ },
217
+ });
218
+ }
219
+ catch (e) {
220
+ status.github.auth.status = `Unable to authenticate app: ${e}`;
221
+ return safeReturnValue(event, status);
222
+ }
223
+ // get app url
224
+ try {
225
+ const app = (await appOctokit.request('GET /app')).data;
226
+ status.github.auth.app.url = app.html_url;
227
+ }
228
+ catch (e) {
229
+ status.github.auth.status = `Unable to get app details: ${e}`;
230
+ return safeReturnValue(event, status);
231
+ }
232
+ // list all app installations
233
+ try {
234
+ const installations = (await appOctokit.request('GET /app/installations')).data;
235
+ for (const installation of installations) {
236
+ let installationDetails = {
237
+ id: installation.id,
238
+ url: installation.html_url,
239
+ status: 'Unable to query',
240
+ repositories: [],
241
+ };
242
+ let token;
243
+ try {
244
+ token = (await appOctokit.auth({
245
+ type: 'installation',
246
+ installationId: installation.id,
247
+ })).token;
248
+ }
249
+ catch (e) {
250
+ installationDetails.status = `Unable to authenticate app installation: ${e}`;
251
+ continue;
252
+ }
253
+ let octokit;
254
+ try {
255
+ octokit = new core_1.Octokit({ baseUrl, auth: token });
256
+ }
257
+ catch (e) {
258
+ installationDetails.status = `Unable to authenticate using app: ${e}`;
259
+ continue;
260
+ }
261
+ try {
262
+ const repositories = (await octokit.request('GET /installation/repositories')).data.repositories;
263
+ for (const repo of repositories) {
264
+ installationDetails.repositories.push(repo.full_name);
265
+ }
266
+ }
267
+ catch (e) {
268
+ installationDetails.status = `Unable to authenticate using installation token: ${e}`;
269
+ continue;
270
+ }
271
+ installationDetails.status = 'OK';
272
+ status.github.auth.app.installations.push(installationDetails);
273
+ }
274
+ }
275
+ catch (e) {
276
+ status.github.auth.status = 'Unable to list app installations';
277
+ return safeReturnValue(event, status);
278
+ }
279
+ status.github.auth.status = 'OK';
280
+ // check webhook config
281
+ try {
282
+ const response = await appOctokit.request('GET /app/hook/config', {});
283
+ if (response.data.url !== process.env.WEBHOOK_URL) {
284
+ status.github.webhook.status = 'GitHub has wrong webhook URL configured';
285
+ }
286
+ else {
287
+ // TODO check secret by doing a dummy delivery? force apply secret?
288
+ status.github.webhook.status = 'OK (note that secret cannot be checked automatically)';
289
+ }
290
+ }
291
+ catch (e) {
292
+ status.github.webhook.status = `Unable to check app configuration: ${e}`;
293
+ return safeReturnValue(event, status);
294
+ }
295
+ }
296
+ return safeReturnValue(event, status);
297
+ };
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGF0dXMubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELGdEQUFrRDtBQUNsRCx3Q0FBd0M7QUFFeEMscUZBQXFGO0FBQ3JGLCtCQUErQjtBQUMvQixxQ0FBNkM7QUFDN0MscURBQXNFO0FBRXRFLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0FBRW5DLFNBQVMsY0FBYyxDQUFDLEdBQVc7SUFDakMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHdFQUF3RTtJQUN0RyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUUxRCxPQUFPLFdBQVcsTUFBTSxzREFBc0QsTUFBTSxrQkFBa0IsSUFBSSxFQUFFLENBQUM7QUFDL0csQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEdBQVc7SUFDakMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtJQUNwRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIs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QUMsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUNoRTtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsa0NBQWtDLENBQUM7WUFDL0QsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVqQyx1QkFBdUI7UUFDdkIsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV0RSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFO2dCQUNqRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcseUNBQXlDLENBQUM7YUFDMUU7aUJBQU07Z0JBQ0wsbUVBQW1FO2dCQUNuRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsdURBQXVELENBQUM7YUFDeEY7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLHNDQUFzQyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxPQUFPLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdkM7S0FDRjtJQUVELE9BQU8sZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IGNyZWF0ZUFwcEF1dGggfSBmcm9tICdAb2N0b2tpdC9hdXRoLWFwcCc7XG5pbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5pbXBvcnQgKiBhcyBBV1NMYW1iZGEgZnJvbSAnYXdzLWxhbWJkYSc7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLGltcG9ydC9uby11bnJlc29sdmVkICovXG5pbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG5pbXBvcnQgeyBiYXNlVXJsRnJvbURvbWFpbiB9IGZyb20gJy4vZ2l0aHViJztcbmltcG9ydCB7IGdldFNlY3JldEpzb25WYWx1ZSwgZ2V0U2VjcmV0VmFsdWUgfSBmcm9tICcuL2xhbWJkYS1oZWxwZXJzJztcblxuY29uc3QgY2ZuID0gbmV3IEFXUy5DbG91ZEZvcm1hdGlvbigpO1xuY29uc3QgZWMyID0gbmV3IEFXUy5FQzIoKTtcbmNvbnN0IGVjciA9IG5ldyBBV1MuRUNSKCk7XG5jb25zdCBzZiA9IG5ldyBBV1MuU3RlcEZ1bmN0aW9ucygpO1xuXG5mdW5jdGlvbiBzZWNyZXRBcm5Ub1VybChhcm46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IGFybi5zcGxpdCgnOicpOyAvLyBhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMToxMjM0NTY3ODpzZWNyZXQ6c2VjcmV0LW5hbWUtUkVWSVNJT05cbiAgY29uc3QgcmVnaW9uID0gcGFydHNbM107XG4gIGNvbnN0IGZ1bGxOYW1lID0gcGFydHNbNl07XG4gIGNvbnN0IG5hbWUgPSBmdWxsTmFtZS5zbGljZSgwLCBmdWxsTmFtZS5sYXN0SW5kZXhPZignLScpKTtcblxuICByZXR1cm4gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vc2VjcmV0c21hbmFnZXIvaG9tZT9yZWdpb249JHtyZWdpb259IyEvc2VjcmV0P25hbWU9JHtuYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGxhbWJkYUFyblRvVXJsKGFybjogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gYXJuLnNwbGl0KCc6Jyk7IC8vIGFybjphd3M6bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODpmdW5jdGlvbjpuYW1lLVhZWlxuICBjb25zdCByZWdpb24gPSBwYXJ0c1szXTtcbiAgY29uc3QgbmFtZSA9IHBhcnRzWzZdO1xuXG4gIHJldHVybiBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9sYW1iZGEvaG9tZT9yZWdpb249JHtyZWdpb259Iy9mdW5jdGlvbnMvJHtuYW1lfT90YWI9bW9uaXRvcmluZ2A7XG59XG5cbmZ1bmN0aW9uIHN0ZXBGdW5jdGlvbkFyblRvVXJsKGFybjogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gYXJuLnNwbGl0KCc6Jyk7IC8vIGFybjphd3M6c3RhdGVzOnVzLWVhc3QtMToxMjM0NTY3ODpzdGF0ZU1hY2hpbmU6bmFtZS1YWVpcbiAgY29uc3QgcmVnaW9uID0gcGFydHNbM107XG5cbiAgcmV0dXJuIGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL3N0YXRlcy9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jL3N0YXRlbWFjaGluZXMvdmlldy8ke2Fybn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByb3ZpZGVyc1N0YXR1cyhzdGFjazogc3RyaW5nLCBsb2dpY2FsSWQ6IHN0cmluZykge1xuICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IGNmbi5kZXNjcmliZVN0YWNrUmVzb3VyY2UoeyBTdGFja05hbWU6IHN0YWNrLCBMb2dpY2FsUmVzb3VyY2VJZDogbG9naWNhbElkIH0pLnByb21pc2UoKTtcbiAgY29uc3QgcHJvdmlkZXJzID0gSlNPTi5wYXJzZShyZXNvdXJjZS5TdGFja1Jlc291cmNlRGV0YWlsPy5NZXRhZGF0YSA/PyAne30nKS5wcm92aWRlcnMgYXMgYW55W10gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCFwcm92aWRlcnMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvdmlkZXJzLm1hcChhc3luYyAocCkgPT4ge1xuICAgIC8vIGFkZCBFQ1IgZGF0YSwgaWYgaW1hZ2UgaXMgZnJvbSBFQ1JcbiAgICBpZiAocC5pbWFnZT8uaW1hZ2VSZXBvc2l0b3J5Py5tYXRjaCgvWzAtOV0rXFwuZGtyXFwuZWNyXFwuW2EtejAtOVxcLV0rXFwuYW1hem9uYXdzXFwuY29tXFwvLisvKSkge1xuICAgICAgY29uc3QgdGFncyA9IGF3YWl0IGVjci5kZXNjcmliZUltYWdlcyh7XG4gICAgICAgIHJlcG9zaXRvcnlOYW1lOiBwLmltYWdlLmltYWdlUmVwb3NpdG9yeS5zcGxpdCgnLycpWzFdLFxuICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICB0YWdTdGF0dXM6ICdUQUdHRUQnLFxuICAgICAgICB9LFxuICAgICAgICBtYXhSZXN1bHRzOiAxLFxuICAgICAgfSkucHJvbWlzZSgpO1xuICAgICAgaWYgKHRhZ3MuaW1hZ2VEZXRhaWxzICYmIHRhZ3MuaW1hZ2VEZXRhaWxzPy5sZW5ndGggPj0gMSkge1xuICAgICAgICBwLmltYWdlLmxhdGVzdEltYWdlID0ge1xuICAgICAgICAgIHRhZ3M6IHRhZ3MuaW1hZ2VEZXRhaWxzWzBdLmltYWdlVGFncyxcbiAgICAgICAgICBkaWdlc3Q6IHRhZ3MuaW1hZ2VEZXRhaWxzWzBdLmltYWdlRGlnZXN0LFxuICAgICAgICAgIGRhdGU6IHRhZ3MuaW1hZ2VEZXRhaWxzWzBdLmltYWdlUHVzaGVkQXQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGFkZCBBTUkgZGF0YSwgaWYgaW1hZ2UgaXMgQU1JXG4gICAgaWYgKHAuYW1pPy5sYXVuY2hUZW1wbGF0ZSkge1xuICAgICAgY29uc3QgdmVyc2lvbnMgPSBhd2FpdCBlYzIuZGVzY3JpYmVMYXVuY2hUZW1wbGF0ZVZlcnNpb25zKHtcbiAgICAgICAgTGF1bmNoVGVtcGxhdGVJZDogcC5hbWkubGF1bmNoVGVtcGxhdGUsXG4gICAgICAgIFZlcnNpb25zOiBbJyREZWZhdWx0J10sXG4gICAgICB9KS5wcm9taXNlKCk7XG4gICAgICBpZiAodmVyc2lvbnMuTGF1bmNoVGVtcGxhdGVWZXJzaW9ucyAmJiB2ZXJzaW9ucy5MYXVuY2hUZW1wbGF0ZVZlcnNpb25zLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIHAuYW1pLmxhdGVzdEFtaSA9IHZlcnNpb25zLkxhdW5jaFRlbXBsYXRlVmVyc2lvbnNbMF0uTGF1bmNoVGVtcGxhdGVEYXRhPy5JbWFnZUlkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkpO1xufVxuXG5pbnRlcmZhY2UgQXBwSW5zdGFsbGF0aW9uIHtcbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXR1czogc3RyaW5nO1xuICByZWFkb25seSByZXBvc2l0b3JpZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUmVjZW50UnVuIHtcbiAgcmVhZG9ubHkgb3duZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcG8/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bklkPzogc3RyaW5nO1xuICByZWFkb25seSBleGVjdXRpb25Bcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXR1czogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBzYWZlUmV0dXJuVmFsdWUoZXZlbnQ6IFBhcnRpYWw8QVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUV2ZW50Piwgc3RhdHVzOiBhbnkpIHtcbiAgaWYgKGV2ZW50LnBhdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHN0YXR1cyksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzdGF0dXM7XG59XG5cbmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudDogUGFydGlhbDxBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5RXZlbnQ+KSB7XG4gIC8vIGNvbmZpcm0gcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmICghcHJvY2Vzcy5lbnYuV0VCSE9PS19TRUNSRVRfQVJOIHx8ICFwcm9jZXNzLmVudi5HSVRIVUJfU0VDUkVUX0FSTiB8fCAhcHJvY2Vzcy5lbnYuR0lUSFVCX1BSSVZBVEVfS0VZX1NFQ1JFVF9BUk4gfHwgIXByb2Nlc3MuZW52LkxPR0lDQUxfSUQgfHxcbiAgICAgICFwcm9jZXNzLmVudi5XRUJIT09LX0hBTkRMRVJfQVJOIHx8ICFwcm9jZXNzLmVudi5TVEVQX0ZVTkNUSU9OX0FSTiB8fCAhcHJvY2Vzcy5lbnYuU0VUVVBfU0VDUkVUX0FSTiB8fCAhcHJvY2Vzcy5lbnYuU0VUVVBfRlVOQ1RJT05fVVJMIHx8XG4gICAgICAhcHJvY2Vzcy5lbnYuU1RBQ0tfTkFNRSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgfVxuXG4gIC8vIGJhc2Ugc3RhdHVzXG4gIGNvbnN0IHN0YXR1cyA9IHtcbiAgICBnaXRodWI6IHtcbiAgICAgIHNldHVwOiB7XG4gICAgICAgIHN0YXR1czogJ1Vua25vd24nLFxuICAgICAgICB1cmw6ICcnLFxuICAgICAgICBzZWNyZXRBcm46IHByb2Nlc3MuZW52LlNFVFVQX1NFQ1JFVF9BUk4sXG4gICAgICAgIHNlY3JldFVybDogc2VjcmV0QXJuVG9VcmwocHJvY2Vzcy5lbnYuU0VUVVBfU0VDUkVUX0FSTiksXG4gICAgICB9LFxuICAgICAgZG9tYWluOiAnVW5rbm93bicsXG4gICAgICB3ZWJob29rOiB7XG4gICAgICAgIHVybDogcHJvY2Vzcy5lbnYuV0VCSE9PS19VUkwsXG4gICAgICAgIHN0YXR1czogJ1VuYWJsZSB0byBjaGVjaycsXG4gICAgICAgIHNlY3JldEFybjogcHJvY2Vzcy5lbnYuV0VCSE9PS19TRUNSRVRfQVJOLFxuICAgICAgICBzZWNyZXRVcmw6IHNlY3JldEFyblRvVXJsKHByb2Nlc3MuZW52LldFQkhPT0tfU0VDUkVUX0FSTiksXG4gICAgICB9LFxuICAgICAgYXV0aDoge1xuICAgICAgICB0eXBlOiAnVW5rbm93bicsXG4gICAgICAgIHN0YXR1czogJ1Vua25vd24nLFxuICAgICAgICBzZWNyZXRBcm46IHByb2Nlc3MuZW52LkdJVEhVQl9TRUNSRVRfQVJOLFxuICAgICAgICBzZWNyZXRVcmw6IHNlY3JldEFyblRvVXJsKHByb2Nlc3MuZW52LkdJVEhVQl9TRUNSRVRfQVJOKSxcbiAgICAgICAgcHJpdmF0ZUtleVNlY3JldEFybjogcHJvY2Vzcy5lbnYuR0lUSFVCX1BSSVZBVEVfS0VZX1NFQ1JFVF9BUk4sXG4gICAgICAgIHByaXZhdGVLZXlTZWNyZXRVcmw6IHNlY3JldEFyblRvVXJsKHByb2Nlc3MuZW52LkdJVEhVQl9QUklWQVRFX0tFWV9TRUNSRVRfQVJOKSxcbiAgICAgICAgYXBwOiB7XG4gICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgIHVybDogJycsXG4gICAgICAgICAgaW5zdGFsbGF0aW9uczogW10gYXMgQXBwSW5zdGFsbGF0aW9uW10sXG4gICAgICAgIH0sXG4gICAgICAgIHBlcnNvbmFsQXV0aFRva2VuOiAnJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IGF3YWl0IGdlbmVyYXRlUHJvdmlkZXJzU3RhdHVzKHByb2Nlc3MuZW52LlNUQUNLX05BTUUsIHByb2Nlc3MuZW52LkxPR0lDQUxfSUQpLFxuICAgIHRyb3VibGVzaG9vdGluZzoge1xuICAgICAgd2ViaG9va0hhbmRsZXJBcm46IHByb2Nlc3MuZW52LldFQkhPT0tfSEFORExFUl9BUk4sXG4gICAgICB3ZWJob29rSGFuZGxlclVybDogbGFtYmRhQXJuVG9VcmwocHJvY2Vzcy5lbnYuV0VCSE9PS19IQU5ETEVSX0FSTiksXG4gICAgICBzdGVwRnVuY3Rpb25Bcm46IHByb2Nlc3MuZW52LlNURVBfRlVOQ1RJT05fQVJOLFxuICAgICAgc3RlcEZ1bmN0aW9uVXJsOiBzdGVwRnVuY3Rpb25Bcm5Ub1VybChwcm9jZXNzLmVudi5TVEVQX0ZVTkNUSU9OX0FSTiksXG4gICAgICBzdGVwRnVuY3Rpb25Mb2dHcm91cDogcHJvY2Vzcy5lbnYuU1RFUF9GVU5DVElPTl9MT0dfR1JPVVAsXG4gICAgICByZWNlbnRSdW5zOiBbXSBhcyBSZWNlbnRSdW5bXSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIHNldHVwIHVybFxuICBjb25zdCBzZXR1cFRva2VuID0gKGF3YWl0IGdldFNlY3JldEpzb25WYWx1ZShwcm9jZXNzLmVudi5TRVRVUF9TRUNSRVRfQVJOKSkudG9rZW47XG4gIGlmIChzZXR1cFRva2VuKSB7XG4gICAgc3RhdHVzLmdpdGh1Yi5zZXR1cC5zdGF0dXMgPSAnUGVuZGluZyc7XG4gICAgc3RhdHVzLmdpdGh1Yi5zZXR1cC51cmwgPSBgJHtwcm9jZXNzLmVudi5TRVRVUF9GVU5DVElPTl9VUkx9P3Rva2VuPSR7c2V0dXBUb2tlbn1gO1xuICB9IGVsc2Uge1xuICAgIHN0YXR1cy5naXRodWIuc2V0dXAuc3RhdHVzID0gJ0NvbXBsZXRlJztcbiAgfVxuXG4gIC8vIGxpc3QgbGFzdCAxMCBleGVjdXRpb25zIGFuZCB0aGVpciBzdGF0dXNcbiAgdHJ5IHtcbiAgICBjb25zdCBleGVjdXRpb25zID0gYXdhaXQgc2YubGlzdEV4ZWN1dGlvbnMoe1xuICAgICAgc3RhdGVNYWNoaW5lQXJuOiBwcm9jZXNzLmVudi5TVEVQX0ZVTkNUSU9OX0FSTixcbiAgICAgIG1heFJlc3VsdHM6IDEwLFxuICAgIH0pLnByb21pc2UoKTtcbiAgICBmb3IgKGNvbnN0IGV4ZWN1dGlvbiBvZiBleGVjdXRpb25zLmV4ZWN1dGlvbnMpIHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkRldGFpbHMgPSBhd2FpdCBzZi5kZXNjcmliZUV4ZWN1dGlvbih7XG4gICAgICAgIGV4ZWN1dGlvbkFybjogZXhlY3V0aW9uLmV4ZWN1dGlvbkFybixcbiAgICAgIH0pLnByb21pc2UoKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gSlNPTi5wYXJzZShleGVjdXRpb25EZXRhaWxzLmlucHV0IHx8ICd7fScpO1xuXG4gICAgICBzdGF0dXMudHJvdWJsZXNob290aW5nLnJlY2VudFJ1bnMucHVzaCh7XG4gICAgICAgIGV4ZWN1dGlvbkFybjogZXhlY3V0aW9uLmV4ZWN1dGlvbkFybixcbiAgICAgICAgc3RhdHVzOiBleGVjdXRpb24uc3RhdHVzLFxuICAgICAgICBvd25lcjogaW5wdXQub3duZXIsXG4gICAgICAgIHJlcG86IGlucHV0LnJlcG8sXG4gICAgICAgIHJ1bklkOiBpbnB1dC5ydW5JZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHN0YXR1cy50cm91Ymxlc2hvb3RpbmcucmVjZW50UnVucy5wdXNoKHsgc3RhdHVzOiBgRXJyb3IgZ2V0dGluZyBleGVjdXRpb25zOiAke2V9YCB9KTtcbiAgfVxuXG4gIC8vIGdldCBzZWNyZXRzXG4gIGxldCBnaXRodWJTZWNyZXRzO1xuICB0cnkge1xuICAgIGdpdGh1YlNlY3JldHMgPSBhd2FpdCBnZXRTZWNyZXRKc29uVmFsdWUocHJvY2Vzcy5lbnYuR0lUSFVCX1NFQ1JFVF9BUk4pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnN0YXR1cyA9IGBVbmFibGUgdG8gcmVhZCBzZWNyZXQ6ICR7ZX1gO1xuICAgIHJldHVybiBzYWZlUmV0dXJuVmFsdWUoZXZlbnQsIHN0YXR1cyk7XG4gIH1cblxuICBsZXQgcHJpdmF0ZUtleTtcbiAgdHJ5IHtcbiAgICBwcml2YXRlS2V5ID0gYXdhaXQgZ2V0U2VjcmV0VmFsdWUocHJvY2Vzcy5lbnYuR0lUSFVCX1BSSVZBVEVfS0VZX1NFQ1JFVF9BUk4pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnN0YXR1cyA9IGBVbmFibGUgdG8gcmVhZCBwcml2YXRlIGtleSBzZWNyZXQ6ICR7ZX1gO1xuICAgIHJldHVybiBzYWZlUmV0dXJuVmFsdWUoZXZlbnQsIHN0YXR1cyk7XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgYmFzZSB1cmxcbiAgbGV0IGJhc2VVcmwgPSBiYXNlVXJsRnJvbURvbWFpbihnaXRodWJTZWNyZXRzLmRvbWFpbik7XG4gIHN0YXR1cy5naXRodWIuZG9tYWluID0gZ2l0aHViU2VjcmV0cy5kb21haW47XG5cbiAgaWYgKGdpdGh1YlNlY3JldHMucGVyc29uYWxBdXRoVG9rZW4pIHtcbiAgICAvLyB0cnkgYXV0aGVudGljYXRpbmcgd2l0aCBwZXJzb25hbCBhdXRoZW50aWNhdGlvbiB0b2tlblxuICAgIHN0YXR1cy5naXRodWIuYXV0aC50eXBlID0gJ1BlcnNvbmFsIEF1dGggVG9rZW4nO1xuICAgIHN0YXR1cy5naXRodWIuYXV0aC5wZXJzb25hbEF1dGhUb2tlbiA9ICcqcmVkYWN0ZWQqJztcblxuICAgIGxldCBvY3Rva2l0O1xuICAgIHRyeSB7XG4gICAgICBvY3Rva2l0ID0gbmV3IE9jdG9raXQoeyBiYXNlVXJsLCBhdXRoOiBnaXRodWJTZWNyZXRzLnBlcnNvbmFsQXV0aFRva2VuIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSBgVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSB1c2luZyBwZXJzb25hbCBhdXRoIHRva2VuOiAke2V9YDtcbiAgICAgIHJldHVybiBzYWZlUmV0dXJuVmFsdWUoZXZlbnQsIHN0YXR1cyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvdXNlcicpO1xuICAgICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnBlcnNvbmFsQXV0aFRva2VuID0gYHVzZXJuYW1lOiAke3VzZXIuZGF0YS5sb2dpbn1gO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSBgVW5hYmxlIHRvIGNhbGwgL3VzZXIgd2l0aCBwZXJzb25hbCBhdXRoIHRva2VuOiAke2V9YDtcbiAgICAgIHJldHVybiBzYWZlUmV0dXJuVmFsdWUoZXZlbnQsIHN0YXR1cyk7XG4gICAgfVxuXG4gICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnN0YXR1cyA9ICdPSyc7XG4gICAgc3RhdHVzLmdpdGh1Yi53ZWJob29rLnN0YXR1cyA9ICdVbmFibGUgdG8gdmVyaWZ5IGF1dG9tYXRpY2FsbHknO1xuICB9IGVsc2Uge1xuICAgIC8vIHRyeSBhdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBhcHBcbiAgICBzdGF0dXMuZ2l0aHViLmF1dGgudHlwZSA9ICdHaXRIdWIgQXBwJztcbiAgICBzdGF0dXMuZ2l0aHViLmF1dGguYXBwLmlkID0gZ2l0aHViU2VjcmV0cy5hcHBJZDtcblxuICAgIGxldCBhcHBPY3Rva2l0O1xuICAgIHRyeSB7XG4gICAgICBhcHBPY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgICAgICBiYXNlVXJsLFxuICAgICAgICBhdXRoU3RyYXRlZ3k6IGNyZWF0ZUFwcEF1dGgsXG4gICAgICAgIGF1dGg6IHtcbiAgICAgICAgICBhcHBJZDogZ2l0aHViU2VjcmV0cy5hcHBJZCxcbiAgICAgICAgICBwcml2YXRlS2V5OiBwcml2YXRlS2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnN0YXR1cyA9IGBVbmFibGUgdG8gYXV0aGVudGljYXRlIGFwcDogJHtlfWA7XG4gICAgICByZXR1cm4gc2FmZVJldHVyblZhbHVlKGV2ZW50LCBzdGF0dXMpO1xuICAgIH1cblxuICAgIC8vIGdldCBhcHAgdXJsXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFwcCA9IChhd2FpdCBhcHBPY3Rva2l0LnJlcXVlc3QoJ0dFVCAvYXBwJykpLmRhdGE7XG4gICAgICBzdGF0dXMuZ2l0aHViLmF1dGguYXBwLnVybCA9IGFwcC5odG1sX3VybDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXMuZ2l0aHViLmF1dGguc3RhdHVzID0gYFVuYWJsZSB0byBnZXQgYXBwIGRldGFpbHM6ICR7ZX1gO1xuICAgICAgcmV0dXJuIHNhZmVSZXR1cm5WYWx1ZShldmVudCwgc3RhdHVzKTtcbiAgICB9XG5cbiAgICAvLyBsaXN0IGFsbCBhcHAgaW5zdGFsbGF0aW9uc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnN0YWxsYXRpb25zID0gKGF3YWl0IGFwcE9jdG9raXQucmVxdWVzdCgnR0VUIC9hcHAvaW5zdGFsbGF0aW9ucycpKS5kYXRhO1xuICAgICAgZm9yIChjb25zdCBpbnN0YWxsYXRpb24gb2YgaW5zdGFsbGF0aW9ucykge1xuICAgICAgICBsZXQgaW5zdGFsbGF0aW9uRGV0YWlscyA9IHtcbiAgICAgICAgICBpZDogaW5zdGFsbGF0aW9uLmlkLFxuICAgICAgICAgIHVybDogaW5zdGFsbGF0aW9uLmh0bWxfdXJsLFxuICAgICAgICAgIHN0YXR1czogJ1VuYWJsZSB0byBxdWVyeScsXG4gICAgICAgICAgcmVwb3NpdG9yaWVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgdG9rZW47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9rZW4gPSAoYXdhaXQgYXBwT2N0b2tpdC5hdXRoKHtcbiAgICAgICAgICAgIHR5cGU6ICdpbnN0YWxsYXRpb24nLFxuICAgICAgICAgICAgaW5zdGFsbGF0aW9uSWQ6IGluc3RhbGxhdGlvbi5pZCxcbiAgICAgICAgICB9KSBhcyBhbnkpLnRva2VuO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaW5zdGFsbGF0aW9uRGV0YWlscy5zdGF0dXMgPSBgVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBhcHAgaW5zdGFsbGF0aW9uOiAke2V9YDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvY3Rva2l0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7IGJhc2VVcmwsIGF1dGg6IHRva2VuIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaW5zdGFsbGF0aW9uRGV0YWlscy5zdGF0dXMgPSBgVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSB1c2luZyBhcHA6ICR7ZX1gO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXBvc2l0b3JpZXMgPSAoYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL2luc3RhbGxhdGlvbi9yZXBvc2l0b3JpZXMnKSkuZGF0YS5yZXBvc2l0b3JpZXM7XG4gICAgICAgICAgZm9yIChjb25zdCByZXBvIG9mIHJlcG9zaXRvcmllcykge1xuICAgICAgICAgICAgaW5zdGFsbGF0aW9uRGV0YWlscy5yZXBvc2l0b3JpZXMucHVzaChyZXBvLmZ1bGxfbmFtZSBhcyBzdHJpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGluc3RhbGxhdGlvbkRldGFpbHMuc3RhdHVzID0gYFVuYWJsZSB0byBhdXRoZW50aWNhdGUgdXNpbmcgaW5zdGFsbGF0aW9uIHRva2VuOiAke2V9YDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3RhbGxhdGlvbkRldGFpbHMuc3RhdHVzID0gJ09LJztcbiAgICAgICAgc3RhdHVzLmdpdGh1Yi5hdXRoLmFwcC5pbnN0YWxsYXRpb25zLnB1c2goaW5zdGFsbGF0aW9uRGV0YWlscyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnN0YXR1cyA9ICdVbmFibGUgdG8gbGlzdCBhcHAgaW5zdGFsbGF0aW9ucyc7XG4gICAgICByZXR1cm4gc2FmZVJldHVyblZhbHVlKGV2ZW50LCBzdGF0dXMpO1xuICAgIH1cblxuICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSAnT0snO1xuXG4gICAgLy8gY2hlY2sgd2ViaG9vayBjb25maWdcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcHBPY3Rva2l0LnJlcXVlc3QoJ0dFVCAvYXBwL2hvb2svY29uZmlnJywge30pO1xuXG4gICAgICBpZiAocmVzcG9uc2UuZGF0YS51cmwgIT09IHByb2Nlc3MuZW52LldFQkhPT0tfVVJMKSB7XG4gICAgICAgIHN0YXR1cy5naXRodWIud2ViaG9vay5zdGF0dXMgPSAnR2l0SHViIGhhcyB3cm9uZyB3ZWJob29rIFVSTCBjb25maWd1cmVkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE8gY2hlY2sgc2VjcmV0IGJ5IGRvaW5nIGEgZHVtbXkgZGVsaXZlcnk/IGZvcmNlIGFwcGx5IHNlY3JldD9cbiAgICAgICAgc3RhdHVzLmdpdGh1Yi53ZWJob29rLnN0YXR1cyA9ICdPSyAobm90ZSB0aGF0IHNlY3JldCBjYW5ub3QgYmUgY2hlY2tlZCBhdXRvbWF0aWNhbGx5KSc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RhdHVzLmdpdGh1Yi53ZWJob29rLnN0YXR1cyA9IGBVbmFibGUgdG8gY2hlY2sgYXBwIGNvbmZpZ3VyYXRpb246ICR7ZX1gO1xuICAgICAgcmV0dXJuIHNhZmVSZXR1cm5WYWx1ZShldmVudCwgc3RhdHVzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2FmZVJldHVyblZhbHVlKGV2ZW50LCBzdGF0dXMpO1xufTtcbiJdfQ==
@@ -6,7 +6,7 @@ import { Construct } from 'constructs';
6
6
  export interface TokenRetrieverFunctionProps extends lambda.FunctionOptions {
7
7
  }
8
8
  /**
9
- * An AWS Lambda function which executes src/lambdas/token-retriever.
9
+ * An AWS Lambda function which executes src/token-retriever.
10
10
  */
11
11
  export declare class TokenRetrieverFunction extends lambda.Function {
12
12
  constructor(scope: Construct, id: string, props?: TokenRetrieverFunctionProps);
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TokenRetrieverFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/token-retriever.
9
+ */
10
+ class TokenRetrieverFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/token-retriever.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs16.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../assets/token-retriever.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.TokenRetrieverFunction = TokenRetrieverFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV0cmlldmVyLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rva2VuLXJldHJpZXZlci1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2RUFBNkU7QUFDN0UsNkJBQTZCO0FBQzdCLGlEQUFpRDtBQVNqRDs7R0FFRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDekQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFtQztRQUMzRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSwrQkFBK0I7WUFDNUMsR0FBRyxLQUFLO1lBQ1IsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDdEUsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7U0FDdEYsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDO0NBQ0Y7QUFYRCx3REFXQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMuanMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgVG9rZW5SZXRyaWV2ZXJGdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmV0cmlldmVyRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbk9wdGlvbnMge1xufVxuXG4vKipcbiAqIEFuIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2ggZXhlY3V0ZXMgc3JjL3Rva2VuLXJldHJpZXZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFRva2VuUmV0cmlldmVyRnVuY3Rpb24gZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFRva2VuUmV0cmlldmVyRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzcmMvdG9rZW4tcmV0cmlldmVyLmxhbWJkYS50cycsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJ1bnRpbWU6IG5ldyBsYW1iZGEuUnVudGltZSgnbm9kZWpzMTYueCcsIGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2Fzc2V0cy90b2tlbi1yZXRyaWV2ZXIubGFtYmRhJykpLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoJ0FXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEJywgJzEnLCB7IHJlbW92ZUluRWRnZTogdHJ1ZSB9KTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const github_1 = require("./github");
4
+ exports.handler = async function (event) {
5
+ const { githubSecrets, octokit } = await (0, github_1.getOctokit)(event.installationId);
6
+ const response = await octokit.rest.actions.createRegistrationTokenForRepo({
7
+ owner: event.owner,
8
+ repo: event.repo,
9
+ });
10
+ return {
11
+ domain: githubSecrets.domain,
12
+ token: response.data.token,
13
+ };
14
+ };
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV0cmlldmVyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90b2tlbi1yZXRyaWV2ZXIubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscUNBQXNDO0FBR3RDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxXQUFXLEtBQThCO0lBQzlELE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFBLG1CQUFVLEVBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTFFLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUM7UUFDekUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtLQUNqQixDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNO1FBQzVCLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUs7S0FDM0IsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuL2dpdGh1Yic7XG5pbXBvcnQgeyBTdGVwRnVuY3Rpb25MYW1iZGFJbnB1dCB9IGZyb20gJy4vbGFtYmRhLWhlbHBlcnMnO1xuXG5leHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQ6IFN0ZXBGdW5jdGlvbkxhbWJkYUlucHV0KSB7XG4gIGNvbnN0IHsgZ2l0aHViU2VjcmV0cywgb2N0b2tpdCB9ID0gYXdhaXQgZ2V0T2N0b2tpdChldmVudC5pbnN0YWxsYXRpb25JZCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlc3QuYWN0aW9ucy5jcmVhdGVSZWdpc3RyYXRpb25Ub2tlbkZvclJlcG8oe1xuICAgIG93bmVyOiBldmVudC5vd25lcixcbiAgICByZXBvOiBldmVudC5yZXBvLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGRvbWFpbjogZ2l0aHViU2VjcmV0cy5kb21haW4sXG4gICAgdG9rZW46IHJlc3BvbnNlLmRhdGEudG9rZW4sXG4gIH07XG59O1xuIl19
@@ -6,7 +6,7 @@ import { Construct } from 'constructs';
6
6
  export interface WebhookHandlerFunctionProps extends lambda.FunctionOptions {
7
7
  }
8
8
  /**
9
- * An AWS Lambda function which executes src/lambdas/webhook-handler.
9
+ * An AWS Lambda function which executes src/webhook-handler.
10
10
  */
11
11
  export declare class WebhookHandlerFunction extends lambda.Function {
12
12
  constructor(scope: Construct, id: string, props?: WebhookHandlerFunctionProps);
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebhookHandlerFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/webhook-handler.
9
+ */
10
+ class WebhookHandlerFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/webhook-handler.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs16.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../assets/webhook-handler.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.WebhookHandlerFunction = WebhookHandlerFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay1oYW5kbGVyLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYmhvb2staGFuZGxlci1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2RUFBNkU7QUFDN0UsNkJBQTZCO0FBQzdCLGlEQUFpRDtBQVNqRDs7R0FFRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDekQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFtQztRQUMzRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSwrQkFBK0I7WUFDNUMsR0FBRyxLQUFLO1lBQ1IsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDdEUsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7U0FDdEYsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDO0NBQ0Y7QUFYRCx3REFXQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMuanMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgV2ViaG9va0hhbmRsZXJGdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYmhvb2tIYW5kbGVyRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbk9wdGlvbnMge1xufVxuXG4vKipcbiAqIEFuIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2ggZXhlY3V0ZXMgc3JjL3dlYmhvb2staGFuZGxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYmhvb2tIYW5kbGVyRnVuY3Rpb24gZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFdlYmhvb2tIYW5kbGVyRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzcmMvd2ViaG9vay1oYW5kbGVyLmxhbWJkYS50cycsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJ1bnRpbWU6IG5ldyBsYW1iZGEuUnVudGltZSgnbm9kZWpzMTYueCcsIGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2Fzc2V0cy93ZWJob29rLWhhbmRsZXIubGFtYmRhJykpLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoJ0FXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEJywgJzEnLCB7IHJlbW92ZUluRWRnZTogdHJ1ZSB9KTtcbiAgfVxufSJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ const crypto = require("crypto");
5
+ const AWS = require("aws-sdk");
6
+ const lambda_helpers_1 = require("./lambda-helpers");
7
+ const sf = new AWS.StepFunctions();
8
+ // TODO use @octokit/webhooks?
9
+ function getHeader(event, header) {
10
+ // API Gateway doesn't lowercase headers (V1 event) but Lambda URLs do (V2 event) :(
11
+ for (const headerName of Object.keys(event.headers)) {
12
+ if (headerName.toLowerCase() === header.toLowerCase()) {
13
+ return event.headers[headerName];
14
+ }
15
+ }
16
+ return undefined;
17
+ }
18
+ function verifyBody(event, secret) {
19
+ const sig = Buffer.from(getHeader(event, 'x-hub-signature-256') || '', 'utf8');
20
+ if (!event.body) {
21
+ throw new Error('No body');
22
+ }
23
+ let body;
24
+ if (event.isBase64Encoded) {
25
+ body = Buffer.from(event.body, 'base64');
26
+ }
27
+ else {
28
+ body = Buffer.from(event.body || '', 'utf8');
29
+ }
30
+ const hmac = crypto.createHmac('sha256', secret);
31
+ hmac.update(body);
32
+ const expectedSig = Buffer.from(`sha256=${hmac.digest('hex')}`, 'utf8');
33
+ console.log('Calculated signature: ', expectedSig.toString());
34
+ if (sig.length !== expectedSig.length || !crypto.timingSafeEqual(sig, expectedSig)) {
35
+ throw new Error(`Signature mismatch. Expected ${expectedSig.toString()} but got ${sig.toString()}`);
36
+ }
37
+ return body.toString();
38
+ }
39
+ exports.handler = async function (event) {
40
+ if (!process.env.WEBHOOK_SECRET_ARN || !process.env.STEP_FUNCTION_ARN) {
41
+ throw new Error('Missing environment variables');
42
+ }
43
+ const webhookSecret = (await (0, lambda_helpers_1.getSecretJsonValue)(process.env.WEBHOOK_SECRET_ARN)).webhookSecret;
44
+ let body;
45
+ try {
46
+ body = verifyBody(event, webhookSecret);
47
+ }
48
+ catch (e) {
49
+ console.error(e);
50
+ return {
51
+ statusCode: 403,
52
+ body: 'Bad signature',
53
+ };
54
+ }
55
+ if (getHeader(event, 'content-type') !== 'application/json') {
56
+ console.error(`This webhook only accepts JSON payloads, got ${getHeader(event, 'content-type')}`);
57
+ return {
58
+ statusCode: 400,
59
+ body: 'Expecting JSON payload',
60
+ };
61
+ }
62
+ if (getHeader(event, 'x-github-event') === 'ping') {
63
+ return {
64
+ statusCode: 200,
65
+ body: 'Pong',
66
+ };
67
+ }
68
+ // if (getHeader(event, 'x-github-event') !== 'workflow_job' && getHeader(event, 'x-github-event') !== 'workflow_run') {
69
+ // console.error(`This webhook only accepts workflow_job and workflow_run, got ${getHeader(event, 'x-github-event')}`);
70
+ if (getHeader(event, 'x-github-event') !== 'workflow_job') {
71
+ console.error(`This webhook only accepts workflow_job, got ${getHeader(event, 'x-github-event')}`);
72
+ return {
73
+ statusCode: 400,
74
+ body: 'Expecting workflow_job',
75
+ };
76
+ }
77
+ const payload = JSON.parse(body);
78
+ if (payload.action !== 'queued') {
79
+ console.log(`Ignoring action "${payload.action}", expecting "queued"`);
80
+ return {
81
+ statusCode: 200,
82
+ body: 'OK. No runner started.',
83
+ };
84
+ }
85
+ if (!payload.workflow_job.labels.includes('self-hosted')) {
86
+ console.log(`Ignoring labels "${payload.workflow_job.labels}", expecting "self-hosted"`);
87
+ return {
88
+ statusCode: 200,
89
+ body: 'OK. No runner started.',
90
+ };
91
+ }
92
+ // it's easier to deal with maps in step functions
93
+ let labels = {};
94
+ payload.workflow_job.labels.forEach((l) => labels[l.toLowerCase()] = true);
95
+ // set execution name which is also used as runner name which are limited to 64 characters
96
+ let executionName = `${payload.repository.full_name.replace('/', '-')}-${getHeader(event, 'x-github-delivery')}`.slice(0, 64);
97
+ // start execution
98
+ const execution = await sf.startExecution({
99
+ stateMachineArn: process.env.STEP_FUNCTION_ARN,
100
+ input: JSON.stringify({
101
+ owner: payload.repository.owner.login,
102
+ repo: payload.repository.name,
103
+ runId: payload.workflow_job.run_id,
104
+ installationId: payload.installation?.id,
105
+ labels: labels,
106
+ }),
107
+ // name is not random so multiple execution of this webhook won't cause multiple builders to start
108
+ name: executionName,
109
+ }).promise();
110
+ console.log(`Started ${execution.executionArn}`);
111
+ return {
112
+ statusCode: 202,
113
+ body: executionName,
114
+ };
115
+ };
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay1oYW5kbGVyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJob29rLWhhbmRsZXIubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELGlDQUFpQztBQUdqQywrQkFBK0I7QUFDL0IscURBQXNEO0FBRXRELE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0FBRW5DLDhCQUE4QjtBQUU5QixTQUFTLFNBQVMsQ0FBQyxLQUF1QyxFQUFFLE1BQWM7SUFDeEUsb0ZBQW9GO0lBQ3BGLEtBQUssTUFBTSxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDbkQsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3JELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNsQztLQUNGO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQXVDLEVBQUUsTUFBVztJQUN0RSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFL0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzVCO0lBRUQsSUFBSSxJQUFZLENBQUM7SUFDakIsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFO1FBQ3pCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDMUM7U0FBTTtRQUNMLElBQUksR0FBRyxNQUFNLENBQUMs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Y0FBYyxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUN4QyxNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUM7UUFDRixrR0FBa0c7UUFDbEcsSUFBSSxFQUFFLGFBQWE7S0FDcEIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRWIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBRWpELE9BQU87UUFDTCxVQUFVLEVBQUUsR0FBRztRQUNmLElBQUksRUFBRSxhQUFhO0tBQ3BCLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyxpbXBvcnQvbm8tdW5yZXNvbHZlZCAqL1xuaW1wb3J0ICogYXMgQVdTTGFtYmRhIGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgQVdTIGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0IHsgZ2V0U2VjcmV0SnNvblZhbHVlIH0gZnJvbSAnLi9sYW1iZGEtaGVscGVycyc7XG5cbmNvbnN0IHNmID0gbmV3IEFXUy5TdGVwRnVuY3Rpb25zKCk7XG5cbi8vIFRPRE8gdXNlIEBvY3Rva2l0L3dlYmhvb2tzP1xuXG5mdW5jdGlvbiBnZXRIZWFkZXIoZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlFdmVudFYyLCBoZWFkZXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIEFQSSBHYXRld2F5IGRvZXNuJ3QgbG93ZXJjYXNlIGhlYWRlcnMgKFYxIGV2ZW50KSBidXQgTGFtYmRhIFVSTHMgZG8gKFYyIGV2ZW50KSA6KFxuICBmb3IgKGNvbnN0IGhlYWRlck5hbWUgb2YgT2JqZWN0LmtleXMoZXZlbnQuaGVhZGVycykpIHtcbiAgICBpZiAoaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBoZWFkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIGV2ZW50LmhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5Qm9keShldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUV2ZW50VjIsIHNlY3JldDogYW55KTogc3RyaW5nIHtcbiAgY29uc3Qgc2lnID0gQnVmZmVyLmZyb20oZ2V0SGVhZGVyKGV2ZW50LCAneC1odWItc2lnbmF0dXJlLTI1NicpIHx8ICcnLCAndXRmOCcpO1xuXG4gIGlmICghZXZlbnQuYm9keSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gYm9keScpO1xuICB9XG5cbiAgbGV0IGJvZHk6IEJ1ZmZlcjtcbiAgaWYgKGV2ZW50LmlzQmFzZTY0RW5jb2RlZCkge1xuICAgIGJvZHkgPSBCdWZmZXIuZnJvbShldmVudC5ib2R5LCAnYmFzZTY0Jyk7XG4gIH0gZWxzZSB7XG4gICAgYm9keSA9IEJ1ZmZlci5mcm9tKGV2ZW50LmJvZHkgfHwgJycsICd1dGY4Jyk7XG4gIH1cblxuICBjb25zdCBobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYTI1NicsIHNlY3JldCk7XG4gIGhtYWMudXBkYXRlKGJvZHkpO1xuICBjb25zdCBleHBlY3RlZFNpZyA9IEJ1ZmZlci5mcm9tKGBzaGEyNTY9JHtobWFjLmRpZ2VzdCgnaGV4Jyl9YCwgJ3V0ZjgnKTtcblxuICBjb25zb2xlLmxvZygnQ2FsY3VsYXRlZCBzaWduYXR1cmU6ICcsIGV4cGVjdGVkU2lnLnRvU3RyaW5nKCkpO1xuXG4gIGlmIChzaWcubGVuZ3RoICE9PSBleHBlY3RlZFNpZy5sZW5ndGggfHwgIWNyeXB0by50aW1pbmdTYWZlRXF1YWwoc2lnLCBleHBlY3RlZFNpZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25hdHVyZSBtaXNtYXRjaC4gRXhwZWN0ZWQgJHtleHBlY3RlZFNpZy50b1N0cmluZygpfSBidXQgZ290ICR7c2lnLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICByZXR1cm4gYm9keS50b1N0cmluZygpO1xufVxuXG5leHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlFdmVudFYyKTogUHJvbWlzZTxBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0VjI+IHtcbiAgaWYgKCFwcm9jZXNzLmVudi5XRUJIT09LX1NFQ1JFVF9BUk4gfHwgIXByb2Nlc3MuZW52LlNURVBfRlVOQ1RJT05fQVJOKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcycpO1xuICB9XG5cbiAgY29uc3Qgd2ViaG9va1NlY3JldCA9IChhd2FpdCBnZXRTZWNyZXRKc29uVmFsdWUocHJvY2Vzcy5lbnYuV0VCSE9PS19TRUNSRVRfQVJOKSkud2ViaG9va1NlY3JldDtcblxuICBsZXQgYm9keTtcbiAgdHJ5IHtcbiAgICBib2R5ID0gdmVyaWZ5Qm9keShldmVudCwgd2ViaG9va1NlY3JldCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiA0MDMsXG4gICAgICBib2R5OiAnQmFkIHNpZ25hdHVyZScsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChnZXRIZWFkZXIoZXZlbnQsICdjb250ZW50LXR5cGUnKSAhPT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihgVGhpcyB3ZWJob29rIG9ubHkgYWNjZXB0cyBKU09OIHBheWxvYWRzLCBnb3QgJHtnZXRIZWFkZXIoZXZlbnQsICdjb250ZW50LXR5cGUnKX1gKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogNDAwLFxuICAgICAgYm9keTogJ0V4cGVjdGluZyBKU09OIHBheWxvYWQnLFxuICAgIH07XG4gIH1cblxuICBpZiAoZ2V0SGVhZGVyKGV2ZW50LCAneC1naXRodWItZXZlbnQnKSA9PT0gJ3BpbmcnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgIGJvZHk6ICdQb25nJyxcbiAgICB9O1xuICB9XG5cbiAgLy8gaWYgKGdldEhlYWRlcihldmVudCwgJ3gtZ2l0aHViLWV2ZW50JykgIT09ICd3b3JrZmxvd19qb2InICYmIGdldEhlYWRlcihldmVudCwgJ3gtZ2l0aHViLWV2ZW50JykgIT09ICd3b3JrZmxvd19ydW4nKSB7XG4gIC8vICAgICBjb25zb2xlLmVycm9yKGBUaGlzIHdlYmhvb2sgb25seSBhY2NlcHRzIHdvcmtmbG93X2pvYiBhbmQgd29ya2Zsb3dfcnVuLCBnb3QgJHtnZXRIZWFkZXIoZXZlbnQsICd4LWdpdGh1Yi1ldmVudCcpfWApO1xuICBpZiAoZ2V0SGVhZGVyKGV2ZW50LCAneC1naXRodWItZXZlbnQnKSAhPT0gJ3dvcmtmbG93X2pvYicpIHtcbiAgICBjb25zb2xlLmVycm9yKGBUaGlzIHdlYmhvb2sgb25seSBhY2NlcHRzIHdvcmtmbG93X2pvYiwgZ290ICR7Z2V0SGVhZGVyKGV2ZW50LCAneC1naXRodWItZXZlbnQnKX1gKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogNDAwLFxuICAgICAgYm9keTogJ0V4cGVjdGluZyB3b3JrZmxvd19qb2InLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShib2R5KTtcblxuICBpZiAocGF5bG9hZC5hY3Rpb24gIT09ICdxdWV1ZWQnKSB7XG4gICAgY29uc29sZS5sb2coYElnbm9yaW5nIGFjdGlvbiBcIiR7cGF5bG9hZC5hY3Rpb259XCIsIGV4cGVjdGluZyBcInF1ZXVlZFwiYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgIGJvZHk6ICdPSy4gTm8gcnVubmVyIHN0YXJ0ZWQuJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFwYXlsb2FkLndvcmtmbG93X2pvYi5sYWJlbHMuaW5jbHVkZXMoJ3NlbGYtaG9zdGVkJykpIHtcbiAgICBjb25zb2xlLmxvZyhgSWdub3JpbmcgbGFiZWxzIFwiJHtwYXlsb2FkLndvcmtmbG93X2pvYi5sYWJlbHN9XCIsIGV4cGVjdGluZyBcInNlbGYtaG9zdGVkXCJgKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgYm9keTogJ09LLiBObyBydW5uZXIgc3RhcnRlZC4nLFxuICAgIH07XG4gIH1cblxuICAvLyBpdCdzIGVhc2llciB0byBkZWFsIHdpdGggbWFwcyBpbiBzdGVwIGZ1bmN0aW9uc1xuICBsZXQgbGFiZWxzOiBhbnkgPSB7fTtcbiAgcGF5bG9hZC53b3JrZmxvd19qb2IubGFiZWxzLmZvckVhY2goKGw6IHN0cmluZykgPT4gbGFiZWxzW2wudG9Mb3dlckNhc2UoKV0gPSB0cnVlKTtcblxuICAvLyBzZXQgZXhlY3V0aW9uIG5hbWUgd2hpY2ggaXMgYWxzbyB1c2VkIGFzIHJ1bm5lciBuYW1lIHdoaWNoIGFyZSBsaW1pdGVkIHRvIDY0IGNoYXJhY3RlcnNcbiAgbGV0IGV4ZWN1dGlvbk5hbWUgPSBgJHtwYXlsb2FkLnJlcG9zaXRvcnkuZnVsbF9uYW1lLnJlcGxhY2UoJy8nLCAnLScpfS0ke2dldEhlYWRlcihldmVudCwgJ3gtZ2l0aHViLWRlbGl2ZXJ5Jyl9YC5zbGljZSgwLCA2NCk7XG4gIC8vIHN0YXJ0IGV4ZWN1dGlvblxuICBjb25zdCBleGVjdXRpb24gPSBhd2FpdCBzZi5zdGFydEV4ZWN1dGlvbih7XG4gICAgc3RhdGVNYWNoaW5lQXJuOiBwcm9jZXNzLmVudi5TVEVQX0ZVTkNUSU9OX0FSTixcbiAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgb3duZXI6IHBheWxvYWQucmVwb3NpdG9yeS5vd25lci5sb2dpbixcbiAgICAgIHJlcG86IHBheWxvYWQucmVwb3NpdG9yeS5uYW1lLFxuICAgICAgcnVuSWQ6IHBheWxvYWQud29ya2Zsb3dfam9iLnJ1bl9pZCxcbiAgICAgIGluc3RhbGxhdGlvbklkOiBwYXlsb2FkLmluc3RhbGxhdGlvbj8uaWQsXG4gICAgICBsYWJlbHM6IGxhYmVscyxcbiAgICB9KSxcbiAgICAvLyBuYW1lIGlzIG5vdCByYW5kb20gc28gbXVsdGlwbGUgZXhlY3V0aW9uIG9mIHRoaXMgd2ViaG9vayB3b24ndCBjYXVzZSBtdWx0aXBsZSBidWlsZGVycyB0byBzdGFydFxuICAgIG5hbWU6IGV4ZWN1dGlvbk5hbWUsXG4gIH0pLnByb21pc2UoKTtcblxuICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke2V4ZWN1dGlvbi5leGVjdXRpb25Bcm59YCk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGF0dXNDb2RlOiAyMDIsXG4gICAgYm9keTogZXhlY3V0aW9uTmFtZSxcbiAgfTtcbn07XG5cbiJdfQ==
package/lib/webhook.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { aws_stepfunctions as stepfunctions } from 'aws-cdk-lib';
2
2
  import { Construct } from 'constructs';
3
3
  import { LambdaAccess } from './access';
4
- import { WebhookHandlerFunction } from './lambdas/webhook-handler-function';
5
4
  import { Secrets } from './secrets';
5
+ import { WebhookHandlerFunction } from './webhook-handler-function';
6
6
  /**
7
7
  * Properties for GithubWebhookHandler
8
8
  */
package/lib/webhook.js CHANGED
@@ -5,7 +5,7 @@ const cdk = require("aws-cdk-lib");
5
5
  const aws_cdk_lib_1 = require("aws-cdk-lib");
6
6
  const constructs_1 = require("constructs");
7
7
  const access_1 = require("./access");
8
- const webhook_handler_function_1 = require("./lambdas/webhook-handler-function");
8
+ const webhook_handler_function_1 = require("./webhook-handler-function");
9
9
  /**
10
10
  * Create a Lambda with a public URL to handle GitHub webhook events. After validating the event with the given secret, the orchestrator step function is called with information about the workflow job.
11
11
  *
@@ -30,4 +30,4 @@ class GithubWebhookHandler extends constructs_1.Construct {
30
30
  }
31
31
  }
32
32
  exports.GithubWebhookHandler = GithubWebhookHandler;
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQyw2Q0FBbUY7QUFDbkYsMkNBQXVDO0FBQ3ZDLHFDQUF3QztBQUN4QyxpRkFBNEU7QUF3QjVFOzs7O0dBSUc7QUFDSCxNQUFhLG9CQUFxQixTQUFRLHNCQUFTO0lBWWpELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0M7UUFDeEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaURBQXNCLENBQ3ZDLElBQUksRUFDSixpQkFBaUIsRUFDakI7WUFDRSxXQUFXLEVBQUUscURBQXFEO1lBQ2xFLFdBQVcsRUFBRTtnQkFDWCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLGVBQWU7Z0JBQ3JELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVM7YUFDcEQ7WUFDRCxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFlBQVksRUFBRSxzQkFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTO1NBQzNDLENBQ0YsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLEtBQUssRUFBRSxNQUFNLElBQUkscUJBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0Y7QUFuQ0Qsb0RBbUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGF3c19sb2dzIGFzIGxvZ3MsIGF3c19zdGVwZnVuY3Rpb25zIGFzIHN0ZXBmdW5jdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IExhbWJkYUFjY2VzcyB9IGZyb20gJy4vYWNjZXNzJztcbmltcG9ydCB7IFdlYmhvb2tIYW5kbGVyRnVuY3Rpb24gfSBmcm9tICcuL2xhbWJkYXMvd2ViaG9vay1oYW5kbGVyLWZ1bmN0aW9uJztcbmltcG9ydCB7IFNlY3JldHMgfSBmcm9tICcuL3NlY3JldHMnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEdpdGh1YldlYmhvb2tIYW5kbGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0aHViV2ViaG9va0hhbmRsZXJQcm9wcyB7XG5cbiAgLyoqXG4gICAqIFN0ZXAgZnVuY3Rpb24gaW4gY2hhcmdlIG9mIGhhbmRsaW5nIHRoZSB3b3JrZmxvdyBqb2IgZXZlbnRzIGFuZCBzdGFydCB0aGUgcnVubmVycy5cbiAgICovXG4gIHJlYWRvbmx5IG9yY2hlc3RyYXRvcjogc3RlcGZ1bmN0aW9ucy5TdGF0ZU1hY2hpbmU7XG5cbiAgLyoqXG4gICAqIFNlY3JldHMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIEdpdEh1Yi5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldHM6IFNlY3JldHM7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBhY2Nlc3MgdG8gd2ViaG9vayBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzcz86IExhbWJkYUFjY2Vzcztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBMYW1iZGEgd2l0aCBhIHB1YmxpYyBVUkwgdG8gaGFuZGxlIEdpdEh1YiB3ZWJob29rIGV2ZW50cy4gQWZ0ZXIgdmFsaWRhdGluZyB0aGUgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gc2VjcmV0LCB0aGUgb3JjaGVzdHJhdG9yIHN0ZXAgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdvcmtmbG93IGpvYi5cbiAqXG4gKiBUaGlzIGNvbnN0cnVjdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRodWJXZWJob29rSGFuZGxlciBleHRlbmRzIENvbnN0cnVjdCB7XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBVUkwgb2Ygd2ViaG9vayB0byBiZSB1c2VkIHdpdGggR2l0SHViLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdlYmhvb2sgZXZlbnQgaGFuZGxlci5cbiAgICovXG4gIHJlYWRvbmx5IGhhbmRsZXI6IFdlYmhvb2tIYW5kbGVyRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEdpdGh1YldlYmhvb2tIYW5kbGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5oYW5kbGVyID0gbmV3IFdlYmhvb2tIYW5kbGVyRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgJ3dlYmhvb2staGFuZGxlcicsXG4gICAgICB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnSGFuZGxlIEdpdEh1YiB3ZWJob29rIGFuZCBzdGFydCBydW5uZXIgb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBTVEVQX0ZVTkNUSU9OX0FSTjogcHJvcHMub3JjaGVzdHJhdG9yLnN0YXRlTWFjaGluZUFybixcbiAgICAgICAgICBXRUJIT09LX1NFQ1JFVF9BUk46IHByb3BzLnNlY3JldHMud2ViaG9vay5zZWNyZXRBcm4sXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYWNjZXNzID0gcHJvcHM/LmFjY2VzcyA/PyBMYW1iZGFBY2Nlc3MubGFtYmRhVXJsKCk7XG4gICAgdGhpcy51cmwgPSBhY2Nlc3MuX2JpbmQodGhpcywgJ2FjY2VzcycsIHRoaXMuaGFuZGxlcik7XG5cbiAgICBwcm9wcy5zZWNyZXRzLndlYmhvb2suZ3JhbnRSZWFkKHRoaXMuaGFuZGxlcik7XG4gICAgcHJvcHMub3JjaGVzdHJhdG9yLmdyYW50U3RhcnRFeGVjdXRpb24odGhpcy5oYW5kbGVyKTtcbiAgfVxufVxuIl19
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQyw2Q0FBbUY7QUFDbkYsMkNBQXVDO0FBQ3ZDLHFDQUF3QztBQUV4Qyx5RUFBb0U7QUF1QnBFOzs7O0dBSUc7QUFDSCxNQUFhLG9CQUFxQixTQUFRLHNCQUFTO0lBWWpELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0M7UUFDeEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaURBQXNCLENBQ3ZDLElBQUksRUFDSixpQkFBaUIsRUFDakI7WUFDRSxXQUFXLEVBQUUscURBQXFEO1lBQ2xFLFdBQVcsRUFBRTtnQkFDWCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLGVBQWU7Z0JBQ3JELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVM7YUFDcEQ7WUFDRCxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFlBQVksRUFBRSxzQkFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTO1NBQzNDLENBQ0YsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLEtBQUssRUFBRSxNQUFNLElBQUkscUJBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0Y7QUFuQ0Qsb0RBbUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGF3c19sb2dzIGFzIGxvZ3MsIGF3c19zdGVwZnVuY3Rpb25zIGFzIHN0ZXBmdW5jdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IExhbWJkYUFjY2VzcyB9IGZyb20gJy4vYWNjZXNzJztcbmltcG9ydCB7IFNlY3JldHMgfSBmcm9tICcuL3NlY3JldHMnO1xuaW1wb3J0IHsgV2ViaG9va0hhbmRsZXJGdW5jdGlvbiB9IGZyb20gJy4vd2ViaG9vay1oYW5kbGVyLWZ1bmN0aW9uJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBHaXRodWJXZWJob29rSGFuZGxlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdGh1YldlYmhvb2tIYW5kbGVyUHJvcHMge1xuXG4gIC8qKlxuICAgKiBTdGVwIGZ1bmN0aW9uIGluIGNoYXJnZSBvZiBoYW5kbGluZyB0aGUgd29ya2Zsb3cgam9iIGV2ZW50cyBhbmQgc3RhcnQgdGhlIHJ1bm5lcnMuXG4gICAqL1xuICByZWFkb25seSBvcmNoZXN0cmF0b3I6IHN0ZXBmdW5jdGlvbnMuU3RhdGVNYWNoaW5lO1xuXG4gIC8qKlxuICAgKiBTZWNyZXRzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBHaXRIdWIuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXRzOiBTZWNyZXRzO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgYWNjZXNzIHRvIHdlYmhvb2sgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3M/OiBMYW1iZGFBY2Nlc3M7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgTGFtYmRhIHdpdGggYSBwdWJsaWMgVVJMIHRvIGhhbmRsZSBHaXRIdWIgd2ViaG9vayBldmVudHMuIEFmdGVyIHZhbGlkYXRpbmcgdGhlIGV2ZW50IHdpdGggdGhlIGdpdmVuIHNlY3JldCwgdGhlIG9yY2hlc3RyYXRvciBzdGVwIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3b3JrZmxvdyBqb2IuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3QgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgaXRzZWxmLlxuICovXG5leHBvcnQgY2xhc3MgR2l0aHViV2ViaG9va0hhbmRsZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgVVJMIG9mIHdlYmhvb2sgdG8gYmUgdXNlZCB3aXRoIEdpdEh1Yi5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXZWJob29rIGV2ZW50IGhhbmRsZXIuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyOiBXZWJob29rSGFuZGxlckZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBHaXRodWJXZWJob29rSGFuZGxlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuaGFuZGxlciA9IG5ldyBXZWJob29rSGFuZGxlckZ1bmN0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgICd3ZWJob29rLWhhbmRsZXInLFxuICAgICAge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ0hhbmRsZSBHaXRIdWIgd2ViaG9vayBhbmQgc3RhcnQgcnVubmVyIG9yY2hlc3RyYXRvcicsXG4gICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgU1RFUF9GVU5DVElPTl9BUk46IHByb3BzLm9yY2hlc3RyYXRvci5zdGF0ZU1hY2hpbmVBcm4sXG4gICAgICAgICAgV0VCSE9PS19TRUNSRVRfQVJOOiBwcm9wcy5zZWNyZXRzLndlYmhvb2suc2VjcmV0QXJuLFxuICAgICAgICB9LFxuICAgICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFjY2VzcyA9IHByb3BzPy5hY2Nlc3MgPz8gTGFtYmRhQWNjZXNzLmxhbWJkYVVybCgpO1xuICAgIHRoaXMudXJsID0gYWNjZXNzLl9iaW5kKHRoaXMsICdhY2Nlc3MnLCB0aGlzLmhhbmRsZXIpO1xuXG4gICAgcHJvcHMuc2VjcmV0cy53ZWJob29rLmdyYW50UmVhZCh0aGlzLmhhbmRsZXIpO1xuICAgIHByb3BzLm9yY2hlc3RyYXRvci5ncmFudFN0YXJ0RXhlY3V0aW9uKHRoaXMuaGFuZGxlcik7XG4gIH1cbn1cbiJdfQ==