serverless-spy 0.0.35 → 0.0.37
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/.jsii +236 -9
- package/API.md +161 -0
- package/cli/cli.ts +145 -75
- package/cli/icons/Arch_AWS-Lambda_16.svg +18 -0
- package/cli/icons/Arch_Amazon-DynamoDB_16.svg +18 -0
- package/cli/icons/Arch_Amazon-EventBridge_16.svg +18 -0
- package/cli/icons/Arch_Amazon-Simple-Notification-Service_16.svg +18 -0
- package/cli/icons/Arch_Amazon-Simple-Queue-Service_16.svg +18 -0
- package/cli/icons/Arch_Amazon-Simple-Storage-Service_16.svg +18 -0
- package/cli/index.html +84 -25
- package/cli/node_modules/commander/LICENSE +22 -0
- package/cli/node_modules/commander/Readme.md +1114 -0
- package/cli/node_modules/commander/esm.mjs +16 -0
- package/cli/node_modules/commander/index.js +27 -0
- package/cli/node_modules/commander/lib/argument.js +147 -0
- package/cli/node_modules/commander/lib/command.js +2161 -0
- package/cli/node_modules/commander/lib/error.js +45 -0
- package/cli/node_modules/commander/lib/help.js +406 -0
- package/cli/node_modules/commander/lib/option.js +324 -0
- package/cli/node_modules/commander/lib/suggestSimilar.js +100 -0
- package/cli/node_modules/commander/package-support.json +16 -0
- package/cli/node_modules/commander/package.json +80 -0
- package/cli/node_modules/commander/typings/index.d.ts +879 -0
- package/cli/package.json +23 -0
- package/cli/sampleData.ts +518 -0
- package/cli/style.css +66 -42
- package/cli/webServerlessSpy.ts +461 -0
- package/common/SpyEventSender.ts +291 -0
- package/common/getWebSocketUrl.ts +21 -4
- package/common/spyEvents/EventBridgeBaseSpyEvent.ts +13 -0
- package/common/spyEvents/EventBridgeRuleSpyEvent.ts +2 -7
- package/common/spyEvents/EventBridgeSpyEvent.ts +2 -7
- package/common/spyEvents/FunctionBaseSpyEvent.ts +7 -0
- package/common/spyEvents/FunctionConsole.ts +5 -0
- package/common/spyEvents/FunctionConsoleSpyEvent.ts +5 -8
- package/common/spyEvents/FunctionResponseSpyEvent.ts +2 -5
- package/common/spyEvents/SnsSpyEventBase.ts +11 -0
- package/common/spyEvents/SnsSubscriptionSpyEvent.ts +3 -9
- package/common/spyEvents/SnsTopicSpyEvent.ts +3 -9
- package/dist/releasetag.txt +1 -1
- package/extension/interceptor.ts +107 -27
- package/functions/sendMessage.ts +4 -2
- package/functions/sqsSubscriptionAndDropAllMessages.ts +3 -0
- package/lib/cli/cli.js +124 -65
- package/lib/cli/cli.mjs +125 -66
- package/lib/cli/sampleData.d.ts +892 -0
- package/lib/cli/sampleData.js +481 -0
- package/lib/cli/sampleData.mjs +478 -0
- package/lib/cli/webServerlessSpy.js +5516 -0
- package/lib/cli/webServerlessSpy.js.map +7 -0
- package/lib/common/SpyEventSender.d.ts +17 -0
- package/lib/common/SpyEventSender.js +227 -0
- package/lib/common/SpyEventSender.mjs +223 -0
- package/lib/common/getWebSocketUrl.d.ts +1 -1
- package/lib/common/getWebSocketUrl.js +19 -7
- package/lib/common/getWebSocketUrl.mjs +17 -5
- package/lib/common/spyEvents/EventBridgeBaseSpyEvent.d.ts +9 -0
- package/lib/common/spyEvents/EventBridgeBaseSpyEvent.js +3 -0
- package/lib/common/spyEvents/EventBridgeBaseSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.d.ts +2 -7
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.js +1 -1
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/EventBridgeSpyEvent.d.ts +2 -7
- package/lib/common/spyEvents/EventBridgeSpyEvent.js +1 -1
- package/lib/common/spyEvents/EventBridgeSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/FunctionBaseSpyEvent.d.ts +6 -0
- package/lib/common/spyEvents/FunctionBaseSpyEvent.js +3 -0
- package/lib/common/spyEvents/FunctionBaseSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/FunctionConsole.d.ts +5 -0
- package/lib/common/spyEvents/FunctionConsole.js +3 -0
- package/lib/common/spyEvents/FunctionConsole.mjs +2 -0
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.d.ts +4 -8
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.js +1 -1
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/FunctionResponseSpyEvent.d.ts +2 -5
- package/lib/common/spyEvents/FunctionResponseSpyEvent.js +1 -1
- package/lib/common/spyEvents/FunctionResponseSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/SnsSpyEventBase.d.ts +10 -0
- package/lib/common/spyEvents/SnsSpyEventBase.js +3 -0
- package/lib/common/spyEvents/SnsSpyEventBase.mjs +2 -0
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.d.ts +2 -9
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.js +1 -1
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/SnsTopicSpyEvent.d.ts +2 -9
- package/lib/common/spyEvents/SnsTopicSpyEvent.js +1 -1
- package/lib/common/spyEvents/SnsTopicSpyEvent.mjs +1 -1
- package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js +10793 -23825
- package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js.map +4 -4
- package/lib/listener/ServerlessSpyListenerParams.d.ts +1 -0
- package/lib/listener/ServerlessSpyListenerParams.js +1 -1
- package/lib/listener/ServerlessSpyListenerParams.mjs +1 -1
- package/lib/listener/SpyHandlers.ts.d.ts +30 -2
- package/lib/listener/SpyHandlers.ts.js +1 -1
- package/lib/listener/SpyHandlers.ts.mjs +1 -1
- package/lib/listener/WsListener.d.ts +4 -21
- package/lib/listener/WsListener.js +21 -13
- package/lib/listener/WsListener.mjs +22 -14
- package/lib/src/ServerlessSpy.d.ts +44 -14
- package/lib/src/ServerlessSpy.js +228 -86
- package/lib/src/ServerlessSpy.mjs +227 -85
- package/lib/src/common/envVariableNames.d.ts +6 -2
- package/lib/src/common/envVariableNames.js +6 -2
- package/lib/src/common/envVariableNames.mjs +6 -2
- package/listener/ServerlessSpyListenerParams.ts +1 -0
- package/listener/SpyHandlers.ts.ts +70 -9
- package/listener/WsListener.ts +39 -24
- package/package.json +5 -3
- package/cli/serverlessSpy.js +0 -73
- package/cli/ws.ts +0 -79
- package/common/publishSpyEvent.ts +0 -269
- package/lib/cli/ws.d.ts +0 -1
- package/lib/cli/ws.js +0 -68
- package/lib/cli/ws.mjs +0 -66
- package/lib/common/publishSpyEvent.d.ts +0 -4
- package/lib/common/publishSpyEvent.js +0 -211
- package/lib/common/publishSpyEvent.mjs +0 -205
package/functions/sendMessage.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SpyEventSender } from '../common/SpyEventSender';
|
|
2
|
+
|
|
3
|
+
const spyEventSender = new SpyEventSender();
|
|
2
4
|
|
|
3
5
|
export const handler = async (event: any) => {
|
|
4
6
|
try {
|
|
5
|
-
await publishSpyEvent(event);
|
|
7
|
+
await spyEventSender.publishSpyEvent(event);
|
|
6
8
|
} catch (e) {
|
|
7
9
|
console.error(e);
|
|
8
10
|
return { statusCode: 500, body: (e as Error)?.stack };
|
package/lib/cli/cli.js
CHANGED
|
@@ -3,85 +3,144 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const fs = require("fs");
|
|
4
4
|
const http = require("http");
|
|
5
5
|
const path = require("path");
|
|
6
|
+
const util_1 = require("util");
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const get_installed_path_1 = require("get-installed-path");
|
|
9
|
+
const open_1 = require("open");
|
|
6
10
|
const getWebSocketUrl_1 = require("../common/getWebSocketUrl");
|
|
11
|
+
const readFileAsync = (0, util_1.promisify)(fs.readFile);
|
|
7
12
|
async function run() {
|
|
8
|
-
|
|
9
|
-
let
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
serverlessSpyWsUrl = config[Object.keys(config)[0]].ServerlessSpyWsUrl;
|
|
21
|
-
}
|
|
13
|
+
let stackList;
|
|
14
|
+
let cdkOutput;
|
|
15
|
+
commander_1.program
|
|
16
|
+
.option('--ws <ws>', 'Websocket link')
|
|
17
|
+
.option('--cdkoutput <cdkoutput>', 'CDK output file that contains Websocket link in a property ServerlessSpyWsUrl')
|
|
18
|
+
.option('--cdkstack <cdkstack>', 'CDK stack in cdk output file. If not specified the first one is picked.')
|
|
19
|
+
.option('--open', 'Open browser', true)
|
|
20
|
+
.option('--port <p>', `CDK stack in cdk output file. If not specified the first one is picked.`, '3456');
|
|
21
|
+
commander_1.program.parse();
|
|
22
|
+
const options = commander_1.program.opts();
|
|
23
|
+
if (!options.ws && !options.cdkoutput) {
|
|
24
|
+
throw new Error('--ws or --cdkstack parameter not specified');
|
|
22
25
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
if (options.cdkoutput) {
|
|
27
|
+
const rawdata = fs.readFileSync(path.join(__dirname, options.cdkoutput));
|
|
28
|
+
cdkOutput = JSON.parse(rawdata.toString());
|
|
29
|
+
stackList = Object.keys(cdkOutput);
|
|
27
30
|
}
|
|
28
|
-
console.log('serverlessSpyWsUrl', serverlessSpyWsUrl);
|
|
29
|
-
const wsUrl = await (0, getWebSocketUrl_1.getWebSocketUrl)(serverlessSpyWsUrl);
|
|
30
|
-
// source https://developer.mozilla.org/en-US/docs/Learn/Server-side/Node_server_without_framework
|
|
31
31
|
http
|
|
32
32
|
.createServer((request, response) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
};
|
|
56
|
-
const contentType = mimeTypes[extname] || 'application/octet-stream';
|
|
57
|
-
fs.readFile(filePath, (error, content) => {
|
|
58
|
-
if (error) {
|
|
59
|
-
if (error.code === 'ENOENT') {
|
|
60
|
-
fs.readFile('./404.html', (_err, cont) => {
|
|
61
|
-
response.writeHead(404, { 'Content-Type': 'text/html' });
|
|
62
|
-
response.end(cont, 'utf-8');
|
|
33
|
+
void (async () => {
|
|
34
|
+
try {
|
|
35
|
+
//console.log('request ', request.url);
|
|
36
|
+
let filePath = `.${request.url}`;
|
|
37
|
+
//remove query parameters
|
|
38
|
+
filePath = filePath.split('?')[0];
|
|
39
|
+
let rootFolder = __dirname;
|
|
40
|
+
if (request.url?.startsWith('/webServerlessSpy.js')) {
|
|
41
|
+
//get transpiled TS to JS files
|
|
42
|
+
rootFolder = path.join(__dirname, `../lib/cli`);
|
|
43
|
+
}
|
|
44
|
+
else if (request.url?.startsWith('/bootstrap/')) {
|
|
45
|
+
filePath = filePath.substring('/bootstrap/'.length);
|
|
46
|
+
const bootstrapFolder = await (0, get_installed_path_1.getInstalledPath)('bootstrap', {
|
|
47
|
+
local: true,
|
|
48
|
+
});
|
|
49
|
+
rootFolder = bootstrapFolder;
|
|
50
|
+
}
|
|
51
|
+
else if (request.url?.startsWith('/bootstrap-icons/')) {
|
|
52
|
+
filePath = filePath.substring('/bootstrap-icons/'.length);
|
|
53
|
+
const bootstrapFolder = await (0, get_installed_path_1.getInstalledPath)('bootstrap-icons', {
|
|
54
|
+
local: true,
|
|
63
55
|
});
|
|
56
|
+
rootFolder = bootstrapFolder;
|
|
64
57
|
}
|
|
65
58
|
else {
|
|
66
|
-
|
|
67
|
-
|
|
59
|
+
if (filePath === './') {
|
|
60
|
+
filePath = './index.html';
|
|
61
|
+
}
|
|
68
62
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
63
|
+
filePath = path.join(rootFolder, filePath);
|
|
64
|
+
//console.log(`${request.url} --> ${filePath}`);
|
|
65
|
+
const extname = String(path.extname(filePath)).toLowerCase();
|
|
66
|
+
const mimeTypes = {
|
|
67
|
+
'.html': 'text/html',
|
|
68
|
+
'.js': 'text/javascript',
|
|
69
|
+
'.css': 'text/css',
|
|
70
|
+
'.json': 'application/json',
|
|
71
|
+
'.png': 'image/png',
|
|
72
|
+
'.jpg': 'image/jpg',
|
|
73
|
+
'.gif': 'image/gif',
|
|
74
|
+
'.svg': 'image/svg+xml',
|
|
75
|
+
'.wav': 'audio/wav',
|
|
76
|
+
'.mp4': 'video/mp4',
|
|
77
|
+
'.woff': 'application/font-woff',
|
|
78
|
+
'.ttf': 'application/font-ttf',
|
|
79
|
+
'.eot': 'application/vnd.ms-fontobject',
|
|
80
|
+
'.otf': 'application/font-otf',
|
|
81
|
+
'.wasm': 'application/wasm',
|
|
82
|
+
};
|
|
83
|
+
const contentType = mimeTypes[extname] || 'application/octet-stream';
|
|
84
|
+
if (request.url === '/stackList') {
|
|
85
|
+
response.writeHead(200, { 'Content-Type': 'application/json' });
|
|
86
|
+
response.end(JSON.stringify(stackList), 'utf-8');
|
|
87
|
+
}
|
|
88
|
+
else if (request.url?.match('^/wsUrl')) {
|
|
89
|
+
let wsUrl;
|
|
90
|
+
if (options.ws) {
|
|
91
|
+
wsUrl = options.ws;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// options.cdkoutput
|
|
95
|
+
const urlPaths = request.url.split('/');
|
|
96
|
+
let stack = urlPaths[2];
|
|
97
|
+
if (!stack) {
|
|
98
|
+
stack = options.cdkstack;
|
|
99
|
+
}
|
|
100
|
+
if (stack) {
|
|
101
|
+
wsUrl = cdkOutput[stack].ServerlessSpyWsUrl;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
if (cdkOutput && cdkOutput[Object.keys(cdkOutput)[0]]) {
|
|
105
|
+
wsUrl =
|
|
106
|
+
cdkOutput[Object.keys(cdkOutput)[0]].ServerlessSpyWsUrl;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (!wsUrl) {
|
|
111
|
+
throw new Error('Missing websocket url');
|
|
112
|
+
}
|
|
113
|
+
//console.log(`WS URL: ${wsUrl}`);
|
|
114
|
+
const signedWSUrl = await (0, getWebSocketUrl_1.getSignedWebSocketUrl)(wsUrl);
|
|
115
|
+
response.writeHead(200, { 'Content-Type': 'text/html' });
|
|
116
|
+
response.end(signedWSUrl, 'utf-8');
|
|
77
117
|
}
|
|
78
118
|
else {
|
|
79
|
-
|
|
119
|
+
try {
|
|
120
|
+
const content = await readFileAsync(filePath);
|
|
121
|
+
response.writeHead(200, { 'Content-Type': contentType });
|
|
122
|
+
response.end(content, 'utf-8');
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (error.code === 'ENOENT') {
|
|
126
|
+
response.writeHead(404, { 'Content-Type': 'text/html' });
|
|
127
|
+
response.end(`No such file or directory ${request.url}`, 'utf-8');
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
response.writeHead(500);
|
|
131
|
+
response.end(`Error: ${error.code} ..\n`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
80
134
|
}
|
|
81
135
|
}
|
|
82
|
-
|
|
136
|
+
catch (err) {
|
|
137
|
+
response.writeHead(500, { 'Content-Type': 'text/html' });
|
|
138
|
+
response.end(err.message, 'utf-8');
|
|
139
|
+
}
|
|
140
|
+
})();
|
|
83
141
|
})
|
|
84
|
-
.listen(
|
|
142
|
+
.listen(options.port);
|
|
143
|
+
await (0, open_1.default)(`http://localhost:${options.port}`);
|
|
85
144
|
}
|
|
86
145
|
run().catch(console.error);
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY2xpL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLCtEQUE0RDtBQUU1RCxLQUFLLFVBQVUsR0FBRztJQUNoQixNQUFNLGlCQUFpQixHQUFHLHlCQUF5QixDQUFDO0lBRXBELElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFDcEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFOUMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QywrQkFBK0I7WUFDL0IsSUFBSTtZQUNKLGtCQUFrQjtZQUNsQixrQ0FBa0M7WUFDbEMsTUFBTTtZQUNOLElBQUk7WUFFSixrQkFBa0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1NBQ3hFO0tBQ0Y7SUFFRCxrQkFBa0I7UUFDaEIsMkRBQTJELENBQUM7SUFFOUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUNuQztJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUV0RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsaUNBQWUsRUFBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRXhELGtHQUFrRztJQUNsRyxJQUFJO1NBQ0QsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyQyxJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDckIsUUFBUSxHQUFHLGNBQWMsQ0FBQztTQUMzQjtRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQVE7WUFDckIsT0FBTyxFQUFFLFdBQVc7WUFDcEIsS0FBSyxFQUFFLGlCQUFpQjtZQUN4QixNQUFNLEVBQUUsVUFBVTtZQUNsQixPQUFPLEVBQUUsa0JBQWtCO1lBQzNCLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxlQUFlO1lBQ3ZCLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE9BQU8sRUFBRSx1QkFBdUI7WUFDaEMsTUFBTSxFQUFFLHNCQUFzQjtZQUM5QixNQUFNLEVBQUUsK0JBQStCO1lBQ3ZDLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsT0FBTyxFQUFFLGtCQUFrQjtTQUM1QixDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLDBCQUEwQixDQUFDO1FBRXJFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3ZDLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7b0JBQzNCLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO3dCQUN2QyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO3dCQUN6RCxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEIsUUFBUSxDQUFDLEdBQUcsQ0FDViwrQ0FBK0MsS0FBSyxDQUFDLElBQUksT0FBTyxDQUNqRSxDQUFDO2lCQUNIO2FBQ0Y7aUJBQU07Z0JBQ0wsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDekQsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLG1CQUFtQixFQUFFO29CQUN2QyxNQUFNLFVBQVUsR0FBRyxPQUFPO3lCQUN2QixRQUFRLEVBQUU7eUJBQ1YsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUMzQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDbkM7cUJBQU07b0JBQ0wsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ2hDO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztTQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0V2ViU29ja2V0VXJsIH0gZnJvbSAnLi4vY29tbW9uL2dldFdlYlNvY2tldFVybCc7XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgY29uc3QgY2RrRXhwb3J0RmlsZU5hbWUgPSAnLi4vLnNweS9jZGtFeHBvcnRzLmpzb24nO1xuXG4gIGxldCBzZXJ2ZXJsZXNzU3B5V3NVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoY2RrRXhwb3J0RmlsZU5hbWUpKSB7XG4gICAgY29uc3QgcmF3ZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhjZGtFeHBvcnRGaWxlTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShyYXdkYXRhLnRvU3RyaW5nKCkpO1xuXG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWdbT2JqZWN0LmtleXMoY29uZmlnKVswXV0pIHtcbiAgICAgIC8vIGdldCBmaXJzdCBTZXJ2ZXJsZXNzU3B5V3NVcmxcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgXCJteS1zdGFja1wiOiB7XG4gICAgICAvLyAgICAgXCJTZXJ2ZXJsZXNzU3B5V3NVcmxcIjogXCJ4eHhcIlxuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG5cbiAgICAgIHNlcnZlcmxlc3NTcHlXc1VybCA9IGNvbmZpZ1tPYmplY3Qua2V5cyhjb25maWcpWzBdXS5TZXJ2ZXJsZXNzU3B5V3NVcmw7XG4gICAgfVxuICB9XG5cbiAgc2VydmVybGVzc1NweVdzVXJsID1cbiAgICAnd3NzOi8vcHJlaDF4bzF4aC5leGVjdXRlLWFwaS5ldS13ZXN0LTEuYW1hem9uYXdzLmNvbS9wcm9kJztcblxuICBpZiAoIXNlcnZlcmxlc3NTcHlXc1VybCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBXUyB1cmwnKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdzZXJ2ZXJsZXNzU3B5V3NVcmwnLCBzZXJ2ZXJsZXNzU3B5V3NVcmwpO1xuXG4gIGNvbnN0IHdzVXJsID0gYXdhaXQgZ2V0V2ViU29ja2V0VXJsKHNlcnZlcmxlc3NTcHlXc1VybCk7XG5cbiAgLy8gc291cmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvTGVhcm4vU2VydmVyLXNpZGUvTm9kZV9zZXJ2ZXJfd2l0aG91dF9mcmFtZXdvcmtcbiAgaHR0cFxuICAgIC5jcmVhdGVTZXJ2ZXIoKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygncmVxdWVzdCAnLCByZXF1ZXN0LnVybCk7XG5cbiAgICAgIGxldCBmaWxlUGF0aCA9IGAuJHtyZXF1ZXN0LnVybH1gO1xuICAgICAgaWYgKGZpbGVQYXRoID09PSAnLi8nKSB7XG4gICAgICAgIGZpbGVQYXRoID0gJy4vaW5kZXguaHRtbCc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dG5hbWUgPSBTdHJpbmcocGF0aC5leHRuYW1lKGZpbGVQYXRoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IG1pbWVUeXBlczogYW55ID0ge1xuICAgICAgICAnLmh0bWwnOiAndGV4dC9odG1sJyxcbiAgICAgICAgJy5qcyc6ICd0ZXh0L2phdmFzY3JpcHQnLFxuICAgICAgICAnLmNzcyc6ICd0ZXh0L2NzcycsXG4gICAgICAgICcuanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgJy5wbmcnOiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgJy5qcGcnOiAnaW1hZ2UvanBnJyxcbiAgICAgICAgJy5naWYnOiAnaW1hZ2UvZ2lmJyxcbiAgICAgICAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXG4gICAgICAgICcud2F2JzogJ2F1ZGlvL3dhdicsXG4gICAgICAgICcubXA0JzogJ3ZpZGVvL21wNCcsXG4gICAgICAgICcud29mZic6ICdhcHBsaWNhdGlvbi9mb250LXdvZmYnLFxuICAgICAgICAnLnR0Zic6ICdhcHBsaWNhdGlvbi9mb250LXR0ZicsXG4gICAgICAgICcuZW90JzogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcbiAgICAgICAgJy5vdGYnOiAnYXBwbGljYXRpb24vZm9udC1vdGYnLFxuICAgICAgICAnLndhc20nOiAnYXBwbGljYXRpb24vd2FzbScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IG1pbWVUeXBlc1tleHRuYW1lXSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcblxuICAgICAgZnMucmVhZEZpbGUoZmlsZVBhdGgsIChlcnJvciwgY29udGVudCkgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIGZzLnJlYWRGaWxlKCcuLzQwNC5odG1sJywgKF9lcnIsIGNvbnQpID0+IHtcbiAgICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCwgeyAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcgfSk7XG4gICAgICAgICAgICAgIHJlc3BvbnNlLmVuZChjb250LCAndXRmLTgnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNTAwKTtcbiAgICAgICAgICAgIHJlc3BvbnNlLmVuZChcbiAgICAgICAgICAgICAgYFNvcnJ5LCBjaGVjayB3aXRoIHRoZSBzaXRlIGFkbWluIGZvciBlcnJvcjogJHtlcnJvci5jb2RlfSAuLlxcbmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgyMDAsIHsgJ0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlIH0pO1xuICAgICAgICAgIGlmIChyZXF1ZXN0LnVybCA9PT0gJy9zZXJ2ZXJsZXNzU3B5LmpzJykge1xuICAgICAgICAgICAgY29uc3QgY29udGVudE5ldyA9IGNvbnRlbnRcbiAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgLnJlcGxhY2UoJ1NFUlZFUkxFU1NfU1BZX1dTX1VSTCcsIHdzVXJsKTtcbiAgICAgICAgICAgIHJlc3BvbnNlLmVuZChjb250ZW50TmV3LCAndXRmLTgnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UuZW5kKGNvbnRlbnQsICd1dGYtOCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSlcbiAgICAubGlzdGVuKDgxMjUpO1xufVxuXG5ydW4oKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiJdfQ==
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY2xpL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLCtCQUFpQztBQUNqQyx5Q0FBb0M7QUFDcEMsMkRBQXNEO0FBQ3RELCtCQUF3QjtBQUN4QiwrREFBa0U7QUFFbEUsTUFBTSxhQUFhLEdBQUcsSUFBQSxnQkFBUyxFQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUU3QyxLQUFLLFVBQVUsR0FBRztJQUNoQixJQUFJLFNBQStCLENBQUM7SUFDcEMsSUFBSSxTQUFpRCxDQUFDO0lBRXRELG1CQUFPO1NBQ0osTUFBTSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQztTQUNyQyxNQUFNLENBQ0wseUJBQXlCLEVBQ3pCLCtFQUErRSxDQUNoRjtTQUNBLE1BQU0sQ0FDTCx1QkFBdUIsRUFDdkIseUVBQXlFLENBQzFFO1NBQ0EsTUFBTSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDO1NBQ3RDLE1BQU0sQ0FDTCxZQUFZLEVBQ1oseUVBQXlFLEVBQ3pFLE1BQU0sQ0FDUCxDQUFDO0lBQ0osbUJBQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVoQixNQUFNLE9BQU8sR0FBRyxtQkFBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRS9CLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtRQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7S0FDL0Q7SUFFRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7UUFDckIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN6RSxTQUFTLEdBQUcsSUFB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RXhCLE1BQU0sSUFBQSxjQUFJLEVBQUMsb0JBQW9CLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IHByb2dyYW0gfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgZ2V0SW5zdGFsbGVkUGF0aCB9IGZyb20gJ2dldC1pbnN0YWxsZWQtcGF0aCc7XG5pbXBvcnQgb3BlbiBmcm9tICdvcGVuJztcbmltcG9ydCB7IGdldFNpZ25lZFdlYlNvY2tldFVybCB9IGZyb20gJy4uL2NvbW1vbi9nZXRXZWJTb2NrZXRVcmwnO1xuXG5jb25zdCByZWFkRmlsZUFzeW5jID0gcHJvbWlzaWZ5KGZzLnJlYWRGaWxlKTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuKCkge1xuICBsZXQgc3RhY2tMaXN0OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IGNka091dHB1dDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgcHJvZ3JhbVxuICAgIC5vcHRpb24oJy0td3MgPHdzPicsICdXZWJzb2NrZXQgbGluaycpXG4gICAgLm9wdGlvbihcbiAgICAgICctLWNka291dHB1dCA8Y2Rrb3V0cHV0PicsXG4gICAgICAnQ0RLIG91dHB1dCBmaWxlIHRoYXQgY29udGFpbnMgV2Vic29ja2V0IGxpbmsgaW4gYSBwcm9wZXJ0eSBTZXJ2ZXJsZXNzU3B5V3NVcmwnXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAnLS1jZGtzdGFjayA8Y2Rrc3RhY2s+JyxcbiAgICAgICdDREsgc3RhY2sgaW4gY2RrIG91dHB1dCBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBmaXJzdCBvbmUgaXMgcGlja2VkLidcbiAgICApXG4gICAgLm9wdGlvbignLS1vcGVuJywgJ09wZW4gYnJvd3NlcicsIHRydWUpXG4gICAgLm9wdGlvbihcbiAgICAgICctLXBvcnQgPHA+JyxcbiAgICAgIGBDREsgc3RhY2sgaW4gY2RrIG91dHB1dCBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBmaXJzdCBvbmUgaXMgcGlja2VkLmAsXG4gICAgICAnMzQ1NidcbiAgICApO1xuICBwcm9ncmFtLnBhcnNlKCk7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHByb2dyYW0ub3B0cygpO1xuXG4gIGlmICghb3B0aW9ucy53cyAmJiAhb3B0aW9ucy5jZGtvdXRwdXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJy0td3Mgb3IgLS1jZGtzdGFjayBwYXJhbWV0ZXIgbm90IHNwZWNpZmllZCcpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuY2Rrb3V0cHV0KSB7XG4gICAgY29uc3QgcmF3ZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCBvcHRpb25zLmNka291dHB1dCkpO1xuICAgIGNka091dHB1dCA9IEpTT04ucGFyc2UocmF3ZGF0YS50b1N0cmluZygpKTtcbiAgICBzdGFja0xpc3QgPSBPYmplY3Qua2V5cyhjZGtPdXRwdXQpO1xuICB9XG5cbiAgaHR0cFxuICAgIC5jcmVhdGVTZXJ2ZXIoKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZygncmVxdWVzdCAnLCByZXF1ZXN0LnVybCk7XG4gICAgICAgICAgbGV0IGZpbGVQYXRoOiBzdHJpbmcgPSBgLiR7cmVxdWVzdC51cmx9YDtcbiAgICAgICAgICAvL3JlbW92ZSBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5zcGxpdCgnPycpWzBdO1xuICAgICAgICAgIGxldCByb290Rm9sZGVyID0gX19kaXJuYW1lO1xuXG4gICAgICAgICAgaWYgKHJlcXVlc3QudXJsPy5zdGFydHNXaXRoKCcvd2ViU2VydmVybGVzc1NweS5qcycpKSB7XG4gICAgICAgICAgICAvL2dldCB0cmFuc3BpbGVkIFRTIHRvIEpTIGZpbGVzXG4gICAgICAgICAgICByb290Rm9sZGVyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgYC4uL2xpYi9jbGlgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QudXJsPy5zdGFydHNXaXRoKCcvYm9vdHN0cmFwLycpKSB7XG4gICAgICAgICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZygnL2Jvb3RzdHJhcC8nLmxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBib290c3RyYXBGb2xkZXIgPSBhd2FpdCBnZXRJbnN0YWxsZWRQYXRoKCdib290c3RyYXAnLCB7XG4gICAgICAgICAgICAgIGxvY2FsOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJvb3RGb2xkZXIgPSBib290c3RyYXBGb2xkZXI7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LnVybD8uc3RhcnRzV2l0aCgnL2Jvb3RzdHJhcC1pY29ucy8nKSkge1xuICAgICAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoJy9ib290c3RyYXAtaWNvbnMvJy5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgYm9vdHN0cmFwRm9sZGVyID0gYXdhaXQgZ2V0SW5zdGFsbGVkUGF0aCgnYm9vdHN0cmFwLWljb25zJywge1xuICAgICAgICAgICAgICBsb2NhbDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByb290Rm9sZGVyID0gYm9vdHN0cmFwRm9sZGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZmlsZVBhdGggPT09ICcuLycpIHtcbiAgICAgICAgICAgICAgZmlsZVBhdGggPSAnLi9pbmRleC5odG1sJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWxlUGF0aCA9IHBhdGguam9pbihyb290Rm9sZGVyLCBmaWxlUGF0aCk7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhgJHtyZXF1ZXN0LnVybH0gLS0+ICR7ZmlsZVBhdGh9YCk7XG5cbiAgICAgICAgICBjb25zdCBleHRuYW1lID0gU3RyaW5nKHBhdGguZXh0bmFtZShmaWxlUGF0aCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgY29uc3QgbWltZVR5cGVzOiBhbnkgPSB7XG4gICAgICAgICAgICAnLmh0bWwnOiAndGV4dC9odG1sJyxcbiAgICAgICAgICAgICcuanMnOiAndGV4dC9qYXZhc2NyaXB0JyxcbiAgICAgICAgICAgICcuY3NzJzogJ3RleHQvY3NzJyxcbiAgICAgICAgICAgICcuanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICcucG5nJzogJ2ltYWdlL3BuZycsXG4gICAgICAgICAgICAnLmpwZyc6ICdpbWFnZS9qcGcnLFxuICAgICAgICAgICAgJy5naWYnOiAnaW1hZ2UvZ2lmJyxcbiAgICAgICAgICAgICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAgICAgICAgICAgJy53YXYnOiAnYXVkaW8vd2F2JyxcbiAgICAgICAgICAgICcubXA0JzogJ3ZpZGVvL21wNCcsXG4gICAgICAgICAgICAnLndvZmYnOiAnYXBwbGljYXRpb24vZm9udC13b2ZmJyxcbiAgICAgICAgICAgICcudHRmJzogJ2FwcGxpY2F0aW9uL2ZvbnQtdHRmJyxcbiAgICAgICAgICAgICcuZW90JzogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcbiAgICAgICAgICAgICcub3RmJzogJ2FwcGxpY2F0aW9uL2ZvbnQtb3RmJyxcbiAgICAgICAgICAgICcud2FzbSc6ICdhcHBsaWNhdGlvbi93YXNtJyxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBtaW1lVHlwZXNbZXh0bmFtZV0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG5cbiAgICAgICAgICBpZiAocmVxdWVzdC51cmwgPT09ICcvc3RhY2tMaXN0Jykge1xuICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDIwMCwgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2UuZW5kKEpTT04uc3RyaW5naWZ5KHN0YWNrTGlzdCksICd1dGYtOCcpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC51cmw/Lm1hdGNoKCdeL3dzVXJsJykpIHtcbiAgICAgICAgICAgIGxldCB3c1VybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMud3MpIHtcbiAgICAgICAgICAgICAgd3NVcmwgPSBvcHRpb25zLndzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gb3B0aW9ucy5jZGtvdXRwdXRcbiAgICAgICAgICAgICAgY29uc3QgdXJsUGF0aHMgPSByZXF1ZXN0LnVybC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgICBsZXQgc3RhY2sgPSB1cmxQYXRoc1syXTtcblxuICAgICAgICAgICAgICBpZiAoIXN0YWNrKSB7XG4gICAgICAgICAgICAgICAgc3RhY2sgPSBvcHRpb25zLmNka3N0YWNrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHN0YWNrKSB7XG4gICAgICAgICAgICAgICAgd3NVcmwgPSBjZGtPdXRwdXRbc3RhY2tdLlNlcnZlcmxlc3NTcHlXc1VybDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY2RrT3V0cHV0ICYmIGNka091dHB1dFtPYmplY3Qua2V5cyhjZGtPdXRwdXQpWzBdXSkge1xuICAgICAgICAgICAgICAgICAgd3NVcmwgPVxuICAgICAgICAgICAgICAgICAgICBjZGtPdXRwdXRbT2JqZWN0LmtleXMoY2RrT3V0cHV0KVswXV0uU2VydmVybGVzc1NweVdzVXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXdzVXJsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB3ZWJzb2NrZXQgdXJsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coYFdTIFVSTDogJHt3c1VybH1gKTtcbiAgICAgICAgICAgIGNvbnN0IHNpZ25lZFdTVXJsID0gYXdhaXQgZ2V0U2lnbmVkV2ViU29ja2V0VXJsKHdzVXJsKTtcbiAgICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgyMDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2UuZW5kKHNpZ25lZFdTVXJsLCAndXRmLTgnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoZmlsZVBhdGgpO1xuXG4gICAgICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgyMDAsIHsgJ0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlIH0pO1xuICAgICAgICAgICAgICByZXNwb25zZS5lbmQoY29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQsIHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnIH0pO1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVuZChcbiAgICAgICAgICAgICAgICAgIGBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICR7cmVxdWVzdC51cmx9YCxcbiAgICAgICAgICAgICAgICAgICd1dGYtOCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApO1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVuZChgRXJyb3I6ICR7ZXJyb3IuY29kZX0gLi5cXG5gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNTAwLCB7ICdDb250ZW50LVR5cGUnOiAndGV4dC9odG1sJyB9KTtcbiAgICAgICAgICByZXNwb25zZS5lbmQoZXJyLm1lc3NhZ2UsICd1dGYtOCcpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0pXG4gICAgLmxpc3RlbihvcHRpb25zLnBvcnQpO1xuXG4gIGF3YWl0IG9wZW4oYGh0dHA6Ly9sb2NhbGhvc3Q6JHtvcHRpb25zLnBvcnR9YCk7XG59XG5cbnJ1bigpLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuIl19
|
package/lib/cli/cli.mjs
CHANGED
|
@@ -1,85 +1,144 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as http from 'http';
|
|
3
3
|
import * as path from 'path';
|
|
4
|
-
import {
|
|
4
|
+
import { promisify } from 'util';
|
|
5
|
+
import { program } from 'commander';
|
|
6
|
+
import { getInstalledPath } from 'get-installed-path';
|
|
7
|
+
import open from 'open';
|
|
8
|
+
import { getSignedWebSocketUrl } from '../common/getWebSocketUrl';
|
|
9
|
+
const readFileAsync = promisify(fs.readFile);
|
|
5
10
|
async function run() {
|
|
6
|
-
|
|
7
|
-
let
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
serverlessSpyWsUrl = config[Object.keys(config)[0]].ServerlessSpyWsUrl;
|
|
19
|
-
}
|
|
11
|
+
let stackList;
|
|
12
|
+
let cdkOutput;
|
|
13
|
+
program
|
|
14
|
+
.option('--ws <ws>', 'Websocket link')
|
|
15
|
+
.option('--cdkoutput <cdkoutput>', 'CDK output file that contains Websocket link in a property ServerlessSpyWsUrl')
|
|
16
|
+
.option('--cdkstack <cdkstack>', 'CDK stack in cdk output file. If not specified the first one is picked.')
|
|
17
|
+
.option('--open', 'Open browser', true)
|
|
18
|
+
.option('--port <p>', `CDK stack in cdk output file. If not specified the first one is picked.`, '3456');
|
|
19
|
+
program.parse();
|
|
20
|
+
const options = program.opts();
|
|
21
|
+
if (!options.ws && !options.cdkoutput) {
|
|
22
|
+
throw new Error('--ws or --cdkstack parameter not specified');
|
|
20
23
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
if (options.cdkoutput) {
|
|
25
|
+
const rawdata = fs.readFileSync(path.join(__dirname, options.cdkoutput));
|
|
26
|
+
cdkOutput = JSON.parse(rawdata.toString());
|
|
27
|
+
stackList = Object.keys(cdkOutput);
|
|
25
28
|
}
|
|
26
|
-
console.log('serverlessSpyWsUrl', serverlessSpyWsUrl);
|
|
27
|
-
const wsUrl = await getWebSocketUrl(serverlessSpyWsUrl);
|
|
28
|
-
// source https://developer.mozilla.org/en-US/docs/Learn/Server-side/Node_server_without_framework
|
|
29
29
|
http
|
|
30
30
|
.createServer((request, response) => {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
};
|
|
54
|
-
const contentType = mimeTypes[extname] || 'application/octet-stream';
|
|
55
|
-
fs.readFile(filePath, (error, content) => {
|
|
56
|
-
if (error) {
|
|
57
|
-
if (error.code === 'ENOENT') {
|
|
58
|
-
fs.readFile('./404.html', (_err, cont) => {
|
|
59
|
-
response.writeHead(404, { 'Content-Type': 'text/html' });
|
|
60
|
-
response.end(cont, 'utf-8');
|
|
31
|
+
void (async () => {
|
|
32
|
+
try {
|
|
33
|
+
//console.log('request ', request.url);
|
|
34
|
+
let filePath = `.${request.url}`;
|
|
35
|
+
//remove query parameters
|
|
36
|
+
filePath = filePath.split('?')[0];
|
|
37
|
+
let rootFolder = __dirname;
|
|
38
|
+
if (request.url?.startsWith('/webServerlessSpy.js')) {
|
|
39
|
+
//get transpiled TS to JS files
|
|
40
|
+
rootFolder = path.join(__dirname, `../lib/cli`);
|
|
41
|
+
}
|
|
42
|
+
else if (request.url?.startsWith('/bootstrap/')) {
|
|
43
|
+
filePath = filePath.substring('/bootstrap/'.length);
|
|
44
|
+
const bootstrapFolder = await getInstalledPath('bootstrap', {
|
|
45
|
+
local: true,
|
|
46
|
+
});
|
|
47
|
+
rootFolder = bootstrapFolder;
|
|
48
|
+
}
|
|
49
|
+
else if (request.url?.startsWith('/bootstrap-icons/')) {
|
|
50
|
+
filePath = filePath.substring('/bootstrap-icons/'.length);
|
|
51
|
+
const bootstrapFolder = await getInstalledPath('bootstrap-icons', {
|
|
52
|
+
local: true,
|
|
61
53
|
});
|
|
54
|
+
rootFolder = bootstrapFolder;
|
|
62
55
|
}
|
|
63
56
|
else {
|
|
64
|
-
|
|
65
|
-
|
|
57
|
+
if (filePath === './') {
|
|
58
|
+
filePath = './index.html';
|
|
59
|
+
}
|
|
66
60
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
61
|
+
filePath = path.join(rootFolder, filePath);
|
|
62
|
+
//console.log(`${request.url} --> ${filePath}`);
|
|
63
|
+
const extname = String(path.extname(filePath)).toLowerCase();
|
|
64
|
+
const mimeTypes = {
|
|
65
|
+
'.html': 'text/html',
|
|
66
|
+
'.js': 'text/javascript',
|
|
67
|
+
'.css': 'text/css',
|
|
68
|
+
'.json': 'application/json',
|
|
69
|
+
'.png': 'image/png',
|
|
70
|
+
'.jpg': 'image/jpg',
|
|
71
|
+
'.gif': 'image/gif',
|
|
72
|
+
'.svg': 'image/svg+xml',
|
|
73
|
+
'.wav': 'audio/wav',
|
|
74
|
+
'.mp4': 'video/mp4',
|
|
75
|
+
'.woff': 'application/font-woff',
|
|
76
|
+
'.ttf': 'application/font-ttf',
|
|
77
|
+
'.eot': 'application/vnd.ms-fontobject',
|
|
78
|
+
'.otf': 'application/font-otf',
|
|
79
|
+
'.wasm': 'application/wasm',
|
|
80
|
+
};
|
|
81
|
+
const contentType = mimeTypes[extname] || 'application/octet-stream';
|
|
82
|
+
if (request.url === '/stackList') {
|
|
83
|
+
response.writeHead(200, { 'Content-Type': 'application/json' });
|
|
84
|
+
response.end(JSON.stringify(stackList), 'utf-8');
|
|
85
|
+
}
|
|
86
|
+
else if (request.url?.match('^/wsUrl')) {
|
|
87
|
+
let wsUrl;
|
|
88
|
+
if (options.ws) {
|
|
89
|
+
wsUrl = options.ws;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// options.cdkoutput
|
|
93
|
+
const urlPaths = request.url.split('/');
|
|
94
|
+
let stack = urlPaths[2];
|
|
95
|
+
if (!stack) {
|
|
96
|
+
stack = options.cdkstack;
|
|
97
|
+
}
|
|
98
|
+
if (stack) {
|
|
99
|
+
wsUrl = cdkOutput[stack].ServerlessSpyWsUrl;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
if (cdkOutput && cdkOutput[Object.keys(cdkOutput)[0]]) {
|
|
103
|
+
wsUrl =
|
|
104
|
+
cdkOutput[Object.keys(cdkOutput)[0]].ServerlessSpyWsUrl;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (!wsUrl) {
|
|
109
|
+
throw new Error('Missing websocket url');
|
|
110
|
+
}
|
|
111
|
+
//console.log(`WS URL: ${wsUrl}`);
|
|
112
|
+
const signedWSUrl = await getSignedWebSocketUrl(wsUrl);
|
|
113
|
+
response.writeHead(200, { 'Content-Type': 'text/html' });
|
|
114
|
+
response.end(signedWSUrl, 'utf-8');
|
|
75
115
|
}
|
|
76
116
|
else {
|
|
77
|
-
|
|
117
|
+
try {
|
|
118
|
+
const content = await readFileAsync(filePath);
|
|
119
|
+
response.writeHead(200, { 'Content-Type': contentType });
|
|
120
|
+
response.end(content, 'utf-8');
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (error.code === 'ENOENT') {
|
|
124
|
+
response.writeHead(404, { 'Content-Type': 'text/html' });
|
|
125
|
+
response.end(`No such file or directory ${request.url}`, 'utf-8');
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
response.writeHead(500);
|
|
129
|
+
response.end(`Error: ${error.code} ..\n`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
78
132
|
}
|
|
79
133
|
}
|
|
80
|
-
|
|
134
|
+
catch (err) {
|
|
135
|
+
response.writeHead(500, { 'Content-Type': 'text/html' });
|
|
136
|
+
response.end(err.message, 'utf-8');
|
|
137
|
+
}
|
|
138
|
+
})();
|
|
81
139
|
})
|
|
82
|
-
.listen(
|
|
140
|
+
.listen(options.port);
|
|
141
|
+
await open(`http://localhost:${options.port}`);
|
|
83
142
|
}
|
|
84
143
|
run().catch(console.error);
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY2xpL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFNUQsS0FBSyxVQUFVLEdBQUc7SUFDaEIsTUFBTSxpQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQztJQUVwRCxJQUFJLGtCQUFzQyxDQUFDO0lBQzNDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRTlDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsK0JBQStCO1lBQy9CLElBQUk7WUFDSixrQkFBa0I7WUFDbEIsa0NBQWtDO1lBQ2xDLE1BQU07WUFDTixJQUFJO1lBRUosa0JBQWtCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztTQUN4RTtLQUNGO0lBRUQsa0JBQWtCO1FBQ2hCLDJEQUEyRCxDQUFDO0lBRTlELElBQUksQ0FBQyxrQkFBa0IsRUFBRTtRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDbkM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLG9C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cm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldFdlYlNvY2tldFVybCB9IGZyb20gJy4uL2NvbW1vbi9nZXRXZWJTb2NrZXRVcmwnO1xuXG5hc3luYyBmdW5jdGlvbiBydW4oKSB7XG4gIGNvbnN0IGNka0V4cG9ydEZpbGVOYW1lID0gJy4uLy5zcHkvY2RrRXhwb3J0cy5qc29uJztcblxuICBsZXQgc2VydmVybGVzc1NweVdzVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChmcy5leGlzdHNTeW5jKGNka0V4cG9ydEZpbGVOYW1lKSkge1xuICAgIGNvbnN0IHJhd2RhdGEgPSBmcy5yZWFkRmlsZVN5bmMoY2RrRXhwb3J0RmlsZU5hbWUpO1xuICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmF3ZGF0YS50b1N0cmluZygpKTtcblxuICAgIGlmIChjb25maWcgJiYgY29uZmlnW09iamVjdC5rZXlzKGNvbmZpZylbMF1dKSB7XG4gICAgICAvLyBnZXQgZmlyc3QgU2VydmVybGVzc1NweVdzVXJsXG4gICAgICAvLyB7XG4gICAgICAvLyAgIFwibXktc3RhY2tcIjoge1xuICAgICAgLy8gICAgIFwiU2VydmVybGVzc1NweVdzVXJsXCI6IFwieHh4XCJcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuXG4gICAgICBzZXJ2ZXJsZXNzU3B5V3NVcmwgPSBjb25maWdbT2JqZWN0LmtleXMoY29uZmlnKVswXV0uU2VydmVybGVzc1NweVdzVXJsO1xuICAgIH1cbiAgfVxuXG4gIHNlcnZlcmxlc3NTcHlXc1VybCA9XG4gICAgJ3dzczovL3ByZWgxeG8xeGguZXhlY3V0ZS1hcGkuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb20vcHJvZCc7XG5cbiAgaWYgKCFzZXJ2ZXJsZXNzU3B5V3NVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgV1MgdXJsJyk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnc2VydmVybGVzc1NweVdzVXJsJywgc2VydmVybGVzc1NweVdzVXJsKTtcblxuICBjb25zdCB3c1VybCA9IGF3YWl0IGdldFdlYlNvY2tldFVybChzZXJ2ZXJsZXNzU3B5V3NVcmwpO1xuXG4gIC8vIHNvdXJjZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0xlYXJuL1NlcnZlci1zaWRlL05vZGVfc2VydmVyX3dpdGhvdXRfZnJhbWV3b3JrXG4gIGh0dHBcbiAgICAuY3JlYXRlU2VydmVyKChyZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3JlcXVlc3QgJywgcmVxdWVzdC51cmwpO1xuXG4gICAgICBsZXQgZmlsZVBhdGggPSBgLiR7cmVxdWVzdC51cmx9YDtcbiAgICAgIGlmIChmaWxlUGF0aCA9PT0gJy4vJykge1xuICAgICAgICBmaWxlUGF0aCA9ICcuL2luZGV4Lmh0bWwnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRuYW1lID0gU3RyaW5nKHBhdGguZXh0bmFtZShmaWxlUGF0aCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBtaW1lVHlwZXM6IGFueSA9IHtcbiAgICAgICAgJy5odG1sJzogJ3RleHQvaHRtbCcsXG4gICAgICAgICcuanMnOiAndGV4dC9qYXZhc2NyaXB0JyxcbiAgICAgICAgJy5jc3MnOiAndGV4dC9jc3MnLFxuICAgICAgICAnLmpzb24nOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICcucG5nJzogJ2ltYWdlL3BuZycsXG4gICAgICAgICcuanBnJzogJ2ltYWdlL2pwZycsXG4gICAgICAgICcuZ2lmJzogJ2ltYWdlL2dpZicsXG4gICAgICAgICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAgICAgICAnLndhdic6ICdhdWRpby93YXYnLFxuICAgICAgICAnLm1wNCc6ICd2aWRlby9tcDQnLFxuICAgICAgICAnLndvZmYnOiAnYXBwbGljYXRpb24vZm9udC13b2ZmJyxcbiAgICAgICAgJy50dGYnOiAnYXBwbGljYXRpb24vZm9udC10dGYnLFxuICAgICAgICAnLmVvdCc6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG4gICAgICAgICcub3RmJzogJ2FwcGxpY2F0aW9uL2ZvbnQtb3RmJyxcbiAgICAgICAgJy53YXNtJzogJ2FwcGxpY2F0aW9uL3dhc20nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSBtaW1lVHlwZXNbZXh0bmFtZV0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG5cbiAgICAgIGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAoZXJyb3IsIGNvbnRlbnQpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICBmcy5yZWFkRmlsZSgnLi80MDQuaHRtbCcsIChfZXJyLCBjb250KSA9PiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQsIHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnIH0pO1xuICAgICAgICAgICAgICByZXNwb25zZS5lbmQoY29udCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7XG4gICAgICAgICAgICByZXNwb25zZS5lbmQoXG4gICAgICAgICAgICAgIGBTb3JyeSwgY2hlY2sgd2l0aCB0aGUgc2l0ZSBhZG1pbiBmb3IgZXJyb3I6ICR7ZXJyb3IuY29kZX0gLi5cXG5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMjAwLCB7ICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSB9KTtcbiAgICAgICAgICBpZiAocmVxdWVzdC51cmwgPT09ICcvc2VydmVybGVzc1NweS5qcycpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnROZXcgPSBjb250ZW50XG4gICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKCdTRVJWRVJMRVNTX1NQWV9XU19VUkwnLCB3c1VybCk7XG4gICAgICAgICAgICByZXNwb25zZS5lbmQoY29udGVudE5ldywgJ3V0Zi04Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmVuZChjb250ZW50LCAndXRmLTgnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLmxpc3Rlbig4MTI1KTtcbn1cblxucnVuKCkuY2F0Y2goY29uc29sZS5lcnJvcik7XG4iXX0=
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY2xpL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxFLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0MsS0FBSyxVQUFVLEdBQUc7SUFDaEIsSUFBSSxTQUErQixDQUFDO0lBQ3BDLElBQUksU0FBaUQsQ0FBQztJQUV0RCxPQUFPO1NBQ0osTUFBTSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQztTQUNyQyxNQUFNLENBQ0wseUJBQXlCLEVBQ3pCLCtFQUErRSxDQUNoRjtTQUNBLE1BQU0sQ0FDTCx1QkFBdUIsRUFDdkIseUVBQXlFLENBQzFFO1NBQ0EsTUFBTSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDO1NBQ3RDLE1BQU0sQ0FDTCxZQUFZLEVBQ1oseUVBQXlFLEVBQ3pFLE1BQU0sQ0FDUCxDQUFDO0lBQ0osT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRWhCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUUvQixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7UUFD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LGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDcEM7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsQ0FBQyxDQUFDO1NBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV4QixNQUFNLElBQUksQ0FBQyxvQkFBb0IsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVELEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgcHJvZ3JhbSB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBnZXRJbnN0YWxsZWRQYXRoIH0gZnJvbSAnZ2V0LWluc3RhbGxlZC1wYXRoJztcbmltcG9ydCBvcGVuIGZyb20gJ29wZW4nO1xuaW1wb3J0IHsgZ2V0U2lnbmVkV2ViU29ja2V0VXJsIH0gZnJvbSAnLi4vY29tbW9uL2dldFdlYlNvY2tldFVybCc7XG5cbmNvbnN0IHJlYWRGaWxlQXN5bmMgPSBwcm9taXNpZnkoZnMucmVhZEZpbGUpO1xuXG5hc3luYyBmdW5jdGlvbiBydW4oKSB7XG4gIGxldCBzdGFja0xpc3Q6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBsZXQgY2RrT3V0cHV0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuICBwcm9ncmFtXG4gICAgLm9wdGlvbignLS13cyA8d3M+JywgJ1dlYnNvY2tldCBsaW5rJylcbiAgICAub3B0aW9uKFxuICAgICAgJy0tY2Rrb3V0cHV0IDxjZGtvdXRwdXQ+JyxcbiAgICAgICdDREsgb3V0cHV0IGZpbGUgdGhhdCBjb250YWlucyBXZWJzb2NrZXQgbGluayBpbiBhIHByb3BlcnR5IFNlcnZlcmxlc3NTcHlXc1VybCdcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICctLWNka3N0YWNrIDxjZGtzdGFjaz4nLFxuICAgICAgJ0NESyBzdGFjayBpbiBjZGsgb3V0cHV0IGZpbGUuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGZpcnN0IG9uZSBpcyBwaWNrZWQuJ1xuICAgIClcbiAgICAub3B0aW9uKCctLW9wZW4nLCAnT3BlbiBicm93c2VyJywgdHJ1ZSlcbiAgICAub3B0aW9uKFxuICAgICAgJy0tcG9ydCA8cD4nLFxuICAgICAgYENESyBzdGFjayBpbiBjZGsgb3V0cHV0IGZpbGUuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGZpcnN0IG9uZSBpcyBwaWNrZWQuYCxcbiAgICAgICczNDU2J1xuICAgICk7XG4gIHByb2dyYW0ucGFyc2UoKTtcblxuICBjb25zdCBvcHRpb25zID0gcHJvZ3JhbS5vcHRzKCk7XG5cbiAgaWYgKCFvcHRpb25zLndzICYmICFvcHRpb25zLmNka291dHB1dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignLS13cyBvciAtLWNka3N0YWNrIHBhcmFtZXRlciBub3Qgc3BlY2lmaWVkJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5jZGtvdXRwdXQpIHtcbiAgICBjb25zdCByYXdkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsIG9wdGlvbnMuY2Rrb3V0cHV0KSk7XG4gICAgY2RrT3V0cHV0ID0gSlNPTi5wYXJzZShyYXdkYXRhLnRvU3RyaW5nKCkpO1xuICAgIHN0YWNrTGlzdCA9IE9iamVjdC5rZXlzKGNka091dHB1dCk7XG4gIH1cblxuICBodHRwXG4gICAgLmNyZWF0ZVNlcnZlcigocmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKCdyZXF1ZXN0ICcsIHJlcXVlc3QudXJsKTtcbiAgICAgICAgICBsZXQgZmlsZVBhdGg6IHN0cmluZyA9IGAuJHtyZXF1ZXN0LnVybH1gO1xuICAgICAgICAgIC8vcmVtb3ZlIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICAgICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLnNwbGl0KCc/JylbMF07XG4gICAgICAgICAgbGV0IHJvb3RGb2xkZXIgPSBfX2Rpcm5hbWU7XG5cbiAgICAgICAgICBpZiAocmVxdWVzdC51cmw/LnN0YXJ0c1dpdGgoJy93ZWJTZXJ2ZXJsZXNzU3B5LmpzJykpIHtcbiAgICAgICAgICAgIC8vZ2V0IHRyYW5zcGlsZWQgVFMgdG8gSlMgZmlsZXNcbiAgICAgICAgICAgIHJvb3RGb2xkZXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBgLi4vbGliL2NsaWApO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC51cmw/LnN0YXJ0c1dpdGgoJy9ib290c3RyYXAvJykpIHtcbiAgICAgICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKCcvYm9vdHN0cmFwLycubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IGJvb3RzdHJhcEZvbGRlciA9IGF3YWl0IGdldEluc3RhbGxlZFBhdGgoJ2Jvb3RzdHJhcCcsIHtcbiAgICAgICAgICAgICAgbG9jYWw6IHRydWUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcm9vdEZvbGRlciA9IGJvb3RzdHJhcEZvbGRlcjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QudXJsPy5zdGFydHNXaXRoKCcvYm9vdHN0cmFwLWljb25zLycpKSB7XG4gICAgICAgICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZygnL2Jvb3RzdHJhcC1pY29ucy8nLmxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBib290c3RyYXBGb2xkZXIgPSBhd2FpdCBnZXRJbnN0YWxsZWRQYXRoKCdib290c3RyYXAtaWNvbnMnLCB7XG4gICAgICAgICAgICAgIGxvY2FsOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJvb3RGb2xkZXIgPSBib290c3RyYXBGb2xkZXI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmaWxlUGF0aCA9PT0gJy4vJykge1xuICAgICAgICAgICAgICBmaWxlUGF0aCA9ICcuL2luZGV4Lmh0bWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVQYXRoID0gcGF0aC5qb2luKHJvb3RGb2xkZXIsIGZpbGVQYXRoKTtcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKGAke3JlcXVlc3QudXJsfSAtLT4gJHtmaWxlUGF0aH1gKTtcblxuICAgICAgICAgIGNvbnN0IGV4dG5hbWUgPSBTdHJpbmcocGF0aC5leHRuYW1lKGZpbGVQYXRoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBjb25zdCBtaW1lVHlwZXM6IGFueSA9IHtcbiAgICAgICAgICAgICcuaHRtbCc6ICd0ZXh0L2h0bWwnLFxuICAgICAgICAgICAgJy5qcyc6ICd0ZXh0L2phdmFzY3JpcHQnLFxuICAgICAgICAgICAgJy5jc3MnOiAndGV4dC9jc3MnLFxuICAgICAgICAgICAgJy5qc29uJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJy5wbmcnOiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgICcuanBnJzogJ2ltYWdlL2pwZycsXG4gICAgICAgICAgICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAgICAgICAgICAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXG4gICAgICAgICAgICAnLndhdic6ICdhdWRpby93YXYnLFxuICAgICAgICAgICAgJy5tcDQnOiAndmlkZW8vbXA0JyxcbiAgICAgICAgICAgICcud29mZic6ICdhcHBsaWNhdGlvbi9mb250LXdvZmYnLFxuICAgICAgICAgICAgJy50dGYnOiAnYXBwbGljYXRpb24vZm9udC10dGYnLFxuICAgICAgICAgICAgJy5lb3QnOiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLFxuICAgICAgICAgICAgJy5vdGYnOiAnYXBwbGljYXRpb24vZm9udC1vdGYnLFxuICAgICAgICAgICAgJy53YXNtJzogJ2FwcGxpY2F0aW9uL3dhc20nLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IG1pbWVUeXBlc1tleHRuYW1lXSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcblxuICAgICAgICAgIGlmIChyZXF1ZXN0LnVybCA9PT0gJy9zdGFja0xpc3QnKSB7XG4gICAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMjAwLCB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgICAgICAgICByZXNwb25zZS5lbmQoSlNPTi5zdHJpbmdpZnkoc3RhY2tMaXN0KSwgJ3V0Zi04Jyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LnVybD8ubWF0Y2goJ14vd3NVcmwnKSkge1xuICAgICAgICAgICAgbGV0IHdzVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy53cykge1xuICAgICAgICAgICAgICB3c1VybCA9IG9wdGlvbnMud3M7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBvcHRpb25zLmNka291dHB1dFxuICAgICAgICAgICAgICBjb25zdCB1cmxQYXRocyA9IHJlcXVlc3QudXJsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgIGxldCBzdGFjayA9IHVybFBhdGhzWzJdO1xuXG4gICAgICAgICAgICAgIGlmICghc3RhY2spIHtcbiAgICAgICAgICAgICAgICBzdGFjayA9IG9wdGlvbnMuY2Rrc3RhY2s7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoc3RhY2spIHtcbiAgICAgICAgICAgICAgICB3c1VybCA9IGNka091dHB1dFtzdGFja10uU2VydmVybGVzc1NweVdzVXJsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjZGtPdXRwdXQgJiYgY2RrT3V0cHV0W09iamVjdC5rZXlzKGNka091dHB1dClbMF1dKSB7XG4gICAgICAgICAgICAgICAgICB3c1VybCA9XG4gICAgICAgICAgICAgICAgICAgIGNka091dHB1dFtPYmplY3Qua2V5cyhjZGtPdXRwdXQpWzBdXS5TZXJ2ZXJsZXNzU3B5V3NVcmw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghd3NVcmwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdlYnNvY2tldCB1cmwnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgV1MgVVJMOiAke3dzVXJsfWApO1xuICAgICAgICAgICAgY29uc3Qgc2lnbmVkV1NVcmwgPSBhd2FpdCBnZXRTaWduZWRXZWJTb2NrZXRVcmwod3NVcmwpO1xuICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDIwMCwgeyAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcgfSk7XG4gICAgICAgICAgICByZXNwb25zZS5lbmQoc2lnbmVkV1NVcmwsICd1dGYtOCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlUGF0aCk7XG5cbiAgICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDIwMCwgeyAnQ29udGVudC1UeXBlJzogY29udGVudFR5cGUgfSk7XG4gICAgICAgICAgICAgIHJlc3BvbnNlLmVuZChjb250ZW50LCAndXRmLTgnKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCwgeyAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcgfSk7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuZW5kKFxuICAgICAgICAgICAgICAgICAgYE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgJHtyZXF1ZXN0LnVybH1gLFxuICAgICAgICAgICAgICAgICAgJ3V0Zi04J1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuZW5kKGBFcnJvcjogJHtlcnJvci5jb2RlfSAuLlxcbmApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnIH0pO1xuICAgICAgICAgIHJlc3BvbnNlLmVuZChlcnIubWVzc2FnZSwgJ3V0Zi04Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSlcbiAgICAubGlzdGVuKG9wdGlvbnMucG9ydCk7XG5cbiAgYXdhaXQgb3BlbihgaHR0cDovL2xvY2FsaG9zdDoke29wdGlvbnMucG9ydH1gKTtcbn1cblxucnVuKCkuY2F0Y2goY29uc29sZS5lcnJvcik7XG4iXX0=
|