cloudstructs 0.4.7 → 0.4.11
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.
- package/.gitattributes +6 -0
- package/.jsii +10 -10
- package/assets/email-receiver/s3.lambda/index.js +38 -0
- package/assets/email-receiver/whitelist.lambda/index.js +46 -0
- package/assets/slack-app/provider.lambda/index.js +6335 -0
- package/assets/slack-events/events.lambda/index.js +112 -0
- package/assets/slack-textract/detect.lambda/index.js +20542 -0
- package/assets/url-shortener/shortener.lambda/index.js +101 -0
- package/changelog.md +6 -1
- package/lib/codecommit-mirror/index.js +2 -2
- package/lib/ecs-service-roller/index.js +2 -2
- package/lib/email-receiver/receiver.js +6 -7
- package/lib/email-receiver/s3-function.d.ts +13 -0
- package/lib/email-receiver/s3-function.js +22 -0
- package/lib/email-receiver/{receiver.s3.d.ts → s3.lambda.d.ts} +0 -0
- package/lib/email-receiver/s3.lambda.js +11 -0
- package/lib/email-receiver/whitelist-function.d.ts +13 -0
- package/lib/email-receiver/whitelist-function.js +22 -0
- package/lib/email-receiver/{receiver.whitelist.d.ts → whitelist.lambda.d.ts} +0 -0
- package/lib/email-receiver/whitelist.lambda.js +19 -0
- package/lib/saml-identity-provider/index.js +2 -2
- package/lib/slack-app/manifest.js +1 -1
- package/lib/slack-app/provider-function.d.ts +13 -0
- package/lib/slack-app/provider-function.js +22 -0
- package/lib/slack-app/provider.d.ts +2 -2
- package/lib/slack-app/provider.js +3 -3
- package/lib/slack-app/{provider.handler.d.ts → provider.lambda.d.ts} +0 -0
- package/lib/slack-app/provider.lambda.js +101 -0
- package/lib/slack-app/slack-app.js +2 -2
- package/lib/slack-events/events-function.d.ts +13 -0
- package/lib/slack-events/events-function.js +22 -0
- package/lib/slack-events/{index.handler.d.ts → events.lambda.d.ts} +0 -0
- package/lib/slack-events/{index.handler.js → events.lambda.js} +1 -1
- package/lib/slack-events/index.js +4 -4
- package/lib/slack-textract/detect-function.d.ts +13 -0
- package/lib/slack-textract/detect-function.js +22 -0
- package/lib/slack-textract/{index.handler.d.ts → detect.lambda.d.ts} +0 -0
- package/lib/slack-textract/{index.handler.js → detect.lambda.js} +1 -1
- package/lib/slack-textract/index.js +4 -4
- package/lib/state-machine-cr-provider/index.js +1 -1
- package/lib/static-website/index.js +1 -1
- package/lib/toolkit-cleaner/index.js +1 -1
- package/lib/url-shortener/index.js +4 -4
- package/lib/url-shortener/shortener-function.d.ts +13 -0
- package/lib/url-shortener/shortener-function.js +22 -0
- package/lib/url-shortener/{index.handler.d.ts → shortener.lambda.d.ts} +0 -0
- package/lib/url-shortener/shortener.lambda.js +79 -0
- package/package.json +29 -1
- package/releasetag.txt +1 -1
- package/version.txt +1 -1
- package/lib/email-receiver/receiver.s3.js +0 -11
- package/lib/email-receiver/receiver.whitelist.js +0 -19
- package/lib/slack-app/provider.handler.js +0 -101
- package/lib/url-shortener/index.handler.js +0 -79
package/package.json
CHANGED
|
@@ -9,12 +9,24 @@
|
|
|
9
9
|
"build": "npx projen build",
|
|
10
10
|
"bump": "npx projen bump",
|
|
11
11
|
"bundle": "npx projen bundle",
|
|
12
|
+
"bundle:email-receiver/s3.lambda": "npx projen bundle:email-receiver/s3.lambda",
|
|
13
|
+
"bundle:email-receiver/s3.lambda:watch": "npx projen bundle:email-receiver/s3.lambda:watch",
|
|
14
|
+
"bundle:email-receiver/whitelist.lambda": "npx projen bundle:email-receiver/whitelist.lambda",
|
|
15
|
+
"bundle:email-receiver/whitelist.lambda:watch": "npx projen bundle:email-receiver/whitelist.lambda:watch",
|
|
16
|
+
"bundle:slack-app/provider.lambda": "npx projen bundle:slack-app/provider.lambda",
|
|
17
|
+
"bundle:slack-app/provider.lambda:watch": "npx projen bundle:slack-app/provider.lambda:watch",
|
|
18
|
+
"bundle:slack-events/events.lambda": "npx projen bundle:slack-events/events.lambda",
|
|
19
|
+
"bundle:slack-events/events.lambda:watch": "npx projen bundle:slack-events/events.lambda:watch",
|
|
20
|
+
"bundle:slack-textract/detect.lambda": "npx projen bundle:slack-textract/detect.lambda",
|
|
21
|
+
"bundle:slack-textract/detect.lambda:watch": "npx projen bundle:slack-textract/detect.lambda:watch",
|
|
12
22
|
"bundle:toolkit-cleaner/clean-images.lambda": "npx projen bundle:toolkit-cleaner/clean-images.lambda",
|
|
13
23
|
"bundle:toolkit-cleaner/clean-images.lambda:watch": "npx projen bundle:toolkit-cleaner/clean-images.lambda:watch",
|
|
14
24
|
"bundle:toolkit-cleaner/clean-objects.lambda": "npx projen bundle:toolkit-cleaner/clean-objects.lambda",
|
|
15
25
|
"bundle:toolkit-cleaner/clean-objects.lambda:watch": "npx projen bundle:toolkit-cleaner/clean-objects.lambda:watch",
|
|
16
26
|
"bundle:toolkit-cleaner/get-stack-names.lambda": "npx projen bundle:toolkit-cleaner/get-stack-names.lambda",
|
|
17
27
|
"bundle:toolkit-cleaner/get-stack-names.lambda:watch": "npx projen bundle:toolkit-cleaner/get-stack-names.lambda:watch",
|
|
28
|
+
"bundle:url-shortener/shortener.lambda": "npx projen bundle:url-shortener/shortener.lambda",
|
|
29
|
+
"bundle:url-shortener/shortener.lambda:watch": "npx projen bundle:url-shortener/shortener.lambda:watch",
|
|
18
30
|
"clobber": "npx projen clobber",
|
|
19
31
|
"compat": "npx projen compat",
|
|
20
32
|
"compile": "npx projen compile",
|
|
@@ -105,7 +117,7 @@
|
|
|
105
117
|
],
|
|
106
118
|
"main": "lib/index.js",
|
|
107
119
|
"license": "Apache-2.0",
|
|
108
|
-
"version": "0.4.
|
|
120
|
+
"version": "0.4.11",
|
|
109
121
|
"jest": {
|
|
110
122
|
"testMatch": [
|
|
111
123
|
"<rootDir>/src/**/__tests__/**/*.ts?(x)",
|
|
@@ -156,5 +168,21 @@
|
|
|
156
168
|
"rootDir": "src"
|
|
157
169
|
}
|
|
158
170
|
},
|
|
171
|
+
"exports": {
|
|
172
|
+
".": "./lib/index.js",
|
|
173
|
+
"./package.json": "./package.json",
|
|
174
|
+
"./.jsii": "./.jsii",
|
|
175
|
+
"./lib/codecommit-mirror": "./lib/codecommit-mirror/index.js",
|
|
176
|
+
"./lib/ecs-service-roller": "./lib/ecs-service-roller/index.js",
|
|
177
|
+
"./lib/email-receiver": "./lib/email-receiver/index.js",
|
|
178
|
+
"./lib/saml-identity-provider": "./lib/saml-identity-provider/index.js",
|
|
179
|
+
"./lib/slack-app": "./lib/slack-app/index.js",
|
|
180
|
+
"./lib/slack-events": "./lib/slack-events/index.js",
|
|
181
|
+
"./lib/slack-textract": "./lib/slack-textract/index.js",
|
|
182
|
+
"./lib/state-machine-cr-provider": "./lib/state-machine-cr-provider/index.js",
|
|
183
|
+
"./lib/static-website": "./lib/static-website/index.js",
|
|
184
|
+
"./lib/toolkit-cleaner": "./lib/toolkit-cleaner/index.js",
|
|
185
|
+
"./lib/url-shortener": "./lib/url-shortener/index.js"
|
|
186
|
+
},
|
|
159
187
|
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
|
|
160
188
|
}
|
package/releasetag.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v0.4.
|
|
1
|
+
v0.4.11
|
package/version.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.4.
|
|
1
|
+
0.4.11
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handler = void 0;
|
|
4
|
-
/* eslint-disable no-console */
|
|
5
|
-
async function handler(event) {
|
|
6
|
-
console.log('Event: %j', event);
|
|
7
|
-
const message = JSON.parse(event.Records[0].Sns.Message);
|
|
8
|
-
return message;
|
|
9
|
-
}
|
|
10
|
-
exports.handler = handler;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjZWl2ZXIuczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW1haWwtcmVjZWl2ZXIvcmVjZWl2ZXIuczMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQ3hCLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBeUI7SUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQXlCLENBQUM7SUFFakYsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQU5ELDBCQU1DIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5TTlNFdmVudCk6IFByb21pc2U8QVdTTGFtYmRhLlNFU01lc3NhZ2U+IHtcbiAgY29uc29sZS5sb2coJ0V2ZW50OiAlaicsIGV2ZW50KTtcblxuICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShldmVudC5SZWNvcmRzWzBdLlNucy5NZXNzYWdlKSBhcyBBV1NMYW1iZGEuU0VTTWVzc2FnZTtcblxuICByZXR1cm4gbWVzc2FnZTtcbn1cbiJdfQ==
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handler = void 0;
|
|
4
|
-
/* eslint-disable no-console */
|
|
5
|
-
async function handler(event) {
|
|
6
|
-
console.log('Event: %j', event);
|
|
7
|
-
const sesNotification = event.Records[0].ses;
|
|
8
|
-
if (!process.env.SOURCE_WHITELIST) {
|
|
9
|
-
console.log('Missing SOURCE_WHITELIST');
|
|
10
|
-
return { disposition: 'STOP_RULE' };
|
|
11
|
-
}
|
|
12
|
-
if (!new RegExp(process.env.SOURCE_WHITELIST).test(sesNotification.mail.source)) {
|
|
13
|
-
console.log(`${sesNotification.mail.source} does not match /${process.env.SOURCE_WHITELIST}/`);
|
|
14
|
-
return { disposition: 'STOP_RULE' };
|
|
15
|
-
}
|
|
16
|
-
return { disposition: 'CONTINUE' };
|
|
17
|
-
}
|
|
18
|
-
exports.handler = handler;
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjZWl2ZXIud2hpdGVsaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VtYWlsLXJlY2VpdmVyL3JlY2VpdmVyLndoaXRlbGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBK0I7QUFDeEIsS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUF5QjtJQUNyRCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVoQyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUU3QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRTtRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztLQUNyQztJQUVELElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDL0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxvQkFBb0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDL0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztLQUNyQztJQUVELE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDckMsQ0FBQztBQWhCRCwwQkFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogQVdTTGFtYmRhLlNFU0V2ZW50KTogUHJvbWlzZTx7IGRpc3Bvc2l0aW9uOiBzdHJpbmcgfT4ge1xuICBjb25zb2xlLmxvZygnRXZlbnQ6ICVqJywgZXZlbnQpO1xuXG4gIGNvbnN0IHNlc05vdGlmaWNhdGlvbiA9IGV2ZW50LlJlY29yZHNbMF0uc2VzO1xuXG4gIGlmICghcHJvY2Vzcy5lbnYuU09VUkNFX1dISVRFTElTVCkge1xuICAgIGNvbnNvbGUubG9nKCdNaXNzaW5nIFNPVVJDRV9XSElURUxJU1QnKTtcbiAgICByZXR1cm4geyBkaXNwb3NpdGlvbjogJ1NUT1BfUlVMRScgfTtcbiAgfVxuXG4gIGlmICghbmV3IFJlZ0V4cChwcm9jZXNzLmVudi5TT1VSQ0VfV0hJVEVMSVNUKS50ZXN0KHNlc05vdGlmaWNhdGlvbi5tYWlsLnNvdXJjZSkpIHtcbiAgICBjb25zb2xlLmxvZyhgJHtzZXNOb3RpZmljYXRpb24ubWFpbC5zb3VyY2V9IGRvZXMgbm90IG1hdGNoIC8ke3Byb2Nlc3MuZW52LlNPVVJDRV9XSElURUxJU1R9L2ApO1xuICAgIHJldHVybiB7IGRpc3Bvc2l0aW9uOiAnU1RPUF9SVUxFJyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGlzcG9zaXRpb246ICdDT05USU5VRScgfTtcbn1cbiJdfQ==
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handler = void 0;
|
|
4
|
-
const aws_sdk_1 = require("aws-sdk"); // eslint-disable-line import/no-extraneous-dependencies
|
|
5
|
-
const got_1 = require("got");
|
|
6
|
-
const secretsmanager = new aws_sdk_1.SecretsManager({ apiVersion: '2017-10-17' });
|
|
7
|
-
const slackClient = got_1.default.extend({
|
|
8
|
-
prefixUrl: 'https://slack.com/api',
|
|
9
|
-
});
|
|
10
|
-
async function handler(event) {
|
|
11
|
-
var _a, _b;
|
|
12
|
-
console.log('Event: %j', event);
|
|
13
|
-
const data = await secretsmanager.getSecretValue({
|
|
14
|
-
SecretId: event.ResourceProperties.configurationTokenSecretArn,
|
|
15
|
-
}).promise();
|
|
16
|
-
if (!data.SecretString) {
|
|
17
|
-
throw new Error('No secret string found in configuration token secret');
|
|
18
|
-
}
|
|
19
|
-
const secret = JSON.parse(data.SecretString);
|
|
20
|
-
let accessToken = secret.accessToken;
|
|
21
|
-
if (!accessToken || isExpired((_a = secret.exp) !== null && _a !== void 0 ? _a : 0)) {
|
|
22
|
-
if (!secret.refreshToken) {
|
|
23
|
-
throw new Error('No refresh token found in configuration token secret');
|
|
24
|
-
}
|
|
25
|
-
console.log('Refreshing access token');
|
|
26
|
-
const rotate = await slackClient.get('tooling.tokens.rotate', {
|
|
27
|
-
searchParams: { refresh_token: secret.refreshToken },
|
|
28
|
-
}).json();
|
|
29
|
-
if (!rotate.ok) {
|
|
30
|
-
throw new Error(`Failed to refresh access token: ${rotate.error}`);
|
|
31
|
-
}
|
|
32
|
-
console.log('Access token refreshed');
|
|
33
|
-
accessToken = rotate.token;
|
|
34
|
-
console.log('Saving access token');
|
|
35
|
-
const putSecretValue = await secretsmanager.putSecretValue({
|
|
36
|
-
SecretId: event.ResourceProperties.configurationTokenSecretArn,
|
|
37
|
-
SecretString: JSON.stringify({
|
|
38
|
-
accessToken,
|
|
39
|
-
refreshToken: rotate.refresh_token,
|
|
40
|
-
exp: rotate.exp,
|
|
41
|
-
}),
|
|
42
|
-
}).promise();
|
|
43
|
-
console.log(`Successfully saved access token in secret ${putSecretValue.ARN}`);
|
|
44
|
-
}
|
|
45
|
-
const operation = event.RequestType.toLowerCase();
|
|
46
|
-
const request = getManifestRequest(event);
|
|
47
|
-
console.log(`Calling ${operation} manifest API: %j`, request);
|
|
48
|
-
const response = await slackClient.post(`apps.manifest.${operation}`, {
|
|
49
|
-
headers: { Authorization: `Bearer ${accessToken}` },
|
|
50
|
-
json: request,
|
|
51
|
-
}).json();
|
|
52
|
-
if (!response.ok) {
|
|
53
|
-
const errors = response.errors
|
|
54
|
-
? response.errors.map((err) => `${err.message} at ${err.pointer}`).join('\n')
|
|
55
|
-
: '';
|
|
56
|
-
throw new Error(`Failed to ${operation} manifest: ${response.error}.${errors ? `\n${errors}}` : ''}`);
|
|
57
|
-
}
|
|
58
|
-
console.log(`Successfully ${operation}d Slack app ${(_b = event.PhysicalResourceId) !== null && _b !== void 0 ? _b : response.app_id}`);
|
|
59
|
-
if (event.RequestType === 'Create' && response.credentials) {
|
|
60
|
-
console.log('Saving app credentials');
|
|
61
|
-
const putSecretValue = await secretsmanager.putSecretValue({
|
|
62
|
-
SecretId: event.ResourceProperties.credentialsSecretArn,
|
|
63
|
-
SecretString: JSON.stringify({
|
|
64
|
-
appId: response.app_id,
|
|
65
|
-
clientId: response.credentials.client_id,
|
|
66
|
-
clientSecret: response.credentials.client_secret,
|
|
67
|
-
verificationToken: response.credentials.verification_token,
|
|
68
|
-
signingSecret: response.credentials.signing_secret,
|
|
69
|
-
}),
|
|
70
|
-
}).promise();
|
|
71
|
-
console.log(`Successfully saved app credentials in secret ${putSecretValue.ARN}`);
|
|
72
|
-
}
|
|
73
|
-
return {
|
|
74
|
-
PhysicalResourceId: response.app_id,
|
|
75
|
-
Data: {
|
|
76
|
-
appId: response.app_id,
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
exports.handler = handler;
|
|
81
|
-
function isExpired(iat) {
|
|
82
|
-
return (iat - (Date.now() / 1000)) < 0;
|
|
83
|
-
}
|
|
84
|
-
function getManifestRequest(event) {
|
|
85
|
-
switch (event.RequestType) {
|
|
86
|
-
case 'Create':
|
|
87
|
-
return {
|
|
88
|
-
manifest: event.ResourceProperties.manifest,
|
|
89
|
-
};
|
|
90
|
-
case 'Update':
|
|
91
|
-
return {
|
|
92
|
-
app_id: event.PhysicalResourceId,
|
|
93
|
-
manifest: event.ResourceProperties.manifest,
|
|
94
|
-
};
|
|
95
|
-
case 'Delete':
|
|
96
|
-
return {
|
|
97
|
-
app_id: event.PhysicalResourceId,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zbGFjay1hcHAvcHJvdmlkZXIuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxxQ0FBeUMsQ0FBQyx3REFBd0Q7QUFDbEcsNkJBQXNCO0FBaUR0QixNQUFNLGNBQWMsR0FBRyxJQUFJLHdCQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUV4RSxNQUFNLFdBQVcsR0FBRyxhQUFHLENBQUMsTUFBTSxDQUFDO0lBQzdCLFNBQVMsRUFBRSx1QkFBdUI7Q0FDbkMsQ0FBQyxDQUFDO0FBRUksS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFxQjs7SUFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFaEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxjQUFjLENBQUMsY0FBYyxDQUFDO1FBQy9DLFFBQVEsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsMkJBQTJCO0tBQy9ELENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUViLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztLQUN6RTtJQUVELE1BQU0sTUFBTSxHQUFnQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUxRCxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBRXJDLElBQUksQ0FBQyxXQUFXLElBQUksU0FBUyxPQUFDLE1BQU0sQ0FBQyxHQUFHLG1DQUFJLENBQUMsQ0FBQyxFQUFFO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztTQUN6RTtRQUVELE9BQU8sQ0FBQyxHQUFH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bXBvcnQgeyBPbkV2ZW50UmVxdWVzdCwgT25FdmVudFJlc3BvbnNlIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcy9saWIvcHJvdmlkZXItZnJhbWV3b3JrL3R5cGVzJztcbmltcG9ydCB7IFNlY3JldHNNYW5hZ2VyIH0gZnJvbSAnYXdzLXNkayc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgZ290IGZyb20gJ2dvdCc7XG5cbmludGVyZmFjZSBTbGFja1NlY3JldCB7XG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIGV4cD86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFJvdGF0ZVJlc3BvbnNlIHtcbiAgb2s6IGJvb2xlYW47XG4gIGVycm9yPzogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG4gIHRlYW1faWQ6IHN0cmluZztcbiAgdXNlcl9pZDogc3RyaW5nO1xuICBpYXQ6IG51bWJlcjtcbiAgZXhwOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBNYW5pZmVzdENyZWF0ZVJlcXVlc3Qge1xuICBtYW5pZmVzdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTWFuaWZlc3RVcGRhdGVSZXF1ZXN0IGV4dGVuZHMgTWFuaWZlc3RDcmVhdGVSZXF1ZXN0IHtcbiAgYXBwX2lkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBNYW5pZmVzdERlbGV0ZVJlcXVlc3Qge1xuICBhcHBfaWQ6IHN0cmluZztcbn1cblxudHlwZSBNYW5pZmVzdFJlcXVlc3QgPSBNYW5pZmVzdENyZWF0ZVJlcXVlc3QgfCBNYW5pZmVzdFVwZGF0ZVJlcXVlc3QgfCBNYW5pZmVzdERlbGV0ZVJlcXVlc3Q7XG5cbmludGVyZmFjZSBNYW5pZmVzdFJlc3BvbnNlIHtcbiAgb2s6IGJvb2xlYW47XG4gIGVycm9yPzogc3RyaW5nO1xuICBlcnJvcnM/OiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHBvaW50ZXI6IHN0cmluZztcbiAgfVtdO1xuICBhcHBfaWQ/OiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzPzoge1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIGNsaWVudF9zZWNyZXQ6IHN0cmluZztcbiAgICB2ZXJpZmljYXRpb25fdG9rZW46IHN0cmluZztcbiAgICBzaWduaW5nX3NlY3JldDogc3RyaW5nO1xuICB9O1xufVxuXG5jb25zdCBzZWNyZXRzbWFuYWdlciA9IG5ldyBTZWNyZXRzTWFuYWdlcih7IGFwaVZlcnNpb246ICcyMDE3LTEwLTE3JyB9KTtcblxuY29uc3Qgc2xhY2tDbGllbnQgPSBnb3QuZXh0ZW5kKHtcbiAgcHJlZml4VXJsOiAnaHR0cHM6Ly9zbGFjay5jb20vYXBpJyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogT25FdmVudFJlcXVlc3QpOiBQcm9taXNlPE9uRXZlbnRSZXNwb25zZT4ge1xuICBjb25zb2xlLmxvZygnRXZlbnQ6ICVqJywgZXZlbnQpO1xuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBzZWNyZXRzbWFuYWdlci5nZXRTZWNyZXRWYWx1ZSh7XG4gICAgU2VjcmV0SWQ6IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5jb25maWd1cmF0aW9uVG9rZW5TZWNyZXRBcm4sXG4gIH0pLnByb21pc2UoKTtcblxuICBpZiAoIWRhdGEuU2VjcmV0U3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBzZWNyZXQgc3RyaW5nIGZvdW5kIGluIGNvbmZpZ3VyYXRpb24gdG9rZW4gc2VjcmV0Jyk7XG4gIH1cblxuICBjb25zdCBzZWNyZXQ6IFNsYWNrU2VjcmV0ID0gSlNPTi5wYXJzZShkYXRhLlNlY3JldFN0cmluZyk7XG5cbiAgbGV0IGFjY2Vzc1Rva2VuID0gc2VjcmV0LmFjY2Vzc1Rva2VuO1xuXG4gIGlmICghYWNjZXNzVG9rZW4gfHwgaXNFeHBpcmVkKHNlY3JldC5leHAgPz8gMCkpIHtcbiAgICBpZiAoIXNlY3JldC5yZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBpbiBjb25maWd1cmF0aW9uIHRva2VuIHNlY3JldCcpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdSZWZyZXNoaW5nIGFjY2VzcyB0b2tlbicpO1xuICAgIGNvbnN0IHJvdGF0ZSA9IGF3YWl0IHNsYWNrQ2xpZW50LmdldCgndG9vbGluZy50b2tlbnMucm90YXRlJywge1xuICAgICAgc2VhcmNoUGFyYW1zOiB7IHJlZnJlc2hfdG9rZW46IHNlY3JldC5yZWZyZXNoVG9rZW4gfSxcbiAgICB9KS5qc29uPFJvdGF0ZVJlc3BvbnNlPigpO1xuXG4gICAgaWYgKCFyb3RhdGUub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggYWNjZXNzIHRva2VuOiAke3JvdGF0ZS5lcnJvcn1gKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0FjY2VzcyB0b2tlbiByZWZyZXNoZWQnKTtcblxuICAgIGFjY2Vzc1Rva2VuID0gcm90YXRlLnRva2VuO1xuXG4gICAgY29uc29sZS5sb2coJ1NhdmluZyBhY2Nlc3MgdG9rZW4nKTtcbiAgICBjb25zdCBwdXRTZWNyZXRWYWx1ZSA9IGF3YWl0IHNlY3JldHNtYW5hZ2VyLnB1dFNlY3JldFZhbHVlKHtcbiAgICAgIFNlY3JldElkOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuY29uZmlndXJhdGlvblRva2VuU2VjcmV0QXJuLFxuICAgICAgU2VjcmV0U3RyaW5nOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46IHJvdGF0ZS5yZWZyZXNoX3Rva2VuLFxuICAgICAgICBleHA6IHJvdGF0ZS5leHAsXG4gICAgICB9KSxcbiAgICB9KS5wcm9taXNlKCk7XG4gICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBzYXZlZCBhY2Nlc3MgdG9rZW4gaW4gc2VjcmV0ICR7cHV0U2VjcmV0VmFsdWUuQVJOfWApO1xuICB9XG5cbiAgY29uc3Qgb3BlcmF0aW9uID0gZXZlbnQuUmVxdWVzdFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmVxdWVzdCA9IGdldE1hbmlmZXN0UmVxdWVzdChldmVudCk7XG5cbiAgY29uc29sZS5sb2coYENhbGxpbmcgJHtvcGVyYXRpb259IG1hbmlmZXN0IEFQSTogJWpgLCByZXF1ZXN0KTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzbGFja0NsaWVudC5wb3N0KGBhcHBzLm1hbmlmZXN0LiR7b3BlcmF0aW9ufWAsIHtcbiAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gIH0sXG4gICAganNvbjogcmVxdWVzdCxcbiAgfSkuanNvbjxNYW5pZmVzdFJlc3BvbnNlPigpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5lcnJvcnNcbiAgICAgID8gcmVzcG9uc2UuZXJyb3JzLm1hcCgoZXJyKSA9PiBgJHtlcnIubWVzc2FnZX0gYXQgJHtlcnIucG9pbnRlcn1gKS5qb2luKCdcXG4nKVxuICAgICAgOiAnJztcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byAke29wZXJhdGlvbn0gbWFuaWZlc3Q6ICR7cmVzcG9uc2UuZXJyb3J9LiR7ZXJyb3JzID8gYFxcbiR7ZXJyb3JzfX1gIDogJyd9YCk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5ICR7b3BlcmF0aW9ufWQgU2xhY2sgYXBwICR7ZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkID8/IHJlc3BvbnNlLmFwcF9pZH1gKTtcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09ICdDcmVhdGUnICYmIHJlc3BvbnNlLmNyZWRlbnRpYWxzKSB7XG4gICAgY29uc29sZS5sb2coJ1NhdmluZyBhcHAgY3JlZGVudGlhbHMnKTtcbiAgICBjb25zdCBwdXRTZWNyZXRWYWx1ZSA9IGF3YWl0IHNlY3JldHNtYW5hZ2VyLnB1dFNlY3JldFZhbHVlKHtcbiAgICAgIFNlY3JldElkOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuY3JlZGVudGlhbHNTZWNyZXRBcm4sXG4gICAgICBTZWNyZXRTdHJpbmc6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYXBwSWQ6IHJlc3BvbnNlLmFwcF9pZCxcbiAgICAgICAgY2xpZW50SWQ6IHJlc3BvbnNlLmNyZWRlbnRpYWxzLmNsaWVudF9pZCxcbiAgICAgICAgY2xpZW50U2VjcmV0OiByZXNwb25zZS5jcmVkZW50aWFscy5jbGllbnRfc2VjcmV0LFxuICAgICAgICB2ZXJpZmljYXRpb25Ub2tlbjogcmVzcG9uc2UuY3JlZGVudGlhbHMudmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICBzaWduaW5nU2VjcmV0OiByZXNwb25zZS5jcmVkZW50aWFscy5zaWduaW5nX3NlY3JldCxcbiAgICAgIH0pLFxuICAgIH0pLnByb21pc2UoKTtcbiAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IHNhdmVkIGFwcCBjcmVkZW50aWFscyBpbiBzZWNyZXQgJHtwdXRTZWNyZXRWYWx1ZS5BUk59YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcmVzcG9uc2UuYXBwX2lkLFxuICAgIERhdGE6IHtcbiAgICAgIGFwcElkOiByZXNwb25zZS5hcHBfaWQsXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNFeHBpcmVkKGlhdDogbnVtYmVyKSB7XG4gIHJldHVybiAoaWF0IC0gKERhdGUubm93KCkgLyAxMDAwKSkgPCAwO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5pZmVzdFJlcXVlc3QoZXZlbnQ6IE9uRXZlbnRSZXF1ZXN0KTogTWFuaWZlc3RSZXF1ZXN0IHtcbiAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgIGNhc2UgJ0NyZWF0ZSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYW5pZmVzdDogZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLm1hbmlmZXN0LFxuICAgICAgfTtcbiAgICBjYXNlICdVcGRhdGUnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwX2lkOiBldmVudC5QaHlzaWNhbFJlc291cmNlSWQsXG4gICAgICAgIG1hbmlmZXN0OiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMubWFuaWZlc3QsXG4gICAgICB9O1xuICAgIGNhc2UgJ0RlbGV0ZSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBfaWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCEsXG4gICAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handler = void 0;
|
|
4
|
-
/* eslint-disable no-console */
|
|
5
|
-
const aws_sdk_1 = require("aws-sdk"); // eslint-disable-line import/no-extraneous-dependencies
|
|
6
|
-
function base62Encode(int) {
|
|
7
|
-
const characterSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
8
|
-
if (int === 0)
|
|
9
|
-
return '0';
|
|
10
|
-
let s = '';
|
|
11
|
-
while (int > 0) {
|
|
12
|
-
s = characterSet[int % 62] + s;
|
|
13
|
-
int = Math.floor(int / 62);
|
|
14
|
-
}
|
|
15
|
-
return s;
|
|
16
|
-
}
|
|
17
|
-
;
|
|
18
|
-
function getEnv(name) {
|
|
19
|
-
const value = process.env[name];
|
|
20
|
-
if (!value) {
|
|
21
|
-
throw new Error(`The environment variable ${name} is not defined`);
|
|
22
|
-
}
|
|
23
|
-
return value;
|
|
24
|
-
}
|
|
25
|
-
const documentClient = new aws_sdk_1.DynamoDB.DocumentClient({ apiVersion: '2012-08-10' });
|
|
26
|
-
const s3 = new aws_sdk_1.S3({ apiVersion: '2006-03-01' });
|
|
27
|
-
async function handler(event) {
|
|
28
|
-
var _a, _b;
|
|
29
|
-
try {
|
|
30
|
-
console.log('Event: %j', event);
|
|
31
|
-
const body = JSON.parse((_a = event.body) !== null && _a !== void 0 ? _a : '{}');
|
|
32
|
-
if (!body.url) {
|
|
33
|
-
return {
|
|
34
|
-
statusCode: 400,
|
|
35
|
-
body: '',
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
// Get next counter value
|
|
39
|
-
const update = await documentClient.update({
|
|
40
|
-
TableName: getEnv('TABLE_NAME'),
|
|
41
|
-
Key: { key: 'counter' },
|
|
42
|
-
UpdateExpression: 'ADD #value :incr',
|
|
43
|
-
ExpressionAttributeNames: { '#value': 'value' },
|
|
44
|
-
ExpressionAttributeValues: { ':incr': 1 },
|
|
45
|
-
ReturnValues: 'UPDATED_NEW',
|
|
46
|
-
}).promise();
|
|
47
|
-
const value = (_b = update.Attributes) === null || _b === void 0 ? void 0 : _b.value;
|
|
48
|
-
if (!value) {
|
|
49
|
-
throw new Error('Cannot get next counter value');
|
|
50
|
-
}
|
|
51
|
-
const key = base62Encode(value);
|
|
52
|
-
console.log('Key: %j', key);
|
|
53
|
-
// Put zero-byte object with redirection on S3
|
|
54
|
-
const putObject = await s3.putObject({
|
|
55
|
-
Bucket: getEnv('BUCKET_NAME'),
|
|
56
|
-
Key: key,
|
|
57
|
-
WebsiteRedirectLocation: body.url,
|
|
58
|
-
ACL: 'public-read',
|
|
59
|
-
}).promise();
|
|
60
|
-
console.log('Put object: %j', putObject);
|
|
61
|
-
// Return short url
|
|
62
|
-
return {
|
|
63
|
-
statusCode: 201,
|
|
64
|
-
body: JSON.stringify({
|
|
65
|
-
url: body.url,
|
|
66
|
-
shortUrl: `https://${getEnv('DOMAIN_NAME')}/${key}`,
|
|
67
|
-
}),
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
console.log(err);
|
|
72
|
-
return {
|
|
73
|
-
statusCode: 500,
|
|
74
|
-
body: '',
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
exports.handler = handler;
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91cmwtc2hvcnRlbmVyL2luZGV4LmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLHFDQUF1QyxDQUFDLHdEQUF3RDtBQUVoRyxTQUFTLFlBQVksQ0FBQyxHQUFXO0lBQy9CLE1BQU0sWUFBWSxHQUFHLGdFQUFnRSxDQUFDO0lBQ3RGLElBQUksR0FBRyxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUMxQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWCxPQUFPLEdBQUcsR0FBRyxDQUFDLEVBQUU7UUFDZCxDQUFDLEdBQUcsWUFBWSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBQUEsQ0FBQztBQUVGLFNBQVMsTUFBTSxDQUFDLElBQVk7SUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVoQyxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDO0tBQ3BFO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxrQkFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBRWpGLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFekMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFxQzs7SUFDakUsSUFBSTtRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWhDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLE9BQUMsS0FBSyxDQUFDLElBQUksbUNBQUksSUFBSSxDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDYixPQUFPO2dCQUNMLFVBQVUsRUFBRSxHQUFHO2dCQUNmLElBQUksRUFBRSxFQUFFO2FBQ1QsQ0FBQztTQUNIO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUN6QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUMvQixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO1lBQ3ZCLGdCQUFnQixFQUFFLGtCQUFrQjtZQUNwQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7WUFDL0MseUJBQXlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQ3pDLFlBQVksRUFBRSxhQUFhO1NBQzVCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUViLE1BQU0sS0FBSyxTQUFHLE1BQU0sQ0FBQyxVQUFVLDBDQUFFLEtBQUssQ0FBQztRQUV2QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTVCLDhDQUE4QztRQUM5QyxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDbkMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFDN0IsR0FBRyxFQUFFLEdBQUc7WUFDUix1QkFBdUIsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNqQyxHQUFHLEVBQUUsYUFBYTtTQUNuQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXpDLG1CQUFtQjtRQUNuQixPQUFPO1lBQ0wsVUFBVSxFQUFFLEdBQUc7WUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFFBQVEsRUFBRSxXQUFXLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLEVBQUU7YUFDcEQsQ0FBQztTQUNILENBQUM7S0FDSDtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqQixPQUFPO1lBQ0wsVUFBVSxFQUFFLEdBQUc7WUFDZixJQUFJLEVBQUUsRUFBRTtTQUNULENBQUM7S0FDSDtBQUNILENBQUM7QUF6REQsMEJBeURDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHsgRHluYW1vREIsIFMzIH0gZnJvbSAnYXdzLXNkayc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5cbmZ1bmN0aW9uIGJhc2U2MkVuY29kZShpbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNoYXJhY3RlclNldCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gIGlmIChpbnQgPT09IDApIHJldHVybiAnMCc7XG4gIGxldCBzID0gJyc7XG4gIHdoaWxlIChpbnQgPiAwKSB7XG4gICAgcyA9IGNoYXJhY3RlclNldFtpbnQgJSA2Ml0gKyBzO1xuICAgIGludCA9IE1hdGguZmxvb3IoaW50IC8gNjIpO1xuICB9XG4gIHJldHVybiBzO1xufTtcblxuZnVuY3Rpb24gZ2V0RW52KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnZbbmFtZV07XG5cbiAgaWYgKCF2YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlICR7bmFtZX0gaXMgbm90IGRlZmluZWRgKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuY29uc3QgZG9jdW1lbnRDbGllbnQgPSBuZXcgRHluYW1vREIuRG9jdW1lbnRDbGllbnQoeyBhcGlWZXJzaW9uOiAnMjAxMi0wOC0xMCcgfSk7XG5cbmNvbnN0IHMzID0gbmV3IFMzKHsgYXBpVmVyc2lvbjogJzIwMDYtMDMtMDEnIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUV2ZW50KTogUHJvbWlzZTxBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0PiB7XG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coJ0V2ZW50OiAlaicsIGV2ZW50KTtcblxuICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGV2ZW50LmJvZHkgPz8gJ3t9Jyk7XG5cbiAgICBpZiAoIWJvZHkudXJsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICAgIGJvZHk6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbmV4dCBjb3VudGVyIHZhbHVlXG4gICAgY29uc3QgdXBkYXRlID0gYXdhaXQgZG9jdW1lbnRDbGllbnQudXBkYXRlKHtcbiAgICAgIFRhYmxlTmFtZTogZ2V0RW52KCdUQUJMRV9OQU1FJyksXG4gICAgICBLZXk6IHsga2V5OiAnY291bnRlcicgfSxcbiAgICAgIFVwZGF0ZUV4cHJlc3Npb246ICdBREQgI3ZhbHVlIDppbmNyJyxcbiAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczogeyAnI3ZhbHVlJzogJ3ZhbHVlJyB9LFxuICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczogeyAnOmluY3InOiAxIH0sXG4gICAgICBSZXR1cm5WYWx1ZXM6ICdVUERBVEVEX05FVycsXG4gICAgfSkucHJvbWlzZSgpO1xuXG4gICAgY29uc3QgdmFsdWUgPSB1cGRhdGUuQXR0cmlidXRlcz8udmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgbmV4dCBjb3VudGVyIHZhbHVlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gYmFzZTYyRW5jb2RlKHZhbHVlKTtcbiAgICBjb25zb2xlLmxvZygnS2V5OiAlaicsIGtleSk7XG5cbiAgICAvLyBQdXQgemVyby1ieXRlIG9iamVjdCB3aXRoIHJlZGlyZWN0aW9uIG9uIFMzXG4gICAgY29uc3QgcHV0T2JqZWN0ID0gYXdhaXQgczMucHV0T2JqZWN0KHtcbiAgICAgIEJ1Y2tldDogZ2V0RW52KCdCVUNLRVRfTkFNRScpLFxuICAgICAgS2V5OiBrZXksXG4gICAgICBXZWJzaXRlUmVkaXJlY3RMb2NhdGlvbjogYm9keS51cmwsXG4gICAgICBBQ0w6ICdwdWJsaWMtcmVhZCcsXG4gICAgfSkucHJvbWlzZSgpO1xuICAgIGNvbnNvbGUubG9nKCdQdXQgb2JqZWN0OiAlaicsIHB1dE9iamVjdCk7XG5cbiAgICAvLyBSZXR1cm4gc2hvcnQgdXJsXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDIwMSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdXJsOiBib2R5LnVybCxcbiAgICAgICAgc2hvcnRVcmw6IGBodHRwczovLyR7Z2V0RW52KCdET01BSU5fTkFNRScpfS8ke2tleX1gLFxuICAgICAgfSksXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coZXJyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBib2R5OiAnJyxcbiAgICB9O1xuICB9XG59XG4iXX0=
|