Closure-RI commited on
Commit
7cf32bc
1 Parent(s): 0a03698
Dockerfile ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use the latest Python image as the base image
2
+ FROM python:latest
3
+
4
+ # Set environment variables
5
+ ENV PYTHONUNBUFFERED=1 \
6
+ HOME=/home/user \
7
+ PATH=/home/user/.local/bin:/home/user/venv/bin:$PATH
8
+
9
+ # Expose the port that the server will run on
10
+ EXPOSE 7860
11
+
12
+ # Update the package list and upgrade existing packages
13
+ RUN apt-get update && apt-get upgrade -y
14
+
15
+ # Install required packages
16
+ RUN apt-get install -y curl wget neofetch ffmpeg \
17
+ libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libgbm1 libasound2 libpangocairo-1.0-0 libxss1 libgtk-3-0 imagemagick \
18
+ python3 python3-pip python3-venv build-essential libvips libvips-dev libjpeg-dev libpng-dev
19
+
20
+ # Add NodeSource APT repository for Node 18.x
21
+ RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
22
+
23
+ # Install Node.js and npm
24
+ RUN apt-get install -y nodejs
25
+
26
+ # Create a non-root user and switch to it
27
+ RUN useradd -m -u 1000 user
28
+
29
+ # Set the working directory
30
+ WORKDIR /home/user/app
31
+
32
+ # Copy package.json and package-lock.json files and install dependencies before switching to the non-root user
33
+ COPY package*.json ./
34
+ RUN npm install && \
35
+ npm install -g npm@latest node-gyp nodemon
36
+
37
+ RUN npm i github:ArashiCode/duo-canvas
38
+ RUN npm i sharp@latest
39
+
40
+ # Switch to the non-root user
41
+ USER user
42
+
43
+ # Create and activate a virtual environment in the user's home directory
44
+ RUN python3 -m venv /home/user/venv
45
+
46
+ # Install speedtest-cli within the virtual environment
47
+ RUN /home/user/venv/bin/pip install --no-cache-dir speedtest-cli
48
+
49
+ # Copy the rest of the application code
50
+ COPY --chown=user . .
51
+
52
+ # Start the application
53
+ CMD ["npm", "start"]
app.js ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var createError = require('http-errors');
2
+ var express = require('express');
3
+ var path = require('path');
4
+ var cookieParser = require('cookie-parser');
5
+ var logger = require('morgan');
6
+
7
+ var indexRouter = require('./routes/index');
8
+ var usersRouter = require('./routes/users');
9
+
10
+ var app = express();
11
+
12
+ // view engine setup
13
+ app.set('views', path.join(__dirname, 'views'));
14
+ app.set('view engine', 'hbs');
15
+
16
+ app.use(logger('dev'));
17
+ app.use(express.json());
18
+ app.use(express.urlencoded({ extended: false }));
19
+ app.use(cookieParser());
20
+ app.use(express.static(path.join(__dirname, 'public')));
21
+ let temp = path.join(os.tmpdir())
22
+ app.use('/tmp', express.static(tempDir));
23
+ app.use('/', indexRouter);
24
+ app.use('/users', usersRouter);
25
+
26
+ // catch 404 and forward to error handler
27
+ app.use(function(req, res, next) {
28
+ next(createError(404));
29
+ });
30
+
31
+ // error handler
32
+ app.use(function(err, req, res, next) {
33
+ // set locals, only providing error in development
34
+ res.locals.message = err.message;
35
+ res.locals.error = req.app.get('env') === 'development' ? err : {};
36
+
37
+ // render the error page
38
+ res.status(err.status || 500);
39
+ res.render('error');
40
+ });
41
+
42
+ module.exports = app;
app.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ {
2
+ "stack": "heroku-22"
3
+ }
archiver/index.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var archiver = require('archiver');
2
+ var fs = require('fs');
3
+ var os = require('os');
4
+ var path = require('path');
5
+
6
+ module.exports = (file, io, data) => {
7
+ // Use os.tmpdir() to get the system's temporary directory
8
+ var tempDir = os.tmpdir();
9
+
10
+ // Construct the path for the zip file in the temp directory
11
+ var outputPath = path.join(tempDir, file + '.zip');
12
+
13
+ var output = fs.createWriteStream(outputPath);
14
+ var archive = archiver('zip', {
15
+ zlib: { level: 9 } // Sets the compression level.
16
+ });
17
+
18
+ // listen for all archive data to be written
19
+ output.on('close', function() {
20
+ console.log(archive.pointer() + ' total bytes');
21
+ console.log('archiver has been finalized and the output file descriptor has closed.');
22
+ io.emit(data.token, { progress: "Completed", file: outputPath });
23
+ });
24
+
25
+ // This event is fired when the data source is drained no matter what was the data source.
26
+ output.on('end', function() {
27
+ console.log('Data has been drained');
28
+ });
29
+
30
+ // good practice to catch warnings (ie stat failures and other non-blocking errors)
31
+ archive.on('warning', function(err) {
32
+ if (err.code === 'ENOENT') {
33
+ // log warning
34
+ } else {
35
+ // throw error
36
+ throw err;
37
+ }
38
+ });
39
+
40
+ // good practice to catch this error explicitly
41
+ archive.on('error', function(err) {
42
+ throw err;
43
+ });
44
+
45
+ // pipe archive data to the file
46
+ archive.pipe(output);
47
+
48
+ // append files from a sub-directory and naming it `new-subdir` within the archive
49
+ archive.directory('./' + file, false);
50
+
51
+ // finalize the archive
52
+ archive.finalize();
53
+ }
bin/www ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Module dependencies.
5
+ */
6
+
7
+ var app = require('../app');
8
+ var debug = require('debug')('website-downloader:server');
9
+ var http = require('http');
10
+
11
+ /**
12
+ * Get port from environment and store in Express.
13
+ */
14
+
15
+ var port = normalizePort('7860');
16
+ app.set('port', port);
17
+
18
+ /**
19
+ * Create HTTP server.
20
+ */
21
+
22
+ var server = http.createServer(app);
23
+ var io = require('socket.io')(server);
24
+
25
+ // Pass socket Object to it's modula
26
+ require('../socket/socket')(io)
27
+ /**
28
+ * Listen on provided port, on all network interfaces.
29
+ */
30
+
31
+ server.listen(port, onListening);
32
+ server.on('error', onError);
33
+
34
+ /**
35
+ * Normalize a port into a number, string, or false.
36
+ */
37
+
38
+ function normalizePort(val) {
39
+ var port = parseInt(val, 10);
40
+
41
+ if (isNaN(port)) {
42
+ // named pipe
43
+ return val;
44
+ }
45
+
46
+ if (port >= 0) {
47
+ // port number
48
+ return port;
49
+ }
50
+
51
+ return false;
52
+ }
53
+
54
+ /**
55
+ * Event listener for HTTP server "error" event.
56
+ */
57
+
58
+ function onError(error) {
59
+ if (error.syscall !== 'listen') {
60
+ throw error;
61
+ }
62
+
63
+ var bind = typeof port === 'string'
64
+ ? 'Pipe ' + port
65
+ : 'Port ' + port;
66
+
67
+ // handle specific listen errors with friendly messages
68
+ switch (error.code) {
69
+ case 'EACCES':
70
+ console.error(bind + ' requires elevated privileges');
71
+ process.exit(1);
72
+ break;
73
+ case 'EADDRINUSE':
74
+ console.error(bind + ' is already in use');
75
+ process.exit(1);
76
+ break;
77
+ default:
78
+ throw error;
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Event listener for HTTP server "listening" event.
84
+ */
85
+
86
+ function onListening() {
87
+ var addr = server.address();
88
+ var bind = typeof addr === 'string'
89
+ ? 'pipe ' + addr
90
+ : 'port ' + addr.port;
91
+ debug('Listening on ' + bind);
92
+ }
index.html ADDED
The diff for this file is too large to render. See raw diff
 
package-lock.json ADDED
@@ -0,0 +1,1570 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "website-downloader",
3
+ "version": "0.0.1",
4
+ "lockfileVersion": 1,
5
+ "requires": true,
6
+ "dependencies": {
7
+ "accepts": {
8
+ "version": "1.3.7",
9
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
10
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
11
+ "requires": {
12
+ "mime-types": "~2.1.24",
13
+ "negotiator": "0.6.2"
14
+ }
15
+ },
16
+ "after": {
17
+ "version": "0.8.2",
18
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
19
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
20
+ },
21
+ "archiver": {
22
+ "version": "3.1.1",
23
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz",
24
+ "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==",
25
+ "requires": {
26
+ "archiver-utils": "^2.1.0",
27
+ "async": "^2.6.3",
28
+ "buffer-crc32": "^0.2.1",
29
+ "glob": "^7.1.4",
30
+ "readable-stream": "^3.4.0",
31
+ "tar-stream": "^2.1.0",
32
+ "zip-stream": "^2.1.2"
33
+ },
34
+ "dependencies": {
35
+ "readable-stream": {
36
+ "version": "3.4.0",
37
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
38
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
39
+ "requires": {
40
+ "inherits": "^2.0.3",
41
+ "string_decoder": "^1.1.1",
42
+ "util-deprecate": "^1.0.1"
43
+ }
44
+ }
45
+ }
46
+ },
47
+ "archiver-utils": {
48
+ "version": "2.1.0",
49
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
50
+ "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
51
+ "requires": {
52
+ "glob": "^7.1.4",
53
+ "graceful-fs": "^4.2.0",
54
+ "lazystream": "^1.0.0",
55
+ "lodash.defaults": "^4.2.0",
56
+ "lodash.difference": "^4.5.0",
57
+ "lodash.flatten": "^4.4.0",
58
+ "lodash.isplainobject": "^4.0.6",
59
+ "lodash.union": "^4.6.0",
60
+ "normalize-path": "^3.0.0",
61
+ "readable-stream": "^2.0.0"
62
+ }
63
+ },
64
+ "array-flatten": {
65
+ "version": "1.1.1",
66
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
67
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
68
+ },
69
+ "arraybuffer.slice": {
70
+ "version": "0.0.7",
71
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
72
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
73
+ },
74
+ "async": {
75
+ "version": "2.6.4",
76
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
77
+ "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
78
+ "requires": {
79
+ "lodash": "^4.17.14"
80
+ }
81
+ },
82
+ "backo2": {
83
+ "version": "1.0.2",
84
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
85
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
86
+ },
87
+ "balanced-match": {
88
+ "version": "1.0.0",
89
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
90
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
91
+ },
92
+ "base64-arraybuffer": {
93
+ "version": "0.1.5",
94
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
95
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
96
+ },
97
+ "base64-js": {
98
+ "version": "1.3.1",
99
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
100
+ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
101
+ },
102
+ "base64id": {
103
+ "version": "2.0.0",
104
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
105
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
106
+ },
107
+ "basic-auth": {
108
+ "version": "2.0.1",
109
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
110
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
111
+ "requires": {
112
+ "safe-buffer": "5.1.2"
113
+ }
114
+ },
115
+ "bl": {
116
+ "version": "3.0.1",
117
+ "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz",
118
+ "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==",
119
+ "requires": {
120
+ "readable-stream": "^3.0.1"
121
+ },
122
+ "dependencies": {
123
+ "readable-stream": {
124
+ "version": "3.6.0",
125
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
126
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
127
+ "requires": {
128
+ "inherits": "^2.0.3",
129
+ "string_decoder": "^1.1.1",
130
+ "util-deprecate": "^1.0.1"
131
+ }
132
+ }
133
+ }
134
+ },
135
+ "blob": {
136
+ "version": "0.0.5",
137
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
138
+ "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
139
+ },
140
+ "body-parser": {
141
+ "version": "1.20.2",
142
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
143
+ "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
144
+ "requires": {
145
+ "bytes": "3.1.2",
146
+ "content-type": "~1.0.5",
147
+ "debug": "2.6.9",
148
+ "depd": "2.0.0",
149
+ "destroy": "1.2.0",
150
+ "http-errors": "2.0.0",
151
+ "iconv-lite": "0.4.24",
152
+ "on-finished": "2.4.1",
153
+ "qs": "6.11.0",
154
+ "raw-body": "2.5.2",
155
+ "type-is": "~1.6.18",
156
+ "unpipe": "1.0.0"
157
+ },
158
+ "dependencies": {
159
+ "depd": {
160
+ "version": "2.0.0",
161
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
162
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
163
+ },
164
+ "http-errors": {
165
+ "version": "2.0.0",
166
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
167
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
168
+ "requires": {
169
+ "depd": "2.0.0",
170
+ "inherits": "2.0.4",
171
+ "setprototypeof": "1.2.0",
172
+ "statuses": "2.0.1",
173
+ "toidentifier": "1.0.1"
174
+ }
175
+ },
176
+ "inherits": {
177
+ "version": "2.0.4",
178
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
179
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
180
+ },
181
+ "on-finished": {
182
+ "version": "2.4.1",
183
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
184
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
185
+ "requires": {
186
+ "ee-first": "1.1.1"
187
+ }
188
+ },
189
+ "setprototypeof": {
190
+ "version": "1.2.0",
191
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
192
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
193
+ },
194
+ "statuses": {
195
+ "version": "2.0.1",
196
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
197
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
198
+ }
199
+ }
200
+ },
201
+ "brace-expansion": {
202
+ "version": "1.1.11",
203
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
204
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
205
+ "requires": {
206
+ "balanced-match": "^1.0.0",
207
+ "concat-map": "0.0.1"
208
+ }
209
+ },
210
+ "buffer": {
211
+ "version": "5.4.3",
212
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
213
+ "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
214
+ "requires": {
215
+ "base64-js": "^1.0.2",
216
+ "ieee754": "^1.1.4"
217
+ }
218
+ },
219
+ "buffer-crc32": {
220
+ "version": "0.2.13",
221
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
222
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
223
+ },
224
+ "bytes": {
225
+ "version": "3.1.2",
226
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
227
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
228
+ },
229
+ "call-bind": {
230
+ "version": "1.0.7",
231
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
232
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
233
+ "requires": {
234
+ "es-define-property": "^1.0.0",
235
+ "es-errors": "^1.3.0",
236
+ "function-bind": "^1.1.2",
237
+ "get-intrinsic": "^1.2.4",
238
+ "set-function-length": "^1.2.1"
239
+ }
240
+ },
241
+ "component-bind": {
242
+ "version": "1.0.0",
243
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
244
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
245
+ },
246
+ "component-emitter": {
247
+ "version": "1.2.1",
248
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
249
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
250
+ },
251
+ "component-inherit": {
252
+ "version": "0.0.3",
253
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
254
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
255
+ },
256
+ "compress-commons": {
257
+ "version": "2.1.1",
258
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz",
259
+ "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==",
260
+ "requires": {
261
+ "buffer-crc32": "^0.2.13",
262
+ "crc32-stream": "^3.0.1",
263
+ "normalize-path": "^3.0.0",
264
+ "readable-stream": "^2.3.6"
265
+ }
266
+ },
267
+ "concat-map": {
268
+ "version": "0.0.1",
269
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
270
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
271
+ },
272
+ "content-disposition": {
273
+ "version": "0.5.4",
274
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
275
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
276
+ "requires": {
277
+ "safe-buffer": "5.2.1"
278
+ },
279
+ "dependencies": {
280
+ "safe-buffer": {
281
+ "version": "5.2.1",
282
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
283
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
284
+ }
285
+ }
286
+ },
287
+ "content-type": {
288
+ "version": "1.0.5",
289
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
290
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
291
+ },
292
+ "cookie": {
293
+ "version": "0.3.1",
294
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
295
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
296
+ },
297
+ "cookie-parser": {
298
+ "version": "1.4.4",
299
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz",
300
+ "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==",
301
+ "requires": {
302
+ "cookie": "0.3.1",
303
+ "cookie-signature": "1.0.6"
304
+ }
305
+ },
306
+ "cookie-signature": {
307
+ "version": "1.0.6",
308
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
309
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
310
+ },
311
+ "core-util-is": {
312
+ "version": "1.0.2",
313
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
314
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
315
+ },
316
+ "crc": {
317
+ "version": "3.8.0",
318
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
319
+ "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
320
+ "requires": {
321
+ "buffer": "^5.1.0"
322
+ }
323
+ },
324
+ "crc32-stream": {
325
+ "version": "3.0.1",
326
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz",
327
+ "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==",
328
+ "requires": {
329
+ "crc": "^3.4.4",
330
+ "readable-stream": "^3.4.0"
331
+ },
332
+ "dependencies": {
333
+ "readable-stream": {
334
+ "version": "3.4.0",
335
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
336
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
337
+ "requires": {
338
+ "inherits": "^2.0.3",
339
+ "string_decoder": "^1.1.1",
340
+ "util-deprecate": "^1.0.1"
341
+ }
342
+ }
343
+ }
344
+ },
345
+ "debug": {
346
+ "version": "2.6.9",
347
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
348
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
349
+ "requires": {
350
+ "ms": "2.0.0"
351
+ }
352
+ },
353
+ "define-data-property": {
354
+ "version": "1.1.4",
355
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
356
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
357
+ "requires": {
358
+ "es-define-property": "^1.0.0",
359
+ "es-errors": "^1.3.0",
360
+ "gopd": "^1.0.1"
361
+ }
362
+ },
363
+ "depd": {
364
+ "version": "1.1.2",
365
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
366
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
367
+ },
368
+ "destroy": {
369
+ "version": "1.2.0",
370
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
371
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
372
+ },
373
+ "ee-first": {
374
+ "version": "1.1.1",
375
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
376
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
377
+ },
378
+ "encodeurl": {
379
+ "version": "1.0.2",
380
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
381
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
382
+ },
383
+ "end-of-stream": {
384
+ "version": "1.4.4",
385
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
386
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
387
+ "requires": {
388
+ "once": "^1.4.0"
389
+ }
390
+ },
391
+ "engine.io": {
392
+ "version": "3.6.1",
393
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.6.1.tgz",
394
+ "integrity": "sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==",
395
+ "requires": {
396
+ "accepts": "~1.3.4",
397
+ "base64id": "2.0.0",
398
+ "cookie": "~0.4.1",
399
+ "debug": "~4.1.0",
400
+ "engine.io-parser": "~2.2.0",
401
+ "ws": "~7.4.2"
402
+ },
403
+ "dependencies": {
404
+ "cookie": {
405
+ "version": "0.4.2",
406
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
407
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
408
+ },
409
+ "debug": {
410
+ "version": "4.1.1",
411
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
412
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
413
+ "requires": {
414
+ "ms": "^2.1.1"
415
+ }
416
+ },
417
+ "ms": {
418
+ "version": "2.1.3",
419
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
420
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
421
+ }
422
+ }
423
+ },
424
+ "engine.io-client": {
425
+ "version": "3.5.3",
426
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.3.tgz",
427
+ "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==",
428
+ "requires": {
429
+ "component-emitter": "~1.3.0",
430
+ "component-inherit": "0.0.3",
431
+ "debug": "~3.1.0",
432
+ "engine.io-parser": "~2.2.0",
433
+ "has-cors": "1.1.0",
434
+ "indexof": "0.0.1",
435
+ "parseqs": "0.0.6",
436
+ "parseuri": "0.0.6",
437
+ "ws": "~7.4.2",
438
+ "xmlhttprequest-ssl": "~1.6.2",
439
+ "yeast": "0.1.2"
440
+ },
441
+ "dependencies": {
442
+ "component-emitter": {
443
+ "version": "1.3.0",
444
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
445
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
446
+ },
447
+ "debug": {
448
+ "version": "3.1.0",
449
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
450
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
451
+ "requires": {
452
+ "ms": "2.0.0"
453
+ }
454
+ }
455
+ }
456
+ },
457
+ "engine.io-parser": {
458
+ "version": "2.2.0",
459
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
460
+ "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
461
+ "requires": {
462
+ "after": "0.8.2",
463
+ "arraybuffer.slice": "~0.0.7",
464
+ "base64-arraybuffer": "0.1.5",
465
+ "blob": "0.0.5",
466
+ "has-binary2": "~1.0.2"
467
+ }
468
+ },
469
+ "es-define-property": {
470
+ "version": "1.0.0",
471
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
472
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
473
+ "requires": {
474
+ "get-intrinsic": "^1.2.4"
475
+ }
476
+ },
477
+ "es-errors": {
478
+ "version": "1.3.0",
479
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
480
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
481
+ },
482
+ "escape-html": {
483
+ "version": "1.0.3",
484
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
485
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
486
+ },
487
+ "etag": {
488
+ "version": "1.8.1",
489
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
490
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
491
+ },
492
+ "express": {
493
+ "version": "4.19.2",
494
+ "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
495
+ "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
496
+ "requires": {
497
+ "accepts": "~1.3.8",
498
+ "array-flatten": "1.1.1",
499
+ "body-parser": "1.20.2",
500
+ "content-disposition": "0.5.4",
501
+ "content-type": "~1.0.4",
502
+ "cookie": "0.6.0",
503
+ "cookie-signature": "1.0.6",
504
+ "debug": "2.6.9",
505
+ "depd": "2.0.0",
506
+ "encodeurl": "~1.0.2",
507
+ "escape-html": "~1.0.3",
508
+ "etag": "~1.8.1",
509
+ "finalhandler": "1.2.0",
510
+ "fresh": "0.5.2",
511
+ "http-errors": "2.0.0",
512
+ "merge-descriptors": "1.0.1",
513
+ "methods": "~1.1.2",
514
+ "on-finished": "2.4.1",
515
+ "parseurl": "~1.3.3",
516
+ "path-to-regexp": "0.1.7",
517
+ "proxy-addr": "~2.0.7",
518
+ "qs": "6.11.0",
519
+ "range-parser": "~1.2.1",
520
+ "safe-buffer": "5.2.1",
521
+ "send": "0.18.0",
522
+ "serve-static": "1.15.0",
523
+ "setprototypeof": "1.2.0",
524
+ "statuses": "2.0.1",
525
+ "type-is": "~1.6.18",
526
+ "utils-merge": "1.0.1",
527
+ "vary": "~1.1.2"
528
+ },
529
+ "dependencies": {
530
+ "accepts": {
531
+ "version": "1.3.8",
532
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
533
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
534
+ "requires": {
535
+ "mime-types": "~2.1.34",
536
+ "negotiator": "0.6.3"
537
+ }
538
+ },
539
+ "cookie": {
540
+ "version": "0.6.0",
541
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
542
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
543
+ },
544
+ "depd": {
545
+ "version": "2.0.0",
546
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
547
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
548
+ },
549
+ "http-errors": {
550
+ "version": "2.0.0",
551
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
552
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
553
+ "requires": {
554
+ "depd": "2.0.0",
555
+ "inherits": "2.0.4",
556
+ "setprototypeof": "1.2.0",
557
+ "statuses": "2.0.1",
558
+ "toidentifier": "1.0.1"
559
+ }
560
+ },
561
+ "inherits": {
562
+ "version": "2.0.4",
563
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
564
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
565
+ },
566
+ "mime-db": {
567
+ "version": "1.52.0",
568
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
569
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
570
+ },
571
+ "mime-types": {
572
+ "version": "2.1.35",
573
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
574
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
575
+ "requires": {
576
+ "mime-db": "1.52.0"
577
+ }
578
+ },
579
+ "negotiator": {
580
+ "version": "0.6.3",
581
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
582
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
583
+ },
584
+ "on-finished": {
585
+ "version": "2.4.1",
586
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
587
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
588
+ "requires": {
589
+ "ee-first": "1.1.1"
590
+ }
591
+ },
592
+ "safe-buffer": {
593
+ "version": "5.2.1",
594
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
595
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
596
+ },
597
+ "setprototypeof": {
598
+ "version": "1.2.0",
599
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
600
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
601
+ },
602
+ "statuses": {
603
+ "version": "2.0.1",
604
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
605
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
606
+ }
607
+ }
608
+ },
609
+ "finalhandler": {
610
+ "version": "1.2.0",
611
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
612
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
613
+ "requires": {
614
+ "debug": "2.6.9",
615
+ "encodeurl": "~1.0.2",
616
+ "escape-html": "~1.0.3",
617
+ "on-finished": "2.4.1",
618
+ "parseurl": "~1.3.3",
619
+ "statuses": "2.0.1",
620
+ "unpipe": "~1.0.0"
621
+ },
622
+ "dependencies": {
623
+ "on-finished": {
624
+ "version": "2.4.1",
625
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
626
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
627
+ "requires": {
628
+ "ee-first": "1.1.1"
629
+ }
630
+ },
631
+ "statuses": {
632
+ "version": "2.0.1",
633
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
634
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
635
+ }
636
+ }
637
+ },
638
+ "foreachasync": {
639
+ "version": "3.0.0",
640
+ "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
641
+ "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw=="
642
+ },
643
+ "forwarded": {
644
+ "version": "0.2.0",
645
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
646
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
647
+ },
648
+ "fresh": {
649
+ "version": "0.5.2",
650
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
651
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
652
+ },
653
+ "fs-constants": {
654
+ "version": "1.0.0",
655
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
656
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
657
+ },
658
+ "fs.realpath": {
659
+ "version": "1.0.0",
660
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
661
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
662
+ },
663
+ "function-bind": {
664
+ "version": "1.1.2",
665
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
666
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
667
+ },
668
+ "get-intrinsic": {
669
+ "version": "1.2.4",
670
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
671
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
672
+ "requires": {
673
+ "es-errors": "^1.3.0",
674
+ "function-bind": "^1.1.2",
675
+ "has-proto": "^1.0.1",
676
+ "has-symbols": "^1.0.3",
677
+ "hasown": "^2.0.0"
678
+ }
679
+ },
680
+ "glob": {
681
+ "version": "7.1.4",
682
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
683
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
684
+ "requires": {
685
+ "fs.realpath": "^1.0.0",
686
+ "inflight": "^1.0.4",
687
+ "inherits": "2",
688
+ "minimatch": "^3.0.4",
689
+ "once": "^1.3.0",
690
+ "path-is-absolute": "^1.0.0"
691
+ }
692
+ },
693
+ "gopd": {
694
+ "version": "1.0.1",
695
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
696
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
697
+ "requires": {
698
+ "get-intrinsic": "^1.1.3"
699
+ }
700
+ },
701
+ "graceful-fs": {
702
+ "version": "4.2.2",
703
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
704
+ "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q=="
705
+ },
706
+ "handlebars": {
707
+ "version": "4.7.7",
708
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
709
+ "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
710
+ "requires": {
711
+ "minimist": "^1.2.5",
712
+ "neo-async": "^2.6.0",
713
+ "source-map": "^0.6.1",
714
+ "uglify-js": "^3.1.4",
715
+ "wordwrap": "^1.0.0"
716
+ }
717
+ },
718
+ "has-binary2": {
719
+ "version": "1.0.3",
720
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
721
+ "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
722
+ "requires": {
723
+ "isarray": "2.0.1"
724
+ }
725
+ },
726
+ "has-cors": {
727
+ "version": "1.1.0",
728
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
729
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
730
+ },
731
+ "has-property-descriptors": {
732
+ "version": "1.0.2",
733
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
734
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
735
+ "requires": {
736
+ "es-define-property": "^1.0.0"
737
+ }
738
+ },
739
+ "has-proto": {
740
+ "version": "1.0.3",
741
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
742
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
743
+ },
744
+ "has-symbols": {
745
+ "version": "1.0.3",
746
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
747
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
748
+ },
749
+ "hasown": {
750
+ "version": "2.0.2",
751
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
752
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
753
+ "requires": {
754
+ "function-bind": "^1.1.2"
755
+ }
756
+ },
757
+ "hbs": {
758
+ "version": "4.2.0",
759
+ "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.2.0.tgz",
760
+ "integrity": "sha512-dQwHnrfWlTk5PvG9+a45GYpg0VpX47ryKF8dULVd6DtwOE6TEcYQXQ5QM6nyOx/h7v3bvEQbdn19EDAcfUAgZg==",
761
+ "requires": {
762
+ "handlebars": "4.7.7",
763
+ "walk": "2.3.15"
764
+ }
765
+ },
766
+ "http-errors": {
767
+ "version": "1.6.3",
768
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
769
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
770
+ "requires": {
771
+ "depd": "~1.1.2",
772
+ "inherits": "2.0.3",
773
+ "setprototypeof": "1.1.0",
774
+ "statuses": ">= 1.4.0 < 2"
775
+ }
776
+ },
777
+ "iconv-lite": {
778
+ "version": "0.4.24",
779
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
780
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
781
+ "requires": {
782
+ "safer-buffer": ">= 2.1.2 < 3"
783
+ }
784
+ },
785
+ "ieee754": {
786
+ "version": "1.1.13",
787
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
788
+ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
789
+ },
790
+ "immediate": {
791
+ "version": "3.0.6",
792
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
793
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
794
+ },
795
+ "indexof": {
796
+ "version": "0.0.1",
797
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
798
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
799
+ },
800
+ "inflight": {
801
+ "version": "1.0.6",
802
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
803
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
804
+ "requires": {
805
+ "once": "^1.3.0",
806
+ "wrappy": "1"
807
+ }
808
+ },
809
+ "inherits": {
810
+ "version": "2.0.3",
811
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
812
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
813
+ },
814
+ "ipaddr.js": {
815
+ "version": "1.9.1",
816
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
817
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
818
+ },
819
+ "isarray": {
820
+ "version": "2.0.1",
821
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
822
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
823
+ },
824
+ "jszip": {
825
+ "version": "3.8.0",
826
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.8.0.tgz",
827
+ "integrity": "sha512-cnpQrXvFSLdsR9KR5/x7zdf6c3m8IhZfZzSblFEHSqBaVwD2nvJ4CuCKLyvKvwBgZm08CgfSoiTBQLm5WW9hGw==",
828
+ "requires": {
829
+ "lie": "~3.3.0",
830
+ "pako": "~1.0.2",
831
+ "readable-stream": "~2.3.6",
832
+ "set-immediate-shim": "~1.0.1"
833
+ }
834
+ },
835
+ "lazystream": {
836
+ "version": "1.0.0",
837
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
838
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
839
+ "requires": {
840
+ "readable-stream": "^2.0.5"
841
+ }
842
+ },
843
+ "lie": {
844
+ "version": "3.3.0",
845
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
846
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
847
+ "requires": {
848
+ "immediate": "~3.0.5"
849
+ }
850
+ },
851
+ "lodash": {
852
+ "version": "4.17.21",
853
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
854
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
855
+ },
856
+ "lodash.defaults": {
857
+ "version": "4.2.0",
858
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
859
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
860
+ },
861
+ "lodash.difference": {
862
+ "version": "4.5.0",
863
+ "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
864
+ "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw="
865
+ },
866
+ "lodash.flatten": {
867
+ "version": "4.4.0",
868
+ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
869
+ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
870
+ },
871
+ "lodash.isplainobject": {
872
+ "version": "4.0.6",
873
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
874
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
875
+ },
876
+ "lodash.union": {
877
+ "version": "4.6.0",
878
+ "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
879
+ "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
880
+ },
881
+ "media-typer": {
882
+ "version": "0.3.0",
883
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
884
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
885
+ },
886
+ "merge-descriptors": {
887
+ "version": "1.0.1",
888
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
889
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
890
+ },
891
+ "methods": {
892
+ "version": "1.1.2",
893
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
894
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
895
+ },
896
+ "mime": {
897
+ "version": "1.6.0",
898
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
899
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
900
+ },
901
+ "mime-db": {
902
+ "version": "1.40.0",
903
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
904
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
905
+ },
906
+ "mime-types": {
907
+ "version": "2.1.24",
908
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
909
+ "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
910
+ "requires": {
911
+ "mime-db": "1.40.0"
912
+ }
913
+ },
914
+ "minimatch": {
915
+ "version": "3.1.2",
916
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
917
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
918
+ "requires": {
919
+ "brace-expansion": "^1.1.7"
920
+ }
921
+ },
922
+ "minimist": {
923
+ "version": "1.2.7",
924
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
925
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
926
+ },
927
+ "morgan": {
928
+ "version": "1.9.1",
929
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
930
+ "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
931
+ "requires": {
932
+ "basic-auth": "~2.0.0",
933
+ "debug": "2.6.9",
934
+ "depd": "~1.1.2",
935
+ "on-finished": "~2.3.0",
936
+ "on-headers": "~1.0.1"
937
+ }
938
+ },
939
+ "ms": {
940
+ "version": "2.0.0",
941
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
942
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
943
+ },
944
+ "negotiator": {
945
+ "version": "0.6.2",
946
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
947
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
948
+ },
949
+ "neo-async": {
950
+ "version": "2.6.2",
951
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
952
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
953
+ },
954
+ "normalize-path": {
955
+ "version": "3.0.0",
956
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
957
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
958
+ },
959
+ "object-inspect": {
960
+ "version": "1.13.1",
961
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
962
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
963
+ },
964
+ "on-finished": {
965
+ "version": "2.3.0",
966
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
967
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
968
+ "requires": {
969
+ "ee-first": "1.1.1"
970
+ }
971
+ },
972
+ "on-headers": {
973
+ "version": "1.0.2",
974
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
975
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
976
+ },
977
+ "once": {
978
+ "version": "1.4.0",
979
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
980
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
981
+ "requires": {
982
+ "wrappy": "1"
983
+ }
984
+ },
985
+ "pako": {
986
+ "version": "1.0.11",
987
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
988
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
989
+ },
990
+ "parseqs": {
991
+ "version": "0.0.6",
992
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
993
+ "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
994
+ },
995
+ "parseuri": {
996
+ "version": "0.0.6",
997
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
998
+ "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
999
+ },
1000
+ "parseurl": {
1001
+ "version": "1.3.3",
1002
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1003
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1004
+ },
1005
+ "path-is-absolute": {
1006
+ "version": "1.0.1",
1007
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1008
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1009
+ },
1010
+ "path-to-regexp": {
1011
+ "version": "0.1.7",
1012
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1013
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1014
+ },
1015
+ "process-nextick-args": {
1016
+ "version": "2.0.1",
1017
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1018
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1019
+ },
1020
+ "proxy-addr": {
1021
+ "version": "2.0.7",
1022
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1023
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1024
+ "requires": {
1025
+ "forwarded": "0.2.0",
1026
+ "ipaddr.js": "1.9.1"
1027
+ }
1028
+ },
1029
+ "qs": {
1030
+ "version": "6.11.0",
1031
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1032
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1033
+ "requires": {
1034
+ "side-channel": "^1.0.4"
1035
+ }
1036
+ },
1037
+ "range-parser": {
1038
+ "version": "1.2.1",
1039
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1040
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1041
+ },
1042
+ "raw-body": {
1043
+ "version": "2.5.2",
1044
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1045
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1046
+ "requires": {
1047
+ "bytes": "3.1.2",
1048
+ "http-errors": "2.0.0",
1049
+ "iconv-lite": "0.4.24",
1050
+ "unpipe": "1.0.0"
1051
+ },
1052
+ "dependencies": {
1053
+ "depd": {
1054
+ "version": "2.0.0",
1055
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1056
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1057
+ },
1058
+ "http-errors": {
1059
+ "version": "2.0.0",
1060
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1061
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1062
+ "requires": {
1063
+ "depd": "2.0.0",
1064
+ "inherits": "2.0.4",
1065
+ "setprototypeof": "1.2.0",
1066
+ "statuses": "2.0.1",
1067
+ "toidentifier": "1.0.1"
1068
+ }
1069
+ },
1070
+ "inherits": {
1071
+ "version": "2.0.4",
1072
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1073
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1074
+ },
1075
+ "setprototypeof": {
1076
+ "version": "1.2.0",
1077
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1078
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1079
+ },
1080
+ "statuses": {
1081
+ "version": "2.0.1",
1082
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1083
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1084
+ }
1085
+ }
1086
+ },
1087
+ "readable-stream": {
1088
+ "version": "2.3.6",
1089
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1090
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1091
+ "requires": {
1092
+ "core-util-is": "~1.0.0",
1093
+ "inherits": "~2.0.3",
1094
+ "isarray": "~1.0.0",
1095
+ "process-nextick-args": "~2.0.0",
1096
+ "safe-buffer": "~5.1.1",
1097
+ "string_decoder": "~1.1.1",
1098
+ "util-deprecate": "~1.0.1"
1099
+ },
1100
+ "dependencies": {
1101
+ "isarray": {
1102
+ "version": "1.0.0",
1103
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1104
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1105
+ }
1106
+ }
1107
+ },
1108
+ "safe-buffer": {
1109
+ "version": "5.1.2",
1110
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1111
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1112
+ },
1113
+ "safer-buffer": {
1114
+ "version": "2.1.2",
1115
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1116
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1117
+ },
1118
+ "send": {
1119
+ "version": "0.18.0",
1120
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1121
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1122
+ "requires": {
1123
+ "debug": "2.6.9",
1124
+ "depd": "2.0.0",
1125
+ "destroy": "1.2.0",
1126
+ "encodeurl": "~1.0.2",
1127
+ "escape-html": "~1.0.3",
1128
+ "etag": "~1.8.1",
1129
+ "fresh": "0.5.2",
1130
+ "http-errors": "2.0.0",
1131
+ "mime": "1.6.0",
1132
+ "ms": "2.1.3",
1133
+ "on-finished": "2.4.1",
1134
+ "range-parser": "~1.2.1",
1135
+ "statuses": "2.0.1"
1136
+ },
1137
+ "dependencies": {
1138
+ "depd": {
1139
+ "version": "2.0.0",
1140
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1141
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1142
+ },
1143
+ "http-errors": {
1144
+ "version": "2.0.0",
1145
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1146
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1147
+ "requires": {
1148
+ "depd": "2.0.0",
1149
+ "inherits": "2.0.4",
1150
+ "setprototypeof": "1.2.0",
1151
+ "statuses": "2.0.1",
1152
+ "toidentifier": "1.0.1"
1153
+ }
1154
+ },
1155
+ "inherits": {
1156
+ "version": "2.0.4",
1157
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1158
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1159
+ },
1160
+ "ms": {
1161
+ "version": "2.1.3",
1162
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1163
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1164
+ },
1165
+ "on-finished": {
1166
+ "version": "2.4.1",
1167
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1168
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1169
+ "requires": {
1170
+ "ee-first": "1.1.1"
1171
+ }
1172
+ },
1173
+ "setprototypeof": {
1174
+ "version": "1.2.0",
1175
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1176
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1177
+ },
1178
+ "statuses": {
1179
+ "version": "2.0.1",
1180
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1181
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1182
+ }
1183
+ }
1184
+ },
1185
+ "serve-static": {
1186
+ "version": "1.15.0",
1187
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1188
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1189
+ "requires": {
1190
+ "encodeurl": "~1.0.2",
1191
+ "escape-html": "~1.0.3",
1192
+ "parseurl": "~1.3.3",
1193
+ "send": "0.18.0"
1194
+ }
1195
+ },
1196
+ "set-function-length": {
1197
+ "version": "1.2.2",
1198
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
1199
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
1200
+ "requires": {
1201
+ "define-data-property": "^1.1.4",
1202
+ "es-errors": "^1.3.0",
1203
+ "function-bind": "^1.1.2",
1204
+ "get-intrinsic": "^1.2.4",
1205
+ "gopd": "^1.0.1",
1206
+ "has-property-descriptors": "^1.0.2"
1207
+ }
1208
+ },
1209
+ "set-immediate-shim": {
1210
+ "version": "1.0.1",
1211
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
1212
+ "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ=="
1213
+ },
1214
+ "setprototypeof": {
1215
+ "version": "1.1.0",
1216
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1217
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
1218
+ },
1219
+ "side-channel": {
1220
+ "version": "1.0.6",
1221
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
1222
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
1223
+ "requires": {
1224
+ "call-bind": "^1.0.7",
1225
+ "es-errors": "^1.3.0",
1226
+ "get-intrinsic": "^1.2.4",
1227
+ "object-inspect": "^1.13.1"
1228
+ }
1229
+ },
1230
+ "socket.io": {
1231
+ "version": "2.5.0",
1232
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.5.0.tgz",
1233
+ "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==",
1234
+ "requires": {
1235
+ "debug": "~4.1.0",
1236
+ "engine.io": "~3.6.0",
1237
+ "has-binary2": "~1.0.2",
1238
+ "socket.io-adapter": "~1.1.0",
1239
+ "socket.io-client": "2.5.0",
1240
+ "socket.io-parser": "~3.4.0"
1241
+ },
1242
+ "dependencies": {
1243
+ "component-emitter": {
1244
+ "version": "1.3.0",
1245
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
1246
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
1247
+ },
1248
+ "debug": {
1249
+ "version": "4.1.1",
1250
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
1251
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
1252
+ "requires": {
1253
+ "ms": "^2.1.1"
1254
+ }
1255
+ },
1256
+ "engine.io-client": {
1257
+ "version": "3.5.3",
1258
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.3.tgz",
1259
+ "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==",
1260
+ "requires": {
1261
+ "component-emitter": "~1.3.0",
1262
+ "component-inherit": "0.0.3",
1263
+ "debug": "~3.1.0",
1264
+ "engine.io-parser": "~2.2.0",
1265
+ "has-cors": "1.1.0",
1266
+ "indexof": "0.0.1",
1267
+ "parseqs": "0.0.6",
1268
+ "parseuri": "0.0.6",
1269
+ "ws": "~7.4.2",
1270
+ "xmlhttprequest-ssl": "~1.6.2",
1271
+ "yeast": "0.1.2"
1272
+ },
1273
+ "dependencies": {
1274
+ "debug": {
1275
+ "version": "3.1.0",
1276
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1277
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1278
+ "requires": {
1279
+ "ms": "2.0.0"
1280
+ }
1281
+ },
1282
+ "ms": {
1283
+ "version": "2.0.0",
1284
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1285
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1286
+ }
1287
+ }
1288
+ },
1289
+ "ms": {
1290
+ "version": "2.1.3",
1291
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1292
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1293
+ },
1294
+ "parseqs": {
1295
+ "version": "0.0.6",
1296
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
1297
+ "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
1298
+ },
1299
+ "parseuri": {
1300
+ "version": "0.0.6",
1301
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
1302
+ "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
1303
+ },
1304
+ "socket.io-client": {
1305
+ "version": "2.5.0",
1306
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz",
1307
+ "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==",
1308
+ "requires": {
1309
+ "backo2": "1.0.2",
1310
+ "component-bind": "1.0.0",
1311
+ "component-emitter": "~1.3.0",
1312
+ "debug": "~3.1.0",
1313
+ "engine.io-client": "~3.5.0",
1314
+ "has-binary2": "~1.0.2",
1315
+ "indexof": "0.0.1",
1316
+ "parseqs": "0.0.6",
1317
+ "parseuri": "0.0.6",
1318
+ "socket.io-parser": "~3.3.0",
1319
+ "to-array": "0.1.4"
1320
+ },
1321
+ "dependencies": {
1322
+ "debug": {
1323
+ "version": "3.1.0",
1324
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1325
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1326
+ "requires": {
1327
+ "ms": "2.0.0"
1328
+ }
1329
+ },
1330
+ "ms": {
1331
+ "version": "2.0.0",
1332
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1333
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1334
+ },
1335
+ "socket.io-parser": {
1336
+ "version": "3.3.3",
1337
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz",
1338
+ "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==",
1339
+ "requires": {
1340
+ "component-emitter": "~1.3.0",
1341
+ "debug": "~3.1.0",
1342
+ "isarray": "2.0.1"
1343
+ }
1344
+ }
1345
+ }
1346
+ },
1347
+ "xmlhttprequest-ssl": {
1348
+ "version": "1.6.3",
1349
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz",
1350
+ "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q=="
1351
+ }
1352
+ }
1353
+ },
1354
+ "socket.io-adapter": {
1355
+ "version": "1.1.2",
1356
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
1357
+ "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
1358
+ },
1359
+ "socket.io-client": {
1360
+ "version": "2.5.0",
1361
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz",
1362
+ "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==",
1363
+ "requires": {
1364
+ "backo2": "1.0.2",
1365
+ "component-bind": "1.0.0",
1366
+ "component-emitter": "~1.3.0",
1367
+ "debug": "~3.1.0",
1368
+ "engine.io-client": "~3.5.0",
1369
+ "has-binary2": "~1.0.2",
1370
+ "indexof": "0.0.1",
1371
+ "parseqs": "0.0.6",
1372
+ "parseuri": "0.0.6",
1373
+ "socket.io-parser": "~3.3.0",
1374
+ "to-array": "0.1.4"
1375
+ },
1376
+ "dependencies": {
1377
+ "component-emitter": {
1378
+ "version": "1.3.0",
1379
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
1380
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
1381
+ },
1382
+ "debug": {
1383
+ "version": "3.1.0",
1384
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1385
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1386
+ "requires": {
1387
+ "ms": "2.0.0"
1388
+ }
1389
+ },
1390
+ "socket.io-parser": {
1391
+ "version": "3.3.3",
1392
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz",
1393
+ "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==",
1394
+ "requires": {
1395
+ "component-emitter": "~1.3.0",
1396
+ "debug": "~3.1.0",
1397
+ "isarray": "2.0.1"
1398
+ }
1399
+ }
1400
+ }
1401
+ },
1402
+ "socket.io-parser": {
1403
+ "version": "3.4.3",
1404
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.3.tgz",
1405
+ "integrity": "sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ==",
1406
+ "requires": {
1407
+ "component-emitter": "1.2.1",
1408
+ "debug": "~4.1.0",
1409
+ "isarray": "2.0.1"
1410
+ },
1411
+ "dependencies": {
1412
+ "debug": {
1413
+ "version": "4.1.1",
1414
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
1415
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
1416
+ "requires": {
1417
+ "ms": "^2.1.1"
1418
+ }
1419
+ },
1420
+ "ms": {
1421
+ "version": "2.1.3",
1422
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1423
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1424
+ }
1425
+ }
1426
+ },
1427
+ "source-map": {
1428
+ "version": "0.6.1",
1429
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1430
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
1431
+ },
1432
+ "statuses": {
1433
+ "version": "1.4.0",
1434
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
1435
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
1436
+ },
1437
+ "string_decoder": {
1438
+ "version": "1.1.1",
1439
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1440
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1441
+ "requires": {
1442
+ "safe-buffer": "~5.1.0"
1443
+ }
1444
+ },
1445
+ "tar-stream": {
1446
+ "version": "2.1.0",
1447
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz",
1448
+ "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==",
1449
+ "requires": {
1450
+ "bl": "^3.0.0",
1451
+ "end-of-stream": "^1.4.1",
1452
+ "fs-constants": "^1.0.0",
1453
+ "inherits": "^2.0.3",
1454
+ "readable-stream": "^3.1.1"
1455
+ },
1456
+ "dependencies": {
1457
+ "readable-stream": {
1458
+ "version": "3.4.0",
1459
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
1460
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
1461
+ "requires": {
1462
+ "inherits": "^2.0.3",
1463
+ "string_decoder": "^1.1.1",
1464
+ "util-deprecate": "^1.0.1"
1465
+ }
1466
+ }
1467
+ }
1468
+ },
1469
+ "to-array": {
1470
+ "version": "0.1.4",
1471
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
1472
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
1473
+ },
1474
+ "toidentifier": {
1475
+ "version": "1.0.1",
1476
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1477
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1478
+ },
1479
+ "type-is": {
1480
+ "version": "1.6.18",
1481
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1482
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1483
+ "requires": {
1484
+ "media-typer": "0.3.0",
1485
+ "mime-types": "~2.1.24"
1486
+ }
1487
+ },
1488
+ "uglify-js": {
1489
+ "version": "3.17.4",
1490
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
1491
+ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
1492
+ "optional": true
1493
+ },
1494
+ "unpipe": {
1495
+ "version": "1.0.0",
1496
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1497
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1498
+ },
1499
+ "util-deprecate": {
1500
+ "version": "1.0.2",
1501
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1502
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1503
+ },
1504
+ "utils-merge": {
1505
+ "version": "1.0.1",
1506
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1507
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1508
+ },
1509
+ "vary": {
1510
+ "version": "1.1.2",
1511
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1512
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1513
+ },
1514
+ "walk": {
1515
+ "version": "2.3.15",
1516
+ "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz",
1517
+ "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==",
1518
+ "requires": {
1519
+ "foreachasync": "^3.0.0"
1520
+ }
1521
+ },
1522
+ "wordwrap": {
1523
+ "version": "1.0.0",
1524
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1525
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="
1526
+ },
1527
+ "wrappy": {
1528
+ "version": "1.0.2",
1529
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1530
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1531
+ },
1532
+ "ws": {
1533
+ "version": "7.4.6",
1534
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
1535
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
1536
+ },
1537
+ "xmlhttprequest-ssl": {
1538
+ "version": "1.6.3",
1539
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz",
1540
+ "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q=="
1541
+ },
1542
+ "yeast": {
1543
+ "version": "0.1.2",
1544
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
1545
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
1546
+ },
1547
+ "zip-stream": {
1548
+ "version": "2.1.2",
1549
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.2.tgz",
1550
+ "integrity": "sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg==",
1551
+ "requires": {
1552
+ "archiver-utils": "^2.1.0",
1553
+ "compress-commons": "^2.1.1",
1554
+ "readable-stream": "^3.4.0"
1555
+ },
1556
+ "dependencies": {
1557
+ "readable-stream": {
1558
+ "version": "3.4.0",
1559
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
1560
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
1561
+ "requires": {
1562
+ "inherits": "^2.0.3",
1563
+ "string_decoder": "^1.1.1",
1564
+ "util-deprecate": "^1.0.1"
1565
+ }
1566
+ }
1567
+ }
1568
+ }
1569
+ }
1570
+ }
package.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "website-downloader",
3
+ "version": "0.0.1",
4
+ "private": true,
5
+ "scripts": {
6
+ "start": "node ./bin/www",
7
+ "dev": "export NODE_ENV=Development && npm start"
8
+ },
9
+ "dependencies": {
10
+ "archiver": "^3.1.1",
11
+ "cookie-parser": "~1.4.4",
12
+ "debug": "~2.6.9",
13
+ "express": "~4.19.2",
14
+ "hbs": "~4.2.0",
15
+ "http-errors": "~1.6.3",
16
+ "jszip": "^3.8.0",
17
+ "morgan": "~1.9.1",
18
+ "socket.io": "^2.5.0",
19
+ "socket.io-client": "^2.5.0"
20
+ }
21
+ }
public/sites/.bin ADDED
File without changes
public/stylesheets/style.css ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ header [role="progressbar"][aria-busy="true"] {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ padding-top: 8px;
6
+ width: 100%;
7
+ background-color: #159756;
8
+ -webkit-animation: preloader-background linear 3.5s infinite;
9
+ animation: preloader-background linear 3.5s infinite;
10
+ }
11
+ header [role="progressbar"][aria-busy="true"]::before, header [role="progressbar"][aria-busy="true"]::after {
12
+ display: block;
13
+ position: absolute;
14
+ top: 0;
15
+ z-index: 2;
16
+ width: 0;
17
+ height: 8px;
18
+ background: #afa;
19
+ -webkit-animation: preloader-front linear 3.5s infinite;
20
+ animation: preloader-front linear 3.5s infinite;
21
+ content: '';
22
+ }
23
+ header [role="progressbar"][aria-busy="true"]::before {
24
+ right: 50%;
25
+ }
26
+ header [role="progressbar"][aria-busy="true"]::after {
27
+ left: 50%;
28
+ }
29
+
30
+ @-webkit-keyframes preloader-background {
31
+ 0%, 24.9% {
32
+ background-color: #159756;
33
+ }
34
+ 25%, 49.9% {
35
+ background-color: #da4733;
36
+ }
37
+ 50%, 74.9% {
38
+ background-color: #3b78e7;
39
+ }
40
+ 75%, 100% {
41
+ background-color: #fdba2c;
42
+ }
43
+ }
44
+
45
+ @keyframes preloader-background {
46
+ 0%, 24.9% {
47
+ background-color: #159756;
48
+ }
49
+ 25%, 49.9% {
50
+ background-color: #da4733;
51
+ }
52
+ 50%, 74.9% {
53
+ background-color: #3b78e7;
54
+ }
55
+ 75%, 100% {
56
+ background-color: #fdba2c;
57
+ }
58
+ }
59
+ @-webkit-keyframes preloader-front {
60
+ 0% {
61
+ width: 0;
62
+ background-color: #da4733;
63
+ }
64
+ 24.9% {
65
+ width: 50%;
66
+ background-color: #da4733;
67
+ }
68
+ 25% {
69
+ width: 0;
70
+ background-color: #3b78e7;
71
+ }
72
+ 49.9% {
73
+ width: 50%;
74
+ background-color: #3b78e7;
75
+ }
76
+ 50% {
77
+ width: 0;
78
+ background-color: #fdba2c;
79
+ }
80
+ 74.9% {
81
+ width: 50%;
82
+ background-color: #fdba2c;
83
+ }
84
+ 75% {
85
+ width: 0%;
86
+ background-color: #159756;
87
+ }
88
+ 100% {
89
+ width: 50%;
90
+ background-color: #159756;
91
+ }
92
+ }
93
+ @keyframes preloader-front {
94
+ 0% {
95
+ width: 0;
96
+ background-color: #da4733;
97
+ }
98
+ 24.9% {
99
+ width: 50%;
100
+ background-color: #da4733;
101
+ }
102
+ 25% {
103
+ width: 0;
104
+ background-color: #3b78e7;
105
+ }
106
+ 49.9% {
107
+ width: 50%;
108
+ background-color: #3b78e7;
109
+ }
110
+ 50% {
111
+ width: 0;
112
+ background-color: #fdba2c;
113
+ }
114
+ 74.9% {
115
+ width: 50%;
116
+ background-color: #fdba2c;
117
+ }
118
+ 75% {
119
+ width: 0%;
120
+ background-color: #159756;
121
+ }
122
+ 100% {
123
+ width: 50%;
124
+ background-color: #159756;
125
+ }
126
+ }
127
+ * {
128
+ box-sizing: border-box;
129
+ }
130
+
131
+ html,
132
+ body {
133
+ margin: 0;
134
+ padding: 0;
135
+ height: 100%;
136
+ }
137
+
138
+ body {
139
+ display: flex;
140
+ flex-direction: column;
141
+ align-items: center;
142
+ font-family: Avenir Next, Helvetica Neue, Helvetica, Arial, sans-serif;
143
+ background-color: #f5f5f5;
144
+ }
145
+
146
+ header {
147
+ position: relative;
148
+ width: 100%;
149
+ height: 60px;
150
+ box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
151
+ background-color: #fff;
152
+ }
153
+
154
+ main {
155
+ display: flex;
156
+ flex-direction: column;
157
+ align-items: center;
158
+ justify-content: center;
159
+ padding: 20px;
160
+ flex-grow: 1;
161
+ text-align: center;
162
+ }
163
+ :root main > * + * {
164
+ margin-top: 1em;
165
+ }
166
+
167
+ h1 {
168
+ margin: 0;
169
+ font-size: 2.2em;
170
+ font-weight: 200;
171
+ }
172
+
173
+ p {
174
+ margin: 0;
175
+ font-size: .875em;
176
+ font-weight: 400;
177
+ }
178
+
179
+ .log{
180
+ max-width: 100%;
181
+ text-align: center;
182
+ }
routes/index.js ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ var express = require('express');
2
+ var router = express.Router();
3
+
4
+ /* GET home page. */
5
+ router.get('/', function(req, res, next) {
6
+ res.render('index', { title: 'Website downloader - Take any website offline.' });
7
+ });
8
+
9
+ module.exports = router;
routes/users.js ADDED
File without changes
socket/socket.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Download full website pages.
2
+ var wget = require('../wget');
3
+
4
+ module.exports=(io)=>{
5
+
6
+ io.on('connection', function (socket) {
7
+ socket.on('request', function (data) {
8
+ console.log("Request connection received %s",data.token)
9
+ // now graphing the website
10
+ wget(io,data)
11
+ });
12
+ });
13
+ }
views/error.hbs ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ <h1>{{message}}</h1>
2
+ <h2>{{error.status}}</h2>
3
+ <pre>{{error.stack}}</pre>
views/index.hbs ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ <!-- partial:index.partial.html -->
4
+ <header>
5
+ <div aria-busy="true" id="progress" hidden aria-label="Loading, please wait." role="progressbar"></div>
6
+ </header>
7
+ <main role="main">
8
+ <img src="https://www.google.com/inbox/assets/images/intro/intro-logo.png" width="100" alt="" />
9
+ <h1>Website Downloader</h1>
10
+ <p>Download all the source code and assets of any website </p>
11
+ <div class="container">
12
+ <div class="row">
13
+ <div class="col-lg-12" style="float: none; margin: 0 auto;">
14
+ <div id="custom-search-input">
15
+ <form method="get" class="form" action="/search">
16
+ <div class="input-group col-md-12">
17
+ <input type="text" class="form-control input-lg" id="website" placeholder="https://www.google.com" />
18
+ <span class="input-group-btn">
19
+ <button class="btn btn-info btn-lg" id="download" type="button">
20
+ <i class="glyphicon glyphicon-download"></i>
21
+ </button>
22
+ </span><br>
23
+ </form>
24
+
25
+ </div><br>
26
+ <center><!-- Place this tag where you want the button to render. -->
27
+ <a class="github-button" href="https://github.com/Ahmadibrahiim/Website-downloader" data-icon="octicon-star" data-size="large" data-show-count="true" aria-label="Star Ahmadibrahiim/Website-downloader on GitHub">Star</a></center>
28
+
29
+ <a href="https://www.buymeacoffee.com/aibrahim" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png" alt="Buy Me A Coffee" style="height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;" ></a>
30
+
31
+ </div>
32
+ <br>
33
+ </div>
34
+ </div>
35
+ <h5 hidden id='nFilesP'>Total Downloaded file: <span id='nFiles' style="color: red;font-weight: bold">10</span></h5>
36
+ <p class="log" id='log'></p>
37
+ <button style="display: none" class="btn btn-success">Download website assets</button>
38
+ </div>
39
+
40
+
41
+
42
+ </main>
43
+ <!-- partial -->
44
+
views/layout.hbs ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>{{title}}</title>
5
+ <link rel='stylesheet' href='/stylesheets/style.css' />
6
+
7
+ <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet">
8
+
9
+ <script src="/socket.io/socket.io.js"></script>
10
+ <!-- Place this tag in your head or just before your close body tag. -->
11
+ <script async defer src="https://buttons.github.io/buttons.js"></script>
12
+
13
+
14
+ </head>
15
+ <body>
16
+ {{{body}}}
17
+ </body>
18
+ <!-- Global site tag (gtag.js) - Google Analytics -->
19
+ <script async src="https://www.googletagmanager.com/gtag/js?id=UA-120895783-4"></script>
20
+ <script>
21
+ window.dataLayer = window.dataLayer || [];
22
+ function gtag(){dataLayer.push(arguments);}
23
+ gtag('js', new Date());
24
+
25
+ gtag('config', 'UA-120895783-4');
26
+ </script>
27
+
28
+ <script>
29
+ var numberOfFiles = 0;
30
+ const downloadWebsite = document.getElementsByClassName('btn-success')[0];
31
+ // connect to current socket.io server
32
+ var socket = io.connect(document.URL);
33
+ if(!localStorage['token'])
34
+ localStorage['token']=generateToken(20);
35
+
36
+ // wait for events for this token
37
+ socket.on(localStorage['token'],(event)=>{
38
+ console.log(event)
39
+ document.getElementById('progress').hidden=false;
40
+ if(event.progress=="Converting")
41
+ {
42
+ log.innerHTML=(`<h5>100%! Compressing your website...</h5><br>`)
43
+
44
+ }
45
+ else if(event.progress=="Completed")
46
+ {
47
+ document.getElementById('progress').hidden=true;
48
+ log.innerHTML=(`<code>Compressing completed successfully !</code><br>`)
49
+ downloadWebsite.style='display:'
50
+ downloadWebsite.onclick=function()
51
+ {
52
+ window.location='/tmp/'+event.file+".zip";
53
+ }
54
+
55
+ }
56
+ else
57
+ {
58
+ const log = document.getElementById('log');
59
+ if(event.progress.includes('200 OK'))
60
+ numberOfFiles++;
61
+ document.getElementById('nFilesP').hidden=false;
62
+ document.getElementById('nFiles').innerHTML=numberOfFiles
63
+ log.innerHTML=(`<code> ${event.progress}</code><br>`)
64
+ }
65
+ })
66
+
67
+ // Download a website on click
68
+ const downloadBtn = document.getElementById("download");
69
+ downloadBtn.onclick=()=>{
70
+ var website = document.getElementById('website').value
71
+ console.log("Now downloading the website ... %s",website)
72
+ socket.emit('request', { token: localStorage['token'] , website});
73
+ }
74
+
75
+
76
+
77
+
78
+
79
+ // Generate token for each user for the first time.
80
+ function generateToken(n) {
81
+ var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
82
+ var token = '';
83
+ for(var i = 0; i < n; i++) {
84
+ token += chars[Math.floor(Math.random() * chars.length)];
85
+ }
86
+ return token;
87
+ }
88
+ </script>
89
+
90
+
91
+ </html>
92
+
wget/index.js ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var util = require('util'),
2
+ exec = require('child_process').exec;
3
+ var archiver = require('../archiver')
4
+
5
+
6
+ module.exports=(io,data)=>{
7
+
8
+ // download all website assets
9
+ /**
10
+ * wget --mirror --convert-links --adjust-extension --page-requisites
11
+ * --no-parent http://example.org
12
+ * --mirror – Makes (among other things) the download recursive.
13
+ * --convert-links – convert all the links (also to stuff like CSS stylesheets) to relative, so it will be suitable for offline viewing.
14
+ * --adjust-extension – Adds suitable extensions to filenames (html or css) depending on their content-type.
15
+ * --page-requisites – Download things like CSS style-sheets and images required to properly display the page offline.
16
+ * --no-parent – When recurring do not ascend to the parent directory. It useful for restricting the download to only a portion of the site.
17
+ */
18
+ let website ="";
19
+ const child = exec(`wget -mkEpnp --no-if-modified-since ${data.website}`);
20
+
21
+ // read stdout from the current child.
22
+ child.stderr.on("data",(response)=>{
23
+
24
+ if(response.startsWith("Resolving "))
25
+ {
26
+ website= response.substring(response.indexOf('Resolve ')+11,response.indexOf(' ('))
27
+ }
28
+ io.emit(data.token,{progress:response})
29
+ })
30
+
31
+ child.stderr.on('close',(response)=>{
32
+
33
+ io.emit(data.token,{progress:"Converting"})
34
+ archiver(website,io,data)
35
+ })
36
+ }